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