gcc使用了多少遍代码?

1yjd4xko  于 2023-05-28  发布在  其他
关注(0)|答案(8)|浏览(194)
  • 对于C和C++,默认情况下使用多少遍?
  • 这个数字是否会根据所使用的优化级别而变化?(应该)
  • 可以直接改吗?

我在http://gcc.gnu.org/中搜索这些信息,但是使用site:http://gcc.gnu.org/进行谷歌搜索没有得到任何结果。
任何关于这方面的文档的指针也将是有帮助的。
通过传递,我的意思是只传递源代码的原始表示,而不是Wikipedia建议的多传递定义。

sr4lhrrt

sr4lhrrt1#

Passes and Files of the Compiler可能是最接近您要查找的内容。
列出的有:

  • 解析传递
  • Gimplification通行证
  • 通行证管理员
  • 程序间优化遍数
  • 树SSA通行证
  • RTL通过
hgb9j2n6

hgb9j2n62#

正如上面其他人指出的,现代编译器在解析阶段只做一次,然后在后面的阶段使用内部表示(通常是树或其他内存中的图形数据结构)进行多次。
具体来说,GCC使用这种方法。参见:https://gcc.gnu.org/onlinedocs/gccint/Parsing-pass.html#Parsing-pass

pexxcrt2

pexxcrt23#

在GCC中,基本上有两种类型的传递,即:詹普尔岛在gcc 4.6.2中,总的唯一通道是207。是的给定程序的总通过次数取决于优化级别。其中一些通行证是采取一次以上。如果有人想查看这些通道,请查看gcc源代码中的passes. c文件。gcc 4.6.2中passes.c的路径:gcc source -> gcc -> passes.c
是的,你可以通过在gcc中添加动态插件来改变通道的数量。

q9rjltbz

q9rjltbz4#

我从来没有听说过编译器多次传递文本表示(除非你把预处理器算作一次传递)。即使编译器有多个通过文件通信的通道,文件也包含一个中间表示(序列化的AST +符号表)。
另一方面,汇编程序通常会对源代码进行两次(或更多次)检查。他们的预处理器通常允许在一次通过时专门做一些事情,允许玩一些或多或少的肮脏把戏。

9rnv2umw

9rnv2umw5#

从我的编译器设计类中有人告诉我的,gcc只执行一次,而其他编译器(如Visual Studio(默认)使用的编译器)使用两次。这就是为什么你必须在c++中向前声明类,如果你在循环fasion中使用它们。

Class A {
   B* b; 
}

Class B {
   A* a;
}

C#和其他语言不需要这样做,因为第一遍构建引用,第二遍编译。
但话说回来,我不是编译器方面的Maven。

bd1hkmkf

bd1hkmkf6#

正好一个我不认为任何现代编译器有任何有意义的理由对源代码进行多次传递,如果“代码”是指程序源代码的原始文本表示。这一步的全部目的是将源代码转换成某种内部表示,以用于进一步的分析。该内部表示不再需要具有任何线性结构和/或不再需要仅限于顺序处理,这意味着“通过”它的概念不再适用。
如果这个答案不能让您满意,您可能应该提供一个更精确的解释,说明您定义的源代码“传递”是什么。

ckx4rj1h

ckx4rj1h7#

您对多遍的定义似乎是旧的,源于整个程序源代码(的表示)不适合可用内存的时代。这些时代已经过去了,我不知道一个单一的,目前的多通道(旧定义)编译器。
在德语维基百科的Compiler条目中,给出了两个定义:http://de.wikipedia.org/wiki/Compiler
多遍编译器
Bei diesem Compilertyp wird der Quellcode in mehreren Schritten in den Zielcode übersetzt. In den Anfangszeiten des Compilerbaus wurde der Übersetzungsprozess hauptsächlich deshalb in mehrere Durchläufe zerlegt,weil die Kapazität der Computer oftnicht ausreichte,um den vollständigen Compiler und das zu übersetzende Programgleichzeitig im Hauptspeicher zu halten. Heutzutage dient ein Multi-pass-Compiler vor allem dazu,Vorwärtsreferenzen(Dekeines Bezeichners nach dessen erster Verwendung)aufzulösen und aufwendige Optimierungen durchzuführen.

yhxst69z

yhxst69z8#

你的意思是传递到 * 源代码 *?就一次。这被称为“标记化”或“词法分析”阶段,或者更广义地说,“解析”。
你是说编译器中的阶段吗?有好几个。术语“pass”实际上更像是一个旧的汇编器概念,而不是编译器概念,即使这样,它也只是粗略地使用。术语“通过”没有单一的定义。
编译器被分解为“阶段”。阅读任何编译器教科书的介绍。它将解释这些阶段(大约有十几个逻辑阶段),GCC相当忠实地遵循教科书模型。一些阶段通常被组合成单个“通道”,其他阶段是单独的“通道”。
就讨论编译器而言,pass 概念并不像 phase 概念那样有用。

相关问题