程序原本(九十):系统的基础部件——依赖(数据 (x) 的全集 = 数据 (x') + 操作 (x'') + 状态 (Sx))

阅读数:28 2019 年 10 月 5 日 13:42

程序原本(九十):系统的基础部件——依赖(数据(x)的全集 = 数据(x') + 操作(x'') + 状态(Sx))

一个简单的数据依赖的模型可以是这样的3

3 这个示例基于 Peter Van Roy 和 Seif Hardi 在《计算机编程的概念、技术和模型》(MIT Press,2004)一书中对“可观测的非确定性”(Observable nondeterminism)的讨论,原示例使用 Oz 语言。

复制代码
x = 100;
function foo_1() {
x++;
}
function foo_2() {
x--;
}

在这个模型中,若foo_1()foo_2()是分布的,我们最终将不知道 x 如何分布,因此它们都必须使用数据 x 的全集。

如前所述,我们承认这种状况必然存在,无论它是发生于foo()函数的循环展开,还是用于解决foo_1,…,foo_N之间逻辑的时序依赖问题。我们的问题仅仅在于:如何让foo_1,…,foo_N持有这个数据x

我们必须再次确认“x 的全集”的含义。若“x 的全集”是一个有限的数据集合4 5,例如某个内存块或者某个对象,那么“持有这个数据 x”意味着对这个 x 的全集的任意操作。这样的全集应当包括三个信息:数据、数据的操作以及数据的状态。

4 若“x 的全集”是一个无限的、增量的数据集合,那么我们这里的规则就未必适用了。对于这种情况,通常有两种处理方案:其一,若该增量具有唯一的起始或标识,则可以以之作为数据全集的映射,并进一步用它来映射其后的状态;其二,若该增量是持续发生的,则它应当被抽象为一个与时间相关的函数,因而任意逻辑在任意时刻都只可能持有该函数运行结果的一个片断——换言之,它是不可能被持有全集的。

5 在对“x 的全集”这一概念的实现上,若语言中存在变量,则变量本身即可被理解为上述的“具有唯一的起始或标识”的无限增量数据,这是它适用于上述讨论的根本原因。若语言中不存在变量,则每一个数据——在它被唯一持有时——就是全集。其三,闭包这一概念的提出,在于无论数据在时间线上映像为何,在任意时刻闭包总代表着数据全集。

其一,x 包括数据 x。显然,x 应当包括 x,它必然是可计算数据的一部分。尽管 x 在概念上能够指代可计算数据的全体,但在应用中仅是其部分,这就如同变量在概念上指代任何数据,但在具体的代码中只表达确定数据。

其二,x 包括上述数据集合 x 的所有已知操作 x。对于某个确定的时间(所谓“已知”,便是与时间相关的),x 具有确定的操作 x。这基于两条理由:首先,使得 x 在某一时间的操作具有不确定性——也就是说,既能够应用某个操作,又不可应用该操作——的逻辑是不存在的6;其次,若存在在将来可能发生于 x 的其他操作,那么这些操作与 x 也将构成其他的数据集合。

6 此前我们已经讨论过“计算的不确定性是对机器计算是否有价值的终极拷问”这一问题。它既是我们能通过“计算机语言”进行机器计算的基础,也是使得我们能够正确地将这样的计算应用于一个“数据全集”的基础。

其三,x 包括指示它自身的状态 SxSxx 之于时间的信息,这意味着 x 在一个持续过程中可以被分别处理,这个信息既可以看做是 x 之于时间的依赖,也可以看做是 x 之于“某时的处理者”的依赖。

综上,x 必须是{x,x,Sx}的全集。

评论

发布