说文解字

  《说文解字》,简称《说文》,是由东汉经学家、文字学家许慎编著的语文工具书著作。《说文解字》是中国最早的系统分析汉字字形和考究字源的语文辞书,也是世界上很早的字典之一。

以上是百度百科的解释,前段时间刷知乎,看到了W雨辰的一篇介绍汉字造字法(指事,象形,形声,会意,转注,假借)的文章,其介绍简单有趣,深入浅出,读完之后深感汉字造字与程序设计、尤其是面向对象设计有共同之处,写一篇文章记录下思路,感兴趣的朋友可以过来探讨下。

说文解字的格式

打开词典网,搜索“老”字,弹出来的是这样的:

《说文解字》与程序设计-LMLPHP

     《说文解字》与程序设计-LMLPHP

  其格式是这样的:某字,一张字图,X也,从XX

  比如:

  化:教行也。从匕从人,匕亦声。

  型:铸器之法也。从土刑声。

  改:更也。从攴己。

  一般来说,包括四个元素:字,图,也,从。(可能还有声)

解字

深入解字,挑一个“改”字来细究下:

改字的解释精简意赅:攴,观其形状,是一根小树枝的意思。攴己,就是用小树枝抽自己,为什么要用小树枝抽自己?是因为自己欠抽吗?

——因为[更也]。

换成面向对象的语言:

 class 更 {}
 class 攴
 {
     public 更 Do(object o);
 }
 class 改 : 攴 {}

 var o = new 改();
 var result = o.Do(new 己())

 从攴,从就是继承的意思。从支己,就是继承(攴)并调用函数传参(己)的意思。


这里有歧义的地方是“更也”,这个“更”不能仅仅做返回值处理,其更多的是表达了一种差量元数据(diff merge's metadata),这个差量元数据体现出了目的性

——鞭策自己是为了更新,这是“改”的本义。

  继续往下展开:

 class B {}
 class C {}
 class A :B
 {
      public C do()
 }

  翻译成说文解字:

  又如:

 class B {}
 class C {}
 class D {}

 class A :B
 {
      public C do()
     {
          this.RaiseEvent(new D());
     }
 }

  翻译成说文解字:

顺着这个解法,说文解字中有一系列精彩的发挥:

比如前面提到的“老”字:从人毛匕,拆开来看:从人、毛、匕hua=化),按照知乎上w雨辰的解释:就是人的毛的化的意思,人的毛可看做头发,头发变化了!就是变白了!变白了就是老了!

这样就通过人——毛——匕的链条将“老”的意思解释清楚,这个令读者使用“意会”的方式get到字的方法,按照许老的说法:叫做《说文解字》。

换成面向对象的语言:

 class 人
 {
      public object 毛 { get; set; }
 }

 var ren = new 人();
 ren.毛 = 匕;

  以程序的角度来看,毛是人的一个属性,匕是毛的当前状态值。相当于

 {人,毛,匕} => 老

  这种把多级的信息集压缩到一个平面上,使其变成一个字,这是汉字的一个造字原理。其展开方式来自于读者的意会:造字时将立体压缩成平面,理解时在读者脑子中将平面还原成立体

象形,指事,形声,会意,转注,假借

说文解字提出了六大模式(设计原则):象形,指事,形声,会意,转注,假借,其统称为六书。

用面向对象的语言寻找下对应关系:

一、象形:是最基础的一种构造,抽象出对象。  

 object o = new object();

二、指事:指事。用来特指,好比电影中的特写镜头,特指出来令人一看即明。比如“本”是由“木”+“一”构成,这个“一”代表了树木的根部,用一点(横)指出来,提醒读者意会这里是“本”

在对象内部用“点”式指出某种变化,类似:

 o.RaiseEvent(); 

三、形声:把两个或多个对象放在一起来衍生,

“形”:定义了边界,定义了对象在环境中的外在。

“声”,类似波,指对象对外能发出的功能。

  Class A;
  Class B
  {
    A a;
     public void Do { a.do()}
  }

   按照汉字的解释,一个对象调用另一个对象的方法,就是借助此一对象让另一对象发出“声音”。汉字在这里的解释有些意思,声音无孔不入,一个对象的方法调用,会对系统内的所有对象产生影响,但这种影响从表面难以看出,因对象的表现是用形(彡=光照)来界定的。

  好比,一个人听了一句话,虽然表面上不动声色,可内心早已波澜汹涌。

 

四、会意:使用多重继承,将两个意象并列放在一起,令人意会。比如“信”是会意,把“人”和“言”放在一起,令人意会(……人和言放在一起是什么意思……信的意思吗?),意会出来的那个意思就差不多了。

  Class A;
  Class B;
  Class C:A,B

相比于程序设计极力避开多继承,避开菱形继承,汉字系统就是建立在多继承的基础之上,程序设计中is-a是主体,has-a是优选;汉字系统中has-a是主体,is-a是优选

 

五、转注:类似多态,又像函数调用链。老,从人毛匕——“人”,调用“毛”,再调用“匕”,这种调用更像是一种连接,如何把“人”、“毛”、“匕”用合理性的方式连接起来,让功能本义不变,边界旋转,寻找一种可以从一个字注入到下一个字的方法。

 class A
 {
     private B b;
      public void Do()
     [
           b.Do();
     }
 }

 class B
 {
      private C c;
      public void Do()
     [
           c.Do();
     }
 }    

六、假借

按照wu雨辰的解释:

 

假借有种类型推断(匿名类型)的味道,将字还原到本义(将class还原成data、甚至还原成元数据metadata),再将其适配到其他字(类型)。 

 struct Data {}

 class A
 {
      public Data ToDTO();
 }

 class B
 {
       public static B FromDTO(Data data);
 }

 A a = new A();
 var data = a.ToDTO();
 var b = B.FromDTO(data); 

象形,指事,形声,会意,转注,假借,这六种设计方式叫做六书。

模型

总结一下:字=元数据(形)+职责(音)+实现(义)

其模型猜想如下图:

《说文解字》与程序设计-LMLPHP

汉字是一种象形文字,其和拼音文字相比,保留了元数据(图)。当汉字无法理解(无法沟通)之时,可以还原到图上来理解,相比于拼音文字,它提供了一种回溯(Recompile)的可能性。

使用者随时可以瓦解一个字,来获得其原始“意图”。类似将玩具拆除后重新组装,这种重组的过程会极大增强人的理解。同理,这个瓦解字以获取智慧的过程,称之为《说文解字》。

 

这种编码中附带元信息的方式,在程序中叫做注释,在沟通里称为意图,在设计上看成背景,它通常与主信息呈现一种分离态。而在汉字系统中,形音义“三位一体”,只有一个字的形音义确定之后,它才会长久存在下去。

 

举个例子: 需求——它由需和求两个字组成。

需字:

《说文解字》与程序设计-LMLPHP

求字

《说文解字》与程序设计-LMLPHP

需字的图画:天在下雨,人被淋湿

求字的图画:一只伸长的手

 

需和求两个字组成词语(需求),其意象发生了交会,理解需求,即可以从词义入手(查词典),也可以回到元数据,直接从图上入手(说文解字):

 

需求从图上来看,出现了三个元素:雨、人、手 

分别取反义:

1. 天不下雨,不叫需求。

2. 人没被淋湿,不叫需求。

3. 没伸出手,不叫需求。

 

将元数据解释(编译):

1. 市场环境没发生变化,不叫需求——(雨)。

2. 客户没伤到切身利益,不叫需求——(人)。

3. 客户没主动要求,不叫需求——(手)。

 

将此解释再次抽象:

1. 天时不对,不叫需求。

2. 地利不对,不叫需求。

3. 人和不对,不叫需求。

 

这是一种看图说话,是一种通过元数据理解,每个汉字都对应一张图,任何可以用汉字描述的概念(比如封装、继承、多态),都可以越过词义,直接从字图(元数据)释义,相对于词义,其字义往往携带了更精髓的最初的元信息。

 

如:

封装:=+(圭,诸侯的玉圭,代表责任;寸,恭恭敬敬手持,代表守责任)

 =+(衣,上身穿的叫衣,下身穿的叫裳;壮,大也)

封装要满足四个元素(圭、寸、衣、壮),看图说话,封装两字有这样的启示:

1. 要有责任。

2. 要守责任。

3. 封装只封上半身,要“下半身失踪”,如同并蒂莲一样,要有通过下半身(更底层存在)互通(交流变化)的可能性。

4. 有聚合性,其聚合性呈放大趋势。

 

相比于拼音文字,象形文字更大的保留了其元数据性,提供了一种重构的更大的可能性。

汉字系统

汉字的系统设计非常灵活,一个字既可以充当另一个字的基类,又可以充当另一个的方法、甚至可以是另一个字的元数据,其合理性来自于群体认证:

一个字(对象)不是合理才能应用,而是因为应用才产生合理

 

汉字的意会方式是一种元数据交流方式,意会的过程是一个先编译后执行的过程。如果把两个人比做两台电脑,在它们的网络通信中,不使用RPC调用,不使用Restful方法,而是在传输中直接传送元数据,接收方得到元数据,在其本地进行(无厘头)编译,以一种本地热重载(创建类型、JIT编译、解释执行)的方式完成沟通。

意会是一种“大数据”编译。

这种元数据通信方式可以充分的解耦,其有很高的扩展性,其本地编译的效果取决于“常识”、“经验”、“情感”,像是一种“大数据”编译,其注重的是不要丧失“不确定性”,不确定性是确定性的背景,它为确定性提供了生命力以及演化的可能性,它使得概念向本义收敛与边界扩张两个维度变化。

总结

本文讨论了《说文解字》与程序设计的关系,但牵强附会的地方很多,为了寻找对应关系,很多地方都是(无厘头)编译——开局一张图,内容全靠编。

 但伟大系统总有共通之处。

作为流传了几千年、上万年的文字系统,其内部有很深的智慧存在。程序设计,有很多地方可以向汉字系统学习。抛砖引玉,希望两者能够借鉴、互通、融合——希望风吹来的地方,都能有阳光晃耀。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

05-23 20:54