婴儿的第二个 WebAssembly 编译器

主要观点:

  • 介绍了 zest 编译器,目前约 4500 行代码且无依赖,生成的 wasm 质量与 llvm 在 -O0 相近,未来一年左右编译时间有望接近 zig 的新非 llvm wasm 后端。
  • 阐述了编译器的管道流程,包括解析、去糖、求值、类型推断、生成等阶段,采用树状表达式结构,避免线性 ir 的一些问题。
  • 讨论了代码生成中的各种策略,如处理表达式和变量、使用影子栈、生成抽象值等,以及与 zig 代码生成的对比和差异。
  • 提到了编译器中的一些挑战,如堆栈溢出、内存对齐、调试等问题,并介绍了相应的解决方法和思路。
  • 计划在后续添加运行时和各种数据结构,目前 zest 位于私有仓库,欢迎有相关经验的人联系。

关键信息:

  • zest 编译器特性:无依赖、生成 wasm 质量、编译时间目标等。
  • 编译器流程各阶段及细节:如解析的 LL(1) 方式、去糖的各种操作等。
  • 代码生成策略:如处理表达式和变量的区别、影子栈使用等。
  • 编译器面临的问题及解决办法:堆栈溢出处理、内存对齐疑问等。
  • 后续计划:添加运行时和数据结构、将 zest 置于公开状态等。

重要细节:

  • 编译器各阶段复杂度大致线性,除去糖的一些边缘情况外,每个表达式仅被处理一次。
  • 代码生成中通过抽象值 Walue 处理常量,在某些情况下可避免不必要的分配。
  • zig 代码生成的特点及与 zest 的差异,如结果位置语义等。
  • 测试方法包括手写测试和模糊测试,使用 deno 运行 wasm 程序,chrome 进行调试。
  • 对比 zig 调试时运行时性能差异的原因,如慢拷贝和额外复制等。
  • 目前结构存储方式在循环中的问题及改进思路,将部分工作推至 infer 阶段。
  • 生成内置函数 wasm 时的两种选择及解决方案。
阅读 8
0 条评论