《說文解字》與程序設計


說文解字

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

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

說文解字的格式

說文解字是有固定一種格式的,網上有許多網站支持搜索《說文解字》,打開一個詞典網,在上面搜索“老”字,彈出來的結果是這樣的:

     

  這個格式分三部分:

  1. 元數據:某字,配一張圖。

  2. 職責:X也。

  3. 實現:從XX

  比如:

  :教行也。從匕從人,匕亦聲。

  :鑄器之法也。從土刑聲。

  :更也。從攴己。

  它的模型猜想圖如下:

解字

庖丁解牛,解一個漢字,看看說文解字是如何詮釋的

更也。從攴己

這個【改】字的解釋有點意思:從,就是繼承的意思;從攴,繼承於攴,攴從圖畫上看是一根小樹枝的意思。那么這個“攴己”,就是揮舞着小樹枝抽打自己……Why?為毛要抽自己?因為自己欠抽嗎??

——因為[更也]。更,更新,鞭策自己是為了改過自新。

 

換成面向對象的語言:

 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()}
  }

   按照漢字的解釋,一個對象調用另一個對象的方法,就是借助此一對象讓另一對象發出“聲音”。

  漢字在這里的解釋有些意思,聲音無孔不入,對一個對象的方法調用,表面上看,似乎只會對被修改的對象產生影響。而漢字用聲音說明,這種改變對象狀態會對系統內的所有對象產生影響,只是不容易從表面看出,因為光還沒有照到其它對象。

  好比,一個人聽了一句話,雖然表面上不動聲色,可內心早已mmp的……波瀾洶涌。

 

四、會意:使用多重繼承,將兩個意象並列放在一起,令人意會。

比如“信”是會意,把“人”和“言”放在一起,令人意會(……人和言放在一起是什么意思……信的意思嗎?),意會出的意思就比較接近了。

  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),再將其適配到其他字(類型)。 

 

假借有一種系統間通過DTO傳參的味道:

 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)的可能性。

使用者隨時可以利用元數據瓦解一個字,來獲得其原始“意圖”。類似於對象設計中的object.GetType(),隨時可獲取對象的類型數據,這個元數據是以一種更高級別的抽象(粗略的圖)來提供的。使用者可以與時俱進,將元數據的圖根據當前環境重編譯(重解釋),以更好的適應時代的變化。

漢字的系統演進了幾千年(或更久),現代的編程語言幾年內就會有種面目全非、令創始人都感慨的變化,而漢字系統依舊保持着旺盛的生命力,其形音義的設計理念有着精髓之處,值得令人深挖。

 

這種在編碼的時候附帶元信息的方式,在程序中可是特性、或是注釋,在溝通里被稱為意圖,在設計上又看成背景。通常情況下,它與主信息之間呈現一種分離態。

而在漢字系統中,形音義“三位一體”,一個字的形音義必須全部確定后,它才會長久地存在下去。

漢字演進

乘坐時光,回到漢字的早期年代,觀察一下漢字的演進:

舉個例子: 需求

需求由“需”和“求”兩個字組成。

 

需字:

 

 

求字

 

  這兩個字的圖片有點意思,一個是一位"濕身"的男子,一個是一只伸長了求索的手。

需:天在下雨,人被淋濕

求:一只伸長的手

 

當“需”和“求”兩個字金風玉露一相逢,便交會了人間無數。

做軟件的少不了“需求”,這是一個高頻詞語,帶點文縐縐,又很壓人……“這個需求能否解決?”“確認一下客戶需求。”“這個需求不合理。”

 

從元數據(圖)上來看,這個詞會有哪些啟示呢?

 

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

缺少這三個元素的其中之一,都不能稱之為“需求”,比如:

1. 如果天不下雨,那就不叫需求。

2. 如果人沒被淋濕,也不叫需求。

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

 

換成客戶(爸爸)的解釋:

1. 如果市場環境沒發生變化,不叫需求,提了白提,客戶不理解——(雨)。

2. 如果客戶沒傷到切身利益,不叫需求,說了白說,客戶不痛——(人)。

3. 如果客戶沒主動要求,不叫需求,皇帝不急太監急,沒用——(手)。

 

將這個解釋抽象出道理:

1. 如果大環境、時間不對,不叫需求——天時。

2. 如果區域不對,不叫需求——地利。

3. 如果客戶吃瓜看熱鬧,不叫需求——人和。

 

這是一種越過詞語,直接從元數據(字義)看圖說話的解釋,相對於詞義,漢字的字義往往攜帶了更精髓的最初的元信息。

 

再舉個例子:封裝(面向對象高頻詞)。

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

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

 

從字面來說,封裝:要有責任,守責任,上身穿的好,肩膀端得住。

 

這個字面分析給出了一個很有意思的觀點:面向對象的封裝只封“上半身”即可,要玩“下半身失蹤”。也就是說,面向對象的封裝要有一種“並蒂蓮”,要保留通過地下(類似於指針、內存)等從下一層次訪問修改的可能性。

另,“壯”說明,對象的聚合性永遠呈放大趨勢,其有像龍卷風一樣將其它對象席卷其中的野心——每一個對象都有成為“聚合根”的沖動和向往。

漢字系統

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

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

 

漢字的意會方式是一種元數據交流方式,意會的過程是一個先編譯后執行的過程。如果把兩個人比做兩台電腦,在它們的網絡通信中,不使用RPC調用,不使用Restful方法,而是在傳輸中直接傳送元數據,接收方得到元數據,在其本地進行(無厘頭)編譯,以一種本地熱重載(創建類型、JIT編譯、解釋執行)的方式完成溝通。

 

意會是一種“大數據”編譯。

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

總結

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

 偉大系統總有共通之處。

作為流傳了幾千年、上萬年的文字系統,其內部有很深的智慧存在。

學習先賢,吸取一些經歷時間(實踐)證明過的設計真諦,希望程序設計和漢字設計能夠借鑒、融合。

希望有風來的地方,都有陽光閃耀。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM