上下文敏感语法和类型


Answers:


20

线性有界自动机不可能检查C ++程序,并且LBA不可能检查SML程序的类型是否正确。C ++具有图灵完备的类型系统,因为您可以将任意程序编码为模板元程序。

SML更有趣。它确实具有可判定的类型检查,但是问题是EXPTIME完整的。因此,除非复杂性层次结构出现非常令人惊讶的崩溃,否则LBA不可能对其进行检查。这样做的原因是SML需要类型推断,并且有些程序族的类型增长比程序的大小快得多。例如,考虑以下程序:

fun delta x = (x, x)        (* this has type 'a -> ('a * 'a), so its return value
                               has a type double the size of its argument *)

fun f1 x = delta (delta x)  (* Now we use functions to iterate this process *)
fun f2 x = f1 (f1 x)        
fun f3 x = f2 (f2 x)        (* This function has a HUGE type *)

对于诸如C或Pascal的较简单类型的系统,我相信LBA可以检查它。

在编程语言研究的早期,人们有时使用van Wingaarden语法(又名二级语法)来指定用于编程语言的类型系统。我相信Algol 68是以此方式指定的。但是,我被告知该技术被放弃的原因实际上是实用的:事实证明,人们很难写出说明他们认为自己要指定的语法!(通常,人们编写的语法生成的语言超出了他们的预期。)

如今,人们使用逻辑示意图推理规则来指定类型系统,这实际上是一种将谓词指定为Horn子句集合的最小不固定点的方式。通常,一阶霍恩理论的可满足性是不确定的,因此,如果您想抓住类型理论家所做的一切,那么无论您选择哪种语法形式主义,都将比真正方便的要强。

我知道在使用属性语法实现类型系统方面已有一些工作。他们声称这种选择有一些软件工程上的好处:即,属性语法非常严格地控制信息流,并且我被告知这使程序理解变得更加容易。


4

据我所知,对于一些有趣的情况,类型正确性往往是不确定的,因此,显然形式语法无法捕获您能想到的每个类型系统。

我知道主要的编译器生成器允许为防止如果谓语不执行规则的规则任意谓词评估为true,例如 { type(e1) == type(e2) } (expression e1) '+' (expression e2)。这个概念很容易形式化。对允许谓词的适当限制可以使LBA做出可判定性。

ķķ+1个

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.