是和不是。没有已知的计算模型可以做图灵机可以做的事情,并且仍然被称为计算,而不是魔术¹。因此,从这个意义上说,除了图灵完备性之外,没有任何东西。
另一方面,你可能熟悉“没有加一层间接层解决不了的问题”的说法。因此,我们可能想要区分直接映射到图灵机的计算模型和需要一定程度的间接性的计算模型。“添加间接级别”通常不是一个精确的数学概念,但在许多特定情况下,您可以观察到间接级别。通常,证明某种计算范式是图灵可计算的最简单方法是在图灵机上为其编写解释器,而这正是间接的一个层次。
那么让我们来看看对并发建模意味着什么。你提到了“在同一时间执行的事情”的能力。这是一种特定的并发,称为并行性,就并发而言,它是一个高度受限的模型。并发的世界比这要狂野得多。尽管如此,并行性已经允许在图灵机上建模时需要某种形式的间接性。
考虑以下问题:给定计算机程序 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”.