主要观点:
- 介绍了 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 时的两种选择及解决方案。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。