comparison Paper/anatofuz.tex @ 27:df723be56106

add about INTERP section
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 09 Nov 2018 01:12:22 +0900
parents 7a2d604607d8
children f200e3702c5a
comparison
equal deleted inserted replaced
26:1141ce0a6aab 27:df723be56106
260 260
261 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為,バイトコードの名前はLABELSの配列の添字に変換されている. 261 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為,バイトコードの名前はLABELSの配列の添字に変換されている.
262 そのため対象となるCodeSegmentをLABLESの並びと対応させ,配列CODESに設定すればCodeSegmentの名前は問わない. 262 そのため対象となるCodeSegmentをLABLESの並びと対応させ,配列CODESに設定すればCodeSegmentの名前は問わない.
263 今回はCodeSegmentである事を示す為にsuffixとしてcbc\_をつける. 263 今回はCodeSegmentである事を示す為にsuffixとしてcbc\_をつける.
264 264
265 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが,これらはMVM\_interp\_run内のローカル変数として利用している.
266 ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが,CodeSegment間の移動で命令を表現するCbCではアクセスできない.
267 その為インタプリタの情報を集約した構造体interを定義し,この構造体へのポインタであるINTERP型の変数iをCodeSegmentの入出力して与える.
268 CodeSegment内ではINTERPを経由することでインタプリタの各種情報にアクセスする.
269
265 命令実行中のCodeSegmentの遷移を図\ref{fig:perl6cbcinter}に示す. 270 命令実行中のCodeSegmentの遷移を図\ref{fig:perl6cbcinter}に示す.
266 この中で実線で書かれている部分はCbCのgoto文で遷移し,波線の箇所は通常のCの関数呼び出しとなっている. 271 この中で実線で書かれている部分はCbCのgoto文で遷移し,波線の箇所は通常のCの関数呼び出しとなっている.
267 272
268 %現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している. 273 現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している.
269 %これは元のMoarVMの命令ディスパッチで行われる現在のオペコードを示すcur\_opと命令列opの操作及び次のラベルに遷移するマクロに該当する. 274 これは元のMoarVMのマクロNEXTが行う処理に該当する.
270 %CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する形を取っている. 275 CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する.
276
277 \lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc}
278
271 279
272 \begin{figure}[ht] 280 \begin{figure}[ht]
273 \begin{center} 281 \begin{center}
274 \includegraphics[width=70mm]{fig/cbc_next.pdf} 282 \includegraphics[width=70mm]{fig/cbc_next.pdf}
275 \end{center} 283 \end{center}