comparison Paper/anatofuz.tex @ 54:b3982cc4b0dc

tweak
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 19 Nov 2018 10:54:44 +0900
parents 27cb6c89b7d2
children a854cbfff245
comparison
equal deleted inserted replaced
53:27cb6c89b7d2 54:b3982cc4b0dc
308 関数内では命令列が保存されているcur\_op, 現在と次の命令を指し示すop,Threadの環境が保存されているThreadcontextなどの変数を利用する. 308 関数内では命令列が保存されているcur\_op, 現在と次の命令を指し示すop,Threadの環境が保存されているThreadcontextなどの変数を利用する.
309 命令実行は大きく二種類の動作があり, Cのgotoが利用できる場合はCode\ref{orig_macro}に示すMVM\_CGOTOフラグが立ちラベル遷移を利用する. 309 命令実行は大きく二種類の動作があり, Cのgotoが利用できる場合はCode\ref{orig_macro}に示すMVM\_CGOTOフラグが立ちラベル遷移を利用する.
310 それ以外の場合は巨大なcase文として命令を実行する. 310 それ以外の場合は巨大なcase文として命令を実行する.
311 311
312 ラベル遷移を利用する場合はCode\ref{oplabelsh}に示すラベルテーブルLABELSにアクセスし, テーブルに登録されているアドレスを取得し,マクロNEXTで遷移する. 312 ラベル遷移を利用する場合はCode\ref{oplabelsh}に示すラベルテーブルLABELSにアクセスし, テーブルに登録されているアドレスを取得し,マクロNEXTで遷移する.
313 Code\ref{cbc_dispatch_c}に示すno\_opは何もせず次の命令に移動する為, NEXTのみ記述されている. 313 Code\ref{cbc_dispatch_c}に示すno\_opは何もせず次の命令に移動する為, goto NEXT;のみ記述されている.
314 314
315 このラベルテーブルの中身はラベルが変換されたアドレスであるため, 実際に呼ばれている命令コードの名前はデバッガレベルでは確認できない. 315 このラベルテーブルの中身はラベルが変換されたアドレスであるため, 実際に呼ばれている命令コードの名前はデバッガレベルでは確認できない.
316 Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる. 316 Cレベルでのデバッグ時にはアドレスと実際に呼ばれる箇所を確認する事に手間がかかる.
317 巨大なcase文として実行された場合, 実行時間が遅いだけでなく,ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する. 317 巨大なcase文として実行された場合, 実行時間が遅いだけでなく,ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する.
318 318
325 interp.cでは命令コードのディスパッチはマクロを利用したcur\_opの計算及びラベルの遷移, もしくはマクロDISPATCHが展開するswitch文で行われていた. 325 interp.cでは命令コードのディスパッチはマクロを利用したcur\_opの計算及びラベルの遷移, もしくはマクロDISPATCHが展開するswitch文で行われていた.
326 CbCMoarVMではこの問題を解決するために, それぞれの命令に対応するCodeGearを作成し,CodeGear名前を要素として持つCbCのCodeGearのテーブルを作成した. 326 CbCMoarVMではこの問題を解決するために, それぞれの命令に対応するCodeGearを作成し,CodeGear名前を要素として持つCbCのCodeGearのテーブルを作成した.
327 このCodeGearのテーブルを参照するCodeGearはcbc\_nextであり, この中のマクロNEXTはinterp.cのマクロNEXTをCbC用に書き直したものである. 327 このCodeGearのテーブルを参照するCodeGearはcbc\_nextであり, この中のマクロNEXTはinterp.cのマクロNEXTをCbC用に書き直したものである.
328 328
329 \lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc} 329 \lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc}
330
331
330 332
331 \subsection{命令実行箇所のCodeGearへの変換} 333 \subsection{命令実行箇所のCodeGearへの変換}
332 ラベルテーブルやcase文のswitch相当の命令実行箇所をCbCに変換し, CodeGearの遷移として利用する. 334 ラベルテーブルやcase文のswitch相当の命令実行箇所をCbCに変換し, CodeGearの遷移として利用する.
333 interp.cはCode\ref{dispatch_c}に示すスタイルで記述されている. 335 interp.cはCode\ref{dispatch_c}に示すスタイルで記述されている.
334 336
433 その為, 正常に動作しているMoarVMとNQPを用意し, このNQP側からMoarVMByteCodeにNQPのテストを変換する. 435 その為, 正常に動作しているMoarVMとNQPを用意し, このNQP側からMoarVMByteCodeにNQPのテストを変換する.
434 変換されたMoarVMByteCodeはMoarバイナリに渡す事で実行可能であり, テストを行う事が出来る. 436 変換されたMoarVMByteCodeはMoarバイナリに渡す事で実行可能であり, テストを行う事が出来る.
435 437
436 \subsection{CbCコンパイラによるバグ} 438 \subsection{CbCコンパイラによるバグ}
437 現在までのCbCは複数個の入出力をCodeGearに与えるユースケースで利用していた. 439 現在までのCbCは複数個の入出力をCodeGearに与えるユースケースで利用していた.
438 CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの, MoarVMの様な巨大なプロジェクトのCSをコンパイルを実行する場合,予期せぬバグが発生した. 440 CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの, MoarVMの様な巨大なプロジェクトのCodeGearをコンパイルを実行する場合,予期せぬバグが発生した.
439 主にCodeGear間のgotoにおけるtail callフラグの除去や, DataGearとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい,通常のCの関数をcallした際にローカル変数の領域がDataGearのアドレスの周辺を利用してしまう. 441 主にCodeGear間のgotoにおけるtail callフラグの除去や, DataGearとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい,通常のCの関数をcallした際にローカル変数の領域がDataGearのアドレスの周辺を利用してしまう.
440 その為DataGearの構造体の値が書き換わり, CからDataGearにreturnした際にDataGearの構造体が破壊されるバグである. 442 その為DataGearの構造体の値が書き換わり, CからDataGearにreturnした際にDataGearの構造体が破壊されるバグである.
441 このバグは先程の並列デバッグを行いながらプログラムカウンタや変数の動きをトレースする事などで発見することが出来る. 443 このバグは先程の並列デバッグを行いながらプログラムカウンタや変数の動きをトレースする事などで発見することが出来る.
442 現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている. 444 現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている.
443 本来コンパイラ側のバグを回避するプログラミングをプログラマに要求する事は好ましくない. 445 本来コンパイラ側のバグを回避するプログラミングをプログラマに要求する事は好ましくない.