Types 契约可以定义一个类型系统的所有不变量吗?
我从来没有真正用契约式设计语言编程过,我当然不希望这篇文章成为一场关于动态与静态类型系统的战争 读了一段时间后,我的问题是标题中的一个:一个类型系统可以“捕获”的所有东西,也可以根据合同进行设计吗? 在一些网站上,我读到了诸如“合同是类固醇类型”之类的东西,以及类似的声明。但它真的是一个真正的超集吗 或者换言之,一个有契约的动态语言能比一个没有契约的静态类型语言具有相同且更多的验证(同样,在运行时)吗Types 契约可以定义一个类型系统的所有不变量吗?,types,Types,我从来没有真正用契约式设计语言编程过,我当然不希望这篇文章成为一场关于动态与静态类型系统的战争 读了一段时间后,我的问题是标题中的一个:一个类型系统可以“捕获”的所有东西,也可以根据合同进行设计吗? 在一些网站上,我读到了诸如“合同是类固醇类型”之类的东西,以及类似的声明。但它真的是一个真正的超集吗 或者换言之,一个有契约的动态语言能比一个没有契约的静态类型语言具有相同且更多的验证(同样,在运行时)吗 谢谢 我不是合同专家,但我认为这基本上是正确的。通常,契约允许您编写强制执行任意复杂行为的动态
谢谢 我不是合同专家,但我认为这基本上是正确的。通常,契约允许您编写强制执行任意复杂行为的动态检查。合同最酷的一点是,您可以使用它们:
- 指定系统无法捕获的类型行为。(用于类型系统的常规定义。)
- 在运行时将它们包含在程序中,以获得出错情况的详细报告
- 分配、跟踪和传播责任,以了解哪里出了问题,哪里出了问题
编辑:我想我也应该说得更清楚,你的程序肯定有本地属性,你不能通过合同在全球范围内跟踪,所以安德烈斯的回答在这方面对我来说似乎更正确,抱歉 否。只能动态检查局部属性,而需要某种全局知识的属性则不能。请考虑一些属性,例如某些属性是唯一的、某些属性没有别名、计算没有争用条件或死锁。合适的静态类型系统可以验证这些属性,因为它能够在正在检查的表达式的上下文中建立某些不变量。感谢您详细的回答。我只是想确定一下。事实上,从我的noobie观点来看,在合同上完成的工作似乎很有希望,尽管有一个折衷,因为更先进的系统也意味着更多的工作投入到这项任务上,而不是问题本身(但不管怎样,这在任何地方都会发生:正确性与时间)。不过,我喜欢的一件事是,契约通常可以“添加”到语言中(例如,动态契约),从而将决策权留给程序员,而不是语言中的隐式特征(我想到的是Python或Clojure+契约)。是否有静态类型的语言也使用契约?如果答案是肯定的,那不是有一点开销吗?静态地检查契约是不可能的,原因与任何程序分析在计算上都是不可能的一样:你必须解决停止问题才能这样做。因此,不,通常你写一个依赖类型,证明你的程序有那个类型,并提取一段被证明是正确的代码,但这不是自动化的,你必须手工写一个证明。我想我表达得不太好。我的意思是,如果有任何静态类型的语言也允许在运行时进行合同验证。我想你以为我在问他们是否能在编译时被证明。还是我错过了什么?我认为在编译时使用静态类型检查器,在运行时使用契约将是一个巨大的安全繁荣,代价是在设计/编程时花费更多的时间。谢谢所以如果我没有误解你。。。拥有契约有助于在本地(以及在运行时)检测出哪里出了问题,静态类型检查可以告诉我们有关全局错误和其他无法动态证明的错误的更多信息。是这样吗?如果是这样的话,我现在明白这两个概念的区别了。非常感谢。嗯,是的,对于“局部错误”的正确定义。当然,您可以将一些使用指针的代码视为“本地”错误,并假设它没有别名,而实际上可能是。但只有当你有更多的全球知识时,你才能将其视为错误。