关于 asm.js 以及它如何能够运行一些非常繁重的应用程序有很多令人兴奋的地方。但是,它是从 C++ 代码编译的。在不了解 C++ 或其他低级语言的情况下,是否仍有可能从当前的改进中受益?
这是我的想法:我们是否有可能在 Js 中编写代码,是否为 asm.js 重新编译以进行优化?
关于 asm.js 以及它如何能够运行一些非常繁重的应用程序有很多令人兴奋的地方。但是,它是从 C++ 代码编译的。在不了解 C++ 或其他低级语言的情况下,是否仍有可能从当前的改进中受益?
这是我的想法:我们是否有可能在 Js 中编写代码,是否为 asm.js 重新编译以进行优化?
但是,它是从 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,然后再次解析并编译为机器代码更简单。
Asm.js不是一种单独的语言,而是 Javascript 的一个子集。它只是为了性能而剥离了很多内容的 Javascript。这意味着您不需要学习另一种语言,尽管在这种情况下了解 C/C++ 可能有助于理解它。
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 的更多信息,请参见例如。John Resig 2013 年的文章或官方规格。