annotate paper/chapter5.tex @ 68:95a686c0087f

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