Compiler construction 类型化中间语言的语用学

Compiler construction 类型化中间语言的语用学,compiler-construction,ghc,compiler-optimization,llvm-ir,intermediate-language,Compiler Construction,Ghc,Compiler Optimization,Llvm Ir,Intermediate Language,编译的一个趋势是使用类型化中间语言。Haskell的ghc及其core中间语言(System F-omega的变体)就是这种架构的一个例子[1]。另一个是LLVM,它的核心是一种类型化的中间语言[2]。这种方法的好处是,组成代码生成器部分的转换中的错误可以及早检测到。此外,可以在优化和代码生成期间使用类型信息 为了提高效率,对类型化IRs进行类型检查,而不是对其类型进行推断。为了快速进行类型检查,每个变量和每个活页夹都带有类型,以便进行类型检查 但是,编译器管道中的许多转换可能会引入新变量。例如

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

为了提高效率,对类型化IRs进行类型检查,而不是对其类型进行推断。为了快速进行类型检查,每个变量和每个活页夹都带有类型,以便进行类型检查

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

M(N)
变成这样的表情

let x = K(M) in
let y = K(N) in x(y)
问题。我想知道编译器如何处理为新引入的对象提供类型的问题 变量。在上面的示例中,他们是否重新进行了打字检查
K(M)
K(N)
?那不是很费时吗?它需要传递一个环境吗?他们是否使用AST节点的映射来输入信息以避免重新运行类型检查


  • S.马洛,S.佩顿·琼斯


  • 可能是relevant@BasileStarynkevitch谢谢A-范式很重要,但是有没有一种理论能够有效地进行类型检查/类型推断A-范式?我的方法是在转换后重新运行类型传播,而不是忠实地携带所有类型信息。一些转换可能会完全剥离这些类型(只要它们是可恢复的)。像IR这样简单的东西上的类型传播是迄今为止最不可能的性能瓶颈。@MartinBerger,我更喜欢将所有内容都保存在可读(和可序列化)的IR中。例如,在类似于LLVM的IR中,我使用
    alloca
    节点、函数参数和全局变量声明保留粘性类型。其余的总是可以重建的。为了方便起见,我还将类型粘贴到变换之间的GEP节点,但如果有一个变换可以引入新的GEP,我将重新运行类型传播。@MartinBerger,我这样做是为了键入更高级别的IRs(例如,枚举具有唯一变量名的表达式节点,然后针对这些自由变量求解类型方程)。但是对于高度不稳定的低级别IRs来说,它有点混乱,很容易引入新节点或重写现有节点,而无需更新映射。将所有内容保存在一个单一、可读且可序列化的AST中会有很大帮助。