1. 程式人生 > >漢語——世界上唯一的面嚮物件語言

漢語——世界上唯一的面嚮物件語言

宣告:除了漢語之外,我只會一點英語和日語。因此說是“唯一”略顯誇張,有吸引眼球的嫌疑,請大家原諒。嚴謹地說,標題應該是“漢語是一種面向物件的高階語言”。

在網上看到過很多有關漢語和英語比較的文章,他們寫的都很不錯,並且列舉了大量的事例來證明漢語或者英語是優秀的。不過,我想用計算機軟體設計的觀點,來理性地分析漢語和英語的優缺點。經過分析,我可以斷言:漢語是世界上唯一一種面向物件的高階語言。而以英語為首的其他語言,則屬於密碼型的索引語言。下面通過問答的方式來解釋這種觀點,如有不妥之處,請大家指摘。

一.什麼是“物件”?

在計算機世界裡,物件(Object)就是人們要進行研究的任何事物。小到螺絲釘,大到飛機,都可以被看成是物件,並且有具體的屬性和操作。以“狗”為例:顏色、體重等是它的屬性;而吃飯、撒嬌、警衛等則是它的操作。

同樣,對於語言來說,一個漢字或者一個單詞也可以被看成物件。再次以“狗(dog)”為例: 發音和拼寫可以被看成是屬性,而它的定義 則可以被看成是操作。

二.什麼是“面向物件”? 它有哪些主要特點?

面向物件主要是指程式的設計方法。它主要有三大特徵:封裝、繼承、多型。

三.什麼是封裝?

在軟體設計中,封裝是指將介面與實現顯式地分開,並對內部的實現提供保護(即掩藏實現細節)。封裝防止了程式相互依賴性而帶來的變動影響,是保證軟體部件具有優良的模組性的基礎,是面向物件設計的前提條件。

四.如何考察自然語言的封裝性?

封裝的兩個特點就是:介面和實現分開 以及保護內部的實現。同樣的道理,我們可以用下列四個標準來考察自然語言的封裝性:

1.外形介面:所有詞彙的外形是否是一致的。

2.定義介面:特定詞彙的定義是否只有一個。

3.讀音介面:特定詞彙的讀音是否只有一個。

4.拼寫方法是固定的,即不會隨著場景的變化而變化。

五.漢語和英語具有封裝性嗎?

(1)首先來考察一下漢字。

1.漢字的外形介面:眾所周知,所有漢字的外形都是四四方方的方形。

2.漢字的定義介面:大多數漢字的定義只有一個,當然也存在數量不多的多義字。

3.漢字的讀音介面:絕大多數漢字的讀音只有一個。當然也存在多音字(一般也是多義字),最典型的是“重”字,它有兩個讀音zhong和chong,前者是分量大、主要的意思,後者是重複繁冗的意思。但是像這樣的多音字數量很少,讀音也最多隻有兩個,常見的多音多義字只有100多個。

4.漢字的拼寫方法是否固定的,不會隨著場景的變化而變化。雖然漢字有繁簡之分,但是不可能在一段文章中同時出現繁簡兩種字型,因此姑且不論。

(2)再來看看英語:

1.英語單詞的形狀不是固定的,有短有長。短的有象“I”(我),只有一個字母;而長的有“pneumonoultramicroscopicsilicovolcanoconiosis”(矽肺病),總共有45個字母。

2.英語中的多義詞太多了,比如我們熟悉的“book”,不僅有書和課本的意思,還有預訂、登記、立案的意思。再如“man”,除了有人和男人的意思之外,還有操縱、配備人員的意思。

3.英語單詞的讀音會隨著拼寫的變化而變化。

4.英語單詞的拼寫方法不是固定的,會隨著場景的變化而是變化。不僅字母有大小寫、名詞有複數形態,動詞還也有讓人頭疼的時態變化。

複數形態的例子:“book”複數詞是“books”,“man”複數詞是“men”,拼寫和讀音都發生了變化。

動詞時態的例子:

一般現在時: I do it every day.(我每天做這樣的事)

一般過去時: I did it yesterday.(昨天我做了這件事)

一般將來時: I shall/will do it tomorrow.(明天我要做這件事)

現在進行時: I am doing it now.(現在我正在做這件事)

現在完成時: I have done it already.(我已把這件事做好了)

一個do需要do、did、doing、done這4種拼寫方法來表達”做”的各種狀態,而漢語僅僅加一些常用的副詞就可以表達了。

結論:漢語是封裝性的語言,但是並不完美,因為存在少量的多音字和多義字。而英語則完全沒有封裝性可言。

六.什麼是繼承?

在程式設計中,繼承是指子類自動享用父類的屬性和方法,並可以追加新的屬性和方法的一種機制。它是實現程式碼共享的重要手段,可以使軟體更具有開放性、可擴充性,這是資訊組織與分類的行之有效的方法,這也是面向物件的主要優點之一。繼承又分為單繼承和多繼承。單繼承是指子類只能繼承一個父類的屬性和操作;而多繼承是指子類可以繼承了多個父類的屬性和操作。熟悉IT的人都知道,Java是一種單繼承語言,而C++是一種多繼承語言。

想提醒的是,在計算機語言中,具有相同或相似性質的物件的抽象就是類。也就是說,物件的抽象是類,類的具體化就是物件。類是可以繼承的,物件是不能被繼承的。但是自然語言中並沒有類的概念,為了說明的方便,下面的解說中使用了物件繼承的說法,請計算機專家們諒解。

七.如何考察自然語言的繼承性?

只有一個標準:是否大規模地存在“字造字”、“詞生詞”的現象。

八.漢語和英語具有繼承性嗎?

(1)首先說說漢字,漢字的一大特點就是形音字眾多,形音字具有“意音雙表”的功能。舉一個簡單的例子:圍、圓、園、圈。這4個字的外圍都是“口”字,是用來表意的;而中間的韋、員、元、卷則是用來表音的。用軟體設計的觀點來看,這就是單重繼承,被繼承的是“意”,而“音”則是它們各自的特徵。
除了單重繼承之外,漢語裡也存在大量的多重繼承,這就是片語。“片語”本來的定義是:由多個漢字所組合而成的語法單位。但是,從程式設計師的角度來看,“片語”的定義是:從多個物件繼承而來的新物件。

下面例子分別標註了片語分解前後的漢英解釋。可以一目瞭然地發現,無論是拼寫或是定義,片語都是對漢字的完美繼承,而英語則毫無瓜葛。

飛機(plane)   = 會飛行(flight)的機器(machine)

工人(worker)   = 在工廠(factory)工作的人(man)

解放(liberate)  = 解開(unlatch)後釋放(release)

計算機(computer) = 能計算(calculate)的機器(machine)

(2)英語也有繼承,那就是複合詞。比如:

football     足球

handwriting   書法
breakwater    防浪堤

或許是因為單詞長度限制(即缺乏封裝性)的原因,它們數量很少,所佔的比例極低。對中國人來說有點難以理解的是,很多應該是複合詞的單詞,卻被不相干的詞彙所代替,比如:

豬 pig   公豬 boar   母豬 sow  小豬 piglet 豬肉 pork

牛 cattle 公牛 bull   母牛 cow  小牛 calf  牛肉 beef

羊 sheep  公羊 ram   母羊 ewe  小羊 lamb  羊肉 mutton

漢語的話,只需要7個基本漢字:豬、牛、羊、公、母、小、肉,其它的都是組合而成的。而英語則需要記住15個沒有任何關聯的詞彙。再比如:

一月   January

二月   February

三月   March

四月   April

五月   May

六月   June

七月   July

八月   August

九月   September

十月   October

十一月  November

十二月  December

漢語是用數字加上“月”表達月份,而英語卻使用12個完全沒有共同特徵的單詞來表達月份。

結論:漢語具有完美的繼承特徵。英語從總體上來說,還不能被稱為具有繼承性的語言。

九.什麼是多型?

多型是指相同操作介面的方法 在不同的物件中呼叫可以實現的不同結果。多型和繼承是對同一現象的不同描述,繼承是強調物件的共同特點,而多型則是強調物件的靈活性。繼承是設計層次上的概念,而多型是繼承在執行時的表現。

十.如何考察自然語言的多型性?

我們已經知道:多型的前提條件是繼承;好處是可以在執行時強調物件的靈活性。具體到自然語言,我們可以這樣理解:多型性的詞彙可以在相互交流的時候,增加理解的靈活性。具體做法就是在交流的時候,僅僅使用一些概念性的詞彙,讓不同的聽眾或讀者有不同的解讀。
所以,衡量自然語言是否具有多型性的指標是:

1.是否大量存在能表達概念性的詞彙。

2.這些概念性的詞彙是 被具體的詞彙所繼承。強調繼承的原因有兩點:一是因為多型性的定義,另外一個原因是它可以增加由虛到實、由概念到具體的聯想速度。

十一.漢語和英語具有多型性嗎?

(1)漢語的多型性無處不在,主要表現在兩個方面:一是有很多的被繼承的、能表達概念性的詞彙,另外一個就是漢語拼音。

首先說說被繼承的概念詞彙,它們主要在口語中被使用。比如:“我要坐車去上海”。這裡的車(car,vehicle)是一個概念性的詞彙,具體是哪一種車,則根據聽眾的不同而不同,可能是汽車(car)、計程車(taxi)、公共汽車(bus)、火車(train)等等。與英語不同,漢語的“車”字是被繼承的,所以人們會很快地聯想到汽車、計程車、公共汽車等片語。而使用英語的人們則需要從記憶中搜索(而不是聯想)與車相關的交通工具。類似“車”的詞彙在漢語裡有很多,再比如:“去商場買一點肉”。這裡的肉(meat)有可能是豬肉(pork),也有可能是牛肉(beef),或者是雞肉(chicken)等等。

再說說漢語拼音的多型性,漢語拼音有4個音調,在沒有標註音調時候,需要根據上下文的理解來決定是哪一個音調。比如zhong guo的音調應該是zhōng guó。 即使是在標註音調場合,也需要根據理解來決定是哪一個漢字。再比如zhōng guó的漢字應該是“中國”,而不是“忠幗”。

由此我們也可以看出來:多型一方面可以降低了交流的準確性、另一方面也提高了說話的靈活性和資訊量。

(2)英語雖然也有大量類似vehicle、meat的概念詞彙,但是卻沒有被廣泛地繼承。另外想提醒的是:英語的時態不是的多型性的表現。原因在於:

1.英語時態的主體是動詞(即動作),它強調了動作執行狀態的不同(沒做、正在做、做完了),而不是執行結果的不同。

2.多型是指具有相同特徵,但是因為物件不同而導致結果不同。它強調是執行結果的不同。
因此說時態不是多型。以軟體設計的觀點來看,如果物件的狀態發生了變化,就必須更換成另外一個物件,這是一件不可想象的事情,會導致物件無限增多從而失控。

結論:漢語具有多型性,而英語並不具備。但是多型對於語言來說,可能沒有太多的作用。

十二.面向物件能解決什麼問題?

傳統的軟體開發方法存在下面3個問題:可維護性差、重用性差、不能滿足使用者不斷變化的需要。為了解決這三個問題,面向物件概念被逐步推廣和應用。

同樣地,與漢語相比英語也存在3個類似的問題:

1.很容易出錯。由於英語沒有被封裝,再加上語法眾多,諸如:動詞時態、複數形態、虛擬語氣等等,導致單詞不斷的變換,讓人無所適從。

2.重用性差。原因不用多說,就是因為它沒有繼承性,導致單詞量龐大。相比而言,漢字的重複利用率非常高。《毛澤東選集》共5卷,但是隻用了不到3000不同的漢字。

3.不能滿足現代知識爆炸的需求。對待新生事物,英語會使用一個只有專業人士才懂的新單詞,而漢語會根據主要的特徵來組合漢字,可以讓非專業的人們也能理解。比如:

四環素 acheomycin

變阻器 rheostat

腎結石 nephrolith

七邊形 heptagon

長方體 cuboid

而面向物件的漢語就不存在上述三大問題。

十三.為什麼說漢語是高階的?

首先要指出的是,高階並不意味著高效。就像絕大多數程式設計師喜歡使用Java和C++,而不是機器語言和組合語言一樣。雖然機器語言和組合語言執行速度很快,但是它們和人類的思維並不接近,不能適應大規模、快速、高質量的軟體開發。

正因為漢語具備面向物件的特徵,所以說漢語的高階之處在於容錯性強、通用性強、擴充性強、語句簡短、便於資訊的交流、能讓人們快速地學習新知識。

十四.日語也是面向物件的語言嗎?

日語有兩種文字組成:假名和漢字。假名是字母語言,它包括平假名和片假名,就像英語的大小寫一樣,它不具備面向物件的三大特徵。而漢字的讀音又分為音讀和訓讀。音讀和中文的發音相似,訓讀則完全不一樣。比如“有”的音讀是yu,訓讀是u和aru。日本的前首相麻生太郎就在這上面栽過跟頭,他曾經把“未曾有”讀成mizoyu,正確的讀音應該是mizou,結果讓媒體狠狠地涮了一頓,一度被譏諷為“未曾有首相”。

因為音讀漢字的讀音以及用法 基本和中文相似,所以可以說它是面向物件的語言(現代漢語中片語,有一大半都是從日本引進的)。而訓讀漢字往往和假名相結合形成新的詞彙,所以沒有面向物件特徵。

以“生”字作為例子,來介紹日文漢字的複雜性(注:括號中的是生的讀音):

“生”字的音讀有兩個:

1.生命  同漢語的生命  (sei)mei

2.生涯  同漢語的生涯  (shou)gai

“生”字的訓讀有四個:

1.生の魚 未加熱的魚   (nama)no sakana

2.生きる 活的意思    (i)kiru

3.生む  出產的意思   (u)mu

4.生える 生長的意思   (ha)eru

總結,一部分的日語具備面向物件的特性。

十五.語言除了字和詞之外還有語法,語法存在面向物件的特性嗎?

個人認為語言基本上可以分為三大系統:文字系統、語法系統和符號系統。

1.字和詞屬於文字系統,是語言體系的主體部分。

2.語法的傳統定義是文字組合和解釋的語言規範。在軟體設計人員看來,語法是一種物件的組合分解演算法,它是一些邏輯的集合,而不是物件的集合,因此語法沒有面向物件的說法。

3.符號系統是語言體系的支系統。最長見的符號就是 標點符號和數學符號。符號本身雖然是物件,但是獨立性非常強,且數量不多,在此就不討論它面向物件的特性。

綜上所述,由於語法不是物件、符號獨立性強,所以考察語言的面向物件特性,主要集中在文字上面。

十六.漢語難道就沒有缺點了嗎?

有!漢語的三大系統都有缺點:

(1)文字系統的缺點:

1.封裝性不太完美。上面已經討論過了,存在少量的多音字和多意詞。

2.入門難。英語的入門極其簡單:只需要掌握26個字母,剩下的就是記憶了。而且拼寫和讀音是基本統一的,可以達到會讀就會寫、會寫就會讀的程度。而漢語則要麻煩一些,不僅要掌握2000多個漢字的讀音、寫法和定義,還要理解常用片語的含義。其實,這個缺點是面向物件的固有缺點,熟悉計算機開發的朋友可能都知道,雖然C++是高階語言,但是它的概念要比C多,用法也相對複雜,還需要掌握很多的工具類,但是一旦入門之後,就海闊憑魚躍、天高任鳥飛了。

3.還有一個莫須有的缺點:誘發人們忽視細節。這也是面向物件的隱形缺點,在開發軟體系統的時候,面向物件的運用者是設計人員,而不是程式設計師。設計人員注重的是業務的分類和總結,而程式設計師追求的是邏輯準確性和可實現性。漢語也是這樣,它的好處是非常自然、容易擴充套件,壞處是讓人們的思維變得懶惰,漸漸地喪失了精益求精的科學態度。

(2)傳統意義上的漢語是沒有符號系統的。符號是科學演算和理論推導的重要工具,個人認為是字母語言最成功的地方。隨著在鴉片戰爭之後,中國逐步引入西方的標點符號和數學符號,這個重大的缺點得到了根本的解決。

(3)語法系統非常鬆散。不知道大家有沒有發現這個現象:漢語的句子往往很短,而在英語和日語中2、3行的句子卻很常見。原因在於漢語既沒有英語中where、who、which那樣的單詞來劃分語句,也沒有日語裡的助詞(はがにでを)來區分主謂賓。這會導致人們不能一目瞭然地劃分語句結構。為了避免這個弊端,漢語的句子往往很短。但是,即使把句子縮短,也不能完美地解決這個問題。讓我舉一個例子來說明這種現象:

1.今天真熱,我想開空調了。

2.孩子們很天真、很可愛。

上面兩個句子都有“天真”這兩個字,可究竟哪個是naive的意思呢?這就需要根據上下文的意思來判斷了。也就是說,漢語雖然是一種面向物件的語言,但是由於語法結構的欠缺,導致了人們在看到一句中文之後,需要大腦做一個先斷句後理解的處理過程,而不是直接理解。這一點非常類似Java的反序列化處理(序列化就是指把物件轉換為位元組序列的過程。而反序列化是指把位元組序列恢復為物件的過程)。

為了避免這個問題,個人建議引入空格。也就是說在書寫的時候,有意識地利用空格進行斷句,讓資訊能夠快速而準確地傳達給讀者。比如上面兩個句子,可以改寫成下面的形式,就不會引發歧義,並且會減少大腦的處理時間。

1.今天 真 熱,我 想 開 空調 了。

2.孩子們 很 天真、很 可愛。

十七.最後的結論是什麼?

古老的漢語是一種面向物件的、但是被序列化的高階語言。