我有个朋友说:
对我来说,Haskell 最有趣的不是语言和类型。它背后是 Spineless Tagless Graph Machine。
因为 Haskell 的人一直在谈论类型,所以这句话真的引起了我的注意。现在我们可以这样看一下 Haskell 的编译过程:
- 解析
- 类型检查
- 脱糖+一些碎屑
- 翻译为核心
- 优化的最大份额
- 翻译成 STG 语言
- STG 语言转 C–</li>
- C– 装配或 llvm
我们可以简化为:
- ..前端的东西..
- 将 IL 翻译成 STG 语言
- 将 STG 语言编译为 C/ASM/LLVM/Javascript
即 - Haskell 被编译成一种中间“图形语言”,并且在它被编译成 LLVM/C 等之前在那里发生了各种优化。
这与如下所示的潜在 JVM 语言编译过程形成对比:
- 在类中将 JVM 语言代码转换为 Java 字节码。
- 在 Java 虚拟机上运行字节码。
假设可以在 Java 编译过程中添加一个中间 STG 编译步骤,我想知道这种变化会有什么影响?编译后的代码会有什么变化?
(我知道您需要一种纯函数式语言来充分利用无脊椎无标签图形机器,因此如果回答这个问题有帮助,假设我们正在编译Frege [Haskell for the JVM]。)
我的问题是:如果 JVM 语言编译过程有一个像 Haskell 这样的 STG 阶段,会发生什么变化?