我喜欢所有的编译时间,我喜欢这样的想法:一旦您编译了程序,就可以保证程序的执行。一般来说,静态类型系统(Haskell,C ++等)似乎比任何动态类型系统都提供了更强大的编译时保证。
据我了解,Ada在编译时间检查方面走得更远,并且能够在执行之前检测到更大范围的错误。考虑到在某个时间点,它被选用于脆弱的领域(编程错误可能会导致人员伤亡),因此它也被认为是相当安全的。
现在,我想知道:如果更强大的静态保证导致代码更完整,更安全,那么我们为什么不朝这个方向进行更多研究呢?
一种似乎缺少的东西的例子是一种语言,它不是定义int
具有由基础体系结构的位数确定的范围的通用类型,而是可以具有范围(在下面的示例中Int [a..b]
描述了一个介于包括a和b):
a : Int [1..24]
b : Int [1..12]
a + b : Int [2..36]
a - b : Int [-11..23]
b - a : Int [-23..11]
或(从Ada那里获得):
a : Int [mod 24]
b : Int [mod 24]
a + b : Int [mod 24]
该语言将为范围选择最佳的基础类型,并对表达式进行编译时检查。因此,例如,给出:
a : Int [-3..24]
b : Int [3..10]
然后:
a / b
永远不会被定义。
这只是一个例子,但我觉得我们在编译时还有很多可以执行的事情。那么,为什么对此的研究很少?描述这个想法的技术术语是什么(以便我可以找到有关此主题的更多信息)?有什么限制?
dependent type
或refinement type
。