常用的高级语言
- FORTRAN —— 数值计算
- COBOL —— 事务处理
- PASCAL —— 结构程序设计(结构化设计成熟的标志)
- ADA —— 大型程序、嵌入式实时系统(支持抽象数据类型,但是非完全面向对象)
- LISP —— 函数式程序设计语言(人工智能使用较多)
- PROLOG —— 逻辑程序设计(人工智能使用较多)
- ALGOL —— 算法语言(结构化设计的萌芽)
- C/C++ —— 系统程序设计(过程式/面向对象)
- Java —— Internet 程序设计
"A language that doesn't affect the way you think about programming, is not worth knowing"—— Alan J. Perlis
(一个好的语言应该影响你的编程思想)
与机器语言或汇编语言比较,高级语言优点:
- 较接近于数学语言和工程语言,比较直观、自 然和易于理解
- 便于验证其正确性,易于改错
- 编写效率高
- 易于移植(抽象程度较高,因而较容易移植)
程序语言的定义
语法
程序本质上是一定字符集上的字符串。
语法则是一组规则,用它可以形成和产生一个合式 (well-formed) 的程序(合式:形式结构。形式上的规则,形式上结构的规定)
语法规则和词法规则定义了程序的形式结构。
词法规则
单词符号的形成规则。
单词符号是语言中具有独立意义的最基本结构,包括
- 常数、标识符、基本字、算符、界符......
描述工具:有限自动机
语法规则
语法单位的形成规则,包括:
- 表达式->语句->分程序->过程、函 数(子程序)->类->程序......
描述工具:上下文无关文法
比如:
while结构的写法是语法。
while结构各个部分作用以及怎么执行是语义。
定义语法单位的意义属于语义问题。
语义
一组规则,用它可以定义一个程序的意义
描述方法
自然描述:
会有隐藏错误、二义性和不完整性
形式描述:
- 操作语义 (PL/1)
- 指称语义 (ADA)
- 代数语义 (PASCAL)
标识符与名字
标识符:以字母开头的,由字母数字组成的字符串
标识符与名字两者有本质区别:
- 标识符是语法概念
- 名字有确切的意义和属性
标识符绑定(binding)名字
名字(属于语义)
- 值:单元中的内容
- 属性:类型和作用域
名字的性质的说明方式
- 由说明语句来明确规定的(int a)
- 隐含说明(FORTRAN 以 I,J,K,…N 为首的名字代表整型 , 否则为实型)
- 动态确定(var a,auto a)
语用
(笔者未查到相关解释)
程序的层次结构
程序语言成分的逻辑和实现意义
分为两点,这也体现了计算思维与数学思维的不同
- 抽象的逻辑意义——数学意义
- 计算机实现意义——具体实现
高级语言的一般特性
高级语言的分类
强制式语言 / 过程式语言(Imperative Languge)
特点:命令驱动,面向语句。即程序是由一条一条的语句构成,且执行按照指令顺序一条一条的执行。比如:
- FORTRAN 、 C 、 Pascal , Ada
程序员需要对问题的解决方法给出详细的“描述”,这个“描述”就是程序。
应用式语言 (Applicative Language)
注重程序所表示的功能,而不是一个语句接一个语句地执行,比如:
- LISP 、 ML
更像是将问题的结构(特别是递归结构)“描述”出来,由解释器/虚拟机/推理机根据你的“描述”,进行推理匹配。
逻辑程序设计语言/基于规则的语言 ( Rule-based Language)
程序=一条条规则,规则=条件+动作
总是判断当前环境是否满足条件,满足则指向条件相应的动作
检测当前状况,匹配相应规则,然后再执行动作动作,比如:
- Prolog
面向对象语言 (Object-Oriented Language)
必须要有封装性、继承性和多态性,比如:
- Smalltalk , C++ , Java
程序结构
FORTRAN
- 一个程序由一个主程 序段和若干辅程序段 组成
- 辅程序段可以是子程 序、函数段或数据块
- 每个程序段有一系列 的说明语句和执行语 句组成,各段可以独 立编译
- 模块结构,没有嵌套 和递归
- 各程序段中的名字相 互独立,同一个标识 符在不同的程序段中 代表不同的名字
PASCAL
PASCAL 程序本身可以看成是一个操作系统所 调用的过程,过程可以嵌套和递归
Ada
引入了程序包(package)的概念,将数据和操作代码封装在一起,支持数据抽象。
程序分为:
- 可见规范说明部分,定义了程序保外可访问的对象
- 程序包体,它实际定义程序包的实现细节
Java
略
作用域
一个名字能被使用的区域范围称作这个名字的作用域
允许同一个标识符在不同过程中代表不同的名字
名字作用域规则 —— “最近嵌套原则”
最近嵌套原则
一个 在子程序 B1 中说 明的名字 X 只在 B1 中有效(局部于B1)
如果B2是B1的一个内层子程序且B2中对标识符X没有新的说明,则原来的名字X在B2中仍然有效
如果B2对X重新作了说 明,那 么,B2对X的任何引用都是指重新说明过的这个X
数据类型与操作
一个数据类型通常包括三种要素
- 属性:用于区别这种类型数据对象的属性
- 值:这种类型的数据对象可以具有的值
- 操作:可以作用于这种类型的数据对象的操作
初等数据类型
数值类型
- 整型、实型、复数、双精度
- 运算: + , - , * , / 等
逻辑类型
- true 、 false
- 布尔运算:& | ^(此处是C语言)等
字符类型:符号处理
指针类型
数据结构
数组
逻辑上看:同类型数据所组成的某种n维矩形结构,沿着每一维的距离,称为下标
数组可变与不变:编译时能否确定其存贮空间的大小
访问:给出数组名和下标值
存放方式:按行存放 , 按列存放
数组地址的计算
原本:
A数组的首地址为a,下标从1开始,A[i,j] 地址为:
a + (i-1) * 20 + (j-1)
推广:
A为n维数组,按行存放,每个元素宽度为w,A[i1,i2...ik] 地址为:
((…i1n2 + i2 )* n3 + i3 )…) * nk + ik ) * w +base - ((…((low1 * n2 + low2 ) * n3 + low3 )…) * nk +lowk ) * w
- lowi:为第 i 维的下界
- upi:为第 i 维的上界
- ni: 为第 i 维可取值的个数 (ni = upi - lowi + 1)
- base: 为 A 的第一个元素相对地址
- Con = ((…((low1 * n2 + low2 ) * n3 + low3 )…) * nk +lowk ) * w
内情向量:维数,各维的上、下限,首地址,以及数组 (元素)的类型。
记录
记录结构由已知类型的数据组合在一起的一种结构。它的数据类型不需要一致。
存储:一般来说,各种语言按照分量或域或字段的顺序连续存放。
域的地址的计算:先对于记录结构起点的相对数偏移。
字符串、表格、栈
字符串:符号处理、公式处理
表格:本质上是一种记录结构
线性表:一组顺序化的记录结构
栈:一种线性表,后进先出
抽象数据类型(Abstract Data Type)
一个抽象数据类型包括
- 数据对象的一个集合
- 作用于这些数据对象的抽象运算的集合
- 这种类型对象的封装,即,除了使用类型中所定义的运算外,用户不能对这些对象进行操作
语句与控制结构
表达式
表达式由运算量(也称操作数,即数据引用或 函数调用)和算符(操作符)组成
形式:中缀、前缀、后缀
X*Y -A P↑
表达式形成规则
算符的优先次序
一般规定依据数学上的优先次序。
- 代数性质能引用到什么程度视具体的语言不 同而不同
- 在数学上成立的代数性质在计算机上未必完全成立
语句
赋值语句
A := B(A = B)
大所属名字有两个值,不同。
名字左值(位于左侧):该名字代表的那个单元(地址)称为该名字的左值(所代表的存贮单元的地址)
名字右值(位于右侧):一个名字的值称为该名字的右值(所代表的存贮单元的内容)
注意:虽然大多数多有左右值,但一些语言成分只有右值没有左值
控制语句
无条件转移语句:goto 行号
循环语句:for;while;do until
条件语句:if,else if,else;switch
过程调用语句:call P(X1,X2...)
返回语句:return
说明语句
定义各种不同数据类型的变量或运算,定义名字的性质:typdef,#define,#ifndef,@Servlet(),@Autowired...
简单句和复合句
简单句:不包含其他语句成分的基本句
复合句:句中有句的语句