《說文解字》與程式設計

周永恆發表於2021-05-23

說文解字

  《說文解字》,簡稱《說文》,是由東漢經學家、文字學家許慎編著的語文工具書著作。《說文解字》是中國最早的系統分析漢字字形和考究字源的語文辭書,也是世界上很早的字典之一。

以上是百度百科的解釋,前段時間刷知乎,看到了W雨辰的一篇介紹漢字造字法(指事,象形,形聲,會意,轉註,假借)的文章,其介紹簡單有趣,深入淺出,讀完之後深感漢字造字與程式設計、尤其是物件導向設計有共同之處,寫一篇文章記錄下思路,感興趣的朋友可以過來探討下。

說文解字的格式

開啟詞典網,搜尋“老”字,彈出來的是這樣的:

     

  其格式是這樣的:某字,一張字圖,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()      
 }

  翻譯成說文解字:

A,C也,從B。

 

  又如:

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

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

  翻譯成說文解字:

A,C也,從B,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); 

 

象形,指事,形聲,會意,轉註,假借,這六種設計方式叫做六書。

六書:一曰指事。指事者,視而可識,察而見意。上下是也。二曰象形,象形者,畫成其物,隨體詰詘,日月是也。三日形聲。形聲者,以事為名,取譬相成,江河是也。四日會意。會意者,比類合誼,以見指撝,武信是也,五日轉註。轉註者,建類一首,同意相受,考老是也。六日假借。假借者,本無其字,依聲託事,令長是也。

模型

總結一下:字=後設資料(形)+職責(音)+實現(義)

其模型猜想如下圖:

漢字是一種象形文字,其和拼音文字相比,保留了後設資料(圖)。當漢字無法理解(無法溝通)之時,可以還原到圖上來理解,相比於拼音文字,它提供了一種回溯(Recompile)的可能性。

使用者隨時可以瓦解一個字,來獲得其原始“意圖”。類似將玩具拆除後重新組裝,這種重組的過程會極大增強人的理解。同理,這個瓦解字以獲取智慧的過程,稱之為《說文解字》。

 

這種編碼中附帶元資訊的方式,在程式中叫做註釋,在溝通裡稱為意圖,在設計上看成背景,它通常與主資訊呈現一種分離態。而在漢字系統中,形音義“三位一體”,只有一個字的形音義確定之後,它才會長久存在下去。

 

舉個例子: 需求——它由需和求兩個字組成。

需字:

 

 

求字

 

需字的圖畫:天在下雨,人被淋溼

求字的圖畫:一隻伸長的手

 

需和求兩個字組成詞語(需求),其意象發生了交會,理解需求,即可以從詞義入手(查詞典),也可以回到後設資料,直接從圖上入手(說文解字):

 

需求從圖上來看,出現了三個元素:雨、人、手 

分別取反義:

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

2. 人沒被淋溼,不叫需求。

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

 

將後設資料解釋(編譯):

1. 市場環境沒發生變化,不叫需求——(雨)。

2. 客戶沒傷到切身利益,不叫需求——(人)。

3. 客戶沒主動要求,不叫需求——(手)。

 

將此解釋再次抽象:

1. 天時不對,不叫需求。

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

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

 

這是一種看圖說話,是一種通過後設資料理解,每個漢字都對應一張圖,任何可以用漢字描述的概念(比如封裝、繼承、多型),都可以越過詞義,直接從字圖(後設資料)釋義,相對於詞義,其字義往往攜帶了更精髓的最初的元資訊。

 

如:

封裝:=+(圭,諸侯的玉圭,代表責任;寸,恭恭敬敬手持,代表守責任)

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

封裝要滿足四個元素(圭、寸、衣、壯),看圖說話,封裝兩字有這樣的啟示:

1. 要有責任。

2. 要守責任。

3. 封裝只封上半身,要“下半身失蹤”,如同並蒂蓮一樣,要有通過下半身(更底層存在)互通(交流變化)的可能性。

4. 有聚合性,其聚合性呈放大趨勢。

 

相比於拼音文字,象形文字更大的保留了其後設資料性,提供了一種重構的更大的可能性。

漢字系統

漢字的系統設計非常靈活,一個字既可以充當另一個字的基類,又可以充當另一個的方法、甚至可以是另一個字的後設資料,其合理性來自於群體認證:

一個字(物件)不是合理才能應用,而是因為應用才產生合理

 

漢字的意會方式是一種後設資料交流方式,意會的過程是一個先編譯後執行的過程。如果把兩個人比做兩臺電腦,在它們的網路通訊中,不使用RPC呼叫,不使用Restful方法,而是在傳輸中直接傳送後設資料,接收方得到後設資料,在其本地進行(無厘頭)編譯,以一種本地熱過載(建立型別、JIT編譯、解釋執行)的方式完成溝通。

 

意會是一種“大資料”編譯。

這種後設資料通訊方式可以充分的解耦,其有很高的擴充套件性,其本地編譯的效果取決於“常識”、“經驗”、“情感”,像是一種“大資料”編譯,其注重的是不要喪失“不確定性”,不確定性是確定性的背景,它為確定性提供了生命力以及演化的可能性,它使得概念向本義收斂與邊界擴張兩個維度變化。

總結

本文討論了《說文解字》與程式設計的關係,但牽強附會的地方很多,為了尋找對應關係,很多地方都是(無厘頭)編譯——開局一張圖,內容全靠編。

 

 但偉大系統總有共通之處。

作為流傳了幾千年、上萬年的文字系統,其內部有很深的智慧存在。程式設計,有很多地方可以向漢字系統學習。拋磚引玉,希望兩者能夠借鑑、互通、融合——希望風吹來的地方,都能有陽光晃耀。

 

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。

相關文章