编译器行为(linux)

1、预处理(prepressing)

  · 将"#define","#if"等宏定义,条件编译指令展开

  · 删除注释"//"和'/**/'

  · 添加行号和文件名标识

  · 保留所有"#pragma"编译器指令

  · output: *.i

2、编译(compilation) ---- 核心 ---  as

  · 词法分析

  · 语法分析

  · 语义分析

  · 优化后生产相应的汇编代码

  · output: *.s

3、汇编

  · 根据汇编指令和机器指令的对照表一一进行翻译

  · output: *.o

4、链接

  · 链接所有*.o文件,生成可执行文件

  · output: *.out

-------------------------------------------------------------------------------------------------

编译过程分为6步:

  扫描 - 词法分析 - 语义分析 - 源代码分析 - 代码生成 - 目标代码优化

  

· 词法分析 --- 使用lex层序实现词法扫描

  运用一种类似于有限状态机(Finite State Machine)的算法将源代码的字符序列分割成一系列的记号(token),词法分析产生的几号一般可分为以下几类:关键字,标识符,字面量(包括数字,字符号等)和特殊符号(如加号,等号)

· 语法分析 --- 使用yacc (Yet Another Compiler Compliler)工具

  词法分析其(Grammar Parser)将由扫描器产生的记号进行词法分析,从而产生语法书(Synatax Tree),整个过程采用了上下文无关语法。

· 语义分析

  编译器所能分析的语义是“静态语义”(Static Sematic),即编译期间即可确定的语义,如声明,类型转换等。

· 中间语言生成

  源码级优化器(Source Code Optimizer),将语法树等转换为中间代码(Intermediate Code),如三址码(x = y op z)和p-代码,中间代码使编译器可以被分为前端和后端。编译器前端负责产生机器无关的中间代码,编译器后端将中间代码转换为目标代码。

· 目标代码生成与优化

  编译器后端主要包括代码生成器(Code Generator)与目标代码优化器(Target code Optimizer), 代码生成器将中间代码转换为目标机器代码。目标代码优化器对上述代码进行优化(比如选择合适的寻址方式,使用位移代替惩罚,删除多余指令等)。

  

原文地址:https://www.cnblogs.com/Eric-scratch-paper/p/5061953.html