changeset 17:a176ea5c0264

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 19 Apr 2019 23:22:02 +0900
parents d3036d998236
children 1fc9d0bd924f
files slide.html slide.md slide.pdf.html
diffstat 3 files changed, 195 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/slide.html	Fri Apr 19 20:44:24 2019 +0900
+++ b/slide.html	Fri Apr 19 23:22:02 2019 +0900
@@ -747,6 +747,85 @@
 <pre><code>00008      smrt_numify        loc_4_num, loc_3_obj
 </code></pre>
 
+<ul>
+  <li><code>smrt_numify</code> はレジスタ上のオブジェクトを、 num型に変換し、 別のレジスタに登録する命令</li>
+  <li>今回の整数の比較では、 int型の強制がない為、 数値として比較するためにnum型にキャストしている</li>
+</ul>
+
+<p><img src="fig/perl6_num_convert.svg" alt="" /></p>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="moarvmのバイトコードインタプリタ部分">MoarVMのバイトコードインタプリタ部分</h2>
+<p>MoarVMなどの言語処理系のバイトコードインタプリタは次のことを繰り返している</p>
+<ol>
+  <li>入力されたバイトコード列から命令に対応する部分を読み取る</li>
+  <li>読み込んだ数値から、 対応する命令を取得する</li>
+  <li>命令部分を実行する</li>
+  <li>バイトコード列を次に進め、繰り返す</li>
+</ol>
+
+<ul>
+  <li>この部分の実装は大体次のような処理をしている</li>
+</ul>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="巨大なswitch文を使うケース">巨大なswitch文を使うケース</h2>
+
+<ul>
+  <li>命令に対応するバイトコードを数値に変換できるようにし、 switch-case文で分岐させる</li>
+  <li>実行のたびにループで先頭に戻り、次の命令を計算する必要があるので低速</li>
+</ul>
+
+<pre><code>
+</code></pre>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="cコンパイラのラベルgotoを使うケース">Cコンパイラのラベルgotoを使うケース</h2>
+
+<ul>
+  <li>巨大なcase文とループではなく、 次の命令の実行場所に直接jmpで移動する</li>
+  <li>次の命令に対応するラベルを取得する必要があるが、 ループする必要がなく高速</li>
+  <li>ラベルgotoであり、 Cコンパイラの拡張機能として搭載されている
+    <ul>
+      <li>gccおよびLLVM/clangには実装されている</li>
+    </ul>
+  </li>
+</ul>
+
+<pre><code>
+</code></pre>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="moarvmでは">MoarVMでは</h2>
+<ul>
+  <li>ラベルgotoが利用できる場合は利用する</li>
+  <li>使えないコンパイラの場合は、 switch文を利用する
+    <ul>
+      <li>この判断はマクロで処理をしている</li>
+    </ul>
+  </li>
+  <li>一般的にはラベルgotoの方が高速である為、他のスクリプト言語でもラベルgotoが使われている</li>
+</ul>
 
 </div>
 
--- a/slide.md	Fri Apr 19 20:44:24 2019 +0900
+++ b/slide.md	Fri Apr 19 23:22:02 2019 +0900
@@ -412,3 +412,40 @@
 ```
 
 
+- `smrt_numify` はレジスタ上のオブジェクトを、 num型に変換し、 別のレジスタに登録する命令
+- 今回の整数の比較では、 int型の強制がない為、 数値として比較するためにnum型にキャストしている
+
+![](fig/perl6_num_convert.svg)
+
+## MoarVMのバイトコードインタプリタ部分
+MoarVMなどの言語処理系のバイトコードインタプリタは次のことを繰り返している
+1. 入力されたバイトコード列から命令に対応する部分を読み取る
+2. 読み込んだ数値から、 対応する命令を取得する
+3. 命令部分を実行する
+4. バイトコード列を次に進め、繰り返す
+
+- この部分の実装は大体次のような処理をしている
+
+## 巨大なswitch文を使うケース
+
+- 命令に対応するバイトコードを数値に変換できるようにし、 switch-case文で分岐させる
+- 実行のたびにループで先頭に戻り、次の命令を計算する必要があるので低速
+
+```
+```
+
+## Cコンパイラのラベルgotoを使うケース
+
+- 巨大なcase文とループではなく、 次の命令の実行場所に直接jmpで移動する
+- 次の命令に対応するラベルを取得する必要があるが、 ループする必要がなく高速
+- ラベルgotoであり、 Cコンパイラの拡張機能として搭載されている
+    - gccおよびLLVM/clangには実装されている
+
+```
+```
+
+## MoarVMでは
+- ラベルgotoが利用できる場合は利用する
+- 使えないコンパイラの場合は、 switch文を利用する
+    - この判断はマクロで処理をしている
+− 一般的にはラベルgotoの方が高速である為、他のスクリプト言語でもラベルgotoが使われている
--- a/slide.pdf.html	Fri Apr 19 20:44:24 2019 +0900
+++ b/slide.pdf.html	Fri Apr 19 23:22:02 2019 +0900
@@ -731,6 +731,85 @@
 <pre><code>00008      smrt_numify        loc_4_num, loc_3_obj
 </code></pre>
 
+<ul>
+  <li><code>smrt_numify</code> はレジスタ上のオブジェクトを、 num型に変換し、 別のレジスタに登録する命令</li>
+  <li>今回の整数の比較では、 int型の強制がない為、 数値として比較するためにnum型にキャストしている</li>
+</ul>
+
+<p><img src="fig/perl6_num_convert.svg" alt="" /></p>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="moarvmのバイトコードインタプリタ部分">MoarVMのバイトコードインタプリタ部分</h2>
+<p>MoarVMなどの言語処理系のバイトコードインタプリタは次のことを繰り返している</p>
+<ol>
+  <li>入力されたバイトコード列から命令に対応する部分を読み取る</li>
+  <li>読み込んだ数値から、 対応する命令を取得する</li>
+  <li>命令部分を実行する</li>
+  <li>バイトコード列を次に進め、繰り返す</li>
+</ol>
+
+<ul>
+  <li>この部分の実装は大体次のような処理をしている</li>
+</ul>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="巨大なswitch文を使うケース">巨大なswitch文を使うケース</h2>
+
+<ul>
+  <li>命令に対応するバイトコードを数値に変換できるようにし、 switch-case文で分岐させる</li>
+  <li>実行のたびにループで先頭に戻り、次の命令を計算する必要があるので低速</li>
+</ul>
+
+<pre><code>
+</code></pre>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="cコンパイラのラベルgotoを使うケース">Cコンパイラのラベルgotoを使うケース</h2>
+
+<ul>
+  <li>巨大なcase文とループではなく、 次の命令の実行場所に直接jmpで移動する</li>
+  <li>次の命令に対応するラベルを取得する必要があるが、 ループする必要がなく高速</li>
+  <li>ラベルgotoであり、 Cコンパイラの拡張機能として搭載されている
+    <ul>
+      <li>gccおよびLLVM/clangには実装されている</li>
+    </ul>
+  </li>
+</ul>
+
+<pre><code>
+</code></pre>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="moarvmでは">MoarVMでは</h2>
+<ul>
+  <li>ラベルgotoが利用できる場合は利用する</li>
+  <li>使えないコンパイラの場合は、 switch文を利用する
+    <ul>
+      <li>この判断はマクロで処理をしている</li>
+    </ul>
+  </li>
+  <li>一般的にはラベルgotoの方が高速である為、他のスクリプト言語でもラベルgotoが使われている</li>
+</ul>
 
 </div>