Oberon 操作系统:被忽略的珍宝
推荐一篇很久以前看的文章:Oberon - The Overlooked Jewel
它介绍的是 Niklaus Wirth 设计的一种操作系统,叫做 Oberon。Niklaus Wirth 就是大家熟知的 Pascal 语言的设计者。绝大部分人都没听说过有 Oberon 这个东西存在,更难以把它跟 Niklaus Wirth 的大名挂上钩。所以作者说:“Wirth 因为 Pascal 而闻名于世,可是接下来几年,他成为了 Pascal 的受害者。” 确实是这样。Wirth 一直都不觉得 Pascal 是他的杰作。我想他应该会更喜欢以 Oberon 闻名于世。
Oberon 比起 Unix,有很大的不同,在于它的数据都是结构化的。进程间不通过字符串交换数据,而是直接使用数据结构。很奇特的一点是,Oberon 操作系统是用一种同名的程序语言(Oberon 语言)写成。令人惊讶的是,在那个年代,ETH 计算机系的所有教职员工,学生,包括办公室的大妈,都是用的这种操作系统。
操作系统的设计,真是天外有天。
之所以找到这个系统,是因为我一直在试图利用程序语言的设计原理,设计一种超越“Unix 哲学”的操作系统。这里是我的设想:
这种系统里面的程序间通信不使用无结构的字符串,而是使用带有类型和结构的数据。在这样的系统里面,“程序”的概念基本上完全消失。系统由一个个的“函数”组成,每个函数都可以调用另外一个函数,通过参数传递数据。每个函数都可以并发执行。
由于参数是一个数据结构,而不是字符串,这避免了程序间通信繁琐的“编码”和“解码”过程。使得“进程间通信”变得轻而易举。任何函数都可以调用另一个函数来处理特定类型的数据,这使得像 “OLE 嵌入”这样的机制变得极其简单。
所有函数由同一种先进的高级程序语言写成,所以函数间的调用完全不需要“翻译”。
由于这种语言不允许应用程序使用“指针运算”,应用程序不可能产生 segfault 一类愚蠢的错误。
由于没有指针运算,系统不再需要现代处理器提供的“内存映射”机制,以及 TLB。这使得内存访问效率大幅提高。而且简化了处理器的设计。
操作系统使用与应用程序相同的高级语言写成(可能需要支持一些“特权操作”),至于“系统调用”,只不过是调用另外一个函数。
操作系统的“shell”,不过是一个这种高级语言的 REPL。用户可以在终端输入各种函数调用,从而启动进程的运行。
系统不需要 SQL,不需要关系式数据库。所有的数据都作为“对象”,保存在一个分布式的数据空间。
系统不需要“文件系统”。所有的数据,包括“进程上下文”自动被“版本控制”,在合适的时候作为对象同步到磁盘。所以即使在机器掉电的情况,绝大部分的数据和进程能够在电源恢复后自动继续运行。
程序员和用户完全不需要知道“数据库”或者“文件系统”的存在。程序假设自己拥有无穷大的空间,可以任意的构造数据。
为了减少数据的移动,系统根据数据的位置,选择: 1)迁移数据,或者 2)迁移处理数据的“进程”。程序员不需要使用 MapReduce,Hadoop 等,就能进行大规模并行计算。
这个操作系统是如此的“一致”,以至于所有的用户和程序员,只需要学会一种很简单的程序语言。
我曾经以为我是第一个想到这个做法的人。可惜的是,调查之后发现,很多人早就已经做出了类似的系统(虽然缺少对把它用于分布式计算的设想)。Lisp Machine 似乎是其中最接近的一个。Oberon 是另外一个。我只能说,英雄所见略同。