8.6 发生上述情况的原因
在这一章里,我们已经看到所有通用系统都足够强大,可以引用自身。程序对数字进行运算,数字可以表示字符串,而一个程序的指令只用字符串写下来的,因此程序完全能够对它们自己的源代码进行运算。
自引用能力使得写出能准确预测程序行为的程序成为不可能的事情。一旦一个特别的行为检查程序写完了,我们总是能构建一个更大的程序打败它:新程序把这个检测器当作一个子例程,检查它自身的源代码,然后立即做与检测器要做的相反的事情。这些自我矛盾的程序比我们实际写出来的一些东西更奇特,但它们只是一个征兆,而不是潜在问题的根因:通常,程序行为过于强大而无法准确预测。
人类语言有类似的能力和问题。“这个句子是一个谎言”(说谎者悖论)是一句话,它不可能是 true 也不可能是 false 的;就像我们在 8.1.5 节中看到的,任何计算机程序都可以在不需要任何特别语言特性的情况下引用自身。
一言以蔽之,程序行为这么难预测有两个原因。
1.任何拥有足够能力引用自身的系统,都无法正确回答每一个关于自身的问题 20。我们总是可以构建一个像 do_the_opposite.rb 的程序,系统无法预测它的行为。为了避免这个问题,我们需要跳出自引用系统使用一个不同的更强大的系统回答关于它的问题。
20这大致就是哥德尔第一不完备定理([http://en.wikipedia.org/wiki/G%C3%B6del%27sincompleteness_theorems](http://en.wikipedia.org/wiki/G%C3%B6del%27s_incompleteness theorems) 内容。
2.但是对于通用编程语言,不存在更强大的系统供我们升级。邱奇-图灵论题表明我们发明的对程序行为进行预测的任何可用算法,都能由一个程序执行,因此我们无法超越通用系统的能力。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论