编译过程简述

  • 编译过程
    • 词法分析
      • 首先源代码程序被输入到扫描器,扫描器的任务很简单,它只是简单地进行词法分析,运用一种类似于有限状态机的算法可以很轻松地将源代码的字符序列分割成一系列的记号(Token)
    • 语法分析
      • 语法分析器将对由扫描器产生的记号进行语法分析,从而产生语法树。整个分析过程采用了上下文无关语法的分析手段。如果你对上下文无关语法及下推自动机熟悉,那么应该很好理解。否则,可以参考一些计算理论的资料,一般都会有很详细的介绍。由语法分析器生成的语法树就是以表达式为节点的树。
    • 语义分析
      • 语义分析由语义分析器来完成。语法分析仅仅是完成了对表达式的语法层面的分析,但是它并不了解这个语句是否真正有意义。比如C语言里面两个指针做乘法运算是没有意义的,但是这个语句在语法上是合法的;比如同样一个指针和一个浮点数做乘法运算是否合法等。编译器所能分析的语义是静态语义,所谓静态语义是指编译器可以确定的语义,与之对应的动态语义。
      • 静态语义通常包括声明和类型的匹配,类型的转换。比如当一个浮点型的表达式赋值给一个整数的表达式时,其中隐含了一个浮点型到整型的转换的过程,语义分析过程中需要完成这个步骤。比如将一个浮点型赋值给一个指针的时候,语义分析程序会发现这个类型不匹配,编译器将会报错。动态语义一般指在运行期出现的语义相关问题,比如将0作为除数是一个运行期语义错误。
      • 经过语义分析阶段以后,整个语法树的表达式都被标识了类型,如果有些类型需要做隐式转换,语义分析程序会在语法书中插入相应的转换节点。
    • 中间语言生成
      • 现代的编译器有着很多层次的优化,往往在源代码级别会有一个优化过程。源代码级优化器在不同编译器中可能会有不同的定义或有一些其他的差异。源代码级优化器会在源代码级别进行优化。
    • 目标代码生成与优化
      • 源代码级优化器产生中间代码标志着下面的过程都属于编译器后端。编译器后端主要包括代码生成器和目标代码优化器。
  • 静态链接
    • 链接过程
      • 链接过程主要包括了地址和空间分配、符号决议和重定位等这些步骤。
      • 符号决议有时候也被叫做符号绑定、名称绑定的,大体上它们的意思都一样,但从细节角度来区分,它们之间存在一定区别的,比如“决议”更倾向于静态链接,而“绑定”更倾向于动态链接,即它们所使用的范围不一样。在静态链接,我们将统一称为符号决议。
      • 最基本的静态链接,每个模块的源代码文件(如.c)文件经过编译器编译成目标文件(Object file,一般扩展名为.o或.obj),目标文件和库一起链接形成最终可以执行文件。而最常见的库就是运行时库(Runtime Library),它是支持程序运行的基本函数的集合。库其实是一组目标文件的包,就是一些最常见的代码编译成目标文件后打包存放。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值