关于asm.js以及它将如何运行一些非常繁重的应用程序,有很多令人兴奋的地方。但是,它是从C++代码编译而来的。在不了解C++或其他低级语言的情况下,是否仍有可能从当前的改进中获益?
这是我的想法:有没有可能我们可以用Js编写代码,并将其重新编译为asm.js进行优化?
发布于 2013-05-06 23:55:12
但是,它是从C++代码编译而来的。
事实并非如此。这是一种语言。任何程序都可以发出包含asm.js代码的文本文件。Emscripten将LLVM编译成asm.js,并且有从C和C++到LLVM的编译器,但这只是获得asm.js代码的一种可能方式。诚然,这是目前最成熟、最实用、最流行的方式,但如果将来出现其他语言的其他asm.js编译器,我一点也不会感到惊讶。
在不了解C++或其他低级语言的情况下,还有可能从当前的改进中获益吗?
从理论上讲,任何可以提前高效编译成机器码的语言都可以使用asm.js高效地实现,这包括一些相当高级别的语言(例如Haskell)。但目前,还没有人有一个可以工作的实现,我也不认为这会变得非常流行。现在,如果您想要asm.js性能,您可能会编写C或C++代码,并将其编译成asm.js,是的。
请注意,上面排除了(以及其他许多) Javascript.The事实,即asm.js是Javascript的子集是方便的,因为asm.js代码可以在未经修改的浏览器上运行,但对于编写Javascript的人来说用处不大。asm.js基本上只是机器代码之上的一层薄层,在安全性和JS互操作性方面做了一些改进。将JS编译为asm.js与将其编译为机器码一样困难:如果您不关心性能(只需始终使用盒装的动态类型值,如解释器,并发出对运行时库函数的调用),则很容易,而当您这样做时,则非常困难。
事实上,经过几十年的研究,仍然没有像Javascript、Ruby或Python这样的高度动态的语言被提前编译成机器代码,并且运行速度比聪明的解释器快得多。另一方面,即时编译非常实用--但是主要的JS引擎已经做到了这一点,比起编译成asm.js,然后再次解析它并编译成机器码的方式要少一些。
发布于 2013-06-06 05:14:05
如果你有一个计算非常繁重的小函数(处理数字而不是操作DOM),你可以自己用asm.js风格手动重写它。这是可能的(I've done it),但很繁琐。
还有其他的asm.js编译器,例如LLJS,你可以用它来代替C++。
然而,asm.js并不是神奇的。只有当您使用比JS更适合于提前优化的语言时,您才能获得性能优势。您不能通过在JS VM上运行JS VM来获得功能齐全的JS并使其更快,就像您不能通过压缩来使ZIP文件更小一样。
发布于 2013-05-06 23:53:29
Asm.js不是一种单独的语言,而是Javascript的子集。它只是Javascript,为了提高性能,去掉了很多东西。这意味着您不需要学习另一种语言,尽管在这种情况下,了解C/C++可能有助于理解它。
https://stackoverflow.com/questions/16402226
复制相似问题