Mercurial > hg > Papers > 2019 > anatofuz-prosym
comparison Paper/anatofuz.tex @ 70:bb09f3bd682f
add detail interp structure
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 20 Nov 2018 13:27:14 +0900 |
parents | 5aa4743552b7 |
children | 79c887a307c9 |
comparison
equal
deleted
inserted
replaced
69:5aa4743552b7 | 70:bb09f3bd682f |
---|---|
347 このCodeGearのテーブルを参照するCodeGearはcbc\_nextであり, この中のマクロNEXTはinterp.cのマクロNEXTをCbC用に書き直したものである. | 347 このCodeGearのテーブルを参照するCodeGearはcbc\_nextであり, この中のマクロNEXTはinterp.cのマクロNEXTをCbC用に書き直したものである. |
348 | 348 |
349 \lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc} | 349 \lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc} |
350 | 350 |
351 | 351 |
352 Code\ref{cbc_dispatch_c}に示す変更例では, マクロNEXTなどの引数に変数iを導入している. | |
353 このiとは, バイトコードインタプリタ内で利用するMoarVMのレジスタ情報などが,格納された, 構造体へのポインタである. | |
354 iが示す構造体INTER,及びiの型であるポインタINTERPはCode\ref{interp}に示すように宣言している. | |
355 これはマクロ内部で現在の命令を示すopや命令列cur\_opなどにアクセスする必要があるが, CbCのCodeGearを適応した場合に元のマクロの記述方法ではアクセスできない為に導入したものである. | |
356 \lstinputlisting[label=interp, caption=MoarVMの情報を格納した構造体INTER]{./src/INTERP.h} | |
352 | 357 |
353 \subsection{命令実行箇所のCodeGearへの変換} | 358 \subsection{命令実行箇所のCodeGearへの変換} |
354 ラベルテーブルやcase文のswitch相当の命令実行箇所をCbCに変換し, CodeGearの遷移として利用する. | 359 ラベルテーブルやcase文のswitch相当の命令実行箇所をCbCに変換し, CodeGearの遷移として利用する. |
355 interp.cはCode\ref{dispatch_c}に示すスタイルで記述されている. | 360 interp.cはCode\ref{dispatch_c}に示す様にマクロOPを利用して記述されている. |
356 | 361 |
357 | 362 |
358 | 363 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移, またはswtich-caseによって分岐する為, バイトコードの名前は配列LABELSの添字に変換されている. |
359 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為, バイトコードの名前はLABELSの配列の添字に変換されている. | |
360 そのため対象となるCodeGearをLABELSの並びと対応させ, Code\ref{cbcoplabelsh}に示すCodeGearの配列CODESとして設定すればCodeGearの名前は問わない. | 364 そのため対象となるCodeGearをLABELSの並びと対応させ, Code\ref{cbcoplabelsh}に示すCodeGearの配列CODESとして設定すればCodeGearの名前は問わない. |
361 今回はCodeGearである事を示す為に接頭辞としてcbc\_をつける. | 365 今回はCodeGearである事を示す為に接頭辞としてcbc\_をつける. |
362 | 366 |
363 \lstinputlisting[label=cbcoplabelsh, caption=CodeGear配列の一部分]{./src/oplables-cbc-codes.h} | 367 \lstinputlisting[label=cbcoplabelsh, caption=CodeGear配列の一部分]{./src/oplables-cbc-codes.h} |
364 | 368 |
365 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している. | 369 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している. |
366 ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが, CodeGear間の移動で命令を表現するCbCではアクセスできない. | 370 ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが, CodeGear間の移動で命令を表現するCbCではアクセスできない. |
367 その為インタプリタの情報を集約した構造体interを定義し, この構造体へのポインタであるINTERP型の変数iをCodeGearの入出力として与える. | 371 その為Code\ref{interp}に示す様に, インタプリタの情報を集約した構造体interを定義する. |
372 この構造体へのポインタであるINTERP型の変数iをCodeGearの入出力として与える. | |
368 CodeGear内ではINTERPを経由することでインタプリタの各種情報にアクセスする. | 373 CodeGear内ではINTERPを経由することでインタプリタの各種情報にアクセスする. |
369 CodeGear間の遷移ではレジスタの値の調整は行われない為, 入力引数を使ってレジスタマッピングを管理できる. | 374 CodeGear間の遷移ではレジスタの値の調整は行われない為, 入力引数を使ってレジスタマッピングを管理できる. |
370 その為INTERPのメンバであるMoarVMのレジスタそのものをアーキテクチャのレジスタ上に乗せる事が可能である. | 375 その為INTERPのメンバであるMoarVMのレジスタそのものをアーキテクチャのレジスタ上に乗せる事が可能である. |
371 | 376 |
372 命令実行中のCodeGearの遷移を図\ref{fig:perl6cbcinter}に示す. | 377 命令実行中のCodeGearの遷移を図\ref{fig:perl6cbcinter}に示す. |