Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can C/C++;是否将软件编译成字节码以供以后执行?(独立于体系结构的unix软件。)_Unix_Jvm_Virtualization_Llvm_Cil - Fatal编程技术网

Can C/C++;是否将软件编译成字节码以供以后执行?(独立于体系结构的unix软件。)

Can C/C++;是否将软件编译成字节码以供以后执行?(独立于体系结构的unix软件。),unix,jvm,virtualization,llvm,cil,Unix,Jvm,Virtualization,Llvm,Cil,我希望将现有软件编译成演示文稿,以后可以在不同的体系结构(和操作系统)上运行 为此,我需要一个(字节)代码,可以在另一个arch/OS上轻松运行/模拟(IR?一些RISC组装?) 一些随意的想法: 编译成JVM字节码并使用java运行。太拘束了?C编译器可用吗 齐女士。C编译器可用吗 LLVM?可以稍后运行中间表示吗 编译成RISC arch,如MMIX。系统调用呢 然后是系统调用映射,但例如BSD有系统调用转换层 有没有已经在工作的系统可以将C/C++编译成以后可以在另一个体系结构上使用解

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

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

一些随意的想法:

  • 编译成JVM字节码并使用java运行。太拘束了?C编译器可用吗
  • 齐女士。C编译器可用吗
  • LLVM?可以稍后运行中间表示吗
  • 编译成RISC arch,如MMIX。系统调用呢
然后是系统调用映射,但例如BSD有系统调用转换层

有没有已经在工作的系统可以将C/C++编译成以后可以在另一个体系结构上使用解释器运行的东西


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

编译成LLVM位代码的C不是独立于平台的。看看,他们正在努力解决这个问题

Adobe有一个可以让你将C编译成flash的工具


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

LLVM不是解决这个问题的好方法。尽管LLVM IR很漂亮,但它决不是机器独立的,也不是有意的。生成依赖于目标的LLVM IR是非常容易的,而且在某些语言中确实是必要的:例如,sizeof(void*)在编译为IR时将是4或8或其他任何值

LLVM也不提供操作系统独立性

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


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

< P>真正的问题是C和C++不是体系结构无关的语言。您可以编写可移植的东西,但编译器也可以通过您的代码对机器的各个方面进行硬编码。例如,考虑sizeof(long)。而且,正如Richard提到的,操作系统没有独立性。因此,除非您使用的库恰好具有相同的约定并且存在于多个平台上,否则您将无法运行应用程序


你最好用一种更易移植的语言编写代码,或者为你关心的平台提供二进制文件。

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


<> P>大多数与C++相关的人都是出于性能原因而做的,但是除非你玩的是非常低级的东西,否则你会用更高级的语言进行编码。这又给了你优化的时间,这样,在你用C++完成的时候,你就可以使用更快的版本,无论你选择使用什么高级语言。

< P>有几个C到JVM编译器。我从来没有试过任何一种,但它们听起来像是一个有趣的练习

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


现在正试图通过为web创建标准字节码格式来解决这一问题,但与JVM字节码不同,web汇编的级别更低,在C/C++的抽象级别上工作,而不是Java,因此它更像是典型的“汇编语言”,这是C/C++代码通常编译的目的

托管C++看起来好像是你所看到的for@Ankur:那是答案材料。碰巧,我现在唯一能想到的答案(或者是潜伏在LVVM沼泽中的东西)管理C++听起来很有趣。顺便说一句,关于LLVM IR是什么级别以及如何处理已编译的LLVM字节码,您有什么想法吗?您可能会发现NestedVM很有趣。带有自定义运行时库和Java解释器/编译器的MIPS编译工具链。用户模式QEMU可以工作。它只需要自己调用系统映射,而不只是将它们传递给主机系统,这就是Linux的功能。它也可以用于其他操作系统。不过,这是一项艰巨的任务。我的隐藏议程是能够运行某种程度上虚拟化的unix环境,而不必深入仿真。只要可以在userland中进行仿真,就可以为单个体系结构进行编译。我真的很想找到一些不太低级的arch和解释器/JIT编译器,以便在x86上运行它的二进制文件。我明白,你只需要将你的语言选择限制在设计用于多个平台的语言上,或者设计一个具有相同效果的C/C++子集。如果你使用其中一个,你会有Java的GC和内存问题/滞后吗?我从来没有尝试过,但我想你不会。描述中说,它们使用数组来表示主内存,因此不会有任何垃圾收集。不过,我几乎可以肯定,它的内存效率会低于本机编译的C。它能使用optimizat吗