计算机编译程序的基本过程
编译程序是将高级语言的源程序翻译成与之等价的目标程序(汇编语言或机器语言)
1:词法分析
词法分析的任务就是把源程序构成的字符串转换成单词序号序列.如:标识符,常数,关键字,运算符,分界符等.
词法分析用到有限自动机的方法去处理.
有限状态自动机所接受的语言就是正规语言.使用正规表示是表达.
2:语法分析
语法分析的任务就是在词法分析的基础上,根据语言的规则将单词符号的序列转换成各类语法单位,如"表达式","语句","程序"等.语法规则就是各类语法单位构成的规则,通过分析确定输入串是否构成一个语法上正确的程序.如果源程序没有错误,就构造其语法树,否则指出语法错误,给出诊断信息.
语法分析用到下推自动机处理.
下推自动机除了有限状态自动机以外,还包括一个长度不受限制的栈.下推自动机把有限状态自动机扩展为可以存取一个栈.
下推自动机定义:
下推自动机 M 是如下的一个七元组 ( Q, Σ, Γ, δ, q0, Z0,F ) ,其中:
*Q 是一个有穷状态集合;
* Σ 是一个字母表,称为输入字母表。
* Γ 是一个字母表,称为栈字母表。
*q0 属于 Q ,是初始状态。
* Z0 属于 Γ ,是一个特殊的栈符号,称为栈起始符号。
*F 包含于 Q ,是终结状态集合。
* δ : Q×(Σ∪{ε})×Γ -> Q×Γ* 是 M 的动作函数。
3:语义分析阶段
主要检查程序是否包含语义错误,并收集类型信息供后面代码生成阶段使用.主要进行类型分析检查.比如整除只能对整数数据进行.
4:中间代码生成
虽然编译程序可以直接把一个源程序翻译成目标程序,但是很多编译系统的设计中采取独立与机器的代码过度.便于编译系统的建立和移植,优化.常见代码有:语法树,后缀式,三地址代码.
后缀式就是表达式的后缀表达式.也叫逆波兰式.
三地址式就四元式.
5:代码优化
中间代码在时间和空间上往往有很大的浪费.当需要生成高效的目标代码时,就需要优化.优化往往在中间代码优化,对程序的控制流和数据流进行优化.
6:目标代码生成
将中间代码变成机器指令代码,或汇编指令代码.
7:符号表管理
符号表的作用是记录目标程序中的符号必要信息,以辅助语义的正确性检查和代码生成,在编译过程需要对符号表进行快速的查找,插入,删除,修改操作.可以在词法分析阶段开始,可以放放到语法分析和语义分析阶段.
一直延续到目标代码生成
8:出错处理
错误分类:
静态错误:是编译阶段发现的程序错误,分为语法错误,和静态语义错误.如单词拼写错误,标点符号错误,表达式缺少操作符等.
动态错误:又指动态语义错误,逻辑错误.发生在运行阶段,例如数组下标越界等.
编译器发现错误后,采取适当策略修复它们,时的分析错误继续下去,以便找出更多错误.