科幻,公共命名空间

1

C语言的命名空间有点乱,C++有namespace,但也没好到哪去。他们共同的缺点是:没有公共命名空间。
如果国家动员大家建设公共命名空间,那么人们会分为四个流派:简约派、完整派、中文派、反对派。
举例来说:
‌atoi
‌ConvertStringToInteger
‌把字符串转换成整数
‌……
反对派用沉默抗议,或者写一些乱七八糟的东西,打乱刚刚建立起来的秩序。
因为有反对派存在,所以,需要把不同人的劳动成果分离,不要把所有食物混在一个桶里!
中文派也区分为简约中文派、完整中文派,这里边的完整中文派,出现了一个极端,即要求所有人,把所有代码都用中文书写。
这受到了抵制,首先站出来的是简约派里的简约英文派。他们天生着急,写字、说话力求简练,例如多年以前的Perl语言流派,仔细计算敲击键盘的次数,他们把foreach简化成for,把m/…/前面的m也去掉了。
简约英文派不都是英国人或美国人,其中也包含大量中国人。例如曾经在讨论中文编程时,某大牛就直言:“我认准了敲if比如果快”,他是坚决反对中文编程的,并且坚决反对用中文把句子完整地写出来。
事情的转机出现自一次考古,X国发现了一个古代文明的痕迹,并且出土了大量写有古代文字的碎片。考古学家们开始破解这些文字,他们失败了。
全世界的目光投向了中国,中文是世界上所剩不多的,从古代一直用到现代的语言。“文化需要传承”,这是第N届联合国秘书长的发言。
完整中文派收到了讯号,开始活跃起来,他们的理由和目标是,“让2000年以后的人类,也能看懂今天编写的程序”。
这是有一点难的,即使是中文这种传承度很好的语言,现代普通话和2000年前的文言文差别也是很大的。要让2000年后的人类看懂现在的程序,一样是有难度的。
简约派开始嘲笑完整派,认为他们是在做无用功。直到有一天,两个简约派程序员吵起来了……
你写的atoi是个鸟意思!
你写的才有问题!
原来,这两个程序员都写了atoi函数,其中一个写的是把字符串转换成整数的atoi,另一个写的是ATestOfInput。
他们两个的函数名重复了,这就是命名空间里的“碰撞”。
只是名字碰撞了,又不是飞机碰撞了。全中国同名同姓的人多了去了,也没见出乱子啊!
暂时不提同名同姓的问题……哦,提一提也行。有人计算过了,要使得全中国人在未来2000年内无重名,需要六个字!
在民间已经有人意识到重名的危害了,他们给孩子起四个字的名字。可是理论计算的结果却是,四个字不够,要六个字!
我们来计算一下,看看那两个程序员为什么会碰撞。他们都采用了4个英文字母做名字,而4个英文字母能表示多少名字呢?264=45万多。
这个atoi是早期C语言的函数名,那时的函数不多,没有产生冲突。发展到后来,函数越来越多,大于45万个了,自然就发生冲突了。

2

公共命名空间应该是一个网站。
网上流传着一句话:“公共命名空间可以终止命名空间的混乱,但它本身就是个十分混乱的东西,用更大的混乱来终止混乱。”这句话说得好像是用暴力终止暴力(以暴制暴)一样。
这让我联想起了秦始皇,他出生在战国时期,瞧这名字就知道这个时期没少打仗。秦始皇用更大的暴力终止了暴力,或者统一文字本身就是一件十分“暴力”的事情?但是,不管秦始皇用怎样的手段统一了文字,大家用同样的文字,确实方便啊。
国家现在决定推广公共命名空间,大有要模仿秦始皇,统一文字的意思。秦朝只有15年,之后是汉朝。现在的民族,叫汉族,现在的语言,叫汉语。而秦腔是一种曲艺形式,并且跟秦始皇没什么联系。
说了这么多,公共命名空间还是个网站,上面有许多人的许多言论。当然,主要还是编程方面的,像这些关于秦始皇的讨论,都在灌水区。是大家工作之余的消遣而已。
具体说一说,它是怎样一个网站。它是四维空间在二维平面上的投影,这么说有点迷糊。简单来说,公共命名空间=(句子 方言 同位素 冗余项)。打开公共命名空间,首先呈现在面前的是一个二维表。表的每一行代表一个句子,每一列代表一门方言。在行与列的交汇点,是可以点开的单元格,点开后,呈现出来的是,每一行是一个同位素,每一列是一个冗余项。
例如上文中说的,国家推广公共命名空间后,人们分成了简约派、完整派、中文派、反对派,这四个派别。前三派都是愿意建设公共命名空间的,只是方式不同。对于同一个句子,他们的言论被放在同一行,而用不同的列加以区分。对的,有一种方言名叫简约派,还有一种方言名叫完整派,当然还有中文简约派,和中文完整派。
在某一行,写着:
把字符串转换成整数,
ConvertStringToInteger,
atoi
这三句是用三种不同的方式描绘同一个意思,所以放在同一行里。这便是四维的公共命名空间的前两个维度。那么剩下的两个维度呢?它们是同位素和冗余项。同位素说的是,同一个句子的多个分支,它们的意思有微小的差别。这个概念来自化学中的同位素,例如,氕氘氚是氢的同位素,他们拥有相似的物理化学性质。例如,ConvertStringToNumber这个句子,它就拥有ToInt16/ToInt32/ToInt64这三个同位素。这三个同位素对应三个函数,这三个函数的性质相似,略有不同。冗余项说的是,意思完全相同。例如,
把字符串转换成数字将字符串
将字符串转换成数字
这两个函数只差一个字,且意思完全相同,他们两个是冗余项。汉语有很多冗余项,如中国象棋里的“将/帅”“兵/卒”,又如亲戚称呼中的“姥姥/外婆”。
同位素和冗余项不可或缺,没有同位素,公共命名空间将变得十分混乱,没有冗余项也是不可能的,人们将产生类似于叫姥姥还是叫外婆这种争执,实际上是一些小问题,但如果没有冗余项,它就会变成大问题。

3

上文说到公共命名空间分为四个维度:句子、方言、同位素、冗余项,这四个维度要想在二维平面上呈现出来,需要一些技巧。
每一行代表一个句子,每一列代表一门方言;每一行代表一个同位素,每一列代表一个冗余项。
为什么句子和同位素都放在行里?方言和冗余项都放在列里?这个问题不难回答,先从冗余项说起。方言本身就是一种冗余,表达同样的意思,用汉语也行,用英语也行。对计算机来说,用汉语表达还是用英语表达,就跟“把字符串转换成数字/将字符串转换成数字”一样,它们是不同的字符串,但却表达相同的意思。
同位素对于人来说是相似的,对于计算机来说,是不同的。对计算机来说,int和Int都是不同的,为了让人看着舒服,有了同位素。句子和同位素都表达不同的意思,所以放在不同的行里。
关于谁放在行里,谁放在列里,也值得推敲一下。要不然,等工程进行到一半,有人提出异议,要来个“乾坤大挪移”,那可就乱了套了。
这个公共命名空间的大工程,预计有100万个句子,2000个方言!就像人们已经非常熟悉的Excel表格一样,有很多列,有更多行。更何况,这2000个方言并不是每个人都要掌握,具体一个人,可能只需要熟悉那么两三种方言就行了。
可句子有更多,100万远大于2000,在屏幕里,上下滚动比左右滚动方便,所以,结论来了,每一行代表一个句子,每一列代表一门方言。
说到这里,有人便想着如何编程,他计划用四维数组表示公共命名空间,这样做不好。应该用点别的数据结构,具体是什么,我还没有想清楚。
只说一说要求吧,一开始,各个方言独立发展,且各方言间所熟悉的领域不同,句子也不同。这导致,如果用四维数组实现,将产生大量空间的浪费。如A列的第一行到第四行是四个句子,B列的第五行到第八行是另外四个句子,这个二维表就只有50%的利用率。情况扩展到四维空间,利用率恐怕还会进一步降低。例如,有些句子有2个冗余项,有些句子有6个冗余项,如果用四维数组,需要按最大值准备,这就造成了严重的空间浪费。
更严重的问题是,公共命名空间是可扩充的,说不定哪天,在哪个维度上就要增加一些内容,如果使用四维数组,将产生复杂的运算量。
那么,该使用什么数据结构呢?说实话,在这方面,我的脑子是糊涂的,只能走一步看一步,没有一杆子打死的要求。
暂时放下数据结构,完整中文派又有了新的工作动力,他们实现“2000年以后也能看懂”的目标,有了用武之地。即,在公共命名空间中,建立汉语普通话,作为标准。但实际使用中,可以说点方言。
简约派也不再和完整派争执了,他们在公共命名空间中有了各自的位置。以前的争吵来自于“排他的标准”,就像金字塔的顶端,站不下太多人一样。采用竞争的机制,更优的方案拥有更高的地位,结果就是形成了金字塔。

4

埃及的金字塔是用来装死人的地方,阴气太重,离它远点……
小学时,学了一篇文章,叫《瞎子摸象》,想必大家都还有印象。国王让几个瞎子去摸大象,有人摸到了腿,说大象是个柱子;有人摸到了尾巴,说大象是根绳子……
其实他们谁也没有说完整。面对复杂的问题,我们就像故事中的瞎子一样,掌握不了事物的全貌,所以就争执起来了。
试想你是国王,你没有办法治好瞎子的眼疾,也没有时间向瞎子们讲解大象具体是什么样子,你该怎么办?你要瞎子们把他们的感受集中起来,就形成了更为完整的认识。每个人都不要以为只有自己是正确的,和自己不同的观点是错误的。事物真正的样子,往往是复杂的。
自从公开了编译原理的知识和工具以后,全世界出现了大量的计算机语言,每种语言都有优点和缺点,把它们融合在一起,形成一门更强大的语言,成了一种幻想。
有一个笑话,说的是有人跟一个程序员打赌,看他能不能在5分钟之内让其他程序员争吵起来。结果,他只说了一句:“Java是最好的语言”,其他程序员就纷纷表示自己的意见,结果就争吵起来了。和瞎子摸象的故事很像。
公共命名空间的诞生,不是为了停止程序员的争吵,而是给他们一个地方,有秩序地去争吵。并且,把争吵的内容记录下来,防止重复争吵。
所以,公共命名空间是一个网站,它接受来自世界各地的程序员的意见,并且记录下他们的谈话内容。
然后,是协作。在语言A中实现了句子1,在语言B中实现了句子2,通过翻译,A和B都有1和2了。所以,公共命名空间除了记录功能外,还有翻译的功能。具体步骤大约是,让单元格在行与列之间移动起来。把语言A的句子1,复制到语言B的对应位置,然后翻译。翻译成功之后,语言B也可以使用句子1了。
当语言A是汉语,语言B是英语时,这实现了国际合作。各国没有必要关起门来自己搞研究,计算机程序又不是核武器,没必要隐藏起来研究。尤其是计算机语言,它具有语言的特性,而语言就是要更多人使用才有更大价值的。
公共命名空间的术语:方言,汉语是一门方言,英语也是一门方言,对于更高的观察角度,这些语言都是人类地球村里的方言,而不是什么高大上的文明。文明不是排他的,文明要相互融合才能变得更强大。
在实现翻译之后,有了靠查表完成翻译的自动化软件,它能把源代码翻译成不同的方言,例如,把汉语编写的源代码翻译成英文的,让更多人能看到;又或者,把简约派的源代码,翻译成完整派的,让程序员能更准确地掌握程序的意思。
查表是通过网络实现的,翻译可以翻译整篇源代码,也可以点选一个句子,只翻译它这一句。例如,新来的程序员不知道atoi是什么意思,他选择“汉语普通话”,再选择这一行代码,机器就显示atoi对应的那个,在公共命名空间中的,很完整甚至有一点啰嗦的解释。

5

我曾经幻想过“中文汇编”,说不清是有点过于超前,还是落后了。
有了公共命名空间之后,方言之间可以直接翻译,到那时,将实现多语言混合编程。
中文汇编也是一门方言,你可以使用它编程序,也可以使用英文简写,随你便。
更多时候,用汇编写程序的人都十分“硬核”,他们能记住所有的汇编指令。此时,中文汇编只是用来给初学者学习用的。
可是高手也有犯迷糊的时候,CPU动不动就2000条指令,也有高手记不住的汇编指令。此时,临时用一句中文汇编,也不会有人责备高手,为什么没有彻底使用英文汇编。
理解万岁,团结万岁!!
理解什么是多语言混合编程,在一大段高级语言的程序中,嵌入一句mov rax,0x25,这句话是什么意思?很难确定。我不知道程序运行到这一句时,rax表示什么,可能是函数的参数之一,也可能是函数的返回值,或者是y=4cos(0.25)+2xy这一整句中间的某个临时值。
总之,混合编程有难度,需要精通多门语言,才能混合使用多门语言,这是不争的事实,没有捷径可走。
Perl语言对文本处理进行了优化,例如支持正则表达式。python很早之前也支持正则表达式,但不如perl简练。例如/…/six,这是Perl的写法,一口气加了三个参数,s表示点号可以支持换行,i表示不区分大小写,x表示忽略正则中的空白。放在python语言中,还要写成re.S re.I re.X 麻烦了不少。
把语言A中的功能移植到语言B中,如果不去大规模修改B的语法,移植的效果往往不够好。可A语言之父的劳动成果,不会轻易给B语言之父,若B语言之父大规模修改了自己的语法,他又没有了或是缺少了创作语言的荣耀。
结果就是,使用者要重新学习新的语言,这加大了使用成本。而公共命名空间的目的之一,就是翻译,让使用者可以较为便捷地从语言A过渡到语言B。
公共命名空间以句子为单位,而不是传统的那些语法单位。或许这是正确的选择,它能帮助我们实现多语言混合编程。或许这是错误的选择,它使我们走上了不归路,面对不计其数的句子,开发者退却了。
以句子为单位写程序,将面临数据爆炸!就像以像素为单位记录图像,数据量猛增一样。这二者有着高度的相似性,参考图像格式,有bmp, jpg, png, gif等许多,这四种算是典型的。
bmp格式,算法简单,有时甚至可以用简单粗暴来形容。使用bmp格式,可以准确地记录图像,但数据量是多种图像格式里最大的。
jpg格式,算法高级,是一种有损压缩,在保持画质基本不变的前提下,压缩率能达到1/10。这个压缩率很诱人,但缺点就是算法有点难,需要“专家组”来研究才能得到结果。尤其是相对于bmp那简单粗暴的算法,jpg十分高深。
png格式,一种无损压缩格式,压缩率能达到1/2,我对png格式的印象,锁定在了苹果电脑漂亮的图标上。提供给用户更高级的体验,使png格式活了下来。
gif格式,当其他格式都只是静态图像时,gif就支持动图了,当初并不宽裕的网络带宽上,出现几个会动的图片,让人眼前一亮,印象深刻。
尝试把上文中的四个流派对应到四种图像格式,没成功,不好意思发出来。例如,简约派是jpg(文件小),完整派是bmp(文件大),中文派是png(追求表达效果),反对派是gif(我也不知道为什么这么对应,可能是反对派的期望值太高吧,他们的失望导致他们成为了反对派,我这么以为)

6

现在来思考一些具体的问题,例如,怎样识别句子:
分配30个学生类至班。
要想识别这个句子,需要能够识别自然数集合,还有类型的集合,与变量的集合。
都是集合操作,最后,通过集合间的连接操作,构成整个句子。
再比如:100+200×300
分析这个句子需要不同的方法,不管是先乘除后加减,还是LR分析法,已经有很多人研究过很长时间了。
对于不同的句子,采用不同的分析方法。
基于集合论的新编译原理,先实现简单的集合,然后逐步扩展至语言的规模。每个句子都是一门微型语言。
使用经典编译原理当然能够实现,但是当以句子为单位理解源代码时,文法产生式会异常复杂,LR分析法的状态数会大幅增加,直到内存里放不下。所以,需要新编译原理。
新编译原理基于集合论,不同的集合处理不同的句子,可以用不同的方法和原理。但是,所有集合都遵守统一的约定,可以在一起工作。
经典编译原理求快,毕竟它是在几十年前设计的,那时的计算机算力有限。现在的计算机能够运行更复杂的算法,新编译原理也就应运而生。
假设源代码有M行,它们使用的方言有N个句子,则使用新编译原理,需要匹配M×N次,即使是速度很快的现代电脑,这也是个需要“等一会儿”的过程。如果是编译大型工程,等待时间会进一步增加,直到无法忍耐。
所以,每个集合都配备一个快速判否函数,用于快速判断所给句子不是该集合的句子。例如“分配30个学生类至班”的句子,如果没有发现“分配”“个”“至”这几个字词,它就一定不是该集合的句子,可以快速判否。
至此,每个集合里至少包括三个函数:快速判否函数、准确判定函数、执行函数。
基于集合论的新编译原理也离不开优先级,某些集合的“紧密程度”更高些。但是,以句子为单位理解源代码之后,对优先级的需求又变得不那么强烈了。直接判断一个句子属于哪个集合,给出对应的执行函数,执行它即可。对于需要优先级的情况,经典编译原理解决得很好,直接把yacc生成的函数复制过来,也许就能用了。
最后,说一说用空格影响优先级的设想,例如句子
100+200 *300
这句话的意思是先做加法后做乘法。这一功能看上去没用,但C语言编程经验告诉我,有些时候实在记不清算符优先级,就必须加一层又一层的括号。例如
((int*)a)[3]
因为算符优先级的关系,这里必须加两层括号。如果可以去掉一层,就成了
(int*)a [3]
这种通过空格来影响优先级的做法,不知是否可行。甚至有人想到了用公式计算符号间的紧密程度,甚至有人假设空格是一种特殊的集合。所有这些,都未能解决问题,真正的挑战,留给你。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值