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

隨筆-341  評論-2670  文章-0  trackbacks-0
    第三篇草稿講了泛型concept的概念,這篇最終稿可以確定Vczh Library++ 3.0的NativeX所要支持的泛型concept的比較精確的特性了。

    泛型的concept的概念還是比較清晰的,這次我們便通過一個例子來講解他。假如在NativeX里面實現一個列表,顯然因為NativeX只有指針,所以寫起來大概就是:
1 generic<T>
2 structure List
3 {
4   T* items;
5   int count;
6 }

    于是我們想寫一個函數判斷兩個List是否相等。因為NativeX現在已經有模板函數了,所以我們很簡單的一個想法是,傳入兩個List<T>*,然后再傳入一個函數指針function bool(T,T),就可以寫出下面的函數了:
 1 generic<T>
 2 function bool ListEquals(List<T>* xs, List<T>* ys, function bool(T,T) comparer)
 3 {
 4   result=true;
 5   if(xs->count!=yx->count)
 6   {
 7     result=false;
 8   }
 9   else
10   {
11     variable int current=xs->count-1;
12     while(current>=0)
13     {
14       if(!comparer(xs->items[current], yx->items[current]))
15       {
16         result=false;
17         exit;
18       }
19       current--;
20     }
21   }
22 }

    這個做法咋一看好像沒什么問題,但是如果我們要比較List<List<int>>怎么辦呢?我們可以先寫一個function bool IntEquals(int a, int b);,然后再寫一個function bool IntListEquals(List<T> a, List<T> b);,這個函數里面用IntEquals加上ListEquals<int>來實現,最后將他傳進ListEquals<List<int>>。到了這里還好,如果我們還想比較List<List<double>>、List<List<char>>等等,我們就要被迫搞出很多函數了。而且最大的問題是,當我們寫好這么多東西以后,我們想實現一個Find函數來查找List里面的對象的話,面對List<List<int>>、List<List<double>>等等的東西,我們又得重新寫一次了……

    這個問題在面向對象的語言里面都很容易做到,只需要在一個類里面實現operator==就可以了。那這兩種方法有什么區別呢?假設我們把C++里面的類去掉,那么我們會發現,ListEquals<T>的comparer參數是通過T自動找到的,而不是我們自己傳進去的。因此如何設計一套可以從類型找到某一組函數的機制,就因為我們把模板函數加入NativeX語言(基本上就是C語言)而變成了一個必須實現的功能了。在這里我準備引入concept這個概念。concept跟C++0x的concept以及haskell的type class的概念基本一致。現在就讓我們逐步在NativeX里面實現這套機制。

    我們在這里面對的問題是給一些給定的類型(或泛型類型,譬如說List<T>)實現Equals函數,然后每一個Equals函數里面如果需要其他類型U的Equals函數,可以直接找到,而不需要我們自己傳進去。因此這個問題可以抽象為,某些類型具有可以被兩兩比較是否相等的能力。因此定義如下:
1 generic<T>
2 concept Eq
3 {
4   bool Equals(T a, T b);
5 }

    當然這些函數不能直接生出來,因此我們對于想比較的每一個類型都需要給出相應的Equals函數。下面的代碼為int類型定義了Equals:
 1 instance int : Eq
 2 {
 3   Equals = IntEquals;
 4 }
 5 
 6 generic<T>
 7 function bool IntEquals(int a, int b)
 8 {
 9   result=a==b;
10 }

    每比較一次數字就得調用一次函數,這個開銷還是比較大的。在NativeX的所有設施都做好之后,我會開始做指令級別的優化,然后看看要不要實現自動判斷并inline的功能。有了int : Eq之后,我們就可以為List<T>也寫一個Eq了。如果我們給出了List<T>的Equals的話,為了使用這個Equals,T也必須有相應的Equals函數,于是我們可以寫:
1 generic<T>
2 instance List : Eq
3   where T : Eq
4 {
5   Equals = ListEquals<T>;
6 }

    最后就是實現ListEquals了,注意ListEquals函數內部是如何拿到類型T的Equals函數的:
 1 generic<T>
 2   where T : Eq
 3 function bool ListEquals(List<T> xs, List<T> ys)
 4 {
 5   result=true;
 6   if(xs->count!=ys->count)
 7   {
 8     result=false;
 9   }
10   else
11   {
12      variable int current=xs->count-1;
13      while(current>=0)
14      {
15        if(!Eq<T>::Equals(xs->items[current], yx->items[current]))
16        {
17          result=false;
18          exit;
19        }
20        current--;
21      }
22   }
23 }

    這里引入了一個新的語法:Eq<T>::Equals,用于自動搜索自己dll或者其他dll實現的這個函數。搜索會在虛擬機里面完成,編譯器只負責提供符號,并檢查類型。因此就大功告成了。

    這個instance的設計基本上來源于Haskell的type class,其實跟C++0x的那個concept關系還是比較小,畢竟NativeX沒有類,C++有類,Haskell沒有類。當然其缺點是你不能在定義了Eq<List<T>>::Equals的同時,專門為Eq<List<bool>>::Equals定義一個特殊的版本,就如同C++的偏特化一樣,這個就過于復雜了。雖然偏特化在C++的用處非常大,而且也十分常用,但是在NativeX里面就因為NativeX的模板可以編譯成二進制而會因為找不到高性能的實現方法被砍掉。
posted on 2010-07-13 04:26 陳梓瀚(vczh) 閱讀(3029) 評論(8)  編輯 收藏 引用 所屬分類: VL++3.0開發紀事

評論:
# re: Vczh Library++ 3.0之NativeX語言泛型最終稿 2010-07-13 19:17 | newcpper
不走標準化的道路,學習起來有困難啊,呵呵  回復  更多評論
  
# re: Vczh Library++ 3.0之NativeX語言泛型最終稿 2010-07-13 19:23 | newcpper
你設計的庫 是完全是自己用就OK了?還是想讓大家都可用?  回復  更多評論
  
# re: Vczh Library++ 3.0之NativeX語言泛型最終稿 2010-07-13 19:29 | 陳梓瀚(vczh)
@newcpper
新腳本語言,何來標準之說。不過話說回來NativeX與高級語言的關系,就如同C與匯編的關系一樣。我將會把更高級的語言(譬如javascript)編譯成NativeX,從而剩下大量的時間(因為從NativeX開始整套編譯、調試和執行的流程都是一樣的),以遍測試并在上面實現更多的腳本語言。因此NativeX,如果你不是為你的腳本語言寫非常底層的庫的話,一般是用不到的。  回復  更多評論
  
# re: Vczh Library++ 3.0之NativeX語言泛型最終稿 2010-07-13 19:30 | 陳梓瀚(vczh)
@newcpper
而且generic concept其實就是haskell的class,上面我有鏈接,那個還是很淺顯易懂的。  回復  更多評論
  
# re: Vczh Library++ 3.0之NativeX語言泛型最終稿 2010-07-14 19:11 | newcpper
哦,不好意思,我指的是Vczh Library++ 3.0,能寫篇文章說說這種類庫的設計思路嗎?大概看了一下文檔,感覺類的結構還是不太清楚,另外,貌似程序的注釋不多哈。  回復  更多評論
  
# re: Vczh Library++ 3.0之NativeX語言泛型最終稿 2010-07-15 01:49 | 陳梓瀚(vczh)
@newcpper
我很討厭在程序里面寫注釋的,除非實在太復雜(參見正則表達式)。設計思路的話我倒是寫在了我的博客里面:【http://m.shnenglu.com/vczh/archive/2009/10/09/98207.html】,文檔只是介紹如何使用,并不是介紹我是怎么想出來的。

不過暫時還沒有編譯器那部分的介紹,因為我不打算在設計還處于容易變動的階段寫這些文檔,會寫了也白寫的。  回復  更多評論
  
# re: Vczh Library++ 3.0之NativeX語言泛型最終稿 2010-07-16 00:04 | newcpper
呵呵,注釋是給讀代碼的人寫的(可能是幾年后的自己),你不寫注釋,美帝的BOSS還不抓狂?  回復  更多評論
  
# re: Vczh Library++ 3.0之NativeX語言泛型最終稿 2010-07-16 03:30 | 陳梓瀚(vczh)
@newcpper
M$怎么會招那些連代碼都讀不懂的人呢  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美大片免费看| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品视频自拍| 欧美视频在线观看免费| 国产精品任我爽爆在线播放 | 噜噜噜在线观看免费视频日韩| 性刺激综合网| 久久久午夜视频| 欧美激情2020午夜免费观看| 欧美三区免费完整视频在线观看| 国产精品系列在线| 在线 亚洲欧美在线综合一区| 亚洲精品国产精品国产自| 国产精品99久久久久久久女警| 亚洲自拍偷拍视频| 久久亚洲免费| 一区二区欧美在线观看| 久久精品人人| 欧美性猛交一区二区三区精品| 国产精品一区二区三区免费观看| 精品88久久久久88久久久| av成人手机在线| 久久精品国产视频| 日韩视频专区| 美日韩精品免费| 国产精品久久毛片a| 亚洲第一黄色| 久久精品亚洲热| 亚洲精品久久| 久久爱www.| 国产精品乱码人人做人人爱| 亚洲国产高清一区二区三区| 欧美一区二区精品| 亚洲精品乱码久久久久久蜜桃91 | 亚洲一区二区三区高清| 久久精品女人| 国产欧美日韩91| 中文在线资源观看视频网站免费不卡| 久久九九免费| 亚洲欧美另类在线观看| 欧美三级在线| 99国产精品99久久久久久粉嫩| 久久婷婷一区| 欧美在线观看一区| 国产精品看片你懂得| 99国产精品私拍| 亚洲国产精品va在线看黑人| 久久久久五月天| 国语自产精品视频在线看抢先版结局 | 日韩亚洲精品电影| 欧美成人r级一区二区三区| 一区二区av| 欧美一区二区在线视频| 欧美在线电影| 国产欧美精品一区二区三区介绍| 亚洲午夜精品一区二区三区他趣| 亚洲大胆女人| 免费在线看成人av| 亚洲二区在线观看| 免费亚洲视频| 媚黑女一区二区| 亚洲人成人一区二区三区| 欧美成人亚洲| 麻豆乱码国产一区二区三区| 在线免费观看日本欧美| 免费在线观看成人av| 久久久五月婷婷| 亚洲青色在线| 亚洲乱码国产乱码精品精 | 欧美日韩1234| 亚洲无亚洲人成网站77777| 99视频有精品| 国产欧美日韩亚洲一区二区三区| 欧美亚洲在线视频| 欧美在线免费| 亚洲黄网站黄| 日韩午夜在线视频| 国产日韩欧美不卡| 欧美成人亚洲| 国产精品大片| 久久综合婷婷| 欧美日韩高清区| 欧美一区二区在线观看| 久久久久99精品国产片| 亚洲精品网站在线播放gif| 宅男噜噜噜66国产日韩在线观看| 国产欧美一区二区精品仙草咪| 久久久免费精品| 欧美精品在线观看播放| 欧美在线视频一区| 欧美电影专区| 久久精品人人做人人爽| 蜜桃av噜噜一区| 亚洲免费视频网站| 麻豆成人精品| 欧美一级黄色网| 欧美激情一区二区三区在线| 欧美在线999| 欧美日韩免费看| 免费成年人欧美视频| 欧美三区免费完整视频在线观看| 久久久亚洲国产美女国产盗摄| 欧美激情亚洲| 蜜桃精品久久久久久久免费影院| 国产精品夫妻自拍| 亚洲国产精品一区| 国产一区二区三区久久 | 最近中文字幕mv在线一区二区三区四区 | 久久这里只有| 国产精品成人观看视频国产奇米| 老司机成人网| 国产精品视频一二三| 日韩一级网站| 久久噜噜噜精品国产亚洲综合| 亚洲午夜激情网站| 欧美电影免费网站| 欧美成人在线网站| 国产主播一区二区| 亚洲一区国产| 亚洲一区二区动漫| 欧美.www| 欧美成ee人免费视频| 国产一区二区中文字幕免费看| 夜色激情一区二区| 一区二区三区精密机械公司| 可以看av的网站久久看| 久久精品在线| 国产情侣一区| 亚洲欧美日韩综合aⅴ视频| 亚洲午夜视频在线| 欧美日韩在线一二三| 亚洲电影免费观看高清完整版在线观看 | 91久久夜色精品国产九色| 亚洲第一页自拍| 久久精品在线| 裸体歌舞表演一区二区| 精品91视频| 老司机久久99久久精品播放免费 | 久久久噜噜噜久久人人看| 久久激情视频| 国产色综合久久| 欧美一区二区黄色| 久久女同精品一区二区| 精品91久久久久| 美女脱光内衣内裤视频久久影院 | 永久91嫩草亚洲精品人人| 久久精品亚洲热| 免费中文日韩| 日韩小视频在线观看专区| 欧美日韩在线播放一区| 一区二区三区国产精华| 西瓜成人精品人成网站| 国产一区二区高清视频| 久久久亚洲午夜电影| 亚洲电影av在线| 亚洲一区日韩在线| 国产一区二区三区高清播放| 理论片一区二区在线| 亚洲日本无吗高清不卡| 亚洲欧美综合精品久久成人| 国产一区二区你懂的| 模特精品在线| 亚洲女同同性videoxma| 欧美成人午夜剧场免费观看| 国产精品久久国产愉拍| 欧美一级大片在线免费观看| 欧美成人精品在线播放| 99人久久精品视频最新地址| 国产精品亚洲一区二区三区在线| 亚洲欧美成人一区二区三区| 久久久久久综合| 日韩视频免费在线观看| 国产精品久久久久久久浪潮网站| 欧美专区亚洲专区| 日韩亚洲欧美高清| 毛片av中文字幕一区二区| 亚洲四色影视在线观看| 影音先锋久久久| 国产精品美女xx| 麻豆91精品| 亚洲欧美综合精品久久成人| 欧美激情国产高清| 欧美影院视频| a4yy欧美一区二区三区| 狠狠色噜噜狠狠色综合久| 欧美午夜视频| 欧美国产精品劲爆| 久久久久久久999精品视频| 日韩午夜av电影| 欧美成人资源网| 久久久一本精品99久久精品66| 亚洲午夜精品久久久久久app| 伊人色综合久久天天| 国产精品一区二区久久国产| 欧美人在线视频| 欧美成人午夜视频| 久久夜色精品亚洲噜噜国产mv| 亚洲欧美久久久| 亚洲小说春色综合另类电影| 99热这里只有精品8|