- 内容提要
- 序 1:程序里的世界
- 序 2:最后一层表象
- 关于本书
- 致谢
- 引言:简单的本源
- 篇一:计算系统
- 第 1 章 数,以及对数据的性质的思考
- 第 2 章 逻辑
- 第 3 章 抽象
- 篇二:语言及其面临的系统
- 第 4 章 语言
- 第 5 章 从功能到系统
- 篇三:程序设计的核心思想
- 第 6 章 数据结构:顺序存储
- 第 7 章 数据结构:散列存储
- 第 8 章 执行体与它在执行过程中的环境
- 第 9 章 语法树及其执行过程
- 第 10 章 对象系统:表达、使用与模式
- 篇四:应用开发基础
- 第 11 章 应用开发的背景与成因
- 第 12 章 应用开发技术
- 第 13 章 开发视角下的工程问题
- 第 14 章 应用程序设计语言的复杂性
- 篇五:系统的基础部件
- 第 15 章 分布
- 第 16 章 依赖
- 第 17 章 消息
- 第 18 章 系统
- 篇六:系统的基本组织方法与原理
- 第 19 章 行为的组织及其抽象
- 第 20 章 领域间的组织
- 附一:主要编程范式 及其语言特性关系
- 附二:继承与混合,略谈系统的构建方式
- 附三:像大师们一样思考——从 UML 何时死掉 谈起
- 附四:VCL 已死,RAD 已死
6.2 用有限大的区域来代表一个待运算的数据
冯•诺依曼体系的计算机,是以控制器、运算器和存储器为核心的,分别映射我们此前讨论的计算(范式)、算和数这三个方面。因此,如同我们对“算数”的理解一样 1 , 存储器的结构以及它在计算系统中的抽象 ,也直接限制了计算及其逻辑。对于这个“抽象”,我们简单地说就是:顺序地址存储。
除了 Bit、Byte、Word、DWord 等与位宽直接相关的、具有数学或物理传输含义的类型——它们显然是顺序表示的值——之外,我们常见的在计算机中用的信息/数据有哪几种形式呢?布尔值算一种,它表示开关、正误等判断,是我们执行逻辑的一个基础;数值算一种,作为数学运算的对象,与我们计算系统的本质设定有关;字符(以及字符串)算是一种,因为它是我们程序员或用户可以正常理解的东西。这三类数据,构成了 计算系统 向(可用的) 计算机 发展的主要条件 2 。而这三种数据中,除了布尔值可以由计算系统的最小存储单元(bit)来表示之外,其他两种都必然面临“如何存储”的问题。
对于这个问题,“顺序地址存储”的核心思想是:设运算器可以通过一个(数值标识的) 地址 ,从存储中获得一个(有限大小的) 区域 ,则该区域可以表示为一个待运算的 数据 。以 Intel 系统的个人计算机(PC,Personal Computer)中,x86 芯片(CPU,运算器)为例 3 :
- 芯片通过寄存器来读这个地址的值,因此寄存器可以表示的数值大小,决定了地址值的大小;
- 同上,因为芯片也使用寄存器存储计算所需数据,因此上述区域(连续可读取的位数)的大小也是由寄存器可以表示的数值大小来决定的。
那么,首先,待运算的 数据的大小 就被转义成了 区域的大小 ,进而变成了运算器与存储器之间的 位宽 问题。所以 32 位的机器上一个(能直接参与 CPU 运算的)值的大小,就是 232,如果要理解为“有符号整型数”则是±231,因为符号用掉了一个位(bit)。同样,我们要运算浮点数的话,也要把它“挤”在这 32 位中去表示,例如常用的 IEEE 754 浮点数表示法 4 。再者,我们要表示字符的话,也是通过对 32 位的组合序列做出定义,将它们一一表示为我们的书写字符,例如 ASCII 字符集、GB2312 字符集,以及 UTF8、UTF32 字符集等。
接下来,可能表示的 地址 ,也被转义为上述的位宽问题。因为地址是数值标识的 5 ,所以它表达的是一个连续空间中的位置(可以想象为数轴上有限区间的点)。根据上述的原则,以 32 位的 CPU 为例,该“顺序地址存储”方案:
- 可以找到的最后的数据的位置索引就是 232,
- 可以从该位置(以及其他任意位置上)读取的最大可能值是一个无符号的 32 位整型数(DWORD) 6 。
所以跳开我们熟悉的 x86 芯片去做软件开发的时候(例如单片机),我们常常需要问:寻址空间有多大,基本数据单元是多大。如果没有这样的信息,就无法通过某种语言编程去控制它,因为连一个基本的、与计算机交流的环境都搭建不起来。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论