一、程序设计语言和编译程序
1.计算机的指令系统
计算机所能执行的每一种操作称为一条指令,计算机能够执行的全部指令集合就是该计算机的指令系统。
指令格式:操作码 操作地址码
2.低级语言
(1)机器语言
二进制形式的指令序列称为某计算机的机器语言,也是计算机唯一能够直接识别并执行的语言。
优点:直接执行,速度快,资源占用少
缺点:可读性、可移植性差,编程繁杂
(2)汇编语言
用助记符代替机器语言的二进制指令
例如用“LOAD”代替“0000”,用“STORE”代替“0001”,……
显然,汇编语言比机器语言有了长足的进步。但仍存在以下缺点:
严重依赖目标机器;
不易开发、调试;
和自然语言表达习惯相去甚远,可读性差。
3.高级语言
高级语言已经从具体机器中抽象出来,摆脱了依赖具体机器的问题。
高级语言虽然更符合人类的思维习惯,但高级语言程序也必须**翻译(编译)**成最终能够直接执行的机器语言程序。而且,这个难度比汇编过程大很多。
4.程序设计语言的转换
(1)翻译
是指将某种语言的源程序,在不改变语义(逻辑上等价)的条件下,转换成另一种语言程序——目标语言程序
(2)编译
专指由高级语言程序一次性转换成低级语言程序,类似于全文翻译
(3)解释
接受某高级语言的一个语句输入,进行解释并控制计算机执行,得到这个语句的执行结果后,等待下一个语句的解释执行,执行过程中并不产生目标程序。类似于口译
5.不同高级语言程序的执行类型
(1)编译型
C、C++、Pascal、Delphi等:生成目标程序。
执行效率高 依赖编译器 跨平台性差
(2)解释型
BASIC、Unix的she11、网络浏览器(将HTML及Javascript等脚本程序解释执行)等;
执行效率较低 跨平台性好
(3)特殊型
Java:先编译成较低级的字节码程序,然后编译为机器语言程序。
6.编译型高级语言程序的阶段:
高级语言程序的执行通常分为两个阶段:编译阶段和运行阶段。
编译程序就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(如C语言下的exe)
高级语言程序的执行分为三个阶段的情况:编译阶段、汇编阶段和运行阶段。
二、编译程序的历史及发展(自学)
三、编译过程和编译程序结构
1.高级语言程序的编译过程
输入:源程序,输出:目标程序
(1)词法分析
任务:将源程序中的字符串变换成单词符号流
词法分析所遵循的是语言的构词规则
(2)语法分析
任务:根据语法规则,从单词符号串中识别出各种语法单位(如表达式、说明、程序段等),并检查语法结构的正确性。
语法分析遵循语言的语法规则,通常使用上下文无关文法
(3)语义分析和中间代码生成
任务:
1、对每种语法单位(范畴)进行静态语义审查(验证语法结构合法的程序是否真正有意义)
2、在语义检查正确的情况下进行中间代码的翻译
中间代码是介于高级语言语句和低级语言的指令之间的一种独立于具体硬件的记号系统,既有一定抽象,又与低级语言指令十分接近,因此转换成目标代码比较容易
中间代码的常用表示形式:四元式、三元式、间接三元式和逆波兰记号等(将在第四章介绍)
把语法单位翻译成中间代码,遵循语言的语义规则
(4)中间代码优化
任务:是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效(节省时间和空间)的目标代码
优化遵循等价变换规则
手段:删除冗余运算、删除无用赋值、合并已知量、循环优化等
(5)目标代码生成
任务:是把中间代码(或经优化处理之后)变换成特定机器上的机器语言代码或汇编语言代码,实现最终的翻译工作
该阶段的工作依赖硬件及其指令系统
(6)表格管理
编译程序过程中要记录变量名(存储分配、类型、作用域等)
如果是函数名(参数数量、类型,参数的传递方式、返回值类型等)
常量表、分程序入口表以及中间代码表等
编译程序的各个阶段需要构造、查找、更新变量和函数的信息,表格管理耗费了编译过程的绝大部分时间
因此,编译程序中必须有一个管理各种表格的程序
(7)出错处理
完整的编译程序应该能够定位和跟踪错误
能够捕获到各种词法、语法、语义错误,并定位错误的类型及出错位置
此外,为了尽可能多地发现错误,应在发现错误后还能继续编译下去,以便发现更多的错误
2.编译程序结构示意图(重点内容)
一个编译过程源程序可分为一遍、两遍或多遍完成,每一遍完成所规定的任务。
例如,第一遍只完成词法分析的任务,第二遍完成语法分析和语义加工工作并生成中间代码,第三遍再实现代码优化和目标代码生成。
但是多遍会导致编译目标程序效率的降低。
四、编译程序的开发
1.开发编译程序的要求
(1)开发人员要熟悉源程序语言
源程序语言的语法和语义有全面深入的理解
(2)对目标机器的环境有深入的研究
(3)确定编译程序的开发方案及方法
开发步骤(熟悉编译原理理论)
软件开发功底,保证编译程序的可读性与扩展性
(4)选择合适的编程语言
一般选择Pascal、C、Java和Ada等高级语言
2.编译程序的开发技术
(1)自编译
已有编译程序,用某种高级语言编写更强的编译程序-
(2)交叉编译
A机有编译程序,针对B机器,在A机上编写一个编译程序,使得B机器上的源代码可以被编译成目标程序-
(3)自展
用机器语言或汇编语言实现源语言子集(L0)的编译器TO,接着不断自编译进行扩展…直到源语言L/T-
(4)移植
修改基于A机器的编译程序,使得能够在B机器上顺利执行
3.编译程序的自动生成
有没有一种软件,可以自动生成高效的编译程序?
输入:源语言(如C语言)的语法:包括关键字、标识符的定义,各种语法结构等
输出:编译程序
当有一段源程序作为该编译程序的输入时,可以得到目标代码
现有的编译程序自动生成系统: JavaCC, Lex,YACC等
我们需要做的是尽可能提供完备、正确的语法描述和机器语言的描述
五、本章小结
掌握编译程序与高级程序设计语言的关系
掌握编译分为哪几个阶段
了解各个阶段完成的主要功能