Mercurial > hg > Papers > 2019 > anatofuz-thesis
changeset 61:efe90261de01
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 17 Feb 2019 17:56:51 +0900 |
parents | f875514d43ad |
children | 88a3fb5e5b18 |
files | paper/chapter4.tex paper/main.pdf |
diffstat | 2 files changed, 23 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter4.tex Sun Feb 17 17:13:12 2019 +0900 +++ b/paper/chapter4.tex Sun Feb 17 17:56:51 2019 +0900 @@ -242,18 +242,37 @@ -\section{CbCMoarVMのデバッグ} +\section{MoarVMのデバッグ} CbCで書き換えたMoarVMであるCbCMoarVMは、 現在gcc、 LLVM/clang上に実装しているCbCコンパイラでビルドする事が可能である。 また、 それぞれO3までの最適化オプションをビルド時に指定してもビルドする事が可能である。 MoarVMの書き換えに伴って、 正常にオリジナルのMoarVMと同じ振る舞いをするか確認をしたい。 -ソフトウェアの振る舞いの確認手法はいくつかあるが、 今回はテストコードを利用したテストを用いて確認する。 -MoarVM自体には現在テストコードが存在せず、 MoarVM上で動作するNQP、 及びRakudoに付随しているテストコードで、 MoarVMの実装をテストする。 +MoarVM自体には現在テストコードが存在しない。 +MoarVMのリポジトリ内のメッセージには、MoarVM上で動作するNQP、 及びRakudoに付随しているテストコードで、 MoarVMの実装をテストする事が推奨されている。 +NQPやRakudoのテストは、 ソースコード\ref{cbc_test_nqp}に示す様なコードを利用する。 +実際にNQPとPerl6のインタプリタとしてビルドした、 nqpやperl6コマンドを実行する。 +実行時に出力された結果と、 期待する結果が一致するかを確認する方式である。 + +\lstinputlisting[frame=lrbt, label=cbc_test_nqp, caption=NQPのテストコードの例]{./codes/test.nqp} NQPやRakudoのテストを行うには、セルフビルドしたそれぞれのインタプリタであるnqp、 perl6を作らなければならない。 しかし、 これらをビルドする際にはMoarVMの実行バイナリである moar を動かす必要がある。 nqpなどのビルド時には、 入力として与えられたバイトコードを解析し、 命令部分をディスパッチするバイトコードインタプリタを使用せざるを得ない。 今回はバイトコードディスパッチ部分を書き換えた為、 この部分にバグが生じていると、 そもそもnqpやperl6を生成する事が出来ない。 -その為、 利用したいnqpやperl6のテストコードを利用する事が出来ない。 +その為、 利用したいnqpやperl6のテストコードを出力を通して確認する事が出来ない。 +従って、 今回はMoarVM自体にバイトコードを入力として与え、 期待する動作をするかどうかを独自に確認する必要がある。 + + +\section{CbCMoarVMのデバッグ} + +従って、 テストコードを利用するのではなく、 オリジナルのMoarVMで動くべき命令と、 実際にCbCMoarVMで動いている命令がどう違うかを確認する。 +実際に差分を確認したスクリプトの実行結果の一部を、 ソースコード\ref{cbc_origin_diff}に示す。 + +\lstinputlisting[frame=lrbt, label=cbc_origin_diff, caption=MoarVMとCbCMoarVMの実行命令の差分検知]{./codes/diff.txt} + +左行がオリジナルのMoarVMの実行命令であり、 右行がCbCMoarVMの実行命令である。 +出力している命令番号は、 それぞれLABELやCODESなどの命令リストの配列の番号と対応している為、 対応するCodeGear名を同時に出力している。 +$\ast$が先頭に付随する行で差異が発生しており、 それぞれ実行している命令の番号が異なる事が確認出来る。 +この例では、 オリジナルのMoarVMは invoke\_o 命令を実行しているのに対し、 CbCMoarVMでは takeclosure 命令を実行している。