静态类型检查过于保守的无人为例是什么?


9

程序设计语言的概念,约翰米切尔写道,静态类型检查是必要的保守(过于严格的),因为停机问题。他举了一个例子:

if (complicated-expression-that-could-run-forever)
   then (expression-with-type-error)
   else (expression-with-type-error)

有人可以提供一个确实会引起实际关注的非故意答案吗?

我了解到Java允许针对以下情况进行动态检查的类型转换:

if (foo instanceof Person) {
    Person p = (Person) foo;
    :
}

但我认为这是Java语言/编译器缺陷的必要,而不是跨语言问题。


2
您提供的Java示例一个非人为的静态类型检查示例,它过于保守。换句话说,答案取决于您所考虑的类型系统。对于我们提出的任何示例,总会有一个可以处理该示例的类型系统(该类型系统在该示例上不太保守)。对于任何类型的系统,我们总能找到一个过于保守的例子。因此,我认为您需要指定类型系统。如果您不打算使用Java类型系统,那么您在想些更具体的东西吗?ML样式类型推断?
DW

可能有人争辩说,该示例是静态代码分析之一,它是“保守的”,而不是nec类型检查。定义“保守”将很有帮助。可以说,与动态系统相比,所有静态类型系统都将是“保守的”,因为根据定义,前者在编译时会更加严格。但是,有人可能会认为运行时两者都不是更严格,因为动态检查还会返回类似的(基于类型的)错误。顺便说一句,在语言中运行时动态检查的强制转换并不是一个缺陷,在大多数静态检查的语言中,可能是可证明的必要。
vzn 2015年

Answers:


7

我一直把它更多地看做是一个方便的问题,而不是一个算法是否可以表达。如果我真的想运行像Mitchell的人为设计的程序,我只是用我的静态类型化语言编写适当的Turing Machine模拟器。

静态类型系统的诀窍是仅在灵活性允许您编写更易于维护的代码的情况下提供正确的灵活性。

这里有一些程序结构技术的示例,有时认为它们比静态类型的语言更易于动态管理。

泛型和容器

MLc。1973)和CLUc。1974)之前的静态类型语言中,创建字符串的红黑树,整数的红黑树,浮点数的红黑树或特定类型元素的红黑树Foo。但是,很难(可能是不可能)创建红黑树的单个实现,该实现既可以进行静态检查,又可以处理这些数据类型中的任何一种。解决问题的方法是(1)完全脱离类型系统(例如:通过使用void * 在C)中,(2)为自己编写某种宏预处理程序,然后编写宏以生成所需的每种特定类型的代码,或者(3)使用Lisp / Smalltalk(和Java)方法检查提取的类型动态对象。

ML和CLU分别引入了推断的和显式声明的(静态)参数化类型的概念,使您可以编写通用的,静态类型的容器类型。

亚型多态性

Simula67c。1967)和Hopec。1977)之前的静态类型语言中,既无法进行动态分配又无法静态检查是否已涵盖所有子类型的情况。许多语言都有某种形式的标记联合,但是程序员有责任确保它们的caseswitch语句或跳转表覆盖所有可能的标记。

Simula模型之后的语言(C ++,Java,C#,Eiffel)提供带有子类的抽象类,编译器可以在其中检查每个子类是否已实现父类声明的所有方法。遵循Hope模型的语言(从SML / NJ到Haskell的所有ML变体)都具有代数子类型,编译器可以在其中检查每个typecase语句是否覆盖了所有子类型。

猴子补丁和面向方面的编程

动态类型系统使各种原型技术变得更加容易。在用哈希映射表从字符串到函数表示类型的语言(例如Python,Javascript,Ruby)中,只需动态地修改表示哈希表的哈希映射表即可轻松地全局更改依赖特定类型的每个模块的行为。类型。

尽管有很明显的方法可以使用猴子补丁来使程序难以维护,但也有一些方法可以将其实际用于“好”而不是“邪恶”。尤其是面向方面的编程,人们可以使用类似猴子修补的技术来完成诸如修改文件类型以指向虚拟化文件系统,允许“免费”构建单元测试基础结构或修改简单异常类型等工作。每次捕获日志消息时都会打印出来,以获得更好的可调试性。

与“泛型和子类型多态”在1970年代提出了关键的静态检查思想不同,面向方面编程的静态检查是(我认为)活跃的研究领域。我对它了解不多,除了自2001年以来就有一种叫做AspectJ的语言。

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.