关于理论:什么是图灵完成?

关于理论:什么是图灵完成?

What is Turing Complete?

"图灵完备"一词是什么意思?

你能在不涉及太多理论细节的情况下给出一个简单的解释吗?


下面是最简单的解释:

一个图灵完整系统是指一个系统,在这个系统中,可以编写一个程序来找到一个答案(尽管没有关于运行时或内存的保证)。

所以,如果有人说"我的新东西是图灵完备的",这意味着在原则上(虽然通常不在实践中),它可以用来解决任何计算问题。

有时候是个笑话…一个人在vi中写了一个图灵机器模拟器,所以可以说vi是世界上唯一需要的计算引擎。


下面是最简单的解释

阿兰·图灵发明了一种机器,它可以接受一个程序并运行该程序并显示一些结果。但后来他不得不为不同的程序创建不同的机器。所以他创建了"通用图灵机",可以接受任何程序并运行它。

编程语言类似于那些机器(尽管是虚拟的)。他们接受程序并运行它们。现在,一种编程语言被称为"图灵完成",如果它能运行图灵机器在给定的时间和内存下可以运行的任何程序(不管语言如何)。

例如:假设有一个程序取10个数字并将其相加。图灵机可以很容易地运行这个程序。但是现在想象一下,由于某种原因,你的编程语言不能做同样的添加,那么图灵机器就不完整了。另一方面,如果它能运行任何程序,比如通用图灵机可以运行,那么它就完成了图灵机。

大多数现代编程语言,如Java、JavaScript、Perl等都是图灵完成的,因为它们都实现了运行诸如加法、乘法、if条件、返回语句、存储/检索/擦除数据等方式的程序所需的所有特征。

更新:你可以在我的博客上了解更多:"javascript是图灵完成"?-?解释


维基百科:

Turing completeness, named after Alan
Turing, is significant in that every
plausible design for a computing
device so far advanced can be emulated
by a universal Turing machine — an
observation that has become known as
the Church-Turing thesis. Thus, a
machine that can act as a universal
Turing machine can, in principle,
perform any calculation that any other
programmable computer is capable of.
However, this has nothing to do with
the effort required to write a program
for the machine, the time it may take
for the machine to perform the
calculation, or any abilities the
machine may possess that are unrelated
to computation.

While truly Turing-complete machines
are very likely physically impossible,
as they require unlimited storage,
Turing completeness is often loosely
attributed to physical machines or
programming languages that would be
universal if they had unlimited
storage. All modern computers are
Turing-complete in this sense.

我不知道你怎么能比这更非技术性,除了说"图灵完备意味着‘在足够的时间和空间下能够回答可计算的问题’"。


非正式定义

图灵完备语言是一种可以执行任何计算的语言。丘奇图灵理论指出,任何可执行的计算都可以由图灵机器完成。图灵机是一种具有无限随机存取存储器和有限"程序"的机器,它规定了它应该何时读、写和移动该存储器,何时应该以某个结果终止,以及接下来应该做什么。图灵机的输入在启动前就被放入内存中。

使语言不完整的事物

一个图灵机可以根据它在内存中看到的内容来做出决定——只支持+-*/的"语言"在整数上不是图灵全的,因为它不能根据输入做出选择,但是图灵机可以。

一个图灵机可以永远运行——如果我们使用Java、JavaScript或Python,并且去除了执行任何类型的循环、GOTO或函数调用的能力,它就不会是图灵完成,因为它不能执行一个永远不会完成的任意计算。COQ是一个定理证明器,它不能表示不终止的程序,所以它不是图灵完备的。

图灵机可以使用无限内存——一种完全类似Java的语言,但是一旦使用超过4千兆字节的内存,它就不会终止,因为图灵机可以使用无限内存。这就是为什么我们不能真正构建一个图灵机,但是Java仍然是一个图灵完整的语言,因为Java语言没有限制它使用无限内存。这就是正则表达式不完整的原因之一。

图灵机具有随机存取存储器——一种只允许您通过pushpop操作对堆栈使用存储器的语言不会是图灵全的。如果我有一种"语言",它只读一次字符串,只能通过从堆栈中推和弹出来使用内存,它可以告诉我,字符串中的每个(以后是否都有自己的),当它看到(时推,当它看到)时弹出。但是,它不能告诉我,以后每个(是否都有自己的),以后每个[是否都有自己的](注意,([)]是否符合这一标准,但([]]不符合)。图灵机可以使用其随机存取存储器分别跟踪()[],但这种只有堆栈的语言不能。

图灵机可以模拟任何其他图灵机-图灵机在给定适当的"程序"时,可以接受另一个图灵机的"程序"并在任意输入上模拟它。如果您有一种被禁止实现Python解释器的语言,那么它就不会是图灵完备的。

图灵完备语言示例

如果您的语言具有无限的随机访问内存、条件执行和某种形式的重复执行,那么它可能是图灵完成的。有更多的外来系统仍然可以实现图灵机器所能实现的一切,这也使得它们图灵完成:

  • 非类型化lambda微积分
  • 康威的人生游戏
  • C++模板
  • Prolog语言

从根本上讲,图灵完整性是一个简洁的需求,无边界递归。

甚至没有内存限制。

我是独立思考这个问题的,但这里有一些关于这个断言的讨论。我对lsp的定义提供了更多的上下文。

这里的其他答案并没有直接定义图灵完整性的基本本质。


图灵完备意味着它至少和图灵机器一样强大。这意味着任何可以由图灵机计算的东西都可以由图灵机完整系统计算。

还没有人找到比图灵机更强大的系统。所以,暂时来说,说一个系统是图灵完备的,和说这个系统和任何已知的计算系统一样强大(见丘奇图灵论文)。


用最简单的术语来说,图灵完备系统可以解决任何可能的计算问题。

其中一个关键要求是草稿纸大小不受限制,并且可以在写入草稿纸之前倒带以访问。

因此,在实践中,没有一个系统是图灵完备的。

相反,一些系统通过对无边界内存进行建模并执行任何可能的计算来近似图灵完整性,这些计算可以适合系统内存。


我认为"图灵完备"概念的重要性在于能够识别一台计算机(不一定是一台机械/电气"计算机"),该计算机可以将其进程解构为"简单"指令,由简单和简单的指令组成,通用机器可以解释并执行这些指令。

我强烈推荐带注释的图灵

@我认为你所解释的是通用图灵机的描述和图灵全的混合。

从实际意义上讲,图灵完成的东西是一台机器/过程/计算,能够被编写并表示为一个程序,由一台通用机器(台式计算机)执行。尽管它不考虑时间或存储,如其他人所提到的。


我用简单的话理解的是:

图灵完成:一种能进行计算的编程语言/程序,就是图灵完成。

例如:

  • 你能用HTML加两个数字吗?(ans是"否",您必须使用javascript来执行添加),因此HTML不完整。

  • 诸如Java、C++、Python、JavaScript、EthUM的坚固性等语言都是图灵完成的,因为你可以通过使用这两种语言添加两个数字来进行计算。

  • 希望这有帮助。


    在大多数程序员熟悉的实际语言术语中,检测图灵完整性的常用方法是,语言是否允许或允许模拟嵌套的无边界while语句(与具有固定上界的语句的pascal样式相反)。


    正如韦伦·弗林所说:

    Turing Complete means that it is at least as powerful as a Turing Machine.

    我认为这是不正确的,如果一个系统和图灵机一样强大,那么它就是图灵机完整的系统,也就是说,机器所做的每一个计算都可以由系统完成,而系统所做的每一个计算都可以由图灵机完成。


    关系数据库可以输入地点和道路的纬度和经度,并计算它们之间的最短路径-不。这是一个问题,表明SQL没有图灵全。

    但是C++可以做到这一点,并且可以做任何问题。就是这样。


    推荐阅读