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