我是类型系统和类型推断的新手。我的目标是为没有类型的 OOP 语言实现静态类型系统和类型推断算法(最接近的例子是没有反射和内省等动态功能的 JS)。
我的第一个想法是实现静态类型系统和类型检查算法,然后为该系统实现类型推断。我查了几篇关于类型推断的文章(面向对象的类型推断、JavaScript静态编译的类型推断、SELF的类型推断),他们都跳过了类型检查部分,所以我有点对我的想法感到困惑。
主要问题是:类型推断与类型检查有何关系?类型推断后是否需要进行类型检查?这是如何在现有语言中通过类型推断(完全和部分)实现的?
我实际上还没有实现静态类型系统,但目前我将如何区分类型推断和类型检查:
类型推断为没有显式类型的程序部分分配一组类型。如果程序部分的类型不明确和/或矛盾,编译器/解释器无法处理,则此过程可能会失败。
我们可以使用稍微更通用的术语“类型分配”来包括通过推理和显式注释分配的两种类型。
类型检查确认程序的各部分在类型方面是否正确组合在一起。这可能会在给定片段的所有类型分配完成后发生。例如,如果给定函数分配了给定类型,则在许多语言中,在语法上仍然可以使用类型不正确的值来调用它。
请注意,可以编写一个将类型推断和类型检查混合在一起的实现,但没有必要这样做。例如,给定一个具有函数
foo
的程序,调用函数 bar
、foo
和 bar,可以在继续程序的其余部分之前分配其类型并检查调用点类型。