为asm.js编写优化的JS

时间:2013-05-06 15:38:12

标签: javascript c++ c asm.js

asm.js有很多令人兴奋的事情,以及如何运行一些非常繁重的应用程序。但是,它是从C ++代码编译的。如果不了解C ++或其他低级语言,是否仍然可以获得当前改进的好处?

以下是我的想法:我们是否可以在Js中编写代码,为asm.js重新编译以进行优化?

4 个答案:

答案 0 :(得分:6)

如果你有一个非常耗费计算量的小函数(处理数字而不是操作DOM),你可以自己手动重写asm.js样式。这是可能的(I've done it),但很乏味。

还有其他asm.js编译器,例如您可以使用LLJS代替C ++。

然而,asm.js并不神奇。当您使用比JS更适合于提前优化的语言时,您将获得性能优势。你不能使用功能齐全的JS并通过在JS VM上运行JS VM来加快速度,就像你不能通过压缩它们来制作更小的ZIP文件一样。

答案 1 :(得分:5)

  

但是,它是从C ++代码编译的。

不是。它是一种语言。任何程序都可以发出包含asm.js代码的文本文件。 Emscripten将LLVM IR编译为asm.js,并且有从C和C ++到LLVM IR的编译器,但这只是获取asm.js代码的一种可能方式。不可否认,它目前是最成熟,最实用和最受欢迎的方式,但如果将来其他语言的其他asm.js编译器出现,我也不会感到惊讶。

  

在不了解C ++或其他低级语言的情况下,仍然可以获得当前改进的好处吗?

从理论上讲,理论上可以使用asm.js高效地实现任何可以有效地编译为机器代码的语言,其中包括一些相当高级的语言(例如Haskell)。 但目前,没有人有工作实施,我不希望这种情况变得非常受欢迎。现在,如果你想要asm.js性能,你可能会编写C或C ++代码并将其编译为asm.js,是的。

请注意,以上排除了(以及其他许多)Javascript。事实上asm.js是Javascript的一个子集很方便,因为asm.js代码将在未经修改的浏览器上运行,但它没有多大用处任何人写Javascript。 asm.js基本上只是机器代码之上的一个薄层,对安全性和JS互操作性有一些修正。将JS编译为asm.js与将其编译为机器代码一样困难:如果你不熟悉性能,那就很容易(只是总是使用盒装的动态类型值,如解释器,并发出对运行时库函数的调用) ,当你这么做时非常努力。

事实上,经过数十年的研究,仍然没有像Javascript,Ruby或Python这样高度动态的语言被提前编译成机器代码并运行的例子比聪明的翻译快得多。另一方面,即时编译非常实用 - 但主要的JS引擎已经这样做了,比编译为asm.js更简单,然后再次解析并将其编译为机器代码。

答案 2 :(得分:3)

Asm.js不是单独的语言,而是Javascript的子集。这只是Javascript,因为性能而被剥夺了很多。这意味着您不需要学习另一种语言,但在这种情况下,了解C / C ++可能对理解它有用。

答案 3 :(得分:0)

Asm.js是一个非常严格的JavaScript子集,在从C / C ++编译到JavaScript时可以相对容易地生成。 Asm.js代码比普通的JavaScript代码更接近机器代码,这使得浏览器可以对asm.js中编写的任何代码进行大量优化。在实现这些优化的浏览器中,您的代码通常会运行编译为机器代码的C / C ++程序速度的大约50%......这可能看起来很慢,但是比任何普通的JavaScript都要快得多!

然而,正是因为它针对机器而非人类进行了优化,asm.js几乎不可能被任何人类开发人员手动编码......即使它只是只是 JavaScript 。虽然技术上可以将 - 至少是普通JavaScript的一部分转换为asm.js等价物,但这样的转换并不是一件容易的事,我还没有遇到任何试图实现这一目标的项目。

在有人完成这样一项艰巨任务之前,制作asm.js代码的最佳方法仍然是用C / C ++编写代码并将其转换为JavaScript。

有关asm.js的更多信息,请参阅eg。 John Resig's article from 2013official specs