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

Dav*_*SFT 6 javascript html5 asm.js

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

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

Dav*_*SFT 12

为什么要编译成JavaScript?

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

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

asm.js如何适应这幅画面? 在此输入图像描述

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

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

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

进一步阅读:Mozilla的Alon Zakai有一个梦幻般的幻灯片,详细介绍了这一切是如何运作的.

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

为什么不把你的JavaScript代码变成asm.js?

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

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

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

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

在这篇文章中详细介绍了图片.