方便编译成JavaScript的热门工具
现在市面上有大量的小巧语言,可以将你的代码搬到Web上,异常轻松,而且很少有不足之处。
每个编程人员都有自己青睐的一两种语言。这年头,要数JavaScript爱好者最幸运了,因为他们青睐的语言风靡互联网,而互联网风靡全世界。然而,那些钟情于其他编程语言的人却陷入了困境。他们要么在一旁观望,诅咒势不可挡的HTML、CSS、JavaScript和Node.js,要么想办法喜欢上它。
幸好,还有第三种方法让你可以享受你所青睐的语言带来的乐趣,同时仍可以将编写的代码部署到地盘越来越庞大的JavaScript:你只要转换代码,这个过程异常容易。性能可能会受到一点影响,但常常不如你想象的轻得多。然后,你可以将你的代码发送到浏览器,摈弃试图让人们安装可执行文件的做法。
坚定分子可能会觉得这是可鄙的投降,甚至有些人会觉得这有点是背叛,这种行为实在是叛逆之极,以至于你不想让同行知道。还有些人则认为,事实不是这么简单,确实如此。让代码运行起来是一回事,将各部分组合起来、构建一个用户界面需要大量的额外工作。
别再自悯自怜了,不过有相当充分的理由使得这个想法更受人欢迎。首先,JavaScript引擎运行起来比过去要快得多。其次,构建一个Web用户界面从来没有这么容易过,这归功于众多框架和充足的HTML/CSS设计人才。第三,JavaScript变得有点像是一种通用语。如果你能把所有这些语言转换成JavaScript,这些语言多得出奇,你还能把它们都联系起来。
我们在这里看一下众多的小巧语言,它们让一些最受欢迎的编程语言能够编译成JavaScript。将来一篇文章会介绍一些日渐式微的语言如何因遇上到浏览器而迎来重生。没有理由好可怜或厌恶的。这些技术让你在享受自己青睐的语言的同时,还可以在JavaScript运行的任何环境下运行。
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。
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的这个版本提供了静态类型变量,编程员可以控制内存DD其实不是内存本身,而是JavaScript的版本。文档承诺无暂停执行,因为没有废料收集机制。
如果你想使用标准的C,Clue可以将C转换成JavaScript和另外多种脚本语言(比如Perl或Lua)。开发人员甚至声称,对这些动态语言而言,一些代码在JIT中运行起来实际上比编译成原生二进制代码后还要来得快。秘诀在于,JIT会在运行期间注意到基本编辑器注意不到的方面,因为它们会观察程序运行。
名气最大的也许是Emscripten,LLVM的这个改装版已经过重新组合,可以吐出面向asm.js的指令,而不是机器码。秘诀在于,asm.js是JavaScript的狭窄子集,旨在很容易被SpiderMonkey之类的最新JavaScript引擎所优化。结果相当出色:一些最有力的证据来自游戏界,Unity和Unreal这两个引擎都可以在与HTML5兼容的浏览器中运行游戏。
Python
Python是另一种流行的动态语言,很容易编译成JavaScirpt。许多内部功能很相似,一些最大的差异在于语法方面。
更简单的选择(比如RapydScript和PyvaScript)仅仅提供类似Python的语法,可以直接转换翻译成JavaScript。它们会进行几个转换,比如插入花括号与空白缩进块相匹配DD它在浏览器中运行。
更复杂的版本(比如PYXC-PJ和Pyjs)会积极地将Python转换成JavaScript,常常形成可读性很强的代码DD或者可读性至少与原始代码一样易于强。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变量和函数。变量仍将是动态类型,所有烦人的小问题都仍在那里。运算和加运算符那古怪、过载的行为仍会让你不胜厌烦,但你可以在输入代码方面节省一点时间。