# HG changeset patch # User Takahiro SHIMIZU # Date 1543480518 -32400 # Node ID 6656f4c3dfa0b48e3976448e8f083335232fe792 # Parent ddf88af2253ec394bded45cfb8d678f18f740347 update diff -r ddf88af2253e -r 6656f4c3dfa0 Paper/anatofuz.pdf Binary file Paper/anatofuz.pdf has changed diff -r ddf88af2253e -r 6656f4c3dfa0 Paper/anatofuz.tex --- a/Paper/anatofuz.tex Thu Nov 29 17:19:19 2018 +0900 +++ b/Paper/anatofuz.tex Thu Nov 29 17:35:18 2018 +0900 @@ -341,9 +341,8 @@ ラベル遷移を利用する場合はCode\ref{oplabelsh}に示すラベルテーブルLABELSにアクセスし, テーブルに登録されているアドレスを取得し, マクロNEXTで遷移する. Code\ref{dispatch_c}に示すno\_opは何もせず次の命令に移動する為, goto NEXT;のみ記述されている. -このラベルテーブルの中身はラベルが変換されたアドレスであるため, 実際に呼ばれている命令コードの名前はデバッガレベルでは確認できない. -Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる. -巨大なcase文として実行された場合, 実行時間が遅いだけでなく, ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する. +%このラベルテーブルの中身はラベルが変換されたアドレスであるため, 実際に呼ばれている命令コードの名前はデバッガレベルでは確認できない. +%巨大なcase文として実行された場合, 実行時間が遅いだけでなく, ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する. \lstinputlisting[label=orig_macro, caption=interp.cのマクロ部分]{./src/orig_macro.c} @@ -354,7 +353,9 @@ interp.cでは命令コードのディスパッチはマクロを利用したcur\_opの計算及びラベルの遷移, もしくはマクロDISPATCHが展開するswitch文で行われていた. この為MoarVM内の命令コードに対応する処理は, 命令ディスパッチが書かれているCソースファイルの, 特定の場所のみに記述せざるを得ない. その為命令コードのモジュール化などが行えず, 1ファイル辺りの記述量が膨大になってしまう. -またラベルジャンプもしくはswitch文に展開されてしまう為, 別のCソースファイルからの処理の再利用が出来ない. +また各命令コードに対応する処理は, ラベルジャンプもしくはswitch文に展開されてしまう為, Threaded Codeの実装を考えた場合, 大幅なコードの改修が要求される. +デバッグ時には, Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる. + CbCMoarVMではこの問題を解決するために, それぞれの命令に対応するCodeGearを作成し, 各CodeGearの名前を要素として持つCbCのCodeGearのテーブルを作成した. このCodeGearのテーブルを参照するCodeGearはcbc\_nextであり, この中のマクロNEXTはinterp.cのマクロNEXTをCbC用に書き直したものである. @@ -378,7 +379,7 @@ \lstinputlisting[label=cbcoplabelsh, caption=CodeGear配列の一部分]{./src/oplables-cbc-codes.h} -命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している. +Code\ref{cbc_codesegs_c}に示す, 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している. ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが, CodeGear間の移動で命令を表現するCbCではアクセスできない. その為Code\ref{interp}に示す様に, インタプリタの情報を集約した構造体interを定義する. この構造体へのポインタであるINTERP型の変数iをCodeGearの入出力として与える. @@ -435,8 +436,8 @@ \section{MoarVMのデバッグ} MoarVM自体のデバッグはMoarVMのリポジトリにテストコードが付随していない為単体では実行不可能である. -また, CbCを用いて言語処理系の改良時を行った際に言語処理系のデバッグを行う場合は, CbCを用いないオリジナルの処理系との並列デバッグが必要となる. -MoarVM自体にはデバッグを支援するツールが存在しない為, MoarVM自体のデバッグ方法や, CbCを用いた処理系との並列デバッグについて独自の手法を利用する必要がある. +また, CbCを用いて言語処理系の改良時を行う際に, 処理系のデバッグを行う場合は, CbCを用いないオリジナルの処理系との並列デバッグが必要となる. +MoarVM自体にはデバッグを支援するツールが存在しない為, MoarVM自体のデバッグ方法や, CbCを用いた処理系との並列デバッグについて独自の手法を考案する必要がある. 本稿ではMoarVMのデバッグにおけるCデバッガの使用方法とMoarVMのテスト方法についても示す. \subsection{MoarVMのバイトコードのデバッグ}