Mercurial > hg > Papers > 2012 > nobu-thesis
changeset 40:ad0ab1378ae6 draft
commit
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 28 Feb 2012 22:31:03 +0900 |
parents | a6540714dda9 |
children | 8ee3d6448aa6 |
files | presen/cbc.md presen/presentation.html |
diffstat | 2 files changed, 182 insertions(+), 125 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/cbc.md Tue Feb 28 20:01:28 2012 +0900 +++ b/presen/cbc.md Tue Feb 28 22:31:03 2012 +0900 @@ -9,9 +9,6 @@ .notes: <li><font color=red size=5em>状態遷移記述をベースとしたより細かい単位でのプログラミングを実現する</font></li> -- 組込みソフト、Real-time処理、通信プロトコル記述、どれも状態遷移ベース -- 現存する記述言語は状態遷移の記述に向いていない -- スタックが状態を隠蔽するため、分割しにくい、検証が難しい - 本研究室ではコードセグメント単位で記述するプログラミング言語Continuation based C (以下CbC)という言語を提案している。 - CbC のコンパイラは Micro-C 版 と GCC 版(以下 CbC-GCC) が開発されている。 - しかし, CbC-GCC はいくつかのバグがあり機能に修正の余地があった。 @@ -189,40 +186,17 @@ --- -CbC の実装: Tail Call Elimination +CbC の実装: 末尾除去の強制 ======== -Tail Call Elimination の条件 ---------- -<ul> - <li>関数を呼び出す側(caller)と呼び出される側(callee)の戻値の型が一致している。</li> - <li>関数呼び出しがリターン直前に行われている。</li> - <li>呼び出される関数(callee)の引数に用いられるスタックサイズが呼出元(caller)のそれより少ない。</li> - <li>引数の並びのコピーに上書きがない。</li> -</ul> - -条件回避の為の実装 +末尾除去の条件をチェックする関数 --------- -<ul> - <li>コードセグメントの型はvoid型で統一する。</li> - <li>gotoの直後に自動で return を置く。</li> - <li>スタックサイズは固定にする。</li> - <li>引数は一旦、一時変数にコピーする。</li> -</ul> - ---- - - -CbC の実装: Tail Call Elimination -======== -Tail Call Elimination の条件をチェックする関数 ---------- -- 今までの実装では Tail Call Elimination の条件をクリアする為に専用の関数を用意していた。 -- この専用関数は元々ある GCC コードを元に作成している為, アップデートに合わせて修正していく -必要があった。 +- 関数が末尾除去にかかる為には幾つか条件があり、その条件はある関数によってチェックされる。 +- その関数を元に、『コードセグメントは末尾除去』にかける専用の関数を用意していた。 +- しかしこの方法は、元になった関数が修正に合わせて専用の関数も修正を行う必要があった。 実装の修正とその利点 --------- -- しかし, 今回の実装でその関数を無くし, Tail Call Elimination のフラグを強制的に立たせる実装に変更。 +- しかし, 今回の実装でその関数を無くし, 末尾除去のフラグを強制的に立たせる実装に変更。 - 専用関数がなくなったことで、今後より楽なアップデートを行なっていくことができるようになった。 - また、コードセグメントへの継続が jmp ではなく call 命令で行われるバグがあったが修正できた。 @@ -254,7 +228,7 @@ </tr> </table> <li>Mac の GCC-4.5 では動かなかった 32bit のプログラムが GCC-4.6 では問題なく動いている。</li> -<li>引数 2、3 の結果はほぼ同じ</li> +<li>引数 2、3 は手動で最適化をかけている。</li> <li>引数 1 の結果では 32bit, 64bit 共に GCC-4.6 の方が 1.5倍以上早い</li> @@ -357,6 +331,47 @@ --- +CbC +======== +<li><font color=red size=5em>状態遷移記述をベースとしたより細かい単位でのプログラミングを実現する</font></li> +- 組込みソフト、Real-time処理、通信プロトコル記述、どれも状態遷移ベース +- 現存する記述言語は状態遷移の記述に向いていない +- スタックが状態を隠蔽するため、分割しにくい、検証が難しい +- 以上の問題を解決する言語として CbC は提案されている。 + +具体的な CbC の利用予定 +--------- +- モデル検査 +- Cerium の実装 + +--- + +Tail Call Elimination +======== +関数が Tail Call Elimination にかかる条件 +--------- +<ul> + <li>関数を呼び出す側(caller)と呼び出される側(callee)の戻値の型が一致している。</li> + <li>関数呼び出しがリターン直前に行われている。</li> + <li>呼び出される関数(callee)の引数に用いられるスタックサイズが呼出元(caller)のそれより少ない。</li> + <li>引数の並びのコピーに上書きがない。</li> +</ul> + +条件回避の為の CbC の実装内容 +--------- +<ul> + <li>コードセグメントの型はvoid型で統一する。</li> + <li>gotoの直後に自動で return を置く。</li> + <li>スタックサイズは固定にする。</li> + <li>引数は一旦、一時変数にコピーする。</li> +</ul> + +--- + + + + + jmp と call ======== <table width=100%>
--- a/presen/presentation.html Tue Feb 28 20:01:28 2012 +0900 +++ b/presen/presentation.html Tue Feb 28 22:31:03 2012 +0900 @@ -70,7 +70,7 @@ </aside> <aside class="page_number"> - 1/24 + 1/25 </aside> </footer> </div> @@ -88,9 +88,6 @@ <li><font color=red size=5em>状態遷移記述をベースとしたより細かい単位でのプログラミングを実現する</font></li> <ul> -<li>組込みソフト、Real-time処理、通信プロトコル記述、どれも状態遷移ベース</li> -<li>現存する記述言語は状態遷移の記述に向いていない</li> -<li>スタックが状態を隠蔽するため、分割しにくい、検証が難しい</li> <li>本研究室ではコードセグメント単位で記述するプログラミング言語Continuation based C (以下CbC)という言語を提案している。</li> <li>CbC のコンパイラは Micro-C 版 と GCC 版(以下 CbC-GCC) が開発されている。</li> <li>しかし, CbC-GCC はいくつかのバグがあり機能に修正の余地があった。</li> @@ -112,7 +109,7 @@ </aside> <aside class="page_number"> - 2/24 + 2/25 </aside> </footer> </div> @@ -166,7 +163,7 @@ </aside> <aside class="page_number"> - 3/24 + 3/25 </aside> </footer> </div> @@ -225,7 +222,7 @@ </aside> <aside class="page_number"> - 4/24 + 4/25 </aside> </footer> </div> @@ -289,7 +286,7 @@ </aside> <aside class="page_number"> - 5/24 + 5/25 </aside> </footer> </div> @@ -329,7 +326,7 @@ </aside> <aside class="page_number"> - 6/24 + 6/25 </aside> </footer> </div> @@ -387,7 +384,7 @@ </aside> <aside class="page_number"> - 7/24 + 7/25 </aside> </footer> </div> @@ -398,61 +395,18 @@ <div class="slide"> <div class="inner"> - <header><h1>CbC の実装: Tail Call Elimination</h1></header> + <header><h1>CbC の実装: 末尾除去の強制</h1></header> - <section><h2>Tail Call Elimination の条件</h2> -<p><ul> - <li>関数を呼び出す側(caller)と呼び出される側(callee)の戻値の型が一致している。</li> - <li>関数呼び出しがリターン直前に行われている。</li> - <li>呼び出される関数(callee)の引数に用いられるスタックサイズが呼出元(caller)のそれより少ない。</li> - <li>引数の並びのコピーに上書きがない。</li> -</ul></p> -<h2>条件回避の為の実装</h2> -<p><ul> - <li>コードセグメントの型はvoid型で統一する。</li> - <li>gotoの直後に自動で return を置く。</li> - <li>スタックサイズは固定にする。</li> - <li>引数は一旦、一時変数にコピーする。</li> -</ul></p></section> - - </div> - <div class="presenter_notes"> - <header><h1>Presenter Notes</h1></header> - <section> - - </section> - </div> - <footer> - - <aside class="source"> - Source: <a href="cbc.md">cbc.md</a> - </aside> - - <aside class="page_number"> - 8/24 - </aside> - </footer> - </div> - </div> - - <!-- slide source: cbc.md --> - <div class="slide-wrapper"> - <div class="slide"> - <div class="inner"> - - <header><h1>CbC の実装: Tail Call Elimination</h1></header> - - - <section><h2>Tail Call Elimination の条件をチェックする関数</h2> + <section><h2>末尾除去の条件をチェックする関数</h2> <ul> -<li>今までの実装では Tail Call Elimination の条件をクリアする為に専用の関数を用意していた。</li> -<li>この専用関数は元々ある GCC コードを元に作成している為, アップデートに合わせて修正していく -必要があった。</li> +<li>関数が末尾除去にかかる為には幾つか条件があり、その条件はある関数によってチェックされる。</li> +<li>その関数を元に、『コードセグメントは末尾除去』にかける専用の関数を用意していた。</li> +<li>しかしこの方法は、元になった関数が修正に合わせて専用の関数も修正を行う必要があった。</li> </ul> <h2>実装の修正とその利点</h2> <ul> -<li>しかし, 今回の実装でその関数を無くし, Tail Call Elimination のフラグを強制的に立たせる実装に変更。</li> +<li>しかし, 今回の実装でその関数を無くし, 末尾除去のフラグを強制的に立たせる実装に変更。</li> <li>専用関数がなくなったことで、今後より楽なアップデートを行なっていくことができるようになった。</li> <li>また、コードセグメントへの継続が jmp ではなく call 命令で行われるバグがあったが修正できた。</li> </ul></section> @@ -471,7 +425,7 @@ </aside> <aside class="page_number"> - 9/24 + 8/25 </aside> </footer> </div> @@ -506,7 +460,7 @@ <li>Mac の GCC-4.5 では動かなかった 32bit のプログラムが GCC-4.6 では問題なく動いている。</li> -<li>引数 2、3 の結果はほぼ同じ</li> +<li>引数 2、3 は手動で最適化をかけている。</li> <li>引数 1 の結果では 32bit, 64bit 共に GCC-4.6 の方が 1.5倍以上早い</li></section> @@ -524,7 +478,7 @@ </aside> <aside class="page_number"> - 10/24 + 9/25 </aside> </footer> </div> @@ -589,7 +543,7 @@ </aside> <aside class="page_number"> - 11/24 + 10/25 </aside> </footer> </div> @@ -642,7 +596,7 @@ </aside> <aside class="page_number"> - 12/24 + 11/25 </aside> </footer> </div> @@ -676,7 +630,7 @@ </aside> <aside class="page_number"> - 13/24 + 12/25 </aside> </footer> </div> @@ -716,7 +670,89 @@ </aside> <aside class="page_number"> - 14/24 + 13/25 + </aside> + </footer> + </div> + </div> + + <!-- slide source: cbc.md --> + <div class="slide-wrapper"> + <div class="slide"> + <div class="inner"> + + <header><h1>CbC</h1></header> + + + <section><p><li><font color=red size=5em>状態遷移記述をベースとしたより細かい単位でのプログラミングを実現する</font></li> +- 組込みソフト、Real-time処理、通信プロトコル記述、どれも状態遷移ベース +- 現存する記述言語は状態遷移の記述に向いていない +- スタックが状態を隠蔽するため、分割しにくい、検証が難しい +- 以上の問題を解決する言語として CbC は提案されている。</p> +<h2>具体的な CbC の利用予定</h2> +<ul> +<li>モデル検査</li> +<li>Cerium の実装</li> +</ul></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + <aside class="source"> + Source: <a href="cbc.md">cbc.md</a> + </aside> + + <aside class="page_number"> + 14/25 + </aside> + </footer> + </div> + </div> + + <!-- slide source: cbc.md --> + <div class="slide-wrapper"> + <div class="slide"> + <div class="inner"> + + <header><h1>Tail Call Elimination</h1></header> + + + <section><h2>関数が Tail Call Elimination にかかる条件</h2> +<p><ul> + <li>関数を呼び出す側(caller)と呼び出される側(callee)の戻値の型が一致している。</li> + <li>関数呼び出しがリターン直前に行われている。</li> + <li>呼び出される関数(callee)の引数に用いられるスタックサイズが呼出元(caller)のそれより少ない。</li> + <li>引数の並びのコピーに上書きがない。</li> +</ul></p> +<h2>条件回避の為の CbC の実装内容</h2> +<p><ul> + <li>コードセグメントの型はvoid型で統一する。</li> + <li>gotoの直後に自動で return を置く。</li> + <li>スタックサイズは固定にする。</li> + <li>引数は一旦、一時変数にコピーする。</li> +</ul></p></section> + + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + + </section> + </div> + <footer> + + <aside class="source"> + Source: <a href="cbc.md">cbc.md</a> + </aside> + + <aside class="page_number"> + 15/25 </aside> </footer> </div> @@ -751,7 +787,7 @@ </aside> <aside class="page_number"> - 15/24 + 16/25 </aside> </footer> </div> @@ -795,7 +831,7 @@ </aside> <aside class="page_number"> - 16/24 + 17/25 </aside> </footer> </div> @@ -837,7 +873,7 @@ </aside> <aside class="page_number"> - 17/24 + 18/25 </aside> </footer> </div> @@ -886,7 +922,7 @@ </aside> <aside class="page_number"> - 18/24 + 19/25 </aside> </footer> </div> @@ -937,7 +973,7 @@ </aside> <aside class="page_number"> - 19/24 + 20/25 </aside> </footer> </div> @@ -984,7 +1020,7 @@ </aside> <aside class="page_number"> - 20/24 + 21/25 </aside> </footer> </div> @@ -1032,7 +1068,7 @@ </aside> <aside class="page_number"> - 21/24 + 22/25 </aside> </footer> </div> @@ -1074,7 +1110,7 @@ </aside> <aside class="page_number"> - 22/24 + 23/25 </aside> </footer> </div> @@ -1118,7 +1154,7 @@ </aside> <aside class="page_number"> - 23/24 + 24/25 </aside> </footer> </div> @@ -1208,7 +1244,7 @@ </aside> <aside class="page_number"> - 24/24 + 25/25 </aside> </footer> </div> @@ -1266,97 +1302,97 @@ <tr id="toc-row-8"> - <th><a href="#slide8">CbC の実装: Tail Call Elimination</a></th> + <th><a href="#slide8">CbC の実装: 末尾除去の強制</a></th> <td><a href="#slide8">8</a></td> </tr> <tr id="toc-row-9"> - <th><a href="#slide9">CbC の実装: Tail Call Elimination</a></th> + <th><a href="#slide9">GCC-4.5, GCC-4.6 の性能比較</a></th> <td><a href="#slide9">9</a></td> </tr> <tr id="toc-row-10"> - <th><a href="#slide10">GCC-4.5, GCC-4.6 の性能比較</a></th> + <th><a href="#slide10">GCC-4.6 の最適化</a></th> <td><a href="#slide10">10</a></td> </tr> <tr id="toc-row-11"> - <th><a href="#slide11">GCC-4.6 の最適化</a></th> + <th><a href="#slide11">最適化の比較</a></th> <td><a href="#slide11">11</a></td> </tr> <tr id="toc-row-12"> - <th><a href="#slide12">最適化の比較</a></th> + <th><a href="#slide12">最新バージョンに合わせる有用性</a></th> <td><a href="#slide12">12</a></td> </tr> <tr id="toc-row-13"> - <th><a href="#slide13">最新バージョンに合わせる有用性</a></th> + <th><a href="#slide13">まとめ</a></th> <td><a href="#slide13">13</a></td> </tr> <tr id="toc-row-14"> - <th><a href="#slide14">まとめ</a></th> + <th><a href="#slide14">CbC</a></th> <td><a href="#slide14">14</a></td> </tr> <tr id="toc-row-15"> - <th><a href="#slide15">jmp と call</a></th> + <th><a href="#slide15">Tail Call Elimination</a></th> <td><a href="#slide15">15</a></td> </tr> <tr id="toc-row-16"> - <th><a href="#slide16">conv1 プログラム</a></th> + <th><a href="#slide16">jmp と call</a></th> <td><a href="#slide16">16</a></td> </tr> <tr id="toc-row-17"> - <th><a href="#slide17">CbC-GCC のアップデート手法</a></th> + <th><a href="#slide17">conv1 プログラム</a></th> <td><a href="#slide17">17</a></td> </tr> <tr id="toc-row-18"> - <th><a href="#slide18">構文の追加</a></th> + <th><a href="#slide18">CbC-GCC のアップデート手法</a></th> <td><a href="#slide18">18</a></td> </tr> <tr id="toc-row-19"> - <th><a href="#slide19">conv1 プログラム</a></th> + <th><a href="#slide19">構文の追加</a></th> <td><a href="#slide19">19</a></td> </tr> <tr id="toc-row-20"> - <th><a href="#slide20">CbC の実装: 環境付き継続</a></th> + <th><a href="#slide20">conv1 プログラム</a></th> <td><a href="#slide20">20</a></td> </tr> <tr id="toc-row-21"> - <th><a href="#slide21">CbC 引数渡し</a></th> + <th><a href="#slide21">CbC の実装: 環境付き継続</a></th> <td><a href="#slide21">21</a></td> </tr> <tr id="toc-row-22"> - <th><a href="#slide22">引数の並びに上書きコピー</a></th> + <th><a href="#slide22">CbC 引数渡し</a></th> <td><a href="#slide22">22</a></td> </tr> <tr id="toc-row-23"> - <th><a href="#slide23">最適化の比較</a></th> + <th><a href="#slide23">引数の並びに上書きコピー</a></th> <td><a href="#slide23">23</a></td> </tr> @@ -1367,6 +1403,12 @@ </tr> + <tr id="toc-row-25"> + <th><a href="#slide25">最適化の比較</a></th> + <td><a href="#slide25">25</a></td> + </tr> + + </table> </div>