一切皆爲 JavaScript

JavaScript起源於Netscape公司的LiveScript語言,這是一種基於對象和事件驅動的client腳本語言。最初的設計是爲了檢驗HTML表單輸入的正確性。html

早些年,JavaScript由於其複雜的文檔對象模型(DOM)、糟糕的實現和調試工具、不一致的瀏覽器實現而不受開發人員的待見。而隨着技術的發展, JavaScript變得愈來愈的強大、無缺。比方, Ajax技術可以建立更加迷人的Web應用,Node.js將JavaScript的應用範圍擴展到了server端。各類層出不窮的框架使得JavaScript的開發更加簡捷,尤爲是近幾年HTML5的出現,將 JavaScript提高到了史無前例的高度。前端

如今 JavaScript已經變成了Web開發必備的語言,甚至開始逐步向移動領域滲透。由於JavaScript的跨平臺特性,使得它在移動互聯網時代有更大的做爲。html5

凡是可以用 JavaScript 來寫的應用,終於都會用 JavaScript 來寫。
                             ——Atwood定律(Jeff Atwood在2007年提出)

不會JavaScript怎麼辦?

如今 JavaScript已經成爲了Web開發的「標配」語言,不管你喜不喜歡。在Web開發中。必然要涉及到JavaScript。JavaScript可以實現真正的「一次編寫,處處執行」。並可以控制所有常用的瀏覽器,所以。JavaScript還被稱做「Web的虛擬機」以及「Web上的彙編語言」git

雖然如此。但是假設你還沒開始學習JavaScript,這也不影響你編寫Web應用。你全然可以用你喜歡的語言(Java、.NET、C/C++、Python、Ruby……)來編寫應用程序,而後將它們編譯爲JavaScript語言。而後再執行於瀏覽器上。github

假設你對JavaScript的語法不愜意,你也可以使用一些JavaScript的加強版語言。web

比方。假設你更喜歡經典的面向對象方式,並想要一些語法糖,那麼你可以試試CoffeeScript;假設你但願有一個更嚴格的類型系統,那麼你可能會發現Dart或TypeScript更有趣一些;假設你更喜歡函數式編程。那麼ClojureScript或Roy可以幫助你。typescript

將你擅長的語言編譯爲JavaScript

將Java代碼編譯爲JavaScript

雖然JavaScript名字中包括「Java」。實際上JavaScript和Java沒有不論什麼關係,僅僅是由於當時Java火得一塌糊塗,爲了藉助Java的名氣來推廣,就起名爲JavaScript了。django

各類強大的工具的出現,使得JavaScript代碼和Java代碼之間有了必定的聯繫,就是可以將Java代碼編譯爲JavaScript代碼,以便在瀏覽器中執行。固然,除了Java外。其它基於JVM的語言都可以如此作。編程

可以實現此類操做的工具例如如下。後端

  • BicaVM:一個使用JavaScript實現的JVM,可以執行60%的Java字節碼
  • Ceylon:一個可編譯爲JavaScript的、模塊化的、靜態類型JVM語言
  • Doppio:一個使用Coffeescript實現的JVM,使得Java程序可以執行在不論什麼JavaScript引擎上
  • GrooScript:一個可以將Groovy代碼轉爲JavaScript代碼的小框架
  • j2js:可以將Java字節碼轉換爲JavaScript代碼
  • Java2Script:Eclipse中的Java to JavaScript編譯插件,並實現了一個JavaScript版的Eclipse SWT
  • Kotlin:可以編譯爲JVM字節碼和JavaScript的靜態類型編程語言
  • Processing:一個基於Java的可視化語言,可以編譯爲JavaScript
  • STJS:Strongly-Typed JavaScript(強類型的JavaScript)。一個可以將Java源代碼轉換爲JavaScript代碼的Maven插件

將C/C++代碼編譯爲JavaScript

C/C++如今也可以用來編寫Web應用程序,相同可以將它們編譯爲JavaScript。一些工具例如如下。

  • Emscripten:Mozilla開發的LLVM後端,可以將不論什麼經過LLVM前端(比方C/C++ Clang)生成的LLVMIR中間碼編譯成JavaScript代碼。
  • mala:可以將vala代碼(vala代碼在編譯時,首先會編譯爲C代碼)編譯爲JavaScript
  • Mandreel:可以將C++和Objective-C代碼編譯爲高度優化的JavaScript源代碼
  • Clue:一個C語言編譯器,可以將C語言代碼編譯爲高質量的Lua、Javascript或Perl代碼。

由於Emscripten可以將LLVM二進制代碼編譯成JavaScript。LLVM是一種很是流行的中間編譯格式,差點兒所有語言都有LLVM編譯器,所以Emscripten也可以做爲大部分語言轉換爲JavaScript的通用工具。

將Python代碼編譯爲JavaScript

可以使用例如如下工具將Python代碼編譯爲JavaScript代碼。

  • Brython:用於替換網頁上的JavaScript代碼,贊成使用Python來編寫腳本,並直接在網頁上運行
  • PYXC-PJ:可以將Python轉換爲JavaScript,並會產生一個行/列號映射文件
  • Pyjaco:可以將Python轉換爲JavaScript
  • Pyjamas:Python to JS轉換器
  • Pyjs:Python to JS轉換器
  • PyCow:可以將Python代碼轉換爲 MooToolsJS代碼
  • PyvaScript:一個相似於Python語法並擁有JavaScript特性的編程語言
  • RapydScript:加強版的PyvaScript
  • Skulpt:client的Python

將Ruby代碼編譯爲JavaScript

在Ruby領域,有一個使用JavaScript實現的Ruby標準庫—— RubyJS,它實現了Ruby中的所有方法,如Array、Numbers、Time等。Ruby之父松本行弘稱「假設我必須編寫JavaScript代碼。我會使用RubyJS」。

另外,你也可以使用例如如下工具將Ruby代碼編譯爲JavaScript代碼。

  • 8ball:一個可以將Ruby(或Ruby子集)的源代碼轉換爲JavaScript源代碼的編譯器
  • ColdRuby:一個Ruby 1.9 MRI字節碼編譯器和JS執行時。包含一個C++執行時以及用於本地執行的V8引擎
  • HotRuby:可以在瀏覽器內部或Flash平臺上執行由YARV編譯的Ruby操做碼
  • Opal一個Ruby to JavaScript編譯器,可用於不論什麼JS環境
  • rb2js:一個Ruby to JavaScript編譯器
  • Red:贊成你以Ruby的方式編寫代碼。而後以JavaScript的方式執行代碼

將.NET代碼編譯爲JavaScript

你可以使用例如如下工具將C#、F#以及其它.NET代碼編譯爲JavaScript代碼。

  • Apps in Motion:贊成使用C#來構建可以執行在不論什麼設備上的Web應用程序
  • Blade:一個Visual Studio擴展,可以將C#代碼轉換爲JavaScript
  • FunScript:可經過TypeScript的類型提供器將F#代碼轉換爲JavaScript或JQuery代碼
  • jsc:可將.NET程序又一次編譯爲JavaScript、ActionScript、PHP或Java程序
  • JSIL:可將MSIL(.NET字節碼)轉換爲 JavaScript
  • NemerleWeb:可將Nemerle語言(微軟的多範型語言)編譯爲JavaScript
  • Pit:可將F#代碼編譯爲Javascript
  • Prefix(開發中):可將C#代碼編譯爲Javascript
  • Saltarelle:可將C#代碼編譯爲Javascript
  • SharpKit(商業工具):可將C#代碼編譯爲Javascript
  • Script#可將C#代碼編譯爲Javascript
  • WebSharper:可將F#代碼編譯爲Javascript.

將Scala代碼編譯爲JavaScript

你可以使用例如如下工具將Scala代碼編譯爲JavaScript代碼。

  • Scala.js:一款將Scala編譯爲JavaScript的編譯器。支持全部Scala語言特性,贊成開發人員用Scala開發從前端到後端的Web應用
  • js-scala:在Scala中將JavaScript做爲嵌入式的DSL語言
  • Scala+GWT:經過GWT工具鏈將Scala代碼編譯爲JavaScript語言

將Flash轉換爲JavaScript

HTML5(HTML/JavaScript/CSS3技術組合)的最大對手就是Flash,雖然眼下Flash的市場份額還高居70%。但也不能否認。將來將是HTML5的天下。

就連Flash的開發商Adobe也開始擁抱HTML5,並公佈了Toolkit for CreateJS工具,方便Web開發人員將Flash轉換爲HTML5格式。

去年,Google曾公佈了一套基於網頁的的工具——Swiffy。在線就能夠將SWF格式的Flash文件轉化爲HTML5格式。

除了轉換外,Mozilla還推出了一個新的解決方式——Shumway,這是一個「基於JavaScript的Flash虛擬機和執行時」,目的是在瀏覽器中構建一個可靠有效的SWF(Flash文件格式)渲染器,無需插件直接在瀏覽器中執行Flash。

因而可知。這些工具將進一步加速HTML5代替Flash的步伐。

其它編譯工具

  • Go2js:可以將Go代碼行到行地編譯爲JavaScript代碼
  • Perlito:可以將Perl 5/6代碼編譯爲JavaScript、Ruby、SBCL和Go語言代碼。

編譯爲JavaScript後的問題

調試問題

由於是交叉編譯。致使輸出的代碼很是難被跟蹤調試。

一些工具在編譯的過程當中會生成映射文件(將編譯後的JavaScript代碼映射到源語言)。可以經過這些文件來進行調試。

性能問題

由於 JavaScript在瀏覽器中執行問題,本地代碼編譯爲JavaScript後的執行速度可能會降低。

對於此類問題。Mozilla給出了一個解決方式—— asm.js(見《 asm.js:JavaScript的「彙編語言」》)。asm.js是一個JavaScript的一個嚴格的子集,提供了一個相似於C/C++虛擬機的抽象實現,包含一個可有效負載和存儲的大型二進制堆、整型和浮點運算、高階函數定義、函數指針等,可以被用來做爲一個底層的、高效的編譯器目標語言。

此外,還可以使用Mozilla開發的 JavaScript引擎OdinMonkey來得到更快的運行速度。開發人員可以將編寫的代碼編譯爲JavaScript,而後手動編寫爲asm.js代碼。當瀏覽器運行該程序時,OdinMonkey引擎會讓程序的運行速度更接近於本地應用。Mozilla將來可能會開發一些工具(相似於LLJS)來本身主動生成asm.js代碼。

隨着技術的發展,將來JavaScript或許會跑得和native C同樣快。

一些演示

2012年。Mozilla曾推出一款Web版的第一人稱射擊遊戲演示BananaBread,今年5月份。Mozilla宣佈與Epic Games合做將虛幻引擎3(C/C++實現)移植到瀏覽器上。並公佈了基於虛幻引擎3的HTML5演示遊戲Epic Citadel,這些遊戲都是基於WebGL、 Emscripten和高性能的JavaScript子集asm.js實現。又一次定義了3D遊戲在瀏覽器中執行的性能,展現了高端遊戲也可以很是easy地移植到JavaScript 和 WebGL平臺,同一時候不失性能和畫面效果。


Mozilla的還有一款支持多人在線的HTML5 遊戲—— BrowserQuest

隨着HTML5新特性Full Screen API、Gamepad API和Mouse Lock API的無缺,瀏覽器或將成爲將來遊戲的新戰場。

加強版的JavaScript

JavaScript大量的擴展,在很是大程度上彌補了JavaScript某些方面特性的不足。比方你可以使用例如如下這些工具或擴展來讓JavaScript更強大。

安全性加強

  • ADsafe:提供了client靜態驗證功能和相關的API。加強第三方腳本的安全性
  • Caja:可以將傳統的HTML和JavaScript轉換爲安全限制的JavaScpit格式
  • Dojo Secure:用於構建安全混搭應用的框架
  • FBJS:Facebook的JavaScript工具。用於編寫Facebook小插件
  • Jacaranda:支持對象的靜態驗證器
  • Gatekeeper:一個JavaScriptpassword保護腳本
  • Microsoft Web Sandbox:經過隔離來保證安全性

靜態類型特性

  • JSX:一個更快、更安全、更易用的JavaScript替代品
  • Elm:類型安全的函數式語言,可編譯爲HTML、CSS和JavaScript.
  • Lambdascript:一個強類型的純函數式原型語言
  • MileScript:一個相似於C#和Java的強類型語言,可編譯爲JS
  • SafeJS:爲JavaScript添加了語法糖
  • Mascara:爲JavaScript添加了強大的功能,比方類、命名空間和類型檢查等
  • Roy:函數式語言。與JavaScript語義保持接近,擁有類型判斷、結構類型、sum類型、模式匹配等

JavaScript的衍生品

JavaScript如今在Web開發界的地位沒法撼動,但是仍不斷有一些新的語言出現。但願能夠經過提供更強大、更無缺、更優雅的特性來取代JavaScript。

  • CoffeeScript: CoffeeScript是一個使用純Ruby編寫的編程語言,僅僅使用了JavaScript的「精髓」,拋棄了原來JavaScript晦澀、easy出問題的部分。如全局變量聲明、with等。並提供了很是多語法糖,讓代碼更優雅可讀。

  • Dart:Google推出的一種基於類的可選類型化編程語言,可以在原生虛擬機中直接執行,也可以用編譯器將Dart代碼翻譯成 JavaScript代碼。

  • TypeScript:JavaScript的一個超集,加入了可選的靜態類型和基於類的面向對象編程。
  • ClojureScript:由Clojure的建立者Rich Hickey推出,目標是「作Javascript所能作到的事情」,代碼可編譯爲Javascript。

  • IcedCoffeeScript: Coffeescript語言的擴展集,加入了2個keywordawait和defer。爲瀏覽器和server二者提供了強大的異步控制功能。
  • LiveScriptCoco的一個分支。是CoffeeScript的間接子集,並在面向對象和命令式編程方面進行了諸多改進,代碼可以編譯成JavaScript。
  • Kaffeine:JavaScript語法的擴展,與JavaScript很是相似,代碼可以直接編譯成JavaScript。

不少其它工具可參見: http://altjs.org/

最後

差點兒所有主流的語言都可以編譯爲JavaScript。進而可以在所有平臺上的瀏覽器中運行,這也體現了JavaScript的強大性和在Web開發中的重要性。此外,互聯網中還存在大量的工具,使得這些語言可以與 JavaScript進行互操做,咱們將在之後的文章中具體介紹。

以上這些工具中,大部分都是開源項目,假設感興趣,你也可以經過源代碼來了解這些語言之間進行轉換的相關原理和技術。


做者:王果    (本文最先於2013年11月發表於CSDN資訊頭條

相關文章
相關標籤/搜索