Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将Assemblyscript编译为Wasm,性能_Javascript_Typescript_Webassembly - Fatal编程技术网

Javascript 将Assemblyscript编译为Wasm,性能

Javascript 将Assemblyscript编译为Wasm,性能,javascript,typescript,webassembly,Javascript,Typescript,Webassembly,我看到已经有一个编译器用于将TypeScript编译到WebAssembly(Wasm) 我还从多个来源听说,由于JavaScript的动态特性和动态类型,将JS编译成Wasm是不可行的 然而,TypeScript确实提供了JavaScript所缺乏的类型化变量。将来Wasm甚至可以与DOM交互/与其他web API交互 问题: 与使用JavaScript编写web应用程序相比,使用TypeScript编写应用程序并将其编译为Wasm是否会带来性能优势?如果您可以将特定的JavaScript功能

我看到已经有一个编译器用于将TypeScript编译到WebAssembly(Wasm)

我还从多个来源听说,由于JavaScript的动态特性和动态类型,将JS编译成Wasm是不可行的

然而,TypeScript确实提供了JavaScript所缺乏的类型化变量。将来Wasm甚至可以与DOM交互/与其他web API交互

问题:
与使用JavaScript编写web应用程序相比,使用TypeScript编写应用程序并将其编译为Wasm是否会带来性能优势?

如果您可以将特定的JavaScript功能编译为Wasm,它可能会运行得更快。与其他动态语言相比,JavaScript的运行速度非常快,因为(大多数)浏览器将其编译为一个低级别字节码,该字节码的解释速度非常快(甚至在本地运行)。Wasm的设计非常接近字节码,因此在最佳情况下,JS和“编译为Wasm的类型的JS子集”以相同的速度运行(如果两个编译器都做得很好)。但是:

1) JS源代码可能比Wasm代码大,因此从服务器加载它需要更长的时间(启动时间)

2) JavaScript必须经过优化才能运行得那么快,而且由于它不知道变量和属性的类型/生存期,因此在引擎找到编译它的最佳方法之前需要一些时间,所以这个优化过程需要时间。(预热时间)

也就是说,由于各种原因,您不能将大多数JavaScript或TypeScript转换为Wasm(这就是为什么AssemblyScript是TS的子集):

1)
eval
with
或just
for(const el of[1,“seven”,null])
是JS中的性能杀手,但它们不可能编译为Wasm(因为它们是性能杀手)


2) JavaScript具有垃圾收集功能

现实的答案是:不。关于打字脚本有一些常见的误解。其一是它不如JavaScript那么动态。事实并非如此,事实上它的每一点都和JS一样动态,因为它包含了JavaScript的所有语义(包括所有疯狂的角落案例),并且它的类型系统太弱和不健全,无法提供普通脱机编译器可以用于静态优化的保证。充其量,这些类型可以被用作动态VM可以首先尝试优化的提示,因为很清楚它们可能会被证明是错误的


(另外,我不知道Wasm编译器中有TypeScript。您可能在考虑AssemblyScript,但虽然它重用了TypeScript的语法,但其语义却非常不同。)

您在问题中引用了AssemblyScript。汇编脚本是typescript的一个非常严格的子集。不要把它和typescript混淆,它是自己的。最大的区别在于Typescript包含了Javascript中所有我们都知道并且喜欢(讨厌)的动态属性。另一方面,AssemblyScript不支持


两大差异的例子如下:;在AssemblyScript中,不能有闭包。也不能有联合类型

我认为你应该用AssemblyScript替换TypeScript以避免混淆。所以这个编译器不把TS编译成WASM?但是assemblyscript到WASM?不确定你是从哪里想到WASM是设计成接近JS字节码的。这在几个层面上都是错误的。首先,Wasm被设计成接近硬件的机器代码,与JS没有任何关系。这就是为什么它很快。第二,JavaScript引擎也不会将优化后的JS作为字节码运行,而是将其编译为本机代码。@andreas据我所知,v8只将热函数编译为本机代码。因此,“编译”一词在这里有点误用,这就是为什么在“解释”一词中混用以区别于实际编译代码的原因。关于Wasm部分,我假设您是对的,并将“那个字节码”更改为“字节码”,当然,但是V8直到去年才使用字节码,它作为第一层的引入是最近的一次更改。此字节码纯粹用于JS,与Wasm没有关系或相似之处。它也非常非常慢,所以不能用于快速执行。我不知道你的意思。Wasm不会编译成字节码,所以通过Wasm编译的代码不能“以字节码结束”。这两条路径都可能以本机代码结束,但即使是这两条路径之间看起来也会非常不同。好吧,是的,但这是一条对任何两种语言都适用的假设语句。实际上,对于非平凡的JS和Wasm代码来说是不可能的。缺少闭包或有区别的联合是暂时的限制。有关闭实施的PR,例如: