公共命名空间的想法出现自2019年,到现在有三年了。在2022年底,总结一下这三年来的想法。
就像字符集+字体,公共命名空间+新编译原理也是这么一对儿。字符集用来收集所有符号,字体用来显示字符集中的符号;公共命名空间用来收集所有的句子,新编译原理用来实现这些句子。
公共命名空间是一个四维空间,四个维度分别是:句子、方言、同位素、冗余项(rǒng)。
为了在二维的电脑屏幕上呈现四维空间,先呈现前两个维度。每一行是一个句子,每一列是一个方言。在行与列交叉处是单元格,点开单元格,是另一个二维表:每一行是一个同位素,每一列是一个冗余项。
以hello world程序为例,它是一个句子,不同的计算机语言有不同的写法。不同的hello world程序位于公共命名空间中的同一行,不同列。包括现有的计算机语言和未来的语言,它们都用不同的列来区分。
这么一来,有机会进行翻译,从语言A翻译成语言B,其过程只是个查表操作。另外,还有机会进行协作,A国的程序员完成句子甲,B国的程序员完成句子乙,通过翻译,A、B方言中就都有句子甲、乙了。
如果编译器或汇编器能看懂公共命名空间,就能实现多语言混合编程。从语法最简单的汇编语言开始,中国的程序员实在想不起来把浮点数转换成定点数的指令是FTINT,他就写下一句中文,汇编器去公共命名空间中查表,找到那一句,完成任务。
使用纯中文写汇编程序是个疯狂的想法,但是默认程序里一个中文字也没有,也是种极端。中英文混合编程,是好的。之后还可以翻译成纯中文或纯英文,让中国的程序员或外国的程序员都能看懂。
每一行是一个句子,同时,每一行也是一个同位素。同位素的概念来自于化学元素周期表,表示功能相近却又略有不同。用行来区别句子和同位素,出于同一个约定。每一列是一个方言,同时,每一列也是一个冗余项。冗余项表示功能完全相同的情况,方言从某种意义上来讲,就是一种冗余。用列来区别方言和冗余项,出于同一个约定。
冗余项必不可少,有了冗余项,就能避免叫“姥姥”还是“外婆”的矛盾。中国象棋里,有兵和卒、将和帅的冗余,这是语言融合过程中的现象。在国际象棋里,为了避免名字的冲突,让更多人喜欢玩,采用了图形,即立体雕像的方式,这是西方人的智慧,也能解决问题。
填充公共命名空间,并保持项目间的一致关系,需要付出巨大的劳动量,任何单位和个人都不能独立完成。设想中,公共命名空间是一个网站,由全世界的程序员来填充。每个人都能建造自己的方言,当对计算机语言有某些不满或期待时,可以在公共命名空间中表达。然后,语言的制造者运用新编译原理,实现计算机语言。
把信息量巨大的语言压缩成一个几百KB的程序?如果能实现当然好,但实际上这么做很难!不如看着公共命名空间进行汇编、编译和解释。把巨大的信息量放在四维的表格里,这么一来,编译器就能比较简单了,或者说,就能够集中精力解决编译器应该解决的问题了。
中文编程被说了许多年,没有形成规模。原因在于独裁和垄断,强迫全中国的程序员用一种方式编写程序,这是种垄断。或许其中包含了许多姥姥/外婆的矛盾,导致中文编程被诟病。姥姥和外婆没有本质矛盾,用if还是如果都可以,宽容一点才能实现语言的统一。
从计算机发展的历史来看,出现过许多字符编码,它们互不相通,最后归于unicode。现在的状态是,有许多计算机语言,没有公共命名空间,就像二十年前的情形一样。所以,应该建设公共命名空间,化解如此多语言的混乱局面。
输入法也很重要,甚至可以说是第五维度。如果美国的程序员有输入法,他们就不会发明atoi、itoa之类的简称,源代码的语义就更清晰了。公共命名空间中的句子,应该用全称而不是简称。过度使用简称,会导致语言敏感,错一个字意思就全变了,用敏感的语言编写程序很辛苦。
当程序员想求最小公倍数时,输入zxgbs,这里说的是中国的程序员,输入法就显示“求[ ]和[ ]的最小公倍数至[ ]”这一模板,程序员填充模板。敲击键盘5下,得到一长串句子,由于公共命名空间是确定的、有限大的空间,输入法能完成这一任务。
以上仅为公共命名空间,它还需要新编译原理才能成为生产力。而新编译原理的研究十分艰难,主要成果有:从优先级低的符号开始,把源代码拆分,然后逐个理解。语法树支持多重类型,每个节点上有一张两列多行的表格,表格的两列是key、value,表格的每一行是一重类型。每个节点有4个指针,分别指向父、长子、兄、弟。尤其是兄弟节点,它提供了实现上下文有关文法的可能。