第二章 程序语言基础知识
程序语言概述
程序语言的基本概念
机器指令:计算机能识别的由0,1组成的机器指令程序,机器指令是最基本的计算机语言,其用于程序设计时效率低、程序可读性差、难以理解、难以修改和维护.
汇编指令:用符号表示的指令.汇编指令的集合叫汇编语言. 汇编语言和机器语言都称为低级语言.
由于计算机只能识别机器语言,所以高级程序语言需要翻译,而担任这一任务的程序称为”语言处理程序”,其翻译形式有:汇编、解释、编译.
如果源程序是用汇编语言编写的,则需要一个汇编程序将其翻译成目标程序后才能执行.如果源程序是用某种高级语言编写的,则需要对应的解释程序或编译程序对其进行翻译,然后才能在机器上运行.
编译程序:将源程序翻译成目标语言程序,然后在计算机上运行目标程序.
解释程序:或直接解释执行源程序,或将源程序翻译成某种中间代码然后再执行.
两种方式的区别:在编译方式下,将源程序翻译成独立保存的目标程序,机器上运行的是目标程序,源程序和编译程序不参与执行,而在解释方式下,不能生成独立的目标程序,解释程序和源程序(或中间代码)要参与到程序的运行中,运行程序的控制全在解释程序.
程序设计语言的定义:
语法:是指程序语言的基本符号组成程序中的各个语法成分(包括程序)的一组规则,包括由基本字符构成的符号(单词)书写规则的词法规则和由符号构成语法成分的语法规则
语义:是程序语言中按语法规则构成的各个语法成分的含义,可分为静态语义和动态语义.一个程序执行的效果说明了该程序的语义.
语用:表示了构成语言的各个记号和使用这的关系,涉及符号的来源、使用和影响.
程序设计语言的发展:
FORTRAN是第一个被广泛用来进行科学计算的高级语言.
ALGOL60 主导了20世纪60年代程序语言的发展.是一个分程序结构语言(使用begin和end来说明分程序的范围),分程序的结构可以按最近嵌套原则嵌套.
COBOL(commonbusiness oriented language):是一种面向事务的高级语言.1961年由美国数据系统语言协会公布,主要用于情报检索和商业数据处理.
PASCAL:是一种结构化程序设计语言,由瑞士苏黎世联邦工业大学的沃斯(N.Wirth)教授设计并于1971年正式发表.该语言是从ALGOL60衍生的,其将分程序和过程的两个概念统一为过程,过程可以嵌套和递归.
C语言是20世纪70年代初发展起来的一种通用程序设计语言.其允许程序员直接访问操作系统和底层硬件.
C++是在C语言的基础上于20世纪80年代发展起来的,主要是在C语言的基础上增加了类机制,使其成为一种面向对象的程序设计语言.
Java产生于20世纪90年代,其保留了C++的基本语法、类和继承等概念,也删掉了C++中的一些不好的特征.
PHP(HypertextPreprocessor) 是一种在服务端执行的、嵌入HTML文档的脚本语言.
Python:是一种面向对象的解释型设计语言.也是一种脚本语言
Delphi:shiBorland公司研制的可视化开发工具.其在Linux上的对应产品是Kylix
程序设计语言的分类:
命令式语言:基于动作,命令式语言族开始于FORTRAN,PASCAL和C语言体现了命令式程序的关键思想.结构化程序设计语言属于命令式程序语言类,PASCAL和C都是典型的结构化程序设计语言.
面向对象的程序设计语言:C++、java和smaltalk就是面向对象语言的代表.
函数式程序设计语言:
逻辑型程序设计语言:是一类以逻辑为基础的语言,其代表是建立在关系理论和一阶谓词理论基础上的PROLOG(programming in logic),PROLOG有很强的推理功能,适用于书写自动定理证明、专家系统和自然语言理解等问题的程序.
程序语言的基本成分
程序语言的基本成分包括数据、运算、控制和传输等.
数据成分:数据是程序操作的对象,具有存储类别(说明了数据在内存中的存储位置和生存周期)、类型(说明了数据占内存的大小和存放形式)、名称、作用域(生存的空间范围)和生成周期(生存的时间范围)等属性.
常量只有右值(值或内容,在程序运行过程中不可以改变右值),变量有右值和左值(存储单元);
全局量(分配的存储空间一般是不变的)和局部量(分配的存储单元是动态改变的);
基本数据类型、用户定义类型、构造类型及其他类型
运算成分:指明允许使用的运算符及运算规则.
控制成分:顺序/选择/循环结构
函数:函数定义/声明/调用(值调用和引用调用)
语言处理程序基础
语言处理程序是一类系统软件的总称,其主要作用是将高级语言或汇编语言编写的程序翻译成某种机器语言程序.主要分为汇编程序/翻译程序/解释程序.
汇编程序基本原理
汇编语言是为特定的计算机或计算机系统设计的面向机器的符号化的程序设计语言.
汇编语言源程序有:
指令语句:传送指令/算术运算指令/逻辑运算指令/移位指令/处理机控制指令,汇编后能产生机器代码
伪指令语句:指示汇编程序在汇编源程序时完成某些工作(如给变量分配空间),经汇编后不能产生机器码,其所指示的工作也是在汇编的时候完成的.
宏指令语句:宏的引用.
汇编程序:其功能是将汇编源程序翻译成机器指令程序,其基本工作是,将每条可执行的汇编语句转换成对应的机器指令,处理源程序中出现的伪指令.一般需要两次扫描源程序才能完成翻译工作:
第一次扫描:定义符号的值并创建一个符号表ST,ST记录了汇编是所遇到的符号的值;对与定义符号值有关的伪指令进行处理.
第二次扫描:任务是产生目标程序,将机器指令助记符转换成二进制机器指令操作码,求出操作数区个操作数的值.
编译程序基本原理
编译程序的功能是把某高级语言书写的源程序翻译成与之等价的目标程序.其过程分为:
词法分析:是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个”单词”符号,”单词”符号是程序设计语言的基本单位,词法分析过程依据的是语言的词法规则.
语法分析:在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,以确定整个输入串是否构成一个语法上正确的程序.如没有语法错误,就能正确地构造出其语法树,否则就指出语法错误. 词法分析和语法分析本质上都是对源程序的结构进行分析.
词法规则可用3型文法(正规文法)或正规表达式描述,
正规表达式和正规集:
有限自动机:是一种识别装置的抽象概念,能准确地识别正规集,分为确定的有限自动机(Deterministic Finite Automata DFA)和不确定的有限自动机.
语义分析:分析各语法结构的含义,检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段.语义分析的一个主要任务是进行类型(类型上的载体及其上的运算)分析和检查.在确认源程序的语法和语义之后,就可以对齐进行翻译并给出源程序的内部表示,对于声明语句,应进行符号表的填查工作;对于执行语句,则检查结构合理的表达式是否有意义.
中间代码生成:根据语义分析的输出生成中间代码(与具体的机器无关).语义分析和中间代码生成所依据的语言的语义规则.
常用的中间代码有:
后缀式(逆波兰式):这种表示方法可以根据运算对象和算出现的次序进行计算,不需要括号,也便于用栈实现.
三元式:
四元式:
树:
代码优化:优化过程可以再中间代码生成阶段进行,也可以在目标代码生成阶段进行,中间代码的优化是建立在对程序的控制流和数据流分析的基础上,依据的是程序的等价变换规则.
目标代码生成:把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码,这个阶段的工作与具体的机器密切相关.
符号表管理:符号表的建立可以开始于词法分析阶段,也可以在语法和语义分析阶段,但符号表的使用有时会延续到目标代码的运行阶段.
出错处理:动态(语义)错误发生在程序运行时,静态错误是指在编译阶段发现的程序错误,包括语法错误和静态语义错误.在编译时发现程序中的错误后,编译程序应采用适当的策略修复它们.
文法和语言的形式描述:详见教程P68
所谓产生语言,是指制定出有限个规则,借助它们就能产生此语言的全部句子.
描述语言语法结构的形式规则称为文法.
文法分为0型/1型/2型/3型.0型文法也称短语文法,其能力相当于图灵机,任何0型语言都是递归可枚举的,反之亦成立,1型文法称为上下文有关文法,2型文法是上下文无关文法,3型文法等价于正规式,被称为正规文法或线性文法
推导与直接推导/规约与直接规约/句型和句子/语言
解释程序基本原理
解释程序通常可以分成两个部分:分析部分和解释部分.
编译比解释方式可能取得更高的效率,但是解释方式具有更好的灵活性和移植性.