第一章 引 论
1.1什么叫编译程序
源语言诸如Java、C等这样高级的语言,目标语言如汇编语言、或机器语言等“低级语言”,这样的一个程序是翻译程序。
专门用于帮助程序开发和调试的编译程序成为诊断编译程序,着重于提高目标代码的效率的编译程序称为优化编译程序。
运行编译程序产生目标代码的计算机称为宿主机,运行目标代码的主机称为目标机。
如果宿主机产生不同于宿主机的机器代码,则称它为交叉编译程序。
如果不需要诚谢编译程序中和机器无关的部分就能改变目标机,则该编译程序称为可变目标编译程序。
1.2编译程序过程概述
第一阶段:词法分析。
输入源程序对源程序的字符进行扫描和分解,识别出一个个单词,如基本字(begin、end、if等),标识符(I,Dog等),常数(100等),算符(+、-等)和界符(标点符号、括号等)。
描述词法规则的有效工具就是正则式和有限自动机(详情见接下来的笔记)
第二阶段:语法分析。
在词法分析的基础上,根据语言的语法规则,把单词的符号分解成各类语法单位如“短语”、“字句”、“字句”、“程序段”、“程序等”
语法规则通常采用上下文无关文法描述。
第三阶段:语义分析和中间代码的产生
对语法分析所识别出的各类语法语法范畴,分析其含义,并进行初步翻译(产生中间代码)。首先对语法范畴进行静态语义检查,例如变量是否定义,类型是否正确等。语义正确的话进行中间代码的翻译。
这一阶段所依循的是语言的语义规则。通常使用属性文法描述语义规则。
第四阶段:优化。
对前段产生的中间代码进行加工转换,以期在最后阶段能够产生搞笑的目标代码。
优化的主要方面有公共自表达式、提循环优化、删除无用代码等
第五阶段:目标代码生成。
把中间的代码变换成特定机器上的低级语言代码。有赖于硬件系统结构和机器指令的含义。
目标代码的形式可以是绝对的指令代码或可重定向的指令代码或者汇编指令代码。绝对指令代码可以直接执行,,汇编指令代码需要汇编器汇编之后方可运行。多数实用编译程序所产生的目标代码都是一种重定向的
指令代码。这种指令运行前必须借助于一个连接装配程序把各个目标模块连接在一起,确定程序变量在主存中的位置,装入内存中的指定起始位置,使之成为一个可运行的绝对的机器指令代码程序。
1.3编译程序的结构
1.3.1编译程序总框
语法分析器,又称扫描器,输入源程序,进行词法分析输出单词符号
语法分析器,简称分析器,对单词符号进行语法分析。
语法分析与中间代码扫描器,按照语义规则和语法分析器规约出的语法单位进行进行语义分析并把他们翻译成一定形式的中间代码。
优化器,对中间代码进行优化处理
目标代码生成器,把中间代码翻译成目标程序
1.3.2 表格与表格管理
登记源程序的各类信息和编译程序的进展情况。其中最重要的就是记录程序的每个名字和名字属性的符号表
1.3.3 出错处理
编译程序不仅能够对书写正确的程序进行翻译,而且还能对出现在源程序中的错误进行处理。如果源程序有错误,编译程序应设法发现错误,把有关错误信息发给用户。
1.3.4 遍
所谓遍就是对源程序的中间结果或源程序的中间结果从源到头扫描一次,并作有关的加工处理,生成新的中间结果或者目标代码。语法分析可以单独作为一遍,语法分析加词法分析合并为一遍等。
1.3.5 编译的前端和后端
前端主要包括与源语言有关的但是与目标主机无关的那部分,包括词法分析、语法分析、语义分析与中间代码的产生等,有的优化工作也在前端。后端包括编译程序中与目标机有关的那部分,比如优化和目标代码的生成等。
1.4 编译程序与程序设计环境
编译程序、连接程序、调试工具等于编译程序构成了程序设计环境。
第二章 高级语言及其语法的描述
2.1 程序语言的定义
程序语言主要由语义和语法两个方面定义。有事语言定义也包含语用的信息,语用主要是有关程序设计的和语言成分的使用方法,它使得语言的基本概念与语言的外界(数学概念或计算机的对象的操作)联系起来
2.1.1 语法
任何程序都可以看做是一定字符集上的一字符串(有限序列)。所谓的语言的语法是指这样的一组规则,用它可以形成和产生一个合理的程序。这些规则的一部分成为词法规则一部分称为语法规则。第三章的有限自动机和正规式理论是描述词法结构和进行语法分析的有效地工具。
2.1.2 语义
定义单词符号和语法单位的意义。所谓一个语言的语义是指这样一组规则,使用它可以定义一个程序的意义。这些规则称为语义规则。一个程序的层次结构如下
2.3 程序语言的语法描述
∑是一个有穷字母表,它的每一个元素称为一个符号。 ∑上的一个符号串是指由 ∑中的符号构成的一个有穷的序列。不包含任何符号的称为空字,记为ε。用 ∑*表示所有符号串全体,空字ε也包含其中。例如若 ∑={a,b},则 ∑*={ε,a,b,aa,ad,ba,aaa,...}.Φ表示不含任何元素的空集{}。
∑*的子集U和V的连接:
UV={αβ|αεU&βεV}
注意:一般UV≠VU,但是(UV)W=U(VW)
V自身的n次(连接)积计为:V^n=VV...V(n个) 规定V^0={ε} V^*=V^0UV^1UV^2U...
V^*是V的闭包,V^+=VV^*是V的正则闭包。
2.3.1 上下文无关文法
文法是描述语言的语法结构的