我的理解
除了运行cross-platform
上运行。
但是WASM是如何快速和跨平台的呢? WASMs
现在我的问题。
问题
WASM只是从现有的C/C++/Rust代码中创建中间字节码,就像Java一样,不编译成裸金属? Assembly?
。
发布于 2022-09-20 19:14:43
作为一种近似,您可以将WebAssembly看作是用自己的指令定义自己的CPU。它有自己的二进制编码,因此"0x6A“意味着”从堆栈顶部弹出两个I32,并将它们添加,将结果推到堆栈的顶部“。您可以阅读完整的规范:https://webassembly.github.io/spec/core/bikeshed/
“为什么它更快”是一个复杂的问题,简而言之,它是由对当代编译器技术和CPU设计有深刻理解的人“设计得很好”。当浏览器接收到WebAssembly时,它可以一次解释一条指令,但是WAsm的设计使得您可以快速地将其编译成本机代码,并获得相当快的本地CPU代码。
是否仅从现有的C/C++/Rust代码中创建中间字节码,就像Java那样,而不是编译成裸金属?
它不包含任何特定的实际CPU的预编译二进制文件。
WebAssembly和程序集之间的关系是什么?
CPU只知道如何用自己的汇编语言“指令集体系结构”运行指令。因此,所有其他软件必须首先转换为此(或通过解释器运行,解释器本身是首先转换为CPU指令的程序)。WebAssembly的设计是为了使在x86、ARM和RISC等实际机器上向本机组装的转换变得简单。
关系是WAsm必须转换为CPU程序集,或者在解释器中运行。而且,WebAssembly就像一个真正的CPU,编译器已经可以为不同的CPU发出代码,可以扩展到为WAsm发出代码。这就是为什么我们可以将C和Rust编译成WebAssembly。可以合理地预期,任何可以为实际CPU编译的新编程语言也可以为WAsm编译。
是否从组装中借用了任何想法、技术或哲学?
好的。程序集是一种命令式编程语言(指令一个接一个地运行),WAsm也是如此。许多实际的CPU定义了堆栈的概念,您可以推送/pop,WAsm使用堆栈。大多数CPU都有“添加两个32位整数”这样的指令,WAsm也是如此。大多数CPU都有“分支”指令,"WAsm“也是如此。大多数CPU都有在给定字节地址上读写内存的指令,WAsm也是如此。
发布于 2022-09-20 19:24:15
WASM是一种特定用途的装配。
这也是一种不受市场法律驱动的集体努力。
如果WASM真的要占上风,浏览器的受欢迎程度将取决于它,那么一定会有一些浏览器会给它添加供应商扩展,就像JS和CSS一样。使WASM不那么跨平台。
这不是技术问题,而是人的问题。我们可以轻松地设计兼容的CPU,但我们更喜欢设计快速CPU,每个人对于如何设计快速CPU都有自己的想法。
WASM由浏览器解释,很可能是JITted。它不需要任何外部库,它不是一个通用的程序集。它是用来在浏览器中运行的。
它更快,因为它已经编译成简单的指令,只需看一下WASM和ECMAScript ( JS )的规范,就可以很容易地看到解析、编译和执行JSw.r.t还有多少工作要做。更简单的低级指令。
这就是为什么它被称为WASM,因为它是一组与JS相比的低级指令。
但是除了低级之外,它与传统的汇编语言没有什么共同之处(只有一些概念,比如SIMD)。与实际汇编语言相比,WASM的级别太高了。
您可以通过查看任何程序集和WASM规范来说服自己。在传统的汇编语言中,您将找不到结构化的指令或模块的概念或无法到达的代码。
它显然是用一台特定的抽象机器设计的,在硬件上实现起来成本很高。
https://stackoverflow.com/questions/73790881
复制相似问题