Types 契约可以定义一个类型系统的所有不变量吗?

Types 契约可以定义一个类型系统的所有不变量吗?,types,Types,我从来没有真正用契约式设计语言编程过,我当然不希望这篇文章成为一场关于动态与静态类型系统的战争 读了一段时间后,我的问题是标题中的一个:一个类型系统可以“捕获”的所有东西,也可以根据合同进行设计吗? 在一些网站上,我读到了诸如“合同是类固醇类型”之类的东西,以及类似的声明。但它真的是一个真正的超集吗 或者换言之,一个有契约的动态语言能比一个没有契约的静态类型语言具有相同且更多的验证(同样,在运行时)吗 谢谢 我不是合同专家,但我认为这基本上是正确的。通常,契约允许您编写强制执行任意复杂行为的动态

我从来没有真正用契约式设计语言编程过,我当然不希望这篇文章成为一场关于动态与静态类型系统的战争

读了一段时间后,我的问题是标题中的一个:一个类型系统可以“捕获”的所有东西,也可以根据合同进行设计吗? 在一些网站上,我读到了诸如“合同是类固醇类型”之类的东西,以及类似的声明。但它真的是一个真正的超集吗

或者换言之,一个有契约的动态语言能比一个没有契约的静态类型语言具有相同且更多的验证(同样,在运行时)吗


谢谢

我不是合同专家,但我认为这基本上是正确的。通常,契约允许您编写强制执行任意复杂行为的动态检查。合同最酷的一点是,您可以使用它们:

  • 指定系统无法捕获的类型行为。(用于类型系统的常规定义。)
  • 在运行时将它们包含在程序中,以获得出错情况的详细报告
  • 分配、跟踪和传播责任,以了解哪里出了问题,哪里出了问题
是的,一个契约可以像一个类型系统一样简单,从某种意义上说,“类型作为集合”(这在多态cse中并不正确,但在许多情况下,它近似于您所关心的一些行为)的常见观点可以被视为契约语言的结构约束。然而,契约系统允许您编写更多的修饰行为。虽然可以编写一个协定来表示排序函数的输入和排序后的输出之间的关系,但如果在类型中正确写入,则需要依赖类型。所以简单的答案是,是的,契约可以用来定义类型系统所能定义的一切,等等。(我不完全确定奇怪的子结构类型系统的边缘情况,但我认为这也可以通过污染事物的合同来实现。)

硬币的另一面是,类型系统为您提供静态保证,确保您的程序在某种程度上是正确的。然而,有了合同,你真的不能这么说。(当然,您可以将某些退化的合同案例视为使用标准类型系统、模型检查、SMT解算器等进行了部分验证,并且在这方面确实做了一些工作。)然而,合同真正强大的地方基本上是程序验证很难的想法,让我们扔掉一些静态保证,带着一些可能的bug生活,并获得关于出错原因的更好信息,以便我们能够快速修复它

顺便说一句,现在有更先进的契约系统,除了简单的结构约束之外,还有像高阶时态契约()之类的东西,以及其他使契约编程非常酷的扩展


编辑:我想我也应该说得更清楚,你的程序肯定有本地属性,你不能通过合同在全球范围内跟踪,所以安德烈斯的回答在这方面对我来说似乎更正确,抱歉

否。只能动态检查局部属性,而需要某种全局知识的属性则不能。请考虑一些属性,例如某些属性是唯一的、某些属性没有别名、计算没有争用条件或死锁。合适的静态类型系统可以验证这些属性,因为它能够在正在检查的表达式的上下文中建立某些不变量。

感谢您详细的回答。我只是想确定一下。事实上,从我的noobie观点来看,在合同上完成的工作似乎很有希望,尽管有一个折衷,因为更先进的系统也意味着更多的工作投入到这项任务上,而不是问题本身(但不管怎样,这在任何地方都会发生:正确性与时间)。不过,我喜欢的一件事是,契约通常可以“添加”到语言中(例如,动态契约),从而将决策权留给程序员,而不是语言中的隐式特征(我想到的是Python或Clojure+契约)。是否有静态类型的语言也使用契约?如果答案是肯定的,那不是有一点开销吗?静态地检查契约是不可能的,原因与任何程序分析在计算上都是不可能的一样:你必须解决停止问题才能这样做。因此,不,通常你写一个依赖类型,证明你的程序有那个类型,并提取一段被证明是正确的代码,但这不是自动化的,你必须手工写一个证明。我想我表达得不太好。我的意思是,如果有任何静态类型的语言也允许在运行时进行合同验证。我想你以为我在问他们是否能在编译时被证明。还是我错过了什么?我认为在编译时使用静态类型检查器,在运行时使用契约将是一个巨大的安全繁荣,代价是在设计/编程时花费更多的时间。谢谢所以如果我没有误解你。。。拥有契约有助于在本地(以及在运行时)检测出哪里出了问题,静态类型检查可以告诉我们有关全局错误和其他无法动态证明的错误的更多信息。是这样吗?如果是这样的话,我现在明白这两个概念的区别了。非常感谢。嗯,是的,对于“局部错误”的正确定义。当然,您可以将一些使用指针的代码视为“本地”错误,并假设它没有别名,而实际上可能是。但只有当你有更多的全球知识时,你才能将其视为错误。