预处理
gcc -E main.c -o main.i
编译生成汇编代码
gcc -S main.i -o main.s
源码->汇编
gcc -S main.c -o main.s
汇编生成目标文件
as main.s -o main.o
#或者
gcc -c main.s -o main.o
gcc -c main.c -o main.o
链接各种库才能产生最终的正确可执行文件
#ld命令需要指定所需的目标文件的的路径才能正确生成a.out的可执行文件
ld -static main.o
#这个会自动链接需要的库并生成a.aout可执行文件
gcc main.o
编译的过程
假如有如下C代码:
array[index] = (index + 4) * (2 + 6)
扫描-词法分析-语法分析-源代码优化-代码生成-目标代码优化
词法分析:
词法分析器 lex
这一阶段会将程序分割成一个一个的字符(串)符号忽略空格符,并对分割的字符进行标记分类
关键字、标识符、字面量、特殊符号等
以上代码词法分析的结果如下
记号 | 类型 |
---|---|
array | 标识符 |
index | 标识符 |
] | 右方括号 |
= | 赋值 |
( | 左圆括号 |
index | 标识符 |
+ | 加号 |
4 | 数字 |
) | 右圆括号 |
* | 乘号 |
( | 左圆括号 |
2 | 数字 |
+ | 加号 |
6 | 数字 |
) | 右圆括号 |
语法分析
语法分析器 yacc
根据字符分析的结果,建立一个语法树,一个树结构,树的每一个节点都是一个简单的不能在分割表达式
然后分析各个表达式是否符号规则,否则就报语法错误停止编译
网友评论