- 对于C和C++,默认情况下使用多少遍扫描?
- 这个数字是否会根据使用的优化级别而改变?(应该会)
- 它可以直接更改吗?
我在http://gcc.gnu.org/中搜索了这些信息,但使用site:http://gcc.gnu.org/
进行谷歌搜索没有产生任何结果。
任何关于此的文档指针也将是有帮助的。
我所指的“By pass”是仅跳过源代码的原始表示,而不是Wikipedia所建议的多次跳过定义。
我在http://gcc.gnu.org/中搜索了这些信息,但使用site:http://gcc.gnu.org/
进行谷歌搜索没有产生任何结果。
任何关于此的文档指针也将是有帮助的。
正如其他人在上面指出的那样,现代编译器只在解析阶段执行一次单独的通行,并在后续阶段使用内部表示执行多次通行(通常是树形或其他类似内存图的数据结构)。
具体而言,GCC采用了这种方法。请参见:https://gcc.gnu.org/onlinedocs/gccint/Parsing-pass.html#Parsing-pass
我从未听说过编译器在文本表示上多次通过(除非您将预处理器视为一次通过)。即使编译器有多个通过文件通信的传递,这些文件也包含中间表示(序列化AST +符号表)。
另一方面,汇编程序通常会对源代码进行两次(或更多)通过。它们的预处理器通常允许在一次通过上执行某些操作,从而允许进行一些更或多或少肮脏的技巧。
Class A {
B* b;
}
Class B {
A* a;
}
C#和其他语言不需要这样做,因为第一遍构建引用,第二遍编译。
但是我并不是编译器方面的专家。
只需要一次。如果“代码”指的是程序源代码的原始文本表示,我不认为任何现代编译器有任何有意义的理由对其进行多次处理。这个单程的整个重点是将源代码转换成某种内部表示形式,该形式将用于进一步分析。该内部表示形式不再需要具有任何线性结构和/或仅限于顺序处理,这意味着“执行遍历”的概念已经不再适用。
如果您不满意这个答案,您可能应该提供更精确的解释来定义您对源代码的“遍历”。
你对多遍编译的定义似乎是旧的,源自于整个程序源代码只是不能适应可用内存的时代。这些时代已经过去了,我不知道任何一个现在使用旧定义的多遍编译器。
在德语维基百科的编译器条目中,给出了两个定义:http://de.wikipedia.org/wiki/Compiler
多遍编译器你是指对源代码进行一次扫描吗?只有一次。这被称为“标记化”或“词法分析”阶段,或者更广泛地说,“解析”。
你是指编译器中的“阶段”吗?有几个。术语“pass”实际上更多地是一个旧的汇编器概念,而不是一个编译器概念,即使在那时它也只是粗略地使用。术语“pass”没有单一的定义。
编译器被分解成“阶段”。阅读任何编译器教材的介绍。它将解释这些阶段(大约有十二个逻辑阶段),GCC相当忠实地遵循了教科书模型。有些阶段通常合并成一个“pass”,而其他阶段则是单独的“passes”。
在讨论编译器方面,“pass”概念实际上并不像“phase”概念那样有用。