Alan Perlis对于编写无错误程序的方式意味着什么?[关闭]


29

Alan J. Perlis引用了一句话:

有两种编写无错误程序的方法;只有第三个有效。

我最近从朋友那里听到了这句话,却无法理解其背后的深层含义。

玻璃市在这里在说什么?


1
您也确实意识到了这个模仿中的谬误,因为有可能编写无错误的非平凡程序,这只是需要纪律。

1
现在正在我们的元讨论站点讨论这种类型的问题。

1
推荐阅读:讨论此$ {blog}
2014年

Answers:



60

没有第三种方式。

没有编写无错误程序的方法



14

正如许多其他答案已经指出的那样,无法编写无错误程序

但是我想指出的是报价的潜在元性质。本质上这是一个超出范围的错误。在第一句话中,他定义了只有两个可能性或元素的Universe或“列表”。然而,在第二句话中,他提到了第三句话。哪个荒谬!甚至非法!给定两个元素边界的第三个元素本身就是一个错误。

真正深刻的是,引用能够证明其所指的本质。


有一种方法可以证明程序按照指定的方式运行。例如用于核设施...

1
@ThorbjørnRavn Andersen,并不表示没有错误。
CaffGeek 2011年

5

这意味着所有不平凡的程序都会有错误。这只是说没有编写无错误程序的一种有趣的方式。


5

有可能编写无错误的程序,甚至是非平凡的程序,甚至证明它们是正确的。例如,考虑完成Coq,Epigram或Agda之类的语言。

停机问题指出,这是不可能的,为做到这一点的一般程序


再回到UT奥斯汀分校的唐·古德(Don Good)的团队,以及他们在1970年代和1980年代初在吉普赛验证环境中的工作。他们通过向海军提供经过验证的无错误消息流调制器,证明了无错误代码是可能的。验收测试套件是由完全不同的团队开发的。当MFM第一次在验收测试中看到验收测试套件时,它通过了,没有任何偏差,弃权或“是的”。
John R. Strohm

3

这让我想起了我看到的一件书呆子衬衫:世界上有10种人。那些懂二进制的人和那些不懂二进制的人。

有时列表被索引为0也可能是一个玩法。$ var = array('First','Second','Third'); 您可以这样访问此列表:$ var [0] ='First'$ var [1] ='Second'$ var [2] ='Third'

因此,文字数组索引2指向“第三”索引。


...以及那些从零开始索引的用户

2

换句话说,已经对此进行了解释,但是没有我想的那么清楚。这仅表示您将尝试两种方式,它们将都有错误,最后您将修复您的错误并拥有一个无错误的程序。与其他报价进行比较:

程序中发生错误的唯一方法是由作者放置在程序中。没有其他机制是已知的。程序无法与其他有问题的程序坐在一起来获取错误。-哈伦·米尔斯

(或者,您可以像Pierre所说的那样读(我认为是延伸)。(第三种方法,在领域中不存在,是可行的。)就像我说的那样,这是一个延伸,但是是正确的。


1

我父亲找借口时,这句话跟我父亲说的一样。俗话说得像:“一个故事有3个方面。它们的方面,您的方面,以及正确/正确/正确的方面”。

将其与开发相关联(并成为教授,作为软件测试人员),我想说,因为编码的东西太多了,所以“ 3个方面的编码是有意义的。您的代码,他们的代码和重构代码。”

我认为这是因为程序员/开发人员倾向于在产品变得稳定之后进行重构,而这通常为时已晚,但是大多数情况下,进行重构是为了改善您和伙伴最初做得不好的事情。

希望这可以帮助。


1

从技术上讲,我认为您可以编写没有错误的非平凡程序,但是由于停止问题,不可能证明它没有错误。因此,必须在所有程序都有错误的假设下工作,因为不可能证明否则。

http://en.wikipedia.org/wiki/Halting_problem

更新:您可以证明特定的算法将返回正确的答案,但这与证明它完全正确是不同的。 http://en.wikipedia.org/wiki/Correctness_(computer_science

但是,我的意思是,引用是指这样一个事实,即必须假定程序始终存在错误,并试图解释为什么会这样。 http://en.wikipedia.org/wiki/Software_bug#Bug_management


1
正如托尼·莫里斯(Tony Morris)所说,有可能证明某个特定程序是正确的。不可能编写一个程序,该程序通常可以证明任何正确的程序都是正确的。
Max Strini 2010年

-1

作为另外的见解,“两种方式”可能是Tony Hoare对此引用的引用:

构建软件设计的方法有两种:一种方法是使它变得如此简单,以至于显然没有缺陷,另一种方法是使它变得如此复杂以至于没有明显的缺陷。第一种方法要困难得多。它需要与发现自然复杂现象基础的简单物理定律相同的技能,奉献精神,洞察力甚至灵感。

稍微思考一下,您会发现他在说同样的话:如果您的软件不是很简单的,它就会有bug(但要使其足够复杂,它们就不会是明显的 bug)。


这不能回答所问的问题
gna

@gnat我不知道怎么做-它在第二段中。也许措词不清楚,但是当我说“说同一件事”时,我的意思是“说与艾伦·佩利斯相同的事情”。也就是说,Perlis的报价可能是Hoare的幽默模仿。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.