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-&gt;reg_base[*((MVMuint16 *)(i-&gt;cur_op + 0))]).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
-    i-&gt;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-&gt;cur_op += 10;
     goto cbc_next(i);
 }
+    (i-&gt;reg_base[*((MVMuint16 *)(i-&gt;cur_op + 0))]).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
+    i-&gt;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-&gt;reg_base[*((MVMuint16 *)(i-&gt;cur_op + 0))]).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
-    i-&gt;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-&gt;cur_op += 10;
     goto cbc_next(i);
 }
+    (i-&gt;reg_base[*((MVMuint16 *)(i-&gt;cur_op + 0))]).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
+    i-&gt;cur_op += 10;
+    goto cbc_next(i);
 </code></pre>