是否可以创建通用的中间编程语言?

Posted

技术标签:

【中文标题】是否可以创建通用的中间编程语言?【英文标题】:Is it possible to create a universal intermediate programming language? 【发布时间】:2015-07-20 09:27:26 【问题描述】:

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

这不包括机器语言。

【问题讨论】:

这不清楚。并且可能基于意见,因为没有“高级”的客观定义。例如,LLVM 算不算? @OliverCharlesworth 我说清楚了,它不可能是机器语言。 LLVM 不是机器语言,因为没有机器可以本地运行它。 @OliverCharlesworth 这与所有非机器语言的语言都不是机器语言的意义相同。所以是的,LLVM 将是一个候选者。 【参考方案1】:

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、网络等外部资源的访问,而其他语言只允许在内存中进行计算,但在任何图灵完备的语言中,都可以添加 API 或操作内存的方法允许它访问那些外部资源,因此无法访问系统资源不是基本限制,只是实现的限制。

作为更实际的问题,有几种语言被设计为可移植的中间语言,它们是编译的目标。 LLVM IR 是一个常用的例子,C-- 是另一个例子。此外,语言运行时的任何字节码都以这种方式运行,JVM 是许多语言的编译目标,CLR 是另一种。最后,许多语言都编译成 C,因为 C 编译器广泛可用,而且代码比机器代码更便于移植。

最近,随着 Web 的出现和 javascript 成为可在每个 Web 浏览器中使用的语言,JavaScript 已成为一种流行的编译目标,这两种语言都旨在编译为 JavaScript,例如 CoffeeScript和Dart,还有现有的语言,这些语言最初设计为通过Emscripten 等项目编译成机器代码。认识到这种用法,已经努力指定 JavaScript 的一个子集,具有更严格的规则,称为asm.js,它为编译提供了更好的目标,同时仍然允许相同的代码向后兼容常规 JavaScript 引擎对 asm.js 一无所知。

【讨论】:

所以你是说所有图灵完备的语言都可以相互编译? @KthProg:任何图灵等效系统都可以模拟任何其他图灵等效系统。 @OliverCharlesworth 突然间你也知道了答案。即使您可能投反对票并试图以基于意见的方式结束此问题。 @KthProg:我已经知道答案了。我没有投反对票,但我确实投票结束(因为不清楚你试图用机器语言来区分......)但鉴于你似乎在说这是你问题的可接受答案,很高兴将其视为已澄清的问题,因此将撤回近距离投票! @OliverCharlesworth 好的,谢谢!不管怎样,如果一个可以模拟另一个,那么它似乎可以编译。

以上是关于是否可以创建通用的中间编程语言?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 LLVM IR 作为通用语言在编程语言之间进行转换?

是否可以使用位码创建通用 iOS 框架?

我可以将 IL2CPP(C++ 中间语言)用于非 Unity 应用程序吗?

IL指令列表

易语言 错误(10044): 不能将“文本型 数组”数据转换到“通用型”数据。

Ajax Applet