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

隨筆-341  評論-2670  文章-0  trackbacks-0
    經(jīng)過一個(gè)星期的奮斗,二進(jìn)制模板函數(shù)終于實(shí)現(xiàn)了,當(dāng)然這還是沒有g(shù)eneric concept的版本。現(xiàn)在NativeX已經(jīng)支持跟C#一樣的模板函數(shù)了:可以被編譯進(jìn)獨(dú)立的二進(jìn)制文件,然后另外一個(gè)代碼引用該二進(jìn)制文件,還能實(shí)例化新的模板函數(shù)。現(xiàn)在先來看debug log輸出的二進(jìn)制結(jié)構(gòu)。首先是被編譯的代碼。下面的代碼因?yàn)槭侵苯訌恼Z法樹生成的,所以括號什么的會比較多,而且因?yàn)镹ativeX支持s8、s16等的數(shù)值類型后綴,代碼生成的時(shí)候也使用了。一般來說沒有使用的話則默認(rèn)為跟VC++的ptrdiff_t一樣的類型:

 1 /*NativeX Code*/
 2 unit nativex_program_generated;
 3 function int32 main()
 4 {
 5     variable int32[5] numbers;
 6     (numbers[0s32] = 1s32);
 7     (numbers[1s32] = 3s32);
 8     (numbers[2s32] = 5s32);
 9     (numbers[3s32] = 7s32);
10     (numbers[4s32] = 9s32);
11     (result = Sum<int32>(cast<int32*>& numbers), 5s32, 0s32, Add));
12 }
13 
14 function int32 Add(int32 a, int32 b)
15     (result = (a + b));
16 
17 generic<T>
18 function T Apply2(function T(T, T) f, T a, T b)
19     (result = f(a, b));
20 
21 generic<T>
22 function T Sum(T* items, int32 count, T init, function T(T, T) f)
23 {
24     (result = init);
25     while((count > 0s32))
26     {
27         (result = Apply2<T>(f, result, ( * items)));
28         (count -- );
29         (items ++ );
30     }
31 }

    這里的main函數(shù)聲明了一個(gè)數(shù)組,然后調(diào)用Sum<int32>計(jì)算結(jié)果,計(jì)算的時(shí)候要傳入一個(gè)加法函數(shù)Add。Sum里面調(diào)用了Apply2去執(zhí)行加法函數(shù)(純粹是為了在模板函數(shù)里面調(diào)用另一個(gè)模板函數(shù),沒有什么特別意義)。于是用一個(gè)循環(huán)就可以把數(shù)組的和算出來了。當(dāng)然結(jié)果是25。讓我們來看看編譯后的代碼:

  1 /*Assembly*/
  2 .data
  3 .label
  4      0: instruction 3
  5      1: instruction 47
  6      2: instruction 57
  7      3: instruction 69
  8 .code
  9 // unit nativex_program_generated;
 10      0: stack_reserve 0
 11      1: stack_reserve 0
 12      2: ret 0
 13 // function int32 main()
 14      3: stack_reserve 20
 15 // (numbers[0s32] = 1s32);
 16      4: push s32 1
 17      5: stack_offset -20
 18      6: push s32 0
 19      7: push s32 4
 20      8: mul s32
 21      9: add s32
 22     10: write s32
 23 // (numbers[1s32] = 3s32);
 24     11: push s32 3
 25     12: stack_offset -20
 26     13: push s32 1
 27     14: push s32 4
 28     15: mul s32
 29     16: add s32
 30     17: write s32
 31 // (numbers[2s32] = 5s32);
 32     18: push s32 5
 33     19: stack_offset -20
 34     20: push s32 2
 35     21: push s32 4
 36     22: mul s32
 37     23: add s32
 38     24: write s32
 39 // (numbers[3s32] = 7s32);
 40     25: push s32 7
 41     26: stack_offset -20
 42     27: push s32 3
 43     28: push s32 4
 44     29: mul s32
 45     30: add s32
 46     31: write s32
 47 // (numbers[4s32] = 9s32);
 48     32: push s32 9
 49     33: stack_offset -20
 50     34: push s32 4
 51     35: push s32 4
 52     36: mul s32
 53     37: add s32
 54     38: write s32
 55 // (result = Sum<int32>(cast<int32*>( & numbers), 5s32, 0s32, Add));
 56     39: pushlabel 2
 57     40: push s32 0
 58     41: push s32 5
 59     42: stack_offset -20
 60     43: resptr
 61     44: generic_callfunc 0
 62 // function int32 main()
 63     45: stack_reserve -20
 64     46: ret 0
 65 // function int32 Add(int32 a, int32 b)
 66     47: stack_reserve 0
 67 // (result = (a + b));
 68     48: stack_offset 20
 69     49: read s32
 70     50: stack_offset 16
 71     51: read s32
 72     52: add s32
 73     53: resptr
 74     54: write s32
 75 // function int32 Add(int32 a, int32 b)
 76     55: stack_reserve 0
 77     56: ret 8
 78 // function T Apply2(function T(T, T) f, T a, T b)
 79     57: stack_reserve 0
 80 // (result = f(a, b));
 81     58: stack_offset 0[Linear]
 82     59: readmem 1[Linear]
 83     60: stack_offset 20
 84     61: readmem 1[Linear]
 85     62: resptr
 86     63: stack_offset 16
 87     64: read u32
 88     65: label
 89     66: call_indirect
 90 // function T Apply2(function T(T, T) f, T a, T b)
 91     67: stack_reserve 0
 92     68: ret 2[Linear]
 93 // function T Sum(T* items, int32 count, T init, function T(T, T) f)
 94     69: stack_reserve 0
 95 // (result = init);
 96     70: stack_offset 24
 97     71: resptr
 98     72: copymem 1[Linear]
 99 // while((count > 0s32))
100     73: push s32 0
101     74: stack_offset 20
102     75: read s32
103     76: gt s32
104     77: jumpfalse 100 1
105 // (result = Apply2<T>(f, result, ( * items)));
106     78: stack_offset 16
107     79: read u32
108     80: readmem 1[Linear]
109     81: resptr
110     82: readmem 1[Linear]
111     83: stack_offset 3[Linear]
112     84: read u32
113     85: resptr
114     86: generic_callfunc 1
115 // (count -- );
116     87: push s32 1
117     88: stack_offset 20
118     89: read s32
119     90: sub s32
120     91: stack_offset 20
121     92: write s32
122 // (items ++ );
123     93: push s32 1[Linear]
124     94: stack_offset 16
125     95: read u32
126     96: add u32
127     97: stack_offset 16
128     98: write u32
129 // while((count > 0s32))
130     99: jump 73 1
131 // function T Sum(T* items, int32 count, T init, function T(T, T) f)
132    100: stack_reserve 0
133    101: ret 4[Linear]
134 .exports
135 Assembly Name: assembly_generated
136 Exports[0= (3, main)
137 Exports[1= (47, Add)
138 Entries[0= {
139   Name = Apply2
140   Arguments = 1
141   Instruction = 57
142   Lengtht = 12
143   UniqueName = [assembly_generated]::[Apply2]<{0}>
144 }
145 Entries[1= {
146   Name = Sum
147   Arguments = 1
148   Instruction = 69
149   Lengtht = 33
150   UniqueName = [assembly_generated]::[Sum]<{0}>
151 }
152 Targets[0= {
153   AssemblyName = assembly_generated
154   SymbolName = Sum
155   ArgumentSizes[0= 4
156   ArgumentNames[0= s32
157 }
158 Targets[1= {
159   AssemblyName = assembly_generated
160   SymbolName = Apply2
161   ArgumentSizes[0= 1*T0 + 0
162   ArgumentNames[0= {0}
163 }
164 Linears[0= 1*T0 + 20
165 Linears[1= 1*T0 + 0
166 Linears[2= 2*T0 + 4
167 Linears[3= 1*T0 + 24
168 Linears[4= 1*T0 + 12

    二進(jìn)制模板函數(shù)的思想是,類型在編譯到二進(jìn)制代碼后,只需要留下名字和尺寸兩種信息就夠了。因此模板函數(shù)除了編譯成指令,還要在一個(gè)“二進(jìn)制資源”里面留下一些信息,譬如說有多少個(gè)參數(shù)啦,有了參數(shù)之后將會如何組合成一個(gè)全局唯一符號(以區(qū)別尺寸相同而實(shí)際上類型不同的類型參數(shù),有其他意義),等等。而且指令里面引用了參數(shù)尺寸的地方還要有個(gè)標(biāo)記,在上面的log里就是后面帶了[Linear]的東西了。Linear會變成一張表,在log的最后部分看到,其實(shí)就是一個(gè)多項(xiàng)式。所有跟尺寸相關(guān)的東西,最終都可以用一個(gè)多項(xiàng)式的方法來表達(dá),因此我就采用了這種結(jié)構(gòu)了。

    譬如Apply2<T>函數(shù)在一開始push兩個(gè)參數(shù)的時(shí)候,因?yàn)門的尺寸還不知道,因此參數(shù)b在堆棧中的位置就只好用一個(gè)多像是來表達(dá)了,而參數(shù)a因?yàn)閍的前面只有一個(gè)固定大小的參數(shù),因此其位置是固定的。push了之后,因?yàn)門類型不知道,所以只能用readmem指令加上一個(gè)多項(xiàng)式 1 [Linear]來表達(dá)其長度了。1是Linear表的索引,Linear可以在log的最后一個(gè)部分看到。

    因?yàn)槟0搴瘮?shù)需要被編譯到二進(jìn)制文件里面,而且在被不同的二進(jìn)制文件引用到的時(shí)候,相同的實(shí)例不能被特化多次(因?yàn)楹瘮?shù)指針可以用來判斷是否相等),因此特化的工作就落在了虛擬機(jī)上面了。虛擬機(jī)會根據(jù)“二進(jìn)制資源”的信息去閱讀一個(gè)模板函數(shù)的二進(jìn)制代碼,然后復(fù)制并修改,最終保存在一個(gè)內(nèi)部的二進(jìn)制Assembly里面,這個(gè)Assembly專門用來存放實(shí)例化后的模板函數(shù)。

    接下去就可以去開始做模板全局存儲區(qū)了。
posted on 2010-07-12 03:12 陳梓瀚(vczh) 閱讀(3146) 評論(8)  編輯 收藏 引用 所屬分類: VL++3.0開發(fā)紀(jì)事

評論:
# re: Vczh Library++3.0實(shí)現(xiàn)二進(jìn)制模板函數(shù) 2010-07-12 04:47 | zoyi
聽vczh的話,造輪子去  回復(fù)  更多評論
  
# re: Vczh Library++3.0實(shí)現(xiàn)二進(jìn)制模板函數(shù) 2010-07-12 05:05 | 陳梓瀚(vczh)
@zoyi
你想造啥  回復(fù)  更多評論
  
# re: Vczh Library++3.0實(shí)現(xiàn)二進(jìn)制模板函數(shù) 2010-07-12 05:45 | 唐風(fēng)
造3D圖形引擎吧!  回復(fù)  更多評論
  
# re: Vczh Library++3.0實(shí)現(xiàn)二進(jìn)制模板函數(shù) 2010-07-12 06:07 | 陳梓瀚(vczh)
@唐風(fēng)
造過,沒持續(xù)興趣……  回復(fù)  更多評論
  
# re: Vczh Library++3.0實(shí)現(xiàn)二進(jìn)制模板函數(shù) 2010-07-12 07:17 | johndragon
挺好  回復(fù)  更多評論
  
# re: Vczh Library++3.0實(shí)現(xiàn)二進(jìn)制模板函數(shù) 2010-07-12 07:23 | 空明流轉(zhuǎn)
@唐風(fēng)
跟哥哥造Renderer吧。  回復(fù)  更多評論
  
# re: Vczh Library++3.0實(shí)現(xiàn)二進(jìn)制模板函數(shù) 2010-07-12 16:32 | 路青飛
@zoyi
好樣的!
Never give up!  回復(fù)  更多評論
  
# re: Vczh Library++3.0實(shí)現(xiàn)二進(jìn)制模板函數(shù) 2010-07-14 04:11 | 唐風(fēng)
@空明流轉(zhuǎn)
興趣是有,圖形知識幾乎為0.
好吧,我申請去給你們打打雜~!
看你們收不?  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美精品久久99久久在免费线| 亚洲精品小视频在线观看| 性欧美xxxx大乳国产app| 亚洲精品国久久99热| 亚洲欧美成人一区二区三区| 午夜视频一区| 精品96久久久久久中文字幕无| 一区二区三区在线视频观看| 亚洲欧美国产精品桃花| 91久久香蕉国产日韩欧美9色| 久久久福利视频| 中文在线资源观看网站视频免费不卡| 亚洲视频碰碰| 国产欧美一区二区三区另类精品| 欧美福利精品| 欧美国产成人在线| 亚洲国产高清aⅴ视频| 欧美日本三区| 91久久精品一区二区别| 国产人成一区二区三区影院| 亚洲欧美在线aaa| 国产麻豆视频精品| 亚洲一区精品电影| 亚洲高清久久网| 亚洲色在线视频| 国产精品久久久久免费a∨大胸| 久久综合国产精品台湾中文娱乐网| 欧美日韩中文字幕在线| 欧美成人午夜激情视频| 国产精品xvideos88| 女女同性精品视频| 欧美大片在线看免费观看| 亚洲女人小视频在线观看| 欧美一级片一区| 欧美1区3d| 男人的天堂成人在线| 国产日韩欧美中文| 久久九九国产精品怡红院| 亚洲你懂的在线视频| 国产精品久久久久99| 一区二区91| 另类av导航| 欧美影院成人| 亚洲免费激情| 国产美女诱惑一区二区| 久久影视精品| 亚洲视频免费观看| 久久精品一二三| 国产精品日韩一区二区| 欧美日韩国产专区| 欧美韩日一区二区三区| 亚洲精品日韩精品| 亚洲一区二区久久| 亚洲肉体裸体xxxx137| 亚洲高清激情| 美国十次成人| 欧美影院精品一区| 亚洲一区二区在| 一本色道**综合亚洲精品蜜桃冫| 国产精品激情| 欧美日韩一区二区精品| 欧美日韩国产页| 美女网站在线免费欧美精品| 欧美人体xx| 久久亚洲高清| 美女视频黄免费的久久| 久久精品在线播放| 久久久蜜桃一区二区人| 亚洲一二三四久久| 亚洲视频专区在线| 艳妇臀荡乳欲伦亚洲一区| 欧美激情中文不卡| 亚洲素人在线| 亚洲欧美综合| 欧美激情一区二区三区高清视频 | 欧美日韩国产专区| 久久久久久网站| 久久精品国产欧美亚洲人人爽| 欧美在线影院| 欧美精品亚洲一区二区在线播放| 欧美中在线观看| 另类激情亚洲| 国产精品美女xx| 99成人免费视频| 亚洲美女一区| 国产乱码精品一区二区三| 一区二区三区日韩| 99精品国产99久久久久久福利| 亚洲一区二区综合| 欧美人与性动交cc0o| 91久久午夜| 欧美有码视频| 久久―日本道色综合久久| 欧美日韩精品一区二区在线播放 | 午夜视频在线观看一区| 欧美v国产在线一区二区三区| 一本色道久久综合亚洲精品不 | 久久亚洲午夜电影| 国产精品sm| 精品999在线观看| 欧美成人午夜免费视在线看片| 欧美大片在线观看| 亚洲国产精品久久| 欧美成人免费网| 久久国产欧美| 在线观看国产一区二区| 亚洲欧美中文日韩在线| 亚洲一二三级电影| 欧美日韩三级一区二区| 亚洲精品视频一区| 亚洲欧美日韩在线观看a三区| 国产精品免费网站在线观看| 亚洲精美视频| 亚洲午夜精品网| 亚洲欧美综合国产精品一区| 久久久久久久成人| 欧美一区激情视频在线观看| 欧美日韩在线视频一区二区| 欧美黄色影院| 午夜精品影院| 午夜一区二区三区在线观看| 午夜视频一区| 国产精品久久久久久久久久尿| 老牛嫩草一区二区三区日本| 国产精品videossex久久发布| 另类激情亚洲| 国产区二精品视| 久久精品成人一区二区三区| 亚洲小视频在线观看| 国产精品青草综合久久久久99| 小处雏高清一区二区三区 | 亚洲三级免费| 欧美性理论片在线观看片免费| 理论片一区二区在线| 在线成人www免费观看视频| 亚洲二区视频在线| 黄色成人在线| 久久亚洲精品欧美| 亚洲欧洲精品成人久久奇米网| 国产精品久久久久久久9999| 免费成人av在线看| 亚洲人成啪啪网站| 欧美另类综合| 亚洲免费在线视频| 午夜欧美不卡精品aaaaa| 久久综合综合久久综合| 亚洲激情视频在线播放| 亚洲国产精品一区二区www在线| 久久精品国产99国产精品| 日韩亚洲欧美精品| 亚洲视频一区二区| 美女尤物久久精品| 久久久久久欧美| 午夜精品一区二区三区电影天堂| 欧美久久婷婷综合色| 一本大道久久a久久综合婷婷| 久久久久久综合| 免费中文日韩| 久久国产精品99国产| 亚洲人成人99网站| 99视频在线观看一区三区| 国产一区二区三区在线观看网站 | 狠狠色丁香久久婷婷综合_中| av成人动漫| 亚洲第一区在线| 国产一区二区激情| 伊人婷婷欧美激情| 亚洲精品欧美| 亚洲国产精品第一区二区| 亚洲激情电影在线| 亚洲精品免费看| 一区二区久久久久| 久久久免费av| 99精品免费网| 亚洲综合国产激情另类一区| 麻豆亚洲精品| 久久日韩精品| 另类国产ts人妖高潮视频| 久久综合电影| 亚洲国产va精品久久久不卡综合| 午夜欧美大尺度福利影院在线看| 久久久噜噜噜久久人人看| 久久久久久一区| 亚洲精品偷拍| 亚洲性av在线| 亚洲欧美日本国产专区一区| 亚洲一区二区三区777| 久久精品国产99| 欧美午夜在线视频| 亚洲国产欧美一区二区三区同亚洲| 国产精品久久999| 最新69国产成人精品视频免费| 亚洲国产婷婷| 亚欧美中日韩视频| 男女视频一区二区| 亚洲二区在线观看| 老司机aⅴ在线精品导航| 欧美1级日本1级| 亚洲一二三四区| 欧美日本在线观看|