Mercurial > hg > Papers > 2019 > anatofuz-prosym
changeset 95:01f148c3de98
update
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 11 Jan 2019 11:47:04 +0900 |
parents | 4f0eaa330295 |
children | 38ab79fff396 |
files | Slide/slide.html Slide/slide.md Slide/slide.pdf.html |
diffstat | 3 files changed, 175 insertions(+), 191 deletions(-) [+] |
line wrap: on
line diff
--- a/Slide/slide.html Fri Jan 11 10:49:55 2019 +0900 +++ b/Slide/slide.html Fri Jan 11 11:47:04 2019 +0900 @@ -216,6 +216,26 @@ <div class='slide'> <!-- _S9SLIDE_ --> +<h2 id="mvm_bc_get_i64の実装">MVM_BC_get_I64の実装</h2> + +<pre><code> MVM_STATIC_INLINE MVMint64 MVM_BC_get_I64(const MVMuint8 *cur_op, int offset) { + const MVMuint8 *const where = cur_op + offset; + #ifdef MVM_CAN_UNALIGNED_INT64 + return *(MVMint64 *)where; + #else + MVMint64 temp; + memmove(&temp, where, sizeof(MVMint64)); + return temp; + #endif + } +</code></pre> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> <h2 id="mvm_interp_runで使用されているマクロ">MVM_interp_runで使用されているマクロ</h2> <pre><code>DISPATCH(NEXT_OP) { @@ -354,30 +374,23 @@ <h2 id="cbcmoarvmのバイトコードディスパッチ">CbCMoarVMのバイトコードディスパッチ</h2> <ul> - <li>interp.cではマクロを利用した cur_op (現在のオペコード) の計算及び, マクロ遷移かswitch文を利用して次の命令列に遷移していた</li> - <li>CbCMoarVMでは, それぞれの命令に対応するCodeGearを生成し, このCodeGearの集合であるテーブルCODESを作成した</li> - <li>このテーブルは<code>cbc_next</code>というCodeGearから参照し, 以降はこのCodeGearの遷移として処理が継続される.</li> + <li>CbCをMoarVMに適応すると, ラベルなどで制御していた命令に対応する処理をCodeGearで記述する事が可能である</li> + <li>オリジナルでは, マクロ <code>NEXT</code> が担当していた, 次のバイトコードへの移動は, NEXT相当のCodeGear <code>cbc_next</code>で処理を行う</li> + <li>CodeGearの入出力として, MoarVMなどの情報をまとめた構造体を利用する</li> </ul> -<pre><code>#define NEXT_OP(i) (i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op) -#define DISPATCH(op) {goto (CODES[op])(i);} -#define OP(name) OP_ ## name -#define NEXT(i) CODES[NEXT_OP(i)](i) -static int tracing_enabled = 0; -</code></pre> +<pre><code>__code cbc_next(INTERP i){ + __code (*c)(INTERP) + c = CODES[(i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op)]; // c = NEXT(i) + goto c(i); +} -<pre><code>__code (* CODES[])(INTERP) = { - cbc_no_op, - cbc_const_i8, - cbc_const_i16, - cbc_const_i32, - cbc_const_i64, - cbc_const_n32, - cbc_const_n64, - cbc_const_s, - cbc_set, - cbc_extend_u8, - cbc_extend_u16, +__code cbc_const_i64(INTERP i){ + GET_REG(i->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2); + i->cur_op += 10; + goto cbc_next(i); +} + </code></pre> @@ -415,33 +428,24 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="datagearへの変換">DataGearへの変換</h2> +<h2 id="cbcmoarvmのcodegearテーブル">CbCMoarVMのCodeGearテーブル</h2> <ul> - <li>バイトコードに対応する命令をそれぞれCodeGearに変換していく.</li> - <li><code>OP(.*)</code>の<code>(.*)</code>の部分をCodeGearの名前として先頭に <code>cbc_</code> をつけた上で設定する.</li> - <li>cur_opなどはINTERPを経由してアクセスする様に修正する.</li> - <li>末尾の <code>NEXT</code> を次のCodeGearにアクセスする為に <code>cbc_next</code> に修正する.</li> + <li>CodeGearテーブルは引数としてINTERを受け取るCodeGearの配列として定義する</li> </ul> -<pre><code> -__code cbc_next(INTERP i){ - __code (*c)(INTERP) - c = CODES[(i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op)]; // c = NEXT(i) - goto c(i); -} -_code cbc_next(INTERP i){ - goto NEXT(i); -} - -__code cbc_const_i64(INTERP i){ - GET_REG(i->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2); - i->cur_op += 10; - goto cbc_next(i); -} - (i->reg_base[*((MVMuint16 *)(i->cur_op + 0))]).i64 = MVM_BC_get_I64(i->cur_op, 2); - i->cur_op += 10; - goto cbc_next(i); +<pre><code>__code (* CODES[])(INTERP) = { + cbc_no_op, + cbc_const_i8, + cbc_const_i16, + cbc_const_i32, + cbc_const_i64, + cbc_const_n32, + cbc_const_n64, + cbc_const_s, + cbc_set, + cbc_extend_u8, + cbc_extend_u16, </code></pre> @@ -617,26 +621,6 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="アレ">アレ</h2> - -<pre><code>100 MVM_STATIC_INLINE MVMint64 MVM_BC_get_I64(const MVMuint8 *cur_op, int offset) { -101 const MVMuint8 *const where = cur_op + offset; -102 #ifdef MVM_CAN_UNALIGNED_INT64 -103 return *(MVMint64 *)where; -104 #else -105 MVMint64 temp; -106 memmove(&temp, where, sizeof(MVMint64)); -107 return temp; -108 #endif -109 } -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> <h2 id="moarvmのデバッグ">MoarVMのデバッグ</h2> <ul> @@ -766,7 +750,7 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h1 id="フィボナッチの例題">フィボナッチの例題</h1> +<h2 id="フィボナッチの例題">フィボナッチの例題</h2> <ul> <li>フィボナッチの例題ではCbCMoarVMが劣る結果となった</li> @@ -817,6 +801,19 @@ <div class='slide'> <!-- _S9SLIDE_ --> +<h2 id="基本ブロックとcodegear">基本ブロックとCodeGear</h2> + +<ul> + <li>コンパイラなどでは, 関数あるいはループの先頭から, 別の関数呼び出し, あるいはジャンプするまでの間のコードを基本ブロックと呼ぶ</li> + <li>基本ブロックは入力に影響を受けず, 基本ブロックが決定したタイミングである決定的な処理を行う</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> <h2 id="まとめと今後の課題">まとめと今後の課題</h2> <ul> <li>継続と基本としたC言語 Continuation Based Cを用いてPerl6の処理系の一部を書き直した</li>
--- a/Slide/slide.md Fri Jan 11 10:49:55 2019 +0900 +++ b/Slide/slide.md Fri Jan 11 11:47:04 2019 +0900 @@ -78,6 +78,21 @@ ``` +## MVM_BC_get_I64の実装 + +``` + MVM_STATIC_INLINE MVMint64 MVM_BC_get_I64(const MVMuint8 *cur_op, int offset) { + const MVMuint8 *const where = cur_op + offset; + #ifdef MVM_CAN_UNALIGNED_INT64 + return *(MVMint64 *)where; + #else + MVMint64 temp; + memmove(&temp, where, sizeof(MVMint64)); + return temp; + #endif + } +``` + ## MVM_interp_runで使用されているマクロ ``` @@ -178,31 +193,23 @@ ## CbCMoarVMのバイトコードディスパッチ -- interp.cではマクロを利用した cur_op (現在のオペコード) の計算及び, マクロ遷移かswitch文を利用して次の命令列に遷移していた -- CbCMoarVMでは, それぞれの命令に対応するCodeGearを生成し, このCodeGearの集合であるテーブルCODESを作成した -- このテーブルは`cbc_next`というCodeGearから参照し, 以降はこのCodeGearの遷移として処理が継続される. - -``` -#define NEXT_OP(i) (i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op) -#define DISPATCH(op) {goto (CODES[op])(i);} -#define OP(name) OP_ ## name -#define NEXT(i) CODES[NEXT_OP(i)](i) -static int tracing_enabled = 0; -``` +- CbCをMoarVMに適応すると, ラベルなどで制御していた命令に対応する処理をCodeGearで記述する事が可能である +- オリジナルでは, マクロ `NEXT` が担当していた, 次のバイトコードへの移動は, NEXT相当のCodeGear `cbc_next`で処理を行う +- CodeGearの入出力として, MoarVMなどの情報をまとめた構造体を利用する ``` -__code (* CODES[])(INTERP) = { - cbc_no_op, - cbc_const_i8, - cbc_const_i16, - cbc_const_i32, - cbc_const_i64, - cbc_const_n32, - cbc_const_n64, - cbc_const_s, - cbc_set, - cbc_extend_u8, - cbc_extend_u16, +__code cbc_next(INTERP i){ + __code (*c)(INTERP) + c = CODES[(i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op)]; // c = NEXT(i) + goto c(i); +} + +__code cbc_const_i64(INTERP i){ + GET_REG(i->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2); + i->cur_op += 10; + goto cbc_next(i); +} + ``` ## CodeGearの入出力インターフェイス @@ -228,34 +235,26 @@ } INTER,*INTERP; ``` -## DataGearへの変換 +## CbCMoarVMのCodeGearテーブル -- バイトコードに対応する命令をそれぞれCodeGearに変換していく. -- `OP(.*)`の`(.*)`の部分をCodeGearの名前として先頭に `cbc_` をつけた上で設定する. -- cur_opなどはINTERPを経由してアクセスする様に修正する. -- 末尾の `NEXT` を次のCodeGearにアクセスする為に `cbc_next` に修正する. +- CodeGearテーブルは引数としてINTERを受け取るCodeGearの配列として定義する ``` - -__code cbc_next(INTERP i){ - __code (*c)(INTERP) - c = CODES[(i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op)]; // c = NEXT(i) - goto c(i); -} -_code cbc_next(INTERP i){ - goto NEXT(i); -} +__code (* CODES[])(INTERP) = { + cbc_no_op, + cbc_const_i8, + cbc_const_i16, + cbc_const_i32, + cbc_const_i64, + cbc_const_n32, + cbc_const_n64, + cbc_const_s, + cbc_set, + cbc_extend_u8, + cbc_extend_u16, +``` -__code cbc_const_i64(INTERP i){ - GET_REG(i->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2); - i->cur_op += 10; - goto cbc_next(i); -} - (i->reg_base[*((MVMuint16 *)(i->cur_op + 0))]).i64 = MVM_BC_get_I64(i->cur_op, 2); - i->cur_op += 10; - goto cbc_next(i); -``` ## NQP - Perl6の機能を制約したプログラミング言語であり, Perl6はNQPで記述されている @@ -383,20 +382,6 @@ $2 = 162 ``` -## アレ - -``` -100 MVM_STATIC_INLINE MVMint64 MVM_BC_get_I64(const MVMuint8 *cur_op, int offset) { -101 const MVMuint8 *const where = cur_op + offset; -102 #ifdef MVM_CAN_UNALIGNED_INT64 -103 return *(MVMint64 *)where; -104 #else -105 MVMint64 temp; -106 memmove(&temp, where, sizeof(MVMint64)); -107 return temp; -108 #endif -109 } -``` ## MoarVMのデバッグ @@ -481,7 +466,7 @@ say("time = " ~ ($t1-$t0)); ``` -# フィボナッチの例題 +## フィボナッチの例題 - フィボナッチの例題ではCbCMoarVMが劣る結果となった @@ -504,6 +489,11 @@ - 速度を計測した所, 現在はCbCMoarVMの方が僅かに劣る結果となった - ただしフィボナッチを求める例題などで, ケースによってはCbCMoarVMの方が高速に動作する場合もある +## 基本ブロックとCodeGear + +- コンパイラなどでは, 関数あるいはループの先頭から, 別の関数呼び出し, あるいはジャンプするまでの間のコードを基本ブロックと呼ぶ +- 基本ブロックは入力に影響を受けず, 基本ブロックが決定したタイミングである決定的な処理を行う + ## まとめと今後の課題 - 継続と基本としたC言語 Continuation Based Cを用いてPerl6の処理系の一部を書き直した
--- a/Slide/slide.pdf.html Fri Jan 11 10:49:55 2019 +0900 +++ b/Slide/slide.pdf.html Fri Jan 11 11:47:04 2019 +0900 @@ -200,6 +200,26 @@ <div class='slide'> <!-- _S9SLIDE_ --> +<h2 id="mvm_bc_get_i64の実装">MVM_BC_get_I64の実装</h2> + +<pre><code> MVM_STATIC_INLINE MVMint64 MVM_BC_get_I64(const MVMuint8 *cur_op, int offset) { + const MVMuint8 *const where = cur_op + offset; + #ifdef MVM_CAN_UNALIGNED_INT64 + return *(MVMint64 *)where; + #else + MVMint64 temp; + memmove(&temp, where, sizeof(MVMint64)); + return temp; + #endif + } +</code></pre> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> <h2 id="mvm_interp_runで使用されているマクロ">MVM_interp_runで使用されているマクロ</h2> <pre><code>DISPATCH(NEXT_OP) { @@ -338,30 +358,23 @@ <h2 id="cbcmoarvmのバイトコードディスパッチ">CbCMoarVMのバイトコードディスパッチ</h2> <ul> - <li>interp.cではマクロを利用した cur_op (現在のオペコード) の計算及び, マクロ遷移かswitch文を利用して次の命令列に遷移していた</li> - <li>CbCMoarVMでは, それぞれの命令に対応するCodeGearを生成し, このCodeGearの集合であるテーブルCODESを作成した</li> - <li>このテーブルは<code>cbc_next</code>というCodeGearから参照し, 以降はこのCodeGearの遷移として処理が継続される.</li> + <li>CbCをMoarVMに適応すると, ラベルなどで制御していた命令に対応する処理をCodeGearで記述する事が可能である</li> + <li>オリジナルでは, マクロ <code>NEXT</code> が担当していた, 次のバイトコードへの移動は, NEXT相当のCodeGear <code>cbc_next</code>で処理を行う</li> + <li>CodeGearの入出力として, MoarVMなどの情報をまとめた構造体を利用する</li> </ul> -<pre><code>#define NEXT_OP(i) (i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op) -#define DISPATCH(op) {goto (CODES[op])(i);} -#define OP(name) OP_ ## name -#define NEXT(i) CODES[NEXT_OP(i)](i) -static int tracing_enabled = 0; -</code></pre> +<pre><code>__code cbc_next(INTERP i){ + __code (*c)(INTERP) + c = CODES[(i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op)]; // c = NEXT(i) + goto c(i); +} -<pre><code>__code (* CODES[])(INTERP) = { - cbc_no_op, - cbc_const_i8, - cbc_const_i16, - cbc_const_i32, - cbc_const_i64, - cbc_const_n32, - cbc_const_n64, - cbc_const_s, - cbc_set, - cbc_extend_u8, - cbc_extend_u16, +__code cbc_const_i64(INTERP i){ + GET_REG(i->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2); + i->cur_op += 10; + goto cbc_next(i); +} + </code></pre> @@ -399,33 +412,24 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="datagearへの変換">DataGearへの変換</h2> +<h2 id="cbcmoarvmのcodegearテーブル">CbCMoarVMのCodeGearテーブル</h2> <ul> - <li>バイトコードに対応する命令をそれぞれCodeGearに変換していく.</li> - <li><code>OP(.*)</code>の<code>(.*)</code>の部分をCodeGearの名前として先頭に <code>cbc_</code> をつけた上で設定する.</li> - <li>cur_opなどはINTERPを経由してアクセスする様に修正する.</li> - <li>末尾の <code>NEXT</code> を次のCodeGearにアクセスする為に <code>cbc_next</code> に修正する.</li> + <li>CodeGearテーブルは引数としてINTERを受け取るCodeGearの配列として定義する</li> </ul> -<pre><code> -__code cbc_next(INTERP i){ - __code (*c)(INTERP) - c = CODES[(i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op)]; // c = NEXT(i) - goto c(i); -} -_code cbc_next(INTERP i){ - goto NEXT(i); -} - -__code cbc_const_i64(INTERP i){ - GET_REG(i->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2); - i->cur_op += 10; - goto cbc_next(i); -} - (i->reg_base[*((MVMuint16 *)(i->cur_op + 0))]).i64 = MVM_BC_get_I64(i->cur_op, 2); - i->cur_op += 10; - goto cbc_next(i); +<pre><code>__code (* CODES[])(INTERP) = { + cbc_no_op, + cbc_const_i8, + cbc_const_i16, + cbc_const_i32, + cbc_const_i64, + cbc_const_n32, + cbc_const_n64, + cbc_const_s, + cbc_set, + cbc_extend_u8, + cbc_extend_u16, </code></pre> @@ -601,26 +605,6 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="アレ">アレ</h2> - -<pre><code>100 MVM_STATIC_INLINE MVMint64 MVM_BC_get_I64(const MVMuint8 *cur_op, int offset) { -101 const MVMuint8 *const where = cur_op + offset; -102 #ifdef MVM_CAN_UNALIGNED_INT64 -103 return *(MVMint64 *)where; -104 #else -105 MVMint64 temp; -106 memmove(&temp, where, sizeof(MVMint64)); -107 return temp; -108 #endif -109 } -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> <h2 id="moarvmのデバッグ">MoarVMのデバッグ</h2> <ul> @@ -750,7 +734,7 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h1 id="フィボナッチの例題">フィボナッチの例題</h1> +<h2 id="フィボナッチの例題">フィボナッチの例題</h2> <ul> <li>フィボナッチの例題ではCbCMoarVMが劣る結果となった</li> @@ -801,6 +785,19 @@ <div class='slide'> <!-- _S9SLIDE_ --> +<h2 id="基本ブロックとcodegear">基本ブロックとCodeGear</h2> + +<ul> + <li>コンパイラなどでは, 関数あるいはループの先頭から, 別の関数呼び出し, あるいはジャンプするまでの間のコードを基本ブロックと呼ぶ</li> + <li>基本ブロックは入力に影響を受けず, 基本ブロックが決定したタイミングである決定的な処理を行う</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> <h2 id="まとめと今後の課題">まとめと今後の課題</h2> <ul> <li>継続と基本としたC言語 Continuation Based Cを用いてPerl6の処理系の一部を書き直した</li>