gcc使用了多少代码?

时间:2010-06-24 16:24:38

标签: c++ c gcc compiler-construction

  • 特别是对于C和C ++,默认使用了多少次传递?
  • 此数字是否会根据所使用的优化级别而变化? (它应该)
  • 可以直接更改吗?

我在http://gcc.gnu.org/中搜索此信息,但使用site:http://gcc.gnu.org/进行的Google搜索没有产生任何效果。

任何有关此文档的指针也会有所帮助。


通过我的意思是仅传递源代码的原始表示,而不是Wikipedia建议的多遍传递定义。

8 个答案:

答案 0 :(得分:6)

Passes and Files of the Compiler可能是您所寻找的最接近的东西。

答案 1 :(得分:2)

正如其他人在上面指出的那样,现代编译器在解析阶段只进行一次通过,然后在后期使用内部表示(通常是树或其他内存中的图形数据结构)进行多次传递。

具体而言,GCC使用这种方法。请参阅:https://gcc.gnu.org/onlinedocs/gccint/Parsing-pass.html#Parsing-pass

答案 2 :(得分:1)

我从未听说过编译器在文本表示上多次传递(例如,如果将预处理器计为一次传递则除外)。即使编译器有多个通过文件进行通信,文件也包含一个中间表示(序列化的AST +符号表)。

另一方面,汇编程序经常对源代码进行两次(或更多次)传递。他们的预处理器通常允许在一次通过时专门做事,允许玩一些或多或少的肮脏技巧。

答案 3 :(得分:1)

在gcc中,基本上有两种类型的传递,即:gimple,rtl。在gcc 4.6.2中,总的唯一传递是207.是给定程序的传递总数取决于优化级别。其中一些传球被多次夺走。如果有人想通过这些传递,请通过gcc源代码中的passes.c文件。 gcc 4.6.2中pass.c的路径:gcc源 - > gcc - > passes.c

是的,您可以通过在gcc中将通行证添加为动态插件来更改通行证数量。

答案 4 :(得分:0)

根据编译器设计类中的某些人的说法,gcc执行单次传递,而其他编译器(如Visual Studio使用的编译器(默认))使用两次传递。这就是为什么如果你在循环方式中使用它们,你必须在c ++中转发声明类。

Class A {
   B* b; 
}

Class B {
   A* a;
}

C#和其他语言不需要这样,因为第一遍构建引用,第二遍编译。

但是我再也不是编译器方面的专家。

答案 5 :(得分:0)

正好一个。我没有看到任何现代编译器对源代码进行多次传递的任何有意义的理由,如果“代码”是指程序源的原始文本表示。该单一过程的重点是将源代码转换为一些内部表示,这将用于进一步分析。内部表示不再需要具有任何线性结构和/或不再需要仅限于顺序处理,这意味着“通过”它的概念根本不再适用。

如果这个答案不能满足你的要求,你应该提供一个更精确的解释,说明你在源代码中定义的“传递”。

答案 6 :(得分:0)

你对多遍的定义似乎是旧的,源于整个节目源不适合可用内存的时代(代表)。这些时间现在已经消失,我不知道当前的多次传递(旧定义)编译器。

在编译器的德语维基百科条目中,给出了两个定义:http://de.wikipedia.org/wiki/Compiler

  

多遍编译器

     

Bei diesem Compilertyp wird der Quellcode in mehreren Schritten in den   Zielcodeübersetzt。在书房   Anfangszeiten des Compilerbaus wurde   derÜbersetzungsprozesshauptsächlich   deshalb inmehrereDurchläufezellegt,   WeildieKapazitätderComputer oft   nicht ausreichte,umdenvollständigen   编译器和daszuübersetzende   程序gleichzeitig im Hauptspeicher   zu halten。 Heutzutage dient ein   Multi-pass-Compiler vor allem dazu,   Vorwärtsreferenzen(Deklaration eines   Bezeichners nach dessen erster   Verwendung)aufzulösenundaufwendige   Optimierungendurchzuführen。

答案 7 :(得分:-3)

你的意思是传递源代码吗?就一次。这被称为“标记化”或“词法分析”阶段,或者更广泛地称为“解析”。

你的意思是编译器中的阶段吗?有几个。如今,术语“pass”实际上更像是一个旧的汇编程序概念,而不是编译器概念,即使这样,它也只是大致使用。术语“通过”没有单一的定义。

编译器分为“阶段”。阅读任何编译器教科书的介绍。它将解释各个阶段(大约有十几个逻辑阶段),而GCC非常忠实地遵循教科书模型。一些阶段通常组合成单个“通过”,其他阶段是单独的“通过”。

传递概念在讨论编译器方面确实没那么有用,因为阶段概念是。