# HG changeset patch # User Takahiro SHIMIZU # Date 1542614919 -32400 # Node ID 96d62f0292d353f6fe5cc2b38a841be2d7d8174b # Parent 60a15dd5023cc490d897c27706b961dd9e8717af update diff -r 60a15dd5023c -r 96d62f0292d3 Paper/anatofuz.pdf Binary file Paper/anatofuz.pdf has changed diff -r 60a15dd5023c -r 96d62f0292d3 Paper/anatofuz.tex --- a/Paper/anatofuz.tex Mon Nov 19 16:10:39 2018 +0900 +++ b/Paper/anatofuz.tex Mon Nov 19 17:08:39 2018 +0900 @@ -217,7 +217,7 @@ Stage0にあるファイルをMoarVMに与えることで, NQPのインタプリタが実行される様になっている. これはStage0の一連のファイルは, MoarVMのバイトコードなどで記述されたNQPコンパイラのモジュールである為である. NQPのインタプリタはセルフビルドが完了すると, nqpというシェルスクリプトとして提供される. -このシェルスクリプトは, ライブラリパスなどを設定してのバイナリであるmoarを起動するものである. +このシェルスクリプトは, ライブラリパスなどを設定してMoarVMの実行バイナリであるmoarを起動するものである. %NQPは6modelと呼ばれるオブジェクトモデルを採用としている.%が, これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.MoarVMである. %MoarVMに対してStage0のディレクトリにライブラリパスを設定し, nqp.MoarVMを実行させることでnqpの対話型環境が起動する. @@ -249,7 +249,7 @@ \subsection{現在のPerl6} Perl6の言語仕様\cite{perl6design}とその時点での実装状況をまとめた公式ドキュメント\cite{perl6doc}は分離している. 従来は言語仕様は自然言語の仕様書であったが, 現在はテストスイートであるRoast\cite{roast}そのものと定義されている. -現在のPerl6の仕様を読む場合Roastを確認し, 現在rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する必要がある. +現在のPerl6の仕様を読む場合Roastを確認し, 現在Rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する必要がある. \subsection{処理速度} 現在のPerl6が他のプログラミング言語と比較した場合どのような違いがでるのか計測した. @@ -311,7 +311,7 @@ \section{CbCによるMoarVM} この章では改良を行ったPerl6処理系であるMoarVMについて述べる. -今回改良を行ったMoarVMは2018.04.01であり, 利用したnqpは2018.04-3-g45ab6e3バージョンである. +今回改良を行ったMoarVMは2018.04.01であり, 利用したNQPは2018.04-3-g45ab6e3バージョンである. \subsection{方針} MoarVMそのものをCbCで書き換えることも考えられるがMoarVM自体既に巨大なプロジェクトである為すべてを書き換える事は困難である. その為まず比較的CbCで書き換えることが容易な箇所を修正する. @@ -327,7 +327,7 @@ それ以外の場合は巨大なcase文として命令を実行する. ラベル遷移を利用する場合はCode\ref{oplabelsh}に示すラベルテーブルLABELSにアクセスし, テーブルに登録されているアドレスを取得し, マクロNEXTで遷移する. -Code\ref{cbc_dispatch_c}に示すno\_opは何もせず次の命令に移動する為, goto NEXT;のみ記述されている. +Code\ref{dispatch_c}に示すno\_opは何もせず次の命令に移動する為, goto NEXT;のみ記述されている. このラベルテーブルの中身はラベルが変換されたアドレスであるため, 実際に呼ばれている命令コードの名前はデバッガレベルでは確認できない. Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる. @@ -372,7 +372,7 @@ 命令実行中のCodeGearの遷移を図\ref{fig:perl6cbcinter}に示す. この中で実線で書かれている部分はCbCのgoto文で遷移し, 波線の箇所は通常のCの関数呼び出しとなっている. -現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextが行っていた. +現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextが行っている. その為cbc\_nextから命令コードに対応するCodeGearに継続し, CodeGearからcbc\_nextに継続するサイクルが基本の流れである. CodeGear内からCの関数は問題なく呼ぶ事が可能であるため, Cの関数を利用する処理は変更せず記述する事ができる. また変換対象はswitch文であるため, breakせず次のcaseに移行した場合に対応するように別のCodeGearに継続し,その後cbc\_nextに継続するパターンも存在する. @@ -415,7 +415,7 @@ 本研究ではMoarVMのデバッグにおけるCデバッガの使用方法とMoarVMのテスト方法についても示す. \subsection{MoarVMのバイトコードのデバッグ} -MoarVMの実行バイナリであるコマンドmoarに対して, MoarVMのバイトコードをdumpオプションを付けて読み込ませると, バイトコードがMoarVMによるアセンブリコードとして出力される. +MoarVMの実行バイナリであるmoarに対して, MoarVMのバイトコードをdumpオプションを付けて読み込ませると, バイトコードがMoarVMによるアセンブリコードとして出力される. しかしこれはMoarVMが実行したバイトコードのトレースではなく, MoarVMのバイトコードを変換したものに過ぎない. また, 明らかに異なる挙動を示すオリジナルのMoarVMと, CbCで書き換えたCbCMoarVM両者のmoarを利用しても同じ結果が返ってきてしまう. そのため今回のMoarVMのバイトコードインタプリタの実装のデバッグにはこの方法は適さない. @@ -433,7 +433,7 @@ \subsection{MoarVMの並列デバッグ手法} しかしMoarVMが実行する命令は膨大な数がある. -その為gdbでMoarVMをCbCとオリジナル版での並列デバッグを人間が同時に行うことは困難である. +その為gdbなどのCデバッガで, オリジナルのMoarVMと, 一部をCbCで記述したCbCMoarVMの並列デバッグを手動で全て行うことは困難である. Perlなどのスクリプトを用いて自動的に解析したいため, ログを残す為にscriptコマンドを実行した状態でgdbを起動する. トレースでは実行した命令名のみ取得できれば良い為, Code\ref{cbc_b}, \ref{orig_b}でbreak pointにcommandとして設定している様に,設定されたcur\_opの値を出力し続けるのみの動きを導入する. @@ -453,7 +453,7 @@ \subsection{MoarVMのテスト方法} MoarVMは単体で実行する事が不可能である. -またNQPのリポジトリに付随するテストはnqpで書かれている為, NQPをビルド出来ない場合MoarVMのテストを行う事が出来ない. +またNQPのリポジトリに付随するテストはNQPで書かれている為, NQPをビルド出来ない場合MoarVMのテストを行う事が出来ない. その為, 正常に動作しているMoarVMとNQPを用意し, このNQP側からMoarVMのバイトコードにNQPのテストを変換する. 変換されたMoarVMのバイトコードはMoarバイナリに渡す事で実行可能であり, テストを行う事が出来る. @@ -578,19 +578,19 @@ \section{まとめ} 本論文ではCbCによってPerl6の処理系であるMoarVMインタプリタの一部改良とその手法を示した. -CbCMoarVMではオリジナルのMoarVMと比較して以下の様な利点が見られた. +CbCMoarVMではオリジナルのMoarVMと比較して以下の様な利点が見られた. \begin{itemize} \item CodeGear単位で命令処理を記述する事が可能となり, モジュール化が可能となった. - \item ThreadedCodeを実装する際に効率的に実装ができる見込みが立った. - \item CodeGearを導入した命令単位での最適化が可能となった. - \item break pointを命令の処理単位でかける事が可能となった. + \item ThreadedCodeを実装する際に効率的に実装ができる見込みが立った. + \item CodeGearを導入した命令単位での最適化が可能となった. + \item break pointを命令の処理単位でかける事が可能となった. \end{itemize} 今後CbCでの開発をより深く行っていくにあたり, CbCコンパイラそのものの信頼性を向上させる必要がある. MoarVMの開発を行うにあたり新たに発見された複数のバグを修正し, より安定するコンパイラにする為に改良を行う. -現在CbCMoarVMで直接バイトコードを入力した場合のnqpのテストはJVM, JavaScriptのテストを除く中で80\%パスする. +現在CbCMoarVMで直接バイトコードを入力した場合のNQPのテストはJVM, JavaScriptのテストを除く中で80\%パスする. また数値の計算と出力などの簡単なNQPの例題を作成し, オリジナルのNQP,MoarVMでバイトコード化したものを入力した際も正常に動作している. しかしNQPのセルフビルドは現在オブジェクトの生成に一部失敗している為成功していない. 今後はさらに複雑な例題やNQPのセルフビルド, Perl6の動作を行っていく.