- 内容提要
- 序 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 已死
16.1 在逻辑/数据时序依赖之间转换的基本方法
我们提到过“(逻辑或数据的)时序依赖”,是在时间维度下不可分解的。这意味着某些逻辑不可分布,而另一些情况下,某些数据也不可分布。对于后者,我们讨论了一种可能的、与处理逻辑相关的解:数据不可分布时通常会使逻辑趋向于复杂,例如需“判断 100M 数据的边界上是否存在换行”等。但这样的思路让我们陷入了困局:对于逻辑的时序依赖,那么又是否有解呢?
“挖坑、栽树”是一个(典型的、纯粹的、逻辑的)时序依赖活动。首先,这个系统中涉及的“坑”与“树”是不同的数据,相互间没有必然的依赖关系。其次,我们的的确确无法在时序上把它的逻辑倒置过来:无论是一个人来做,还是一群人来做这件事情,总得等挖完坑后才能栽树,这时多个团队或者 CPU 的多核并没有起到作用。
但注意一个细节 :只有当我们将“挖坑、栽树”过程理解为“在 位置 A 上挖坑,并在 位置 A 上种树”时,“位置 A”才是这两个步骤的数据依赖。一旦去掉这个数据依赖,“挖坑”与“栽树”这两个行为本质上其实是没有依赖的,例如在“在 位置 A 上挖坑,并在 位置 B 上种树”就变得可行了。
这带来一个有趣的结论:我们(也许) 1 总是可以通过添加一层数据抽象,来将“逻辑的”时序依赖,变成“数据的”时序依赖。例如我们此前提到的:
- 函数 B 用于计算函数 A 的执行时长,则函数 B 必须在函数 A 逻辑结束之后执行,
就可以理解为:
- 设有时间戳 X,函数 B 修改该时间戳,而函数 A 统计该时间戳的修改。
两个逻辑作用于同一个数据(无论它们分别拿该数据来做何种处理),这是一个明显的特性。当这种特性存在时,我们称该数据是多个逻辑的 数据依赖2 。仅当我们能够通过对数据依赖的分析(而非对动态的逻辑执行结果的分析)就能确立这种依赖时,我们才可以自动化地分布与协调这些分布。
换言之,分布方式的确立以及在多个分布逻辑之间的协调等问题,都可以转化为对 数据依赖 的处理。再综合我们此前讨论的“数据的不可分布能够通过复杂的逻辑来解决”,最终可以得出这样一个结论:逻辑的不可分布并非无解,它最终可以被聚焦于“用于处理 数据依赖 问题的逻辑”的复杂性。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论