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

隨筆-341  評論-2670  文章-0  trackbacks-0
    為了讓更高級的語言可以編譯到Vczh Library++ 3.0上面的NativeX語言,原生的泛型支持是必須有的。泛型不僅僅是一堆代碼的填空題那么簡單,因為編譯之后的Assembly(dll)必須可以容納泛型聲明,而且其他的Assembly可以實例化包含在其他Assembly里面的泛型聲明。這是非常麻煩的(被.net搞定了,jvm則由于種種原因搞不定,大概是因為jvm對assembly version的支持太差導致的,你知道.net 2.0的東西是不能引用4.0的dll的……)。不過先拋開這個不講,雖然如何在Assembly里面實現泛型我已經心里有數了,但是這里還是從語義的層面上來考慮泛型的設計。

    在討論之前還是要強調一下一個大前提:NativeX基本上就是一個語法更加容易看懂的C語言而已,功能完全是等價的。于是我要在NativeX上加泛型,其實也就是等于在C上面加泛型。我們使用泛型完成的事情可以有很多,譬如說定義泛型的結構體,定義泛型的函數,還有泛型的存儲空間等等。首先讓我們討論泛型的結構體。最終的語法可能會跟現在不一樣,因為NativeX的使命是作為一棵語法樹出現的,所以做得太漂亮的價值其實不是很大。

    一、泛型結構體

    泛型的結構體還是比較容易理解的,舉個小例子:
1 generic<type T>
2 structure Vector
3 {
4   T x;
5   T y;
6 }

    這樣子我們就創建了一個泛型的結構體。任何熟悉C++或C#的人都知道這是什么意思,我就不做解釋了。使用的時候跟我們的習慣是一樣的:
1 Vector<double> v;
2 v.x = 1.0;
3 v.y = 2.0;

    于是我們創建了一個泛型的變量,然后修改了它的成員。

    二、泛型全局存儲空間

    其實泛型的全局存儲空間基本上等于編譯器替你做好的一個key為類型的大字典。有些時候我們需要給類型加上一些附加的數據,而且是按需增長的。這就代表在編譯的時候提供泛型全局存儲空間的Assembly并不知道將來有多少個key要提供支持,所以創建它們的工作應該是虛擬機在鏈接一個想使用其他Assembly提供的全局空間的新Assembly的時候創建的。這里帶來了一個問題是不同的Assembly使用相同的類型可以訪問相同的全局存儲空間,這里先不討論具體實施的手段。

    語法上可能比較混淆:
1 generic<type T>
2 structure TypeStorage
3 {
4   wchar* name;
5   function T() builderFunction;//這是函數指針
6 }
7 
8 generic<type T>
9 TypeStorage<T> typeStorage;

    在一個變量上面加泛型可能會有點奇怪,不過這里的定義還是很明確的。typeStorage是全局變量的泛型,因此typeStorage<int>、typeStorage<double>甚至typeStorage<Vector<Vector<wchar*>>>等等(啊,>>問題)是代表不同的全局變量。不同的Assembly訪問的typeStorage<int>都是相同的全局變量。

    三、泛型函數

    泛型函數我們也都很熟悉了。一個簡單的例子可以是:
1 generic<type T>
2 T Copy(T* pt)
3 {
4   result = *pt;
5 }

    需要指出的是,NativeX并沒有打算要支持泛型結構、全局存儲和函數的特化或偏特化。因此我們會很驚訝的發現這樣的話泛型函數唯一能做的就是復制東西了,因為它調用不了其他的非泛型函數(跟C++不一樣,NativeX的泛型函數更接近于C#:編譯的時候進行完全的語義分析)。雖然泛型函數可以調用其他的泛型函數,但是最終也只能做復制。因此我們要引入一個新的(其實是舊的)概念,才可以避免我們為了提供各種操作在泛型函數的參數上傳入一大堆的函數指針:“概念”。

    四、泛型concept

    泛型結構體和全局存儲僅僅用來保存數據,所以泛型concept只能在泛型函數上面使用。這個concept跟C++原本打算支持的concept還是很接近的,只是NativeX沒有class,因此只好做一點小修改。

    泛型concept主要是為了指定一套操作的接口,然后讓編譯器可以完成比調用函數指針更加高效的代碼。偷偷告訴大家,把他叫concept只是因為NativeX跟C很像,但其實這個概念是從Haskell來的……我們還是來看看concept怎么寫吧。
 1 generic<type T>
 2 concept Addable
 3 {
 4   operation T add(T a, T b);
 5   operation T sub(T a, T b);
 6   constant T zero;
 7 }
 8 
 9 generic<type T>
10 concept Multible : Addable<T>
11 {
12   operation T mul(T a, T b);
13   operation T div(T a, T b);
14   constant T one;
15 }

    這里定義了加法和乘法的兩個concept。我們可以看出concept是可以繼承的,其實也是可以多重繼承的。concept里面可以放操作(operation),也可以放常數(constant)。這里的常數跟全局存儲的機制不同,全局存儲可以自動為新類型產生可讀寫的空間,而concept的常數不僅是只讀的,而且還不可自動產生空間。之前考慮到的一個問題就是,我們可能需要把外界提供的某個concept的operation的函數指針提取出來,有這種需要的operation可以把這個關鍵字替換成function,這樣在實例化concept的時候,那個標記了function的操作就只能綁定一個函數而不是一個表達式了。我們可以嘗試為int創建一個Multible的concept:
1 concept instance IntMultible : Multible<int>
2 {
3   operation T add(T a, T b) = a+b;
4   operation T sub(T a, T b) = a-b;
5   operation T mul(T a, T b) = a*b;
6   operation T div(T a, T b) = a/b;
7   constant T zero = 0;
8   constant T one = 1;
9 }

    于是我們可以寫一個函數計算a+b*c:
1 generic<type T, concept Multible<T> multible>
2 function T AddMul(T a, T b, T c)
3 {
4   return multible.add(a, multible.mul(b, c));
5 }

    然后調用它:
1 int r = AddMul<int, IntMultible>(345);

    五、另一種concept instance

    雖然我們不允許泛型的結構體、全局存儲和函數進行特化,但是因為特化實在是一個好東西。上面的concept instance是沒有彈性的,因為你不可能通過一個concept instance拿到另外一個concept instance。考慮一下delphi的帶引用計數的嵌套數組,如果我們想讓delphi可以編譯到NativeX上,則勢必要支持那種東西。主要的困難在于delphi支持的帶有引用計數的數組和字符串,因此在對array of array of string進行釋放的時候,我們首先要拿到array of array of string的concept instance,其次在釋放函數里面要拿到array of string的concept instance,最后還要拿到string的concept instance。這個用上面所提出來的方法是做不了的。因此我們引進了一種新的concept instance:叫concept series。這個跟haskell的東西又更接近了一步了,因為haskell的concept instance其實是匿名但是可特化的……

    于是現在讓我們來實現Array和String,并寫幾個類型的Increase和Decrease的函數(函數體一部分會被忽略因為這里只是為了展示concept):
 1 structure String
 2 {
 3   int reference;
 4   wchar* content;
 5 }
 6 
 7 generic<type T>
 8 structure Array
 9 {
10   int reference;
11   int length;
12   T* items;
13 }

    我們從這里可以看出,string跟array的區別就是在于長度上面,string有0結尾而array只能通過記錄一個長度來實現。現在我們來寫一個用于構造缺省數值、增加引用計數和減少引用計數的concept series:
 1 generic<type T>
 2 concept Referable
 3 {
 4   operation T GetDefault();
 5   operation void Increase(T* t);
 6   operation void Decrease(T* t);
 7 }
 8 
 9 generic<type T>
10 concept series DelphiTypeReferable : Referable<T>
11 {
12 }

    concept series其實就是專門用來特化的concept instance。但是為了防止不同的Assembly特化出同一個concept series所帶來的麻煩,我可能會規定允許特化concept series的地方,要么是在聲明該concept series的Assembly,要么是聲明涉及的類型的Assembly。因為我的Assembly不允許循環引用,因此對于同一個concept series C<T,U>來講,就算T和U分別在不同的Assembly出現,那么也只能有一個有權限特化出它。下面來看特化具體要怎么做。首先我們特化一個簡單的,string的DelphiTypeReferable:
1 concept series DelphiTypeReferable<String>
2 {
3   operation GetDefault = StringGetDefault;
4   operation Increase = StringIncrease;
5   operation Decrease = StringDecrease;
6 }

    StringGetDefault、StringIncrease和StringDecrease都是一些普通的函數,內容很簡單,不用寫出來。現在讓我們來看看Array應該怎么做:
1 generic<type T>
2 concept series DelphiTypeReferable<Array<T>>
3 {
4   operation Array<T> GetDefault() = ArrayGetDefault<T>;
5   operation Increase = ArrayIncrease<T>;
6   operation Decrease = ArrayDecrease<T>;
7 }

    看起來好像沒什么特別,不過只要想一想ArrayDecrease的實現就知道了,現在我們需要在ArrayDecrease里面訪問到未知類型T的DelphiTypeReferable<T>這個concept instance。因為當自己要被干掉的時候,得將引用到的所有對象的引用計數都減少1:
 1 generic<type T>
 2 function void ArrayDecrease(Array<T>* array)
 3 {
 4   if(array->reference<=0)exit;
 5   if(--array->reference==0)
 6   {
 7     for int i = 0
 8       when i < array->length
 9       with i--
10       do DelphiTypeReferable<T>.Decrease(&array->items[i]);
11     free(array->items);
12     array->length=-1;
13     array->items=null;
14   }
15 }

    這樣一大堆concept series的特化組合在一起就成為會根據類型的變化而采取不同行為的concept instance了。于是我們還剩下最后的一個問題,那么其他類型的DelphiTypeReferable應該怎么寫呢?其實只需要玩一個小技巧就行了,不過在這里將會看到NativeX支持泛型的最后一個功能:
 1 generic<type T>
 2 concept series DelphiTypeReferable<T>
 3 {
 4   operation GetDefault = GenericGetDefault<T>;
 5   operation Increase = null;
 6   operation Decrease = null;
 7 }
 8 
 9 generic<type T>
10 T GenericGetDefault()
11 {
12 }

    返回null的operation可以賦值成null以表示不需要執行任何東西。如果你將一個有副作用的表達式傳進去當參數的話,副作用會保證被執行。

    關于語義上的泛型就講到這里了。
posted on 2010-06-12 23:58 陳梓瀚(vczh) 閱讀(2560) 評論(2)  編輯 收藏 引用 所屬分類: VL++3.0開發紀事

評論:
# re: Vczh Library++ 3.0之NativeX語言泛型草稿 2010-06-13 00:46 | radar
仰望!!!  回復  更多評論
  
# re: Vczh Library++ 3.0之NativeX語言泛型草稿 2010-06-15 03:40 | mm
仰望!!!  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欲色影视综合吧| 国产麻豆精品theporn| 午夜久久美女| 亚洲精品视频免费在线观看| 久久久中精品2020中文| 亚洲免费在线观看| 亚洲精品影院在线观看| 在线成人h网| 国产一区二区精品久久| 国产精品九九| 欧美日韩国产首页在线观看| 免费91麻豆精品国产自产在线观看| 先锋亚洲精品| 亚洲一区观看| 一区二区三区欧美| 亚洲美女av网站| 亚洲欧洲在线视频| 欧美高清在线| 欧美成人免费全部| 久久亚洲一区二区| 久久精品国产精品 | 亚洲欧美日韩另类精品一区二区三区| 亚洲剧情一区二区| 亚洲精品国精品久久99热一| 亚洲高清成人| 亚洲精品1区2区| 亚洲国内精品在线| 亚洲高清网站| 亚洲福利在线看| 亚洲国产精品一区二区第四页av| 一区二区亚洲精品国产| 精品成人在线| 亚洲高清视频在线| 亚洲人成网站精品片在线观看 | 美日韩精品视频免费看| 久久午夜激情| 欧美成人69av| 欧美激情亚洲| 欧美日韩国产亚洲一区| 欧美日韩一区二区高清| 欧美午夜三级| 国产精品色婷婷久久58| 国产日本亚洲高清| 国一区二区在线观看| 在线观看视频日韩| 亚洲精品中文字幕在线| 亚洲天堂激情| 午夜伦欧美伦电影理论片| 欧美一区二区三区四区在线观看| 久久精品综合| 欧美大片一区二区| 亚洲免费电影在线观看| 亚洲小说春色综合另类电影| 欧美一区二区三区在线播放| 久久视频在线免费观看| 欧美黄色视屏| 国产精品女主播一区二区三区| 国产午夜精品全部视频播放| 在线观看亚洲视频| 亚洲日韩中文字幕在线播放| 亚洲天堂av图片| 久久久久久穴| 亚洲欧洲综合| 午夜精品久久久久影视 | 久久综合伊人77777麻豆| 亚洲国产精品va在线看黑人| 这里只有精品在线播放| 欧美在线一区二区| 欧美国产日本高清在线| 国产噜噜噜噜噜久久久久久久久| 在线精品观看| 亚洲视频在线一区| 久久夜色精品国产| 亚洲精品欧美精品| 久久www免费人成看片高清| 欧美高清视频一二三区| 国产精品视频免费一区| 最新国产成人av网站网址麻豆| 亚洲中午字幕| 欧美高清在线一区二区| 亚洲一区二区三区四区视频 | 99国产精品久久久久久久久久| 亚洲欧美日韩综合aⅴ视频| 久久在精品线影院精品国产| 99re8这里有精品热视频免费 | 亚洲国产精品国自产拍av秋霞| 亚洲网站在线观看| 蜜臀av国产精品久久久久| 在线亚洲精品福利网址导航| 久热精品在线视频| 国产免费观看久久| 99精品国产热久久91蜜凸| 久久男人av资源网站| 一本色道婷婷久久欧美| 美女诱惑一区| 国产在线精品一区二区夜色| 亚洲专区在线| 亚洲欧洲日本一区二区三区| 久久国产精品久久国产精品| 国产精品黄视频| 亚洲精品中文字| 麻豆久久婷婷| 欧美亚洲在线观看| 国产精品久久久久9999高清| 日韩视频永久免费观看| 欧美不卡在线视频| 性欧美长视频| 国产精品欧美日韩久久| 一区二区冒白浆视频| 欧美成在线视频| 久久久久久电影| 国产亚洲欧美一级| 午夜一区二区三区不卡视频| 日韩视频免费观看| 欧美国产成人精品| 亚洲国产综合91精品麻豆| 快射av在线播放一区| 欧美一区免费视频| 国产精品夜色7777狼人| 亚洲欧美日韩第一区 | 美女成人午夜| 亚洲第一精品在线| 免费成人毛片| 久久五月激情| 亚洲高清视频中文字幕| 欧美aa在线视频| 久久一区二区三区国产精品| 一区在线播放视频| 美女性感视频久久久| 久久久久亚洲综合| 亚洲国产天堂久久综合| 欧美高清视频在线| 欧美成人小视频| 99国产精品久久久久久久久久 | 欧美视频一区二区三区| 在线视频一区二区| 一区二区三区免费观看| 国产精品久久久久国产a级| 亚洲欧美国产三级| 亚洲欧美美女| 狠狠入ady亚洲精品| 欧美成人在线网站| 欧美成人一区二区| 99在线热播精品免费| 一本一本a久久| 国产日本欧美一区二区三区在线| 久久久综合激的五月天| 久久亚洲一区二区| 亚洲美女在线国产| 在线午夜精品| 国产一区二区精品| 欧美激情亚洲国产| 欧美日韩免费观看一区| 亚洲欧美日韩区| 久久久福利视频| 亚洲精品视频免费观看| 99热精品在线观看| 国产美女精品视频免费观看| 免费看的黄色欧美网站| 欧美理论视频| 欧美在线视频一区二区| 久久一区二区三区av| 亚洲深夜av| 欧美在线观看网站| 亚洲靠逼com| 亚洲欧美www| 91久久久久| 中文精品视频| 影音先锋另类| 一本一本久久| 在线观看欧美激情| 一区二区三区av| 在线免费观看日韩欧美| 在线视频亚洲一区| 永久免费毛片在线播放不卡| 夜夜嗨av一区二区三区| 狠狠色伊人亚洲综合成人| 亚洲免费观看高清在线观看 | 亚洲女人天堂成人av在线| 亚洲电影毛片| 亚洲午夜电影网| 亚洲国产欧洲综合997久久| 亚洲天堂免费在线观看视频| 亚洲国产精品久久久久婷婷884| 一区二区三区你懂的| 亚洲高清自拍| 午夜一区不卡| 亚洲天堂成人在线观看| 蜜桃av一区二区| 久久国产视频网| 欧美日韩中文字幕| 欧美成人精品h版在线观看| 国产精品自拍一区| 亚洲人体1000| 亚洲国产精品福利| 欧美在线视频二区| 亚洲欧美日韩精品| 欧美日韩三级视频| 亚洲电影免费观看高清完整版在线| 国产亚洲毛片|