我希望将现有软件编译成演示文稿,以后可以在不同的体系结构(和操作系统)上运行。
为此,我需要一个(字节)代码,可以在另一个arch / OS(LLVM IR上轻松运行/模拟?某些RISC组件?)
一些随意的想法:
然后是系统调用映射的东西,但是例如BSD有系统调用转换层。
是否有任何已经有效的系统可以将C / C ++编译成以后可以在另一个架构上使用解释器运行的东西?
我可以将现有的unix软件编译成不那么低级别的二进制文件,这可以比运行完整的x86模拟器更容易“模拟”吗?更像是JVM而不是XEN HVM。
答案 0 :(得分:6)
Wikipedia's JVM page上列出了几个C到JVM编译器。我从未尝试过任何一种,但它们听起来像是一项有趣的练习。
由于JVM与Java语言密切相关,因此JVM执行Java规范要求的严格运行时检查。这要求C对字节码编译器提供自己的“松散机器抽象”,例如生成使用Java数组表示主存储器的编译代码(因此指针可以编译为整数),并将C库链接到集中式Java类模拟系统调用。下面列出的大多数或所有编译器都使用类似的方法。
答案 1 :(得分:4)
编译为LLVM位代码的C与平台无关。看看Google portable native client,他们正试图解决这个问题。
Adobe有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)。此外,正如理查德所提到的,没有操作系统独立性。因此,除非您使用的库具有相同的约定并存在于多个平台上,否则您将无法运行该应用程序。
您最好的选择是以更便携的语言编写代码,或者为您关注的平台提供二进制文件。