类型检查算法


19

我正在开始有关类型检查算法的个人书目研究,并需要一些技巧。最常用的类型检查算法,策略和通用技术是什么?

我对以众所周知的强静态类型化语言(例如C ++,Java 5 +,Scala或其他语言)实现的复杂类型检查算法特别感兴趣。IE,由于基础语言的键入非常简单(例如Java 1.4及更低版本),因此类型检查算法不是很简单。

我本身对特定的语言X,Y或Z并不感兴趣。我对类型检查算法感兴趣,无论它们针对的是哪种语言。如果您提供诸如“您从未听说过的语言L是强类型且类型复杂的答案”,则可以使用类型检查算法,该算法通过使用算法Z检查X和Y来进行A,B和C运算,或者“用于Scala的策略X和Y以及用于C#的A的变体Z都很酷,因为R,S和T功能以这种方式起作用”,那么答案就很好。


3
也许您应该编辑此问题,以询问有关一种特定语言的类型检查。SE上通常不建议使用开放式的列表式问题(尽管此特定站点尚无相关政策)。另外:<type-system-elitist> Java的类型系统并不复杂</ type-system-elitist>。
sepp2k 2012年

3
也许可以将问题改写为更具体,但我不认为应该解决这个问题。
戴夫·克拉克2012年

1
@ sepp2k:我知道它有点宽泛,但是这样结束了,因为我不想限制答案的用处。顺便说一句,我不明白您想对“ <type-system-elitist> Java的类型系统并不复杂</ type-system-elitist>”说什么。Java的1.4及以下类型的系统实际上很简单,但是Java 5中的泛型使它变得更加复杂。
维克多·斯塔夫萨

2
询问一种特定的语言会使这个问题更不适用于此网站,恕我直言。这个问题也许应该问通用技术。
拉斐尔

1
@Victor基本的工具是属性语法。您可能无法使用它们做所有您可以想象的邪恶的事情,但是它们是一个很好的起点。
拉斐尔

Answers:


13

实际上,大多数研究并未针对完整的编程语言发布类型检查算法。您会发现用于完整编程语言的类型系统的很大一部分形式化,例如Drossopoulou和Eisenbach对Java 的工作Nipkov等人在C ++上的工作。但是,在更多情况下,您只会找到该语言的某些核心部分(例如Featherweight Java)或该语言的核心概念(例如scala本地类型推断方法)的类型系统

在会议如popl等和ICFP你会发现特定类型的类型系统的许多类型检查算法,并作为新的方法,例如双向三面类型检查。

更一般而言,您可能需要了解Damas-Milner算法,局部类型推断,双向和双向类型检查,并从那里进行扩展,方法是遵循论文中的参考文献,并使用谷歌学者寻找哪些论文引用了这些论文并以此为基础描述的方法。另外,如上所建议,诸如POPL,ICPF,ESOP甚至ECOOP和OOPSLA之类的会议都会有与您的任务相关的论文。


Scala的类型系统Afaik已在研究项目中开发,因此已出版。编译器也是开源的。不过也没有调查。
拉斐尔

无需我推断;我知道有关于Scala的类型系统的已发表论文。通过搜索可以轻松地检查此声明。此外,我将编译器的源代码视为该算法上的足够公开信息(前提是该代码已包含在源代码中;我认为是这样,但未进行检查)。我最初的说法是模棱两可的,是正确的,但您的反应似乎毫无根据。
拉斐尔

2

基本工具是“ 属性文法”。您可能无法使用它们做所有您可以想象的邪恶的事情,但是它们是一个很好的起点。

本质上,您可以自上而下和/或自下而上浏览程序的抽象语法树,并传递信息。因此,例如,您可以向下传递全局范围类型信息(例如,类及其成员),然后递归确定表达式的类型,即自下而上,将结果类型向上传递。

此处的幻灯片中找到一些解释和示例(第5章)。


有人有更好的参考吗?我想我现在需要购买《龙书》或威廉/莫勒之一...
拉斐尔

1
JastAdd工具是基于参考属性语法的出色,现代的编译器编译器系统。我们已经在许多项目中使用了它。
戴夫·克拉克2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.