可以将C / C ++软件编译成字节码以便以后执行吗? (独立于架构的unix软件。)

时间:2011-06-22 11:45:02

标签: unix jvm virtualization llvm cil

我希望将现有软件编译成演示文稿,以后可以在不同的体系结构(和操作系统)上运行。

为此,我需要一个(字节)代码,可以在另一个arch / OS(LLVM IR上轻松运行/模拟?某些RISC组件?)

一些随意的想法:

  • 编译成JVM字节码并使用java运行。限制太多了? C编译器可用吗?
  • MS CIL。可以使用C编译器吗?
  • LLVM?可以稍后运行中间表示吗?
  • 编译成RISC arch,例如MMIX。那么系统调用呢?

然后是系统调用映射的东西,但是例如BSD有系统调用转换层。

是否有任何已经有效的系统可以将C / C ++编译成以后可以在另一个架构上使用解释器运行的东西?


修改

我可以将现有的unix软件编译成不那么低级别的二进制文件,这可以比运行完整的x86模拟器更容易“模拟”吗?更像是JVM而不是XEN HVM。

6 个答案:

答案 0 :(得分:6)

Wikipedia's JVM page上列出了几个C到JVM编译器。我从未尝试过任何一种,但它们听起来像是一项有趣的练习。

  

由于JVM与Java语言密切相关,因此JVM执行Java规范要求的严格运行时检查。这要求C对字节码编译器提供自己的“松散机器抽象”,例如生成使用Java数组表示主存储器的编译代码(因此指针可以编译为整数),并将C库链接到集中式Java类模拟系统调用。下面列出的大多数或所有编译器都使用类似的方法。

答案 1 :(得分:4)

编译为LLVM位代码的C与平台无关。看看Google portable native client,他们正试图解决这个问题。

Adob​​e有alchemy,可以让你将C编译为flash。

有C到Java甚至JavaScript编译器。但是,由于内存管理的差异,它们不是很有用。

答案 2 :(得分:2)

LLVM不是解决此问题的好方法。与LLVM IR一样美观,它绝不是机器独立的,也不是它的意图。在某些语言中,生成依赖于目标的LLVM IR非常容易,而且确实是必要的:例如,sizeof(void *)在编译为IR时将为4或8或其他任何内容。

LLVM也无法提供操作系统独立性。

一个有趣的可能性可能是QEMU。您可以编译特定体系结构的程序,然后使用QEMU用户空间模拟在不同的体系结构上运行它。不幸的是,这可能会解决目标机器问题,但无法解决操作系统问题:QEMU Linux用户模式仿真仅适用于Linux系统。

如果你想分发二进制文件,JVM可能是目标和操作系统独立性的最佳选择。

答案 3 :(得分:2)

正如Ankur所提到的,C ++ / CLI可能是一种解决方案。您可以使用Mono在Linux上运行它,只要它没有本机位。但是除非你已经有了代码库,否则你试图以最低的成本移植,也许使用它会产生反作用。如果在你的情况下有意义,你应该使用Java或C#。

大多数使用C ++的人都是出于性能原因而做的,但除非你玩的是非常低级的东西,否则你将在更高级别的语言中完成编码。这反过来为您提供了优化的时间,以便在您使用C ++完成时,您可以选择使用更高级别语言的更快版本。

答案 4 :(得分:2)

Web Assembly正试图通过为Web创建标准字节码格式来解决这个问题,但与JVM字节码不同,Web Assembly更低级,在C / C ++的抽象级别工作,而不是Java因此它更像是通常所说的"汇编语言",这是C / C ++代码通常被编译到的。

答案 5 :(得分:1)

真正的问题是C和C ++不是与架构无关的语言。您可以在其中编写可以合理移植的内容,但编译器还可以通过代码对机器的各个方面进行硬编码。想想,例如,sizeof(long)。此外,正如理查德所提到的,没有操作系统独立性。因此,除非您使用的库具有相同的约定并存在于多个平台上,否则您将无法运行该应用程序。

您最好的选择是以更便携的语言编写代码,或者为您关注的平台提供二进制文件。