我正在调查Scheme编译器Stalin。它既大又复杂。此外,如果我理解正确,作者计划撰写一系列详细介绍实施方面的论文,但从未接触过这样做。
我感兴趣的斯大林方面是全局类型推断:根据它们在程序中其他地方的用法来推断事物的类型。斯大林确实这样做了吗?如果是,如何以及在其代码库中的位置?它是否使用Hindley-Milner算法的变体/扩展名?
答案 0 :(得分:3)
来自README:
斯大林使用软类型系统进行全局静态类型分析 支持递归联合类型。斯大林可以确定狭窄甚至是 任意Scheme中每个源代码表达式的单态类型 没有类型声明的程序。这允许斯大林减少,或 经常消除,运行时类型检查和调度。斯大林也 基于每个表达式进行低级表示选择。 这允许使用未装箱的基本机器数据表示 所有单态类型导致极高性能的数字 代码。
斯大林使用基于集合的分析进行类型推断(SBA aka 0CFA)。该分析被增强以支持多变量程序 分裂。 SBA的结果用于减少运行时类型 检查和调度。 SBA的结果也被用来做 基于每个表达式的低级表示选择。这有 两个好处。首先,可以消除类型标签的类型标签, 允许使用基本机器表示原语 数据。其次,拳击可以消除,减轻成本 与...相关的间接,分配和回收 拳击。消除拳击需要运行时组织 允许变量,参数,结构槽和向量槽 不同的宽度取决于它们的数据类型 保持。此外,只有在用户定义的结构中才能取消装箱 那些结构是不可改变的。 SBA扩展为确定数据 编译时的宽度和可变性。
实际的类型推断算法似乎主要在源代码中实现
档案source/stalin3b.sc
。
似乎SBA / 0CFA是一个完全独立的算法 辛德米尔纳。但是,Hindley-Milner也可用于实现软打字。
这里有一个更好的description of the 0CFA algorithm。
相关论文是Olin Shivers' 1991年博士论文控制流程 分析高阶语言或驯服Lambda 和Flanagan& Felleisen 1995年论文基于集合的完整方案及其使用分析 在软打字。