如何深入理解GCC编译器?

3

这个问题的背景是:我正在尝试了解编译器的工作原理。我学到了很多新东西:扫描器、解析器、AST、IR、优化、前端、后端、LL(1)等等。我的进步很渐进且很有趣。现在,我想做一些实际的工作。
从程序员的角度来看,我知道为什么typedef struct { int x; mytype* next; } mytype;不能编译,我也知道正确的语法typedef struct mystruct { int x; struct mystruct* next; } mytype;,但我想知道在编译过程中到底发生了什么问题。我正在使用gcc,我想知道如何使用gcc开发人员选项-fdump-...来回答这个问题。


1
“编译过程中问题确切发生在哪里”是什么意思?C语言标准规定了错误,编译器实现它。你需要知道gcc的哪一行文件出错了吗?还是你想问什么? - Alexey Frunze
肯定不在词法分析器、后端或任何一个优化器中。它早在前端的某个地方。 - Alexey Frunze
@AlexeyFrunze。你在某个地方写了“前端”,这正是我想知道的(注:“typedef struct…”只是为了说明我尝试做的事情,但我还有其他的)。我想知道是否有一些开发者选项策略(https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html#Developer-Options),可以理解它确切发生在哪里,如果你查看生成的文件(.tu、.original、.gimple、.omplower等)。顺便说一下:我开始阅读《龙书》了。 - Stef1611
显然,《龙书》不会告诉你有关gcc的任何具体信息。你可以找到错误打印的位置,然后从那里开始倒推。 - Alexey Frunze
@Alexey。我同意《龙书》是一本通用的书籍。如果我想做我在问题中提到的事情,那就是做一些与理论不同的事情。理论(如《龙书》所解释的)非常有趣,但很难理解。幸运的是,网上有许多文档可以帮助我。因此,我想使用gcc和-fdump选项来进行实践工作。我的两个目标是:尝试理解一些要点,同时也放松一下自己。我知道你写了一个编译器:恭喜!!!也许你有一些建议可以给我关于我的编译之旅的理解。 - Stef1611
如果你对gcc的内部工作原理感兴趣,最好在他们的邮件列表上提出你的问题。 - Alexey Frunze
1个回答

4
GCC编译器的第一步是语法分析器。
c-parser.c 

它将你的 C、C++ 或其他代码解析为 GIMPLE 表示形式:
Parse -> Gimplify -> Tree -> SSA -> Optimize -> Generate -> RTL -> Optimize RTL Generate -> ASM

例如,错误可以在终端或IDE中找到,错误输出如下:

gcc yourcode.c
yourcode.c:2:25: error: unknown type name 'mytype'
 typedef struct { int x; mytype* next; } mytype;
                         ^~~~~~

您可以通过链接来了解它的工作原理。
抱歉我的英语不好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接