編程設計思想:形而上學和麵向對象?

  如果有人問我,哲學研究什麼?我會告訴他三個問題:  1、世界是什麼?  2、我如何認識世界?  3、我該如何生活?  這三個問題基本概括了哲學最主要的三個分支:本體論、認知論和倫理學。  如果有人問我,計算機科學研究什麼?我也會告訴他三個問題:  1、計算機能解決哪些問題?  2、計算機如何描述問題?  3、計算機如何解決問題?  分別是計算機的數學模型、計算機對物理世界的模擬和計算機的架構及實現。  邱奇-圖靈論題認為:任何在算法上可計算的問題同樣可由圖靈機計算。儘管尚未被公式證明,但它仍然已經被廣泛接受。圖靈機本身是人類邏輯的產物,我們有理由假定,任何人類邏輯產生的可計算的問題,均可用圖靈機進行形式化描述。但是,由於圖靈機本身被限定為具有開始和結束狀態,“開始”、“結束”的概念本身,已經包含了比圖靈機本身更高階的條件。有開始,便意味著存在“開始之前”,有結束,便意味著有“結束之後”。當任何問題包含了圖靈機的開始之前和結束之後的條件,其問題便無法靠圖靈機本身解決了。停機問題判斷任意一個程序是否會在有限的時間之內結束運行,問題本身包含結束條件,所以超出了圖靈機解決問題的範圍。這就好比堅持宇宙起源論的人,總要面對諸如“大爆炸之前是什麼”這樣的問題;認同創世說的人,也難迴避“造物主由誰創造”的問題一樣。  人類自稱高等生物的一大原因是善用身體以外的工具。既然圖靈機已經有如此明確的數學形式,如果使用機械裝置實現它用以作為人腦的工具,那麼許多隻有算法而由於人腦的侷限無法得到結果的問題便可以解決了。計算機使用自然能源作為驅動,比人腦更快速地重複圖靈機所描述的邏輯過程,為人腦計算出問題的答案。  計算機並不能做比人類邏輯更多的事情,但在解決人類邏輯要找出最終結果的問題上,計算機以更快的速度和更高的可靠性彌補了人腦的生理缺陷。從這個意義上講,計算機完美的詮釋了“工具”的定義,可算是人腦最好用的工具。  當代計算機的計算能力以驚人的速度提升,但其工作方式從未改變。計算機從人類寫好的程序中讀取一條指令作為輸入,按照內部約定的轉移函數,從狀態集合中的一個跳轉到另一個。計算機不斷重複這個過程,直到能夠輸出人類想要的結果。從這個意義上講,今天超級計算機和1940年代讀取打孔紙帶的ENIAC沒有區別。  但計算機能力的改變影響了人類使用計算機的方式。計算機的能力越強大,人類越要使用它解決更多的問題。隨著計算能力的提升,計算機所要解決的問題的複雜度也越來越高。終於有一天,人們發現問題的複雜度已經高到使他們不得不研究關於計算機要解決的問題的方法論了。  面向對象思想便是這方法論的一種。面向對象的思想並非起源於計算機科學,但卻在計算機科學中應用最廣泛。面向對象的系統分析和程序設計,是在建立問題模型的時候,仿照了人類對物理世界本身的認知過程。  對象在哲學中被定義為“客體”,指任何可感知或可想象到的事物。以經驗主義考察對象的認知:對於一個對象,人對其所能產生的任何認識,都可歸結到某種“屬性”。例如,我感知到一個對象A和另一個對象B,我的感官(例如眼睛)感知到它們有所不同,為了描述這種不同,我定義了一種叫做“顏色”的屬性,定義對象A的“顏色”屬性是“紅色”,對象B的“顏色”屬性是“綠色”;隨著我發現更多的對象,我需要為“顏色”這個屬性定義越來越多“值”來加以區分。但並不是所有對象都具有“顏色”這個屬性,比如一段聲音,為了描述它,我開始定義其他的屬性(音量、時長等)。於是隨著感官感知到越來越多的對象,我的意識中便定義了越來越多的屬性和這些屬性的“取值”。當意識中存在了各種不同的對象時,我會發現某些對象的屬性具有共通之處,於是我抽象出了“類”的概念(其他觀點並不認為類的概念由對象派生出來,而認為類是先於對象的,後面有提及)。  這就是人類對物理世界中對象的認知過程。如何把一個對象同另一對象區別開來呢?我們的意識所使用的,是而且僅僅是,在上述認知過程中所定義的屬性。一個對象即使在某個屬性上與其他一些對象相同(如都是紅色),但是把這個對象所有的屬性在放一起考慮,那麼它總是獨一無二的。一個對象與其他對象要麼顏色不同,要麼重量不同,要麼空間位置不同……或者,所具備的屬性不同。人類把一個對象同其他對象區別開來的方式,便是這些屬性的集合。沒有屬性的定義,便無法描述對象。  面向對象編程裡的對象概念,跟人類對物理世界對象的所產生的觀念是一致的。要描述一個對象,其實便是描述對象的屬性集合。對象的一切都是屬性。我們平時在對象中稱其為“屬性”的變量自不必說,對象的“方法”是對象的一個“可以做某個動作”的屬性,類方法是某些對象共同擁有的“方法”屬性。“類”可以當作對象的一個叫做“類型”的屬性(想想各種面嚮對象語言中類似“.class”的方法)。  不管在形而上學還是面向對象編程裡,在關於對象的概念中,都出現了“類”這個概念。類是對擁有某些共性的對象集合的抽象。關於類的地位和類與對象的關係,形而上學和麵向對象編程理論都出現了分歧,兩個知識體系之中關於類的分歧極其相似,非常有趣。  羅素在描述柏拉圖的理念論的時候,使用“貓”做例子:“有許多個體的動物,我們對它們都能夠真確地說‘這是一隻貓’。我們所說的‘貓’這個字是什麼意義呢?顯然那是與每一個個體的貓不同的東西。一個動物是一隻貓,看來是因為它分享了一切的貓所共有的一般性質……如果‘貓’這個字有任何意義的話,那末它的意義就不是這隻貓或那隻貓,而是某種普遍的貓性。這種貓性既不隨個體的貓出生而出生,而當個體的貓死去的時候,它也並不隨之而死去……‘貓’這個字就意味著某個理想的貓,即被神所創造出來的唯一的‘貓’……”柏拉圖認為,這個由神創造出的唯一的理想的貓,才是真實的貓,而其他的貓只不過是現象而已。  對上面這段描述,我相信每個有面向對象編程經驗的人都會有些似曾相識。因為幾乎每本面向對象編程的入門書上所舉的例子,跟上面的貓的例子都十分相像。即使對柏拉圖沒有任何瞭解,我們也會自然而然地把“現象的貓”和“對象”對應起來,把“理想的貓”和“類”對應起來。  柏拉圖認為共相的貓(即理想的貓),是完美且先於任何一隻現象的貓存在的,因為現象的貓都只不過是共相的貓的一個不完美的副本。這和正統的基於類的面嚮對象語言(如Java)對類的定義是類似的:類是先於對象存在的,先有類的定義,然後從類定義中派生出對象實例。  柏拉圖的理念論又稱為唯實論,與之相對的理論叫做唯名論,唯名論認為共相併不存在,即只有個別的貓而沒有共相的貓。唯名論和唯實論的爭論是形而上學中長久以來探討的主題。唯名論的一個偏向折衷的觀點是:共相由實際存在的一個個 個體推導而來,但共相一旦建立便是存在的。  唯名論的觀點把類置於對象之後,讓人聯想起著名的“鴨子類型”:“當看到一隻鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那麼這隻鳥就可以被稱為鴨子。”一些基於對象的編程語言(如Javascript),更強調對象的功能而非類型。在Javascript中實現面向對象的特性時,類的概念並不是必需的,而可以完全基於對象間的關係來實現特性。因為把對象和類放置的地位有所不同,基於類的面嚮對象語言和基於對象的編程語言,在對物理世界建立模型時便需要使用不同的方式。  在對世界本質的認識上,歷來有兩種截然不同的觀點。一種是:存在一個客觀世界,人類對世界所形成的觀念,是由於客觀世界通過感官作用於人的意識,從而產生各種關於世界的知識;另一種截然相反:認為不存在客觀的世界,因為就人意識中形成的觀念而論,人的意識通過感官形成了對世界的知識,但是僅憑這些知識,是無法確定客觀世界的存在的,因為能夠確定的只有意識本身,沒有任何其他證據,使意識確信“有一個客觀世界,使感官產生了作用”。兩種觀點可以簡單的說成唯物論和唯心論。  論證這兩種觀點孰對孰錯,是形而上學的哲學家們的事情。對於大多數對哲學問題並不熱心的人來說,採取上面兩種觀點的哪一種,並不對生活產生任何影響。當甲對乙說:“我想吃那個蘋果”時,不管在甲的心目中“那個蘋果”是個真正存在的“對象”,還是他腦中形成的一個包含“顏色、重量、口味等”這些屬性的意識,他都明確表達了自己的感情;同樣的,聽到甲說這話的乙,不管認為“那個蘋果”是真實的客體還是腦中的觀念,都不妨礙他理解甲的態度。  同樣在面向對象編程裡,類和對象哪個是更基礎的概念,以及應該把對象當作類的實例還是單純的屬性集合,這些問題不能簡單回答。對於類和對象,重要的不是它們“是什麼”,而是它們“如何被使用”。  最後,文章開始對計算機的描述,我想說,雖然計算機的能力被限定人類邏輯之內,但是由於計算能力的提升,越來越多原來只在“算法上”可解,但是受限於人類能達到的計算能力而無法求解的問題開始慢慢得到解決。探求其他形式的圖靈機實現的成果,特別是對量子計算機研究可能產生的成果,人類所能擁有的計算能力可能會發生更加急速的跳躍。這種計算能力的爆炸式增長,即便在過去的幾十年裡,也已經證明了,它不僅影響著人類的生活方式,也在影響著人類對所處世界的認知。  這篇文章本來寫於半年前發表在博客上,今天想拿出來增色一下,但是能力所限,始終感覺很多地方詞不達意,一不小心大半夜了。大概就像那句關於debug的話說的一樣:代碼糾錯要比新編寫代碼困難一倍。因為,如果你寫出了最聰明的代碼,按此推算,你將沒有更大的智慧來debug它。

思想, 對象, 屬性, 面向對象, 形而上學,
相關問題答案