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(&amp;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-&gt;op = *(MVMuint16 *)(i-&gt;cur_op), i-&gt;cur_op += 2, i-&gt;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-&gt;op = *(MVMuint16 *)(i-&gt;cur_op), i-&gt;cur_op += 2, i-&gt;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-&gt;cur_op, 0,i).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
+    i-&gt;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-&gt;op = *(MVMuint16 *)(i-&gt;cur_op), i-&gt;cur_op += 2, i-&gt;op)]; // c = NEXT(i)
-    goto c(i);
-}
-_code cbc_next(INTERP i){
-    goto NEXT(i);
-}
-
-__code cbc_const_i64(INTERP i){
-    GET_REG(i-&gt;cur_op, 0,i).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
-    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);
+<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(&amp;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(&amp;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-&gt;op = *(MVMuint16 *)(i-&gt;cur_op), i-&gt;cur_op += 2, i-&gt;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-&gt;op = *(MVMuint16 *)(i-&gt;cur_op), i-&gt;cur_op += 2, i-&gt;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-&gt;cur_op, 0,i).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
+    i-&gt;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-&gt;op = *(MVMuint16 *)(i-&gt;cur_op), i-&gt;cur_op += 2, i-&gt;op)]; // c = NEXT(i)
-    goto c(i);
-}
-_code cbc_next(INTERP i){
-    goto NEXT(i);
-}
-
-__code cbc_const_i64(INTERP i){
-    GET_REG(i-&gt;cur_op, 0,i).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
-    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);
+<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(&amp;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>