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

Can regular JavaScript be converted to asm.js, or is it only to speed up statically-typed low-level languages?

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

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

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


Can JavaScript itself be compiled to asm.js?

because of its not真的,动态的性质。这是the same as问题当试图编译C或它可能真的会到本地队列- You need to船到VM with it to来照顾那些非静态的方面。至少,VM可能是这样的:P></

js.js is a JavaScript interpreter in JavaScript. Instead of trying to create an interpreter from scratch, SpiderMonkey is compiled into LLVM and then emscripten translates the output into JavaScript.

blockquote></

But if asmjs code runs faster than regular JS, then it makes sense to compile JS to asmjs, no?

没有那么约束子集。asm.js is of that can be translated easily JS的字节码。我还要你在打破第一need to the features of Advanced Down to that for this子集JS要那么复杂任务的优势-国际海事组织。但JavaScript是发动机设计和先进的optimized to translate into字节码的特点directly那些我知道为什么打扰about an中asm.js步样?要求在200 js.js to be"乡土"时代slower比JS。P></

And what about non-statically-typed languages in general?

...just about that from the slideshow万能的C / C + +?onwards。专门开发:P></

Dynamic Languages

Entire C/C++ runtimes can be compiled and the original language
interpreted with proper semantics, but this is not lightweight

Source-to-source compilers from such languages to JavaScript ignore
semantic differences (for example, numeric types)

Actually, these languages depend on special VMs to be efficient

Source-to-source compilers for them lose out on the optimizations done in those VMs

blockquote></


回答一般问题"有可能吗?"然后,答案是肯定的,javascript和asm.js子集都是图灵完成的,所以存在一个翻译。

一个人是否应该这样做并期望一个性能优势是另一个问题。简短的回答是"不,你不应该"。我把它比作试图压缩一个压缩文件;是的,可以运行压缩算法,但一般来说,你不应该期望得到的文件更小。

简而言之:动态类型语言的性能成本来自于代码的含义;具有相同含义的静态类型程序将承担相同的成本。

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

1
2
3
function a(x) { return x + 1; }
function b(x) { return x - 1; }
function c(x, y) { return a(x) + b(y); }

如果xy都是整数,我可以将函数c优化为几个机器代码指令。如果它们可以是整数或字符串,那么优化问题就变得更加困难了;在某些情况下,我必须将它们视为字符串附加,而在其他情况下则必须进行加法。特别是,在c中出现的加法运算有四种可能的解释;它可以是加法,或字符串附加,或强制字符串和附加的两种不同变体。当您添加更多可能的类型时,可能的排列数会增加;在动态类型语言的最坏情况下,您可以对一个表达式进行k^n可能的解释,其中涉及n个术语,每个术语都可以有任意数量的k类型。在静态类型语言中,k=1,所以任何给定表达式总是有1种解释。因此,与动态类型代码相比,优化器从根本上更有效地优化静态类型代码:在搜索优化机会时要考虑的排列更少。

这里的要点是,当从动态类型代码转换为静态类型代码时(就像从javascript转换为asm.js时所做的那样),必须考虑原始代码的语义。这意味着类型检查仍然会发生(刚刚拼写出静态类型代码),所有这些排列仍然存在,以扼杀编译器。


一些事实asm.js about which make clear,the hopefully概念:P></

  • 是的,你可以写dialect by the asm.js手。P></

    如果你看我asm.js for the examples are they?太远,从用户友好。明显的JavaScript前端is not the language for creating this队列。P></

  • 翻译dialect香草is not possible to asm.js JavaScript。P></

    如果你认为它已经可以translate EN标准的JavaScript在全静态类型的仪表美,为什么会asm.js need for there be a?太阳existance of the means that asm.js at some people JavaScript JIT人在线,他们答应给后续没有任何的努力会得到更快的JavaScript developer from the。P></

    there are several原因for this,but让我们说它真的会好硬for the动态了解JIT编译器在静态语言as as good。然后developers probably for the to the JIT的全面理解。P></

  • 在EN boils using the end to the right down for the任务的工具。如果你非常想要永久队列,静电,使用C / C + + /(Java)-如果你想使用动态语言,JavaScript,Python,…P></


    asm.js has been created by the need of which have a小的子集easily optimized can be of的JavaScript。如果You can have to convert to JavaScript JavaScript的方式/ asm.js is not needed,asm.js method that can be插了- interpreters directly JS。P></


    理论上,如果可以用asm.js中存在的语言的有限子集来表示,就可以将任何javascript操作转换/编译/执行为asm.js。然而,在实践中,目前还没有能够将普通javascript转换为asm.js的工具(2017年6月)。

    不管怎样,将具有静态类型的语言转换为asm.js都更有意义,因为静态类型是asm.js的一项要求,而缺乏静态类型是普通javascript的一个特性,这使得编译为asm.js异常困难。

    早在2013年,当asm.js很流行时,就有人试图编译类似于javascript的静态类型语言,但该语言和编译器似乎都被放弃了。

    今天,在2017年,javascript子集typescript和flow将适合转换为asm.js,但是这两种语言的核心开发团队对这种转换都不感兴趣。LLJS有一个可以编译为asm.js的分叉,但是这个项目几乎已经死了。Thinscript是一个更为新的尝试,基于typescript,但它似乎也不活跃。

    因此,生成ASM.JS代码的最好且最简单的方法仍然是用C/C++编写代码,并转换/编译/转换它。然而,我们是否愿意在不可预见的将来这样做仍有待观察。Web组装可能很快会完全取代asm.js,并且已经出现了类似于typescript的语言,比如turboscript和assemblyscript,它们可以转换为Web组装。实际上,turboscript最初是基于thinscript的,用于编译为asm.js,但它们似乎已经放弃了这个特性。


    可以将正则JavaScript转换成AMS.JS,首先将其编译成C或C++,然后使用EnScript将编译后的代码编译成ASM.JS。我不确定这是否可行,但这仍然是一个有趣的概念。

    最近,我发现了另一个名为nectarjs的工具,它将javascript编译成Webassembly和asm.js。


    check this http:/ / / / badassjs.com后43420901994 ASM的JS -低-级高度优化的子集- OF -P></

    基本上,你需要检查你的代码会好的(或不兼容的asm.js coercion型铸造,You need to the存储管理等)。This is the主意写在你的JavaScript代码中的瓶颈,探明the changes and the code for给你asm.js取样器和使用动态编译JIT和aot instead but You can在皮塔...is位仍然使用JavaScript或其他语言像C++或更好的在近未来,lljs…P></