# HG changeset patch # User Takahiro SHIMIZU # Date 1541728257 -32400 # Node ID f01d5bc55deaf348f95562467b7ebb5d3d4285cd # Parent 50d5d54a02b5a32a3f1cbdaa25f61ff98dbc30a7 tweak tex diff -r 50d5d54a02b5 -r f01d5bc55dea Paper/anatofuz.pdf Binary file Paper/anatofuz.pdf has changed diff -r 50d5d54a02b5 -r f01d5bc55dea Paper/anatofuz.tex --- a/Paper/anatofuz.tex Fri Nov 09 10:38:42 2018 +0900 +++ b/Paper/anatofuz.tex Fri Nov 09 10:50:57 2018 +0900 @@ -190,19 +190,12 @@ 現在のNQPではMoarVM,JVMに対応するStage0はそれぞれMoarVMBytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. MoarVMのModuleLoaderはStage0あるMoarVMBytecodeで書かれた一連のファイルが該当する. -NQPのビルドフローは図\ref{fig:nqpbuild}に示す. + Stage0にあるファイルをmoarvmに与えることでnqpのインタプリタが実行される様になっている. これはStage0の一連のファイルはmoarvm bytecodeなどで記述されたNQPコンパイラのモジュールである為である. NQPは6modelと呼ばれるオブジェクトモデルを採用としているが,これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.moarvmである. MoarVMに対してStage0のディレクトリにライブラリパスを設定し,nqp.moarvmを実行させることでnqpの対話型環境が起動する. -実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する. -Stage1は中間的な出力であり,生成されたNQPファイルはStage2と同一であるが,MoarVMBytecodeが異なる. -Perl6では完全なセルフコンパイルを実行したNQPが要求される為,Stage1を利用してもう一度ビルドを行いStage2を作成する. - -Perl6のテストスイートである「Roast\cite{roast}」やドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. -現在の公表されているNQPのオペコードはNQPのリポジトリ\cite{nqpopcode}に記述されているものである. - \begin{figure}[ht] \begin{center} \includegraphics[width=70mm]{fig/stagenqp.pdf} @@ -211,6 +204,15 @@ \label{fig:nqpbuild} \end{figure} +NQPのビルドフローは図\ref{fig:nqpbuild}に示す. +実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する. +Stage1は中間的な出力であり,生成されたNQPファイルはStage2と同一であるが,MoarVMBytecodeが異なる. +Perl6では完全なセルフコンパイルを実行したNQPが要求される為,Stage1を利用してもう一度ビルドを行いStage2を作成する. + +Perl6のテストスイートである「Roast\cite{roast}」やドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. +現在の公表されているNQPのオペコードはNQPのリポジトリ\cite{nqpopcode}に記述されているものである. + + \subsection{Rakudo Perl6} Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである. 前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている. @@ -353,11 +355,13 @@ そのため今回のMoarVMBytecodeインタプリタの実装のデバッグにはこの方法は適さない. 従って実際に実行した命令を確認するにはgdbなどのCデバッガを利用してMoarVMを直接トレースする必要がある. -CbC側はcbc\_nextにbreak pointを設定し,オリジナル側は次のオペコードの設定のマクロにダミーの関数を呼び出すように修正し,そこにbreak pointを設定する. +CbC側はCode\ref{cbc_b}に示す様にcbc\_nextにbreak pointを設定する. +オリジナル側は次のオペコードの設定のマクロにダミーの関数を呼び出すように修正し,そこにbreak pointを設定する. CbC側ではCodeSegmentの名前をデバッガ上で直接確認できるが,オリジナル版はLABLEの配列の添え字から自分でどのオペコードに対応しているかをデバッガの外で探す必要がある. 添字を確認するためにはCode\ref{orig_b}に示すようにオリジナルのMoarVMの場合cur\_opの値をMVMuint16のポインタでキャストし,これが指す値を出力する. break pointを掛けているダミー関数ではcur\_opにアクセスする事が出来ない為,スタックフレームを一つupする必要がある. +\lstinputlisting[label=cbc_b, caption=CbCMoarVMに対してのbreak point設定]{./src/cbc_breakpoint.txt} \lstinputlisting[label=orig_b, caption=オリジナル版MoarVMに対してのbreak point設定]{./src/origin_b_set.txt} diff -r 50d5d54a02b5 -r f01d5bc55dea Paper/src/cbc-interp-next.cbc --- a/Paper/src/cbc-interp-next.cbc Fri Nov 09 10:38:42 2018 +0900 +++ b/Paper/src/cbc-interp-next.cbc Fri Nov 09 10:50:57 2018 +0900 @@ -8,7 +8,3 @@ __code cbc_next(INTERP i){ goto NEXT(i); } - -__code cbc_no_op(INTERP i){ - goto cbc_next(i); -}