Posted on 2005-11-14 15:37
canonical 閱讀(472)
評論(1) 編輯 收藏 所屬分類:
設(shè)計理論
所謂結(jié)構(gòu),簡單的說就是一組關(guān)系的集合。(結(jié)構(gòu)就是關(guān)系的說法就太過于簡陋了)。在數(shù)學(xué)上,最基本的關(guān)系就是集合之間的包含(contains)關(guān)系,而等價(equivalance)關(guān)系,序(order)關(guān)系(坐標(biāo))等都可以基于包含關(guān)系推導(dǎo)出來。從集合論的角度上說,所謂的關(guān)系也是通過集合來刻畫的(兩元素相關(guān)指的是它們屬于同一集合),而函數(shù)的定義就是集合之間的映射。因此,在集合論看來,一切都是集合,數(shù)據(jù)的結(jié)構(gòu)與函數(shù)的結(jié)構(gòu),或者結(jié)構(gòu)的結(jié)構(gòu)的結(jié)構(gòu)之間并無本質(zhì)性的區(qū)別, 甚至數(shù)據(jù)與結(jié)構(gòu)之間也存在著內(nèi)在的統(tǒng)一性。一些我們早已默認(rèn)接受的基本實體,在集合論的框架下也是通過集合的結(jié)構(gòu)來刻畫的,例如自然數(shù)1,2,3,這些數(shù)字本身也是通過一些復(fù)雜的構(gòu)造過程來進行描述的,它們只是一些基本結(jié)構(gòu)的速記符號而已。
當(dāng)然,世界并不簡單。集合論所沒有述及的一個事實是,集合的集合比集合本身要復(fù)雜。結(jié)構(gòu)的級列也構(gòu)成了復(fù)雜性的級列,每一個層次都比前一個層次要復(fù)雜的多。最明顯的表現(xiàn)就是函數(shù)的總數(shù)比實數(shù)多。在現(xiàn)實的世界中,我們很多時候都是處在某一復(fù)雜性層次上,因而可以深切的感受到基本元素與結(jié)構(gòu),與結(jié)構(gòu)的結(jié)構(gòu)之間的這種深刻的差異。
偉大的von Neumann在計算機世界中定義了兩種基本的東西,數(shù)據(jù)與指令,在von Neumann體系架構(gòu)下,兩者的界限是明確的。CPU的存在定義了指令與數(shù)據(jù)之間的結(jié)合關(guān)系(apply), 而CPU的串行執(zhí)行強制定義了指令之間的序關(guān)系(order)。在軟件中我們通過函數(shù)封裝定義了指令的集合,而這些集合之間仍然存在著由main函數(shù)所驅(qū)動的序關(guān)系。因為函數(shù)也是通過數(shù)據(jù)(代碼)來表達的,因而在形式語義上,我們有可能證明能夠表達的函數(shù)結(jié)構(gòu)與數(shù)據(jù)結(jié)構(gòu)是完全一致的(注,這方面我并無研究,也不太感興趣)。但是現(xiàn)實情況下,我們對函數(shù)之間的結(jié)構(gòu)的控制要弱于對數(shù)據(jù)結(jié)構(gòu)的控制。最明顯的,程序運行時,函數(shù)(指令)空間基本上是靜態(tài)的,不變的,而數(shù)據(jù)空間則不斷的發(fā)生著變化。現(xiàn)代軟件系統(tǒng)中plugin, 動態(tài)配置,運行時java代碼增強(enhance)等技術(shù)的不斷發(fā)展正在逐漸縮小著這方面的差距。
在數(shù)據(jù)結(jié)構(gòu)方面,C語言中的Struct結(jié)構(gòu)體是一個很大的進步。因為由此引出的復(fù)雜類型系統(tǒng)是對結(jié)構(gòu)的一種抽象描述: 在編譯期唯一的一個Struct定義可能對應(yīng)著運行期的多個實例(instance)。而在引入模板(template)特性之前,每個函數(shù)定義都唯一的對應(yīng)于一些二進制指令。類(Class)相對于Struct的突破之處在于它表達了函數(shù)(指令)與數(shù)據(jù)之間的相關(guān)關(guān)系。Class之間的關(guān)系構(gòu)成結(jié)構(gòu)的結(jié)構(gòu)。在編譯期,我們所面對的只是類型定義,因而處理的正是結(jié)構(gòu)問題,此時并沒有實際的數(shù)據(jù)實例。而傳統(tǒng)上,編譯期所處理的結(jié)構(gòu)都是靜態(tài)的,現(xiàn)在腳本語言 (script)與language oriented programming正在逐漸突破這一限制。編譯期處理結(jié)構(gòu)問題所造成的另外一個現(xiàn)實是,目前我們對于結(jié)構(gòu)的描述必須基于類型系統(tǒng)來進行,一般情況下無法方便的單獨定制實例的結(jié)構(gòu)。
函數(shù)在其本義上只是對數(shù)據(jù)的變換,從數(shù)據(jù)空間的角度看,函數(shù)可以被看作是數(shù)據(jù)之間的一種動態(tài)結(jié)構(gòu),其最終形態(tài)在運行時結(jié)合輸入數(shù)據(jù)才展開。高階 (higher order)函數(shù)接受函數(shù)作為參數(shù),因而可以看作是對結(jié)構(gòu)的變換。但無論如何,函數(shù)與過程化處理并不是一回事,只是在von Neumman體系下,可以觀測到函數(shù)順序執(zhí)行才引入了時間概念。