1.1 计算机的工作模型
1.1.1 冯·诺依曼体系结构
目前计算机采用的还是传统的冯·诺依曼体系结构,冯·诺依曼结构的计算机由存储、运算、控制、输入及输出五个单元组成
- 存储单元用于存储程序(指令序列)和数据
- 运算单元用于进行算术/逻辑运算
- 控制单元用于控制程序的执行和根据指令向其他单元发出控制信号
- 输入单元和输出单元作为计算机与外界的接口,用于实现系统的输入和输出功能
工作过程
- 把待执行的程序装入存储单元中
- 控制单元从存储单元中逐条取出和执行程序中的指令,把其中的运算指令交给运算单元处理
- 程序执行过程中从输入单元或存储单元获得所需的数据,并将产生的临时结果保存在存储单元中
- 程序的最终执行结果通过输出单元输出
冯·诺依曼计算机的本质是通过不断地改变程序的状态来完成程序的功能,程序的状态由存储单元中的数据构成,状态的转换是通过程序中的指令对数据的操作来实现的。
冯·诺伊曼计算机能执行的指令包括
- 算术指令:加减乘除等
- 逻辑指令:比较大小等
- 数据传输指令:实现各单元之间的数据传输
- 流程控制指令:指定下一条指令在存储单元的地址。
- 通常情况下,计算机从某个存储地址开始依次取指令来执行(顺序执行)
- 流程控制指令可以用来改变指令的执行顺序,包括转移、循环、子程序调用等
1.1.2 硬件与软件
1.1.2.1 硬件
硬件(hardware)是指构成计算机的元器件和设备,目前冯·诺依曼计算机的硬件一般按中央处理器,内存以及外围设备三个部分来组织,它们之间通过用于传递数据、地址和控制信号的总线来连接。
中央处理器
中央处理器(Central Processing Unit,CPU)是计算机的核心,用于执行指令来完成计算任务。cpu由控制器、运算器以及寄存器等构成。
- 控制器负责从内存中取指令并根据指令发出控制信号以引起其他部件的动作
- 运算器负责执行指令所规定的算术和逻辑运算
- 寄存器暂时存放当前指令所需要的数据和计算结果(供后续指令使用)、记录当前指令的执行状态以及下一条指令从内存地址等
- 减少访问存(取)内存中内容的次数,提高指令的执行效率
内存
内存(memory)是内部存储器(或主存储器)的简称,用于存储正在运行的程序和正在使用的数据。
内存分为只读存储器和随机访问存储器
- 只读存储器(Read Only Memory,ROM)中的内容一般不可修改,存储一些固定的特殊程序(如开机引导程序)
- 随机访问存储器(Random Access Memory,RAM)中的内容可以读取修改,用于存储可变的程序和数据
外围设备
外围设备(peripheral device,简称外设)提供了计算机与外界的接口,用于计算机的输入/输出以及为计算机提供大容量的信息存储。外设分为输入/输出设备和外部存储器
- 输入/输出设备(input/output device)
- 用于计算机外部输入程序和其他所需要的数据以及把计算结果输出到计算机外部
- 键鼠属于输入设备,显示器/打印机属于输出设备
- 外部存储器(external storage,简称外存)
- 大容量、低速存储设备
- 用于永久性存储程序、数据以及各种文档信息
- 包括软盘、硬盘、光盘、闪存盘、磁带等
- 存储在外存的信息以文件形式进行组织,通过文件名访问
- 与内存的区别
- 容量和速度
- 外存存储大量的、当前不使用的程序和数据;内存存储少量的、正在运行的程序和正在使用的数据
为了解决部件之间速度不匹配的问题,一般会设置高速缓冲存储器(cache)。
高速缓冲存储器的存储内容为近期用过的以及在今后一段时间内可能即将要用到的内容。
现代计算机大都在CPU中为内存提供内存高速缓冲存储器(cache memory),在内存中为外存提供磁盘高速缓存(disk cache),以减少CPU访问内存和外存的次数,提高计算机性能。
1.1.2.2 软件
软件(sofware)是计算机系统中的程序以及相关的文档。
- 程序(program)是对计算任务的处理对象(数据)和与处理规则(算法)的描述,体现为指令序列,由计算机执行。
- 文档(document)供程序的使用、开发与维护者使用,为方便理解程序而准备的说明材料
软件分为系统软件和应用软件
- 系统软件(system software)
- 计算机系统中直接让硬件发挥作用的软件
- 如操作系统(windows、unix、linux、Mac OS)
- 包括支撑软件(supporting software),帮助软件开发与维护的软件
- 应用软件(application software)
- 用于特定领域的专用软件
- 如文字处理软件、财务软件等
由硬件构成的计算机为裸机,每加上一层软件就得到了比它功能更强大的虚拟机(virtual machine)。
硬件构成的裸机只能识别用机器语言表示的指令,硬件加上操作系统就构成了最基本的虚拟机。
1.1.3 机内信息的表示
计算机内部的任何信息(指令、数据和地址)都是由0和1序列来表示的,常用的计量单位有:
- 二进制位(bit,简写b):由一个0或1构成
- 字节(byte,简写B):由8个二进制位构成
- 千字节(kilobyte,简写KB):由1024个字节构成
- 兆字节(megabyte,简写MB):由1024个千字节构成
- 吉字节(gigabyte,简写GB):由1024个兆字节构成
- 太字节(terabyte,简写TB):由1024个吉字节构成
在内存与外存中,通常把字节当作基本存储单位
1.1.3.1 数值的进制表示
数值的常用进制表示包括十进制、二进制、八进制和十六进制
整数和实数的机内表示
实数包含了无理数(无限不循环小数)和有理数(整数和分数),整数包含了负整数、0和正整数。
(1)整数的原码和补码表示
整数的一种表示方法是采用固定长度的二进制原码表示
- 用一个二进制位(一般为最高位)表示它的正负号:0表示正;1表示负,在用其他二进制位表示它的绝对值。
- 12和-12的原码分别是:0000 1100和1000 1100
- 对于由n个二进制位构成的原码,它能表示的整数范围是-(2n-1-1)~2n-1-1,其中01...1表示最大的正整数,11...1表示最小的负整数;零有两个,即00...0(正零)和10...0(负零)。
整数的另一种表示方法是采用固定长度的2的补码(2's complement)表示
- 正整数的补码为它的二进制原码,负整数的补码为把相应的正整数的二进制表示中的各个二进制位取反后得到的整数加1。
- 12和-12的补码分别是:0000 1100和1111 0100
- 对于由n个二进制位构成的补码,它能表示的整数范围是-2n-1~2n-1-1,其中01...1表示最大的正整数,10...0表示最小的负整数,零为0...0。
使用补码表示的好处是可以简化加减运算,减法可以转换成加法来做。cpu的整数运算指令一般是针对2的补码表示来设计的。
(2)实数的浮点表示
实数在计算机内部采用基于科学记数法的二进制小数形式来表示,则把实数表示成a✖️2b,其中a是一个二进制小数,称为尾数(mantissa);b是一个二进制整数,称为阶码或指数(exponent)。
计算机存储实数前,要先对其进行格式化,把尾数调整为1.xxx...形式,其中整数位“1”和小数点不存储,只存储实数的符号、尾数和指数三个部分,每个部分有固定长度。在这种实数表示方法中,小数点的位置由尾数和指数共同决定,其位置是浮动的,所以实数在计算机中称为浮点数(float-point number)。
现代cpu的实数运算指令一般是针对实数的浮点表示来设计的
(3)实数的BCD码表示
实数在计算机中的另一种表示方法:BCD码(Binary Coded Decimal code )表示
- 一个BCD码由四位二进制数构成,其范围为0001~1001,分别对应十进制数字0~9。
- 用BCD码表示十进制数时,把每一位十进制数用BCD码表示,用不允许在BCD码中出现的六个编码(1010、1011、1100、1101、1110、1111)中的三个数分别表示小数点、正号和负号
- -123.4表示为1011 0001 0010 0011 1111 0100,用BCD码表示的十进制数采用压缩形式存储,一个字节存储两个BCD码
- 能够表示较长的十进制数和能用二进制来精确表示十进制小数
- 一条cpu指令无法对BCD码进行操作,需要若干条指令(一段程序)来实现
1.2 程序设计
程序=数据结构+算法
- 算法(algorithm):对数据加工步骤的描述
- 数据结构(data structure):对反应带解决问题本质的数据的描述
1.2.1 程序设计范式
程序设计范式是设计、组织、编写程序的一种方式,典型的程序设计范式包括:过程式、对象式、函数式、逻辑式
(1)过程式程序设计(procedural programming)
- 以功能为中心,基于功能分解和过程抽象的程序设计范式
- 执行过程体现为一系列子程序的调用
(2)对象式(面向对象)程序设计(object-oriented programming)
- 以数据为中心,基于数据抽象的程序设计范式
- 执行过程体现为各个对象之间相互发送和处理信息
(3)函数式与逻辑式程序设计
函数式程序设计(functional programming)
- 围绕函数进行
- 执行过程体现为函数应用
- 基于理论是递归函数理论和lambda演算
逻辑式程序设计(logical programming)
- 把程序组织成一组事实和一组推理规则,程序在事实基础上运用推理规则来实施计算
- 基于的理论是谓词演算
过程式和面向对象式程序设计强调“如何做”的描述,即要对操作步骤和状态变化给出明确的描述,称为命令式程序设计(imperative programming);
函数式和逻辑式程序设计强调“做什么”的描述,如何做由实现系统自动完成,称为申述式程序设计(declarative programming)
1.1.2 程序设计步骤
随着计算机应用领域的不断扩大和应用层次的不断加深,使得软件规模不断扩大、软件的复杂度不断提高,早期的软件开发模式难以驾驭软件开发过程,程序的正确性难以保证,软件生产率急剧下降,出现了“软件危机”
软件工程(software engineering):采用工程方法来开发软件,强调对软件开发过程的管理和加强各个阶段的文档制作。
- 需求分析
- 系统设计
- 用编程语言实现
- 测试与调试
- 运行与维护
1.2.3 程序设计语言
编程语言分为低级语言和高级语言
低级语言(low-level language)
- 包括机器语言(machine language)和汇编语言(assembly language)
- 写出的程序效率高(执行速度快、占用空间少)
- 程序难以设计、理解和维护,难以保证程序的正确性
- 难以从一种结构的计算机移植到另一种结构的计算机上运行(不同结构的计算机的指令系统有差别)
高级语言(high-level language)
- 指人容易理解和有利于人对解题过程进行描述的编程语言,通常指程序设计语言(programming language)
- 翻译为机器语言方式:编译(compiling)、解释(interpreting)
- 编译比解释执行效率高
- 程序易设计、理解和维护,与具体计算机的指令系统无关
- 相较与低级语言编写的程序效率要低,翻译成的目标代码量较大
语言的语法、语义和语用
- 语法(syntax):书写结构正确的语言成分应遵循的规则
- 语义(semantics):语言成分的含义
- 语用(pragmatics):语言成分的使用场合及所产生的实际效果
1.3 C++语言
1.3.1 概述
C++是由C语言发展而来的。
C语言
- 一个支持过程式程序设计的高级程序设计语言,
- 既有高级语言的优点(提供了类型机制和结构化流程控制成分),
- 又有低级语言具有的描述能力(数据位操作和内存地址操作)
C++
- 面向对象程序设计的高级程序设计语言
- 灵活
- 对使用者的限制少,易于发挥使用者的创造性
- 高效
- 提供的语言成分(如指针)能产生高效的代码;
- 很少对程序运行时刻做合法性的检查(如数组下标),减少了程序运行时的开销
评价C++应该评价使用C++的人的程序设计素质
1.3.2 C++程序的构成
一个C++程序由一些程序实体的定义构成,程序实体包括:
- 常量:程序处理的数据
- 变量:程序处理的数据
- 函数:程序对数据的加工过程
- 对象:数据以及数据加工的封装体
- 数据类型(类):用于描述数据的特征
1.3.3 C++语言的词法
一个语言包括语法、语义和语用,语法包括词法和句法。
字符集
C++的字符集由52个大小写英文字母、10个数字以及一些特殊符号构成。
单词及词法规则
单词(word):由字符集中的字符按照一定规则构成的具有一定意义的最小词法单位
C++中的单词包括:
- 标识符(identifier)
- 由大小写英文字母、数字以及下划线(_)所构成的字符序列,首字符不能是数字
- 区分大小写
- 关键字 (keyword)
- 语言预定义的标识符,有固定的含义和作用
- 字面常量(或称直接量,literal)
- 在程序中直接写出的常量值
- 操作符(operator)
- 用于描述对数据的操作
- 标点符号(punctuation)
- 起到某些语法、语义上的作用
语法的形式描述
对一个语言语法的精确描述需要采用另一个语法和语义比较简单的语言来完成,相对于被描述的语言,该语言称为元语言(meta language)。
用于描述程序设计语言的元语言是一种称为BNF(Backus Normal Form,或Backus-Naur Form)的描述语言
1.3.4 C++程序的运行步骤
- 编辑(editing)
- 使用文字编辑程序输入C++源程序代码,并将其保存在计算机外存中。C++源文件后缀为.cpp和.h
- 编译(compiling)
- 使用C++编译程序对源文件进行翻译,将翻译结果作为目标程序(object code)保存在外存的目标文件中,目标文件的后缀为.obj
- 连接(link)
- 使用连接程序(linker)将目标文件和库文件连接起来,作为一个可执行程序保存在外存中,后缀名为.exe
- 运行(executing或running)
- 将可执行文件装入内存,让程序运行
1.4 小结
- 冯·诺依曼体系结构计算机由存储、算术/逻辑运算、控制、输入以及输出五个单元构成,其本质是通过不断改变程序的状态来实现计算。
- 程序的状态由存储单元中的数据表示
- 状态的转换由程序中的指令来实现。
- 硬件是指计算机的物理构成,即构成计算机的元器件和设备。计算机的硬件通常由CPU、内存以及外设
- 外设分为输入/输出设备和外存
- 软件是计算机程序以及相关文档,分为系统软件和应用软件
- 程序是对计算任务的处理对象(数据)与处理规则(算法)的描述
- 文档是为了便于人理解程序所需的说明资料,供程序开发与维护使用
- 由硬件构成的计算机常常被称为“裸机”,在它之上,每加上一层软件就得到了比它功能更强的“虚拟机”
- 在计算机内部,任何信息(包括指令、数据和地址)都是用一系列“0”和“1”来表示的。
- 数据一般采用某种二进制形式来表示,其中整数采用补码表示,实数采用浮点形式表示,BCD码可以表示更大长度的十进制数以及能精确表示一些十进制小数
- 程序设计就是为计算机编制程序的过程,它涉及程序设计范式、步骤和程序设计语言等方面的内容
- 基于不同的理论、原则和概念来进行程序设计就形成了不同的程序设计范式
- 典型的程序设计范式包括:过程式、对象式、函数式、逻辑式
- 使用广泛的是过程式和对象式
- 程序设计步骤包括:需求分析、系统设计、编程实现、测试与调试、运行与维护
- 程序语言分为低级语言和高级语言
- 低级语言是指与特定计算机体系结构密切相关的程序语言,包括机器语言和汇编语言
- 高级语言是指人容易理解和有利于人对解题过程进行描述的程序语言,程序设计语言通常是指高级语言
- 与低级语言相比,高级语言编写的程序易设计、理解和维护,保证程序的正确性
- 高级语言程序的执行途径:编译和解释
- 编译比解释更高效
- 解释执行可以实现语言的平台无关性
- 一个语言包括语法、语义和语用三个方面
- 语法是指书写结构正确的语言成分应遵循的规则
- 语义是指语言成分的含义
- 语用是指语言成分的使用场合及所产生的实际效果
- C++是一个广泛使用的、支持基本的程序设计思想和多种程序设计范式的高级程序设计语言,灵活、高效是它的特点
- 在逻辑上,一个C++程序由一些程序实体的定义构成,这些程序实体包括常量、变量、对象、函数以及数据类型(包括类)等,其中必须要有一个全局函数main。物理上,一个C++程序可以存放在一个或多个源文件(模块)中
- 构成C++语言的单词有:标识符、关键字、字面常量、操作符以及标点符号等
- C++程序的运行步骤是:编辑、编译、链接、运行。C++集成开发环境可以把这些步骤集成起来。
课后答案(仅供参考)
1、冯·诺伊曼计算机的工作模型
目前计算机采用的还是传统的冯·诺依曼体系结构,冯·诺依曼结构的计算机由存储、运算、控制、输入及输出五个单元组成
- 存储单元用于存储程序(指令序列)和数据
- 运算单元用于进行算术/逻辑运算
- 控制单元用于控制程序的执行和根据指令向其他单元发出控制信号
- 输入单元和输出单元作为计算机与外界的接口,用于实现系统的输入和输出功能
2、寄存器、内存、外存的区别
- 寄存器在CPU中,暂时存放当前指令所需要的数据和计算结果(供后续指令使用)、记录当前指令的执行状态以及下一条指令从内存地址等
- 减少访问存(取)内存中内容的次数,提高指令的执行效率
- 内存(memory)是内部存储器(或主存储器)的简称,用于存储正在运行的程序和正在使用的数据。
- 外围设备(peripheral device,简称外设)提供了计算机与外界的接口,用于计算机的输入/输出以及为计算机提供大容量的信息存储。
3、CPU执行的指令种类
冯·诺伊曼计算机能执行的指令包括
- 算术指令:加减乘除等
- 逻辑指令:比较大小等
- 数据传输指令:实现各单元之间的数据传输
- 流程控制指令:指定下一条指令在存储单元的地址。
- 通常情况下,计算机从某个存储地址开始依次取指令来执行(顺序执行)
- 流程控制指令可以用来改变指令的执行顺序,包括转移、循环、子程序调用等
4、软件的定义和分类
- 软件(sofware)是计算机系统中的程序以及相关的文档。
- 软件分为系统软件和应用软件
5、虚拟机的定义,翻译程序与虚拟机的区别
由硬件构成的计算机为裸机,每加上一层软件就得到了比它功能更强大的虚拟机(virtual machine)。硬件构成的裸机只能识别用机器语言表示的指令,硬件加上操作系统就构成了最基本的虚拟机。
高级语言的翻译程序运行在虚拟机之上,将翻译出的机器指令通过虚拟机执行。
6、十进制0.1的二进制表示?计算机内部表示
(0.1)10=(0.000 1100 1100 1100 ...)2
ieee 754:0 1000 0011 100 1100 1100 1100 1100 1100
7、程序设计范式的定义和分类
程序设计范式是设计、组织、编写程序的一种方式,典型的程序设计范式包括:过程式、对象式、函数式、逻辑式
8、程序设计步骤
- 需求分析
- 系统设计
- 用编程语言实现
- 测试与调试
- 运行与维护
9、低级语言与高级语言的区别
低级语言(low-level language)
- 包括机器语言(machine language)和汇编语言(assembly language)
- 写出的程序效率高(执行速度快、占用空间少)
- 程序难以设计、理解和维护,难以保证程序的正确性
- 难以从一种结构的计算机移植到另一种结构的计算机上运行(不同结构的计算机的指令系统有差别)
高级语言(high-level language)
- 指人容易理解和有利于人对解题过程进行描述的编程语言,通常指程序设计语言(programming language)
- 翻译为机器语言方式:编译(compiling)、解释(interpreting)
- 编译比解释执行效率高
- 程序易设计、理解和维护,与具体计算机的指令系统无关
- 相较与低级语言编写的程序效率要低,翻译成的目标代码量较大
10、编译与解释的区别
编译:将程序由高级语言翻译为机器语言或汇编语言,然后执行
解释:一边编译,一边执行
编译比解释执行效率高
11、C++与C的关系
C++是由C语言发展而来的,保留了C语言的所有成分和特点,增加了支持面向对象程序设计的语言成分。
12、C++语言的缺点
- 灵活
- 对使用者的限制少,易于发挥使用者的创造性
- 高效
- 提供的语言成分(如指针)能产生高效的代码;
- 很少对程序运行时刻做合法性的检查(如数组下标),减少了程序运行时的开销
13、C++程序的执行过程
- 编辑(editing)
- 使用文字编辑程序输入C++源程序代码,并将其保存在计算机外存中。C++源文件后缀为.cpp和.h
- 编译(compiling)
- 使用C++编译程序对源文件进行翻译,将翻译结果作为目标程序(object code)保存在外存的目标文件中,目标文件的后缀为.obj
- 连接(link)
- 使用连接程序(linker)将目标文件和库文件连接起来,作为一个可执行程序保存在外存中,后缀名为.exe
- 运行(executing或running)
- 将可执行文件装入内存,让程序运行
14、英语与汉语的字符集
英语:ASCII码
汉语:GB 2312-80
15、C++单词的种类
C++中的单词包括:
- 标识符(identifier)
- 由大小写英文字母、数字以及下划线(_)所构成的字符序列,首字符不能是数字
- 区分大小写
- 关键字 (keyword)
- 语言预定义的标识符,有固定的含义和作用
- 字面常量(或称直接量,literal)
- 在程序中直接写出的常量值
- 操作符(operator)
- 用于描述对数据的操作
- 标点符号(punctuation)
- 起到某些语法、语义上的作用
16、C++标识符
- 标识符(identifier)
- 由大小写英文字母、数字以及下划线(_)所构成的字符序列,首字符不能是数字
- 区分大小写
https://github.com/zzq1996/ProgrameDesign
参考:《程序设计教程:用C++语言编程》 陈家骏,郑滔