Mercurial > hg > Papers > 2011 > nobu-prosym
changeset 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 |
files | presen/index.html |
diffstat | 1 files changed, 35 insertions(+), 183 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/index.html Tue Jan 03 19:21:51 2012 +0900 +++ b/presen/index.html Tue Jan 03 21:13:11 2012 +0900 @@ -120,17 +120,7 @@ <font color="red"> <li>CbC の実装</li> </font> -<!-- - <ul> - <li>Tail Call Elimination</li> - <li>goto シンタックスの追加</li> - <li>環境付き継続</li> - </ul> ---> <li>Micro-C との性能比較</li> -<!-- - <li>mercurial を用いたアップデートの方法</li> ---> <li>まとめ</li> <ol> </div> @@ -153,44 +143,38 @@ <!-- PAGE --> <div class="slide"> <h1>Continuation based C </h1> - <ul> - <li>継続(C言語):現在の処理を実行していく為の情報</li> - <ul> - <li>続く命令のアドレス</li> - <li>命令に必要なデータ</li> - <li>スタックに積まれている値(環境)</li> - </ul> - </ul> - <li class="incremental">CbC: 関数コールが無い -> 呼び出し元への復帰がない</li> - <ul class="incremental"> - <li>CbCの継続:軽量継続(light-weight continuation)</li> - <ul> - <li>Cの継続から環境を除外</li> - <li>続く命令とその命令に必要なデータのみ</li> - </ul> - </ul> - </div> - <!-- PAGE --> - <div class="slide"> - <h1>Continuation Based C (軽量継続)</h1> - <p style=" margin-right:auto; margin-left:auto;"> - <table width=90% class="center" border=1> + <h2>継続:現在の処理を実行していく為の情報</h2> + + <table width=100% border=1> + <tr> + <td><small>Cの継続</small></td> + <td><small>CbCの継続(軽量継続)</small></td> + </tr> + <tr style="font-size:30px"> + <td> + <ul> + <li>続く命令のアドレス</li> + <li>命令に必要なデータ</li> + <li>スタックに積まれている値(環境)</li> + </ul> + </td> + <td> + <ul> + <li>Cの継続から環境を除外</li> + <li>続く命令とその命令に必要なデータのみ</li> + </ul> + </td> + </tr> <tr> - <td><small>Cの関数呼び出し</small></td> - <td><small>CbCの継続</></small></td> - </tr> - <tr> - <td> + <td style="margin-left:auto; margin-right: auto; text-align: center;"> <img class="scale" src="./pix/func_call.png" style="height: 6em;"> </td> - <td> - <img class="scale" src="./pix/cs_stack.png" style="height: 6em;"> - </td> + <td style="margin-left:auto; margin-right: auto; text-align: center;"> + <img class="scale" src="./pix/cs_stack.png" style="height: 6em;"> + </td> </tr> - </table> - </p> + </table> <li>コードセグメントへの継続はcallではなくjmp命令で行われる</li> - <li>スタックに載るデータは1つのコードセグメントの必要なデータのみ。</li> </div> <!-- PAGE --> <div class="slide"> @@ -241,150 +225,18 @@ <!-- PAGE --> <div class="slide"> <h1>GCC</h1> - <li>本来はGnu Compiler Collectionのことを指すが、 - <br>ここで扱うのはGnu C Compiler(cc1)になる。</li> + <ul> + <li>本来はGnu Compiler Collectionのことを指すが、ここで扱うのはGnu C Compiler(cc1)になる。</li> + <li>GCCではアセンブラ言語を出力するまでに読み込まれたソースコードは次の4つの中間言語へと変換される。</li> <ul> - <li class="incremental">GCCではアセンブラ言語を出力するまでに読み込まれたソースコードは次の4つの中間言語へと変換される。</li> + <li>Generic Tree</li> + <li>GIMPLE</li> + <li>Tree SSA</li> + <li>RTL</li> </ul> - </div> - <!-- PAGE --> - <div class="slide"> - <h1>GCC</h1> - <ol> - <li>Generic Tree:ソースコードを構文木の形に直したもの</li> - <li>GIMPLE: Generic Treeの命令を簡単にした構文木</li> - <li>Tree SSA: GIMPLEの中で変数代入を一度しか行わせない形にした構文木</li> - <li>RTL: レジスタの割り当てといった低レベルの表現でアセンブラとほぼ同じ命令の表現ができる。</li> - </ol> - <li class="incremental">それぞれは次のようなデータを構文木にして持っている。</li> - </div> - <!-- PAGE --> - <div class="slide"> - <h1>GCC</h1> - <table width=100% border=1> - <tr> - <td>Generic(ソースコード)</td> - <td>GIMPLE</td> - </tr> - <tr class="srctr"> - <td> - <pre class="srcbox"> -void factorial(int x) -{ - int prod,i; - for(i=1,prod=1; i <= x; i++){ - prod = prod*i; - } - print_factorial(prod); -} - </pre> - </td> - <td width=50%> - <pre class="srcbox"> -factorial (int x) -{ - int prod; - int i; - - i = 1; - prod = 1; - goto <D.2846>; - <D.2845>: - prod = prod * i; - i = i + 1; - <D.2846>: - if (i <= x) goto <D.2845>; else goto <D.2847>; - <D.2847>: - print_factorial (prod); -} - </pre> - </td> - </tr> - </table> - </div> - <!-- PAGE --> - <div class="slide"> - <h1>GCC</h1> - <table border=1 width=100% height=100%> - <tr> - <td width=50%>SSA</td> - <td width=50%>RTL(一部)</td> - </tr> - <tr class="srctr"> - <td class="srctd"> - <pre class="srcbox"> -factorial (int x) -{ - int i; - int prod; - -<bb 2>: - i_3 = 1; - prod_4 = 1; - goto <bb 4>; - -<bb 3>: - prod_6 = prod_1 * i_2; - i_7 = i_2 + 1; - -<bb 4>: - # prod_1 = PHI <prod_4(2), prod_6(3)> - # i_2 = PHI <i_3(2), i_7(3)> - if (i_2 <= x_5(D)) - goto <bb 3>; - else - goto <bb 5>; - -<bb 5>: - print_factorial (prod_1); - return; -} - - </pre> - </td> - <td class="srctd"> - <pre class="srcbox" style="width:25em;"> -(jump_insn 20 19 21 5 (set (pc) - (if_then_else (le (reg:CCGC 17 flags) - (const_int 0 [0])) - (label_ref 17) - (pc))) factorial.c:12 -1 - (nil) - -> 17) - -(note 21 20 22 6 [bb 6] NOTE_INSN_BASIC_BLOCK) - -(insn 22 21 23 6 (set (reg:SI 62) - (mem/c/i:SI (plus:DI (reg/f:DI 54 virtual-stack-vars) - (const_int -4 [0xfffffffffffffffc])) [0 prod+0 S4 A32])) factorial.c:15 -1 - (nil)) - -(insn 23 22 24 6 (set (reg:SI 5 di) - (reg:SI 62)) factorial.c:15 -1 - (nil)) - -(call_insn 24 23 25 6 (call (mem:QI (symbol_ref:DI ("print_factorial") [flags 0x403] <function_decl 0x146f6b200 print_factorial>) [0 S1 A8]) - (const_int 0 [0])) factorial.c:15 -1 - (nil) - (expr_list:REG_DEP_TRUE (use (reg:SI 5 di)) - (nil))) - -(code_label 25 24 26 7 2 "" [0 uses]) - -(note 26 25 0 7 [bb 7] NOTE_INSN_BASIC_BLOCK) - </pre> - </td> - </tr> - </table> - </div> - <!-- PAGE --> - <div class="slide"> - <h1>GCC</h1> - <p class="center"> - <img src="./pix/ir.png" style="height: 6em;"> - </p> <li class="incremental">CbCの実装においてはGeneric Tree生成部分とRTLへの変換部分に修正が加えられている。</li> <li class="incremental">Generic Tree生成部分について詳しく触れてみる。</li> + </ul> </div> <!-- PAGE --> <div class="slide">