程序员自我修养-链接,装载与库 笔记

静态链接

编译和链接

1.预编译,编译,汇编,链接

2.编译器做了什么

  1. 词法分析,将源代码的字符序列分割成一系列的记号
  2. 语法分析,产生语法树
  3. 语义分析,经过该阶段后,整个语法树的表达式都被标识了类型。
    • 编译器所能分析的是静态语义,通常包括声明和类型的匹配,类型的转换。比如将一个浮点类型赋值给一个指针的时候,语义分析程序会发现这个类型不匹配,编译器将会报错。
    • 动态语义一般指在运行期出现的语义相关问题,比如将0作为除数是一个运行期语义错误。
  4. 中间语言生成
    源代码优化器将整个语法树转换成中间代码,其实它已经很接近目标代码了。但是它一般跟目标机器和运行时环境无关,比如它不包含数据的尺寸、变量地址和寄存器的名字等。中间代码有很多中类型,在不同的编译器中有着不同的形式,比较常见的有:三地址码和P-代码。
    中间代码使得编译器可以被分为前端和后端。编译器前端负责产生机器无关的中间代码,编译器后端将中间代码转换成目标机器代码。这样对于一些可以跨平台的编译器而言,它们可以针对不同的平台使用同一个前端和针对不同机器平台的数个后端。
  5. 目标代码生成与优化
    下面的过程都属于编译器后端。编译器后端主要包括代码生成器和目标代码优化器。
    代码生成器将中间代码转换成目标机器代码。

3.模块拼接-静态链接

符号:用来表示一个地址,这个地址可能是一段子程序(函数)的起始地址,也可以是一个变量的起始地址。
在一个程序被分割成多个模块以后,这些模块之间最后如何组合成一个单一的程序是必须解决的问题。模块之间如何组合的问题可以归结为模块之间如何通信的问题,最常见的属于静态语言的C/C++模块之间通信有两种方式,一种是模块间的函数调用,另一种是模块间的变量访问。函数访问须知道目标函数的地址,变量访问也须知道目标变量的地址,所以这两种方式都可以归结为一种方式,那就是模块间符号的引用。模块间依靠符号来通信类似于拼图版。即链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值