Mercurial > hg > Papers > 2019 > anatofuz-prosym
comparison Paper/anatofuz.tex @ 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 |
comparison
equal
deleted
inserted
replaced
38:7d9b01a98b9a | 39:e216aa15e656 |
---|---|
244 この中の関数MVM\_interp\_runで命令に応じた処理を実行する. | 244 この中の関数MVM\_interp\_runで命令に応じた処理を実行する. |
245 関数内では命令列が保存されているcur\_op,現在と次の命令を指し示すop,Threadの環境が保存されているThreadcontextなどの変数を利用する. | 245 関数内では命令列が保存されているcur\_op,現在と次の命令を指し示すop,Threadの環境が保存されているThreadcontextなどの変数を利用する. |
246 命令実行は大きく二種類の動作があり,Code\ref{orig_macro}に示すCのgotoが利用できる場合はMVM\_CGOTOフラグが立ちラベル遷移を利用する. | 246 命令実行は大きく二種類の動作があり,Code\ref{orig_macro}に示すCのgotoが利用できる場合はMVM\_CGOTOフラグが立ちラベル遷移を利用する. |
247 それ以外の場合は巨大なcase文として命令を実行する. | 247 それ以外の場合は巨大なcase文として命令を実行する. |
248 | 248 |
249 ラベル遷移を利用する場合はラベルテーブルにアクセスし,テーブルに登録されているアドレスを取得し,NEXTで遷移する. | 249 ラベル遷移を利用する場合はラベルテーブルにアクセスし,テーブルに登録されているアドレスを取得し,マクロNEXTで遷移する. |
250 このラベルテーブルの中身はラベルが変換されたアドレスであるため,Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる. | 250 Code\ref{cbc_dispatch_c}に示すno\_opは何もせず次の命令に移動する為,NEXTのみ記述されている. |
251 | |
252 このラベルテーブルの中身はラベルが変換されたアドレスであるため,実際に呼ばれている命令コードの名前はデバッガレベルでは確認できない. | |
253 Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる. | |
251 巨大なcase文として実行された場合,実行時間が遅いだけでなく,ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する. | 254 巨大なcase文として実行された場合,実行時間が遅いだけでなく,ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する. |
252 | 255 |
256 | |
257 \lstinputlisting[label=orig_macro, caption=interp.cのマクロ部分]{./src/orig_macro.c} | |
258 | |
259 \lstinputlisting[label=dispatch_c, caption=オリジナル版MoarVMのバイトコードディスパッチ]{./src/dispatch.c} | |
260 | |
261 interp.cでは命令コードのディスパッチはマクロを利用したcur\_opの計算及びラベルの遷移,もしくはマクロDISPATCHが展開するswitch文で行われていた. | |
253 CbCMoarVMではこの問題を解決するために,それぞれの命令に対応するCodeSegmentを作成し,CodeSegment名前を要素として持つCbCのCodeSegmentのテーブルを作成した. | 262 CbCMoarVMではこの問題を解決するために,それぞれの命令に対応するCodeSegmentを作成し,CodeSegment名前を要素として持つCbCのCodeSegmentのテーブルを作成した. |
254 \lstinputlisting[label=orig_macro, caption=interp.cのマクロ部分]{./src/orig_macro.c} | 263 このCodeSegmentのテーブルを参照するCodeSegmentはcbc\_nextであり,この中のマクロNEXTはinterp.cのマクロNEXTをCbC用に書き直したものである. |
255 | 264 |
265 \lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc} | |
256 | 266 |
257 \subsection{命令実行箇所のCodeSegmentへの変換} | 267 \subsection{命令実行箇所のCodeSegmentへの変換} |
258 ラベルテーブルやcase文のswitch相当の命令実行箇所をCbCに変換し,CodeSegmentの遷移として利用する. | 268 ラベルテーブルやcase文のswitch相当の命令実行箇所をCbCに変換し,CodeSegmentの遷移として利用する. |
259 interp.cはCode\ref{dispatch_c}に示すスタイルで記述されている. | 269 interp.cはCode\ref{dispatch_c}に示すスタイルで記述されている. |
260 \lstinputlisting[label=dispatch_c, caption=オリジナル版MoarVMのバイトコードディスパッチ]{./src/dispatch.c} | 270 |
261 | 271 |
262 | 272 |
263 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為,バイトコードの名前はLABELSの配列の添字に変換されている. | 273 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為,バイトコードの名前はLABELSの配列の添字に変換されている. |
264 そのため対象となるCodeSegmentをLABLESの並びと対応させ,CodeSegmentの配列CODESとして設定すればCodeSegmentの名前は問わない. | 274 そのため対象となるCodeSegmentをLABLESの並びと対応させ,CodeSegmentの配列CODESとして設定すればCodeSegmentの名前は問わない. |
265 今回はCodeSegmentである事を示す為にsuffixとしてcbc\_をつける. | 275 今回はCodeSegmentである事を示す為にsuffixとしてcbc\_をつける. |
273 その為INTERPのメンバであるMoarVMのレジスタそのものをアーキテクチャのレジスタ上に乗せる事が可能である. | 283 その為INTERPのメンバであるMoarVMのレジスタそのものをアーキテクチャのレジスタ上に乗せる事が可能である. |
274 | 284 |
275 命令実行中のCodeSegmentの遷移を図\ref{fig:perl6cbcinter}に示す. | 285 命令実行中のCodeSegmentの遷移を図\ref{fig:perl6cbcinter}に示す. |
276 この中で実線で書かれている部分はCbCのgoto文で遷移し,波線の箇所は通常のCの関数呼び出しとなっている. | 286 この中で実線で書かれている部分はCbCのgoto文で遷移し,波線の箇所は通常のCの関数呼び出しとなっている. |
277 | 287 |
278 現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している. | 288 現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextが行っていた. |
279 これは元のMoarVMのマクロNEXTが行う処理に該当する. | 289 その為cbc\_nextから命令コードに対応するCodeSegmentに継続し,CodeSegmentからcbc\_nextに継続するサイクルが基本の流れである. |
280 CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する. | 290 CodeSegment内からCの関数は問題なく呼ぶ事が可能であるため,Cの関数を利用する処理は変更せず記述する事ができる. |
281 | 291 また変換対象はswitch文であるため,breakせず下に落ちた場合に対応するように別のCodeSegmentに継続し,その後cbc\_nextに継続するパターンも存在する. |
282 \lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc} | |
283 | 292 |
284 \lstinputlisting[label=cbc_codesegs_c, caption=CbCMoarVMのバイトコードに対応するCodeSegment]{./src/cbc_codesegs.cbc} | 293 \lstinputlisting[label=cbc_codesegs_c, caption=CbCMoarVMのバイトコードに対応するCodeSegment]{./src/cbc_codesegs.cbc} |
285 | 294 |
286 \begin{figure}[ht] | 295 \begin{figure}[ht] |
287 \begin{center} | 296 \begin{center} |
302 \item 末尾のgoto NEXTをgoto cbc\_next(i)に修正する | 311 \item 末尾のgoto NEXTをgoto cbc\_next(i)に修正する |
303 \item case文で下のcase文に落ちている箇所は,case文に対応するCodeSegmentに遷移する様にgoto文を付け加える | 312 \item case文で下のcase文に落ちている箇所は,case文に対応するCodeSegmentに遷移する様にgoto文を付け加える |
304 \end{itemize} | 313 \end{itemize} |
305 | 314 |
306 | 315 |
307 上記Code\ref{cbc_codesegs_c}ではcbc\_const\_i8などがcase文の下の部分に該当するcbc\_const\_i64に遷移する様に変換されている. | 316 上記Code\ref{cbc_codesegs_c}ではcbc\_const\_i8などがcase文の下のcase部分に該当するcbc\_const\_i64に遷移する様に変換されている. |
308 またcbc\_pushcompscではMVMROOTに局所変数scを渡している為,これをstaticで宣言し直している. | 317 またcbc\_pushcompscではMVMROOTに局所変数scを渡している為,これをstaticで宣言し直している. |
309 | 318 |
310 現在CbCで記述されたOSであるGearsOSにはInterfaceが導入されている. | 319 現在CbCで記述されたOSであるGearsOSにはInterfaceが導入されている. |
311 これはJavaのinterface,Haskellの型クラスに該当する概念であり,次のCodeSegmentにInterface経由で継続する事が可能である. | 320 これはJavaのinterface,Haskellの型クラスに該当する概念であり,次のCodeSegmentにInterface経由で継続する事が可能である. |
312 Interfaceは現在のMoarVMには実装されていない為,今後ThreadeCodeの実装を行うにあたり導入を検討している. | 321 Interfaceは現在のMoarVMには実装されていない為,今後ThreadeCodeの実装を行うにあたり導入を検討している. |