3

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

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

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

我可以做吗?怎么做?

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

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

4

3 回答 3

7

只是一个建议- google clang 和 LLVM。

于 2011-05-09T21:14:01.770 回答
3

你对编译器了解多少?您似乎将“-O2”视为一些神奇的标志。

例如,寄存器分配是一种典型的优化。您现在肯定需要有多少寄存器可用。分配foo给寄存器 16 毫无意义,然后在第 2 阶段发现您的目标是 x86。

而那些依赖于架构的优化可能非常复杂。内联主要取决于调用成本,而这又取决于架构。

于 2011-05-10T08:58:32.553 回答
0

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

另一个想法:如何编译成“预处理”的源代码,通常带有“ *.i”扩展名,然后在不同的架构上以分布式方式编译?

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

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

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

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

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

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

于 2011-05-10T22:41:56.560 回答