程序原本(四十七):程序设计的核心思想——执行体与它在执行过程中的环境(关联数组可以维护一个计算过程所需的一切参考)

阅读数:31 2019 年 9 月 28 日 18:30

程序原本(四十七):程序设计的核心思想——执行体与它在执行过程中的环境(关联数组可以维护一个计算过程所需的一切参考)

接下来我们讨论与此相关的四个问题。在讨论语言与关联数组的性质的过程中,这些问题分别在以下章节中出现过:

  • 第 4 章,第 4.5 节 你真的理解这行代码吗?
  • 第 7 章 数据结构:散列存储

其一是增删 Name 的必要性,即如果一个语言认为变量是计算的前设——亦即是它不支持变量的动态声明,则我们只需要一个静态的关联数组来维护其背景,否则我们需要一个动态维护的关联数组。这意味着我们在静态语言和动态语言4中都可以使用关联数组。尤其重要的是,对于静态语言来说,我们可以在编译期使用关联数组,而无需在数据区保存一个用来复查的 Name 列表。

4 我们还没有讨论到动态 / 静态语言这一分类方法。这里简单地从标识角度来定义它们,即静态语言是指标识(例如“变量”)在程序执行前就已经完全预知的,动态语言则允许在程序执行过程中新建它们。

其二是 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)。上下文是保证一个运算具有确定性的主要方式,换言之,它相当于语言中的语用这一要素。对于计算来说,在此前的讨论中我们说过“数据确定,则运算确定”,因此关联数组本质上也只是在这种情况下为计算维护了一些数据而已。

评论

发布