- 内容提要
- 序 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 已死
8.5 关联数组可以维护一个计算过程所需的一切参考
接下来我们讨论与此相关的四个问题。在讨论语言与关联数组的性质的过程中,这些问题分别在以下章节中出现过:
- 第 4 章,第 4.5 节 你真的理解这行代码吗?
- 第 7 章 数据结构:散列存储
其一是增删 Name 的必要性,即如果一个语言认为变量是计算的前设——亦即是它不支持变量的动态声明,则我们只需要一个静态的关联数组来维护其背景,否则我们需要一个动态维护的关联数组。这意味着我们在静态语言和动态语言 4 中都可以使用关联数组。尤其重要的是,对于静态语言来说,我们可以在编译期使用关联数组,而无需在数据区保存一个用来复查的 Name 列表。
其二是 Name 作为前设,但其值仅在计算过程中可知,这一绑定关系可以变成在上述背景中的一个值的修改。也就是说,
a = a * 5
可以映射为:
aAssociativeArray['a'] = aAssociativeArray['a'] * 5;
与此相关的, a
的确定性(是否可以改变值)也可以映射为对 aAssociativeArray
中的名字 a
的访问限制,即 aAssociativeArray['a']
是否可写。
其三是如果我们需要在计算过程中新建一个数据,它的含义无非是我们要在上述关联数组中添加一个“名/值”。例如我们在上述背景中执行如下代码:
eval('var x=1000')
如果这行代码得以执行,它表明需要动态创建 x
这个名字,我们只需要将该 Name 添加到 aAssociativeArray
中,并置值为 1000 即可。当然,这也相应要求 aAssociativeArray
是可以动态维护的。
其四,如果我们试图在运算过程中访问一个并不存在的名字,对于没有这一项需求的静态语言来说, aAssociativeArray
(可选的)可以不保存 Name 列表;对于动态语言来说,它将表现为在 aAssociativeArray
中无法查找到某个 Name。
可见,对于一个计算过程来说,关联数组可以维护它所需的一切参考,所有的数据性质都可以表述为关联数组与其存取的性质。我们称这一运算所需的参考为 上下文环境(context,context environment) 。上下文是保证一个运算具有确定性的主要方式,换言之,它相当于语言中的语用这一要素。对于计算来说,在此前的讨论中我们说过“数据确定,则运算确定”,因此关联数组本质上也只是在这种情况下为计算维护了一些数据而已。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论