我的意思是,是否有语言或可以设计,以便所有高级编程语言都可以编译成这种中间语言?
这不包括机器语言。
答案 0 :(得分:4)
Turing-complete的每种通用语言都是通用编程语言。
如果一个程序的任何程序可以编译为另一个程序,则两种语言(或机器)被认为是图灵等效的。如果语言图灵等同于图灵机,则语言是图灵完备的。
有几个早期的努力来形式化计算的概念;图灵机是一个,lambda演算是另一个,一般递归函数类是第三个。 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,网络等外部资源的访问,而其他语言只允许在内存中进行计算,但在图灵完成的任何语言中都可以添加API或操作内存的方法这允许它访问那些外部资源,因此缺乏对系统资源的访问权限不是基本限制,只是实施的限制。
作为一个更实际的问题,有几种语言被设计为可移植的中间语言,它们是编译的目标。 LLVM IR是一个常用的示例,C--是另一个例子。此外,语言运行库的任何字节码都以这种方式运行,JVM是许多语言的编译目标,CLR是另一种语言。最后,许多语言都编译为C语言,因为C编译器可以广泛使用,而且代码比机器代码更便携。
最近,随着网络和JavaScript成为每种网络浏览器中可用的语言的出现,JavaScript已经成为一种受欢迎的编译目标,对于那些旨在编译为JavaScript的语言来说,{{3 }}和CoffeeScript,以及最初设计用于编译为机器代码的现有语言,通过像Dart这样的项目。认识到这种用法,已经努力指定JavaScript的一个子集,具有更严格的规则,称为Emscripten,它为编译提供了更好的目标,同时仍允许相同的代码向后兼容 - 与常规JavaScript兼容那些对asm.js一无所知的引擎。