除了最琐碎的程序外,其他所有内容都充满了错误,因此有望删除它们的任何东西都是极具吸引力的。目前,正确性证明是代码非常深奥的,这主要是因为很难学习这件事以及证明程序正确所需的额外精力。您认为证明的代码会起飞吗?

有帮助吗?

解决方案

从这个意义上说,并不是真正的,但是纯粹的功能编程在这个领域中是好的。如果您使用Haskell,则如果代码编译,则您的程序可能是正确的。除了IO外,一个好的类型系统是一个很好的帮助。

同样,合同的编程也可能会有所帮助。看 微软代码合同

其他提示

除了最琐碎的程序之外

不能完全证明以合理的努力正确正确。对于任何正式的正确性证明,您至少需要正式规格,并且该规范必须是完整和正确的。通常,对于大多数实际程序,您都无法轻松地创建。例如,尝试为此讨论网站的用户界面撰写这样的规格,您知道我的意思。

在这里,我找到了有关该主题的一篇不错的文章:

http://www.encyclopedia.com/doc/1o11-programcorgragrectnessproof.html

正式证明的问题在于,它只会将问题移回了一步。

说一个程序是正确的等同于说一个程序可以做应该做的事情。您如何定义该程序应该做什么?您指定它。以及如何定义程序在规格不涵盖的边缘情况下应该做什么?好吧,那么您必须使规格更详细。

因此,假设您的规格最终变得足够详细,以描述整个程序各个方面的正确行为。现在,您需要一种使您的证明工具理解的方法。因此,您必须将规格转化为某种形式的正式语言,证明工具可以理解...嘿,等一下!

正式验证已经走了很长一段路,但通常行业/广泛使用的工具落后于最新研究。这是最近在这个方向上的一些努力:

规格# http://research.microsoft.com/en-us/projects/specsharp/这是C#的扩展,该扩展支持代码合同(预/后条件和不变性),可以使用这些合同来进行各种类型的静态分析。

与其他语言相似的项目,例如JAVA的JML,Eiffel具有此内置。

进一步走,像 大满贯爆破 可以用最少的程序员注释/干预来验证某些行为属性,但仍无法处理现代语言的全部通用性(整数溢出/指针算术之类的内容均未建模)。

我相信,将来我们会看到更多这些技术。主要的障碍是,如果没有手动注释,程序不变性很难推断出来,程序员通常不愿意提供这些注释,因为这样做太乏味/耗时。

除非出现大量开发人员工作的情况下自动证明代码的方法,否则不会。

一些 正式方法 工具(例如 frama-c 对于关键的嵌入式C软件)可以看作是(某种)提供给定软件的(正确)证明(正确)。 (Frama-C检查程序是否从某种意义上说出了其正式规格,并尊重该程序中明确注释的不变性)。

在某些部门中,这种形式方法是可能的,例如 DO-178C 用于民用飞机的关键软件。因此,在某些情况下,这种方法是可能的和有用的。

当然,开发较少的货物软件非常昂贵。但是,正式的方法对于某种软件是有意义的。如果您是悲观的,您可能会认为该错误已从代码转移到其正式规范(可能具有一些“错误”,因为将软件的预期行为形式化很困难且容易发生)。

我偶然发现了这个问题,我认为这个链接可能很有趣:

阿斯特雷的工业应用

在2003年,空中客车公司使用的系统中使用的系统中缺少RTE,似乎并不是不好的,我想知道有人会说这不是现实世界。

否。对此的共同谚语是:“从理论,理论和实践中是相同的。在实践中,不是。”

一个非常简单的示例:错别字。

实际通过单元测试运行代码几乎立即找到了这些内容,并且一组凝聚力的测试将消除对任何正式证明的需求。所有用例 - 好,坏,错误和边缘案例 - 都应在单元测试中列举,最终可以更好地证明代码是正确的,而不是任何与代码分开的证明。

尤其是如果要求更改或更新算法以修复错误 - 正式的证据更有可能最终过期,与代码评论经常获得的相同。

我认为,由于 停止问题 可能是正确性证明成为主流的最大障碍。

它已经被每个人都使用。每次使用编程语言的类型检查时,您都基本上做了程序正确性的数学证明。这已经做得很好 - 它只需要您为使用的每个功能和数据结构选择正确的类型即可。类型越准确,您将获得越好的检查。编程语言中可用的现有类型已经具有足够强大的工具来描述几乎所有可能的行为。这在每种可用的语言中都起作用。 C ++和静态语言只是在编译时进行检查,而在运行程序时,像Python这样的动态语言正在这样做。所有这些语言仍然存在检查。 (例如,C ++已经支持Haskell相同的方式检查副作用,但是您只需要选择使用它即可。)

许可以下: CC-BY-SA归因
scroll top