可以将常规JavaScript转换为asm.js,还是只是为了加速静态类型的低级语言?

Ori*_*iol 59 javascript asm.js

我已经阅读了如何使用asm.js测试和开发的问题,接受的答案提供了http://kripken.github.com/mloc_emscripten_talk/#/的链接.

该幻灯片的结论是" 静态类型语言,特别是C/C++可以有效地编译成JavaScript ",因此我们可以" 期望编译的C/C++的速度比本机代码慢2倍,或更好,今年晚些时候 ".

但是非静态类型的语言呢,比如常规的JavaScript本身呢?可以编译为asm.js吗?

Ber*_*rgi 34

JavaScript本身可以编译为asm.js吗?

不是真的,因为它的动态性.这与尝试将其编译为C甚至本机代码时的问题相同- 您实际上需要随身携带VM来处理这些非静态方面.至少,这样的VM是可能的:

js.js是JavaScript中的JavaScript解释器.SpiderMonkey不是试图从头开始创建解释器,而是编译成LLVM,然后emscripten将输出转换为JavaScript.

但是如果asmjs代码比常规JS运行得更快,那么将JS编译为asmjs是否合理,不是吗?

编号asm.js是一个非常有限的JS子集,可以很容易地转换为字节码.然而,您首先需要将JS的所有高级功能分解为该子集以获得此优势 - 这是一项非常复杂的任务.但JavaScript引擎的设计和优化将所有这些高级功能直接转换为字节码 - 那么为什么还要像asm.js这样的中间步骤呢?Js.js声称比"原生"JS慢大约200倍.

那么一般来说非静态类型的语言呢?

幻灯片演示来自...... C/C++?向前.特别:

动态语言

可以编译整个C/C++运行时,并使用适当的语义解释原始语言,但这不是轻量级的

从这些语言到JavaScript的源到源编译器忽略了语义差异(例如,数字类型)

实际上,这些语言依赖于特殊的VM来提高效率

他们的源到源编译器会失去在这些VM中完成的优化

  • 但是如果js.js SpiderMonkey(C/C++)翻译成JavaScript,我没有看到js.js和编译JavaScript到asm.js之间的关系?对我来说,JavaScript解释器比C/C++解析器慢. (3认同)

kil*_*een 12

回答一般性问题"这有可能吗?" 那么答案是肯定的,JavaScript和asm.js子集都是Turing完成的,因此存在翻译.

是否应该这样做并期望获得性能优势是一个不同的问题.简短的回答是"不,你不应该." 我把它比作试图压缩压缩文件; 是的,可以运行压缩算法,但一般情况下,您不应期望生成的文件更小.

简短的回答:动态类型语言的性能成本来自代码的含义; 具有相同含义的静态类型程序将承担相同的成本.

要理解这一点,重要的是要理解为什么 asm.js提供了性能优势; 或者,更一般地说,为什么静态类型语言比动态类型语言表现更好.简短的回答是"运行时类型检查需要时间",更长的答案将包括优化静态类型代码的改进的可行性.例如:

function a(x) { return x + 1; }
function b(x) { return x - 1; }
function c(x, y) { return a(x) + b(y); }
Run Code Online (Sandbox Code Playgroud)

如果x并且y都知道是整数,我可以优化函数c到几个机器代码指令.如果它们可以是整数或字符串,则优化问题变得更加困难; 在某些情况下,我必须将这些视为字符串附加,并在其他情况下添加.特别是,对添加操作有四种可能的解释c; 它可以是加法,或字符串追加,或强制转换为字符串和附加的两种不同变体.随着您添加更多可能的类型,可能的排列数量会增加; 在最坏的情况下,对于动态类型语言,您可以对包含n个项的表达式进行k ^ n个可能的解释,每个项可以具有任意数量的k种类型.在静态类型语言中,k = 1,因此对任何给定表达式总是有1种解释.因此,优化器在优化静态类型代码方面比动态类型代码更有效:在搜索优化机会时需要考虑的排列更少.

这里的要点是,当从动态类型代码转换为静态类型代码时(正如您从JavaScript到asm.js时所做的那样),您必须考虑原始代码的语义.这意味着仍然会发生类型检查(现在它已经拼写出静态类型的代码),并且所有这些排列仍然存在以扼杀编译器.


abe*_*ier 11

关于asm.js的一些事实,希望这个概念清晰明了:

  1. 是的,您可以手动编写asm.js方言.

    如果您确实查看了asm.js的示例,那么它们远非用户友好.显然,Javascript不是创建此代码的前端语言.

  2. 翻译香草JavaScript来asm.js方言是不是可能.

    想一想 - 如果你已经可以完全静态地翻译标准Javascript,为什么需要asm.jsasm.js的唯一存在意味着一些人的Javascript JIT人们放弃了他们的承诺,即Javascript将在没有开发人员的任何努力的情况下变得更快.

    有几个原因,但让我们只说这是真的很难的JIT了解动态语言作为静态编译好.然后可能让开发人员完全理解JIT.

最后,它归结为使用正确的工具完成任务.如果你想要静态,高性能的代码,使用C/C++(/ Java) - 如果你想要一个动态语言,使用Javascript,Python,......

  • 任何图灵完整语言都可以翻译成任何其他图灵完整语言. (11认同)
  • 仅仅因为你可以做某事并不意味着它自动是一种明智的方法. (11认同)
  • 是否合理,你断言"不可能"是错误的.这是可能的,但(基于其他答案)没有理由期望任何性能优势.通过类比,如果一个孩子伸手去触摸一个热炉,告诉他们"不可能触摸那个炉子,不要费心去尝试"既不正确也不实用. (3认同)