面向?qū)ο笳Z言概論
(譯自Martin Abadi, Luca Cardelli的對(duì)象理論一書的第一部分)
譯者前言
這本書是我們上面向?qū)ο箢愋屠碚摰慕滩摹.?dāng)時(shí)上這門課時(shí),心里滿不以為然,覺得自己的C++和OO已經(jīng)頗有造紙,C++和Java的類型系統(tǒng)不說倒背如流,也是輕車熟路,上這么一門課不是白拿學(xué)分?哈哈!
但一上起來,才發(fā)現(xiàn)自己竟如井底之蛙一樣。老天,原來就這么簡單的面向?qū)ο缶褂羞@么多說道!原來除了C++, Java, 面向?qū)ο筮€有這么多沒見過甚至沒想過的東西!
前幾章概論,勉強(qiáng)還都搞定了。但后面上到類型系統(tǒng)的建模,subject reduction的證明,就發(fā)現(xiàn)自己就象回到了本科時(shí)代,這,這,這怎么都是數(shù)學(xué)啊!
這兩天心血來潮。就想把它翻譯一下。后面艱深的地方自覺功力太淺,就不不自量力了。不過,倒可以把前面幾章的概論翻譯一下,如果能起到幫助大家開闊眼界的作用,也就沒白費(fèi)勁。
第二章,基于類的面向?qū)ο笳Z言
基于類的面向?qū)ο笳Z言是面向?qū)ο笫澜缋锏闹髁?。它包括?BR> Simula, 第一個(gè)面向?qū)ο笳Z言
Smalltalk, 第一個(gè)支持動(dòng)態(tài)類型的語言
C++, 它的大部分基于類的特性繼承自Simula.
等等等等。
與基于類的語言相對(duì)應(yīng)的是基于對(duì)象的面向?qū)ο笳Z言。這里“基于對(duì)象”的概念和把Visual Basic叫做基于對(duì)象的概念是不同的。這里的“基于對(duì)象”是指一個(gè)只以對(duì)象為中心,沒有類的概念的語言,類似Python之類的語言。
現(xiàn)在,我們來介紹一下基于類的面向?qū)ο笳Z言的一些共同特征。
1.類和對(duì)象
讓我們先看一個(gè)類的定義:
class cell is
var contents: Integer :=0;
method get(): Integer is
return self.contents;
end;
method set(n:Integer) is
self.contents := n;
end;
end;
一個(gè)類是用來描述所有屬于這個(gè)類的對(duì)象的共同結(jié)構(gòu)的。這個(gè)cell類表示的對(duì)象擁有一個(gè)叫做contents的整數(shù)屬性(attribute),這個(gè)屬性被初始化成0。它還描述了兩個(gè)操作contents的方法。Get和set. 這兩個(gè)方法的內(nèi)容都是很直觀的。Self變量表示這個(gè)對(duì)象自己。
對(duì)象的動(dòng)態(tài)語義可以這樣理解:
一個(gè)對(duì)象在內(nèi)部被表示為一個(gè)指向一組屬性的指針。任何對(duì)這個(gè)對(duì)象的操作都會(huì)經(jīng)過這個(gè)指針操作對(duì)象的屬性和方法。而當(dāng)對(duì)象被賦值或被當(dāng)作參數(shù)傳遞的時(shí)候,所傳遞的只是指針,這樣一來,同一組屬性就可以被共享。
(注, 有些語言如C++, 明確區(qū)分指向?qū)傩越M的指針和屬性組本身,而一些其它的語言則隱藏了這種區(qū)別)
對(duì)象可以用new從一個(gè)類中實(shí)例化。準(zhǔn)確地說,new C分配了一組屬性,
并返回指向這組屬性的指針。這組屬性被賦予了初始值,并包括了類C所定義的方法的代碼。
下面我們來考慮類型。對(duì)一個(gè)new C所生成的對(duì)象,我們把它的類型記為InstanceTypeOf(c). 一個(gè)例子是:
var myCell: InstanceTypeOf(cell) := new cell;
這里,通過引入InstanceTypeOf(cell), 我們開始把class和type區(qū)分開來了。我們也可以把cell本身當(dāng)作是類型,但接下來,你就會(huì)發(fā)現(xiàn),那樣做會(huì)導(dǎo)致混淆的。
2.方法解析。(Method Lookup)
給出一個(gè)方法的調(diào)用o.m(……), 一個(gè)由各個(gè)語言自己實(shí)現(xiàn)的叫做方法解析的過程負(fù)責(zé)找到正確的方法的代碼。(譯者按:是不是想起了vtable了?)。
直觀地看,方法的代碼可以被嵌入各個(gè)單個(gè)對(duì)象中,而且,對(duì)于許多面向?qū)ο笳Z言,對(duì)屬性和方法的相似的語法,也確實(shí)給人這種印象。
不過,考慮到節(jié)省空間,很少有語言這樣實(shí)現(xiàn)。比較普遍的方法是,語言會(huì)生成許多method suite, 而這些method suite可以被同一個(gè)類的對(duì)象們所共享。方法解析過程會(huì)延著對(duì)象內(nèi)指向method suite的指針找到方法。
在考慮到繼承的情況,方法解析會(huì)更加復(fù)雜化。Method suite也許會(huì)被組成一個(gè)樹,而對(duì)一個(gè)方法的解析也許要查找一系列method suite. 而如果有多繼承的話,method suite甚至可能組成有向圖,或者是環(huán)。
方法解析可能發(fā)生在編譯時(shí),也可能發(fā)生在運(yùn)行時(shí)。
在一些語言中,方法到底是嵌入對(duì)象中的,還是存在于method suite中這種細(xì)節(jié),對(duì)程序員是無關(guān)緊要的。因?yàn)?,所有能區(qū)分這兩種模式的語言特性一般在基于類的面向?qū)ο笳Z言中都不被支持。
比如說,方法并不能象屬性一樣從對(duì)象中取出來當(dāng)作函數(shù)使用。方法也不能象屬性一樣在對(duì)象中被更新。(也就是說,你更新了一個(gè)對(duì)象的方法,而同一個(gè)類的其它對(duì)象的該方法保持不變。)
(譯自Martin Abadi, Luca Cardelli的對(duì)象理論一書的第一部分)
譯者前言
這本書是我們上面向?qū)ο箢愋屠碚摰慕滩摹.?dāng)時(shí)上這門課時(shí),心里滿不以為然,覺得自己的C++和OO已經(jīng)頗有造紙,C++和Java的類型系統(tǒng)不說倒背如流,也是輕車熟路,上這么一門課不是白拿學(xué)分?哈哈!
但一上起來,才發(fā)現(xiàn)自己竟如井底之蛙一樣。老天,原來就這么簡單的面向?qū)ο缶褂羞@么多說道!原來除了C++, Java, 面向?qū)ο筮€有這么多沒見過甚至沒想過的東西!
前幾章概論,勉強(qiáng)還都搞定了。但后面上到類型系統(tǒng)的建模,subject reduction的證明,就發(fā)現(xiàn)自己就象回到了本科時(shí)代,這,這,這怎么都是數(shù)學(xué)啊!
這兩天心血來潮。就想把它翻譯一下。后面艱深的地方自覺功力太淺,就不不自量力了。不過,倒可以把前面幾章的概論翻譯一下,如果能起到幫助大家開闊眼界的作用,也就沒白費(fèi)勁。
第二章,基于類的面向?qū)ο笳Z言
基于類的面向?qū)ο笳Z言是面向?qū)ο笫澜缋锏闹髁?。它包括?BR> Simula, 第一個(gè)面向?qū)ο笳Z言
Smalltalk, 第一個(gè)支持動(dòng)態(tài)類型的語言
C++, 它的大部分基于類的特性繼承自Simula.
等等等等。
與基于類的語言相對(duì)應(yīng)的是基于對(duì)象的面向?qū)ο笳Z言。這里“基于對(duì)象”的概念和把Visual Basic叫做基于對(duì)象的概念是不同的。這里的“基于對(duì)象”是指一個(gè)只以對(duì)象為中心,沒有類的概念的語言,類似Python之類的語言。
現(xiàn)在,我們來介紹一下基于類的面向?qū)ο笳Z言的一些共同特征。
1.類和對(duì)象
讓我們先看一個(gè)類的定義:
class cell is
var contents: Integer :=0;
method get(): Integer is
return self.contents;
end;
method set(n:Integer) is
self.contents := n;
end;
end;
一個(gè)類是用來描述所有屬于這個(gè)類的對(duì)象的共同結(jié)構(gòu)的。這個(gè)cell類表示的對(duì)象擁有一個(gè)叫做contents的整數(shù)屬性(attribute),這個(gè)屬性被初始化成0。它還描述了兩個(gè)操作contents的方法。Get和set. 這兩個(gè)方法的內(nèi)容都是很直觀的。Self變量表示這個(gè)對(duì)象自己。
對(duì)象的動(dòng)態(tài)語義可以這樣理解:
一個(gè)對(duì)象在內(nèi)部被表示為一個(gè)指向一組屬性的指針。任何對(duì)這個(gè)對(duì)象的操作都會(huì)經(jīng)過這個(gè)指針操作對(duì)象的屬性和方法。而當(dāng)對(duì)象被賦值或被當(dāng)作參數(shù)傳遞的時(shí)候,所傳遞的只是指針,這樣一來,同一組屬性就可以被共享。
(注, 有些語言如C++, 明確區(qū)分指向?qū)傩越M的指針和屬性組本身,而一些其它的語言則隱藏了這種區(qū)別)
對(duì)象可以用new從一個(gè)類中實(shí)例化。準(zhǔn)確地說,new C分配了一組屬性,
并返回指向這組屬性的指針。這組屬性被賦予了初始值,并包括了類C所定義的方法的代碼。
下面我們來考慮類型。對(duì)一個(gè)new C所生成的對(duì)象,我們把它的類型記為InstanceTypeOf(c). 一個(gè)例子是:
var myCell: InstanceTypeOf(cell) := new cell;
這里,通過引入InstanceTypeOf(cell), 我們開始把class和type區(qū)分開來了。我們也可以把cell本身當(dāng)作是類型,但接下來,你就會(huì)發(fā)現(xiàn),那樣做會(huì)導(dǎo)致混淆的。
2.方法解析。(Method Lookup)
給出一個(gè)方法的調(diào)用o.m(……), 一個(gè)由各個(gè)語言自己實(shí)現(xiàn)的叫做方法解析的過程負(fù)責(zé)找到正確的方法的代碼。(譯者按:是不是想起了vtable了?)。
直觀地看,方法的代碼可以被嵌入各個(gè)單個(gè)對(duì)象中,而且,對(duì)于許多面向?qū)ο笳Z言,對(duì)屬性和方法的相似的語法,也確實(shí)給人這種印象。
不過,考慮到節(jié)省空間,很少有語言這樣實(shí)現(xiàn)。比較普遍的方法是,語言會(huì)生成許多method suite, 而這些method suite可以被同一個(gè)類的對(duì)象們所共享。方法解析過程會(huì)延著對(duì)象內(nèi)指向method suite的指針找到方法。
在考慮到繼承的情況,方法解析會(huì)更加復(fù)雜化。Method suite也許會(huì)被組成一個(gè)樹,而對(duì)一個(gè)方法的解析也許要查找一系列method suite. 而如果有多繼承的話,method suite甚至可能組成有向圖,或者是環(huán)。
方法解析可能發(fā)生在編譯時(shí),也可能發(fā)生在運(yùn)行時(shí)。
在一些語言中,方法到底是嵌入對(duì)象中的,還是存在于method suite中這種細(xì)節(jié),對(duì)程序員是無關(guān)緊要的。因?yàn)?,所有能區(qū)分這兩種模式的語言特性一般在基于類的面向?qū)ο笳Z言中都不被支持。
比如說,方法并不能象屬性一樣從對(duì)象中取出來當(dāng)作函數(shù)使用。方法也不能象屬性一樣在對(duì)象中被更新。(也就是說,你更新了一個(gè)對(duì)象的方法,而同一個(gè)類的其它對(duì)象的該方法保持不變。)