42

编译中的一个趋势是使用类型化的中间语言。Haskellghc及其core中间语言,System F-omega 的一种变体,就是这种架构的一个例子 [1]。另一个是 LLVM,它的核心是一种类型化的中间语言 [2]。这种方法的好处是可以及早检测到构成代码生成器部分的转换中的错误。此外,可以在优化和代码生成期间使用类型信息。

为了提高效率,类型化的 IR 会进行类型检查,而不是推断其类型。为了快速进行类型检查,每个变量和每个 binder 都携带类型以便于类型检查。

但是,编译器管道中的许多转换可能会引入新变量。例如,规范化转换K(.)可能会转换应用程序

M(N)

变成像这样的表达

let x = K(M) in
let y = K(N) in x(y)

问题。我想知道编译器如何处理为新引入的变量赋予类型的问题。K(M)在上面的示例中,他们是否重新进行类型检查K(N)?这不是很费时间吗?它是否需要传递一个环境?他们是否使用来自 AST 节点的映射来键入信息以避免重新运行类型检查?


  1. S. Marlow,S. Peyton Jones,格拉斯哥 Haskell 编译器

  2. LLVM 语言参考手册

4

0 回答 0