主要观点:工具与编译器不同,其前端、中间优化端和后端代码生成更复杂。围绕区分编译器和“转译器”的争论大多集中在语言语法上,而实际工作中不同语言语义不同,转译复杂。
关键信息:
- 以 Python 转译为 C 为例,展示转译过程及遇到的问题,如
range
函数的实现差异等。 - 提到 BabelJS 等“转译器”,如将 ES6 生成器转换为已有语言结构,其实现是全程序转换。
- 指出转译器常被错误标注,人们对其理解存在误区,如认为转译器简单、目标抽象层次相同、无后端等,而编译器实际能做更多且基于语言语义。
- 说明编译器不只是针对机器码,还可生成虚拟机字节码等,多 tier 编译方案常见。
- 强调不应害怕编译器,编程语言有语义,仅操纵语法会导致工具不佳。
重要细节:
- Nuitka 和 Mojo 实际是编译器却称自己为转译器。
reduce
的实现在纯 Python ,range
在 C 中实现。- Facebook 的 regenerator 是将生成器转换的“转译器”。
- BabelJS 有针对不同 JavaScript 版本的“预设”。
- Rust 编译器中通过 MIR 处理语法糖。
- Lindsey Kuper 有关于此主题的文章。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。