2015-05-09 56 views
2

我的意思是说,有没有一种语言或者可以设计一种语言,以便所有的高级编程语言都可以编译成这种中间语言?是否可以创建一个通用的中级编程语言?

这是排除机器语言。

+1

这还不清楚。而且可能以意见为基础,因为没有“高层次”的客观定义。例如LLVM计数? –

+0

@OliverCharlesworth我明确表示,它不能是机器语言。 – KthProg

+1

LLVM不是机器语言,因为没有本机运行它的机器。 –

回答

4

每个通用语言Turing-complete是一种通用编程语言。

如果任何一种语言的程序可以编译为另一种语言的程序,那么两种语言(或机器)被认为是图灵等价物。一种语言是图灵完备的,如果它是图灵相当于一个图灵机。

有几个早期的努力来形式化计算的概念;一个是图灵机,另一个是拉姆达算法,另一个是一般递归函数类。 Alonzo Church和Alan Turing证明,所有这三种形式化都是图灵等价的;任何图灵机的程序都可以编译为lambda演算,反之亦然,lambda演算或图灵机可以实现任何一般的递归函数,反之亦然。

Church-Turing thesis假设可以在任何正式系统中表达的任何计算都可以转换为可以在图灵机上运行的程序;或者等价地,可以在无类型的lambda演算中表达,或者是基于上述等价性的一般递归。

这仅仅是一个假设,不能被正式证明,因为没有办法正式描述受其约束的计算类别(没有通过将它们定义为可由图灵机),但是从来没有任何提出的计算模型不可能用图灵机来计算。

因为您可以用几乎任何通用语言编写图灵机(或lambda演算的实现)的模拟器,并且同样可以将这些语言编译为运行在图灵机上的程序,但几乎所有通用语言图灵完成。

但是,有一些语言不是图灵完整的;正则表达式就是一个例子。它们可以用图灵机模拟,但它们不能反过来模拟图灵机。

请注意,这些都不能提高效率或访问主机系统资源;只是可以表达相同的计算,并且最终会提供相同的答案。有一些语言是图灵完成的,其中有一些问题cannot be computed at the same asymptotic efficiency as in other languages。有些语言提供对文件系统,I/O,网络等外部资源的访问,而另一些语言只允许在内存中进行计算,但在任何Turing完成的语言中,都可以添加API或操纵内存的方法允许它访问这些外部资源,所以缺乏对系统资源的访问不是一个根本的限制,只是实施的限制。

作为一个更实际的问题,有几种语言被设计为可移植的,作为编译目标的中间语言。 LLVM IR是一个常用的例子,C--是另一个例子。另外,语言运行时的任何字节码都是这样操作的,JVM是许多语言的编译目标,CLR是另一种语言。最后,许多语言都编译为C语言,因为C编译器已经广泛使用,并且代码比机器代码更具可移植性。

最近,随着网络和JavaScript成为各种浏览器中可用的语言的出现,JavaScript已成为编译的热门目标,无论是用于编译为JavaScript的语言,如CoffeeScriptDart,还包括最初设计用于编译为机器代码的现有语言,通过像Emscripten这样的项目。认识到这一用法,人们一直在努力指定一个JavaScript子集,并使用更严格的规则(称为asm.js),它为编译提供了更好的目标,同时仍允许相同的代码向后兼容常规JavaScript引擎,不知道任何关于asm.js.

+0

所以你说所有的图灵完整语言都可以编译成对方? – KthProg

+0

@KthProg:任何图灵等效系统都可以模拟任何其他图灵等价系统。 –

+0

@OliverCharlesworth突然之间,你也知道答案。尽管你可能会低估并试图以基于意见的方式来解决这个问题。 – KthProg

相关问题