# HG changeset patch # User anatofuz # Date 1611980968 -32400 # Node ID 284ddeee0f9a3c52a3e2beb4d4f268e6e4ed0786 # Parent 7431f957256713b6f0bbfdf075d09a350f891446 ... diff -r 7431f9572567 -r 284ddeee0f9a paper/chapter/02-interface.tex --- a/paper/chapter/02-interface.tex Fri Jan 29 19:18:27 2021 +0900 +++ b/paper/chapter/02-interface.tex Sat Jan 30 13:29:28 2021 +0900 @@ -26,6 +26,24 @@ \section{メタ計算部分の入れ替え} GearsOSでは次のCodeGearに移行する前のMetaCodeGearとして、 デフォルトでは\texttt{\_\_code meta}が使われている。 -このCodeGearはcontextに含まれているCodeGearの関数ポインタを、 enumからディスパッチして次のStub CodeGearに継続するものである。 +\texttt{\_\_code meta}はcontextに含まれているCodeGearの関数ポインタを、 enumからディスパッチして次のStub CodeGearに継続するものである。 + +例えばモデル検査をGearsOSで実行する場合、 通常のStub CodeGearのほかに状態の保存などを行う必要がある。 +この状態の保存に関する一連の処理は明らかにメタ計算であるので、 ノーマルレベルのCodeGearではない箇所で行いたい。 +ノーマルレベル以外のCodeGearで実行する場合は、 通常のコード生成だとStubCodeGearの中で行うことになる。 +StubCodeGearは自動生成されてしまうため、 値の取り出し以外のことを行う場合は自分で実装する必要がある。 +しかしモデル検査に関する処理は様々なCodeGearの後に行う必要があるため、 すべてのCodeGearのStubを静的に実装するのは煩雑である。 + +ノーマルレベルのCodeGearの処理の後に、\texttt{\_\_code meta}以外のMeta CodeGearに遷移可能なAPIが必要となる。 +このAPIを実装すると、ユーザーが柔軟にメタ計算を選択することが可能となる。 -このメタ計算部分を独自で定義したCodeGearに差し替えたいケースが存在する。 +GearsOSのビルドシステムのAPIとして\texttt{meta.pm}を作製した。 +これはPerlのモジュールファイルとして実装した。 +Perlで実装されたGearsOSのトランスコンパイラであるgenerate\_stub.plから呼び出される。 + + +meta.pmは特定のパターンの配列とサブルーチンを定義し、MetaCodeGearへの遷移を制御可能なAPIである。 +正規表現リテラルで、最後のgoto文を変更したいCodeGearの名前を指定する。 +コード\ref{src:metapm}に示す例では、\texttt{PhilsImpl}が名前に含まれるCodeGearのgotoの先を\texttt{mcMeta}に差し替えている。 + +\lstinputlisting[label=src:metapm, caption=meta.pm]{src/meta.pm} diff -r 7431f9572567 -r 284ddeee0f9a paper/master_paper.pdf Binary file paper/master_paper.pdf has changed diff -r 7431f9572567 -r 284ddeee0f9a paper/master_paper.tex --- a/paper/master_paper.tex Fri Jan 29 19:18:27 2021 +0900 +++ b/paper/master_paper.tex Sat Jan 30 13:29:28 2021 +0900 @@ -55,7 +55,7 @@ language={}, tabsize=4, lineskip=-0.5zw, - escapechar={@}, + escapechar={@, $}, } \def\lstlistingname{ソースコード} \def\lstlistlistingname{ソースコード目次} diff -r 7431f9572567 -r 284ddeee0f9a paper/src/meta.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/meta.pm Sat Jan 30 13:29:28 2021 +0900 @@ -0,0 +1,17 @@ +package meta; +use strict; +use warnings; + +sub replaceMeta { + return ( + [qr/PhilsImpl/ => \&generateMcMeta], + ); +} + +sub generateMcMeta { + my ($context, $next) = @_; + return "goto mcMeta($context, $next);"; +} + +1; +