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
Binary file presen/fig/cbc_next.pdf has changed
--- 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>
 
-&lt;img src=”fig/origin_label_goto.svg” width=”30%” text-align:center;padding-left: 300px;&gt;
+<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
Binary file presen/slide.pdf has changed
--- 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>&lt;img src=”fig/origin_label_goto.svg” width=”30%” text-align:center;padding-left: 300px;&gt;</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