This content originally appeared on DEV Community and was authored by Yangholmes
高级计算机语言的两种运行方式
- 预先编译 Ahead-of-Time Compilation ,简称 AOT
- 即时编译 Just-in-Time Compilation ,简称 JIT
像 C/C++ 这类属于预先编译的计算机语言,而 JavaScript 这种属于即时编译语言。
现代编译器结构
编译器的最终目的是将高级计算机语言编译成机器语言,由于用户使用的 CPU 五花八门,相同的高级语言代码编译出来的可执行文件都有可能是不同的。为了提高效率,编译器会按照编译流程模块化设计。一般由 前端(Front End) 、中端(Middle End) 和 后端(Back End) 组成,每个节点都会产生中间表示(IR)传递给下一级。前端和中端的处理与硬件无关,最终在后端生成符合硬件参数的汇编代码。这种设计的好处在于,同一个编译器在不同的平台只需要开发不同的后端即可:
举个例子,C 的编译过程:
WebAssembly 的编译流转过程
WASM 是编译器的目标代码,但从浏览器的角度来看,WASM 更像是中端产出的 IR 。最终要被 AOT/JIT 编译器编译成平台相关的机器码。
格式
- 二进制格式,文件后缀是 .wasm
- 文本格式,文件后缀是 .wat
- 内存格式
二进制格式是 wasm 模块的主要格式,文本格式是为了方便开发者调试和理解 wasm 。但其实 wat 的阅读性也很差,如同读汇编。
wasm 模块必须安全可靠,所以在进入实例化之前,浏览器会先解码 wasm 为内存格式(in-memory) ,使用内存格式进行验证。
wasm 结构
流式(Streamable)加载 + 严格的段顺序,保证 wasm 可以一遍(One-Pass)完成代码的加载、解析、验证和编译。
This content originally appeared on DEV Community and was authored by Yangholmes