上一篇文章中说我记不得什么时候知道洪峰这个人了,当时我估计是2007年。因为之前和他通过邮件交谈过,于是我去我的旧gmail邮箱找到了那封信,发现那时候居然是2005年10月份,看来我的记忆确实不行了。
和他通过邮件交流,是因为我对他说的新一代操作系统和TeX实现非常困惑,于是发邮件去询问。他在邮件中也回复了我一些东西,可惜由于我自身水平的问题,还无法全面理解邮件中没有什么私人内容,因此贴出来洪峰应该不会有意见,而且说不定有心人看到了也许可以增长知识,也算是大功一件。
下面是第一封信的截图:
当时是我之前已经给他发了一封信询问,但可能由于编码问题,洪峰那边看不到,于是让我再发一次。我重新发送了一次后,对方给了我第二封邮件:
里面对方(根据邮件的落款,我怀疑前面的几封信不一定是洪峰本人回复的)用英文对我的问题逐一回复,我简单的用中文复述一下:
关于第一个问题,对方说:“事实上,FreeBSD和GNU/Linux已经在中国获得了它们的市场,尽管多数PC用户仍然在使用M$。”(下一段)“MING/OS(或MNM OS)与Un*x的哲学不同,你在它的基本观点中找不到文件和进程,他们都被Scheme的s-exp和线程取代了。”
关于第二个问题,对方说:“NeoTeX是MING/OS的桌面。它支持互联网应用程序,特别是与专家系统的接口。”
- 关于我询问的他们的杂志从哪里可以买的问题,对方回复:“请把你的通讯地址用中文写给我,我可以给你寄一份。”
然后我回复说我还无法理解这样做有什么优点,而且也不理解为什么Un*x系统把一切视为文件的哲学需要革新,然后洪峰(落款是他)回复了一份比较长的邮件,复制如下:
我说:“基于元内核的系统或许是一个新概念,但我不理解它是否能给我们带来什么好处。就如您所说的那样,MING/OS中将不再有文件和进程的概念,也许这很先进,但我们真的需要它吗(这让我想起了微内核与单一内核之间的争论)?(我很想听听您关于Un*x不足之处的讨论)。”对方回复:
如果你知道了 UN*X 的缺点, 也就会开始明白 MING/OS 的一些优点了.
UNIX 的设计哲学是基于文件系统和进程的, 实际上, 进程也是当作文件来操作的, UNIX 的根目录下有 /proc 子目录, 在开机之前, 目录是空的,机器启动了, 操作系统运行之后, 各种与进程有关的东西就写进了这个目录的文件中. 所以 UNIX 的进程是当作一种特定的文件被调度的.
这里隐含的问题有两大类(无论是微内核还是整天内核):
整个UNIX 内核是一个编译了的二进制代码快, 其语义对于开发人员之外的广大用户是不可解的, 因此对于用户而言, 内核的运行时系统的行为是不可随意改变的,
- 文件系统中的文件(对于内核而言)是一个没有语义的容器, UNIX 设计哲学把语义的处理交给了应用程序的开发人员去处理. 在 UNIX 历史的早期, UNIX系统上有五花八门的文本处理工具: 从 shell (光shell的种类就有差不多一打), sed+awk, troff, Perl,.. 都是以文本为基本的操作对象, C 语言起初就是一个字符处理器(CHAP, CHAracter Processor), 这就是为什么 C 语言故意把字符串设计为字符数组的根本原因, 因为 UNIX 系统是作为字符处理系统设计的.
还有一个问题(当然这个问题在 UNIX 诞生时不存在): 那个时候计算机网络没有流行, Internet 的前身是分组交换网络, 是1968年才提出, 1970年UNIX 诞生时还处在其他实验室的科研人员的头脑中, 一个程序在单机上能运行起来就不错了.
文件中内容的语义缺失是问题的核心, 没有语义的暴露, 那么文件的内容是不可理解的, C 编译器在编译 C 程序时产生了符号表, 语义树就记录在那里, 你调试C 程序时, 这个符号表帮助你的调试器工作, 但是编译结束后, 程序可以正常运行时, 符号表就被扔掉了, 因此你得到的 C 的二进制代码(包括 UNIX 内核) 的语义随之消失了.
这就是 UNIX 的核心问题, 也是当今软件工业界面临的最最根本的问题.
解决问题的对策仍然在对文件这一概念的改造上, 如果文件这个容器中的内容含有一种通用的结构来表示语义, 那问题就有求解的可能性.
基于数组的结构很紧凑, 从存储效率和访问效率上它最好, 但是,当你向数组插入东西,删除东西的时候,问题就马上出来了, 因此, 数组存在多媒体等大容量不用插入删除修改数据很好, 但是文件的内在结构不能定位在数组这种结构上, 因为文件是需要经常被插入和删除数据的, 如果你对数据结构课程的内容很清楚, 你马上会明白链表是正确的选择. 链表在访问效率上比数组差一些, 但是在数据的插入和删除上远远好于数组.
前面提到的符号表(symbol table), 在编译器中一般采用 hash-table 来存放和表示, 而哈希表可以利用递归的方法采用链表来表示. 即通过链表的嵌套表示. 因此这一切都回到了 LISP 的设计哲学上, LISP 是 LISt Processor, 它是列表处理器!
W3C 的 XML 就是 LISP 的列表的一种变形, 在列表的基础上, W3C 在拼命工作, 推出各种语义的规范, 所以, 万维网的实质是什么你现在应该看得很清楚了 — 它在利用形式语言标准化各种数据的语义.
在我看来, W3C 不会彻底成功, 充其量只能成功一半. 这是因为数理逻辑的研究结果已经指出, 只有一阶谓词演算是可靠的, 多阶或者高阶谓词系统不能满足公理系统的完备性和相容性 (具体参考哥德尔的工作). 这个结论很残酷, 但是, 它给语义问题的研究划出了一条边界线.
任何一个基于一阶谓词的逻辑系统, 例如我们定义语言的形式语言, 它所建立的边界的闭包都是静态边界. 在这个边界内部的推演(按照形式语言定义的规则)是可靠的. 当时对边界之外的东西, 这个系统是无法辨异同的, 我们不能判定其真假.
计算机互联网扩大了计算的边界, 因此, 它要求可以动态调整语义系统的定义, 从而(按照计算的需要)动态地扩充其闭包所能覆盖的范围, 具体的做法就是, 你随时可以从网络上弄来一个语义树, 把这棵树安装到你原来的系统中的某个节点上, 一旦完成了安装, 那么你就建立了新的闭包, 因为新引入的树引入了新的拓扑空间.
UNIX 内核无法满足这样的任务, 很难想像对一个没有语义的二进制代码块如何在运行时系统中引入一棵新的语义子树.
“明”操作系统的元内核设计彻底扔掉了文件系统的概念, 在明系统的元内核看来, 一切东西都是 Scheme 的符号表达式(S-exp). 元数据和元程序都是它, 从而同一了数据和程序的表达方式, 再对自然语言的基本语义块进行标准化, 即可一举连通”人-机, 机-机, 人-人”网, 形成一个泛系网络.
现在你可以看出这么几点:
数学修养的重要性;
自主创新绝对需要独立思考, 不能人云亦云;
- 新时代下的创新往往是多个学科交叉的结果,
我说:“我有一个感觉,洪先生领导的MNM Project想把Lisp Machine和ITS系统带到今天,重现当年黑客们的理想(就如Eric Raymond的《黑客文化简史》中一样)。如果真是这样,那么MNM Project一定将是一个非常有趣的项目,尽管我尚未完全理解,我也希望你们能成功。”对方回复说:
在 LISP 前辈的基础上, 我比前辈们做的工作更加深入, 这没有什么奇怪的, 因为我生活在一个物质基础完全不同的时代.
明系统的元内核已经完成了, 现在进入了第二阶段, 把 NeoTeX 设计出来, 即这个系统的用户界面. FPGA 的引入将是第三阶段的事情, 我明年去瑞士 ETH 后要完成它.
致意,
洪峰
洪峰这人现在哪儿去了?