comparison 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
comparison
equal deleted inserted replaced
14:d3036d998236 17:a176ea5c0264
410 ``` 410 ```
411 00008 smrt_numify loc_4_num, loc_3_obj 411 00008 smrt_numify loc_4_num, loc_3_obj
412 ``` 412 ```
413 413
414 414
415 - `smrt_numify` はレジスタ上のオブジェクトを、 num型に変換し、 別のレジスタに登録する命令
416 - 今回の整数の比較では、 int型の強制がない為、 数値として比較するためにnum型にキャストしている
417
418 ![](fig/perl6_num_convert.svg)
419
420 ## MoarVMのバイトコードインタプリタ部分
421 MoarVMなどの言語処理系のバイトコードインタプリタは次のことを繰り返している
422 1. 入力されたバイトコード列から命令に対応する部分を読み取る
423 2. 読み込んだ数値から、 対応する命令を取得する
424 3. 命令部分を実行する
425 4. バイトコード列を次に進め、繰り返す
426
427 - この部分の実装は大体次のような処理をしている
428
429 ## 巨大なswitch文を使うケース
430
431 - 命令に対応するバイトコードを数値に変換できるようにし、 switch-case文で分岐させる
432 - 実行のたびにループで先頭に戻り、次の命令を計算する必要があるので低速
433
434 ```
435 ```
436
437 ## Cコンパイラのラベルgotoを使うケース
438
439 - 巨大なcase文とループではなく、 次の命令の実行場所に直接jmpで移動する
440 - 次の命令に対応するラベルを取得する必要があるが、 ループする必要がなく高速
441 - ラベルgotoであり、 Cコンパイラの拡張機能として搭載されている
442 - gccおよびLLVM/clangには実装されている
443
444 ```
445 ```
446
447 ## MoarVMでは
448 - ラベルgotoが利用できる場合は利用する
449 - 使えないコンパイラの場合は、 switch文を利用する
450 - この判断はマクロで処理をしている
451 − 一般的にはラベルgotoの方が高速である為、他のスクリプト言語でもラベルgotoが使われている