一切皆為 JavaScript

csdn發表於2013-11-05

  JavaScript起源於Netscape公司的LiveScript語言,這是一種基於物件和事件驅動的客戶端指令碼語言,最初的設計是為了檢驗HTML表單輸入的正確性。

  早些年,JavaScript由於其複雜的文件物件模型(DOM)、糟糕的實現和除錯工具、不一致的瀏覽器實現而不受開發者的待見。而隨著技術的發展, JavaScript變得越來越的強大、完善,比如, Ajax技術可以建立更加迷人的Web應用,Node.js將JavaScript的應用範圍擴充套件到了伺服器端,各種層出不窮的框架使得JavaScript的開發更加簡捷,尤其是近幾年HTML5的出現,將 JavaScript提升到了前所未有的高度。

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

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

 不會JavaScript怎麼辦?

  如今 JavaScript已經成為了Web開發的“標配”語言,不管你喜不喜歡,在Web開發中,必定要涉及到JavaScript。JavaScript可以實現真正的“一次編寫,到處執行”,並可以控制所有常用的瀏覽器,因此,JavaScript 還被稱作“Web的虛擬機器”以及“Web上的組合語言”

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

  如果你對JavaScript的語法不滿意,你也可以使用一些JavaScript的增強版語言。比如,如果你更喜歡經典的物件導向方式,並想要一些語法糖,那麼你可以試試CoffeeScript;如果你希望有一個更嚴格的型別系統,那麼你可能會發現Dart或TypeScript更有趣一些;如果你更喜歡函數語言程式設計,那麼ClojureScript或Roy可以幫助你。

 將你擅長的語言編譯為JavaScript

  將Java程式碼編譯為JavaScript

  儘管JavaScript名字中包含“Java”,實際上JavaScript和Java沒有任何關係,只是由於當時Java火得一塌糊塗,為了藉助Java的名氣來推廣,就起名為JavaScript了。

  各種強大的工具的出現,使得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:客戶端的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語言

  其他編譯工具

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

 編譯為JavaScript後的問題

  除錯問題

  由於是交叉編譯,導致輸出的程式碼很難被跟蹤除錯。

  一些工具在編譯的過程中會生成對映檔案(將編譯後的JavaScript程式碼對映到源語言),可以通過這些檔案來進行除錯。

  效能問題

  由於 JavaScript在瀏覽器中執行問題,原生程式碼編譯為JavaScript後的執行速度可能會下降。

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

  此外,還可以使用Mozilla開發的JavaScript引擎OdinMonkey來獲得更快的執行速度。開發者可以將編寫的程式碼編譯為JavaScript,然後手動編寫為asm.js程式碼,當瀏覽器執行該程式時,OdinMonkey引擎會讓程式的執行速度更接近於本地應用。Mozilla未來可能會開發一些工具(類似於 LLJS)來自動生成asm.js程式碼。

  隨著技術的發展,未來JavaScript也許會跑得和native C一樣快。

 增強版的JavaScript

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

  安全性增強

  • ADsafe:提供了客戶端靜態驗證功能和相關的API,增強第三方指令碼的安全性
  • Caja:可以將傳統的HTML和JavaScript轉換為安全限制的JavaScpit格式
  • Dojo Secure:用於構建安全混搭應用的框架
  • FBJS:Facebook的 JavaScript工具,用於編寫Facebook小外掛
  • Jacaranda:支援物件的靜態驗證器
  • Gatekeeper:一個JavaScript密碼保護指令碼
  • 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晦澀、容易出問題的部分,如全域性變數宣告、with等。並提供了很多語法糖,讓程式碼更優雅可讀。
  • Dart:Google推出的一種基於類的可選型別化程式語言,可以在原生虛擬機器中直接執行,也可以用編譯器將Dart程式碼翻譯成 JavaScript程式碼。
  • TypeScript:JavaScript的一個超集,新增了可選的靜態型別和基於類的物件導向程式設計。
  • ClojureScript:由Clojure的建立者Rich Hickey推出,目標是“做Javascript所能做到的事情”,程式碼可編譯為Javascript。
  • IcedCoffeeScript: Coffeescript語言的擴充套件集,新增了2個關鍵字await和defer,為瀏覽器和伺服器兩者提供了強大的非同步控制功能。
  • LiveScriptCoco的一個分支,是CoffeeScript的間接子集,並在物件導向和指令式程式設計方面進行了諸多改進,程式碼可以編譯成JavaScript。
  • Kaffeine:JavaScript語法的擴充套件,與JavaScript非常類似,程式碼可以直接編譯成JavaScript。

  更多工具可參見: http://altjs.org/

 最後

  幾乎所有主流的語言都可以編譯為JavaScript,進而能夠在所有平臺上的瀏覽器中執行,這也體現了JavaScript的強大性和在Web開發中的重要性。此外,網際網路中還存在大量的工具,使得這些語言可以與 JavaScript進行互操作,我們將在以後的文章中詳細介紹。

  以上這些工具中,大部分都是開源專案,如果感興趣,你也可以通過原始碼來了解這些語言之間進行轉換的相關原理和技術。

相關文章