青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0

C#或者Haskell這樣的先進的語言都有一個跟語法分不開的最核心的庫。譬如說C#int,是mscorlib.dll里面的System.SInt32Haskell(x:xs)則定義在了prelude里面。Vczh Library++ 3.0ManagedX語言也有一個類似mscorlib.dll的東西。之前的NativeX提供了一個核心的函數庫叫System.CoreNative (syscrnat.assembly),因此ManagedX的就命名為System.CoreManaged (syscrman.assembly)System.CoreManaged里面的預定義對象都是一些基本的、不可缺少的類型,例如System.SInt32System.IEnumerable<T>或者System.Reflection.Type。昨天晚上我的未完成的語義分析器的完成程度已經足以完全分析System.CoreManaged里面的托管代碼了,因此符號表里面的類型系統也基本上是一個完整的類型系統。在開發的過程中得到的心得體會便是寫著一篇文章的來源。

 

如今,先進的面向對象語言的類型都離不開下面的幾個特征:對象類型、函數類型和接口類型。修飾類型的工具則有泛型和延遲綁定等等。譬如說C#,對象類型便是object,函數類型則有.net framework支持的很好,但是不是核心類型的FuncAction,接口類型則類似IEnumerable。泛型大家都很熟悉,延遲綁定則類似于dynamic關鍵字。var關鍵字是編譯期綁定的,因此不計算在內。Javaint是魔法類型,其設計的錯誤已經嚴重影響到了類庫的優美程度,其使用“類型擦除”的泛型系統也為今后的發展留下了一些禍根,因此這些旁門左道本文章就不去詳細討論了。這篇文章講針對重要的那三個類型和兩個修飾進行討論,并解釋他們之間互相換算的方法。

 

C#里面,函數類型也是對象類型的一部分,但是由于C#可以在編譯過程中把一個不完整的函數類型推導為一個完整的函數類型,因此在這里將它和對象類型區分開來。Haskell則在推導上做得更加徹底,這都是先進的有類型語言所不可缺少的一個特征。由于類型之間的互相換算是本文所關心的內容,因此下面先給出幾個定義。當然這些定義在數學上是不嚴謹的,而我也并不追求這個。namespace在這里也不是非常重要,因為存在namespace和不存在namespace所帶來的區別僅僅是一個對象被如何解釋(黑話稱之為Resolving),并不影響推導過程。

 

我們可以將一個類型命名為T,它是不帶泛型的。一般來說,因為類型存在成員函數,所以類型便有幾個基本的屬性,稱之為this類型和base類型(在C#,代表自己的關鍵字分別是thisbase)。this指的是類型T的成員函數所看到的自己的類型。而base類型則是父類的類型。在這里有必要做出一點解釋。只有對象類型才具有base類型,而且其base類型指的是所有父類中唯一一個不是接口類型的那個。函數類型和接口類型都有this類型。

 

因此對于任何一個具有下面描述的類型T

class T : U, I1, I2, I3{}

this(T) == T

base(T) == U

 

現在讓我們來考察一個帶泛型的類型聲明T[U, V],和他的實例化類型T<A, B>之間的關系。我們知道,一個帶泛型的類型聲明T[U, V]實際上是一個不完整的類型,因為這個類型還有UV兩個參數待填,正如下面的代碼所示:

class T<U, V>{}

而當你實例化他之后,令U==AV==B,則T類型被AB實例化成了T<A, B>。這就有點象我們把一個Dictionary[K, V]給實例化成Dictionary<int, string>一樣。一個實例化后的類型才可以被當成另一個泛型類型的類型參數,或者直接使用它來定義一些符號,或者創建一個它的實例等等。但是不完整的泛型類型T[U, V]和它的實例化類型T<A, B>都具有共同的屬性——this類型和base類型。按照上面的定義,this類型是該類型的成員函數所看到的自己的類型。

 

因此對于任何一個具有下面描述的類型T[U, V]

class T<U, V> : W<U, V>{}

this(T[U, V]) == T<U, V>

base(T[U, V]) == W<U, V>

 

當然,對于T<A, B>來說,它也具有this類型T<A, B>base類型W<A, B>。一般情況下,非泛型類型T的聲明可以被處理成T[],我們令T[]等于T<>,就可以將所有泛型類型的規則實例化到一個帶有0個泛型參數的泛型類型——也就是非泛型類型上面了。因此下面的討論將不作區分。

 

現在我們考慮如何獲得一個泛型類型的所有成員的類型。我們考慮下面的一組類型:

 

interface IEnumerable<T>

{

    IEnumerator<T> GetEnumerator();

}

 

class Base<T> : IEnumerable<T>

{

    public T Value{get; set;}

}

 

class Derived<T, U> : Base<U>

{

}

 

我們來考慮一個問題:如何知道Derived<int, string>GetEnumerator函數的返回值類型是什么呢?乍一看似乎很簡單,其實對于人類來說這個問題的確是僅靠直覺就可以瞬間回答出來的、根本沒有任何障礙的問題了。這里我一直佩服大自然可以將人類進化到如此牛逼的地步。不過這個問題困擾了我很久,主要是在開發語義分析器的時候,安排各種各樣的類型運算、符號表的結構和其它的一些相關問題的時候,這個問題的難度就提高了。

 

不過在這里我并不想多說什么廢話,我們僅需要給類型對增加幾個屬性和運算規則,就可以很容易的將這個問題組合成一個表達式了。

 

首先,我們需要有一個replace操作。replace操作很難一下子嚴謹的定義出來,不過可以給一個直觀的定義,就是:

replace(Derived<T, U>, {T=>int, U=>string}) == Derived<int, string>

相信大家已經可以很輕松的理解了,因此對于一個類型映射tm={T=>string}來說,replace(Derived<IEnumerable<T>>, tk)的結果就是Derived<IEnumerable<string>>了。

 

其次,我們需要一個decl操作,這個操作返回一個泛型類型的實例類型的定義:

decl(T<A, B>) == T[U, V]

 

然后,我們還需要一個params操作。這個操作將一個泛型類型的實例類型和他的泛型定義相比較,提取出可以從泛型定義replace到實例類型的那個類型映射:

params(T<A, B>) == {T=>A, U=>B}

 

因此一般來說,我們有下面的規則。只要類型T是一個泛型類型的實例類型,那么總是有:

replace(this(decl(T)), params(T)) == T

 

現在我們就可以開始回答上面提到的那個問題了。

首先對于類型Derived<int, string>,我們需要找到他的父類。因此我們可以做如下幾步操作:

tm = params(Derived<int, string>) = {T=>int, U=>string}

tb = base(decl(Derived<int, string>)) = base(Derived[T, U]) = Base<U>

result = replace(tb, tm) = replace(Base<U>, {T=>int, U=>string}) = Base<string>

這樣我們就成功求出T=Derived<int, string>的父類B=replace(base(decl(T)), params(T))=Base<string>

 

其次,我們指定要計算類型Base<string>所繼承的那個接口Base[T]=>IEnumerable<T>,我們可以使用

tm = params(Base<string>) = {T=>string}

result = replace(IEnumerable<T>, tm) = IEnumerable<string>

因此對于一個泛型聲明decl(T)所繼承的一個接口Id,泛型聲明D的實例類型T所對應的接口It等于replace(Td, params(T))

 

因此對于IEnumerable[T]的函數GetEnumerator的返回值類型IEnumerator<T>,聰明的讀者肯定想到,IEnumerable<string>所對應的類型就是replace(IEnumerator<T>, params(IEnumerable<string>)) == IEnumerator<string>了。這個結果跟求實例類型所繼承的接口類型的方法一樣。

 

我們可以知道,在計算泛型類型的實例類型的成員類型中,我們總是不斷地在計算replace(A, params(B))的結果。因此在我實現的帶泛型的面向對象托管語言:Vczh Library++ 3.0ManagedX語言的語義分析器的符號表的代碼里面,真實出現了使用C++所完成的thisbasedeclparamsreplacereplace_by_type = replace(A, params(B))這樣的六個函數。因為在C++里面,一個類型的實例只能被表示為一個帶有復雜結構的對象的指針。因此只要符號表在計算類型的過程中,把所有產生出來的類型保存下來,建立索引,并且使得“只要類型A和類型B是同一個類型則有他們的指針P(A)P(B)相等”的這個條件恒成立的話,類型系統的計算速度將直接提高。

 

至于函數類型的推導法則(主要是應用于lambda表達式的縮寫語法),則等到我開發到那里的時候再寫后續的文章了。System.CoreManaged有幸不需要使用lambda表達式,使得我的第一個里程碑提前到來。

posted on 2011-09-27 05:54 陳梓瀚(vczh) 閱讀(7149) 評論(4)  編輯 收藏 引用 所屬分類: VL++3.0開發紀事

評論:
# re: 淺談面向對象語言的類型運算 2011-09-27 23:48 | DiryBoy
Orz!! 貌似C#對Open Generic Type的寫法是T<,>,而不是用中括號  回復  更多評論
  
# re: 淺談面向對象語言的類型運算 2011-09-28 10:26 | 陳梓瀚(vczh)
@DiryBoy
為了把參數名也一起寫出來沒辦法了  回復  更多評論
  
# re: 淺談面向對象語言的類型運算 2011-09-28 16:51 | 空明流轉
OK,這個不錯。。。。  回復  更多評論
  
# re: 淺談面向對象語言的類型運算 2012-06-12 17:06 | 我的大名
真有這么麻煩啊?!  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区二区三区婷婷月色 | 黄色成人91| 亚洲欧美一区二区视频| 日韩一级不卡| 欧美午夜激情在线| 亚洲无限乱码一二三四麻| 亚洲免费av片| 国产精品午夜春色av| 亚洲欧美日韩一区在线观看| 亚洲视频综合| 国产精品视频yy9299一区| 欧美一区二区高清在线观看| 亚洲欧洲99久久| 狠色狠色综合久久| 欧美国内亚洲| 欧美日韩一区二区三区| 欧美一区二区三区精品| 久久久精品动漫| 日韩网站在线观看| 亚洲一区二区三区精品在线| 国产自产在线视频一区| 欧美激情网站在线观看| 国产精品久久久久久久第一福利| 久久精品国产一区二区三区| 欧美二区乱c少妇| 亚洲嫩草精品久久| 久久先锋影音av| 亚洲香蕉伊综合在人在线视看| 亚洲欧美日韩在线观看a三区| 亚洲国产成人在线播放| 一级成人国产| 91久久精品美女高潮| 中文国产成人精品久久一| 一区二区三区在线观看欧美 | 久久亚洲精品欧美| 欧美激情中文不卡| 久久精品99无色码中文字幕 | 老司机精品久久| 亚洲欧美日韩国产另类专区| 久久综合激情| 欧美中文字幕在线视频| 欧美日韩亚洲激情| 欧美成人精品h版在线观看| 国产精品午夜电影| 亚洲日本成人女熟在线观看| 好吊色欧美一区二区三区四区 | 麻豆精品传媒视频| 国产精品免费网站| 亚洲精品国产精品国自产观看浪潮 | 老司机午夜免费精品视频| 欧美色视频在线| 亚洲国产精品一区制服丝袜 | 欧美视频一区二区在线观看 | 亚洲欧美日韩爽爽影院| 欧美暴力喷水在线| 美女性感视频久久久| 国产性色一区二区| 亚洲一二三级电影| 亚洲欧美激情一区| 国产精品久久久久91| 夜夜爽www精品| 99视频在线观看一区三区| 美女精品国产| 欧美成人激情在线| 亚洲高清资源| 欧美成人午夜视频| 亚洲国产精品久久久久秋霞影院| 永久免费精品影视网站| 久久精品视频免费观看| 久久综合久色欧美综合狠狠| 国自产拍偷拍福利精品免费一| 午夜亚洲福利在线老司机| 欧美一区二区三区久久精品茉莉花 | 免费观看成人鲁鲁鲁鲁鲁视频| 美腿丝袜亚洲色图| 狠狠色狠狠色综合日日五| 久久国产精品99精品国产| 久久久久国内| 在线精品福利| 欧美成人综合一区| 亚洲破处大片| 亚洲一区二区在线观看视频| 国产精品久久久亚洲一区| 亚洲综合精品四区| 美女黄毛**国产精品啪啪| 亚洲人线精品午夜| 欧美日韩一区三区| 亚洲欧美激情四射在线日| 久久精品国产亚洲aⅴ| 亚洲国产精品久久久久婷婷老年| 欧美成人午夜免费视在线看片| 亚洲免费高清| 性欧美大战久久久久久久免费观看 | 午夜亚洲影视| 欧美激情精品久久久久久大尺度 | 亚洲男人影院| 国内精品久久久久久久97牛牛| 蜜桃av噜噜一区二区三区| 99国产精品99久久久久久| 久久av最新网址| 亚洲精品午夜精品| 国产乱肥老妇国产一区二| 米奇777在线欧美播放| 亚洲无限乱码一二三四麻| 久久尤物视频| 亚洲永久免费观看| 在线精品视频一区二区三四| 欧美日韩激情小视频| 欧美影院成人| 一区二区国产在线观看| 农村妇女精品| 亚洲女人小视频在线观看| 亚洲国产精品成人综合色在线婷婷| 欧美日韩妖精视频| 久久九九国产| 亚洲欧美国产精品桃花| 亚洲日本中文字幕区| 久热re这里精品视频在线6| 亚洲制服av| 亚洲精品乱码久久久久久黑人| 国产日韩欧美一区| 欧美体内谢she精2性欧美| 欧美.www| 久久午夜视频| 欧美在线观看视频一区二区三区| 一区二区三区精品| 亚洲国产一区二区三区高清| 久久亚洲精品伦理| 欧美一区二区高清在线观看| 亚洲色图综合久久| 91久久精品国产| 在线观看视频亚洲| 国产一区二区三区在线播放免费观看| 欧美日在线观看| 欧美经典一区二区| 欧美96在线丨欧| 蜜臀91精品一区二区三区| 久久精品国产精品亚洲综合| 性色av一区二区怡红| 亚洲一区二区三区色| 亚洲天堂成人在线视频| 一区二区三区视频观看| 亚洲精品影院在线观看| 亚洲三级色网| 日韩视频三区| 亚洲午夜精品一区二区| 亚洲午夜女主播在线直播| 一个人看的www久久| 亚洲视频在线观看免费| 亚洲天堂av图片| 亚洲免费在线电影| 午夜精品久久久久| 欧美专区在线观看| 久久免费高清视频| 久久天堂成人| 欧美国产三级| 国产精品成人aaaaa网站| 国产精品久在线观看| 国产精品日韩在线播放| 国产日韩专区| 亚洲国产精品久久久久| 日韩亚洲欧美成人| 亚洲性感美女99在线| 午夜精品影院| 看片网站欧美日韩| 亚洲激情在线观看| 亚洲一区二区三区四区视频| 欧美一级在线视频| 另类天堂av| 国产精品久久综合| 一区二区三区在线不卡| 亚洲美女视频在线免费观看| 亚洲一区二区三区三| 久久九九精品99国产精品| 亚洲福利视频在线| 亚洲午夜av| 久久免费视频网站| 欧美日韩一区在线视频| 国内精品久久久久久| 99re热精品| 久久永久免费| 亚洲美女中出| 久久麻豆一区二区| 欧美日韩亚洲一区二区| 激情视频一区| 午夜在线一区二区| 亚洲国产二区| 欧美一区二区三区久久精品| 欧美日本簧片| 狠狠色综合一区二区| 亚洲一区二区三区欧美| 欧美国产第二页| 亚洲欧美日韩成人高清在线一区| 欧美成人视屏| 狠狠综合久久av一区二区老牛| 亚洲男女自偷自拍| 亚洲丁香婷深爱综合| 欧美在线一级视频| 国产精品美女久久福利网站| 日韩午夜剧场|