什么是ASM.js,对每个人意味着什么?


27

我开始听到有关这个名为ASM.js的项目的传闻。目前,他们的网站糟糕透顶。这是我在网络上的研究所知道的。

  • 它是可以高度优化的JavaScript的子集。我猜是因为它避免了语言的动态部分。
  • 编译为ASM.js的代码的性能大约是C的一半(不是很轻)。
  • 目的是使编译器使其目标语言为ASM.js。
  • Firefox将随ASM.js优化一起发布。
  • Mozilla和Unreal团队通过它将Unreal Engine移植到了Web上,并以接近本地的速度运行在Firefox版本中。

网上似乎没有关于这到底什么,有用性或最终目的的任何具体信息。是否可以编译本来可以在服务器端运行的代码库,并使其以接近本机的速度在浏览器中运行?对开发人员有什么影响?

Answers:


21

您已经描述了它什么。用途是它是一种适用于所有浏览器的低级语言,在大多数浏览器中速度非常快,而在某些浏览器中速度非常快。与其他任何编程语言一样,您所做的工作是开放式的。

Mozilla似乎最热衷的用例是:通过Emscripten,已经有将LLVM后端(主要是C和C ++)的语言编译为JavaScript的方法。asm.js与Emscripten已经发出的代码非常接近,因此这使Emscripten代码(在当今的JavaScript JIT编译器中已经非常快)变得更快,从而进一步实现了将现有代码库移植到Web的目标。再次,您将其用于什么才是您的决定。移植游戏是一种用例(Mozilla显然参与其中),但是有无数用C和C ++编写的东西,其中许多对于某人的网站可能会派上用场。我见过一些(加上我自己的一些设计),但不能保证可行性:

  • 移植通用算法(例如zlib,libjpeg,openssl,FFT实现)以使JavaScript /网站能够执行更多操作,而不必创建新的Web标准,也无需依靠各个浏览器来实现它。
  • 移植解释器,以使JavaScript以外的其他语言也可以在浏览器中运行,而开销却更少,移植工作量也最小。
  • 使用asm.js作为更多编译器的后端,尤其是那些不能很好地映射到JavaScript并且不需要其大部分功能和开销的编译器。一个示例可能是设计用于快速数字运算而无需分配内存的语言。
  • 使用asm.js JavaScript中创建JIT 。它可以完全实现任何语言-例如ActionScript
  • 同样,将现有的JIT编译器移植到浏览器中运行(请参阅移植解释器,与JS相比实际上没有开销)。这可能仅在像PyPy一样自动生成JIT编译器时才可行。


1
这是将JIT移植到asm.js 的概念证明。这是一个独特的卖点,大多数新兴平台都不支持JIT。
东武2014年

是否有解释说明asm.js如何支持JIT编译?似乎找不到任何相关信息。对如何处理安全隐患最感兴趣。
罗曼·斯塔科夫

@romkyns通过浏览器将asm.js的JIT编译为机器代码,还是通过JavaScript程序将JIT编译 asm.js?对于前者,至少在Firefox中,纯JS JIT编译器的机器代码生成功能被重用。由于asm.js只能调用JS,执行算法并使用范围内索引检查堆堆数组,因此其安全性与JS执行的安全性差不多。对于后者,您只需要生成asm.js源代码并让浏览器执行它,就不会产生我前面提到的安全隐患。

(我的意思是后者)我以某种方式想到了JIT编译器会发出本机代码。感谢您的澄清!
罗曼·斯塔科夫

4

想象一下ASM.js是一个大的二进制ArrayBuffer,称为堆和一组JavaScript模块,它们以prologue指令开头:"use asm";并对原始二进制数据执行快速的低级操作,类似于汇编语言。这些模块可以手工编写,也可以通过Emscripten之类的脚本从LLVM代码中更好地进行编译。借助Mozilla OdinMonkey引擎,可以提高它们的性能,但是它们与大多数现代ECMAScript解释器向后兼容。

ASM.js不仅限于游戏,您甚至可以在浏览器中运行整个Qt应用程序,就像这样

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.