竞速(四):JavaScript的未来

354 查看

伯乐在线注:英文原文:John Dalziel,感谢@AvisBlume 的热心翻译。如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线。以下是译文。

浏览器厂商对JavaScript有着野心勃勃的计划。很多厂商都在进行长期投资旨在打造网页操作系统。为此他们设定了一个目标:要让JavaScript跑得和native C一样快。如果这能成为现实,那么本地应用和网页应用之间的差异将变得很模糊。

那么如何才能让一种动态语言运行起来可以媲美native C呢?

 

ES.next

下一代JavaScript语言目前正在设计中。第6版ECMAScript,也就是ES.next,预计今年下半年将会完成。JavaScript就源自ECMAScript。

该项目的目标之一是快速编译。为此一系列的特性正在被讨论之中,其中包括类型系统、二进制数据和类型化数组。类型化数据可以直接被传递给类型化即时编译,这会让编译速度和执行速度变得更快。

浏览器对ES.next的支持度还很低,但是你可以用这张ES6兼容性列表来关注事态发展,也可以把它当做Google的Traceur项目的预演。该项目是基于JavaScript的下一代编译器。如果你想现在就是用它,那可以关注下the Six Project。

 

WebGL

浏览器中的JavaScript不局限于DOM操作。现在大多数网页游戏(不用插件的那些)都是直接利用标准的2D Context在HTML5 Canvas上进行渲染。Canvas本质上是可写的位图。利用JavaScript,可以将其他的位图在Canvas上进行各种操作来创建动画、游戏、图表等等。

最快速的Canvas渲染方法是利用WebGL,这是一组提供硬件加速绘图的JavaScript API。它可以极大地提高表现能力,因为可以将渲染的计算工作交给GPU,而让CPU更多地处理应用程序的逻辑部分。

可能出乎你意料,其实在现在的所有桌面浏览器上WebGL都已经有某种程度的实现了。它在Chrome和Firefox上都已经准备就绪,但首先得获得Safari和Opera用户的授权。Microsoft是最后一个坚持者,但已经在即将推出的IE11的泄露版中发现了WebGL的踪迹。

但即使有了浏览器的支持,依然不能保证所有用户都能使用WebGL,因为用户不得不为GPU更新显卡驱动。如果那些驱动不存在的话,Google Chrome是唯一一个提供了备用软件渲染器的浏览器。WebGL是一项强大而有前途的技术,但还没有完全准备好。有些厂商出于安全考虑,桌面浏览器上还有段路要走,而移动设备上的浏览器更是遥遥无期。当然那些老古董浏览器是完全不会支持WebGL了。

 

作为编译目标的JavaScript

虽然现在所有网页应用都依赖JavaScript来实现客户端逻辑,但并非都是用JavaScript写出来的。很多是用完全不同的语言写出来然后转编译成JavaScript再运行于浏览器上的。譬如CoffeeScript和TypeScript被创造出来是为了使JavaScript开发变得更强健。而譬如Java,C++和C#是将JavaScript当做编译目标的。

交叉编译问题很多。大幅缩小的输出代码很难跟踪,另外如果浏览器不支持源映射功能的话,也没办法进行调试。源映射文件是一种将运行时JavaScript映射回源语言的中间文件。

多年前微软工程师Scott Hanselman提出了将JavaScript作为汇编语言的想法。他的观点是现在缩小化的JavaScript应用代码已经变得不可读。这一点让人无可辩驳,但引发了一系列有意思的辩论。很多人的网页开发生涯始于点开浏览器上的“查看源代码”,但是当源代码变得让人难以理解的时候,我们是否又要担心不会再有新人加入网页开发的行列了?

有个将JavaScript作为编译目标的例子是Mozilla的Emscripten项目。它将LLVM二进制代码编译成JavaScript。LLVM(Low Level Virtual Machine)是一种很流行的中间编译格式,几乎所有语言都有LLVM编译器。这能让你用你喜欢的语言写代码然后将其转编译成JavaScript。

该项目刚起步不久,但开发团队已经发布了一些让人印象深刻的demo。Epic的开发人员将the Unreal Engine 3移植到了JavaScript和WebGL中,他们利用Clang编译器将用native C写的代码编译成了LLVM,然后用Emscripten将LLVM编译成了asm.js JavaScript。

 

asm.js

asm.js是Emscripten的同行者。从字面上看,它是将JavaScript当成汇编语言。该规范利用JavaScript语言极其有限的一个子集来创建汇编语言。因此,虽然你可以用手写出asm.js代码,但你不会真想这么做的。要发挥其最大功效,你会需要两个编译器的帮助。

Emscripten编译器可以生成asm.js。其产生的JavaScript也许不可读,但却是有效并且向后兼容的,这意味着它能在任意浏览器上运行。如果引擎可以识别asm.js格式并且将其代码写入专用的编译器,那么带来的速度提升会是巨大的。为此Mozilla已经在研发OdinMonkey,一款建立在IonMonkey基础之上的asm.js优化编译器,而Google也保证将会在Chrome中支持asm.js。

任何遵循该规范的JavaScript将不会需要垃圾回收、装箱值或者动态类型。早期的测试表明表现能力可以达到C++一半的水平,甚至可以与Java或者C#相媲美。开发团队相信还能进一步提升。

Mozilla的研发正热火朝天地进行中。除了Emscripten和asm.js之外,他们还在进行LLJS(JavaScript as C)项目,另外还与Intel共同开展River Trail项目。该项目是ECMAScript在多核并行处理上的扩展。这些让人振奋的消息让人觉得JavaScript很可能会赶上native C的速度。

 

最后,是ORBX.jx

这项出人意料的解决方案是通过硬件虚拟化完全避开本机性能问题。不在电脑上而是在云端运行应用程序,然后将结果以视频的形式在电脑上呈现出来。该解决方案由Mozilla和Otoy用ORBX.js的形式提出,ORBX.js可以让1080p视频的编解码完全通过JavaScript来完成。

http://www.youtube.com/watch?v=BV32Cs_CMqo

(Youtube 视频)

视频中你可以看到3D Studio Max分别在本机和通过ORBX.js在浏览器中运行的情景。这项技术显然让人印象深刻,但是它解决问题的同时也带来了更多的问题。一切都被虚拟化以后,网络连接、延迟和带宽就会成为新的瓶颈,而停电将会是最严重的灾难。

但不管怎样,看起来JavaScript的前途很是光明。

 

英文原文:John Dalziel,编译:@AvisBlume

译文链接:http://blog.jobbole.com/41922/

【非特殊说明,转载必须在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】