# HG changeset patch # User anatofuz # Date 1555683722 -32400 # Node ID a176ea5c026416c542f17b48fb8b5ae745ae0e49 # Parent d3036d99823691138e1a01424e8816afb00700fc update diff -r d3036d998236 -r a176ea5c0264 slide.html --- 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 @@
00008      smrt_numify        loc_4_num, loc_3_obj
 
+ + +

+ + + + + +
+ +

MoarVMのバイトコードインタプリタ部分

+

MoarVMなどの言語処理系のバイトコードインタプリタは次のことを繰り返している

+
    +
  1. 入力されたバイトコード列から命令に対応する部分を読み取る
  2. +
  3. 読み込んだ数値から、 対応する命令を取得する
  4. +
  5. 命令部分を実行する
  6. +
  7. バイトコード列を次に進め、繰り返す
  8. +
+ + + + + +
+ +
+ +

巨大なswitch文を使うケース

+ + + +

+
+ + + +
+ +
+ +

Cコンパイラのラベルgotoを使うケース

+ + + +

+
+ + + +
+ +
+ +

MoarVMでは

+
diff -r d3036d998236 -r a176ea5c0264 slide.md --- 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が使われている diff -r d3036d998236 -r a176ea5c0264 slide.pdf.html --- 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 @@
00008      smrt_numify        loc_4_num, loc_3_obj
 
+ + +

+ + + + + +
+ +

MoarVMのバイトコードインタプリタ部分

+

MoarVMなどの言語処理系のバイトコードインタプリタは次のことを繰り返している

+
    +
  1. 入力されたバイトコード列から命令に対応する部分を読み取る
  2. +
  3. 読み込んだ数値から、 対応する命令を取得する
  4. +
  5. 命令部分を実行する
  6. +
  7. バイトコード列を次に進め、繰り返す
  8. +
+ + + + + +
+ +
+ +

巨大なswitch文を使うケース

+ + + +

+
+ + + +
+ +
+ +

Cコンパイラのラベルgotoを使うケース

+ + + +

+
+ + + +
+ +
+ +

MoarVMでは

+