Mercurial > hg > Events > OSC2019
diff slide.md @ 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 |
line wrap: on
line diff
--- 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が使われている