程序集(asm.js)如何在浏览器中运行?

时间:2015-09-02 17:59:11

标签: javascript html5 asm.js

Asm.js来自一类新的JavaScript应用程序:已编译成JavaScript的C / C ++应用程序。它是Mozilla的Emscripten项目产生的JavaScript子集。

但它是如何工作的,为什么我会使用它呢?

1 个答案:

答案 0 :(得分:9)

为什么要编译为JavaScript?

JavaScript是唯一适用于所有Web浏览器的语言。虽然只有JavaScript可以在浏览器中运行,但您仍然可以使用其他语言编写并仍然编译为JavaScript,从而允许它也可以在浏览器中运行。这可以通过称为emscripten.

的技术实现

Emscripten是一个基于LLVM的项目,它将C和C ++编译为asm.js格式的高性能JavaScript。简而言之:在浏览器内部使用C和C ++接近原生速度。更好的是,emscripten将OpenGL(桌面图形API)转换为WebGL,这是该API的Web变体。

asm.js如何适应图片? enter image description here

Asm.js是Assembly JavaScript的缩写,是JavaScript的一个子集。 asm.js程序的行为是相同的,无论它是在现有的JavaScript引擎中运行,还是在识别和优化asm.js的提前(AOT)编译引擎中运行,当然除了速度之外!

就速度而言,很难准确测量它与本机代码的比较,但编译为asm.js的C程序的初步基准通常比使用clang编译器的本机编译慢2倍。 C,C ++和Obj-C编程语言的前端。值得注意的是,这是单线程程序的“最佳”案例。更多关于以下JavaScript语言的限制。

在后端,Clang使用LLVM,它是一个用于构建,优化和生成中间和/或二进制机器代码(再次为0和1)的库。 LLVM可以用作编译器框架,您可以在其中提供“前端”(解析器和词法分析器,如Clang)和“后端”(将LLVM表示转换为实际机器代码的代码)

进一步阅读:Mozilla的Alon Zakai有一个fantastic slide deck,它详细介绍了这一切是如何运作的。

那么asm.js有多酷?好吧,它有自己的Twitter帐户@asmjs。虽然asm网站有点稀疏,但它确实涵盖了W3C规范,除了有一个彻底的常见问题解答。更好的是,Mozilla在2014年协调了Humble Mozilla Bundle,这让你可以购买一堆利用asm.js的游戏。

Why not just turn your JavaScript code into asm.js?

由于其动态特性,JavaScript无法真正编译为asm.js并提供许多好处。这与尝试将其编译为o C甚至native code时的问题相同 - 使用它的VM将需要处理那些非静态方面。但是,您可以手动编写asm.js。

如果已经可以以完全静态的方式翻译标准Javascript,则不需要asm.js. Asm.js的存在是为了让Javascript在没有开发人员的任何努力的情况下变得更快。 JIT很难理解动态语言和静态编译器。

为了更好地理解这一点,重要的是要理解为什么asm.js会提供性能优势;或者为什么静态类型语言比动态类型语言表现更好。一个原因是“运行时类型检查需要时间”,而更经过深思熟虑的答案将包括优化静态类型代码的增强可行性。从静态类型语言(如C语言)开始的最后一个好处是编译器在编译时知道每个对象的类型。

Asm.js是JS的一个受限子集,可以很容易地转换为字节码。所需的第一步需要将JS的所有高级功能分解为该子集以获得此优势,这有点复杂。但JavaScript引擎经过优化和设计,可以将所有这些高级功能直接转换为字节码 - 因此像asm.js这样的中间步骤并没有提供太多优势。

我会详细介绍in this post.