說文解字
《說文解字》,簡稱《說文》,是由東漢經學家、文字學家許慎編著的語文工具書著作。《說文解字》是中國最早的系統分析漢字字形和考究字源的語文辭書,也是世界上很早的字典之一。
以上是百度百科的解釋,前段時間刷知乎,看到了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編譯、解釋執行)的方式完成溝通。
意會是一種“大資料”編譯。
這種後設資料通訊方式可以充分的解耦,其有很高的擴充套件性,其本地編譯的效果取決於“常識”、“經驗”、“情感”,像是一種“大資料”編譯,其注重的是不要喪失“不確定性”,不確定性是確定性的背景,它為確定性提供了生命力以及演化的可能性,它使得概念向本義收斂與邊界擴張兩個維度變化。
總結
本文討論了《說文解字》與程式設計的關係,但牽強附會的地方很多,為了尋找對應關係,很多地方都是(無厘頭)編譯——開局一張圖,內容全靠編。
但偉大系統總有共通之處。
作為流傳了幾千年、上萬年的文字系統,其內部有很深的智慧存在。程式設計,有很多地方可以向漢字系統學習。拋磚引玉,希望兩者能夠借鑑、互通、融合——希望風吹來的地方,都能有陽光晃耀。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。