6

听说 W3 正在研究 web 的字节码,web assembly (wasm) 会像 nasm 和 masm 一样有自己的语法吗?例如输入类似的东西,

 global _main
extern _MessageBoxA@16
extern _ExitProcess@4

section code use32 class=code
_main:
    push    dword 0      ; UINT uType = MB_OK
    push    dword title  ; LPCSTR lpCaption
    push    dword banner ; LPCSTR lpText
    push    dword 0      ; HWND hWnd = NULL
    call    _MessageBoxA@16

    push    dword 0      ; UINT uExitCode
    call    _ExitProcess@4

section data use32 class=data
    banner: db 'Hello, world!', 0
    title:  db 'Hello', 0

在 Windows 的 nasm 中

还是只能通过从 C/C++ 和其他语言编译来创建?

4

2 回答 2

14

WebAssembly 当前的工作原型已经有一个语法,它也由LLVM 后端CHECK:这些测试的部分)发出,由WAVM 后端使用。另见ilwasmWABT

这是官方的最终文本语法吗?不,但它可能会在稍后正式发布(2017 年 3 月更新:这可能很快就会发生)。

当前的 WebAssembly 二进制格式是一个堆栈机器,与 WebAssembly 采用的原始 AST 方法相比,这是一个重大变化。s 表达式本身并不更适合表示堆栈机器,但它们足够好、简单,并且可以避免无休止的自行车棚。


原答案:

它具有 WebAssembly 的重要属性,即被表示为 s 表达式,它固有地具有表达式树,这是AST 设计的关键部分。它还具有结构化控制流(AST),而不是大多数编译器 IR 所具有的(CFG)。

还有其他原型语法吗?是的!与V8 原型密切合作的 wassembler具有完全不同的语法。

为什么不是 s 表达式的另一种语法?大多数开发人员更熟悉类 C 语法!它不像二进制格式所包含的那样接近,但它仍然非常接近并且使用起来更好。

为什么这么复杂?阅读文本格式说明有助于理解。工作仍在进行中,最终 WebAssembly 的重要部分是二进制格式:它是所有工具将交换的内容,也是浏览器将使用的内容。那为什么还要使用文本格式呢?我们是工程师,我们更容易使用文本。我们稍后再考虑,文本格式的主要目标是人类理解,我们需要更多的人来确定我们创建的文本是否可以理解。

于 2015-09-19T15:59:12.450 回答
0

Web A s s e m bly (WASM)的文本表示将类似于 asm.js。官方 GitHub常见问题解答涵盖了您的问题:

事实上,通过放弃 asm.js 验证所需的所有强制,WebAssembly 文本格式应该比 asm.js 更自然地读写。在浏览器之外,在文本和二进制之间转换的命令行和在线工具也将很容易获得。

[...]

随着 WebAssembly 的发展,它将支持比 C/C++ 更多的语言,我们希望其他编译器也能支持它,即使是 C/C++ 语言,例如 GCC。

于 2015-09-19T09:48:28.763 回答