# HG changeset patch # User Takahiro SHIMIZU # Date 1541697332 -32400 # Node ID 765dc5c49ae154e7ed97565e097b19530f2698ae # Parent f200e3702c5aae5bf3cc32256d9c48bc120f826d halfway add about test and debugging for MoarVM diff -r f200e3702c5a -r 765dc5c49ae1 Paper/anatofuz.pdf Binary file Paper/anatofuz.pdf has changed diff -r f200e3702c5a -r 765dc5c49ae1 Paper/anatofuz.tex --- a/Paper/anatofuz.tex Fri Nov 09 01:56:17 2018 +0900 +++ b/Paper/anatofuz.tex Fri Nov 09 02:15:32 2018 +0900 @@ -296,7 +296,10 @@ この処理ではディスパッチの箇所にコストが掛かってしまう. CbCをMoarVMに導入することで,バイトコード列を直接サブルーチンコールの列に置き換えてしまう事が可能である. これはCbCが基本ブロックの単位と対応している為である. -また段階的に現在8バイト列を1命令コードとして使用しているが,これを16バイトなどに拡張し2命令を同時に扱えるように実装する事なども可能である. +CbCでは現在ディスパッチを行うCodeSegmentであるcbc\_nextを利用しているが,Threaded Codeを実装するにあたり, +cbc\_nextと次のCodeSegmentに直接遷移するcbc\_fixt\_nextの実装を予定している. + +また段階的に現在8バイト列を1命令コードとして使用しているが,これを16バイトなどに拡張し2命令を同時に扱えるように実装する事なども検討している. %CbCはCodeSegmentで末尾最適化(Tail call optimization)を行う. %これはCodeSegmentは必ず関数呼び出しではなくgotoで次の状態に遷移する為にスタック領域の操作が必要とならない為である. @@ -319,6 +322,11 @@ MoarVMでthreaded codeを実現出来た場合,その箇所のみCbCプログラムとして切り出す事が可能である為perlccと似たツールを作成することも可能である. この場合,Perl6を通常動かした際とは異なりバイトコードインタプリタに到達する前の処理が無くなる為多少の高速化が望めると推測できる. +\section{MoarVMのデバッグ} + +MoarVM自体のデバッグはMoarVMのリポジトリにテストコードが付随していない為単体では実行不可能である. +本研究ではMoarVMのデバッグにおけるCデバッガの使用方法とMoarVMのテスト方法についても考案する. +  \subsection{MoarVMのBytecodeのデバッグ} moarに対してmoarvm bytecodeをdumpオプションを付けて読み込ませるとmoarvmのbytecodeがアセンブラの様に出力される. しかしこれはmoarvmが実行したbytecodeのトレースではなくmoarvm bytecodeを変換したものに過ぎない. @@ -380,7 +388,15 @@ CbCMoarVMの場合,CodeSegmentとして基本ブロックを記述出来る為オリジナルのMoarVMの様にswtich文のブロック中に書く必要性が無くなる. その為類似する命令系をコード分割し,モジュール化する事が可能である. -これは通常のインタプリタの実装と比べ可読性と言う意味とCodeSegmentを再利用ができ,さらに分割可能という意味でも利点である. +またCbCはgoto文で遷移する以外は通常のCの関数と同じ扱いをする事が可能である. +従ってCodeSegment内部の処理を別の箇所から使用する事も可能となる為再利用性も向上する. + +\subsection{ThreadeCode} +ThrededCodeを実装する場合,通常命令ディスパッチの箇所と,実際に実行される命令処理を大幅に変更しなければならない. +CbCを用いた実装の場合,命令処理はただのCodeSegmentの集合である. +その為CodeSegmentをThrededCodeに対応した並びとして選択する事ができれば命令処理部分の修正をほぼせずにThrededCodeを実現する事が可能である. + + \subsubsection{MoarVMのデバッグ} MoarVMのバイトコードインタプリタの箇所はオリジナルの実装ではラベルジャンプを用いて実装されている. @@ -409,12 +425,15 @@ \subsection{欠点} \subsubsection{CbCコンパイラ} -前章までに複数述べた通りCbCコンパイラが現在非常にバグを発生させやすい状態になっている. +本来処理系は広く使われる為に著名なOSSなどを利用して開発するのが良いが,CbCプロジェクトの認知度が低いという現状がある. + +また,前章までに複数述べた通りCbCコンパイラが現在非常にバグを発生させやすい状態になっている. CbCコンパイラはgccとllvm/clangに実装している為,これらのアップデートに追従する必要がある. しかしコンパイラのバージョンに応じてCbCで利用するコンパイラ内のAPIが異なる場合が多く,APIの変更に伴う修正作業などを行う必要がある. CbCMoarVMではCからCodeSegmentへ,CodeSegmentからCへの遷移などが複数回繰り返されているが,この処理中のCodeSegmentでのtail callの強制が非常に難関である. tail callの強制には関数定義の箇所や引数,スタック領域のサイズ修正などを行う必要がある. +現在のバグではCodeSegment内部での不要なスタック操作命令を完全に排除しきれていない. \section{今後の課題}