Appearance
第一章 绪论
一、语言的分类
1. 按照语言的基础理论
- 强制式语言(过程式语言)
- 基础:冯·诺依曼模型
- FORTRAN、PASCAL、ADA、C
- 面向驱动,面向语句,由系列的语句组成
- 函数式语言
- 基础:数学函数
- LISP、ML、ASL
- 注重程序表示的功能,而不是一个语句接一个语句的执行
- 从已有的函数出发构造更复杂的函数
- 逻辑式语言
- 基础:数理逻辑谓词演算
- PROLOG
- 检查一定条件,当满足时,则执行适当的动作
- 对象式语言
- SMALLTALK、C++、JAVA
- 封装性、继承性、多态性
2. 按照语言的发展进程
- 第一代语言:机器语言,依赖于机器指令系统
- 第二代语言:汇编语言,机器语言的符号化
- 第三代语言:通常的高级语言,也叫命令式语言,过程式语言
- 第四代语言:说明性语言,告诉机器做什么
Note
冯·诺依曼结构
- 特点
- 数据或指令以二进制形式存储
- “存储程序”的工作方式
- 程序顺序执行
- 存储器的内容可以修改
- 在命令式语言上的表现
- 变量:存储单元及它的名称由变量的概念来代替,可以代表一个或一组单元,可以修改
- 赋值:计算结果必须存储
- 重复:因语句顺序执行,指令存储在有限的存储器中,完成复杂计算时必须重复执行某些指令序列
二、一些概念
- 绑定:一个实体(或对象)与其某种属性建立起某种联系的过程,称为绑定
- 变量、子程序、语句等均为实体
- 属性:实体具有的特性
- 描述符:用以描述实体的属性的符号、语句或表格等(实体到属性的映像)
- 凡是在编译时能确定的特性,称为静态特性;若绑定在编译时完成,运行时不改变,称为静态绑定。
- e.g. FORTRAN的integer
- 凡是在运行时才能确定的属性,称为动态特性;若绑定在运行时完成,称为动态绑定。
- e.g. Pascal的integer
例:
- 动态数组:可改变数组大小或释放数组所占空间,如用变量或表达式指定上下界
- 静态数组:数组的维数和大小建立到运行结束的过程中不再改变,数组的属性有保留其值的存储区
三、变量
变量:对一个(或若干个)存储单元的抽象
赋值语句:修改存储单元内容的抽象
变量除了名字外,具有四个属性:作用域、生存期、值和类型
1. 作用域
可以访问该变量的程序范围。
- 静态作用域绑定:按照程序的语法结构定义变量的作用域
- 动态作用域绑定:按照程序的执行动态地定义变量的作用域
2. 生存期
一个存储区绑定于一个变量的时间区间。
- 数据对象:存储区和它保存的值
- 分配:变量获得存储区的活动
3. 值
变量对应存储区单元的内容。
主要问题:
- 匿名变量的访问通过指针实现
- 变量与它的值的绑定是动态的(可修改)
- 符号常量的值不能修改(冻结)
- 变量的初始化(先赋初值再引用原则):不初始化则出错、随机、缺省值0
4. 类型
变量的类型的绑定:
- 静态绑定:通过说明语句完成,如:Pascal、Fortran、C
- 动态绑定:执行时隐式说明,且动态变化,如:APL
Note
动态绑定可读性差。
四、虚拟机
虚拟机:由软件实现的机器
虚拟机与抽象机的差别:
- 虚拟机是一台实际机器上配置某种软件扩大其功能而实现的
- 抽象机仅仅是一个抽象模型,并不要求与之匹配的实际机器存在
五、程序单元相关的概念
- 程序单元:程序执行过程中的独立调用单元;如:子程序、分程序、过程等
- 单元的表示
- 在编译时,单元表示是该单元的源程序
- 运行时,单元表示由一个代码段和一个活动记录组成,称为单元实例
- 活动记录:执行单元所需要的信息,以及该单元的局部变量所绑定的数据对象的存储区
- 非局部变量:一个程序单元可以引用未被本单元说明而被其它单元说明的变量
- 引用环境:局部变量+非局部变量
- 别名:同一单元的引用环境中有两个变量
- 副作用:对绑定于一个非局部变量的对象进行修改时,将产生副作用
Note
程序单元可以递归激活,从而一个单元可以有很多个实例,但代码段相同,不同的仅仅是活动记录。
- 直接递归:一个程序自己调用自己
- 间接递归:一个程序单元调用别的程序单元,再由别的程序单元调用这个程序单元
六、程序设计语言发展简介(了解)
1. 早期的高级语言(50年代)
效率!计算机资源稀少而昂贵。
- FORTRAN语言
- 主要用于科学计算
- 子程序独立编译
- COMMON语句实现了模块之间的通信
- ALGOL60语言
- 主要用于科学计算
- 引入了分程序结构和递归过程
- 采用BNF形式描述语法
- COBOL语言
- 广泛应用于各种事务处理领域
- 引入了文件和数据描述
- 类自然语言程序描述
2. 早期的突破
效率。非冯·诺依曼模型,良好的数学基础。
- LISP语言
- 函数式语言
- 具有很强的符号处理能力
- 统一的数据结构(表)
- 数据和程序统一的表示方式
- 其基础是函数和函数作用
- APL语言
- 支持函数式程序设计风格
- 广泛应用于涉及大量矩阵运算的科学计算中
- 具有丰富的操作符
- SNOBOL语言
- 主要用于字符串处理
- 给出了一种与机器无关的宏功能,增强了程序可移植性
- 成功应用于文本处理
3. 概念的集成(64年)
- PL/1语言
- 所有语言概念之大全
- 分程序概念和递归过程
- 数据描述机能
- 动态数据结构
- 异常数据处理
- 多任务技能
- 可用于科学数值计算,数据处理和开发系统软件
- 没有(难以)得到广泛应用
4. 再一次突破(60年代后期)
正交性、协同程序、类
Note
- 并发:单处理器,两个或多个事件在同一时间间隔发生(同个实体上的多个事件)
- 并行:多处理器,两个或多个事件在同一时刻发生(不同实体上的多个事件)
- ALGOL 68
- 以零型文法描述
- 引入正交性和通用性规则
- SIMULA 67 68语言
- 应用于模拟领域
- 增加了一个特殊结构——协同程序(并行程序的萌芽)
- 引入了类的概念
- PASCAL语言
- 具有明显的简洁性
- 体现结构程序设计思想
- 具有用户自定义类型
- BASIC语言
- 简单易学
- 交互式工作环境
- 解释执行
5. 大量探索
支持软件工程,信息隐蔽,抽象数据类型,并行处理
- MODULA-2语言
- 支持模块结构,模块可以独立编译
- 面向实时系统和并行系统综合功能
- C语言
- CPL->BCPL->B->C
- 具有高级语言和低级语言的优点
- 应用于各种领域
6. Ada语言
- 面向专门领域的特殊要求
- 在PASCAL基础上引入了一个不大的,容易理解的概念集合
- 直接体现了许多现代软件设计方法学观念
- 提高了程序的可读性、可靠性、可维护性
7. 第四代语言
- 面向问题
- 表达力更强,使用更方便,更接近于问题的描述
- 着重关心的是“做什么”
例如,数据库查询语言SQL
8. 网络时代的语言
- JAVA语言
- 面向因特网
- 保留了C++语言的语法、类和继承等基本概念
- 其语法和语义比C++更合理
- C#语言
- 面向对象的编程语言
- 每个对象自动生成为一个COM对象,C#可以调用现有的无论由什么语言编写的COM对象
- Python语言
- 解释型语言,解释器易于扩展,可以使用C或C++扩展新的功能和数据类型
- 提供高级数据结构,简单有效地面向对象编程
- 可用于可定制化软件中的扩展程序语言,丰富的标准库提供了适用于各个主要系统平台地源码或机器码
9. 新一代程序设计语言
以抛弃冯·诺依曼模型为出发点
包括函数式,对象式,逻辑式程序设计语言