我一直把它更多地看做是一个方便的问题,而不是一个算法是否可以表达。如果我真的想运行像Mitchell的人为设计的程序,我只是用我的静态类型化语言编写适当的Turing Machine模拟器。
静态类型系统的诀窍是仅在灵活性允许您编写更易于维护的代码的情况下提供正确的灵活性。
这里有一些程序结构技术的示例,有时认为它们比静态类型的语言更易于动态管理。
泛型和容器
在ML(c。1973)和CLU(c。1974)之前的静态类型语言中,创建字符串的红黑树,整数的红黑树,浮点数的红黑树或特定类型元素的红黑树Foo
。但是,很难(可能是不可能)创建红黑树的单个实现,该实现既可以进行静态检查,又可以处理这些数据类型中的任何一种。解决问题的方法是(1)完全脱离类型系统(例如:通过使用void *
在C)中,(2)为自己编写某种宏预处理程序,然后编写宏以生成所需的每种特定类型的代码,或者(3)使用Lisp / Smalltalk(和Java)方法检查提取的类型动态对象。
ML和CLU分别引入了推断的和显式声明的(静态)参数化类型的概念,使您可以编写通用的,静态类型的容器类型。
亚型多态性
在Simula67(c。1967)和Hope(c。1977)之前的静态类型语言中,既无法进行动态分配又无法静态检查是否已涵盖所有子类型的情况。许多语言都有某种形式的标记联合,但是程序员有责任确保它们的case
或switch
语句或跳转表覆盖所有可能的标记。
Simula模型之后的语言(C ++,Java,C#,Eiffel)提供带有子类的抽象类,编译器可以在其中检查每个子类是否已实现父类声明的所有方法。遵循Hope模型的语言(从SML / NJ到Haskell的所有ML变体)都具有代数子类型,编译器可以在其中检查每个typecase
语句是否覆盖了所有子类型。
猴子补丁和面向方面的编程
动态类型系统使各种原型技术变得更加容易。在用哈希映射表从字符串到函数表示类型的语言(例如Python,Javascript,Ruby)中,只需动态地修改表示哈希表的哈希映射表即可轻松地全局更改依赖特定类型的每个模块的行为。类型。
尽管有很明显的方法可以使用猴子补丁来使程序难以维护,但也有一些方法可以将其实际用于“好”而不是“邪恶”。尤其是面向方面的编程,人们可以使用类似猴子修补的技术来完成诸如修改文件类型以指向虚拟化文件系统,允许“免费”构建单元测试基础结构或修改简单异常类型等工作。每次捕获日志消息时都会打印出来,以获得更好的可调试性。
与“泛型和子类型多态”在1970年代提出了关键的静态检查思想不同,面向方面编程的静态检查是(我认为)活跃的研究领域。我对它了解不多,除了自2001年以来就有一种叫做AspectJ的语言。