Mercurial > hg > Papers > 2011 > nobu-prosym
comparison presen/index.html @ 75:454ddda8d306
modify explanation of CbC
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 03 Jan 2012 21:13:11 +0900 |
parents | 275073032132 |
children | a4d16779fd1e |
comparison
equal
deleted
inserted
replaced
74:275073032132 | 75:454ddda8d306 |
---|---|
118 <li>CbC の紹介</li> | 118 <li>CbC の紹介</li> |
119 <li>GCC でのコンパイルの流れ</li> | 119 <li>GCC でのコンパイルの流れ</li> |
120 <font color="red"> | 120 <font color="red"> |
121 <li>CbC の実装</li> | 121 <li>CbC の実装</li> |
122 </font> | 122 </font> |
123 <!-- | |
124 <ul> | |
125 <li>Tail Call Elimination</li> | |
126 <li>goto シンタックスの追加</li> | |
127 <li>環境付き継続</li> | |
128 </ul> | |
129 --> | |
130 <li>Micro-C との性能比較</li> | 123 <li>Micro-C との性能比較</li> |
131 <!-- | |
132 <li>mercurial を用いたアップデートの方法</li> | |
133 --> | |
134 <li>まとめ</li> | 124 <li>まとめ</li> |
135 <ol> | 125 <ol> |
136 </div> | 126 </div> |
137 <!-- PAGE --> | 127 <!-- PAGE --> |
138 <div class="slide"> | 128 <div class="slide"> |
151 </ul> | 141 </ul> |
152 </div> | 142 </div> |
153 <!-- PAGE --> | 143 <!-- PAGE --> |
154 <div class="slide"> | 144 <div class="slide"> |
155 <h1>Continuation based C </h1> | 145 <h1>Continuation based C </h1> |
156 <ul> | 146 <h2>継続:現在の処理を実行していく為の情報</h2> |
157 <li>継続(C言語):現在の処理を実行していく為の情報</li> | 147 |
158 <ul> | 148 <table width=100% border=1> |
159 <li>続く命令のアドレス</li> | 149 <tr> |
160 <li>命令に必要なデータ</li> | 150 <td><small>Cの継続</small></td> |
161 <li>スタックに積まれている値(環境)</li> | 151 <td><small>CbCの継続(軽量継続)</small></td> |
162 </ul> | 152 </tr> |
163 </ul> | 153 <tr style="font-size:30px"> |
164 <li class="incremental">CbC: 関数コールが無い -> 呼び出し元への復帰がない</li> | 154 <td> |
165 <ul class="incremental"> | 155 <ul> |
166 <li>CbCの継続:軽量継続(light-weight continuation)</li> | 156 <li>続く命令のアドレス</li> |
167 <ul> | 157 <li>命令に必要なデータ</li> |
168 <li>Cの継続から環境を除外</li> | 158 <li>スタックに積まれている値(環境)</li> |
169 <li>続く命令とその命令に必要なデータのみ</li> | 159 </ul> |
170 </ul> | 160 </td> |
171 </ul> | 161 <td> |
172 </div> | 162 <ul> |
173 <!-- PAGE --> | 163 <li>Cの継続から環境を除外</li> |
174 <div class="slide"> | 164 <li>続く命令とその命令に必要なデータのみ</li> |
175 <h1>Continuation Based C (軽量継続)</h1> | 165 </ul> |
176 <p style=" margin-right:auto; margin-left:auto;"> | 166 </td> |
177 <table width=90% class="center" border=1> | 167 </tr> |
178 <tr> | 168 <tr> |
179 <td><small>Cの関数呼び出し</small></td> | 169 <td style="margin-left:auto; margin-right: auto; text-align: center;"> |
180 <td><small>CbCの継続</></small></td> | |
181 </tr> | |
182 <tr> | |
183 <td> | |
184 <img class="scale" src="./pix/func_call.png" style="height: 6em;"> | 170 <img class="scale" src="./pix/func_call.png" style="height: 6em;"> |
185 </td> | 171 </td> |
186 <td> | 172 <td style="margin-left:auto; margin-right: auto; text-align: center;"> |
187 <img class="scale" src="./pix/cs_stack.png" style="height: 6em;"> | 173 <img class="scale" src="./pix/cs_stack.png" style="height: 6em;"> |
188 </td> | 174 </td> |
189 </tr> | 175 </tr> |
190 </table> | 176 </table> |
191 </p> | |
192 <li>コードセグメントへの継続はcallではなくjmp命令で行われる</li> | 177 <li>コードセグメントへの継続はcallではなくjmp命令で行われる</li> |
193 <li>スタックに載るデータは1つのコードセグメントの必要なデータのみ。</li> | |
194 </div> | 178 </div> |
195 <!-- PAGE --> | 179 <!-- PAGE --> |
196 <div class="slide"> | 180 <div class="slide"> |
197 <h1>Continuation based C </h1> | 181 <h1>Continuation based C </h1> |
198 <table width=100% border=1> | 182 <table width=100% border=1> |
239 <li class="incremental"><small>以上がCbCについての紹介となる。</small></li> | 223 <li class="incremental"><small>以上がCbCについての紹介となる。</small></li> |
240 </div> | 224 </div> |
241 <!-- PAGE --> | 225 <!-- PAGE --> |
242 <div class="slide"> | 226 <div class="slide"> |
243 <h1>GCC</h1> | 227 <h1>GCC</h1> |
244 <li>本来はGnu Compiler Collectionのことを指すが、 | |
245 <br>ここで扱うのはGnu C Compiler(cc1)になる。</li> | |
246 <ul> | 228 <ul> |
247 <li class="incremental">GCCではアセンブラ言語を出力するまでに読み込まれたソースコードは次の4つの中間言語へと変換される。</li> | 229 <li>本来はGnu Compiler Collectionのことを指すが、ここで扱うのはGnu C Compiler(cc1)になる。</li> |
230 <li>GCCではアセンブラ言語を出力するまでに読み込まれたソースコードは次の4つの中間言語へと変換される。</li> | |
231 <ul> | |
232 <li>Generic Tree</li> | |
233 <li>GIMPLE</li> | |
234 <li>Tree SSA</li> | |
235 <li>RTL</li> | |
248 </ul> | 236 </ul> |
249 </div> | |
250 <!-- PAGE --> | |
251 <div class="slide"> | |
252 <h1>GCC</h1> | |
253 <ol> | |
254 <li>Generic Tree:ソースコードを構文木の形に直したもの</li> | |
255 <li>GIMPLE: Generic Treeの命令を簡単にした構文木</li> | |
256 <li>Tree SSA: GIMPLEの中で変数代入を一度しか行わせない形にした構文木</li> | |
257 <li>RTL: レジスタの割り当てといった低レベルの表現でアセンブラとほぼ同じ命令の表現ができる。</li> | |
258 </ol> | |
259 <li class="incremental">それぞれは次のようなデータを構文木にして持っている。</li> | |
260 </div> | |
261 <!-- PAGE --> | |
262 <div class="slide"> | |
263 <h1>GCC</h1> | |
264 <table width=100% border=1> | |
265 <tr> | |
266 <td>Generic(ソースコード)</td> | |
267 <td>GIMPLE</td> | |
268 </tr> | |
269 <tr class="srctr"> | |
270 <td> | |
271 <pre class="srcbox"> | |
272 void factorial(int x) | |
273 { | |
274 int prod,i; | |
275 for(i=1,prod=1; i <= x; i++){ | |
276 prod = prod*i; | |
277 } | |
278 print_factorial(prod); | |
279 } | |
280 </pre> | |
281 </td> | |
282 <td width=50%> | |
283 <pre class="srcbox"> | |
284 factorial (int x) | |
285 { | |
286 int prod; | |
287 int i; | |
288 | |
289 i = 1; | |
290 prod = 1; | |
291 goto <D.2846>; | |
292 <D.2845>: | |
293 prod = prod * i; | |
294 i = i + 1; | |
295 <D.2846>: | |
296 if (i <= x) goto <D.2845>; else goto <D.2847>; | |
297 <D.2847>: | |
298 print_factorial (prod); | |
299 } | |
300 </pre> | |
301 </td> | |
302 </tr> | |
303 </table> | |
304 </div> | |
305 <!-- PAGE --> | |
306 <div class="slide"> | |
307 <h1>GCC</h1> | |
308 <table border=1 width=100% height=100%> | |
309 <tr> | |
310 <td width=50%>SSA</td> | |
311 <td width=50%>RTL(一部)</td> | |
312 </tr> | |
313 <tr class="srctr"> | |
314 <td class="srctd"> | |
315 <pre class="srcbox"> | |
316 factorial (int x) | |
317 { | |
318 int i; | |
319 int prod; | |
320 | |
321 <bb 2>: | |
322 i_3 = 1; | |
323 prod_4 = 1; | |
324 goto <bb 4>; | |
325 | |
326 <bb 3>: | |
327 prod_6 = prod_1 * i_2; | |
328 i_7 = i_2 + 1; | |
329 | |
330 <bb 4>: | |
331 # prod_1 = PHI <prod_4(2), prod_6(3)> | |
332 # i_2 = PHI <i_3(2), i_7(3)> | |
333 if (i_2 <= x_5(D)) | |
334 goto <bb 3>; | |
335 else | |
336 goto <bb 5>; | |
337 | |
338 <bb 5>: | |
339 print_factorial (prod_1); | |
340 return; | |
341 } | |
342 | |
343 </pre> | |
344 </td> | |
345 <td class="srctd"> | |
346 <pre class="srcbox" style="width:25em;"> | |
347 (jump_insn 20 19 21 5 (set (pc) | |
348 (if_then_else (le (reg:CCGC 17 flags) | |
349 (const_int 0 [0])) | |
350 (label_ref 17) | |
351 (pc))) factorial.c:12 -1 | |
352 (nil) | |
353 -> 17) | |
354 | |
355 (note 21 20 22 6 [bb 6] NOTE_INSN_BASIC_BLOCK) | |
356 | |
357 (insn 22 21 23 6 (set (reg:SI 62) | |
358 (mem/c/i:SI (plus:DI (reg/f:DI 54 virtual-stack-vars) | |
359 (const_int -4 [0xfffffffffffffffc])) [0 prod+0 S4 A32])) factorial.c:15 -1 | |
360 (nil)) | |
361 | |
362 (insn 23 22 24 6 (set (reg:SI 5 di) | |
363 (reg:SI 62)) factorial.c:15 -1 | |
364 (nil)) | |
365 | |
366 (call_insn 24 23 25 6 (call (mem:QI (symbol_ref:DI ("print_factorial") [flags 0x403] <function_decl 0x146f6b200 print_factorial>) [0 S1 A8]) | |
367 (const_int 0 [0])) factorial.c:15 -1 | |
368 (nil) | |
369 (expr_list:REG_DEP_TRUE (use (reg:SI 5 di)) | |
370 (nil))) | |
371 | |
372 (code_label 25 24 26 7 2 "" [0 uses]) | |
373 | |
374 (note 26 25 0 7 [bb 7] NOTE_INSN_BASIC_BLOCK) | |
375 </pre> | |
376 </td> | |
377 </tr> | |
378 </table> | |
379 </div> | |
380 <!-- PAGE --> | |
381 <div class="slide"> | |
382 <h1>GCC</h1> | |
383 <p class="center"> | |
384 <img src="./pix/ir.png" style="height: 6em;"> | |
385 </p> | |
386 <li class="incremental">CbCの実装においてはGeneric Tree生成部分とRTLへの変換部分に修正が加えられている。</li> | 237 <li class="incremental">CbCの実装においてはGeneric Tree生成部分とRTLへの変換部分に修正が加えられている。</li> |
387 <li class="incremental">Generic Tree生成部分について詳しく触れてみる。</li> | 238 <li class="incremental">Generic Tree生成部分について詳しく触れてみる。</li> |
239 </ul> | |
388 </div> | 240 </div> |
389 <!-- PAGE --> | 241 <!-- PAGE --> |
390 <div class="slide"> | 242 <div class="slide"> |
391 <h1>GCC:Generic Tree</h1> | 243 <h1>GCC:Generic Tree</h1> |
392 <li>Generic Treeではソースコードの内容が FUNCTION_TYPE, CALL_EXPR, MODIFY_EXPR 等と言った形で表される。</li> | 244 <li>Generic Treeではソースコードの内容が FUNCTION_TYPE, CALL_EXPR, MODIFY_EXPR 等と言った形で表される。</li> |