代码的编译过程

2020-06-10  本文已影响0人  和谐共处

预处理

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
根据字符分析的结果,建立一个语法树,一个树结构,树的每一个节点都是一个简单的不能在分割表达式
然后分析各个表达式是否符号规则,否则就报语法错误停止编译

以上代码的语法树
语法树
上一篇 下一篇

猜你喜欢

热点阅读