方便編譯成JavaScript的熱門工具
譯文現在市面上有大量的小巧語言,可以將你的代碼搬到Web上,異常輕松,而且很少有不足之處。
每個編程人員都有自己青睞的一兩種語言。這年頭,要數JavaScript愛好者最幸運了,因為他們青睞的語言風靡互聯網,而互聯網風靡全世界。然而,那些鐘情于其他編程語言的人卻陷入了困境。他們要么在一旁觀望,詛咒勢不可擋的HTML、CSS、JavaScript和Node.js,要么想辦法喜歡上它。
幸好,還有第三種方法讓你可以享受你所青睞的語言帶來的樂趣,同時仍可以將編寫的代碼部署到地盤越來越龐大的JavaScript:你只要轉換代碼,這個過程異常容易。性能可能會受到一點影響,但常常不如你想象的輕得多。然后,你可以將你的代碼發送到瀏覽器,擯棄試圖讓人們安裝可執行文件的做法。
堅定分子可能會覺得這是可鄙的投降,甚至有些人會覺得這有點是背叛,這種行為實在是叛逆之極,以至于你不想讓同行知道。還有些人則認為,事實不是這么簡單,確實如此。讓代碼運行起來是一回事,將各部分組合起來、構建一個用戶界面需要大量的額外工作。
別再自憫自憐了,不過有相當充分的理由使得這個想法更受人歡迎。首先,JavaScript引擎運行起來比過去要快得多。其次,構建一個Web用戶界面從來沒有這么容易過,這歸功于眾多框架和充足的HTML/CSS設計人才。第三,JavaScript變得有點像是一種通用語。如果你能把所有這些語言轉換成JavaScript,這些語言多得出奇,你還能把它們都聯系起來。
我們在這里看一下眾多的小巧語言,它們讓一些***的編程語言能夠編譯成JavaScript。將來一篇文章會介紹一些日漸式微的語言如何因遇上到瀏覽器而迎來重生。沒有理由好可憐或厭惡的。這些技術讓你在享受自己青睞的語言的同時,還可以在JavaScript運行的任何環境下運行。
#p#
Ruby
有許多選擇讓你在JavaScript環境下運行時可以像Ruby編程人員那樣思考問題。
比如說,RubyJS就是一個JavaScript庫,它把許多基本數據類型添加到一個JavaScript對象中。你編寫的嚴格上來說是JavaScript,但特殊的Ruby對象在大多數時候運行起來如同Ruby代碼。字符串(String)、數值(Number)、迭代器(Iterator)和計數器(Enumerator)等著你來使用。
如果嫌編寫運行起來如同Ruby的JavaScript還不夠,Opal可以將Ruby源代碼直接轉換翻譯成JavaScript。其行為方式常常如同Ruby虛擬機,但有時候則不然。比如說,Ruby的可變字符串可直接轉換成JavaScript的不可變字符串,這對一些應用程序來說應該不是問題,但會讓一些人抓狂。諸如此類的其他小的影響會導致在邊緣情況下大吃一驚。
對想要更多功能的那些人來說,HotRuby提供了一種更全面的解決方案,這種JavaScript虛擬機可以迅速處理Ruby操作碼。代碼庫變得有點舊了,但它為真正的擁躉提供了另一種選擇。
Java
很難知道當初是什么啟發谷歌開發了Google Web Toolkit,這個預處理器可以將Java轉換成JavaScript。也許管理方熱愛Java,不想讓它消亡。也許是管理方有多余的Java人才無所事事,等著運行Web。
無論是出于什么原因,谷歌出手了,經常將Java用于***進的Web產品。對有一大堆Java代碼,卻沒有時間重寫的人來說,Java是***的禮物。這門語言的價值就擺在那里,不過缺少一些不太常用的類,比如BigInteger;話雖如此,你通常能找到添加這些類的方法。用戶界面框架基本上是從Swing借鑒而來的,所以Swing開發人員會覺得很熟悉。其他開發人員不會覺得它太難學。
Google Web Toolkit絕不是Java編程人員的唯一選擇。Java2Script與Eclipse全面集成起來,GrooScript則可以轉換與Java關系密切的Groovy。
有幾個工具可以與JavaScript一起運行Java虛擬機(JVM)字節碼,這個巧妙的想法讓你可以部署JAR文件,即便你沒有Java源代碼。Doppio和Node-jvm等一些工具是解釋器,TeaVM或Dragome等另一些工具可以將字節碼***地轉換成JavaScript。
#p#
Erlang
Erlang愛好者有幾個選擇。一種解決方案就是使用Erjang,這個工具在JVM上運行Erlang,然后被用來與上述一種Java選擇一起運行Java字節碼。是不是覺得這聽起來很簡單?
Shen是一種編譯器,可以將Erlang及其“近親語言”(比如Elixir、Joxa和Lol)轉換成JavaScript。如果你想在Node.js中運行該代碼,還有程序包erlang-shen-js。
第三種選擇是使用LuvvieScript,Erlang的這個嚴格子集被賦予了訪問所有DOM對象的鉤子(hook)。你可以使用自己喜歡的Erlang結構,它可以將你的指令轉換翻譯成DOM能理解的指令。這并非一模一樣,但切實可行。
C
許多人會驚訝地發現自己居然可以將C或類似C的語言與JavaScript一起使用。當然,基本的JavaScript語法與C很相似,但本質不一樣。C讓你可以直接接觸內存,而JavaScript隱藏了所有這些細節。C讓你可以處理指針,而JavaScript保護你避免危險的功能。不過,借助一番巧妙的手法,這些差異是可以克服的。
稱LLJS是C的一個版本也許有失公允,但JavaScript的這個版本提供了靜態類型變量,編程員可以控制內存――其實不是內存本身,而是JavaScript的版本。文檔承諾無暫停執行,因為沒有廢料收集機制。
如果你想使用標準的C,Clue可以將C轉換成JavaScript和另外多種腳本語言(比如Perl或Lua)。開發人員甚至聲稱,對這些動態語言而言,一些代碼在JIT中運行起來實際上比編譯成原生二進制代碼后還要來得快。秘訣在于,JIT會在運行期間注意到基本編輯器注意不到的方面,因為它們會觀察程序運行。
名氣***的也許是Emscripten,LLVM的這個改裝版已經過重新組合,可以吐出面向asm.js的指令,而不是機器碼。秘訣在于,asm.js是JavaScript的狹窄子集,旨在很容易被SpiderMonkey之類的***JavaScript引擎所優化。結果相當出色:一些最有力的證據來自游戲界,Unity和Unreal這兩個引擎都可以在與HTML5兼容的瀏覽器中運行游戲。
#p#
Python
Python是另一種流行的動態語言,很容易編譯成JavaScirpt。許多內部功能很相似,一些***的差異在于語法方面。
更簡單的選擇(比如RapydScript和PyvaScript)僅僅提供類似Python的語法,可以直接轉換翻譯成JavaScript。它們會進行幾個轉換,比如插入花括號與空白縮進塊相匹配――它在瀏覽器中運行。
更復雜的版本(比如PYXC-PJ和Pyjs)會積極地將Python轉換成JavaScript,常常形成可讀性很強的代碼――或者可讀性至少與原始代碼一樣易于強。Pyjs還隨帶窗口組件工具包,因而它與Google Web Toolkit很相似。
不過,最有意思的也許是PyPy,它堪稱軟件技術領域的杰作。Python進去后,可以在用RPython編寫的Python解釋器上運行,而RPython是Python的一個子集,旨在易于編譯。然后,該RPython被編譯成類似C的代碼,可以饋送到Emscripten。開發人員聲稱,一些Python基準測試在SpiderMonkey中運行起來比在CPython中來得快。
如果他們用Python和C能做到這一點,你也能做到。
JavaScript的另一幅面孔
當然,即便說到JavaScript,你也有替代方案。畢竟,一些人喜歡標點符號,而另一些人不喜歡。CoffeeScript就適合不喜歡標點符號的人。如果你需要用JavaScript來編寫程序,卻討厭輸入那么多的分號或花括號,那么CoffeeScript很適合你。
CoffeeScript的本質與JavaScript一樣,因為它其實并不是一種語言。它是一種預處理器,增添了分號和花括號,所以你沒必要添加了。你可以打出程序,就像Ruby那樣簡潔,CoffeeScript可以將它轉換成JavaScript的簡化版。
這與用另一種語言來編程不一樣,因為你定義的變量和函數用起來仍然像JavaScript變量和函數。變量仍將是動態類型,所有煩人的小問題都仍在那里。運算和加運算符那古怪、過載的行為仍會讓你不勝厭煩,但你可以在輸入代碼方面節省一點時間。
CoffeeScript領域相當多樣化。一旦世人認識到它可以預處理代碼,許多人會加入其中。比如說,Iced CoffeeScript就像常規的CoffeeScript,不過多了幾個額外構件,讓異步調用輸入和閱讀起來清楚一點、簡單一點。至少有十多個“近親語言”可以簡化你的特定編程方式。
原文鏈接:http://www.infoworld.com/article/2906809/javascript/cool-tools-for-compiling-your-favorite-language-to-javascript.html