语言是否可以完整但在其他方面不完整?

McG*_*ory 10 language-agnostic compiler-construction programming-languages language-theory turing-complete

例如,在编写无法用图灵完整语言完成的操作系统时是否存在某些问题?

Cha*_*tin 17

不,或者至少如果你找到了一个可以反对教会图灵论文的人.

然而,有些语言是图灵完成的,但是在编写某些程序时,它是完全痛苦的,即FORTRAN中的字符串处理,COBOL中的数字编程,sed中的整数算术,几乎x86汇编程序中的所有内容.

当然还有脑力劳动.

  • 是的,这有点发生 - 客户端Markdown预览引擎比服务器端渲染引擎更宽容. (2认同)

Nor*_*sey 9

是的,您可以使用不允许直接操作硬件的语言.例如,使用Bourne shell编写操作系统会很困难.但这些限制比你想象的要少.操作系统已经用标准ML,Scheme,甚至Haskell编写!

  • @Pavel:问题是,"还有其他有趣的完整性概念".我的回答是,"是的,访问MMU页面表和其他硬件." cat,ls,grep,ping都是用C写的,而不是bash.如果你只有bash,并且没有Unix系统调用,我认为你不能实现Unix系统调用. (2认同)

Kev*_*son 9

图灵完备是最完整的正式定义.某些应用程序需要语言功能,但这些功能不适合正式定义.

例如,图形功能,产生后台进程的能力,持久状态的能力以及连接到网络的能力都是有用的功能,但与语言的图灵完整性无关.因此,Google App Engine上的Python或在沙箱中运行的Java小程序仍然是图灵完备的.

您会注意到,在许多情况下,这些类型的功能是由库提供的,而不是核心语言.


Bri*_*ian 6

如果你说的是语用学,那么当然......你可以想象一种无法读写文件的编程语言(例如一种可以计算整数函数的语言,但就是这样)... 只是因为一种语言可以操作我的烤面包机并不意味着它不是图灵完整的,但它确实意味着有些事情是不能做的,所以我不确定这种区别是多么"重要"或有用.


Ste*_*sop 5

根据上下文,“用一种语言完成某事”对不同的人意味着不同的事情。图灵就是其中之一,他非常准确地定义了“完整”的含义。

如果一种语言(或理论机器)是图灵完备的,那么就没有它不能进行的图灵计算。这并不意味着该语言是万能的,只是它擅长求和。有许多“事物”不是图灵计算,因此图灵完备的计算机可能无法做到。

“成为操作系统”不是图灵计算。要成为一个操作系统,你需要做的不仅仅是计算。您还需要操作硬件。

给定一种图灵完备语言,再加上一组用于执行所需的所有硬件操作的操作,包括合适的输入和时间概念,您就可以编写操作系统。或者我应该说,可以编写操作系统。你个人是否能做到这取决于语言的易用性,以及图灵定义忽略的物理限制,例如生成的程序是否真的适合并在你希望它运行的设备的内存中执行,并在现实的时间运行。

忽略实际限制 - 是的,您可以使用任何图灵完备语言编写操作系统,前提是该语言还具有足够的操作来驱动硬件。“库调用”,如果您希望采用实用的 CS 方法来区分语言和库。图灵没有做这样的区分,因为他的计算模型无论如何都没有“调用”的概念。您还需要解决引导程序问题 - 您的硬件必须直接运行您正在编写的语言,或者您需要将编译器转换为硬件运行的语言,或者您需要一个以硬件运行的语言编写的解释器硬件运行。同样,图灵忽略了这一切,因为他的计算模型使用抽象硬件,而编写操作系统则完全与硬件有关。

在英语(而不是 CompSciSpeak)中,通常会说一种语言“缺乏某些特征”,因此与具有这些特征的另一种语言相比,它是“不完整的”。有人可能会反驳说,在 C 中实现闭包是可能的。例如,可以编写一个 C 程序,它是一个 Lisp 解释器,并将一个 Lisp 程序作为字符串嵌入其中。瞧,C 中的闭包。但是,如果大多数人说“我希望 C 有闭包”,这并不是大多数人所要求的。如果您认为每种语言都需要闭包,那么 C 是不完整的。如果您认为每种语言都需要结构化编程,那么 ARM 汇编程序是不完整的。如果您认为应该可以向对象动态添加方法,那么 C++ 是不完整的,即使完全有可能使用“

图灵认为语言不需要任何这些便利:它们不影响可以执行的计算,只是编写某些程序是多么容易。图灵完备的概念已经没什么可说的什么节目的样子,或者他们是如何组织的,只有他们输出。所以这些语言是图灵完备的,但是从程序员的角度来看,有些事情是这些语言无法完成的。