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{実装の手法}