来自C ++的中间代码

时间:2011-05-09 21:00:23

标签: c++ optimization compiler-construction cross-platform intermediate-language

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

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

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

我可以这样做吗?怎么做?

修改
我想这样做,因为我想分发一个独立于平台的程序,它可以使用处理器的所有资源,而不需要原始的源代码,而不是为每个平台和操作系统分发编译。如果第二步快速而简单,那将是件好事。

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

您对编译器了解多少?你似乎把“-O2”当作一些神奇的旗帜。

例如,寄存器分配是典型的优化。你现在肯定需要有多少寄存器。没有必要将foo分配给寄存器16,然后在阶段2中发现您正在定位x86。

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

答案 2 :(得分:0)

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

另一个想法:如何编译为“预处理”源代码,通常使用“*.i”扩展,然后在不同的体系结构上以分布式方式进行编译?

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

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

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

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

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

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