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

时间:2009-05-01 23:07:18

标签: language-agnostic compiler-construction programming-languages language-theory turing-complete

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

10 个答案:

答案 0 :(得分:17)

没有。或者至少如果你找到一个可以抵消Church Turing Thesis的那个。

然而,有些语言是图灵完成的,但是编写某些程序是一件非常痛苦的事情,即FORTRAN中的字符串处理,COBOL中的数字编程,sed中的整数运算,几乎x86汇编程序中的所有内容

当然还有brainfuck

答案 1 :(得分:9)

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

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:6)

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

答案 4 :(得分:4)

根据具体情况,“用语言完成某事”对不同的人来说意味着不同的事情。图灵就是其中之一,他非常准确地定义了“完整”的意思。

如果语言(或理论机器)图灵完成,则没有图灵计算它不能做。这并不意味着语言是无所不能的,只是它擅长于总和。有许多“事物”不是图灵计算,因此图灵完备的计算机可能无法做到。

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

鉴于图灵完整语言,以及一系列操作,您可以执行所需的所有硬件操作,包括适当的输入和时间概念,您可以编写操作系统。或者我应该说,可以写一个操作系统。您个人是否可以这样做取决于语言的使用方式,以及图灵定义忽略的物理限制,例如生成的程序是否真正适合并在您希望它运行的设备的内存中执行,并在现实的时间运行。

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

在英语(而不是CompSciSpeak)中,通常会说一种语言“缺乏某些特征”,并且可以说与其他语言相比,它“不完整”。有人可能反驳说可以在C中实现闭包。例如,可以编写一个Lisp解释器的C程序,并将Lisp程序作为字符串嵌入其中。瞧,关闭C.但是,如果他们说“我希望C有封闭”,这并不是大多数人所要求的。如果您认为每种语言都需要关闭,那么C就不完整了。如果您认为每种语言都需要结构化编程,那么ARM汇编程序就不完整了。如果您认为应该可以动态地向对象添加方法,那么C ++是不完整的,即使用“AddMethod”和“CallMethodByName”方法编写C ++类并且从那里伪造自己的方法调用约定也是完全可能的。等等。

图灵不认为语言需要任何这些便利:它们不会影响可以执行的计算,只是编写某些程序是多么容易。图灵完整性的概念无关于程序的外观,或者它们如何组织,它们输出的内容。所以这些语言是图灵完整的,但从程序员的角度来看,有些事情是用这些语言无法实现的。

答案 5 :(得分:3)

语言可以或不可以做 - 子例程,递归,自定义数据类型,循环,定义类,转到等等。这些语言特征的集合使它完整或不完整。例如,如果您没有循环,gotos和子例程,则语言不完整 - 您无法执行任何循环操作。语言的完整性是非常理论和科学的东西。例如,它已被证明,即使您的语言不允许递归调用函数,但允许函数指针 - 您可以模拟递归,即使用y-combinator。

经常使用文件和硬件不是语言的一部分。要完成任何编程任务,您需要的不仅仅是语言。你需要你的程序所使用的环境。在x86语言中你有单个参数的指令“int”,但执行“int 21h”时由OS执行某些操作。

语言只需要某种方式与环境进行通信并完成 - 然后由环境来处理它。在x86 asm“mov ax,bx”中写入是有效的,但是由CPU来执行此操作。

以其他方式不完整 - 简单,只需定义您自己的完整版本。即我不讨论没有基于类的OOP的工作,所以如果它没有支持基于类的OOP的语言特性,那么让我们定义该语言不是Feldman-complete。那么,C和Javascript不是F-complete。你仍然可以用这些语言做任何事情,甚至可以在某种程度上模拟基于类的OOP。

关于操作系统 - 您仍然需要运行指令和编译器的处理器,将语言转换为CPU指令。我可以想象编译器将任何东西翻译成机器代码。比如,以下是有效的JS代码

for(var i=0;i<10;i++){
 mov("ax",i);
 int(0x21);
}

并且将其编译成机器代码应该不难。

在现代世界中,你不仅选择语言,还选择平台,标准和非标准的图书馆,文学,社区,支持等。所有这些都会影响你做某件事的能力,而且他们完全可以选择对你的任务可能不够“完整”。但是如果我不能将c ++代码编译成java applet,那并不意味着它是c ++语言的不完整性。只是缺少编译器会将c ++代码转换为可以由JVM加载的东西。

如果需要,您可以设计一种语言功能,如“OpenFile,PingNetworkHost,DownloadMpeg4FileOverHttpsAndPlayBackwards”。但是如果语言没有它们,它们仍然可以用其他语言功能和环境支持来实现,因此缺少这些功能并不会使语言不完整。如果您的语言类似于C但没有goto运算符,循环运算符(for,while,do while)和函数,那么您就无法编写循环程序,也没有环境和库可以帮助您。

答案 6 :(得分:1)

答案是肯定的。图灵完整性仅暗示图灵完整语言可用于计算任何可计算函数。首先,它没有说明计算的复杂性。

您通常可以预期任何多项式时间算法都可以表示为任何其他图灵完备语言中的多项式时间算法,但就此而言。如果你唯一关注的是图灵的完整性,那么尤其是任何实时要求(软或硬)都会消失。

另一个重要的事情是语言的表现力,这在很大程度上是一种主观的属性,但是你可以理解,在任何机器代码中编写程序都比编写Java要困难得多。

对于操作系统,必须使用硬件接口,但任何语言都可以配备此类实用程序。

[编辑] 我可能会添加的另一件事是,任何编程语言的实际实现都不是图灵完全由于我们的有限计算机器的性质。虽然Church-Turing论文以及相关的开创性发现(如停止问题)为我们理解计算奠定了基础,但它们很少能够满足实际计算的需要。

答案 7 :(得分:0)

不完整的可用性:)

答案 8 :(得分:0)

当谈论语言时,通常假设语言在一些非常简单的机器上运行。因此,从文件读取或访问网络的任何概念通常都不考虑语言的力量。

在可计算性理论中经常使用不同类别的语言(每种语言都有无穷无尽的修改)

  1. 有限自动机。这是最简单的一类机器,它们可以识别最小类的语言,这恰好是正则表达式可识别的精确语言,即。字符串是以两个'a'开头还是以d结尾。它们不能用于识别字符串是否包含一组平衡的括号,fx。
  2. 按下自动机。这本质上是有限自动机与堆栈的扩展。与有限状态机不同,它们可用于判断特定字符串是否包含一组平衡的括号。按下自动机可以识别的语言正好该组,而不是使用上下文无关语法描述的语言,它们通常用于解析源代码。
  3. 图灵机。这些是这类机器中最强大的,但这并不意味着它们可以用来回答所有问题。他们无法回答这个问题,这个字符串描述了一个永远运行的图灵机吗?事实上,任何图灵机都无法说出任何图灵机的重要特性(赖斯定理)。
  4. 所以是的,图灵机有局限性,并且有一些机器可以做图灵机不能做的事情,但它们(一切都很可能)只在理论上存在,在实践中更新。

答案 9 :(得分:0)

我认为除了图灵(或正则表达式或下推自动机)之外的完整性定义与 languages 无关。但这种完整性仅适用于数字或符号计算设施。

你提到的东西在我看来比语言更像是运行时和环境的功能。有一个重要的区别,正式的完整性概念通常只适用于语言本身。