Mercurial > hg > Events > OSC2019
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>