中语言计算技术研究与发展联盟
舒生羽 wzyorg@gmail.com
在中语言的设计理念中,指称是程序的三要义之一,事实上指称也是一切使用语言的人,或者思维体,之间交流的基础。虽然指称是如此的普通和常见,但细致追究起来,我们将会发现指称是个非常微妙和复杂的东西。
在程序语言内,名字是表示指称的基本工具,而用于表示指称的另外一个基本工具是场合(context),通过使用名字和场合这两个基本工具,程序基本上就实现了对程序世界内一切物体的征引以及操作,从而达到了指称的基本目的,这是在程序语言发展的初期就具有的特征,比如C语言里面的情况。
在具有模块和名字空间特征的语言内,指称概念得到跳跃发展。范围(scope)限定辞(qualifier)是对场合的明确和发展运用,比如C++里的名字空间(namespace),以及其它模块化语言的模块等等,是很显然的例证。多载(overload)则是在另一条途径上让指称得到更加便利的实现,因为我们无须为概念上类似或者相同但是参数上有所不同的算法提供非常别扭的不同名字。
泛指(generic)编程范式则将程序语言在指称方面的技术带入一个新时代。泛指得指称可以通过指称的组合和计算来完成。这与以往的指称相比是个质的变化。在c++里面,实现泛指编程范式的基本工具是模板(template),包括类模板(class template)和函数模板(function template)。中语言的泛指特征实现是建立在C++的泛指机制之上的,它们二者在一定程度上是同构的,但是它们不仅在形式上有着根本区别,而且在观念上有着根本差异。尤其是将这种形式与汉语联系起来时,我们不得不立即对这种特征发出惊叹,因为它给我们的观念确实带来了巨大冲击。为了解中语言这种特征与汉语的特殊关系,我们必须先在指称及和自然语言的关系上作些分析。
当我们将对指称的研究领域转向自然语言时,很快就会发现这里的情况非常复杂,即使我们只是将研究范围限制在纯粹通过语言本身,也就是完全是通过语言的语音和字符等元素来表示而非通过诸如人体姿势或者表情等其它东西所表示的指称。
这种复杂性有时可能会引起人在思维上的迷惑和情感上的抱怨,譬如我们经常会听到有人说汉语缺乏精确性,我们也的确曾在语文学习中被告知到汉语里面有各种微妙的歧义和双关等等东西。但经过冷静的分析,我们不会说这些问题,实质上是指称问题,是汉语本身的问题,而是会认识到这是表达者和理解者自身或者单方或者双方在思维上存在的问题。
对此的浅显理由是,汉语本身只是一套符号体系,而且是具有相当的容错包容度和宽松表达自由的符号体系,它本身并不会对使用其基本元素,包括字符和句式等,构造出的符号序列在语义的正确性上负责。这种免责是极其自然和合理的。
有过编程经验的人应该很容易明白这一点。一个程序,也就是一个符号序列,是否正确一般要在两个阶段被评判,首先是第一阶段评判是否语法正确,通过这一阶段后该程序才真正被该语言规则接受,成为该语言的真正程序。然后是在使用过程中判断程序是否符合设计要求的第二阶段。第二阶段的正确与否判断比第一阶段的判断复杂和困难得多。第一阶段的判定对于具体的程序对所有的计算机语言而言几乎都是一个简单有效而且完全确定的规则推理过程,然而第二阶段的判断是多少有些主管评价在内的,而且一般而且其在本质上是不可用规则推理来给出确定性判断的,虽然人们仍然在孜孜不倦的为此努力。
我们需要注意的是,一个工程师用某种语言花了很大的劲写出的一个程序,一个符号序列或者若干符号序列,不管其存在哪个阶段的错误,我们习惯上都会认为该程序是该语言的程序,而不会认为它不是程序或者不是该语言的程序。即使该程序有某种错误,我们一般不会认为该语言有错误,因为如果真的是语言有错误,则在现实中这种语言根本不会被使用。当然特定的计算机语言可能会容易在程序内造成某方面的错误,这也成为计算机语言发展的动力之一。
当然自然语言同程序语言有着根本区别。而这种区别更加强化了那种免责的自然与合理性。自然语言与程序语言的首先区别是自然语言不是按照规则设计出来的,而程序语言是这样的。而且人之间对程序语言本身以及相关事物的交流似乎都必须借助自然语言,反之则似乎不是。自然语言是创造的原动力,而程序语言是这种创造力在某个领域的化身和影像。自然语言具有最大的包容性,程序语言更像是自然语言的一个子集和分支。
这种区别的明显表现就是当我们使用自然语言时,不存在有什么方便的工具如程序语言那里的情况一样来执行所谓的语法检测过程。当然不同的语言有着不同各种标记来充当类似的功能。比如所谓曲折语言就有诸如单数复数,时态等各种标记。与那些曲折语言相比,汉语就显得的非常的单调和直白。因为汉语里面几乎没有这些东西,相反,汉语在形式上非常的宽松,几乎没有规则,这就给表达带来了最大的自有,当然也为使用者和理解者提供了许多制造语义错误的机会。但这写错误并非是汉语本身的问题。而且这似乎并非是汉语本身的缺陷。因为如果我们将思考聚焦到有着悠久历史的数学和物理领域,那么就会发现那里的核心部分是有各种公式表达的。而这些公式的表达是不存在单数复数以及时态等标记的。如果我们又将思考聚焦到计算机语言领域内,则也会发现没有哪种语言存在单复数和时态标记的,虽然那些语言的设计者所使用的自然语言都是有这些标记的。
因此,我们立刻应该意识到汉语其实是一种天然的计算语言,也是一套天然的符号推演系统。而且,汉语由于自身所具有的强大表达自由,也使得汉语在所有自然语言中具有最强大包容和统一能力。自然,将程序设计语言包容在汉语范围内就是一件可行而且自然的事情。中语言正是这样一种努力的结果。
当然,有些人仍然习惯于将自身在使用汉语过程中遇到了某些困难的责任归咎于汉语。而且他们的行为不止于此,他们更爱宣扬汉语是落后的,对于现代知识,尤其是科学存在根本性缺陷的观点。他们甚至妄言,或者以实际行动来促成,汉语必定要被淘汰。
基于前面的分析,我们很清楚的看到了这些人的愚蠢和无知。当然还是有过编程经验的人能够领会到这种愚蠢和无知带来的乐趣。因为他们常常会看到一个满怀自信的新手程序员在写出了一个自以为很了得的程序后,但却遇到了编译错误或者运行错误。这时这位自信的程序员或者认为这个语言有问题,当然这是非常罕见的,因为这种愚蠢因为太极端而太罕见。更多的更明智的情况则是他会认定编译器出现了问题,甚至会发下以人头担保之类的誓言来断定程序的错误不在于自身。干这行的自然都知道这多半是个笑话。
基于前面的分析,我们还可就这些愚蠢者和无知者断言,他们必然不能掌握现代的数学和物理这些富含计算和推理的科学。而实际情况也确实如此,那些愚蠢者和无知者,尤其是其中叫嚣最狂者,或者是些只是能说会写的文人,或者是些在自己的领域内没有什么成就却有许多怨妇气质的所谓科学家。
在对自然语言内的指称作些客观的分析后,我们会意识到指称从来都不是绝对的,而总是相对和特定的。因此语言内的指称在偏执者那里总是会产生歧义和误解是一种必然和普遍现象。这种歧义与误解并非是语言本身固有的,在最宽泛的意义上我们可以说这是思维固有的,或者说这是我们的世界固有的。而这既然是固有,我们也许可以把它当作一种天然缺陷,但在尊重宇宙和人类漫长进化史的角度上,我们也许可以而且更应该将其看作一种天然禀赋和特质。在不执着于理解者感受到的歧义上,我们会发现这样的禀赋和特质里有着无限的便捷和灵活。
对此我们可以从熟悉的汉语那里得到更具体的理解。公孙龙子提出的著名的“白马非马”论对于我们在指称上的思考有着非常多的启发和参照作用。下面我们将就这个论题展开阐述,并给出现代计算机语言上的证明。
当我们说到“马”这个词时,如果抛弃任何特定的场合,那么也许它最多只能准确指称这个符号本身,而且素是要限定在汉语范围内。因为一旦要认定其已经指称到其它实物时,我们就会有许多的歧义了。譬如这是在指称一匹马,还是在指称一群马,或者是在指称抽象意义上的动物学意义上的马那样一个物种等等。而当在说“马”这人的面前站着一匹马,人们应该都会认定他说的“马”是在对这匹马进行指称,而说马者本人一般也应该对此表示认同。正是这样的双方的认同,人于人之间,或者不同的思维体之间的交流才得以实现。
“白马非马”这个论题还可以让我们从中看到汉语的更多的有趣的东西,但是我们并不想就此法进行细致分析。我们稍后会以现代计算机语言领域内的形式来给出这个论题的证明,而在那之前我们将焦点转移到中语言内的泛指概念。
中语言的泛指首先是在就汉语对指称的表示习惯作出思考后得出的,然后又意识到这同C++的模板(template)概念在实质上存在相当的一致,于是后来在G++的帮助下,汉语的指称习惯和计算机语义得到了现代化的结合,同时也就产生了中语言的泛指概念。
下面以论证“白马非马”的过程来介绍中语言的泛指概念及其表达形式。
中语言的泛指是一个以泛指参数册和泛指名字组合起来的指称实体,指称对象是一个(当前是抽象层面的)实物集合。
中语言泛指的基本形式的定义大致如下:
<%泛指的参数册 %>-泛指的名字
这里的泛指的参数册其实等同于C++的模板参数(template-parameters-list),而泛指的名字等同于C++里面的模板名字(template-name)。
从上面我们看到中语言只是将C++的模板形式颠倒了一下,这似乎是个没什么稀奇的无聊之举,然而就是这样一个颠倒,中语言程序在可读性上和思维的感觉上对于汉语使用者而言就带来了惊奇的进步。而中语言还将泛指概念扩张到多维泛指概念,在那里我们将进一步领略到这种惊奇的效果。后面的文章将会介绍多维泛指的概念。
我们可以将“<%泛指的参数册 %>-泛指的名字”这个整体称之为泛指式。在提供具体给泛指参数册内的参数提供具体的值后我们可以构造出泛指式的特指式,其形式如下:
<特指佐数册 >-泛指名字
我们可以将这个整体叫做泛指式的特指式,或者实例(instantion),或者专门(specialization)。这里的特指佐数册其实就是C++里面的模板佐数册(template-argument-list),而特指式就是C++里面的模板标牌(template-id)。
在这两个概念的和前面介绍过的物类概念的基础上,我们就可以证明公孙龙子的论断了。
首先定义“色”型这个皿型(相当于C/C++里面的enum型):
色: 皿 = { 白, 黑, 红
//省略其它};
再定义泛指类:
<%毛色: 色%>- 马: 类= {//省略其它各种属性和方法
};
最后以白色为泛指佐数册构造上面泛指类的特指类,这里其实不用特别声明可以下面直接使用,这也是C++的特征。
那匹马: <白>-马;
从上面的三段程序我们看到了
“<白>-马”非“马”
因为前者是马这个泛指类的特指式,而后者是马这个泛指类的名字。
上面那条论断用汉语的自然书写形式表示出来显然就是
白马非马
由此我们以绝对的形式完成了“白马非马”这个论题的形式证明。对此,你是否信了呢,我不会说“不管你信不信,反正我信了”。其实我们也不会真的去问“你是否信了”,因为这本身无关信与不信,它本来就存在那,只不过是你是否察觉到它了而已。
然而自这个论段被提出之后,就有许多自信者要以驳倒或者批判这个论题为己任。如果在不对这个论断进行深刻的语言和概念分析,这的确容易引起人们根据思维和语言习惯产生的反对。据说实际上公孙龙子也并非这个论题的原始作者,他只是这个论题最负盛名和最有影响的宣讲者。在当时这个论断的支持者一般被归类为名家。在对这个论断的著名反驳者来自儒家学者,这是合理的,因为儒家一直自以为高明的,并且在后世长期占据中国的学术主流。这里著名的故事有孔子的四世孙孔穿上门与公孙龙子进行的辩驳,但他未能给出让人信服的理由,反而让公孙龙子使得这个论断让人感到无可辩驳。虽然这可能是个杜撰的故事,但是儒家学说无能令人信服的驳倒这个论断却是个不争的事实。
在这个论断上儒家与名家这样的较量结果是其实是自然的。因为这个论题是一个关系到语言和形式证明的深刻问题,而那些儒生(指的是那些正常的儒生而非其中的另类),他们是一群智力平庸的人,但是有着背诵和抄写两种特长(这里自然不把背诵和抄写算作智力)。当然他们还有另外的特长,比如在为人处世上的奸巧和虚伪等等。
但儒家学说后来长期占据了中国的学术主流。“白马非马”这个论断自然也就一般被定义为诡辩论。这显然是违背最基本的推理原则的。这样的儒家学说长期统治中国文明的结果必然是尖端智力的下降和整个文明的败落。因而,在许多年后中国文明被更加富有聪明才智的科技文明渗透和席卷也就是件非常自然的事情。在这种局面发生后,历史已经走过了两千多年。然而还是有许多的人不断的对“白马非马”的论断作出自以为是的反驳和批判,正如当年孔穿之类所做的那样。
当然,现在这些人的脑袋里已经装进了各种名为什么学,什么主义和什么法的并让他们得以狐假虎威而趾高气扬的泊来品。所以,这次他们用上了什么逻辑学,什么唯物主义,还有什么自然辩证法等等种种他们自称也许真的自信为世间最先进最厉害的东西来批驳这样一个两千多年前的古人作出的论断。在经过了各种云来雾去的饶舌和颠来倒去的纠缠后,他们于是得出了什么这是诡辩论,偷换概念,割裂了联系和对立统一以及什么形而上学等等种种让他们自信满满的成果来。他们自以为大获全胜,自以为让别人看到了他们的高明和睿智。
然而,从我们前面的简短分析可以看到,这是一个完全精确的论断。在我们的论证里面没有半点强词夺理,也没有半点的含混糊弄,而是白纸黑字的一段纯形式和客观的自然构造。也许那些人中的坚信和诚实者会迫不及待的将我们带到一匹白色的马跟前,或者是直接将一匹白色的马牵到我们跟前,然后指着这么一匹马大声的向我们质问道:“难道这不是一匹马吗?”。是的,这当然是一匹马。然而我们更愿意指出的是他们的问题在于他们仍然没能领会到指称和场合在语言内的意义,尽管他们的思维也能感受到指称与场合的存在。
如果我们有兴趣稍微偏离这个论题而去思考古今这个论题的反对者间的异同,则我们马上会发现更多有意思的东西。
他们在表面上当然有许多的不同,比如他们所处时代不同,他们所拥有的知识不同等等,而且他们中的现代者一般都认为自己是古代者的超越者或者反对者。虽然有如此多的不同,但我们更关心他们的相同之处,而分析可以证明他们的确在实质上是一回事情。
这种相同当然不只是他们在这个论题上持的反对意见上,这种相同存在于多个方面,如学术和政治等等。显然我们这里只适合在纯学术上作些简要分析。这些反对者首先在认知上有一个共同的自以为是的缺乏包容的态度,而在智力技术上他们又都有着偏执与含混不清的缺陷,同时他们又都无理性根据的对自己的意见抱有莫名其妙的优越感。他们的儒学或者马克思主义或者其它他们奉若神明的学说都只是他们被用来强力粗鲁的批驳他们认为是错误者的终极武器,而这种武器的使用几乎无关推理,最多只是些含混的说辞在反复。事实上,他们的思维构造也决定了他们无法给出一个清晰和客观的反驳,因为那些他们认为至高无上并且完全仗仰的的学说给他们的思维带来的实质上只是一片片空洞和一团团浆糊。他们在世人面前显示出来的也只能是这样一片片空洞和一团团浆糊,而这是任何昂贵奢侈的和纷繁复杂的装饰品所无法遮掩的。
中国文明的悲剧正在于长期以来这样的人,或者说脑残,一直是中国学者中的主流——占有主要学术资源的流派。因此中国文明衰弱就是件自然而然而且理所当然的事情。我们也因此不难理解中国的尖端智力从战国时代到今天存在显著的下降趋势了。
下面是个使用中语言泛指构造的程序。
来 朴库.标准进出; 名{ 动力型: 皿 = { 脚踏 = 30, 马 = 40, 汽 = 220, 动 = 600 }; <%动力: 动力型%>- 车: 类= 公{ 行驶: (时间: 元)->()= { 打印文套("坐%s车花了%d小时,行驶了%d里\n", 动力 之名, 时间, 动力 * 时间); } }; 旅行者: 类= 公{ 生: ()= { 打印文套("我出发了\n"); } 死: ()= { 打印文套("我到了\n"); } <%车: 类%>- 旅行: (时间: 元)->()= { 车子: 车; 车子.行驶(时间); } }; } <%主动者: 字%>- 爱: (被动者: 字)->()= { 打印字(主动者); 打印字('爱'); 打印字(被动者); 打印字('\n'); } 道: ()->()= { //使用中语言来描述旅行 { 我: 旅行者; 一小时, 三小时, 二小时 := 1, 3, 2; 我.<脚踏>-车-旅行(一小时); 我.<马>-车-旅行(三小时); 我.<汽>-车-旅行(一小时); 我.<动>-车-旅行(二小时); } 打印字('\n'); //使用中语言来进行爱的表达 <'我'>-爱('你'); }
程序的执行结果如下:
官网文件参考:
http://zhongyuyan.org/中语言/超酷程序/泛指.html