可以将C ++编译成与平台无关的代码吗?为什么不?

时间:2009-10-02 18:00:01

标签: c++ cross-platform

是否可以将C ++程序编译到某个中间阶段(类似于java中的字节码),其中输出是独立于平台的,而不是以后在运行时编译/链接以在本机(平台相关)代码中运行? 如果答案是否定的,为什么?

6 个答案:

答案 0 :(得分:14)

确实可以,例如参见LLVM

答案 1 :(得分:8)

当然。请记住,C ++标准仅指定行为:执行此程序时应该发生什么。它没有具体说明如何实施。

C ++代码可以编译为中间格式,JIT代码可以编译为机器代码,也可以解释或者您喜欢的任何其他内容。

答案 2 :(得分:5)

这是微不足道的,大多数编译器已经这样做了。 gcc compiles to RTL(寄存器传输语言),然后转换为目标CPU。

同样,托管C ++和C ++ / CLI编译为.NET。

最后你可以考虑Church Turing thesis这是编程语言等价的陈述,所以C ++可以编译/翻译成你最喜欢的平台独立语言(比如Perl,lisp,C--等等)。

答案 3 :(得分:4)

C ++源代码(有一些限制)与平台无关的字节码。

为什么不呢?

实际上,“字节码”编译过程仅仅是复制。运行“字节码”的虚拟机是C ++编译器和包装器脚本。是的,它做了一些类似于编译到机器代码的东西 - 但这是一个实现细节。

以下是这种“C ++虚拟机”的Linux实现:

#/bin/sh

tmp=`mktemp`
g++ $1 -o $tmp && $tmp $2 $3 $4 ...

它回答了这个问题吗?我想,确实如此。在多大程度上问题是具体的。因为它清楚地解释了将C ++编译成字节码的理论可能性。实际的实现也存在,例如,LLVM。

答案 4 :(得分:3)

是的,这在技术上是可行的。对于前雇主而言,这是一个插件,但这是一个完全相同的实现:http://antixlabs.com/products/antixgamedevelopmentkit/。大致来说,包装过程是C / C ++ - > (编译器) - > LLVM - > (后端) - >定制字节码 - > zip文件。这与平台无关。一旦它在用户的设备上,“播放器”转换定制的字节码 - > (该设备的翻译) - >本机精灵文件 - > (loader / linker) - >修正了代码。

如果真正的问题是,“是否存在任何这样的行业标准中间格式,它在多个平台上得到广泛支持并且适合于通用目的,如Java字节码?”然后答案是“不”。

至于为什么,我要说是因为没有一个组织对C ++程序员有足够的影响力,并且没有真正需要Java风格的C ++应用程序部署。 Sun一次性发明了Java和GUI库,并将其呈现给程序员,并且直到后来才引入大量的配置文件。

C ++甚至没有标准的GUI,而且C ++环境比Java更加分散。您如何告诉Windows应用程序开发人员,移动电话开发人员,智能卡实施者和证券交易所后端实施者,他们需要放弃现有的工具链,转而采用独立于平台的C ++部署机制?他们没有。甚至在你找到用C或C ++混合汇编编写OS和设备驱动程序的人之前。提出支持所有这些环境的标准环境根本不可能。

答案 5 :(得分:2)

Parrot项目将具有c ++字节码编译和执行parrot Visual Studio可以将C ++编译为字节码C++ managed