我们的编译器课程功能练习要求我们比较使用-O和-O3 gcc选项构建的代码。我的机器生成的代码与课程中的代码不同。有没有办法计算课程中使用的优化选项,以便在我的机器上获得相同的代码,并进行更有意义的观察?
我找到了如何在我的机器上获得优化选项:
$ gcc -O3 -Q --help=optimizer
但是有没有办法在教授的机器上推断出那些,除了通过尝试所有并逐一修改它们。(。“GCC :( Debian 4.3.2-1.1)4.3.2”)?
感谢您的关注。
编辑: 我注意到我机器上生成的代码缺少我教授的序言和结语。是否有强制序言生成的选项(谷歌似乎没有带来多少)?
答案 0 :(得分:1)
以下是您需要了解的有关编译器优化的信息:它们取决于架构。此外,它们主要不同于编译器的一个版本到另一个版本( gcc-4.9 默认情况下比 gcc-4.4 更多)。 根据架构,我指的是CPU微架构( Intel : Nehalem,Sandy bridge,Ivy Bridge,Haswell,KNC ...... AMD : Bobcat,Bulldozzer,Jaguar, ......)。编译器通常将输入代码( C , C ++ , ADA ,...)转换为与 CPU无关的中介表示( GIMPLE 用于 GCC ),将对其执行大量优化。之后,编译器将生成更接近程序集的低级表示。在后者上,将展开特定于体系结构的优化。这种优化包括选择具有最低延迟的指令,根据循环大小,指令高速缓存大小等确定循环展开因子。 由于生成的代码与您在课堂上生成的代码不同,我认为底层架构必须不同。在这种情况下,即使使用相同的编译器标志,您也无法获得相同的汇编代码(即使没有优化,您也会获得不同的汇编代码)。 为此,您应该专注于比较优化和非优化代码,而不是试图坚持在课堂上给出的内容。我甚至认为将优化的代码与您给出的代码进行比较是一项很好的逆向工程练习。 您可以在here中找到我之前关于编译器优化的帖子之一。 关于这个主题的两本好书是Aho,Seti和Ulman的 The Dragon Book (编译器:原理,技术和工具)以及编译器的工程,作者:Keith Cooper和Linda Torczon。