59
|
1 \chapter{CbCMoarVMの評価}
|
64
|
2 前章までに、 MoarVMの一部処理をCbCでの書き換えを検討した。
|
|
3 本章では、 CbCMoarVMの評価を行う。
|
59
|
4
|
63
|
5 \section{命令処理のモジュール化}
|
64
|
6 MoarVMの命令コードディスパッチ部分は、 当初はcase文やラベルgotに変換されるため、 1ファイルの記述せざるを得なかった。
|
|
7 書き換えたCodeGearは、 関数の様にCbCから扱う事が可能である。
|
65
|
8 MoarVMの命j令コードディスパッチでは、 命令に対応する数値を利用して、 case文又は配列から実行するラベルなどを取り出していた。
|
|
9 CbCMoarVMでは、 CodeGearの集合である配列を用意している。
|
|
10 この配列の登録順のみ対応させれば、 CbCMoarVM内の命令に対応するCodeGearの書く場所は問わなくなる。
|
64
|
11 そのため、 命令処理部分を別ファイルに書き出すなどのモジュール化が可能となった。
|
|
12
|
67
|
13 モジュール化が可能となったことで、 ディスパッチ部分の処理と実際に実行する命令で関数を分離出来た。
|
|
14 これにより、 ソースコード上の可読性や、 適切なスコープ管理などがオリジナルのMoarVMと比較し可能となった。
|
|
15
|
|
16 \section{CbCMoarVMのデバッグ}j
|
66
|
17 主要なデバッガであるgdbやlldbでは、 関数には直接break pointを設定する事が可能である。
|
|
18 MoarVMのバイトコードディスパッチ部分はcase文やラベルgotoに変換され、 関数として扱う事が出来ない。
|
67
|
19 従って、 命令に対応する処理部分でbreak pointを設定を行う場合、 まず処理が書かれているMVM\_interp\_run関数にbreak pointを設置する必要がある。
|
66
|
20 プロセス起動後、 関数が書かれているinterp.cファイル中の行番号を指定してbreak pointを付けなければならない。
|
67
|
21 また、ディスパッチでは数値又はラベルを利用している。
|
|
22 この事から、 ソースコード\ref{origi_breakpoint}に示すように、 デバッガ上で直接どの命令を実行するか確認をする事が困難である。
|
|
23
|
|
24 \lstinputlisting[frame=lrbt, label=origi_breakpoint, caption=MoarVMのbreak pointトレース時の表示]{./codes/src/origin_breakpoint.txt}
|
66
|
25
|
|
26
|
|
27 CodeGearは関数として扱う事ができる為、 break pointとして直接設定する事が可能である。
|
|
28 また、 gdbなどのデバッガは、 実行するべき関数名を表示する事が可能であるため、 CodeGearの名前も表示可能である。
|
|
29 CodeGear名は命令と対応している為、 CodeGear名から命令名を推測する事が可能となった。
|
67
|
30 実際にデバッガ上の表示を、 ソースコード\ref{cbc_breakpoint}に示す。
|
|
31
|
|
32
|
|
33 \lstinputlisting[frame=lrbt, label=cbc_breakpoint, caption=CbCMoarVMのbreak pointトレース時の表示]{./codes/src/trace_cbc.txt}
|
66
|
34
|
63
|
35 \section{パフォーマンス}
|
65
|
36
|
67
|
37 なぜか高速化した
|
|
38
|
65
|
39 \section{Threaded Code}
|
|
40
|
|
41 \section{欠点}
|
67
|
42
|
|
43 CbCはC言語の下位言語であり、 一種のアセンブラの様な言語である。
|
|
44 通常のC言語では、 関数呼び出しで隠蔽されているデータを意識してCodeGearに接続しなければならない。
|
|
45 その為、 C言語で実装を行うより実装で利用する処理やCodeGearの数が増えてしまう。
|
68
|
46
|
|
47 今回の実装では、 MoarVMの情報をまとめた構造体のポインタを受け渡す実装で行った。
|
|
48 別の実装法として、構造体のポインタでなく、 構造体そのものを受け渡す実装に変更し、 挙動を確認した。
|
|
49 この構造体のメンバは、 一部メンバの内部で同じメンバを参照している。
|
|
50 ポインタの受け渡しでは同期が出来ているが、 構造体そのものを渡してしまうと同期が出来ない。
|
|
51 その為、 構造体のメンバを、 ソースコード\ref{cbc_sync}に示すように、 都度代入しなおす必要が生じた。
|
|
52 この様にCbCを適応した場合、 データの受け渡しを非常に意識する必要がある。
|
|
53
|
|
54 \lstinputlisting[frame=lrbt, label=cbc_sync, caption=CbCMoarVMのデータ同期]{./codes/sync.c}
|
|
55
|