3

我有个朋友说:

对我来说,Haskell 最有趣的不是语言和类型。它背后是 Spineless Tagless Graph Machine。

因为 Haskell 的人一直在谈论类型,所以这句话真的引起了我的注意。现在我们可以这样看一下 Haskell 的编译过程:

  1. 解析
  2. 类型检查
  3. 脱糖+一些碎屑
  4. 翻译为核心
  5. 优化的最大份额
  6. 翻译成 STG 语言
  7. STG 语言转 C–</li>
  8. C– 装配或 llvm

我们可以简化为:

  1. ..前端的东西..
  2. 将 IL 翻译成 STG 语言
  3. 将 STG 语言编译为 C/ASM/LLVM/Javascript

即 - Haskell 被编译成一种中间“图形语言”,并且在它被编译成 LLVM/C 等之前在那里发生了各种优化。

这与如下所示的潜在 JVM 语言编译过程形成对比:

  1. 在类中将 JVM 语言代码转换为 Java 字节码。
  2. 在 Java 虚拟机上运行字节码。

假设可以在 Java 编译过程中添加一个中间 STG 编译​​步骤,我想知道这种变化会有什么影响?编译后的代码会有什么变化?

(我知道您需要一种纯函数式语言来充分利用无脊椎无标签图形机器,因此如果回答这个问题有帮助,假设我们正在编译Frege [Haskell for the JVM]。)

我的问题是:如果 JVM 语言编译过程有一个像 Haskell 这样的 STG 阶段,会发生什么变化?

4

1 回答 1

1

您需要澄清您是指 Java 语言还是在 JVM 上运行的某种语言。

我对 Java 语言的了解仅限于阅读规范,而我对您所说的 Haskell IR 一无所知。但是,按照规范,Java 是一种动态语言,执行任何使用每个最终类文件之外的任何信息的 AOT xform 都是非法的。

当然,不使用这些功能的项目可能会违反这些规则。

于 2016-01-01T09:48:57.710 回答