7

我经常看到人们说,如果你可以用某种语言做 X,那么你就可以用另一种语言做 Y,这就是图灵完备的论证。所以你会经常(通常在一个讽刺的评论中)“确定你可以用 y 做 t 因为 y 也是图灵完备的。

我很久以前就学习了 CS 理论,但我认为这并不总是正确的,因为我不确定图灵在哪里适合并发。例如,有些编程语言具有正确的硬件,您可以在同一时间执行一些事情,但其他一些则不可能。

我知道这可能更多是硬件/驱动程序问题而不是语言,但我很好奇并发是否或如何改变图灵完备的含义?你能比图灵完备吗?

编辑:我问这个问题 的最初原因在很大程度上是由于量子计算。虽然公认的答案没有这么说,但量子计算(表面上)是图灵的一个子集

4

2 回答 2

7

对于许多人来说,这是一个令人困惑的话题;你不是一个人。问题是这里有两种不同的“可能”定义。“可能”的一个定义是你如何使用它:是否可以进行并发,是否可以使用该语言操作一个巨型机器人,是否可以让计算机享受草莓等。这是外行的定义的“可能”。

图灵完备性与上述意义上的可能性无关。当然,并发并非在任何地方都是可能的,因为(至少对于并发的某些定义)语言必须能够生成可以同时在两个或多个不同处理器上运行的代码。因此,只能编译为将在单个处理器上运行的代码的语言将无法并发。然而,它仍然可能是图灵完备的。

图灵完备性与可以在给定足够内存和运行时间的机器上计算的数学函数的种类有关。为了评估数学函数,单个处理器可以做多个处理器可以做的所有事情,因为它可以通过一个接一个地执行一个处理器的逻辑来模拟多个处理器。可以在任何设备上计算的所有数学函数都可以使用图灵机计算的(未经证实和不可证明的,但可证伪的)声明是所谓的Church-Turing 论文

如果您可以证明您可以使用它模拟任何图灵机,则该编程语言称为图灵完备。将此与 Church-Turing 论文相结合,这意味着编程语言能够评估任何设备可以评估的每种类型的数学函数,只要有足够的时间和内存。大多数语言都是图灵完备的,因为这只需要分配动态数组和使用循环和 if 语句以及一些基本数据操作的能力。

反过来说,由于可以构建图灵机来模拟我们目前知道的任何处理器,并且编程语言可以使用处理器完成它们所做的事情,因此当前的编程语言也没有比图灵机更具表达能力。因此,数学函数的计算同样可以在所有常见的编程语言中进行。在一个中可计算的函数在另一个中可计算。这与性能无关- 并发本质上是一种性能优化。

于 2011-08-28T00:52:07.130 回答
3

是和不是。没有已知的计算模型可以做图灵机可以做的事情,并且仍然被称为计算,而不是魔术¹。因此,从这个意义上说,除了图灵完备性之外,没有任何东西。

另一方面,你可能熟悉“没有加一层间接层解决不了的问题”的说法。因此,我们可能想要区分直接映射到图灵机的计算模型和需要一定程度的间接性的计算模型。“添加间接级别”通常不是一个精确的数学概念,但在许多特定情况下,您可以观察到间接级别。通常,证明某种计算范式是图灵可计算的最简单方法是在图灵机上为其编写解释器,而这正是间接的一个层次。

那么让我们来看看对并发建模意味着什么。你提到了“在同一时间执行的事情”的能力。这是一种特定的并发,称为并行性,就并发而言,它是一个高度受限的模型。并发的世界比这要狂野得多。尽管如此,并行性已经允许在图灵机上建模时需要某种形式的间接性。

考虑以下问题:给定计算机程序 A 和 B(在通用图灵机的磁带上传递),同时执行它们,并返回任一程序的结果;您的程序必须终止,除非 A 和 B 都未终止。在纯粹的顺序世界中,您可以执行 A 并返回结果;或者您可以执行 B 并返回结果。但是,如果您从执行 A 开始,并且它恰好是一个非终止程序,而 B 确实终止了,那么您的执行策略并不能解决问题。同样,如果您从执行 B 开始,您的执行策略并不能解决问题,因为即使 A 终止,B 也可能不会终止。

鉴于 A 或 B 是否终止是无法确定的,因此您不能基于此来决定首先执行哪一个。但是,有一种非常简单的方法可以修改图灵机以并行执行程序:将 A 和 B 放在不同的磁带上,复制自动机,然后执行每个程序的一个步骤,直到两个程序之一终止。通过添加这个级别的处理,您可以解决并行执行问题。

解决这个问题只需要对模型稍作修改(很容易用单磁带机建模双磁带图灵机)。我仍然提到它是因为它是另一个重要的计算模型 [lambda calculus](http://en.wikipedia.org/wiki/Lambda calculus) 中的一个重要示例。并行减少(评估)两个 lambda 项直到其中一个达到标准形式(终止)的操作称为Plotkin 的并行或。众所周知,不可能编写实现并行或的 lambda 项(一个 lambda 演算程序)。因此 lambda 演算被称为“固有顺序的”。

我在这里提到 lambda 演算的原因是大多数编程语言更接近 lambda 演算,而不是编程机器。因此,作为一名程序员,来自 lambda 演算的见解通常比来自图灵机的见解更重要。并行或示例表明向语言添加并发性²可以打开原始语言中不可用的可能性。

可以通过与图灵机基本相同的技巧将并发性添加到顺序语言中:执行一小段线程 A,然后执行一小段线程 B,依此类推。事实上,如果您不使用您的语言执行此操作,操作系统的内核通常可以为您执行此操作。严格来说,这提供了线程的并发执行,但仍然使用单个处理器。

作为一种理论模型,这种线程执行存在确定性的局限性. 事实上,任何可以直接在图灵机上建模的系统都是确定性的。在处理并发系统时,能够编写非确定性程序通常很重要。通常,多个计算线程交错的确切顺序是无关紧要的。因此,如果两个程序进行基本相同的计算,但顺序略有不同,则它们是等价的。您可以通过查看可能的交错集合而不是单个程序运行来从顺序计算模型中创建并发计算模型,但这增加了难以管理的间接级别。因此,大多数并发模型将非确定性融入系统。当你这样做时,你就不能再在图灵机上运行了

¹ In this respect, thought (what happens in our brain) is still magic in the sense that we have no idea how it's done, we don't have a scientific understanding of it. Anything we know how to reproduce (not in the biological sense!) is Turing-computable.
² Note that here, the language includes everything you can't define by yourself. In this sense, the standard library is part of “the language”.

于 2011-12-04T02:47:04.447 回答