Mercurial > hg > Papers > 2019 > anatofuz-prosym
comparison Paper/anatofuz.tex @ 29:765dc5c49ae1
halfway add about test and debugging for MoarVM
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 09 Nov 2018 02:15:32 +0900 |
parents | f200e3702c5a |
children | 5b5fb929c67f |
comparison
equal
deleted
inserted
replaced
28:f200e3702c5a | 29:765dc5c49ae1 |
---|---|
294 \subsection{Threaded Code} | 294 \subsection{Threaded Code} |
295 現在のMoarVMは次の命令をバイトコードからディスパッチし決定後,ラベルジャンプを利用し実行している. | 295 現在のMoarVMは次の命令をバイトコードからディスパッチし決定後,ラベルジャンプを利用し実行している. |
296 この処理ではディスパッチの箇所にコストが掛かってしまう. | 296 この処理ではディスパッチの箇所にコストが掛かってしまう. |
297 CbCをMoarVMに導入することで,バイトコード列を直接サブルーチンコールの列に置き換えてしまう事が可能である. | 297 CbCをMoarVMに導入することで,バイトコード列を直接サブルーチンコールの列に置き換えてしまう事が可能である. |
298 これはCbCが基本ブロックの単位と対応している為である. | 298 これはCbCが基本ブロックの単位と対応している為である. |
299 また段階的に現在8バイト列を1命令コードとして使用しているが,これを16バイトなどに拡張し2命令を同時に扱えるように実装する事なども可能である. | 299 CbCでは現在ディスパッチを行うCodeSegmentであるcbc\_nextを利用しているが,Threaded Codeを実装するにあたり, |
300 cbc\_nextと次のCodeSegmentに直接遷移するcbc\_fixt\_nextの実装を予定している. | |
301 | |
302 また段階的に現在8バイト列を1命令コードとして使用しているが,これを16バイトなどに拡張し2命令を同時に扱えるように実装する事なども検討している. | |
300 | 303 |
301 %CbCはCodeSegmentで末尾最適化(Tail call optimization)を行う. | 304 %CbCはCodeSegmentで末尾最適化(Tail call optimization)を行う. |
302 %これはCodeSegmentは必ず関数呼び出しではなくgotoで次の状態に遷移する為にスタック領域の操作が必要とならない為である. | 305 %これはCodeSegmentは必ず関数呼び出しではなくgotoで次の状態に遷移する為にスタック領域の操作が必要とならない為である. |
303 %現在のCbCコンパイラの実装ではCodeSegmentからCの関数に戻る場合は末尾最適化を切り,CodeSegment間の遷移では末尾最適化が行われる. | 306 %現在のCbCコンパイラの実装ではCodeSegmentからCの関数に戻る場合は末尾最適化を切り,CodeSegment間の遷移では末尾最適化が行われる. |
304 %末尾最適化を応用することでContinuation-passingスタイルのThreaded Codeの実装が可能となる.\cite{threadedcode} | 307 %末尾最適化を応用することでContinuation-passingスタイルのThreaded Codeの実装が可能となる.\cite{threadedcode} |
317 PerlccはPerlのバイトコードをCへの変換のみ行う為,Cで実装されているPerl経由で実行した場合と処理速度はほぼ変わらない. | 320 PerlccはPerlのバイトコードをCへの変換のみ行う為,Cで実装されているPerl経由で実行した場合と処理速度はほぼ変わらない. |
318 またPerlccで生成されたCのソースコードは難解であり,これをデバッグするのが困難でもある. | 321 またPerlccで生成されたCのソースコードは難解であり,これをデバッグするのが困難でもある. |
319 MoarVMでthreaded codeを実現出来た場合,その箇所のみCbCプログラムとして切り出す事が可能である為perlccと似たツールを作成することも可能である. | 322 MoarVMでthreaded codeを実現出来た場合,その箇所のみCbCプログラムとして切り出す事が可能である為perlccと似たツールを作成することも可能である. |
320 この場合,Perl6を通常動かした際とは異なりバイトコードインタプリタに到達する前の処理が無くなる為多少の高速化が望めると推測できる. | 323 この場合,Perl6を通常動かした際とは異なりバイトコードインタプリタに到達する前の処理が無くなる為多少の高速化が望めると推測できる. |
321 | 324 |
325 \section{MoarVMのデバッグ} | |
326 | |
327 MoarVM自体のデバッグはMoarVMのリポジトリにテストコードが付随していない為単体では実行不可能である. | |
328 本研究ではMoarVMのデバッグにおけるCデバッガの使用方法とMoarVMのテスト方法についても考案する. | |
329 | |
322 \subsection{MoarVMのBytecodeのデバッグ} | 330 \subsection{MoarVMのBytecodeのデバッグ} |
323 moarに対してmoarvm bytecodeをdumpオプションを付けて読み込ませるとmoarvmのbytecodeがアセンブラの様に出力される. | 331 moarに対してmoarvm bytecodeをdumpオプションを付けて読み込ませるとmoarvmのbytecodeがアセンブラの様に出力される. |
324 しかしこれはmoarvmが実行したbytecodeのトレースではなくmoarvm bytecodeを変換したものに過ぎない. | 332 しかしこれはmoarvmが実行したbytecodeのトレースではなくmoarvm bytecodeを変換したものに過ぎない. |
325 また,明らかに異なる挙動を示す両者のmoarを利用しても同じ結果が返ってきてしまう. | 333 また,明らかに異なる挙動を示す両者のmoarを利用しても同じ結果が返ってきてしまう. |
326 そのため今回のMoarVMBytecodeインタプリタの実装のデバッグにはこの方法は適さない. | 334 そのため今回のMoarVMBytecodeインタプリタの実装のデバッグにはこの方法は適さない. |
378 関数単位での処理の比重が偏る事に加え, | 386 関数単位での処理の比重が偏る事に加え, |
379 switch文中に書かれている処理は他の関数から呼ぶ事が出来ないため,余計な手間がかかる箇所が発生すると考えられる. | 387 switch文中に書かれている処理は他の関数から呼ぶ事が出来ないため,余計な手間がかかる箇所が発生すると考えられる. |
380 | 388 |
381 CbCMoarVMの場合,CodeSegmentとして基本ブロックを記述出来る為オリジナルのMoarVMの様にswtich文のブロック中に書く必要性が無くなる. | 389 CbCMoarVMの場合,CodeSegmentとして基本ブロックを記述出来る為オリジナルのMoarVMの様にswtich文のブロック中に書く必要性が無くなる. |
382 その為類似する命令系をコード分割し,モジュール化する事が可能である. | 390 その為類似する命令系をコード分割し,モジュール化する事が可能である. |
383 これは通常のインタプリタの実装と比べ可読性と言う意味とCodeSegmentを再利用ができ,さらに分割可能という意味でも利点である. | 391 またCbCはgoto文で遷移する以外は通常のCの関数と同じ扱いをする事が可能である. |
392 従ってCodeSegment内部の処理を別の箇所から使用する事も可能となる為再利用性も向上する. | |
393 | |
394 \subsection{ThreadeCode} | |
395 ThrededCodeを実装する場合,通常命令ディスパッチの箇所と,実際に実行される命令処理を大幅に変更しなければならない. | |
396 CbCを用いた実装の場合,命令処理はただのCodeSegmentの集合である. | |
397 その為CodeSegmentをThrededCodeに対応した並びとして選択する事ができれば命令処理部分の修正をほぼせずにThrededCodeを実現する事が可能である. | |
398 | |
399 | |
384 | 400 |
385 \subsubsection{MoarVMのデバッグ} | 401 \subsubsection{MoarVMのデバッグ} |
386 MoarVMのバイトコードインタプリタの箇所はオリジナルの実装ではラベルジャンプを用いて実装されている. | 402 MoarVMのバイトコードインタプリタの箇所はオリジナルの実装ではラベルジャンプを用いて実装されている. |
387 その為,直接ラベルにbreak pointをかける事が出来ない. | 403 その為,直接ラベルにbreak pointをかける事が出来ない. |
388 作業者がデバッガが読み込んでいるCソースコードの位置を把握し,行番号を指定してdebug pointを設定する必要があった. | 404 作業者がデバッガが読み込んでいるCソースコードの位置を把握し,行番号を指定してdebug pointを設定する必要があった. |
407 % \end{tabular} | 423 % \end{tabular} |
408 % \end{table} | 424 % \end{table} |
409 | 425 |
410 \subsection{欠点} | 426 \subsection{欠点} |
411 \subsubsection{CbCコンパイラ} | 427 \subsubsection{CbCコンパイラ} |
412 前章までに複数述べた通りCbCコンパイラが現在非常にバグを発生させやすい状態になっている. | 428 本来処理系は広く使われる為に著名なOSSなどを利用して開発するのが良いが,CbCプロジェクトの認知度が低いという現状がある. |
429 | |
430 また,前章までに複数述べた通りCbCコンパイラが現在非常にバグを発生させやすい状態になっている. | |
413 CbCコンパイラはgccとllvm/clangに実装している為,これらのアップデートに追従する必要がある. | 431 CbCコンパイラはgccとllvm/clangに実装している為,これらのアップデートに追従する必要がある. |
414 しかしコンパイラのバージョンに応じてCbCで利用するコンパイラ内のAPIが異なる場合が多く,APIの変更に伴う修正作業などを行う必要がある. | 432 しかしコンパイラのバージョンに応じてCbCで利用するコンパイラ内のAPIが異なる場合が多く,APIの変更に伴う修正作業などを行う必要がある. |
415 | 433 |
416 CbCMoarVMではCからCodeSegmentへ,CodeSegmentからCへの遷移などが複数回繰り返されているが,この処理中のCodeSegmentでのtail callの強制が非常に難関である. | 434 CbCMoarVMではCからCodeSegmentへ,CodeSegmentからCへの遷移などが複数回繰り返されているが,この処理中のCodeSegmentでのtail callの強制が非常に難関である. |
417 tail callの強制には関数定義の箇所や引数,スタック領域のサイズ修正などを行う必要がある. | 435 tail callの強制には関数定義の箇所や引数,スタック領域のサイズ修正などを行う必要がある. |
436 現在のバグではCodeSegment内部での不要なスタック操作命令を完全に排除しきれていない. | |
418 | 437 |
419 | 438 |
420 \section{今後の課題} | 439 \section{今後の課題} |
421 本論文ではCbCによってPerl6の処理系であるMoarVMインタプリタの一部改良とその手法を示した. | 440 本論文ではCbCによってPerl6の処理系であるMoarVMインタプリタの一部改良とその手法を示した. |
422 CbCのCodeSegment部分を用いることできめ細やかな記述が出来,デバッグし辛い箇所もbreakpointの設定などが容易になった. | 441 CbCのCodeSegment部分を用いることできめ細やかな記述が出来,デバッグし辛い箇所もbreakpointの設定などが容易になった. |