图灵完备性只说一件事:计算模型是图灵完备,如果可以用图灵机建模的任何计算也可以用该模型建模。
那么,图灵机可以模拟哪些计算?嗯,首先,艾伦·图灵和他的所有同事只对自然数函数感兴趣。因此,图灵机(以及λ演算,SK组合器演算,μ递归函数等)仅谈论自然数上函数的可计算性。如果您不是在谈论自然数的函数,那么图灵完备性的概念甚至没有意义,根本就不适用。
但是请注意,我们可以将许多有趣的事物编码为自然数。我们可以将字符串编码为自然数,可以将图形编码为自然数,可以将布尔值编码为自然数。我们可以将图灵机编码为自然数,这使我们能够创建谈论图灵机的图灵机!
而且,当然,并非自然数上的所有函数都是可计算的。图灵机只能对自然数计算某些函数,λ演算只能对自然数计算某些函数,SK组合器演算只能对自然数计算某些函数,…。令人惊讶地(或并非如此),事实证明,每个计算模型(实际上可以在我们的物理宇宙中实现)都可以在自然数上计算相同的函数(至少对于迄今为止我们找到的所有模型)。[注:显然,存在较弱的计算模型,但我们尚未找到一个更强大的模型,但其中一些显然与我们的物理宇宙不兼容,例如使用实数或时间旅行的模型。]
事实证明,经过很长时间的搜索,我们发现每一次它们都可以计算出完全相同的函数,这是Church-Turing-Thesis的基础。计算模型同样强大,并且所有模型都体现了“可计算”的“理想”概念。(CTT还有第二个更哲学的方面,即遵循算法的人也可以计算出TM可以计算出的功能完全相同,而仅此而已。)
但是,这些都没有说明
- 各种模型的效率如何
- 他们使用起来有多方便
- 什么别的,他们能做的,除了在自然数计算功能
而这恰恰是计算(和编程语言)的不同型号之间的差异开始发挥作用。
作为不同性能的示例,随机存取机和图灵机都可以复制阵列。但是,一个RAM需要操作来做到这一点,而TM需要的操作,因为它需要跨跳过用于复制每个元素的数组的元素,还有要复制的元素。Ô (小号我Ž ë 2 一- [R [R 一Ý)小号我Ž Ë 一个ř ř 一个ý小号我Ž Ë 一个ř ř 一个ÿO(sizearray)O(size2array)sizearraysizearray
作为提供不同便利的示例,您可以仅比较用高级语言编写的代码,用汇编编写的代码以及用于解决同一问题的TM的描述。
而且您的电灯开关就是第三种差异的一个例子,某些模型可以完成的事情与自然数无关,因此与图灵完备性无关。
要回答您的特定问题:
但是,可以任意写在一个图灵完备的语言程序重新编写的另一个?
否。仅当程序对自然数计算图灵可计算函数时。即使那样,它可能仍需要复杂的编码。例如,λ演算甚至没有自然数,它们需要使用函数进行编码(因为函数是λ演算唯一的东西)。
输入和输出的这种编码可能非常复杂,就像表达算法一样。因此,尽管可以重写任何程序都是正确的,但是重写后的程序可能更复杂,更大,使用更多的内存并且运行更慢。
如果我的部件具有LIGHTBUTTON操作码怎么办?在没有灯泡的情况下,我实际上无法在系统(语言)上模拟该语言。
灯泡不是自然数上的图灵可计算函数。实际上,灯泡既不是函数也不是计算。打开和关闭灯泡是I / O的副作用。图灵机不对I / O副作用建模,图灵完成度与它们无关。
关于任意实数。
图灵完备只处理自然数上的可计算函数,而不涉及实数。
当涉及像您这样的问题时,图灵完整性根本不是很有趣,这有两个原因:
- 这不是一个很高的障碍。所有你需要的是
IF
,GOTO
,WHILE
,和一个整数变量(假设变量可以持有任意大的整数)。或者,递归。图灵完成了很多很多东西。纸牌游戏《魔术:聚会》完成。CSS3是图灵完备的。该sendmail
配置文件是图灵完备。英特尔x86 MMU已完成图灵化。英特尔x86 MOV
指令是图灵完成的。PowerPoint动画是图灵完整的。Excel(不带脚本,仅使用公式)是图灵完备的。BGP路由协议是Turing-complete。sed
是图灵完成的。Apache mod_rewrite
规则是图灵完备的。Google“ (偶然或令人惊讶地)完成了巡回演出”以查找其他一些有趣的示例。如果几乎所有内容都是图灵完备的,那么图灵完备就不再是一个有趣的属性。
- 实际上没有必要有用。很多有用的东西并不完整。3版本之前CSS不是图灵完备的(而事实上,CSS3 是不实际使用人)。1999年之前的SQL还不是图灵完整的,但是,即使在那时,它还是非常有用的。没有其他库的C编程语言似乎不是图灵完备的。从定义上讲,依存类型的语言或多或少不是图灵完备的,但是,您可以在其中编写操作系统,Web服务器和游戏。
Idris的作者Edwin Brady使用“俄罗斯方块完全”一词来谈论这些方面。对Tetris-complete的定义不严格(除了显而易见的“可以用来实现Tetris”),但它包含诸如足够高水平和足够表现力的内容,使您可以编写游戏而不会发疯,能够与外界交互(输入和输出),能够表达副作用,能够编写事件循环,能够表达响应式,异步和并发编程,能够与操作系统交互,能够与外部库进行交互(换句话说:能够调用并被C代码调用)等等。与图灵完备性相比,这些是通用编程语言更有趣的功能。
您可能会发现我对您链接的问题的回答很有趣,即使回答了不同的问题,它也涉及到一些相同的观点。