# HG changeset patch # User Takahiro SHIMIZU # Date 1541726349 -32400 # Node ID 5b5fb929c67fa3ee7f6898a3ff56f87aced14143 # Parent abc5a12b8761e6812aba636c0cdd89bab1cdb319 update abotu MoarBM diff -r abc5a12b8761 -r 5b5fb929c67f Paper/anatofuz.pdf Binary file Paper/anatofuz.pdf has changed diff -r abc5a12b8761 -r 5b5fb929c67f Paper/anatofuz.tex --- a/Paper/anatofuz.tex Fri Nov 09 02:16:11 2018 +0900 +++ b/Paper/anatofuz.tex Fri Nov 09 10:19:09 2018 +0900 @@ -262,6 +262,7 @@ そのため対象となるCodeSegmentをLABLESの並びと対応させ,配列CODESに設定すればCodeSegmentの名前は問わない. 今回はCodeSegmentである事を示す為にsuffixとしてcbc\_をつける. + 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが,これらはMVM\_interp\_run内のローカル変数として利用している. ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが,CodeSegment間の移動で命令を表現するCbCではアクセスできない. その為インタプリタの情報を集約した構造体interを定義し,この構造体へのポインタであるINTERP型の変数iをCodeSegmentの入出力として与える. @@ -287,6 +288,19 @@ \label{fig:perl6cbcinter} \end{figure} +バイトコードの数は膨大である為,すべてを手作業で変換する事は望ましくない. +本研究ではPerlScriptを用いてinterp.cからCbCのCodeSegmentを自動生成するスクリプトを作成した. +このスクリプトでは以下の修正手続きを実行する. + +\begin{itemize} + \item OP(.*)の.*部分をCodeSegmentの名前として,先頭にcbc\_をつけた上で設定する. + \item cur\_opなど構造体INTERのメンバ変数はポインタiから参照するように修正する + \item GC対策のためマクロMVMROOTを使い局所変数のポインタをスタックに積む箇所は,局所変数をstatic化する + \item 末尾のgoto NEXTをgoto cbc\_next(i)に修正する + \item case文で下のcase文に落ちている箇所は,case文に対応するCodeSegmentに遷移する様に末尾を付け加える +\end{itemize} + + 現在CbCで記述されたOSであるGearsOSにはInterfaceが導入されている. これはJavaのinterface,Haskellの型クラスに該当する概念であり,次のCodeSegmentにInterface経由で継続する事が可能である. Interfaceは現在のMoarVMには実装されていない為,今後ThreadeCodeの実装を行うにあたり導入を検討している. @@ -322,6 +336,10 @@ MoarVMでthreaded codeを実現出来た場合,その箇所のみCbCプログラムとして切り出す事が可能である為perlccと似たツールを作成することも可能である. この場合,Perl6を通常動かした際とは異なりバイトコードインタプリタに到達する前の処理が無くなる為多少の高速化が望めると推測できる. +\subsection{Cのインライン展開} +CbCのCodeSegmentはgoto文で遷移するため,次のCodeSegmentが一意に決定している場合Cコンパイラ側でインライン展開する事が可能である. +CodeSegmentがインライン展開される限界については別途研究する必要があるが,CbCを利用した場合その箇所でもコストを低く設計する事が可能である. + \section{MoarVMのデバッグ} MoarVM自体のデバッグはMoarVMのリポジトリにテストコードが付随していない為単体では実行不可能である. @@ -396,6 +414,8 @@ CbCを用いた実装の場合,命令処理はただのCodeSegmentの集合である. その為CodeSegmentをThrededCodeに対応した並びとして選択する事ができれば命令処理部分の修正をほぼせずにThrededCodeを実現する事が可能である. +またCodeSegmentはバイトコードレベルと同じ扱いができるため,ThrededCodeそのものを分離して最適化をかける事が可能である. +これもCodeSegmentが関数単位として分離できる事からの利点である. \subsubsection{MoarVMのデバッグ} @@ -409,6 +429,10 @@ さらにラベルテーブルでの管理場合,次のバイトコード箇所は数値でしか確認できず,実際にどこに飛ぶのかはラベルテーブル内と数値を作業者が手作業で確認する必要があった. スクリプトなどを組めば効率化は出来るがデバッガ上で完結しない為手間がかかる. CbC実装ではCODESテーブル内は次のCodeSegmentの名前が入っている為,数値からCodeSegmentの名前をデバッガ上で確認する事が出来る. + +\subsection{JITコンパイルの応用} +現在MoarVMはLuaJit\cite{luajit}を搭載しJITコンパイルを行っている. +LuaJITそのものをCbCに適応させるわけではないが,CbCのABIにJITされたコードを合わせる事が可能であると推測できる. % \subsection{単純なループ処理の測定} % 簡単な例題としてfor文を用いて100000回ループさせ,ある変数をインクリメントするというプログラムを作成する. % 今回の評価対象としてPerl6は2018年4月にリリースされたMoarVM,NQP,Rakudoの実装を用いる. @@ -424,7 +448,6 @@ % \end{table} \subsection{欠点} -\subsubsection{CbCコンパイラ} 本来処理系は広く使われる為に著名なOSSなどを利用して開発するのが良いが,CbCプロジェクトの認知度が低いという現状がある. また,前章までに複数述べた通りCbCコンパイラが現在非常にバグを発生させやすい状態になっている. @@ -435,6 +458,8 @@ tail callの強制には関数定義の箇所や引数,スタック領域のサイズ修正などを行う必要がある. 現在のバグではCodeSegment内部での不要なスタック操作命令を完全に排除しきれていない. +またCodeSegmentからCに帰る場合,環境付き継続を行う必要がある. +Cの関数の末尾でCodeSegmentを呼び出している場合など環境付き継続を使用しなくても良いケースは存在するが,頻繁にCとCbCを行き来する場合記述が冗長になる可能性はある. \section{今後の課題} 本論文ではCbCによってPerl6の処理系であるMoarVMインタプリタの一部改良とその手法を示した. diff -r abc5a12b8761 -r 5b5fb929c67f Paper/reference.bib --- a/Paper/reference.bib Fri Nov 09 02:16:11 2018 +0900 +++ b/Paper/reference.bib Fri Nov 09 10:19:09 2018 +0900 @@ -108,3 +108,8 @@ journal = {ACM SIGPLAN Notices. Vol. 33}, year = 1998, } + +@misc{luajit, + title = {The LuaJIT Project}, + howpublished = {\url{http://luajit.org/}}, +}