精华 周末随想:数据 vs 代码
发布于 10 年前 作者 bnuhero 3771 次浏览 最后一次编辑是 8 年前 来自 分享

1. 程序 = 数据结构 + 算法

这是瑞士计算机科学家Niklaus Wirth写的一本书:Algorithms + Data Structures = Programs。这本书揭示了算法和数据结构之间的紧密关联关系。

Wirth是几种计算机编程语言的设计者,包括Pascal和Modula-2等。他获得了1984年的图灵奖。

从另外一个角度,这个句话也说明了程序就是代码(指令)作用于数据。

2. Arduino之哈佛体系结构

当前计算机的主流体系结构是冯诺依曼结构,其中一个很重要的概念是“存储程序”:代码和数据统一保存在内存中。由于冯诺依曼曾经在普林斯顿大学高等研究院工作,所以也叫做普林斯顿体系架构。

Arduino是一个开源的电子平台,创意工作者和设计人员用它制作好玩的交互硬件产品。为了测试Johnny Five框架,我特意买了一个Arduino UNO R3的板子以及一些周边硬件。在实验中,我发现Arduino采用的是哈佛体系结构:代码和数据分别使用不同的存储。具体来说用32KB Flash存储保存程序,用2K 静态内存保存程序处理的变量等,还有1K EEPROM持久性地保存某些数据。

3. OOP vs FP

Object无疑是面向对象程序设计(Object Oriented Programming,OOP)的核心概念,它把数据和对数据的操作(代码)封装在一起。OOP主要关注Object的组合。

Function是函数式编程(Functional Programming,FP)的核心概念。FP的函数有一个重要性质是:函数的输出仅仅与函数的输入参数相关,不会修改程序的全局状态。从这个意义上,我们可以把纯函数视为一段处理代码,数据流进函数,处理完后流出函数,即实现了数据和代码的分离。这种结构很适合并行计算和分布式处理的实现。FP主要关注Function的组合。

4. 轻量级虚拟机 vs Docker容器

其实容器(container)技术由来已久,如Solaris系统的Zones和FreeBSD的Jails。就是Linux系统,也早就有OpenVZ和LXC。那为什么大家都没有Docker这么声势浩大呢?不知道,也许是创始人或者投资者有很好的营销手段和广泛的人脉吧。

细分起来,OpenVZ/LXC与Docker创建的容器是不一样的。前者创建的是轻量级虚拟机,它们有自己的启动服务和配置,用户通常在一个容器中安装应用所需的应用服务器、数据库等等,相当于应用的数据(状态)和代码都封装在一台容器中。而Docker的容器每次没有启动服务,所以建议用户每个容器就运行一个无状态应用程序,数据(状态)是以数据卷的形式附加到容器上。也就是Docker容器把代码和数据分离了。

5. 结束语

  • 冯诺依曼结构、OOP和轻量级虚拟机:封装了代码和数据;
  • 哈佛体系结构、FP和Docker容器:分离了代码和数据。

看资料若有所思,暂且记下来,还请大家多指正。

回到顶部