Skip to content

第一章 绪论

Giovanna

About 2335 wordsAbout 8 min

2024-06-22

一、语言的分类

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

动态绑定可读性差。

四、虚拟机

虚拟机:由软件实现的机器

image-20240622135141093

虚拟机与抽象机的差别:

  • 虚拟机是一台实际机器上配置某种软件扩大其功能而实现的
  • 抽象机仅仅是一个抽象模型,并不要求与之匹配的实际机器存在

五、程序单元相关的概念

  • 程序单元:程序执行过程中的独立调用单元;如:子程序、分程序、过程等
  • 单元的表示
    • 在编译时,单元表示是该单元的源程序
    • 运行时,单元表示由一个代码段和一个活动记录组成,称为单元实例
  • 活动记录:执行单元所需要的信息,以及该单元的局部变量所绑定的数据对象的存储区
  • 非局部变量:一个程序单元可以引用未被本单元说明而被其它单元说明的变量
  • 引用环境:局部变量+非局部变量
  • 别名:同一单元的引用环境中有两个变量
  • 副作用:对绑定于一个非局部变量的对象进行修改时,将产生副作用

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. 新一代程序设计语言

以抛弃冯·诺依曼模型为出发点

包括函数式,对象式,逻辑式程序设计语言