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