可以使用任何语言来创建任何程序吗?

时间:2010-04-16 03:43:08

标签: programming-languages

我听说过,如果程序员有足够的时间和技能使用任何特定的语言和足够的代码行,那么任何程序都可以使用任何给定的语言创建。我知道它肯定不会具有成本效益,例如,在BASIC中重写Adobe Photoshop,但是一个足够好且耐心的程序员可能会用任何语言创建任何程序吗?

10 个答案:

答案 0 :(得分:18)

如果一种语言是Turing complete,那么理论上你可以在其中编写任何程序 - 但是,即使这有一些限制,例如用户界面和OS API。例如,Brainfuck是Turing完成的,但由于无法访问视频内存,因此无法使用GUI,并且没有线程支持。但是,可以用它做任何计算任务。

答案 1 :(得分:7)

这取决于您如何定义“任何程序”和“任何语言”。

让我们从第一个开始:“任何程序”。无论编程语言如何,都有许多程序(事实上,无数多程序)无法编写 。最着名的一个是所谓的暂停问题:编写一个程序H,当给出任何程序P时,任何输入x都会确定P(x)最终是否会停。几十年前,阿兰·图灵证明了这样一个程序的存在是不可能的。你好,你不能用任何编程语言编写这个程序。

现在,我们来谈谈“任何语言”。实际上有不同类别的语言。有些人比其他人更强大。例如,正则表达式( 是一种编程语言)可以计算任何任意函数。它们的计算能力有限。但是,大多数通用编程语言通常称为“图灵完备”。

历史简介:为了证明停机问题的不可判断性,Alan Turing发明了一种名为图灵机的假想机器。 TM基本上是具有无限存储器的假设计算机,其计算特定功能。事实证明,您可以构建一个通用图灵机,可以模拟任何其他图灵机。

大约在同一时间,Alonzo Church发明了Lambda微积分。 LC 也是抽象的计算数学模型,但完全不同。人们开始疑惑:这两个模型中哪一个更强大? UTM可以计算LC无法计算的任何内容,反之亦然吗? LC可以解决停机问题吗?

事实证明,您可以为LC中的UTM编写模拟器,您可以构建一个解释LC的TM。这意味着TM可以计算LC可以计算的所有内容(通过简单地在解释器中运行),LC可以计算UTM可以计算的所有内容(通过在模拟器中运行它)。所以,我们有

LC ≤ UTM ∧ UTM ≤ LC ⇒ LC = UTM

英文:LC和UTM同样强大。实际上,事实证明每个计算模型和每个机器以及我们发现的每个编程语言最多 < / em>与LC和UTM一样强大,而且确实所有其他模型。这导致了所谓的 Church-Turing-Thesis ,它表明所有足够强大的计算模型同样强大,并且不存在比UTM或LC更强大的计算模型。 (可以有 less 强大的计算模型,例如正则表达式或总函数或只有有界循环的语言。)

我们将这种计算模型称为 Turing-complete 。而且,BTW,you don't need much to be Turing-complete

因此,在此之后,我们现在可以定义“任何程序”和“任何语言”的含义:

  

如果程序可以用一种图灵完整语言编写,那么它可以用任何图灵完整语言编写。

答案 2 :(得分:3)

这都是时间问题,不是吗? 缺少适用于BASIC的库和API可能会使Adobe Photoshop项目永远存在,并且在完成时可能无法顺利运行,但理论上可行。

答案 3 :(得分:1)

该语言必须是Turing-complete,并且还需要一种方法来访问本机操作系统以进行许多不同的操作,如文件,套接字等......

答案 4 :(得分:1)

不确定(几分)。有一个权衡,表现。某些语言也可能无法访问系统的某些功能,使其无法在计算机上执行某些任务。有些语言只是......比其他语言弱,而且需要一段时间。

答案 5 :(得分:1)

你也可以通过在十六进制编辑器中输入bit来重新创建Windows 95但是重点是什么?

答案 6 :(得分:1)

你必须小心“任何程序”的意思。例如,如果您被要求编写一个在包含“Hello world”的磁盘上创建文本文件的程序,并且您被要求用纯Javascript编写它,那将是不可能的,因为纯Javascript无法向磁盘写入任何内容

有关此想法的详尽讨论,您可能希望阅读computability

答案 7 :(得分:0)

我想如果你的语言有办法访问所有必要的输入和输出,那么是。

答案 8 :(得分:0)

如果你在一台足够强大的计算机上添加“...,并且鉴于该语言具有可以处理程序需要执行的任何库”,那么答案仍然是否定的。有些语言可以让程序员如此疯狂以致于自杀。如果我被迫回到Visual Basic 3(没有类或集合),我不知道如何重写记事本。

答案 9 :(得分:0)

我认为如果你添加“足够有创意”并且你将开发包含在编程中并将“任何程序”定义为任何程序,那么答案是肯定的。