Mercurial > hg > Papers > 2021 > anatofuz-master
diff paper/chapter/04-interface.tex @ 44:786aea1c7cde
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 01 Feb 2021 12:27:23 +0900 |
parents | a5e840dede1b |
children | af80bd950c79 |
line wrap: on
line diff
--- a/paper/chapter/04-interface.tex Mon Feb 01 11:39:12 2021 +0900 +++ b/paper/chapter/04-interface.tex Mon Feb 01 12:27:23 2021 +0900 @@ -84,17 +84,25 @@ 例題ではStack Interfaceの実装はSingleLinkedStackである。 SingleLinkedStackの\texttt{pop2}の実装をソースコード\ref{src:pop2}に示す。 \lstinputlisting[label=src:pop2, caption=SingleLinkedStackのpop2]{src/pop2.cbc} +pop2はスタックから値を2つ取得するAPIである。 +pop2の継続は\texttt{next}であり、 継続先に\texttt{data}と\texttt{data1}を渡している。 +data、 data1は引数で受けている\texttt{union Data*}型の変数であり、 それぞれstackの中の値のポインタを代入している。 +この操作でstackから値を2つ取得している。 + このコードをgenerate\_stub.pl経由でメタ計算を含むコードに変換する。 変換した先のコードを\ref{src:pop2meta}に示す。 \lstinputlisting[label=src:pop2meta, caption=SingleLinkedStackのpop2のメタ計算]{src/pop2meta.cbc} +実際は\texttt{next}は\texttt{goto meta}に変換されてしまう。 +data、data1は\texttt{goto meta}の前にポインタ変数\texttt{O\_data}が指す値にそれぞれ書き込まれる。 +\texttt{O\_data}はpop2のStub CodeGearである\texttt{pop2SingleLinkedStack\_stub}を見るとなんであるかが分かる。 +つまり\texttt{O\_data}はcontext中に含まれているStack Interfaceのデータ保管場所にある変数dataのアドレスである。 当初Perlスクリプトが生成した\texttt{pop2Test1}のstub CodeGearはソースコード\ref{src:pop2stub-origin}のものである。 CodeGear間で処理されるデータの流れの概要図を図\ref{fig:stackTest1}に示す。 \lstinputlisting[label=src:pop2stub-origin, caption=生成されたStub]{src/pop2stub-origin.cbc} \texttt{\_\_code pop2Test}で遷移する先のCodeGearはStackInterfaceであり、 呼び出しているAPIは\texttt{pop2}である。 -pop2はスタックから値を2つ取得するAPIである。 取得したAPIはGearsOSのInterfaceの処理ルールにより、 Context中のStack Interfaceのデータ格納場所に書き込まれる。 しかしソースコード\ref{src:pop2stub-origin}の例では\texttt{Gearef(context, StackTest)}でContext中の\texttt{StackTest} Interfaceのdataの置き場所から値を取得している。 これではpop2でせっかく取り出した値を取得できない。 @@ -102,7 +110,7 @@ ここで必要となってくるのは、 呼び出し元のStack Interfaceからの値の取得である。 どのInterfaceから呼び出されているかは、 コンパイルタイムには確定できるのでPerlのトランスコンパイラでStub Codeを生成したい。 -\begin{figure}[htp] +\begin{figure}[h] \begin{center} \includegraphics[width=130mm]{drawio/stackTest1.pdf} \end{center} @@ -125,4 +133,10 @@ GearsOSでは継続として渡す場合や、 次のgoto文で遷移する先のCodeGearはノーマルレベルではenumの番号として表現されていた。 -今回のような次に実行するStub CodeGear、つまりメタCodeGearを切り替えたい場合は、ノーマルレベルからメタレベルへの変換時にenumの番号を切り替えることで実現可能である。 +enumが降られるCodeGearは、厳密にはCodeGearそのものではなくStub CodeGearに対して降られる。 +StubCodeGearを実装した分だけenumの番号が降られるため、 \texttt{goto meta}で遷移する際にenumの番号さえ合わせれば独自定義のStubに継続させることが可能である。 +別Interfaceから値を取り出したいケースの場合、 取り出してくる先のInterfaceと呼び出し元のCodeGearが確定したタイミングで別のStubCodeGearを生成する。 +呼び出し元のCodeGearが継続として渡すStubCodeGearのenumを、独自定義したenumに差し替えることでこの問題は解決する。 +この機能をPerlのトランスコンパイラである\texttt{generate\_stub.pl}に導入した。 + +\subsection{実装の手法}