【发布时间】:2009-12-17 14:06:03
【问题描述】:
首先我要感谢所有在Compiling multiple languages together 上回答我之前问题的人。现在我想知道是否可以将多种语言编译在一起,以便它们可以在不同的平台上运行。
【问题讨论】:
标签: compiler-construction compilation multiplatform multiple-languages
首先我要感谢所有在Compiling multiple languages together 上回答我之前问题的人。现在我想知道是否可以将多种语言编译在一起,以便它们可以在不同的平台上运行。
【问题讨论】:
标签: compiler-construction compilation multiplatform multiple-languages
如果你编译成与机器无关的字节码(或类似的东西),然后在每台目标机器上解释字节码,这相对容易,因为这与编译多种语言在单台机器上运行是同一个问题。很多人都解决了这个问题,解决方案的优劣程度不一。
如果你想编译成绝对机器码,你必须为每台将运行它的机器包含机器码,然后每台目标机器的加载器必须知道如何选择合适的机器码。
在 PowerPC Mac 和 68K Mac 必须和平共处的日子里,Apple 尝试使用“胖二进制文件”来实现这一点。它奏效了,但并不完全是一个巨大的成功。
【讨论】:
我认为无论你是编译一种还是多种语言,你编译的代码是否会在不同的平台上运行的答案取决于虚拟机的存在,比如 JVM(Java 虚拟机)或 CLR(公共语言运行时) ) 可以解释指令并在不同平台上执行它们。由于不同的机器架构支持不同的指令集(这里的指令集指的是汇编),因此不可能将您的代码编译成机器语言以使其在不同平台上运行。正如在对您上一个问题的回复中所指出的那样,多种语言将编译为 Java 字节码(例如),这些字节码可以链接在一起并在任何具有 JVM 的机器上运行。因为有许多不同机器架构的 JVM 实现,所以您的 Java 字节码可以在任何这些架构上运行。
【讨论】:
是的,可以一起编译多种语言,以便它们在多个平台上工作。有几种方法:
Scala 和Java 都编译到运行在许多平台上的 JVM。另一个例子是 .NET,它包含多种语言,可以通过Mono Project 在 Windows 或 Linux 上运行。
一些文件格式是fat binaries,可以在多个平台上运行。 Apple 曾两次使用它们在硬件实现之间进行传输。
【讨论】:
我最近听说了另一种方法。
您不是将应用程序分发为机器二进制文件(或字节码),而是以编译器的中间语言的“大部分编译”形式分发它。只要所有语言的所有编译器都使用通用中间形式,并且所有后端代码生成器都使用该通用中间形式,您就可以在目标上安装所需的特定后端,然后分发中间体。
MacOberon 使用这种方法同时针对 680x0 和 PowerPC MAC 硬件。他们调用了“苗条的二进制文件”。完全相同的“二进制文件”被分发到任何一种机器,后端通过生成适当的代码基本上完成了编译。
有趣的是,这种方法并不比传统方法慢很多,因为将“二进制”从磁盘物理读取到内存的成本绝对支配了应用程序的启动时间。
【讨论】: