链接、装载与库学习笔记(一、编译)
2012-07-20 23:48
387 查看
编译分为4个步骤:预处理(prepressing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。
其中编译有5个步骤:词法分析、语法分析、语义分析、中间语言生成、目标代码生成与优化。
例:array[index] = (index + 4) * (2 + 6)
1、词法分析:将源代码的字符序列分隔成一系列记号。28个非空字符,产生了16个记号。
2、语法分析:由语法分析器生成语法树(以表达式为节点的树)。
3、语义分析:静态语义分析,对语法树上的节点标明类型。动态语义是在运行时才能确定的语义。
4、中间语言生成:产生与机器无关的中间代码,(不包含数据的尺寸、变量地址和寄存器名字等),同时可以做源码级的优化。
中间代码的形式:三地址码。 x = y op z
例子翻译后:t1 = 2 + 6
t2 = index + 4
t3 = t2 * t1
array[index] = t3
优化一下: t2 = index + 4
t2 = t2 * 8
array[index] = t2
5、目标代码的生成及优化:依赖于目标机器,转换成目标机器代码。(不同的字长、寄存器、整数、浮点数数据类型)
movl index, %ecx ;value of index to ecx
addl $4, %ecx ;ecx = ecx + 4
mull $8, %ecx ;ecx = ecx * 8
movl index, %eax ;value of index to eax
movl %ecx, array(,eax,4) ;array[index] = ecx
目标代码优化器进行优化,选择合适的寻址方式、使用位移代替乘法运算、删除多余指令等。
movl index, %edx
leal 32(,%edx,8), %eax
movl %eax, array(,%edx,4)
最后,如果index和array定义在跟例子中的源代码同一个编译单元里,那么编译器可以为index和array分配空间,确定他们的地址。
如果定义在其他模块,就需要在链接时确定地址。
其中编译有5个步骤:词法分析、语法分析、语义分析、中间语言生成、目标代码生成与优化。
例:array[index] = (index + 4) * (2 + 6)
1、词法分析:将源代码的字符序列分隔成一系列记号。28个非空字符,产生了16个记号。
记号 | 类型 |
array | 标识符 |
[ | 左方括号 |
index | 标识符 |
] | 右方括号 |
= | 赋值 |
( | 左圆括号 |
index | 标识符 |
+ | 加号 |
4 | 数字 |
) | 右圆括号 |
* | 乘号 |
( | 左圆括号 |
2 | 数字 |
+ | 加号 |
6 | 数字 |
) | 右圆括号 |
3、语义分析:静态语义分析,对语法树上的节点标明类型。动态语义是在运行时才能确定的语义。
4、中间语言生成:产生与机器无关的中间代码,(不包含数据的尺寸、变量地址和寄存器名字等),同时可以做源码级的优化。
中间代码的形式:三地址码。 x = y op z
例子翻译后:t1 = 2 + 6
t2 = index + 4
t3 = t2 * t1
array[index] = t3
优化一下: t2 = index + 4
t2 = t2 * 8
array[index] = t2
5、目标代码的生成及优化:依赖于目标机器,转换成目标机器代码。(不同的字长、寄存器、整数、浮点数数据类型)
movl index, %ecx ;value of index to ecx
addl $4, %ecx ;ecx = ecx + 4
mull $8, %ecx ;ecx = ecx * 8
movl index, %eax ;value of index to eax
movl %ecx, array(,eax,4) ;array[index] = ecx
目标代码优化器进行优化,选择合适的寻址方式、使用位移代替乘法运算、删除多余指令等。
movl index, %edx
leal 32(,%edx,8), %eax
movl %eax, array(,%edx,4)
最后,如果index和array定义在跟例子中的源代码同一个编译单元里,那么编译器可以为index和array分配空间,确定他们的地址。
如果定义在其他模块,就需要在链接时确定地址。
相关文章推荐
- 编译、链接学习笔记(四)进程装载
- TQ2440 学习笔记—— 29、移植U-Boot【U-Boot 的编译、链接过程】
- 自己在linux上编译、链接、动态库和静态库的学习笔记
- C和指针 学习笔记-1.编译与链接
- C++学习笔记(1)--《程序员的自我修养--链接、装载、库》笔记
- 菜鸟C++精髓学习笔记--C++程序内部执行过程(预处理、编译、链接过程的作用)
- 编译、链接学习笔记(五)动态链接
- linux学习笔记一, c语言程序的编译链接
- 自己在linux上编译、链接、动态库和静态库的学习笔记
- Mohican_2/4 链接,装载与库 学习笔记— 温故而知新 计算机硬件基本结构
- 程序员的自我修养-编译,链接和库--学习笔记
- “程序员自我修养”学习笔记---编译链接
- 自己在linux上编译、链接、动态库和静态库的学习笔记
- (编译-链接)-C语言学习笔记1
- 《程序员的自我修养--链接、装载与库》笔记--第二章 编译和链接
- 学习笔记之编译和链接
- linux下使用eclipse编译、链接、动态库的学习笔记
- 编译、链接学习笔记(三)静态链接
- Linux下编译环境及Makefile的学习笔记
- 学习编译和链接原理的例子,搞懂了函数调用