Answers:
线性有界自动机不可能检查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子句集合的最小不固定点的方式。通常,一阶霍恩理论的可满足性是不确定的,因此,如果您想抓住类型理论家所做的一切,那么无论您选择哪种语法形式主义,都将比真正方便的要强。
我知道在使用属性语法实现类型系统方面已有一些工作。他们声称这种选择有一些软件工程上的好处:即,属性语法非常严格地控制信息流,并且我被告知这使程序理解变得更加容易。