汇编的一个趋势是使用类型化的中间语言。 Haskell的ghc
及其core
中间语言,系统F-omega的变体,就是这种架构的一个例子[1]。另一个是LLVM,它的核心是一种类型化的中间语言[2]。这种方法的好处是可以及早检测构成代码生成器部分的转换中的错误。此外,可以在优化和代码生成期间使用类型信息。
为了提高效率,对类型化的IR进行类型检查,而不是推断其类型。为了快速进行类型检查,每个变量和每个活页夹都带有类型以便于类型检查。
但是,编译器管道中的许多转换可能会引入新变量。例如,规范化转换K(.)
可能会转换应用程序
M(N)
进入像
这样的表达式let x = K(M) in
let y = K(N) in x(y)
问题。我想知道编译器如何处理给新引入类型的问题
变量。在上面K(M)
和K(N)
的示例中,他们是否重新进行了类型检查?这不是很费时间吗?它需要通过环境吗?他们是否使用AST节点中的映射来键入信息以避免重新运行类型检查?
S上。 Marlow,S。Peyton Jones,The Glasgow Haskell Compiler。