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が使われている