1.编译程序基本原理
学习目标:
1.了解词法分析,记住词法分析总结部分,词法分析的输入和输出
2.掌握语法分析和语义分析的特征和输入输出的内容
3.了解目标代码生成
编译过程概述
编译程序的功能是把某些高级语言书写的源程序翻译成与之等价的目标程序(汇编语言或机器语言)。编译程序的工作分为6个阶段,如下图,在实际的编译器中会将其中某些阶段结合在一起进行处理。
下面简要介绍各阶段实现的主要功能
1.1词法分析
源程序可以简单地被看成一个多行的字符串。词法分析阶段是编译过程的第一个阶段,这个阶段的任务是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个"单词"符号。"单词"符号是程序设计语言的基本单位,如关键字(或称保留字),标识符,常熟,运算符和分隔符(如标点符号,左右括号)等。词法分析程序输出的"单词"常以二元组的方式输出,即单词种别和单词自身的值。
词法分析阶段过程依据的是语言的词法规则,即描述"单词"结构的规则。
词法分析总结:
输入:源程序
输出:记号流
词法分析阶段的主要作用是分析构成程序的字符及由字符按照构造规则构成的符号是否符合程序语言的规定
1.2语法分析
语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类词法单位,如"表达式","语句"和"程序"等。语法规则就是各类语法单位的构成规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。如果源程序中没有语法错误,语法分析后就能正确地构造出其语法树;否则指出语法错误,并给出相应的诊断信息
语法分析总结:
1.输入:记号流
2.输出:语法树(分析树)
3.作用:语法分析阶段的主要作用是对各条语句的结构进行合法性分析,分析源程序中的句子结构是否正确
1.3语义分析
语义分析阶段分析各语法结构的含义,检查源程序是否包含 静态语法 错误,并收集类型信息供后面的代码生成阶段使用。只有语法和语义都正确的源程序才能翻译成正确的目标代码
语义分析阶段的一个主要工作是进行类型分析和检查。程序设计语言中的一个数据类型一般包含两个方面的内容:类型的载体及其上的运算。例如:整除取余运算符只能对整型数据进行运算,若其运算对象中有浮点数就认为是类型不匹配错误。
在确认源程序的语法和语义之后,即可对其进行翻译并给出源程序的内部表示。对于声明语句,需要记录所遇到的符号的信息,所以应进行符号表的填查工作。
语义分析总结
1.输入:语法树
2.作用:语义分析阶段不能发现源程序中所有的语义错误,语义分析阶段可以发现静态语义错误,但是不能发现动态语义错误,动态语义错误只有运行时才能发现。
1.4目标代码生成
目标代码生成是编译器工作的最后一个阶段,这一阶段的任务是 把中间代码变换成特定机器上的绝对指令代码,可重定位的指令代码或汇编指令代码,这个阶段的工作与具体的机器密切相关。
寄存器的分配。由于访问寄存器的速度远远快于访问内存单元的速度,所以人们总是希望尽可能多地使用寄存器存储数据,而寄存器的个数是有限的,因此,如何分配及使用寄存器是目标代码生成时需要着重考虑的。
目标代码生成总结
目标代码生成阶段的工作与具体的机器密切相关,寄存器的分配工作处于代码生成阶段