Javascript asm.js对编译器的限制

Javascript asm.js对编译器的限制,javascript,performance,compiler-construction,emscripten,Javascript,Performance,Compiler Construction,Emscripten,我想知道asm.js规范中是否有任何“设计限制”会阻止任何编译器直接从中生成本机汇编代码 目前,firefox的速度似乎只有本机代码的一半,但我想知道为什么它不能以本机速度运行。在我看来,asm.js与asm非常相似。目前的限制是使用Javascript的类型数组作为内存(即堆栈和堆)。这是由于其他脚本与asm.js生成的Javascript交互,并且需要共享的“内存”空间。 此外,我猜类型化数组被实现为实际的堆内存,这将比使用堆栈慢。因为Firefox的编译器没有像C编译器那样对asm.js代

我想知道asm.js规范中是否有任何“设计限制”会阻止任何编译器直接从中生成本机汇编代码


目前,firefox的速度似乎只有本机代码的一半,但我想知道为什么它不能以本机速度运行。在我看来,asm.js与asm非常相似。

目前的限制是使用Javascript的
类型数组作为内存(即堆栈和堆)。这是由于其他脚本与asm.js生成的Javascript交互,并且需要共享的“内存”空间。

此外,我猜
类型化数组
被实现为实际的堆内存,这将比使用堆栈慢。

因为Firefox的编译器没有像C编译器那样对asm.js代码进行大量优化。
在Windows上,这也是因为编译后的代码必须对数组访问执行边界检查(在其他操作系统上,Firefox的asm.js编译器OdinMonkey使用内存保护)

但是知道你有asm.js,也许你实际上可以使用一个更方便的
类型化数组的实现,就像实际使用堆栈一样。@Inuart这可能是可以做到的。问题在于这是一项巨大的任务,而且必须通过
类型化数组
接口访问堆栈。因此,您至少将始终有这种委托开销。堆栈是一个类型化数组,常规代码似乎在javascript堆栈上运行是什么意思?因此您认为可以以95%的速度运行(如在NaCl中)?NaCl代码可以使用SIMD指令,而asm.js没有。(PNaCl可能也会有同样的问题。)Firefox也不做自动矢量化。但是asm.js规范并不是最终的(它甚至计划在Firefox 22中达到测试版时禁用asm.js支持,也就是说,asm.js代码在该版本中将被视为普通js),因此在未来,可能asm.js编译器将自动矢量化(到目前为止,没有免费的编译器能够做到这一点)或者asm.js将被扩展。