可以常规的JavaScript被转换成asm.js呢,还是只有加快静态类型的低级语言?(Can re

2019-07-23 08:37发布

我已阅读的问题如何测试,并与asm.js发展? 和接受的答案给出了一个链接http://kripken.github.com/mloc_emscripten_talk/#/ 。

那幻灯片放映的结论是:“ 静态类型语言,尤其是C / C ++可以有效的JavaScript编译 ”,所以我们可以“ 指望编译的C / C ++的速度去比本地代码只是2X速度较慢,或更好今年晚些时候 ”。

但对于非静态类型语言中,如常规的JavaScript本身这样? 是否可以编译为asm.js?

Answer 1:

也可以javascript本身被编译成asm.js?

不是真的,因为它是动态的。 这是同样的问题时,试图将其编译为到C ,甚至到本机代码 -你确实需要推出一款VM与它采取的那些非静态方面的照顾。 至少,这样的VM是可能的:

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

但是,如果asmjs代码的运行速度比普通的JS,然后是有意义的编译JS来asmjs,不是吗?

第asm.js是JS的相当有限子集,可以很容易地转换为字节码。 然而,你首先需要JS的所有先进功能分解成子集为获得这个优势 - IMO一个相当复杂的任务。 但JavaScript引擎的设计和优化,把所有这些先进的功能, 直接成字节码-何必约像asm.js一个中间步骤? Js.js号称比“本土” JS慢约200倍。

又是怎么回事一般非静态类型语言中?

大约从幻灯片会谈...只是C / C ++? 向前。 特别:

动态语言

整个C / C ++运行时可以编译和原来的语言,正确的语义解释,但这不是轻量级

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

事实上,这些语言依赖于特殊的虚拟机是有效的

源到源为他们的编译器失去了在这些虚拟机所做的优化



Answer 2:

在回答一般问题:“这可能吗?” 那么答案就是肯定的是,这两个JavaScript和asm.js子集是图灵完整,从而存在翻译。

是否应该这样做,并期待着性能优势是不同的问题。 简短的回答是“不,你不应该。” 我这个比喻来试图压缩压缩文件; 是的,这是可以运行的压缩算法,但一般你不应该期望得到的文件要小一些。

答案很简单:动态类型语言中的性能开销来自于代码的含义; 与同等意义的静态类型的节目将进行同样的费用。

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

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

如果xy均已知是整数,我可以优化功能c的一对夫妇的机器代码指令。 如果他们能是整数或字符串,优化问题变得更加困难; 我必须把这些作为字符串在某些情况下,追加,以及另外在其他情况下。 特别是,有发生在加法运算的四个可能的解释c ; 它可能是另外或字符串追加,或强迫到字符串和追加的两个不同的变种。 当您添加更多可能的类型,可能的排列数量的增长; 在用于动态型语言最坏的情况下,你有一个表达涉及n的各自可具有任何数目k类型方面K ^ n个可能的解释。 在静态类型语言中,k = 1,所以总有1解释任何给定表达式的。 正因为如此,优化是从根本上优化比动态类型的代码静态类型的代码更高效:有少排列为机遇,以优化搜索时要考虑的。

这里的关键是,从动态类型的代码转换为静态类型代码(正如你从JavaScript去时asm.js做)的时候,你必须考虑原代码的语义。 含义类型检查仍然存在(它只是现在已经阐明了静态类型的代码)和所有那些排列仍然存在扼杀编译器。



Answer 3:

asm.js一些事实,这有望使这一概念清晰:

  1. 是的,你可以手工编写的asm.js方言。

    如果你没有看的asm.js的例子,他们是被用户友好的很远。 显然,JavaScript是不是创建此代码前端的语言。

  2. 翻译香草JavaScript来asm.js话是不可能的。

    想想看-如果你已经可以在一个完全静态的方式翻译标准的JavaScript,为什么会有需要asm.js? asm.js的唯一所有脑干意味着JavaScript的JIT人有些人放弃了自己的承诺,JavaScript就获得更快的未经开发的任何努力。

    有几个方面的原因,但我们只能说这将是非常艰难的JIT了解动态语言作为静态编译好。 然后,可能为开发商充分了解JIT。

最后,它归结为使用该任务的合适的工具。 如果你想静,非常高性能的代码,用C / C ++(/ JAVA) -如果你想有一个动态语言,使用JavaScript,Python和...



Answer 4:

asm.js已由需要创建的具有JavaScript的一个小的子集可以很容易地优化。 如果你能有办法的JavaScript转换为JavaScript / asm.js,asm.js,不再需要 - 该方法可以在JS解释器直接插入。



Answer 5:

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

无论哪种方式,它会更有意义转换与语言静态类型来asm.js,因为静态类型是asm.js的要求,这使得它非常难以编译成汇编的缺乏普通的JavaScript的功能之一.js文件。

早在2013年,当asm.js是热的,还有一直试图编译类似于JavaScript中的静态类型语言 ,但无论是语言和编译器似乎已经被抛弃了。

如今,在2017年,javascipt的子集打字稿及流量将是转换为asm.js合适的人选,但既不是语言的核心开发团队有兴趣在这样的转换。 LLJS有可能编译为asm.js叉子,但该项目几乎是死了。 ThinScript是一个更近的尝试,并基于打字稿,但它似乎并没有被激活无论是。

因此,生产asm.js代码的最佳和最简单的方法仍然是用C / C ++代码,并转换/编译/ transpile它。 然而,仍有待观察我们是否甚至会想这样做,在可预见的将来。 连接板组件可能很快就会完全取代asm.js而且也已经弹出像打字稿类语言TurboScript和AssemblyScript是转换为Web大会。 事实上,TurboScript最初是基于ThinScript和用来编译到asm.js,但他们似乎已经放弃了这项功能。



Answer 6:

检查这个http://badassjs.com/post/43420901994/asm-js-a-low-level-highly-optimizable-subset-of

基本上你需要检查你的代码将asm.js兼容(无强迫或类型转换,你需要管理的内存,等等)。 这背后的想法是用JavaScript编写代码,检测瓶颈,做您的使用asm.js和AOT编译代替JIT和动态编译代码的变化......是有点PITA,但你仍然可以使用JavaScript或其他像C ++或better..in不久的将来语言,lljs .....



Answer 7:

有可能通过第一到常规的JavaScript转换成ams.js 编译成Ç或C ++ ,然后编译生成的代码转换成使用asm.js Emscripten 。 我不知道这是否会成为现实,但它是一个有趣的概念仍然。

最近,我发现了另一个叫工具NectarJS是JavaScript的编译成WebAssembly和ASM.js.



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