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

隨筆-341  評(píng)論-2670  文章-0  trackbacks-0

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

 

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

 

C#里面,函數(shù)類型也是對(duì)象類型的一部分,但是由于C#可以在編譯過(guò)程中把一個(gè)不完整的函數(shù)類型推導(dǎo)為一個(gè)完整的函數(shù)類型,因此在這里將它和對(duì)象類型區(qū)分開(kāi)來(lái)。Haskell則在推導(dǎo)上做得更加徹底,這都是先進(jìn)的有類型語(yǔ)言所不可缺少的一個(gè)特征。由于類型之間的互相換算是本文所關(guān)心的內(nèi)容,因此下面先給出幾個(gè)定義。當(dāng)然這些定義在數(shù)學(xué)上是不嚴(yán)謹(jǐn)?shù)模乙膊⒉蛔非筮@個(gè)。namespace在這里也不是非常重要,因?yàn)榇嬖?/span>namespace和不存在namespace所帶來(lái)的區(qū)別僅僅是一個(gè)對(duì)象被如何解釋(黑話稱之為Resolving),并不影響推導(dǎo)過(guò)程。

 

我們可以將一個(gè)類型命名為T,它是不帶泛型的。一般來(lái)說(shuō),因?yàn)轭愋痛嬖诔蓡T函數(shù),所以類型便有幾個(gè)基本的屬性,稱之為this類型和base類型(在C#,代表自己的關(guān)鍵字分別是thisbase)。this指的是類型T的成員函數(shù)所看到的自己的類型。而base類型則是父類的類型。在這里有必要做出一點(diǎn)解釋。只有對(duì)象類型才具有base類型,而且其base類型指的是所有父類中唯一一個(gè)不是接口類型的那個(gè)。函數(shù)類型和接口類型都有this類型。

 

因此對(duì)于任何一個(gè)具有下面描述的類型T

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

this(T) == T

base(T) == U

 

現(xiàn)在讓我們來(lái)考察一個(gè)帶泛型的類型聲明T[U, V],和他的實(shí)例化類型T<A, B>之間的關(guān)系。我們知道,一個(gè)帶泛型的類型聲明T[U, V]實(shí)際上是一個(gè)不完整的類型,因?yàn)檫@個(gè)類型還有UV兩個(gè)參數(shù)待填,正如下面的代碼所示:

class T<U, V>{}

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

 

因此對(duì)于任何一個(gè)具有下面描述的類型T[U, V]

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

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

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

 

當(dāng)然,對(duì)于T<A, B>來(lái)說(shuō),它也具有this類型T<A, B>base類型W<A, B>。一般情況下,非泛型類型T的聲明可以被處理成T[],我們令T[]等于T<>,就可以將所有泛型類型的規(guī)則實(shí)例化到一個(gè)帶有0個(gè)泛型參數(shù)的泛型類型——也就是非泛型類型上面了。因此下面的討論將不作區(qū)分。

 

現(xiàn)在我們考慮如何獲得一個(gè)泛型類型的所有成員的類型。我們考慮下面的一組類型:

 

interface IEnumerable<T>

{

    IEnumerator<T> GetEnumerator();

}

 

class Base<T> : IEnumerable<T>

{

    public T Value{get; set;}

}

 

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

{

}

 

我們來(lái)考慮一個(gè)問(wèn)題:如何知道Derived<int, string>GetEnumerator函數(shù)的返回值類型是什么呢?乍一看似乎很簡(jiǎn)單,其實(shí)對(duì)于人類來(lái)說(shuō)這個(gè)問(wèn)題的確是僅靠直覺(jué)就可以瞬間回答出來(lái)的、根本沒(méi)有任何障礙的問(wèn)題了。這里我一直佩服大自然可以將人類進(jìn)化到如此牛逼的地步。不過(guò)這個(gè)問(wèn)題困擾了我很久,主要是在開(kāi)發(fā)語(yǔ)義分析器的時(shí)候,安排各種各樣的類型運(yùn)算、符號(hào)表的結(jié)構(gòu)和其它的一些相關(guān)問(wèn)題的時(shí)候,這個(gè)問(wèn)題的難度就提高了。

 

不過(guò)在這里我并不想多說(shuō)什么廢話,我們僅需要給類型對(duì)增加幾個(gè)屬性和運(yùn)算規(guī)則,就可以很容易的將這個(gè)問(wèn)題組合成一個(gè)表達(dá)式了。

 

首先,我們需要有一個(gè)replace操作。replace操作很難一下子嚴(yán)謹(jǐn)?shù)亩x出來(lái),不過(guò)可以給一個(gè)直觀的定義,就是:

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

相信大家已經(jīng)可以很輕松的理解了,因此對(duì)于一個(gè)類型映射tm={T=>string}來(lái)說(shuō),replace(Derived<IEnumerable<T>>, tk)的結(jié)果就是Derived<IEnumerable<string>>了。

 

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

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

 

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

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

 

因此一般來(lái)說(shuō),我們有下面的規(guī)則。只要類型T是一個(gè)泛型類型的實(shí)例類型,那么總是有:

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

 

現(xiàn)在我們就可以開(kāi)始回答上面提到的那個(gè)問(wèn)題了。

首先對(duì)于類型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>

 

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

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

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

因此對(duì)于一個(gè)泛型聲明decl(T)所繼承的一個(gè)接口Id,泛型聲明D的實(shí)例類型T所對(duì)應(yīng)的接口It等于replace(Td, params(T))

 

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

 

我們可以知道,在計(jì)算泛型類型的實(shí)例類型的成員類型中,我們總是不斷地在計(jì)算replace(A, params(B))的結(jié)果。因此在我實(shí)現(xiàn)的帶泛型的面向?qū)ο笸泄苷Z(yǔ)言:Vczh Library++ 3.0ManagedX語(yǔ)言的語(yǔ)義分析器的符號(hào)表的代碼里面,真實(shí)出現(xiàn)了使用C++所完成的thisbasedeclparamsreplacereplace_by_type = replace(A, params(B))這樣的六個(gè)函數(shù)。因?yàn)樵?/span>C++里面,一個(gè)類型的實(shí)例只能被表示為一個(gè)帶有復(fù)雜結(jié)構(gòu)的對(duì)象的指針。因此只要符號(hào)表在計(jì)算類型的過(guò)程中,把所有產(chǎn)生出來(lái)的類型保存下來(lái),建立索引,并且使得“只要類型A和類型B是同一個(gè)類型則有他們的指針P(A)P(B)相等”的這個(gè)條件恒成立的話,類型系統(tǒng)的計(jì)算速度將直接提高。

 

至于函數(shù)類型的推導(dǎo)法則(主要是應(yīng)用于lambda表達(dá)式的縮寫(xiě)語(yǔ)法),則等到我開(kāi)發(fā)到那里的時(shí)候再寫(xiě)后續(xù)的文章了。System.CoreManaged有幸不需要使用lambda表達(dá)式,使得我的第一個(gè)里程碑提前到來(lái)。

posted on 2011-09-27 05:54 陳梓瀚(vczh) 閱讀(7148) 評(píng)論(4)  編輯 收藏 引用 所屬分類: VL++3.0開(kāi)發(fā)紀(jì)事

評(píng)論:
# re: 淺談面向?qū)ο笳Z(yǔ)言的類型運(yùn)算 2011-09-27 23:48 | DiryBoy
Orz!! 貌似C#對(duì)Open Generic Type的寫(xiě)法是T<,>,而不是用中括號(hào)  回復(fù)  更多評(píng)論
  
# re: 淺談面向?qū)ο笳Z(yǔ)言的類型運(yùn)算 2011-09-28 10:26 | 陳梓瀚(vczh)
@DiryBoy
為了把參數(shù)名也一起寫(xiě)出來(lái)沒(méi)辦法了  回復(fù)  更多評(píng)論
  
# re: 淺談面向?qū)ο笳Z(yǔ)言的類型運(yùn)算 2011-09-28 16:51 | 空明流轉(zhuǎn)
OK,這個(gè)不錯(cuò)。。。。  回復(fù)  更多評(píng)論
  
# re: 淺談面向?qū)ο笳Z(yǔ)言的類型運(yùn)算 2012-06-12 17:06 | 我的大名
真有這么麻煩啊?!  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美成aⅴ人在线观看| 午夜国产欧美理论在线播放 | 久久综合狠狠综合久久综合88 | 国产视频精品网| 国产九九精品| 狠狠干综合网| 91久久久一线二线三线品牌| 亚洲精一区二区三区| 亚洲天堂av高清| 久久都是精品| 欧美激情久久久久| 99国产精品自拍| 午夜精品婷婷| 快she精品国产999| 欧美三区美女| 在线成人激情| 午夜精品福利一区二区蜜股av| 久久精品72免费观看| 毛片基地黄久久久久久天堂| 亚洲精品黄网在线观看| 亚洲欧美日韩在线不卡| 牛牛精品成人免费视频| 国产精品久久国产愉拍| 激情综合在线| 亚洲欧美日韩国产一区二区| 西瓜成人精品人成网站| 免费看的黄色欧美网站| 国产精品热久久久久夜色精品三区| 韩国av一区二区三区四区| 亚洲最黄网站| 开心色5月久久精品| 一本色道久久综合一区| 久久在精品线影院精品国产| 国产精品一级二级三级| 亚洲美女性视频| 猫咪成人在线观看| 午夜精品视频在线观看| 国产精品电影观看| 亚洲精品字幕| 欧美激情第10页| 久久久久网址| 狠狠色狠狠色综合日日五| 亚洲制服av| 亚洲美女电影在线| 欧美成人亚洲成人| 精品二区视频| 久久夜色精品一区| 亚洲欧美资源在线| 欧美网站在线观看| 一区二区日韩精品| 亚洲国产综合在线看不卡| 久久亚洲不卡| 影视先锋久久| 美女视频黄 久久| 性做久久久久久| 国产一级一区二区| 久久精品日产第一区二区三区| 亚洲深夜福利在线| 欧美天天在线| 亚洲一二三区在线| 亚洲视频一区| 国产精品一区在线观看| 新67194成人永久网站| 一本在线高清不卡dvd| 欧美视频第二页| 亚洲欧美日韩在线高清直播| 一本一本久久| 国产精品男gay被猛男狂揉视频| 亚洲欧美国产高清va在线播| 亚洲一区二区三区乱码aⅴ| 国产精品欧美日韩一区二区| 欧美一区激情| 久久久国产视频91| 亚洲国产二区| 亚洲精一区二区三区| 欧美视频精品在线| 亚洲欧美日韩一区二区在线| 午夜国产精品视频| 国内一区二区三区| 欧美成在线视频| 欧美精品一区二区精品网| 亚洲一区在线免费| 午夜欧美精品| 亚洲精品你懂的| 亚洲深夜激情| 黄色av成人| 91久久亚洲| 一区二区三区日韩精品| 国产一区二区三区精品久久久| 免费在线观看一区二区| 欧美激情中文不卡| 小嫩嫩精品导航| 久久综合九色综合网站| 日韩亚洲欧美综合| 香蕉成人啪国产精品视频综合网| 在线观看亚洲视频| 夜夜精品视频一区二区| 国内精品一区二区三区| 最新日韩欧美| 国产午夜精品视频免费不卡69堂| 欧美成人精品激情在线观看| 欧美日韩一区二| 免费观看亚洲视频大全| 欧美日韩在线免费| 蜜桃av噜噜一区| 国产精品入口尤物| 亚洲日韩视频| 在线观看视频一区| 午夜亚洲影视| 亚洲午夜91| 欧美不卡一区| 久久这里只有| 国产农村妇女毛片精品久久莱园子| 欧美高清一区二区| 国产亚洲精品一区二555| 9久草视频在线视频精品| 亚洲激情影视| 久久国产精品久久久久久电车| 亚洲少妇在线| 欧美色另类天堂2015| 亚洲欧洲精品天堂一级| 久久国产精品免费一区| 久久成年人视频| 国产精品s色| 亚洲精品免费网站| 亚洲国产精品久久| 久久久噜噜噜| 久热精品视频在线| 国产综合第一页| 午夜日韩在线| 久久狠狠婷婷| 国产视频一区二区三区在线观看| 中文欧美字幕免费| 亚洲一二三区视频在线观看| 欧美日韩国产综合网| 亚洲精品国产精品国自产在线| 伊人久久久大香线蕉综合直播| 久久疯狂做爰流白浆xx| 久久精品亚洲一区二区| 国产日产欧美一区| 久久成人综合视频| 麻豆精品在线视频| 91久久在线| 欧美日韩国产一区二区| 99视频热这里只有精品免费| 亚洲特级毛片| 国产日韩欧美不卡| 久久久久久婷| 亚洲国产日韩欧美一区二区三区| 99视频一区| 国产精品免费网站在线观看| 亚洲欧美视频一区二区三区| 久久精品国产欧美激情| 亚洲电影av在线| 亚洲视频999| 久久久久国产精品一区| 136国产福利精品导航网址| 免费观看亚洲视频大全| 夜夜爽99久久国产综合精品女不卡| 性久久久久久久| 国产一区二区在线观看免费播放 | 久久久久久久网站| 欧美激情视频一区二区三区不卡| 亚洲精品乱码久久久久久黑人| 欧美日本在线一区| 一区二区三区欧美日韩| 久久乐国产精品| 亚洲人成精品久久久久| 国产精品亚发布| 老司机精品导航| 亚洲视频香蕉人妖| 欧美v亚洲v综合ⅴ国产v| 日韩亚洲不卡在线| 国产欧美日韩在线| 欧美国产精品中文字幕| 中文网丁香综合网| 欧美成人性网| 香蕉久久夜色精品国产使用方法 | 亚洲欧美日本国产专区一区| 韩国av一区二区三区| 欧美激情一区二区三区不卡| 亚洲欧美精品一区| 久热综合在线亚洲精品| 日韩亚洲在线观看| 黄色成人在线| 国产精品一级二级三级| 欧美精品一区二区三区在线看午夜 | 玖玖玖免费嫩草在线影院一区| 亚洲精品久久嫩草网站秘色| 国产视频在线观看一区二区三区| 欧美日韩国产精品成人| 久久亚洲精品伦理| 午夜欧美电影在线观看| 日韩视频中文| 亚洲国产中文字幕在线观看| 老司机久久99久久精品播放免费| 亚洲综合大片69999| 一本色道久久综合| 亚洲精品一区二区三区婷婷月| 精品电影在线观看|