描述
开 本: 16开纸 张: 胶版纸包 装: 平装是否套装: 否国际标准书号ISBN: 9787111453802丛书名: 计算机科学丛书
内容简介
本书采用结构化方法来介绍计算机系统,书的内容完全建立在“计算机是由层次结构组成的,每层完成规定的功能”这一概念之上。作者对本版进行了彻底的更新,以反映当今重要的计算机技术以及计算机组成和体系结构方面的*进展。书中详细讨论了数字逻辑层、微体系结构层、指令系统层、操作系统层和汇编语言层,并涵盖了并行体系结构的内容,而且每一章结尾都配有丰富的习题。本书适合作为计算机专业本科生计算机组成与结构课程的教材或参考书,也可供相关领域技术人员参考。
目 录
Structured Computer Organization, Sixth Edition
出版者的话
译者序
前言
第1章 概述
1.1 结构化计算机组成
1.1.1 语言、层次和虚拟机
1.1.2 现代多层次计算机
1.1.3 多层次计算机的演化
1.2 计算机体系结构的里程碑
1.2.1 第零代——机械计算机(1642—1945)
1.2.2 代——电子管计算机(1945—1955)
1.2.3 第二代——晶体管计算机(1955—1965)
1.2.4 第三代——集成电路计算机(1965—1980)
1.2.5 第四代——超大规模集成电路计算机(1980年至今)
1.2.6 第五代——低功耗和无所不在的计算机
1.3 计算机家族
1.3.1 技术和经济推动
1.3.2 计算机扫视
1.3.3 一次性计算机
1.3.4 微型控制器
1.3.5 移动计算机和游戏计算机
1.3.6 个人计算机
1.3.7 服务器
1.3.8 大型主机
1.4 系列计算机举例
1.4.1 x86体系结构简介
1.4.2 ARM体系结构简介
1.4.3 AVR体系结构简介
1.5 公制计量单位
1.6 本书概览
习题
第2章 计算机系统组成
2.1 处理器
2.1.1 CPU组成
2.1.2 指令执行
2.1.3 RISC和CISC
2.1.4 现代计算机设计原则
2.1.5 指令级并行
2.1.6 处理器级并行
2.2 主存储器
2.2.1 存储位
2.2.2 内存编址
2.2.3 字节顺序
2.2.4 纠错码
2.2.5 高速缓存
2.2.6 内存封装及其类型
2.3 辅助存储器
2.3.1 层次存储结构
2.3.2 磁盘
2.3.3 IDE盘
2.3.4 SCSI盘
2.3.5 RAID盘
2.3.6 固盘
2.3.7 只读光盘
2.3.8 可刻光盘
2.3.9 可擦写光盘
2.3.10 DVD
2.3.11 Blu-Ray
2.4 输入/输出设备
2.4.1 总线
2.4.2 终端
2.4.3 鼠标
2.4.4 游戏控制器
2.4.5 打印机
2.4.6 电信设备
2.4.7 数码相机
2.4.8 字符编码
2.5 小结
习题
第3章 数字逻辑层
3.1 门和布尔代数
3.1.1 门
3.1.2 布尔代数
3.1.3 布尔函数的实现
3.1.4 等价电路
3.2 基本数字逻辑电路
3.2.1 集成电路
3.2.2 组合逻辑电路
3.2.3 算术电路
3.2.4 时钟
3.3 内存
3.3.1 锁存器
3.3.2 触发器
3.3.3 寄存器
3.3.4 内存组成
3.3.5 内存芯片
3.3.6 RAM和ROM
3.4 CPU芯片和总线
3.4.1 CPU芯片
3.4.2 计算机总线
3.4.3 总线宽度
3.4.4 总线时钟
3.4.5 总线仲裁
3.4.6 总线操作
3.5 CPU芯片举例
3.5.1 Intel Core i7
3.5.2 德州仪器的OMAP4430片上系统
3.5.3 Atmel的ATmega168微控制器
3.6 总线举例
3.6.1 PCI总线
3.6.2 PCI Express
3.6.3 通用串行总线USB
3.7 接口电路
3.7.1 输入/输出接口
3.7.2 地址译码
3.8 小结
习题
第4章 微体系结构层
4.1 微体系结构举例
4.1.1 数据通路
4.1.2 微指令
4.1.3 微指令控制:Mic-1
4.2 指令系统举例:IJVM
4.2.1 栈
4.2.2 IJVM内存模型
4.2.3 IJVM指令集
4.2.4 将Java编译为IJVM
4.3 实现举例
4.3.1 微指令和符号
4.3.2 用Mic-1实现IJVM
4.4 微体系结构层设计
4.4.1 速度与价格
4.4.2 缩短指令执行路径长度
4.4.3 带预取的设计:Mic-2
4.4.4 流水线设计:Mic-3
4.4.5 七段流水线设计:Mic-4
4.5 提高性能
4.5.1 高速缓存
4.5.2 分支预测
4.5.3 乱序执行和寄存器重命名
4.5.4 推测执行
4.6 微体系结构层举例
4.6.1 Core i7 CPU的微体系结构
4.6.2 OMAP4430 CPU的微体系结构
4.6.3 ATmega168微控制器的微体系结构
4.7 Core i7、OMAP4430和ATmega168三种CPU的比较
4.8 小结
习题
第5章 指令系统层
5.1 指令系统层概述
5.1.1 指令系统层的性质
5.1.2 存储模式
5.1.3 寄存器
5.1.4 指令
5.1.5 Core i7指令系统层概述
5.1.6 OMAP4430 ARM指令系统层概述
5.1.7 ATmega168 AVR指令系统层概述
5.2 数据类型
5.2.1 数值数据类型
5.2.2 非数值数据类型
5.2.3 Core i7的数据类型
5.2.4 OMAP4430 ARM CPU的数据类型
5.2.5 ATmega168 AVR CPU的数据类型
5.3 指令格式
5.3.1 指令格式设计准则
5.3.2 扩展操作码
5.3.3 Core i7指令格式
5.3.4 OMAP4430 ARM CPU指令格式
5.3.5 ATmega168 AVR指令格式
5.4 寻址
5.4.1 寻址方式
5.4.2 立即寻址
5.4.3 直接寻址
5.4.4 寄存器寻址
5.4.5 寄存器间接寻址
5.4.6 变址寻址
5.4.7 基址变址寻址
5.4.8 栈寻址
5.4.9 转移指令的寻址方式
5.4.10 操作码和寻址方式的关系
5.4.11 Core i7的寻址方式
5.4.12 OMAP4430 ARM CPU的寻址方式
5.4.13 ATmega168 AVR的寻址方式
5.4.14 寻址方式讨论
5.5 指令类型
5.5.1 数据移动指令
5.5.2 双操作数指令
5.5.3 单操作数指令
5.5.4 比较和条件转移指令
5.5.5 过程调用指令
5.5.6 循环控制指令
5.5.7 输入/输出指令
5.5.8 Core i7指令系统
5.5.9 OMAP4430 ARM CPU指令系统
5.5.10 ATmega168 AVR指令系统
5.5.11 指令集比较
5.6 控制流
5.6.1 顺序控制流和转移
5.6.2 过程
5.6.3 协同过程
5.6.4 陷阱
5.6.5 中断
5.7 详细举例:汉诺塔
5.7.1 Core i7汇编语言实现的汉诺塔
5.7.2 OMAP4430 ARM汇编语言实现的汉诺塔
5.8 IA-64体系结构和Itanium 2
5.8.1 IA-32的问题
5.8.2 IA-64模型:显式并行指令计算
5.8.3 减少内存访问
5.8.4 指令调度
5.8.5 减少条件转移:判定
5.8.6 推测加载
5.9 小结
习题
第6章 操作系统层
6.1 虚拟内存
6.1.1 内存分页
6.1.2 内存分页的实现
6.1.3 请求调页和工作集模型
6.1.4 页置换策略
6.1.5 页大小和碎片
6.1.6 分段
6.1.7 分段的实现
6.1.8 Core i7的虚拟内存
6.1.9 OMAP4430 ARM CPU的虚拟内存
6.1.10 虚拟内存和高速缓存
6.2 硬件虚拟化
6.3 操作系统层I/O指令
6.3.1 文件
6.3.2 操作系统层I/O指令的实现
6.3.3 目录管理指令
6.4 用于并行处理的操作系统层指令
6.4.1 进程创建
6.4.2 竞争条件
6.4.3 使用信号量的进程同步
6.5 操作系统实例
6.5.1 简介
6.5.2 虚拟内存实例
6.5.3 操作系统层I/O举例
6.5.4 进程管理实例
6.6 小结
习题
第7章 汇编语言层
7.1 汇编语言简介
7.1.1 什么是汇编语言
7.1.2 为什么使用汇编语言
7.1.3 汇编语言语句的格式
7.1.4 伪指令
7.2 宏
7.2.1 宏定义、调用和扩展
7.2.2 带参数的宏
7.2.3 高级特性
7.2.4 汇编器中宏处理的实现
7.3 汇编过程
7.3.1 两趟汇编的汇编器
7.3.2 趟扫描
7.3.3 第二趟扫描
7.3.4 符号表
7.4 链接和加载
7.4.1 链接器的处理过程
7.4.2 目标模块的结构
7.4.3 绑定时间和动态重定位
7.4.4 动态链接
7.5 小结
习题
第8章 并行计算机体系结构
8.1 片内并行
8.1.1 指令级并行
8.1.2 片内多线程
8.1.3 单片多处理器
8.2 协处理器
8.2.1 网络处理器
8.2.2 图形处理器
8.2.3 加密处理器
8.3 共享内存的多处理器
8.3.1 多处理器与多计算机
8.3.2 内存语义
8.3.3 UMA对称多处理器体系结构
8.3.4 NUMA多处理器系统
8.3.5 COMA多处理器系统
8.4 消息传递的多计算机
8.4.1 互联网络
8.4.2 MPP——大规模并行处理器
8.4.3 集群计算
8.4.4 多计算机的通信软件
8.4.5 调度
8.4.6 应用层的共享内存
8.4.7 性能
8.5 网格计算
8.6 小结
习题
参考文献
附录A 二进制数
附录B 浮点数
附录C 汇编语言程序设计
索引
出版者的话
译者序
前言
第1章 概述
1.1 结构化计算机组成
1.1.1 语言、层次和虚拟机
1.1.2 现代多层次计算机
1.1.3 多层次计算机的演化
1.2 计算机体系结构的里程碑
1.2.1 第零代——机械计算机(1642—1945)
1.2.2 代——电子管计算机(1945—1955)
1.2.3 第二代——晶体管计算机(1955—1965)
1.2.4 第三代——集成电路计算机(1965—1980)
1.2.5 第四代——超大规模集成电路计算机(1980年至今)
1.2.6 第五代——低功耗和无所不在的计算机
1.3 计算机家族
1.3.1 技术和经济推动
1.3.2 计算机扫视
1.3.3 一次性计算机
1.3.4 微型控制器
1.3.5 移动计算机和游戏计算机
1.3.6 个人计算机
1.3.7 服务器
1.3.8 大型主机
1.4 系列计算机举例
1.4.1 x86体系结构简介
1.4.2 ARM体系结构简介
1.4.3 AVR体系结构简介
1.5 公制计量单位
1.6 本书概览
习题
第2章 计算机系统组成
2.1 处理器
2.1.1 CPU组成
2.1.2 指令执行
2.1.3 RISC和CISC
2.1.4 现代计算机设计原则
2.1.5 指令级并行
2.1.6 处理器级并行
2.2 主存储器
2.2.1 存储位
2.2.2 内存编址
2.2.3 字节顺序
2.2.4 纠错码
2.2.5 高速缓存
2.2.6 内存封装及其类型
2.3 辅助存储器
2.3.1 层次存储结构
2.3.2 磁盘
2.3.3 IDE盘
2.3.4 SCSI盘
2.3.5 RAID盘
2.3.6 固盘
2.3.7 只读光盘
2.3.8 可刻光盘
2.3.9 可擦写光盘
2.3.10 DVD
2.3.11 Blu-Ray
2.4 输入/输出设备
2.4.1 总线
2.4.2 终端
2.4.3 鼠标
2.4.4 游戏控制器
2.4.5 打印机
2.4.6 电信设备
2.4.7 数码相机
2.4.8 字符编码
2.5 小结
习题
第3章 数字逻辑层
3.1 门和布尔代数
3.1.1 门
3.1.2 布尔代数
3.1.3 布尔函数的实现
3.1.4 等价电路
3.2 基本数字逻辑电路
3.2.1 集成电路
3.2.2 组合逻辑电路
3.2.3 算术电路
3.2.4 时钟
3.3 内存
3.3.1 锁存器
3.3.2 触发器
3.3.3 寄存器
3.3.4 内存组成
3.3.5 内存芯片
3.3.6 RAM和ROM
3.4 CPU芯片和总线
3.4.1 CPU芯片
3.4.2 计算机总线
3.4.3 总线宽度
3.4.4 总线时钟
3.4.5 总线仲裁
3.4.6 总线操作
3.5 CPU芯片举例
3.5.1 Intel Core i7
3.5.2 德州仪器的OMAP4430片上系统
3.5.3 Atmel的ATmega168微控制器
3.6 总线举例
3.6.1 PCI总线
3.6.2 PCI Express
3.6.3 通用串行总线USB
3.7 接口电路
3.7.1 输入/输出接口
3.7.2 地址译码
3.8 小结
习题
第4章 微体系结构层
4.1 微体系结构举例
4.1.1 数据通路
4.1.2 微指令
4.1.3 微指令控制:Mic-1
4.2 指令系统举例:IJVM
4.2.1 栈
4.2.2 IJVM内存模型
4.2.3 IJVM指令集
4.2.4 将Java编译为IJVM
4.3 实现举例
4.3.1 微指令和符号
4.3.2 用Mic-1实现IJVM
4.4 微体系结构层设计
4.4.1 速度与价格
4.4.2 缩短指令执行路径长度
4.4.3 带预取的设计:Mic-2
4.4.4 流水线设计:Mic-3
4.4.5 七段流水线设计:Mic-4
4.5 提高性能
4.5.1 高速缓存
4.5.2 分支预测
4.5.3 乱序执行和寄存器重命名
4.5.4 推测执行
4.6 微体系结构层举例
4.6.1 Core i7 CPU的微体系结构
4.6.2 OMAP4430 CPU的微体系结构
4.6.3 ATmega168微控制器的微体系结构
4.7 Core i7、OMAP4430和ATmega168三种CPU的比较
4.8 小结
习题
第5章 指令系统层
5.1 指令系统层概述
5.1.1 指令系统层的性质
5.1.2 存储模式
5.1.3 寄存器
5.1.4 指令
5.1.5 Core i7指令系统层概述
5.1.6 OMAP4430 ARM指令系统层概述
5.1.7 ATmega168 AVR指令系统层概述
5.2 数据类型
5.2.1 数值数据类型
5.2.2 非数值数据类型
5.2.3 Core i7的数据类型
5.2.4 OMAP4430 ARM CPU的数据类型
5.2.5 ATmega168 AVR CPU的数据类型
5.3 指令格式
5.3.1 指令格式设计准则
5.3.2 扩展操作码
5.3.3 Core i7指令格式
5.3.4 OMAP4430 ARM CPU指令格式
5.3.5 ATmega168 AVR指令格式
5.4 寻址
5.4.1 寻址方式
5.4.2 立即寻址
5.4.3 直接寻址
5.4.4 寄存器寻址
5.4.5 寄存器间接寻址
5.4.6 变址寻址
5.4.7 基址变址寻址
5.4.8 栈寻址
5.4.9 转移指令的寻址方式
5.4.10 操作码和寻址方式的关系
5.4.11 Core i7的寻址方式
5.4.12 OMAP4430 ARM CPU的寻址方式
5.4.13 ATmega168 AVR的寻址方式
5.4.14 寻址方式讨论
5.5 指令类型
5.5.1 数据移动指令
5.5.2 双操作数指令
5.5.3 单操作数指令
5.5.4 比较和条件转移指令
5.5.5 过程调用指令
5.5.6 循环控制指令
5.5.7 输入/输出指令
5.5.8 Core i7指令系统
5.5.9 OMAP4430 ARM CPU指令系统
5.5.10 ATmega168 AVR指令系统
5.5.11 指令集比较
5.6 控制流
5.6.1 顺序控制流和转移
5.6.2 过程
5.6.3 协同过程
5.6.4 陷阱
5.6.5 中断
5.7 详细举例:汉诺塔
5.7.1 Core i7汇编语言实现的汉诺塔
5.7.2 OMAP4430 ARM汇编语言实现的汉诺塔
5.8 IA-64体系结构和Itanium 2
5.8.1 IA-32的问题
5.8.2 IA-64模型:显式并行指令计算
5.8.3 减少内存访问
5.8.4 指令调度
5.8.5 减少条件转移:判定
5.8.6 推测加载
5.9 小结
习题
第6章 操作系统层
6.1 虚拟内存
6.1.1 内存分页
6.1.2 内存分页的实现
6.1.3 请求调页和工作集模型
6.1.4 页置换策略
6.1.5 页大小和碎片
6.1.6 分段
6.1.7 分段的实现
6.1.8 Core i7的虚拟内存
6.1.9 OMAP4430 ARM CPU的虚拟内存
6.1.10 虚拟内存和高速缓存
6.2 硬件虚拟化
6.3 操作系统层I/O指令
6.3.1 文件
6.3.2 操作系统层I/O指令的实现
6.3.3 目录管理指令
6.4 用于并行处理的操作系统层指令
6.4.1 进程创建
6.4.2 竞争条件
6.4.3 使用信号量的进程同步
6.5 操作系统实例
6.5.1 简介
6.5.2 虚拟内存实例
6.5.3 操作系统层I/O举例
6.5.4 进程管理实例
6.6 小结
习题
第7章 汇编语言层
7.1 汇编语言简介
7.1.1 什么是汇编语言
7.1.2 为什么使用汇编语言
7.1.3 汇编语言语句的格式
7.1.4 伪指令
7.2 宏
7.2.1 宏定义、调用和扩展
7.2.2 带参数的宏
7.2.3 高级特性
7.2.4 汇编器中宏处理的实现
7.3 汇编过程
7.3.1 两趟汇编的汇编器
7.3.2 趟扫描
7.3.3 第二趟扫描
7.3.4 符号表
7.4 链接和加载
7.4.1 链接器的处理过程
7.4.2 目标模块的结构
7.4.3 绑定时间和动态重定位
7.4.4 动态链接
7.5 小结
习题
第8章 并行计算机体系结构
8.1 片内并行
8.1.1 指令级并行
8.1.2 片内多线程
8.1.3 单片多处理器
8.2 协处理器
8.2.1 网络处理器
8.2.2 图形处理器
8.2.3 加密处理器
8.3 共享内存的多处理器
8.3.1 多处理器与多计算机
8.3.2 内存语义
8.3.3 UMA对称多处理器体系结构
8.3.4 NUMA多处理器系统
8.3.5 COMA多处理器系统
8.4 消息传递的多计算机
8.4.1 互联网络
8.4.2 MPP——大规模并行处理器
8.4.3 集群计算
8.4.4 多计算机的通信软件
8.4.5 调度
8.4.6 应用层的共享内存
8.4.7 性能
8.5 网格计算
8.6 小结
习题
参考文献
附录A 二进制数
附录B 浮点数
附录C 汇编语言程序设计
索引
在线试读
第1章
Structured Computer Organization, Sixth Edition
概 述
数字计算机是通过执行人们给出的指令来完成工作的机器。描述如何完成一个确定任务的指令序列称为程序(program)。每台计算机的电路都只能识别和直接执行有限的简单指令,所有程序都必须在执行前转换成这些指令。这些基本的指令几乎都不会比下面的指令复杂:
两个数相加。
检查某数是否为零。
将一些数据从计算机内存的某些单元复制到另外的单元中。
计算机的这些原始指令共同组成了一种可供人和计算机进行交流的语言,我们称其为机器语言(machine language)。设计一种新的计算机时,人们必须首先决定它的机器语言中包含哪些指令。通常,原始指令应尽量简单,兼顾考虑计算机的使用要求和性能要求,以降低实现电路的成本和复杂度。正因为大多数机器语言如此简单,使用起来才显得十分困难和乏味。
通过对计算机的这些简单描述,我们可将计算机结构化为一系列抽象机,每台抽象机都建立在其下层抽象机的基础上。这样,计算机的复杂性就在可控范围内,计算机系统的设计也可在有组织和系统的状态下进行。我们把这种方法称为结构化计算机组成(structured computer organization),并以此命名本书。下一节我们将解释它的含义,然后回顾一下计算机发展历史和这当中一些有影响的机型。
1.1 结构化计算机组成
正如前面提到的,在方便人们使用和方便计算机实现之间存在着巨大的差距。人可能要做X,而计算机只会做Y。这就有问题了。本书的目的就是解释如何解决这个问题。
1.1.1 语言、层次和虚拟机
这个问题可从两个途径解决,两者都需要设计一个比内置的机器指令更方便人们使用的新的指令集合。这样,新的指令集合也构成了一种语言,我们称为L1,对应地把机器中内置的机器语言指令组成的语言叫L0。两种途径的不同之处在于采取什么办法让只能执行用L0写的程序的计算机执行用L1写的程序。
一种途径是在执行用L1写的程序之前生成一个等价的L0指令序列来替换它,生成的程序全部由L0指令组成。计算机执行等效的L0程序来代替原来的L1程序,这种技术叫做翻译(translation)。
另一种途径是用L0写一个程序,将L1的程序作为输入数据,按顺序检查它的每条指令,然后直接执行等效的L0指令序列计算出结果。它不需要事先生成一个L0语言的新程序。我们把这种方法称为解释(interpretation),把完成这个过程的L0程序称为解释器(interpreter)。
翻译和解释其实是类似的。两种方法中L1的指令终都是通过执行等效的L0指令序列来实现的。区别在于,翻译时整个L1程序都先转换为L0程序,然后L1程序就被抛弃,新的L0程序被装入计算机内存中执行。执行过程中,运行的都是新生成的L0程序,控制计算机的也是L0程序。
而解释时,每条L1指令被检查和解码之后将立即执行,不生成翻译后的程序。这里,控制计算机的是解释器。对它来说,L1程序仅仅只是数据。这两种方法,以及后来它们的综合,都得到了广泛的应用。
比起理解翻译和解释这两个概念,想象存在一种假想的以L1为机器语言的计算机或虚拟机也许更简单一些。让我们把这种虚拟机定义为M1(相应地,把原来的以L0为机器语言的虚拟机定义为M0),如果这种计算机可以以足够低廉的成本得到,那就根本不需要L0这种语言或者是执行L0语言程序的机器了。人们可以简单地用L1写程序并让计算机直接执行。即使因为使用L1为语言的虚拟机太贵或太复杂而不能由电子电路构成,大家还是可以写L1语言的程序。这些程序可以用能直接被现有计算机执行的L0语言程序翻译或解释。换句话说,大家完全可以像虚拟机真正存在一样用它们的语言写程序。
为使翻译或解释现实可行,两种语言L0和L1的差别不能“太”大。这条限制经常意味着,虽然L1比L0好一些,但对于多数应用来说还不理想。这也许会导致对提出L1的初目的——减轻程序员不得不用一种更适合计算机的语言来描述算法的负担——有些失望。然而,不应该是绝望。
显然,解决问题的办法是发明一种比L1更面向人且少面向机器的指令集来取代它,这个指令集形成的语言,我们可以称为L2(对应的虚拟机称为M2)。人们可以像用L2作为机器语言的虚拟机真正存在一样用L2写程序,然后翻译成L1或用L1写成的解释器来执行。
这种发明一系列语言,每种都比前一种更方便人们使用的步骤可以无限制地继续下去,直到后找到一种合适的语言。每种语言都以前一种为基础,我们可以把使用这种技术的计算机看成一系列层(layer或者level),如图1-1所示,一层在另一层之上。底部的语言或层简单,而上面的语言或层复杂。
图1-1 多层计算机
语言与虚拟机之间存在着重要的对应关系。每种机器都有由它能执行的指令组成的机器语言,也就是说,机器定义了语言。类似地,语言也定义了机器——即机器要能执行用这种语言写的所有程序。当然,由某种语言定义的机器真正用电子电路实现的话可能会十分复杂和昂贵,但我们依然可以想象它的存在。以C、C++或Java语言作为机器语言的机器确实会很复杂,但用今天的技术实现起来也不会很难。可是我们有充分的理由不建造这么一台机器:与其他技术比起来,它的成本太高。真正实用的设计应该同时具有成本上的优势,仅仅具有理论上的可行性是不够的。
一般意义上讲,有n层的计算机可看成n台不同的虚拟机,每一台的机器语言都不相同。我们将交替使用术语“层”和“虚拟机”表示同样的意思。值得注意的是,就像计算机学科中许多其他术语一样,“虚拟机”还有其他的含义,我们将在本书的后续章节中介绍。只有用L0语言写的程序可以被电子电路直接执行,无须进行中间翻译或解释。用L1、L2、…、Ln写的程序必须经低层解释器解释或翻译成对应于低层的另一种语言。
为n层虚拟机写程序的程序员不必关心下层的翻译器或解释器,程序由计算机的结构来保证正确执行,而不必管它是不是由解释器一步步地执行后交给下一个解释器或电子电路直接执行。对于这两种情况,结果都一样:程序被执行了。
多数使用n层计算机的程序员只对顶层感兴趣,这一层与底层的机器语言差别。然而,那些想了解计算机到底是如何工作的人就必须研究所有的层,而那些设计新计算机或新层的人也必须熟悉顶层之外的其他层。将计算机分为一系列层的概念和技术以及这些层的组成细节构成了本书的主题。
Structured Computer Organization, Sixth Edition
概 述
数字计算机是通过执行人们给出的指令来完成工作的机器。描述如何完成一个确定任务的指令序列称为程序(program)。每台计算机的电路都只能识别和直接执行有限的简单指令,所有程序都必须在执行前转换成这些指令。这些基本的指令几乎都不会比下面的指令复杂:
两个数相加。
检查某数是否为零。
将一些数据从计算机内存的某些单元复制到另外的单元中。
计算机的这些原始指令共同组成了一种可供人和计算机进行交流的语言,我们称其为机器语言(machine language)。设计一种新的计算机时,人们必须首先决定它的机器语言中包含哪些指令。通常,原始指令应尽量简单,兼顾考虑计算机的使用要求和性能要求,以降低实现电路的成本和复杂度。正因为大多数机器语言如此简单,使用起来才显得十分困难和乏味。
通过对计算机的这些简单描述,我们可将计算机结构化为一系列抽象机,每台抽象机都建立在其下层抽象机的基础上。这样,计算机的复杂性就在可控范围内,计算机系统的设计也可在有组织和系统的状态下进行。我们把这种方法称为结构化计算机组成(structured computer organization),并以此命名本书。下一节我们将解释它的含义,然后回顾一下计算机发展历史和这当中一些有影响的机型。
1.1 结构化计算机组成
正如前面提到的,在方便人们使用和方便计算机实现之间存在着巨大的差距。人可能要做X,而计算机只会做Y。这就有问题了。本书的目的就是解释如何解决这个问题。
1.1.1 语言、层次和虚拟机
这个问题可从两个途径解决,两者都需要设计一个比内置的机器指令更方便人们使用的新的指令集合。这样,新的指令集合也构成了一种语言,我们称为L1,对应地把机器中内置的机器语言指令组成的语言叫L0。两种途径的不同之处在于采取什么办法让只能执行用L0写的程序的计算机执行用L1写的程序。
一种途径是在执行用L1写的程序之前生成一个等价的L0指令序列来替换它,生成的程序全部由L0指令组成。计算机执行等效的L0程序来代替原来的L1程序,这种技术叫做翻译(translation)。
另一种途径是用L0写一个程序,将L1的程序作为输入数据,按顺序检查它的每条指令,然后直接执行等效的L0指令序列计算出结果。它不需要事先生成一个L0语言的新程序。我们把这种方法称为解释(interpretation),把完成这个过程的L0程序称为解释器(interpreter)。
翻译和解释其实是类似的。两种方法中L1的指令终都是通过执行等效的L0指令序列来实现的。区别在于,翻译时整个L1程序都先转换为L0程序,然后L1程序就被抛弃,新的L0程序被装入计算机内存中执行。执行过程中,运行的都是新生成的L0程序,控制计算机的也是L0程序。
而解释时,每条L1指令被检查和解码之后将立即执行,不生成翻译后的程序。这里,控制计算机的是解释器。对它来说,L1程序仅仅只是数据。这两种方法,以及后来它们的综合,都得到了广泛的应用。
比起理解翻译和解释这两个概念,想象存在一种假想的以L1为机器语言的计算机或虚拟机也许更简单一些。让我们把这种虚拟机定义为M1(相应地,把原来的以L0为机器语言的虚拟机定义为M0),如果这种计算机可以以足够低廉的成本得到,那就根本不需要L0这种语言或者是执行L0语言程序的机器了。人们可以简单地用L1写程序并让计算机直接执行。即使因为使用L1为语言的虚拟机太贵或太复杂而不能由电子电路构成,大家还是可以写L1语言的程序。这些程序可以用能直接被现有计算机执行的L0语言程序翻译或解释。换句话说,大家完全可以像虚拟机真正存在一样用它们的语言写程序。
为使翻译或解释现实可行,两种语言L0和L1的差别不能“太”大。这条限制经常意味着,虽然L1比L0好一些,但对于多数应用来说还不理想。这也许会导致对提出L1的初目的——减轻程序员不得不用一种更适合计算机的语言来描述算法的负担——有些失望。然而,不应该是绝望。
显然,解决问题的办法是发明一种比L1更面向人且少面向机器的指令集来取代它,这个指令集形成的语言,我们可以称为L2(对应的虚拟机称为M2)。人们可以像用L2作为机器语言的虚拟机真正存在一样用L2写程序,然后翻译成L1或用L1写成的解释器来执行。
这种发明一系列语言,每种都比前一种更方便人们使用的步骤可以无限制地继续下去,直到后找到一种合适的语言。每种语言都以前一种为基础,我们可以把使用这种技术的计算机看成一系列层(layer或者level),如图1-1所示,一层在另一层之上。底部的语言或层简单,而上面的语言或层复杂。
图1-1 多层计算机
语言与虚拟机之间存在着重要的对应关系。每种机器都有由它能执行的指令组成的机器语言,也就是说,机器定义了语言。类似地,语言也定义了机器——即机器要能执行用这种语言写的所有程序。当然,由某种语言定义的机器真正用电子电路实现的话可能会十分复杂和昂贵,但我们依然可以想象它的存在。以C、C++或Java语言作为机器语言的机器确实会很复杂,但用今天的技术实现起来也不会很难。可是我们有充分的理由不建造这么一台机器:与其他技术比起来,它的成本太高。真正实用的设计应该同时具有成本上的优势,仅仅具有理论上的可行性是不够的。
一般意义上讲,有n层的计算机可看成n台不同的虚拟机,每一台的机器语言都不相同。我们将交替使用术语“层”和“虚拟机”表示同样的意思。值得注意的是,就像计算机学科中许多其他术语一样,“虚拟机”还有其他的含义,我们将在本书的后续章节中介绍。只有用L0语言写的程序可以被电子电路直接执行,无须进行中间翻译或解释。用L1、L2、…、Ln写的程序必须经低层解释器解释或翻译成对应于低层的另一种语言。
为n层虚拟机写程序的程序员不必关心下层的翻译器或解释器,程序由计算机的结构来保证正确执行,而不必管它是不是由解释器一步步地执行后交给下一个解释器或电子电路直接执行。对于这两种情况,结果都一样:程序被执行了。
多数使用n层计算机的程序员只对顶层感兴趣,这一层与底层的机器语言差别。然而,那些想了解计算机到底是如何工作的人就必须研究所有的层,而那些设计新计算机或新层的人也必须熟悉顶层之外的其他层。将计算机分为一系列层的概念和技术以及这些层的组成细节构成了本书的主题。
评论
还没有评论。