changeset 20:284ddeee0f9a

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sat, 30 Jan 2021 13:29:28 +0900
parents 7431f9572567
children 48d1dc04c1c4
files paper/chapter/02-interface.tex paper/master_paper.pdf paper/master_paper.tex paper/src/meta.pm
diffstat 4 files changed, 38 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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}
Binary file paper/master_paper.pdf has changed
--- 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{ソースコード目次}
--- /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;
+