编译概述
编译程序(编译器)将某种高级语言书写的源程序翻译成与之等价的目标程序(汇编语言或机器语言),然后在计算机上运行生成的目标程序。源程序与编译程序都不参加目标程序的执行过程。
编译过程
1.词法分析
输入源程序,对构成源程序的字符串从左到右(从前到后)逐个字符进行扫描,从中识别出一个个“单词”符号,删除无用信息。
符号是程序设计语言的基本单位,如关键字、标识符、常数、运算符、界符。词法分析输出的单词经常以二元组的方式输出,即单词种类与单词自身的值。描述词法规则通常使用正规式和有限自动机。
2.语法分析
以“单词符号”作为输入,分析单词符号串是否形成符合语法规则的语法单位。例如表达式、赋值、循环等。按照语法规则检查每条语句是否有正确的逻辑结构。
int a[5],b;//语句1
b=a*10; //语句2
在上面的例子中,语句1定义了整型数组a与整型变量b,语句二将数组地址与整型相乘赋值给b。语句二毫无疑问是错误的。数组地址无法赋值整型变量。
但是在语法分析阶段,这里只检查语法单位是否存在逻辑结构错误,例如for循环是否有循环体,if…else语句是否有括号等。
3.语义分析
语义分析的主要是审查源程序是否存在语义错误,并收集类型信息供后面的代码生成阶段使用。语义分析的主要工作是进行各类型的分析与检查,例如赋值语句右端与左端变量类型不匹配,除数为0等错误都是在语义分析阶段发现的。
只有语法与语义都正确的源程序才能翻译成正确的目标代码。
4.中间代码生成
中间代码是一种结构简单且含义明确的记号系统,可以有多种形式。中间代码
代码的方式与具体的方式无关