来自C++的中间代码

Intermediate code from C++

本文关键字:中间代码 C++ 来自      更新时间:2023-10-16

我想将C++程序编译为中间代码。然后,我想编译当前处理器及其所有资源的中间代码。

第一步是使用优化 (-O2) 编译 C++ 程序,运行链接器并执行大部分编译过程。此步骤必须独立于操作系统和体系结构。

第二步是编译第一步的结果,没有原始源代码,针对当前计算机的操作系统和处理器,带有处理器的优化和特殊指令(-march=native)。第二步应该是快速的,并且软件要求最低。

我能做到吗?怎么办?

编辑
我想这样做,因为我想分发一个平台独立的程序,该程序可以使用处理器的所有资源,而无需原始源代码,而不是为每个平台和操作系统分发编译。如果第二步快速简便,那就太好了。

相同体系结构的处理器可能具有不同的功能。X86 处理器可能有 SSE1、SSE2 或其他处理器,它们可以是 32 位或 64 位。如果我为通用 X86 编译,它将缺乏 SSE 优化。多年后,处理器将具有新功能,并且需要为新处理器编译程序。

只是一个建议 - 谷歌叮当和LLVM。

你对编译器了解多少?您似乎将"-O2"视为某种神奇的标志。

例如,寄存器分配是一种典型的优化。您现在肯定需要有多少个寄存器可用。将foo分配给注册 16,然后在阶段 2 中发现你的目标是 x86,这是没有意义的。

这些依赖于架构的优化可能非常复杂。内联在很大程度上取决于呼叫成本,而这又取决于体系结构。

一旦你进入"特定于处理器"的优化,事情就会变得非常棘手。 对于特定于平台的编译器来说,在适当的"级别"生成对象或"中间"代码时真正"通用"确实很难:除非它是"IL"(中间语言)代码(如 C#-IL 代码或 Java 字节码),否则给定的编译器很难知道"在哪里停止"(因为当存在目标平台知识时,优化会在编译的不同级别发生)。

另一个想法:编译为"预处理"源代码,通常使用"*.i"扩展,然后在不同的架构上以分布式方式编译怎么样?

例如,大多数(所有)C 和 C++ 编译器都支持以下内容:

cc /P MyFile.cpp
gcc -E MyFile.cpp

。每个生成MyFile.i,这是预处理的文件。 现在该文件已包含所有标头和其他#defines,您可以在将该文件分发到其他系统后将该*.i文件编译为目标对象文件(或可执行文件)。 (如果您的预处理器宏特定于目标平台,则可能需要变得聪明,但对于您的构建系统来说,这应该非常简单,它应该生成命令行来执行此预处理。

这是 distcc 用于在本地预处理文件的方法,因此远程"构建农场"不需要安装任何标头或其他包。 (无论构建服务器场中的计算机如何配置,都可以保证获得相同的生成产品。

因此,它同样具有集中单个计算机的"配置/预处理"的效果,但以分布式方式提供交叉编译、特定于平台的编译或构建服务器场支持。

仅供参考 - 我真的很喜欢distcc概念,但该特定项目的最后一次更新是在2008年。 因此,如果您找到其他类似的工具/产品,我会感兴趣。 (与此同时,我正在编写一个类似的工具。