1. 计算机语言的组成
- 计算机语言主要由一套指令组成。这种指令包括如下三大部分内容
- 表达式:又包含变量、常量、字面量和运算符。
- 流程控制:有分支、循环、函数和异常
- 集合:包括字符串、数组、散列表等数据结构
2. 计算机语言的分类
- 早期:机器语言、汇编语言和高级语言
- 近年来:涌现出了众多其他语言,如:建模语言、形式化语言
2.1 机器语言
- 机器语言:所有指令的集合称为指令系统,也就是机器语言。
- 优点:是可以被计算机直接理解和执行,执行速度快、占用内存少
- 缺点
- 编程烦琐,且不易学、不易记、不易用、不易调试和维护
- 每台计算机的指令系统往往各不相同,造成了重复编程工作
2.1.1 指令组成
- 操作码
- 作用:用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等)
- 长度:取决于指令系统中的指令条数
- 地址码:
- 作用:描述该指令的操作对象
- 包含:
- 操作数的地址
- 操作结果的存储地址
- 下条指令的地址
大多数指令按顺序依次从主存中取出执行,只有在遇到转移指令时,程序指令的执行顺序才会改变。
2.1.2 指令的压缩
- 用一个程序计数器(Program Counter,PC)存放指令地址
- 每执行一条指令PC 的指令地址就自动 +1
- 当遇到执行转移指令时,则用转移地址修改PC 的内容
2.1.3 常见指令格式
- 三地址指令
- A1、A2分别确定第1、第 2操作数地址
- A3 确定结果地址
- 下一条指令的地址通常由程序计数器按顺序给出
- 二地址指令
- A1确定第 1操作数地址
- A2 同时确定第 2操作数地址和结果地址
- 单地址指令
- 地址域中 A 确定第 1 操作数地址
- 固定使用某个寄存器存放第 2 操作数和操作结果
- 零地址指令
- 应用:堆栈型计算机中常用,只有操作码而没有地址域
- 操作数一般存放在堆栈顶的两个单元中
- 结果又放入栈顶
- 可变地址数指令
- 地址域所涉及的地址的数量随操作定义而改变
2.2 汇编语言
2.2.1 概述
- 汇编语言:
- 是机器语言的符号化描述,
- 仍是面向机器的程序设计语言
- 汇编程序:将汇编语言翻译成二进制的机器语言
- 缺点:依赖于机器硬件,通用性差,要求设计人员详细了解硬件结构。
- 优点:效率高,程序精炼且质量高
2.2.2 汇编语言的语句
语句(Statements)是汇编语言程序的基本组成单位。在汇编语言源程序中有3 种语句:
-
指令语句
- 指令是汇编语言中用于控制计算机硬件执行具体操作的基本单位。
- 指令通常对应着机器语言中的一条具体命令,用于执行算术运算、逻辑运算、数据传输、控制流等操作。
- 常见的汇编指令包括:MOV(数据传送)、ADD(加法)、SUB(减法)、JMP(无条件跳转)等。
- 指令在执行时会转化为机器码,由CPU直接执行。
-
伪指令语句
- 伪指令不是真正的机器指令,而是用于告诉汇编器如何汇编程序的一些指示或命令。
- 伪指令在汇编过程中起作用,但不会被翻译成机器码执行。它们主要用于定义变量、分配存储空间、设置程序段等。
- 常见的伪指令包括:ORG(设置程序的起始地址)、DB(定义字节)、DW(定义字)、EQU(等值定义)等。
- 伪指令还可以用于条件汇编、宏定义等高级功能,提高程序的可读性和可维护性。
-
宏指令语句
- 允许将一组频繁使用的指令或操作定义为一个单独的宏
- 在程序运行时,当遇到这个宏时,就会自动展开并执行其中包含的具体指令序列
2.2.3 指令语句格式
- 语法
[标签:] 操作码 [操作数] [,操作数]... [;注释]
- 说明:
- 标签(Label):可选,用于标识指令的地址,便于跳转和引用。
- 操作码(Opcode):是指令的助记符,如 MOV, ADD, SUB 等,代表要执行的操作。
- 操作数(Operand):指定了指令操作的对象,可以是寄存器、内存地址或立即数等。
- 注释(Comment):以分号(;)开始,用于解释代码的功能或提供其他信息,汇编器会忽略注释部分。
教材原文第一个字段叫名字而不是标签,我们一般不这么叫,因为它确实是标签而不是指令的名字,但是如果考试要知道。
- 示例:
MOV AX, BX ; 将BX寄存器的内容移动到AX寄存器中
2.2.4 伪指令语句格式
- 语法
[标签:] 伪指令助记符 [参数] [,参数]... [;注释]
- 说明:
- 伪指令助记符:如 DB, DW, ORG, EQU 等,表示要执行的汇编器指令
- 参数:根据伪指令的不同,可能需要提供不同的参数,如数据值、地址表达式等
- 示例
DATA_SEG SEGMENT ; 定义一个名为DATA_SEG的段
VAR1 DB 0 ; 在DATA_SEG段中定义一个字节变量VAR1并初始化为0
VAR2 DW 1234H ; 在DATA_SEG段中定义一个字变量VAR2并初始化为1234H
DATA_SEG ENDS ; 结束DATA_SEG段的定义
2.3 高级语言
- 高级语言的优点
- 比汇编语言更贴近于人类使用的语言,易于理解、记忆和使用
- 高级语言和计算机的架构、指令集无关,因此它具有良好的可移植性
2.3.1 C语言
- 历史(简单了解)
- 20世纪70年代由美国 Bell实验室为描述UNIX操作系统而开发的一种系统描述语言
- 美国国家标准学会 (ANSI)于1989年发布了第1个完整的C语言标准,称为ANSIC标准,简称C89
- 1990年 C89 ISO,称为ISO/EC 9899:1990(简称为C90)标准
- 以后的版本如C11、C18
- 特点:同时具有汇编语言和高级语言的优点
- 具有高级语言的特点: 语言简洁紧凑,使用方便灵活,运算符极其丰富,可移植性好
- 具有汇编语言的特点:可以直接操作硬件,生成的目标代码质量高,程序执行效率高
2.3.2 C++
- 历史(了解即可)
- 美国Bell 实验室于1980年开始对C语言进行改进和扩充,引入面向对象程序设计思想,并于 1983年将这个扩充的C语言正式命名为C++
- ANSI和ISO一起于1998年正式发布了C++语言的第1个国际标准ISO/IEC 14882:1998(简称为C++98)
- 以后的版本:C++11、C++17、C++20
- 特点:
- 保持了C语言简洁、高效、可取代汇编语言
- 在模块化结构的基础上增加了对
面向对象
程序设计的支持
2.3.3 Java
- 历史(了解即可)
- 1991年美国SUN 公司提出
- 特点:
- 纯面向对象
- 不容易崩溃
- 跨平台
2.3.4 Python
- 历史:
- 1989年由荷兰人吉多·范罗苏姆设计
- 1991年公开发布了 Python 的第1个版本。
- 特点:
- 是一种结合了解释性、编译性、互动性、面向对象的
脚本语言
- 纯粹的自由软件,简洁、易学、易读、易维护、可移植、可嵌入
- 具有强大的标准库
- 是一种结合了解释性、编译性、互动性、面向对象的
- 应用: Web 应用、科学计算、大数据分析处理等
2.4 建模语言
2.4.1 UML的发展历史
2.4.2 UML 组成要素
- 视图(View):
- 是表达系统的某一方面的特征的UML建模元素的子集
- 由多个图构成。
- 是在某一个抽象层上,对系统的抽象表示
- 图(Diagram):
- 模型元素集的图形表示,通常是由弧(关系)和顶点(其他模型元素)相互连接构成的。
- 包括:用例图、类图、对象图、活动图、状态图、序列图、协作图、构件图、部署图等
- 模型元素(Model Element):
- 代表面向对象中的类、对象、消息、关系等概念,是构成图的最基本的常用概念。
- 包括:结构模型元素(如类、接口、用例等)、行为模型元素等
- 通用机制(General Mechanism):
- 用于表示其他信息,如注释、模型元素的语义等
2.4.3 4种事物
1)结构事物
- 概念:是UML模型的
静态部分
,描述概念或物理元素 - 包括:类(Class)、接口 (Interface)、协作 (Collaboration)、用例(UseCase)、主动类(Active Class)、构件(Component)、制品 (Artifac)、结点 (Node)
2)行为事物
- 概念:行为事物是UML模型的
动态部分
,描述了跨越时间和空间的行为 - 包括:
- 交互(Interaction)
- 状态机(State Machine)
- 描述了一个对象或一个交互在生命期内响应事件所经历的状态序列
- 状态机涉及其他元素:状态、转换 、事件、活动(对一个转换的响应)
- 图形:圆角矩形(图形中含有状态的名称及其子状态)
- 活动 (Activity)
- 概述:描述计算机过程执行的步骤序列,注重步骤之间的流(而不是哪些对象执行哪些步骤)
- 图形:圆角矩形(图形内指明用途的名字)
- 区分状态和动作:通过不同的语境
3)分组事物
- 概念:分组事物是UML 模型的
组织部分
,是一些由模型分解成的“盒子”。 - 包 (Package):把元素组织成组的机制,是最主要的分组事务
4)注释事物
- 概念:注释事物是UML 模型的
解释部分
,用来描述、说明和标注模型的任何元素
2.4.4 四种关系
教材虽然是2022年出的,但本章内容实在太老,我姑且安装教材整理,对UML关系感兴趣的可以参照我的另一篇笔记《类图的6中关系和golang中的应用》
1)依赖
- 概念:其中一个事物发生变化会影响另一个事物的语义
- 图形:有方向的虚线,如图 2-29 所示
2)关联
-
概念:一种结构化的关系,表示一类对象与另一类对象之间有联系
-
聚集(聚合):是一种特殊的关联,是一种弱的拥有关系,描述了群体和个体,不要求个体和群体有同样的生命周期
- 如:一堆苹果是由许多苹果组成
- 如:一堆苹果是由许多苹果组成
-
组合:是一种特殊的关联,是一种强拥有关系,描述了整体和部分的关系,要求整体和部分拥有同样的生命周期
- 如:头、躯干等组成了身体
- 图形:这个教材中没有,类似聚合,但是实心菱形箭头
3)泛化
- 概念:特殊元素对象可替代一般元素对象,即子类可替代父类
教材原文:特殊元素 (子元素)的对象可替代一般元素(父元素)的对象
- 图形:带有空心箭头的实线,它指向父元素
4)实现
- 概念:一个类规定了另一个类必须履行的约定,以确保其功能得到正确实现。
教材原文:一个类元指定了由另一个类元保证执行的契约
- 2种使用情况:接口和实现(接口规定了实现必须履行的约定)、用例和实现之间
- 图形:一条带有空心箭头的虚线
2.4.5 UML中的图
UML 2.0提供了13 种图:
- 用例图(Use Case Diagram)
从用户角度描述系统功能,展示系统外部的各类执行者与系统提供的各种用例之间的关系。
- 类图(Class Diagram)
描述系统中类的静态结构,包括类、接口、属性和操作,以及它们之间的关系。
- 对象图(Object Diagram)
展示系统中的多个对象在某一时刻的状态,是类图的实例,用来表达系统的静态数据结构。
- 状态图(State Diagram)
描述一个状态机,由状态、转移、事件和活动组成,展示对象在其生命周期内的状态变化。
- 活动图(Activity Diagram)
展示系统中各种活动的流程,特别是处理并发活动的情况,用于描述业务实现用例的工作流程。
- 顺序图(Sequence Diagram)
是一种交互图,展示对象之间的动态合作关系,强调对象之间消息发送的顺序,同时显示对象之间的交互。
- 通信图(Communication Diagram)
也是一种交互图,强调收发消息的对象或参与者的结构组织,它展示了对象之间如何通过消息进行通信。
- 构件图(Component Diagram)
描述系统中的组件、接口及其关系,展示系统的静态实现视图,通常用于表示系统的各个物理组件。
- 部署图(Deployment Diagram)
描述对运行时的处理节点及在其中生存的构件的配置,展示系统中软硬件的物理体系结构。
- 包图(Package Diagram)
对构成系统的模型元素进行分组整理的图,它可以帮助我们更好地组织和管理大型的UML模型。
- 组合结构图(Composite Structure Diagram)
表示类或者构建内部结构的图,它可以揭示类或组件的内部结构,包括端口、部件及其连接关系。
- 交互概览图(Interaction Overview Diagram)
用活动图来表示多个交互之间的控制关系的图,它可以帮助我们理解复杂的交互场景
- 定时图(Timing Diagram)
也是一种交互图,它强调消息跨越不同对象或参与者的实际时间
- 注意:序列图、通信图、交互概览图、计时图均被称为
交互图
2.4.6 用例图(Use Case Diagram)
- 概念:展现了一组用例、参与者 (Actor)以及它们之间的关系
- 作用:用于对系统的静态用例视图进行建模
- 用例图的关系:
- 包含关系:
- 两个或多个用例中共用一组相同的动作,这时可以将这组相同的动作抽出来作为一个独立的子用例
- 父用例每次执行都会调用子用例
- 泛化关系:子用例指向父用例,如:注册是通过微信注册的泛化。
- 扩展关系:扩展用例指向基用例,如:还款(基用例)和逾期罚息(扩展用例),还款不一定触发罚息。
- 包含关系:
- 教材上的示例:(举的比较烂,但毕竟是教材,了解一下不要深究)
- 建模方式
-
对系统的语境建模
- 目的:是明确系统与其外部环境的交互关系
- 操作(了解即可):
- 围绕整个系统画一条线,并声明有哪些参与者位于系统之外,且与系统进行交互
-
对系统的需求建模
- 目的:捕获和描述系统的功能需求
说明这个系统应该做什么,而不考虑系统应该怎样做
- 目的:捕获和描述系统的功能需求
-
2.4.7 4+1 视图
- 逻辑视图
- 作用: 描述如何实现系统内部的功能,系统的静态结构和因发送消息而出现的动态协作关系
- 使用图:类图、对象图、状态图、顺序图、合作图、活动图
- 其他叫法:对象视图、功能视图
- 进程视图
- 作用:描述系统的并发性,并处理这些线程间的通信和同步
- 使用图:状态图、顺序图、合作图活动图、构件图、配置图
- 其他叫法:过程视图、并发视图、动态行为视图
- 对此关心的开发团队成员:开发者、系统集成者
- 开发视图
- 作用:描述系统代码构件组织和实现模块及它们之间的依赖关系
- 使用图:构件图
- 其他叫法:实现视图
- 关心的开发团队成员:设计者、开发者、测试者
- 物理视图
- 作用:定义系统中软硬件的物理体系结构及连接
- 使用图:配置图
- 其他叫法:部署视图
- 对此关心的开发团队成员:开发者、系统集成者和测试者。
- 用例视图(即+1)
- 作用:描述系统的功能需求,展示了一个外部用户能够观察到的系统功能模型
- 使用图:用例图
- 其他叫法:场景视图、统一视图、系统交互设计视图
- 对此关心的开发团队成员:客户、分析者设计者、开发者、测试者。
2.5 形式化语言
- 形式化方法
- 概念:用符号化的数学变换把需求分析准确地表述出来
- 作用:确保和需求的一致性,并能用于分析和验证应用程序
- 形式化语言:一种基于数学和逻辑的语言,用于描述和定义软件、系统等领域中的概念、结构、行为
2.5.1 形式化规格说明语言
- 公理方法:利用前置条件与后置条件描述程序的行为。
- 基于集合论和一阶谓词演算的 meta-IV 语言和Z语言
- 应用:广泛用于书写大软件的规格说明与设计
- 在描述程序语言的指称语义时,利用这类语言可以方便地定义高阶函数,并由此定义程序语言的复杂控制构造的意义
- 维也纳开发方法(VDM):meta-IV 描述的形式化软件开发方法
- 代数规格说明:
- 是关于抽象数据类型的代数描述
- 相关语言:OBJ、ACT
- 进程描述语言
- 用于描述开发进程的行为。主要有 Hoare 的顺序通信进程CSP及RMilner 的通信系统理论 CCS。
- 相关语言:ISO LOTOS、ISO ESTELLE、ISO SDL、CCITT Z.100 、 CCITT SDL
2.5.2 形式化方法的分类
- 根据系统特点分类:
- 面向对象的形式化方法,通过定义状态和操作进行建模,如Z语言、VDM、B、Object-Z 等方法
- 面向属性的形式化方法,如OBJ3、Larch 等方法
- 基于并发性的形式化方法,如CCS、ACP、CSP、LOTOS等
- 基于实时性的形式化方法,如 TRIO、RTOZ等方法。
- 根据描述方式
- 模型描述的形式化方法:通过构造一个数学模型来直接描述系统或程序
- 性质描述的形式化方法:通过对目标软件系统中不同性质的描述来间接描述系统或程序
- 根据表达能力
- 模型方法:
- 概念:对系统状态和改变系统状态的动作直接给出抽象定义,并进行显式描述。
- 缺陷:不能显式地表示并发
- 代数方法:
- 概念:通过定义不同操作系统的关系,隐式地描述操作
- 缺陷:不能显式地表示并发
- 进程代数方法:
- 概念:通过一个显式模型来描述并发过程,将并发性归为非确定性,通过交错语义来表示系统行为
- 逻辑方法:
- 概念:通过描述程序状态规范和时间状态规范的逻辑方法来描述系统特性
- 示例: CSS、CSP、ACP等
- 网络模型方法:
- 概念:通过独立描述网络中每一个结点,显式地给出系统的并发模型
- 示例: Petri网
- 模型方法:
2.5.3 形式化方法的开发过程
按照软件工程“自顶向下、逐步求精”的原则,软件生命周期可分以下6个阶段:
- 可行性分析
可行性分析是对待开发系统提供一种综合性的分析方法。综合各方面因素论证待开发系统是否可行,为开发过程提出综合评价和决策依据。由于形式化方法的符号演算系统仍不能完全表达自然语言,所以在此阶段的应用仍是一项巨大挑战。
- 需求分析
需求分析是在软件开发过程的早期阶段,将用户需求转换为说明文档。一般非形式化的描述可能导致描述的不明确和需求的不一致,可能导致编程错误,影响程序的使用和可靠性。形式化方法则要求明确描述用户需求。
- 体系结构设计
体系结构设计阶段的根本目的是将用户需求转换为计算机可以实现的目标系统。本阶段侧重描述软件系统的接口、功能和结构。形式化方法对于软件需求描述的优点同样适用于软件设计的描述。由于需求阶段功能描述并不能完全实现,所以形式化方法在此阶段的应用仍存在问题。使用者可采用半形式化方法来完成此阶段的工作。
- 详细设计
详细设计阶段的形式化是以体系结构规范为基础进行精化描述的过程。通过此阶段的形式化描述能够检验需求描述和用户需求是否一致。为使形式化方法更适用于详细
设计和精化过程,可将各种形式的规范联系起来。
- 编码
自动代码生成器目前能将一些规模较小软件系统的形式化描述直接转换成可执行程序。在简化软件开发过程的同时不仅节约了资源,还增强了软件的可靠性。
- 测试发布
软件开发的最后阶段是测试发布。在软件投入运行前,需要对软件开发各阶段的文档以及程序源代码进行检查。对于测试来讲,形式化方法可用于测试用例的自动生成保证测试用例的覆盖率。
2.5.4 Z 语言
知道是一种形式化开发语言即可,没有考点