编译原理篇
前言:
第一次接触编译原理,第一次使用MARKDOWN格式写东西,这也是我的第一篇博客。虽然看书没有看太懂,但是还是想把自己学习到的留下来,使用一下markdown算是一个小小的开始,希望在日后的学习中能够更加透彻的理解编译原理,能够回来进行一个小小的完善和补充。这里仅打出编译原理的框架。
一串代码从编辑到执行经历了什么
分步解答
预编译
$gcc -E hello.c -o hello.i //预编译将.c文件编译为.i文件
简单的将预编译理解为源码文本的替换
编译
$gcc -S hello.i -o hello.s //预编译将.i文件编译为.s文件
词法分析
- 扫描
- 词法记号
- 有限自动机
- 解析器
- 错误处理
语法分析
- 文法定义
- 递归下降子程序
- 错误处理
符号表管理
- 符号表数据结构
- 作用域管理
- 变量管理
- 函数管理
语义分析
- 声明于定义语义检查
- 表达式语义检查
- 语句语义检查
- 错误处理
代码生成
- 中间代码生成
- 程序运行时储存
- 函数定义与return语句翻译
- 表达式翻译
- 复合语句与break、continue、语句翻译
- 目标代码生成
- 数据段生成
编译优化
- 数据流分析
- 流图
- 数据流分析框架
- 中间代码优化
- 常量传播
- 复写传播
- 死代码消除
- 寄存器分配
- 图着色算法
- 变量帧偏移计算
- 窥孔优化
汇编
词法分析
语法分析
符号表管理
表信息生成
指令生成
目标文件生成
链接
信息收集
地址空间分配
符号解析
重定位
程序入口点与运行时库
可执行文件生成
结语
其实我觉得markdown也是基于这一套编译流程的语言,只不过针对性比较强。行了我不瞎说了,先这样吧。今天回去睡觉,明天再做补充。国庆快乐。