以下内容均由编译原理视角展开
高级程序语言概述
先介绍一些有代表性的程序设计语言
语言 | 特点 |
---|---|
FORTRAN | 数值计算 |
COBOL | 事务处理 |
Pascal | 结构化程序设计 |
Lisp | 函数式程序设计 |
Prolog | 逻辑程序设计 |
C | 系统程序设计 |
Smalltalk | 面向对象程序设计 |
Java | Internet应用、可移植性 |
Python | 解释型 |
更接近数学语言和工程语言
更直观、自然易于理解
编写效率高
易移植
程序语言的定义
- 语法
- 语义
- 语用(了解,编译原理弱相关)
语法
程序本质上是一定字符集上的字符串
语法:一组规则,用它可以形成和产生一个合式(well-formed,一定组织的,符合一定的规格和样式)的程序
- 词法规则:单词符号的形成规则(即哪些字符序列构成常数,哪些构成基本字,哪些作为算符),由有限自动机描述
- 语法规则:语法单位的形成规则(即表达式的构成、语句的构成、程序的构成),由上下文无关文法描述
语法单位:表达式、语句、分程序、过程、函数、程序等
语法规则和词法规则定义了程序的形式结构
定义语法单位的意义属于语义问题
如
E → i
//表达式(语法单位)E可以由串i(单词、语法单位)构成
//或者说一个变量名、一个标识符单独构成一个表达式
E → E+E
//表达式E可以由两个子表达式通过’+‘字符连接构成
//两个子表达式通过’+‘字符连接起来构成一个更大的表达式
E → E*E
//表达式E可以由两个子表达式通过’*‘字符连接构成
//两个子表达式通过’*'字符连接起来构成一个更大的表达式
注意这里没有把’*‘视为乘号,因为将’*'解释为算术乘法属于语义问题
E → (E)
//表达式E加上括号仍是表达式
语义
一组规则,用它定义一个程序的意义
描述方法
- 自然语言描述 有歧义,易隐藏错误,不完整性
- 形式描述 使用形式语义(了解,编译原理弱相关)
程序的这种层次结构使我们可以从对下层单位的理解逐步得到对上层单位的理解
程序语言成分具有逻辑意义(数学意义)和实现意义(计算机的具体实现)
实现意义与逻辑意义不一定完全一致
程序语言的功能:描述数据和对数据的运算
高级语言的一般特性
- 高级语言的分类
- 程序结构
- 数据结构与操作
- 语句与控制结构
高级语言的分类
强制式语言(Imperative Language)/命令式语言/过程式语言
代表:FORTRAN、C、Pascal
特性:命令驱动,面向语句。描述数据处理的每个步骤
应用式语言(Applicative Language)
代表:Lisp、ML
特性:注重程序所表示的功能,通过描述函数的构造来实现数据处理
基于规则的语言(Rule-based Language)
代表:Prolog
特性:检查一定的条件,满足值时进行适当动作
面向对象语言(Object-Oriented Language)
代表:Smalltalk、C++、Java
特性:封装、继承、多态
程序结构
FORTRAN
FORTRAN程序的主程序调用其他辅程序完成数据处理,模块不允许嵌套,如不允许递归、子程序中不允许定义函数。FORTRAN有明显的模块化程序设计的特点
Pascal
Pascal是模块化程序设计语言的代表
Pascal程序本身可以看成是一个操作系统调用的过程,过程可以嵌套和递归
Pascal中名字的作用域遵循最近嵌套原则
C语言类似
Java
- 类与对象
- 继承,封装,多态
数据结构与操作
数据类型
初等数字类型(基本数字类型)
(1)数值类型
- 整型、实型、复数…
- 运算:+、-、*、/、等
(2)逻辑类型 - true、false
- 布尔运算:与、或、非等
(3)字符类型:符号处理
(4)指针类型
标识符与名字
标识符是语法概念,名字是语义概念
标识符概念侧重描述标识符的构成形式,如字符串可以作为标识符,int、a
名字标识程序中的对象,具有语义,指代特定的内容
名字的绑定(binding)是指将标识符与所代表的程序数据或代码进行关联
静态绑定:编译时绑定。如int a;
动态绑定:运行时绑定。如Java中对象调用方法时进行的绑定
数据结构
数组
蓝色表达式值在编译时就可以确定,因此预先计算好
存储在以下内情向量表中
记录(结构)
字符串、表格、栈
抽象数据类型(ADT)
同数据结构中的ADT(数据定义+基本运算)
编程语言对抽象数据类型的支持
- Ada通过程序包(package)提供对数据封装的支持
- Java等OOP语言通过类(Class)对ADT提供支持
语句与控制结构
表达式
语句
通常高级程序设计语言具有以下种类的语句
语句的分类
按功能分类
- 执行语句:描述程序的动作
- 说明语句:定义各种不同数据类型的变量或运算,定义名字的性质
按形式分类
- 简单句:不包含其他语句成分的语句
A = B + C;
goto re: - 复合句:句中有句的语句
while( i >= 0 ) {
j = i * 10;
i++;
}
2019/1/11