Mercurial > hg > Papers > 2019 > anatofuz-thesis
changeset 108:793ee68da7fa
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 19 Feb 2019 18:08:40 +0900 |
parents | eaa12816b3e3 |
children | 108c8d50628c |
files | presen/fig/cbc_next.pdf presen/slide.html presen/slide.md presen/slide.pdf presen/slide.pdf.html |
diffstat | 5 files changed, 166 insertions(+), 55 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/slide.html Tue Feb 19 17:45:30 2019 +0900 +++ b/presen/slide.html Tue Feb 19 18:08:40 2019 +0900 @@ -110,14 +110,15 @@ <!-- _S9SLIDE_ --> <h2 id="研究目的-1">研究目的</h2> <ul> - <li>現在開発されているPerl6の実装にRakudoがあり, RakudoはNQP(Perl6のサブセット)で記述されたPerl6, NQPで記述されたNQPコンパイラ, NQPを解釈するVMで構成されている</li> - <li>NQPコンパイラはRakudoのVMであるMoarVM用のバイトコードを生成する</li> - <li>MoarVMはこのバイトコードを解釈, 実行する</li> + <li>現在開発されているPerl6の実装にRakudoがある</li> + <li>Rakudoはバイトコードを生成する + <ul> + <li>このバイトコードはMoarVMという専用の仮想機械が評価する</li> + </ul> + </li> <li>本研究では, CbC用いてPerl6にC処理系であるMoarVMの一部書き換えを行い, 命令のモジュール化を検討する.</li> </ul> -<img src="fig/perl6nqp.svg" alt="" /> - </div> @@ -194,7 +195,7 @@ <li>Rakudoとは現在のPerl6の主力な実装である.</li> <li>Rakudoは次の構成になっている <ul> - <li>実行環境のVM</li> + <li>実行環境のVM (MoarVM)</li> <li>Perl6のサブセットであるNQP(NotQuitPerl)</li> <li>NQPで記述されたPerl6(Rakudo)</li> </ul> @@ -263,7 +264,7 @@ <li>gccやclangを利用してコンパイルした場合、 ラベルgotoで命令ディスパッチが実行される</li> </ul> -<img src=”fig/origin_label_goto.svg” width=”30%” text-align:center;padding-left: 300px;> +<img src="fig/origin_label_goto.svg" width="30%" style="text-align:center;padding-left: 300px;" /> @@ -280,7 +281,6 @@ <li>この中の <code>OP</code> で宣言されたブロックがそれぞれバイトコードに対応する処理となっている.</li> </ul> </li> - <li><code>cur_op</code>は次のバイトコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のバイトコードに対応した処理に遷移する.</li> </ul> <pre><code>DISPATCH(NEXT_OP) { @@ -329,26 +329,43 @@ <!-- _S9SLIDE_ --> <h2 id="mvm_interp_runで使用されているマクロ-1">MVM_interp_runで使用されているマクロ</h2> +<pre><code> OP(const_i64): + GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); + cur_op += 10; + goto NEXT; +</code></pre> + +<ul> + <li><code>cur_op</code>は次のバイトコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のバイトコードに対応した処理に遷移する.</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="mvm_interp_runで使用されているマクロ-2">MVM_interp_runで使用されているマクロ</h2> + +<pre><code> OP(const_i64): + GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); + cur_op += 10; + goto NEXT; +</code></pre> + <ul> <li>次の命令に移動する <code>NEXT</code>はラベルテーブルにアクセスし, ラベルを取り出す <ul> <li>取り出したNEXTはラベルなので、 ラベルgotoの拡張が実装されている場合はgoto文でジャンプ出来る</li> </ul> </li> - <li>次の命令を計算する処理は, <code>NEXT_OP</code> というマクロが担っている</li> + <li>次の命令に対応する数値は, <code>NEXT_OP</code> というマクロで取り出す</li> </ul> <pre><code>#define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) #define NEXT *LABELS[NEXT_OP] </code></pre> -<ul> - <li>マクロ <code>NEXT</code> は次の様に展開される</li> - <li>これは現在のバイトコードを指すポインタをインクリメントし、 命令に対応する変数に代入をする</li> -</ul> - -<pre><code>goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)]; -</code></pre> @@ -452,7 +469,17 @@ <ul> <li>MoarVMではレジスタの集合や命令列などをMVM_interp_runのローカル変数として利用し, 各命令実行箇所で参照している</li> <li>CodeGearに書き換えた場合, このローカル変数にはアクセスする事が不可能となる.</li> - <li>その為, 入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="codegearの入出力インターフェイス-1">CodeGearの入出力インターフェイス</h2> +<ul> + <li>入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする</li> </ul> <pre><code>typedef struct interp { @@ -503,6 +530,16 @@ <div class='slide'> <!-- _S9SLIDE_ --> +<h2 id="cbcmoarvmの状態遷移">CbCMoarVMの状態遷移</h2> + +<img src="fig/cbc_next.svg" width="80%" style="text-align:center;padding-left: 120px;" /> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> <h2 id="moarvmとcbcmoarvmのトレース">MoarVMとCbCMoarVMのトレース</h2> <ul> @@ -566,9 +603,18 @@ <li>その為、 NQP, Rakudoの実行コマンドであるnqp perl6が起動する様になった</li> </ul> </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="現在のcbcmoarvm-1">現在のCbCMoarVM</h2> +<ul> <li>moarの起動時のオプションとして <code>--cbc</code> を与えることによりCbCかオリジナルを選択可能である</li> - <li>Perl6の実行バイナリperl6, NQPの実行バイナリnqp は, それぞれmoarを起動するシェルスクリプトである</li> - <li><code>--cbc</code> オプションをシェルスクリプト内に書き加えることで, Perl6, NQPがそれぞれCbCで起動する</li> + <li><code>--cbc</code> オプションをmoarの起動時に設定することでCbCで書き換えたインタプリタが起動する</li> </ul> <pre><code>#!/bin/sh
--- a/presen/slide.md Tue Feb 19 17:45:30 2019 +0900 +++ b/presen/slide.md Tue Feb 19 18:08:40 2019 +0900 @@ -13,12 +13,11 @@ - 命令実行処理部分をモジュール化することで、各命令ごとの最適化や、 命令ディスパッチ部分の最適化を行う事が可能であると考える。 ## 研究目的 -- 現在開発されているPerl6の実装にRakudoがあり, RakudoはNQP(Perl6のサブセット)で記述されたPerl6, NQPで記述されたNQPコンパイラ, NQPを解釈するVMで構成されている -- NQPコンパイラはRakudoのVMであるMoarVM用のバイトコードを生成する -- MoarVMはこのバイトコードを解釈, 実行する +- 現在開発されているPerl6の実装にRakudoがある +- Rakudoはバイトコードを生成する + - このバイトコードはMoarVMという専用の仮想機械が評価する - 本研究では, CbC用いてPerl6にC処理系であるMoarVMの一部書き換えを行い, 命令のモジュール化を検討する. -![](fig/perl6nqp.svg) ## Continuation Based C (CbC) @@ -65,7 +64,7 @@ ## Rakudo - Rakudoとは現在のPerl6の主力な実装である. - Rakudoは次の構成になっている - - 実行環境のVM + - 実行環境のVM (MoarVM) - Perl6のサブセットであるNQP(NotQuitPerl) - NQPで記述されたPerl6(Rakudo) @@ -98,14 +97,13 @@ - MoarVMは関数 `MVM_interp_run` でバイトコードに応じた処理を実行する - gccやclangを利用してコンパイルした場合、 ラベルgotoで命令ディスパッチが実行される -<img src="fig/origin_label_goto.svg" width="30%" text-align:center;padding-left: 300px;> +<img src="fig/origin_label_goto.svg" width="30%" style="text-align:center;padding-left: 300px;"> ## MoarVMのバイトコードインタプリタ - マクロDISPATCHで, ラベルgotoかcase文に変換が行われる - バイトコードは数値として見る事が出来る為、 case文に対応する事が出来る - この中の `OP` で宣言されたブロックがそれぞれバイトコードに対応する処理となっている. -- `cur_op`は次のバイトコード列が登録されており, マクロ `NEXT` で決められた方法で次のバイトコードに対応した処理に遷移する. ``` DISPATCH(NEXT_OP) { @@ -144,21 +142,33 @@ ## MVM_interp_runで使用されているマクロ +``` + OP(const_i64): + GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); + cur_op += 10; + goto NEXT; +``` + +- `cur_op`は次のバイトコード列が登録されており, マクロ `NEXT` で決められた方法で次のバイトコードに対応した処理に遷移する. + +## MVM_interp_runで使用されているマクロ + +``` + OP(const_i64): + GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); + cur_op += 10; + goto NEXT; +``` + - 次の命令に移動する `NEXT`はラベルテーブルにアクセスし, ラベルを取り出す - 取り出したNEXTはラベルなので、 ラベルgotoの拡張が実装されている場合はgoto文でジャンプ出来る -- 次の命令を計算する処理は, `NEXT_OP` というマクロが担っている +- 次の命令に対応する数値は, `NEXT_OP` というマクロで取り出す ``` #define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) #define NEXT *LABELS[NEXT_OP] ``` -- マクロ `NEXT` は次の様に展開される -- これは現在のバイトコードを指すポインタをインクリメントし、 命令に対応する変数に代入をする - -``` -goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)]; -``` ## MVM_interp_runのラベルテーブル @@ -202,6 +212,8 @@ - その為、 従来は関数化出来なかった単位をCodeGearに変換する事が出来る - CbCをMoarVMに適応すると, ラベルなどで制御していた命令に対応する処理をCodeGearで記述する事が可能である + + ## CbCMoarVMのバイトコードディスパッチ - オリジナルでは, マクロ `NEXT` が担当していた、 次のバイトコードへの移動は, NEXT相当のCodeGear `cbc_next`で処理を行う @@ -222,11 +234,14 @@ ``` + ## CodeGearの入出力インターフェイス - MoarVMではレジスタの集合や命令列などをMVM_interp_runのローカル変数として利用し, 各命令実行箇所で参照している - CodeGearに書き換えた場合, このローカル変数にはアクセスする事が不可能となる. -- その為, 入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする + +## CodeGearの入出力インターフェイス +- 入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする ``` @@ -265,6 +280,9 @@ cbc_extend_u16, ``` +## CbCMoarVMの状態遷移 + +<img src="fig/cbc_next.svg" width="80%" style="text-align:center;padding-left: 120px;"> ## MoarVMとCbCMoarVMのトレース @@ -311,9 +329,10 @@ - 現在はNQP, Rakudoのセルフビルドが達成でき, オリジナルと同等のテスト達成率を持っている - その為、 NQP, Rakudoの実行コマンドであるnqp perl6が起動する様になった + +## 現在のCbCMoarVM - moarの起動時のオプションとして `--cbc` を与えることによりCbCかオリジナルを選択可能である -- Perl6の実行バイナリperl6, NQPの実行バイナリnqp は, それぞれmoarを起動するシェルスクリプトである -- `--cbc` オプションをシェルスクリプト内に書き加えることで, Perl6, NQPがそれぞれCbCで起動する +- `--cbc` オプションをmoarの起動時に設定することでCbCで書き換えたインタプリタが起動する ``` #!/bin/sh
--- a/presen/slide.pdf.html Tue Feb 19 17:45:30 2019 +0900 +++ b/presen/slide.pdf.html Tue Feb 19 18:08:40 2019 +0900 @@ -94,14 +94,15 @@ <!-- _S9SLIDE_ --> <h2 id="研究目的-1">研究目的</h2> <ul> - <li>現在開発されているPerl6の実装にRakudoがあり, RakudoはNQP(Perl6のサブセット)で記述されたPerl6, NQPで記述されたNQPコンパイラ, NQPを解釈するVMで構成されている</li> - <li>NQPコンパイラはRakudoのVMであるMoarVM用のバイトコードを生成する</li> - <li>MoarVMはこのバイトコードを解釈, 実行する</li> + <li>現在開発されているPerl6の実装にRakudoがある</li> + <li>Rakudoはバイトコードを生成する + <ul> + <li>このバイトコードはMoarVMという専用の仮想機械が評価する</li> + </ul> + </li> <li>本研究では, CbC用いてPerl6にC処理系であるMoarVMの一部書き換えを行い, 命令のモジュール化を検討する.</li> </ul> -<p><img src="fig/perl6nqp.svg" alt="" /></p> - </div> @@ -178,7 +179,7 @@ <li>Rakudoとは現在のPerl6の主力な実装である.</li> <li>Rakudoは次の構成になっている <ul> - <li>実行環境のVM</li> + <li>実行環境のVM (MoarVM)</li> <li>Perl6のサブセットであるNQP(NotQuitPerl)</li> <li>NQPで記述されたPerl6(Rakudo)</li> </ul> @@ -247,7 +248,7 @@ <li>gccやclangを利用してコンパイルした場合、 ラベルgotoで命令ディスパッチが実行される</li> </ul> -<p><img src=”fig/origin_label_goto.svg” width=”30%” text-align:center;padding-left: 300px;></p> +<p><img src="fig/origin_label_goto.svg" width="30%" style="text-align:center;padding-left: 300px;" /></p> @@ -264,7 +265,6 @@ <li>この中の <code>OP</code> で宣言されたブロックがそれぞれバイトコードに対応する処理となっている.</li> </ul> </li> - <li><code>cur_op</code>は次のバイトコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のバイトコードに対応した処理に遷移する.</li> </ul> <pre><code>DISPATCH(NEXT_OP) { @@ -313,26 +313,43 @@ <!-- _S9SLIDE_ --> <h2 id="mvm_interp_runで使用されているマクロ-1">MVM_interp_runで使用されているマクロ</h2> +<pre><code> OP(const_i64): + GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); + cur_op += 10; + goto NEXT; +</code></pre> + +<ul> + <li><code>cur_op</code>は次のバイトコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のバイトコードに対応した処理に遷移する.</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="mvm_interp_runで使用されているマクロ-2">MVM_interp_runで使用されているマクロ</h2> + +<pre><code> OP(const_i64): + GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); + cur_op += 10; + goto NEXT; +</code></pre> + <ul> <li>次の命令に移動する <code>NEXT</code>はラベルテーブルにアクセスし, ラベルを取り出す <ul> <li>取り出したNEXTはラベルなので、 ラベルgotoの拡張が実装されている場合はgoto文でジャンプ出来る</li> </ul> </li> - <li>次の命令を計算する処理は, <code>NEXT_OP</code> というマクロが担っている</li> + <li>次の命令に対応する数値は, <code>NEXT_OP</code> というマクロで取り出す</li> </ul> <pre><code>#define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) #define NEXT *LABELS[NEXT_OP] </code></pre> -<ul> - <li>マクロ <code>NEXT</code> は次の様に展開される</li> - <li>これは現在のバイトコードを指すポインタをインクリメントし、 命令に対応する変数に代入をする</li> -</ul> - -<pre><code>goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)]; -</code></pre> @@ -436,7 +453,17 @@ <ul> <li>MoarVMではレジスタの集合や命令列などをMVM_interp_runのローカル変数として利用し, 各命令実行箇所で参照している</li> <li>CodeGearに書き換えた場合, このローカル変数にはアクセスする事が不可能となる.</li> - <li>その為, 入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="codegearの入出力インターフェイス-1">CodeGearの入出力インターフェイス</h2> +<ul> + <li>入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする</li> </ul> <pre><code>typedef struct interp { @@ -487,6 +514,16 @@ <div class='slide'> <!-- _S9SLIDE_ --> +<h2 id="cbcmoarvmの状態遷移">CbCMoarVMの状態遷移</h2> + +<p><img src="fig/cbc_next.svg" width="80%" style="text-align:center;padding-left: 120px;" /></p> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> <h2 id="moarvmとcbcmoarvmのトレース">MoarVMとCbCMoarVMのトレース</h2> <ul> @@ -550,9 +587,18 @@ <li>その為、 NQP, Rakudoの実行コマンドであるnqp perl6が起動する様になった</li> </ul> </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="現在のcbcmoarvm-1">現在のCbCMoarVM</h2> +<ul> <li>moarの起動時のオプションとして <code>--cbc</code> を与えることによりCbCかオリジナルを選択可能である</li> - <li>Perl6の実行バイナリperl6, NQPの実行バイナリnqp は, それぞれmoarを起動するシェルスクリプトである</li> - <li><code>--cbc</code> オプションをシェルスクリプト内に書き加えることで, Perl6, NQPがそれぞれCbCで起動する</li> + <li><code>--cbc</code> オプションをmoarの起動時に設定することでCbCで書き換えたインタプリタが起動する</li> </ul> <pre><code>#!/bin/sh