Mercurial > hg > Papers > 2019 > anatofuz-prosym
comparison Paper/anatofuz.tex @ 34:f01d5bc55dea
tweak tex
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 09 Nov 2018 10:50:57 +0900 |
parents | 43e0cf46d40b |
children | 4aa6a08b7dc9 |
comparison
equal
deleted
inserted
replaced
33:50d5d54a02b5 | 34:f01d5bc55dea |
---|---|
188 このMoarVM~yteCodeの状態をStage0と言い,ディレクトリ名として設定されている. | 188 このMoarVM~yteCodeの状態をStage0と言い,ディレクトリ名として設定されている. |
189 Perl6の一部はNQPを拡張したもので書かれている為,Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. | 189 Perl6の一部はNQPを拡張したもので書かれている為,Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. |
190 現在のNQPではMoarVM,JVMに対応するStage0はそれぞれMoarVMBytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. | 190 現在のNQPではMoarVM,JVMに対応するStage0はそれぞれMoarVMBytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. |
191 MoarVMのModuleLoaderはStage0あるMoarVMBytecodeで書かれた一連のファイルが該当する. | 191 MoarVMのModuleLoaderはStage0あるMoarVMBytecodeで書かれた一連のファイルが該当する. |
192 | 192 |
193 NQPのビルドフローは図\ref{fig:nqpbuild}に示す. | 193 |
194 Stage0にあるファイルをmoarvmに与えることでnqpのインタプリタが実行される様になっている. | 194 Stage0にあるファイルをmoarvmに与えることでnqpのインタプリタが実行される様になっている. |
195 これはStage0の一連のファイルはmoarvm bytecodeなどで記述されたNQPコンパイラのモジュールである為である. | 195 これはStage0の一連のファイルはmoarvm bytecodeなどで記述されたNQPコンパイラのモジュールである為である. |
196 NQPは6modelと呼ばれるオブジェクトモデルを採用としているが,これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.moarvmである. | 196 NQPは6modelと呼ばれるオブジェクトモデルを採用としているが,これを構築する為に必要なNQPCORE,正規表現系のQRegex,MoarVMのModuleLoaderなどがMoarVMBytecodeで記述されている.これらMoarVMBytecodeの拡張子は.moarvmである. |
197 MoarVMに対してStage0のディレクトリにライブラリパスを設定し,nqp.moarvmを実行させることでnqpの対話型環境が起動する. | 197 MoarVMに対してStage0のディレクトリにライブラリパスを設定し,nqp.moarvmを実行させることでnqpの対話型環境が起動する. |
198 | |
199 実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する. | |
200 Stage1は中間的な出力であり,生成されたNQPファイルはStage2と同一であるが,MoarVMBytecodeが異なる. | |
201 Perl6では完全なセルフコンパイルを実行したNQPが要求される為,Stage1を利用してもう一度ビルドを行いStage2を作成する. | |
202 | |
203 Perl6のテストスイートである「Roast\cite{roast}」やドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. | |
204 現在の公表されているNQPのオペコードはNQPのリポジトリ\cite{nqpopcode}に記述されているものである. | |
205 | 198 |
206 \begin{figure}[ht] | 199 \begin{figure}[ht] |
207 \begin{center} | 200 \begin{center} |
208 \includegraphics[width=70mm]{fig/stagenqp.pdf} | 201 \includegraphics[width=70mm]{fig/stagenqp.pdf} |
209 \end{center} | 202 \end{center} |
210 \caption{NQPのビルドフロー} | 203 \caption{NQPのビルドフロー} |
211 \label{fig:nqpbuild} | 204 \label{fig:nqpbuild} |
212 \end{figure} | 205 \end{figure} |
206 | |
207 NQPのビルドフローは図\ref{fig:nqpbuild}に示す. | |
208 実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する. | |
209 Stage1は中間的な出力であり,生成されたNQPファイルはStage2と同一であるが,MoarVMBytecodeが異なる. | |
210 Perl6では完全なセルフコンパイルを実行したNQPが要求される為,Stage1を利用してもう一度ビルドを行いStage2を作成する. | |
211 | |
212 Perl6のテストスイートである「Roast\cite{roast}」やドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. | |
213 現在の公表されているNQPのオペコードはNQPのリポジトリ\cite{nqpopcode}に記述されているものである. | |
214 | |
213 | 215 |
214 \subsection{Rakudo Perl6} | 216 \subsection{Rakudo Perl6} |
215 Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである. | 217 Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである. |
216 前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている. | 218 前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている. |
217 従ってyaccやlexと言ったPerl5の文字解析,構文解析に利用していたプログラムは利用せず,NQP側で構文定義などを行っている. | 219 従ってyaccやlexと言ったPerl5の文字解析,構文解析に利用していたプログラムは利用せず,NQP側で構文定義などを行っている. |
351 しかしこれはmoarvmが実行したbytecodeのトレースではなくmoarvm bytecodeを変換したものに過ぎない. | 353 しかしこれはmoarvmが実行したbytecodeのトレースではなくmoarvm bytecodeを変換したものに過ぎない. |
352 また,明らかに異なる挙動を示す両者のmoarを利用しても同じ結果が返ってきてしまう. | 354 また,明らかに異なる挙動を示す両者のmoarを利用しても同じ結果が返ってきてしまう. |
353 そのため今回のMoarVMBytecodeインタプリタの実装のデバッグにはこの方法は適さない. | 355 そのため今回のMoarVMBytecodeインタプリタの実装のデバッグにはこの方法は適さない. |
354 従って実際に実行した命令を確認するにはgdbなどのCデバッガを利用してMoarVMを直接トレースする必要がある. | 356 従って実際に実行した命令を確認するにはgdbなどのCデバッガを利用してMoarVMを直接トレースする必要がある. |
355 | 357 |
356 CbC側はcbc\_nextにbreak pointを設定し,オリジナル側は次のオペコードの設定のマクロにダミーの関数を呼び出すように修正し,そこにbreak pointを設定する. | 358 CbC側はCode\ref{cbc_b}に示す様にcbc\_nextにbreak pointを設定する. |
359 オリジナル側は次のオペコードの設定のマクロにダミーの関数を呼び出すように修正し,そこにbreak pointを設定する. | |
357 CbC側ではCodeSegmentの名前をデバッガ上で直接確認できるが,オリジナル版はLABLEの配列の添え字から自分でどのオペコードに対応しているかをデバッガの外で探す必要がある. | 360 CbC側ではCodeSegmentの名前をデバッガ上で直接確認できるが,オリジナル版はLABLEの配列の添え字から自分でどのオペコードに対応しているかをデバッガの外で探す必要がある. |
358 | 361 |
359 添字を確認するためにはCode\ref{orig_b}に示すようにオリジナルのMoarVMの場合cur\_opの値をMVMuint16のポインタでキャストし,これが指す値を出力する. | 362 添字を確認するためにはCode\ref{orig_b}に示すようにオリジナルのMoarVMの場合cur\_opの値をMVMuint16のポインタでキャストし,これが指す値を出力する. |
360 break pointを掛けているダミー関数ではcur\_opにアクセスする事が出来ない為,スタックフレームを一つupする必要がある. | 363 break pointを掛けているダミー関数ではcur\_opにアクセスする事が出来ない為,スタックフレームを一つupする必要がある. |
364 \lstinputlisting[label=cbc_b, caption=CbCMoarVMに対してのbreak point設定]{./src/cbc_breakpoint.txt} | |
361 \lstinputlisting[label=orig_b, caption=オリジナル版MoarVMに対してのbreak point設定]{./src/origin_b_set.txt} | 365 \lstinputlisting[label=orig_b, caption=オリジナル版MoarVMに対してのbreak point設定]{./src/origin_b_set.txt} |
362 | 366 |
363 | 367 |
364 \subsection{MoarVMの並列デバッグ手法} | 368 \subsection{MoarVMの並列デバッグ手法} |
365 しかしMoarVMが実行する命令は膨大な数がある. | 369 しかしMoarVMが実行する命令は膨大な数がある. |