Mercurial > hg > Papers > 2019 > anatofuz-prosym
changeset 39:e216aa15e656
update cbc_next
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 09 Nov 2018 13:15:45 +0900 |
parents | 7d9b01a98b9a |
children | 2a21f7911f92 |
files | Paper/anatofuz.pdf Paper/anatofuz.tex |
diffstat | 2 files changed, 19 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/Paper/anatofuz.tex Fri Nov 09 12:56:18 2018 +0900 +++ b/Paper/anatofuz.tex Fri Nov 09 13:15:45 2018 +0900 @@ -246,18 +246,28 @@ 命令実行は大きく二種類の動作があり,Code\ref{orig_macro}に示すCのgotoが利用できる場合はMVM\_CGOTOフラグが立ちラベル遷移を利用する. それ以外の場合は巨大なcase文として命令を実行する. -ラベル遷移を利用する場合はラベルテーブルにアクセスし,テーブルに登録されているアドレスを取得し,NEXTで遷移する. -このラベルテーブルの中身はラベルが変換されたアドレスであるため,Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる. +ラベル遷移を利用する場合はラベルテーブルにアクセスし,テーブルに登録されているアドレスを取得し,マクロNEXTで遷移する. +Code\ref{cbc_dispatch_c}に示すno\_opは何もせず次の命令に移動する為,NEXTのみ記述されている. + +このラベルテーブルの中身はラベルが変換されたアドレスであるため,実際に呼ばれている命令コードの名前はデバッガレベルでは確認できない. +Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる. 巨大なcase文として実行された場合,実行時間が遅いだけでなく,ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する. -CbCMoarVMではこの問題を解決するために,それぞれの命令に対応するCodeSegmentを作成し,CodeSegment名前を要素として持つCbCのCodeSegmentのテーブルを作成した. + \lstinputlisting[label=orig_macro, caption=interp.cのマクロ部分]{./src/orig_macro.c} +\lstinputlisting[label=dispatch_c, caption=オリジナル版MoarVMのバイトコードディスパッチ]{./src/dispatch.c} + +interp.cでは命令コードのディスパッチはマクロを利用したcur\_opの計算及びラベルの遷移,もしくはマクロDISPATCHが展開するswitch文で行われていた. +CbCMoarVMではこの問題を解決するために,それぞれの命令に対応するCodeSegmentを作成し,CodeSegment名前を要素として持つCbCのCodeSegmentのテーブルを作成した. +このCodeSegmentのテーブルを参照するCodeSegmentはcbc\_nextであり,この中のマクロNEXTはinterp.cのマクロNEXTをCbC用に書き直したものである. + +\lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc} \subsection{命令実行箇所のCodeSegmentへの変換} ラベルテーブルやcase文のswitch相当の命令実行箇所をCbCに変換し,CodeSegmentの遷移として利用する. interp.cはCode\ref{dispatch_c}に示すスタイルで記述されている. -\lstinputlisting[label=dispatch_c, caption=オリジナル版MoarVMのバイトコードディスパッチ]{./src/dispatch.c} + OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為,バイトコードの名前はLABELSの配列の添字に変換されている. @@ -275,11 +285,10 @@ 命令実行中のCodeSegmentの遷移を図\ref{fig:perl6cbcinter}に示す. この中で実線で書かれている部分はCbCのgoto文で遷移し,波線の箇所は通常のCの関数呼び出しとなっている. -現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している. -これは元のMoarVMのマクロNEXTが行う処理に該当する. -CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する. - -\lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc} +現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextが行っていた. +その為cbc\_nextから命令コードに対応するCodeSegmentに継続し,CodeSegmentからcbc\_nextに継続するサイクルが基本の流れである. +CodeSegment内からCの関数は問題なく呼ぶ事が可能であるため,Cの関数を利用する処理は変更せず記述する事ができる. +また変換対象はswitch文であるため,breakせず下に落ちた場合に対応するように別のCodeSegmentに継続し,その後cbc\_nextに継続するパターンも存在する. \lstinputlisting[label=cbc_codesegs_c, caption=CbCMoarVMのバイトコードに対応するCodeSegment]{./src/cbc_codesegs.cbc} @@ -304,7 +313,7 @@ \end{itemize} -上記Code\ref{cbc_codesegs_c}ではcbc\_const\_i8などがcase文の下の部分に該当するcbc\_const\_i64に遷移する様に変換されている. +上記Code\ref{cbc_codesegs_c}ではcbc\_const\_i8などがcase文の下のcase部分に該当するcbc\_const\_i64に遷移する様に変換されている. またcbc\_pushcompscではMVMROOTに局所変数scを渡している為,これをstaticで宣言し直している. 現在CbCで記述されたOSであるGearsOSにはInterfaceが導入されている.