Mercurial > hg > Papers > 2019 > anatofuz-prosym
changeset 93:c3b973a23fee
update
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 11 Jan 2019 10:41:24 +0900 |
parents | 2387a5edfd58 |
children | 4f0eaa330295 |
files | Slide/slide.html Slide/slide.md Slide/slide.pdf.html |
diffstat | 3 files changed, 125 insertions(+), 117 deletions(-) [+] |
line wrap: on
line diff
--- a/Slide/slide.html Fri Jan 11 10:07:22 2019 +0900 +++ b/Slide/slide.html Fri Jan 11 10:41:24 2019 +0900 @@ -189,21 +189,16 @@ <ul> <li>Perl6専用のVMであり, Cで記述されている</li> <li>レジスタマシンとして実装されている.</li> - <li>MoarVMはバイトコードインタプリタを <code>src/core/interp.c</code> で定義しており, この中の関数 <code>MVM_interp_run</code> でバイトコードに応じた処理を実行する</li> -</ul> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="mvm_interp_run">MVM_interp_run</h2> - -<ul> - <li>DISPATCHマクロは次の様に記述されており, この中の <code>OP</code> で宣言されたブロックがそれぞれオペコードに対応する処理となっている.</li> + <li> + MoarVMはバイトコードインタプリタを <code>src/core/interp.c</code> で定義しており, この中の関数 <code>MVM_interp_run</code> でバイトコードに応じた処理を実行する + </li> + <li>マクロDISPATCHで, ラベルgotoかcase文に, バイトコードに対応した処理を行う + <ul> + <li>この中の <code>OP</code> で宣言されたブロックがそれぞれバイトコードに対応する処理となっている.</li> + </ul> + </li> <li>この中では <code>GET_REG</code> などのマクロを用いてMoarVMのレジスタにアクセスする.</li> - <li><code>cur_op</code>は次のオペコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のオペコードに遷移する.</li> + <li><code>cur_op</code>は次のバイトコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のバイトコードに対応した処理に遷移する.</li> </ul> <pre><code>DISPATCH(NEXT_OP) { @@ -224,6 +219,9 @@ <h2 id="mvm_interp_runで使用されているマクロ">MVM_interp_runで使用されているマクロ</h2> <ul> + <li> + マクロDISPATCHでは + </li> <li>MVM_interp_runではマクロを利用してMoarVMの環境などにアクセスしている</li> <li>頻出するマクロに <code>GET_REG</code> があり, 次のような使い方をする</li> </ul> @@ -234,13 +232,41 @@ </code></pre> <ul> - <li>これはバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする</li> - <li><code>reg_base</code> はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, 本来のMVM_interp_runではローカル変数として利用している</li> + <li><code>GET_REG</code>はバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする</li> + <li><code>GET_REG</code>は次の様に展開される</li> +</ul> + +<pre><code> reg_base[*((MVMuint16 *)(cur_op + 0))].i64 = MVM_BC_get_I64(cur_op, 2); + +</code></pre> + +<ul> + <li><code>reg_base</code> はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, MVM_interp_runではローカル変数として利用している</li> </ul> -<pre><code> (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); + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="mvm_interp_runで使用されているマクロ-1">MVM_interp_runで使用されているマクロ</h2> + +<ul> + <li>次のバイトコード命令に遷移するマクロ <code>NEXT</code> は, ラベルgotoが使用可能な場合次の様に記述されている</li> + <li><code>NEXT</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> +</ul> + +<pre><code>goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)]; </code></pre> @@ -249,33 +275,7 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="mvm_interp_run-1">MVM_interp_run</h2> - -<ul> - <li>MVM_interp_runでは次のオペコードをフェッチする際に <code>NEXT_OP</code> マクロを介して計算を行う.</li> - <li>オペコードが対応する命令を実行する際は, <code>MVM_CGOTO</code> フラグが立っている場合はCのラベルgotoを利用し, 使えない場合はswitch文を利用して遷移する.</li> -</ul> - -<pre><code>#define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) - -#if MVM_CGOTO -#define DISPATCH(op) -#define OP(name) OP_ ## name -#define NEXT *LABELS[NEXT_OP] -#else -#define DISPATCH(op) switch (op) -#define OP(name) case MVM_OP_ ## name -#define NEXT runloop -#endif -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="mvm_interp_run-2">MVM_interp_run</h2> +<h2 id="mvm_interp_run">MVM_interp_run</h2> <ul> <li>ラベル遷移を利用する場合は配列<code>LABELS</code>にアクセスし, ラベル情報を取得する</li> @@ -304,7 +304,7 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="mvm_interp_run-3">MVM_interp_run</h2> +<h2 id="mvm_interp_run-1">MVM_interp_run</h2> <ul> <li>Cの実装の場合, switch文に展開される可能性がある為, 命令ディスパッチが書かれているCソース・ファイルの指定の場所にのみ処理を記述せざるを得ない @@ -410,6 +410,9 @@ 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); </code></pre>
--- a/Slide/slide.md Fri Jan 11 10:07:22 2019 +0900 +++ b/Slide/slide.md Fri Jan 11 10:41:24 2019 +0900 @@ -63,11 +63,10 @@ - レジスタマシンとして実装されている. - MoarVMはバイトコードインタプリタを `src/core/interp.c` で定義しており, この中の関数 `MVM_interp_run` でバイトコードに応じた処理を実行する -## MVM_interp_run - -- DISPATCHマクロは次の様に記述されており, この中の `OP` で宣言されたブロックがそれぞれオペコードに対応する処理となっている. +- マクロDISPATCHで, ラベルgotoかcase文に, バイトコードに対応した処理を行う + - この中の `OP` で宣言されたブロックがそれぞれバイトコードに対応する処理となっている. - この中では `GET_REG` などのマクロを用いてMoarVMのレジスタにアクセスする. -- `cur_op`は次のオペコード列が登録されており, マクロ `NEXT` で決められた方法で次のオペコードに遷移する. +- `cur_op`は次のバイトコード列が登録されており, マクロ `NEXT` で決められた方法で次のバイトコードに対応した処理に遷移する. ``` DISPATCH(NEXT_OP) { @@ -81,6 +80,8 @@ ## MVM_interp_runで使用されているマクロ +- マクロDISPATCHでは + - MVM_interp_runではマクロを利用してMoarVMの環境などにアクセスしている - 頻出するマクロに `GET_REG` があり, 次のような使い方をする @@ -90,36 +91,34 @@ cur_op += 10; ``` -- これはバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする -- `reg_base` はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, 本来のMVM_interp_runではローカル変数として利用している +- `GET_REG`はバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする +- `GET_REG`は次の様に展開される + +``` + reg_base[*((MVMuint16 *)(cur_op + 0))].i64 = MVM_BC_get_I64(cur_op, 2); ``` - (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); -``` +- `reg_base` はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, MVM_interp_runではローカル変数として利用している -## MVM_interp_run +## MVM_interp_runで使用されているマクロ -- MVM_interp_runでは次のオペコードをフェッチする際に `NEXT_OP` マクロを介して計算を行う. -- オペコードが対応する命令を実行する際は, `MVM_CGOTO` フラグが立っている場合はCのラベルgotoを利用し, 使えない場合はswitch文を利用して遷移する. - +- 次のバイトコード命令に遷移するマクロ `NEXT` は, ラベルgotoが使用可能な場合次の様に記述されている +- `NEXT`自体はラベルテーブルにアクセスし, ラベルを取り出す +- 次のバイトコードを取り出すのは, `NEXT_OP` というマクロが担っている ``` #define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) +#define NEXT *LABELS[NEXT_OP] -#if MVM_CGOTO -#define DISPATCH(op) -#define OP(name) OP_ ## name -#define NEXT *LABELS[NEXT_OP] -#else -#define DISPATCH(op) switch (op) -#define OP(name) case MVM_OP_ ## name -#define NEXT runloop -#endif +``` +- マクロ `NEXT` は次の様に展開される + ``` +goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)]; +``` + ## MVM_interp_run @@ -229,6 +228,9 @@ 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
--- a/Slide/slide.pdf.html Fri Jan 11 10:07:22 2019 +0900 +++ b/Slide/slide.pdf.html Fri Jan 11 10:41:24 2019 +0900 @@ -173,21 +173,16 @@ <ul> <li>Perl6専用のVMであり, Cで記述されている</li> <li>レジスタマシンとして実装されている.</li> - <li>MoarVMはバイトコードインタプリタを <code>src/core/interp.c</code> で定義しており, この中の関数 <code>MVM_interp_run</code> でバイトコードに応じた処理を実行する</li> -</ul> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="mvm_interp_run">MVM_interp_run</h2> - -<ul> - <li>DISPATCHマクロは次の様に記述されており, この中の <code>OP</code> で宣言されたブロックがそれぞれオペコードに対応する処理となっている.</li> + <li> + <p>MoarVMはバイトコードインタプリタを <code>src/core/interp.c</code> で定義しており, この中の関数 <code>MVM_interp_run</code> でバイトコードに応じた処理を実行する</p> + </li> + <li>マクロDISPATCHで, ラベルgotoかcase文に, バイトコードに対応した処理を行う + <ul> + <li>この中の <code>OP</code> で宣言されたブロックがそれぞれバイトコードに対応する処理となっている.</li> + </ul> + </li> <li>この中では <code>GET_REG</code> などのマクロを用いてMoarVMのレジスタにアクセスする.</li> - <li><code>cur_op</code>は次のオペコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のオペコードに遷移する.</li> + <li><code>cur_op</code>は次のバイトコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のバイトコードに対応した処理に遷移する.</li> </ul> <pre><code>DISPATCH(NEXT_OP) { @@ -208,6 +203,9 @@ <h2 id="mvm_interp_runで使用されているマクロ">MVM_interp_runで使用されているマクロ</h2> <ul> + <li> + <p>マクロDISPATCHでは</p> + </li> <li>MVM_interp_runではマクロを利用してMoarVMの環境などにアクセスしている</li> <li>頻出するマクロに <code>GET_REG</code> があり, 次のような使い方をする</li> </ul> @@ -218,13 +216,41 @@ </code></pre> <ul> - <li>これはバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする</li> - <li><code>reg_base</code> はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, 本来のMVM_interp_runではローカル変数として利用している</li> + <li><code>GET_REG</code>はバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする</li> + <li><code>GET_REG</code>は次の様に展開される</li> +</ul> + +<pre><code> reg_base[*((MVMuint16 *)(cur_op + 0))].i64 = MVM_BC_get_I64(cur_op, 2); + +</code></pre> + +<ul> + <li><code>reg_base</code> はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, MVM_interp_runではローカル変数として利用している</li> </ul> -<pre><code> (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); + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="mvm_interp_runで使用されているマクロ-1">MVM_interp_runで使用されているマクロ</h2> + +<ul> + <li>次のバイトコード命令に遷移するマクロ <code>NEXT</code> は, ラベルgotoが使用可能な場合次の様に記述されている</li> + <li><code>NEXT</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> +</ul> + +<pre><code>goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)]; </code></pre> @@ -233,33 +259,7 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="mvm_interp_run-1">MVM_interp_run</h2> - -<ul> - <li>MVM_interp_runでは次のオペコードをフェッチする際に <code>NEXT_OP</code> マクロを介して計算を行う.</li> - <li>オペコードが対応する命令を実行する際は, <code>MVM_CGOTO</code> フラグが立っている場合はCのラベルgotoを利用し, 使えない場合はswitch文を利用して遷移する.</li> -</ul> - -<pre><code>#define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) - -#if MVM_CGOTO -#define DISPATCH(op) -#define OP(name) OP_ ## name -#define NEXT *LABELS[NEXT_OP] -#else -#define DISPATCH(op) switch (op) -#define OP(name) case MVM_OP_ ## name -#define NEXT runloop -#endif -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="mvm_interp_run-2">MVM_interp_run</h2> +<h2 id="mvm_interp_run">MVM_interp_run</h2> <ul> <li>ラベル遷移を利用する場合は配列<code>LABELS</code>にアクセスし, ラベル情報を取得する</li> @@ -288,7 +288,7 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="mvm_interp_run-3">MVM_interp_run</h2> +<h2 id="mvm_interp_run-1">MVM_interp_run</h2> <ul> <li>Cの実装の場合, switch文に展開される可能性がある為, 命令ディスパッチが書かれているCソース・ファイルの指定の場所にのみ処理を記述せざるを得ない @@ -394,6 +394,9 @@ 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); </code></pre>