Mercurial > hg > Events > OSC2019
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が使われている |