如果一种语言具有控制结构和变量,但不支持数组、列表、内存访问和分配等,它可以是图灵完备的吗?
也许如果您可以创建的变量数量没有限制,您可以通过创建像array_1
, array_2
, ...之类的变量来模拟数组array_6000
并手动循环它们,并以某种方式创建复杂的数据结构和递归?
编辑:即使您不能通过名称操作访问变量(array_10+i
不允许)?
如果一种语言具有控制结构和变量,但不支持数组、列表、内存访问和分配等,它可以是图灵完备的吗?
也许如果您可以创建的变量数量没有限制,您可以通过创建像array_1
, array_2
, ...之类的变量来模拟数组array_6000
并手动循环它们,并以某种方式创建复杂的数据结构和递归?
编辑:即使您不能通过名称操作访问变量(array_10+i
不允许)?
当然。看看Lambda Calculus,它是我见过的最小的图灵完备语言之一。基本上,你所拥有的只是 lambdas(函数字面量);没有赋值,没有声明,没有数据结构。这一切都非常非常精简。
但是,您可以通过将函数链接在一起来模拟像 List 这样的线性数据结构。它变得非常冗长,但它肯定是可能的,并且比拥有大量顺序命名的变量要好得多。
一般来说,一种语言是否图灵完备与它是否有数组无关。SML 和 Haskell 等函数式语言缺少数组,就像 Lambda 演算一样,这些实际上是有用的语言!说一种语言是“图灵完备的”只是另一种说法,即没有不能用该语言表达的图灵可计算函数。这是一个非常宽松的限定条件,允许许多完全不切实际的语言(如 Lambda 演算)。
有很多图灵完备的语言甚至没有“变量”的概念!内存访问和分配是实现细节,因此它们完全不相关。您必须意识到,图灵机和图灵完备性是非常理论化的概念,对证明事物很有用,但与实际硬件的现实完全脱节。
Paul Graham 写了一篇很长但非常非常有趣的关于计算机语言历史的文章,他描述了计算机语言的两种截然不同的主要传统:
听起来你只知道第二个传统,但图灵完备性是一个源自与第一个传统相同的原理的概念,如果你不了解这些原理,那将毫无意义。