Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 45:af80bd950c79
...
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 01 Feb 2021 14:23:40 +0900 (2021-02-01) |
parents | 786aea1c7cde |
children | 03a8903d40d7 |
files | paper/chapter/04-interface.tex paper/master_paper.pdf |
diffstat | 2 files changed, 37 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/04-interface.tex Mon Feb 01 12:27:23 2021 +0900 +++ b/paper/chapter/04-interface.tex Mon Feb 01 14:23:40 2021 +0900 @@ -95,19 +95,22 @@ \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}はpop2のStub CodeGearである\texttt{pop2SingleLinkedStack\_stub}で作製している。 つまり\texttt{O\_data}はcontext中に含まれているStack Interfaceのデータ保管場所にある変数dataのアドレスである。 +\texttt{pop2}のAPIを呼び出すと、 Stack Interface中の\texttt{data}にStackに保存されていたデータのアドレスが書き込まれる。 当初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}である。 -取得したAPIはGearsOSのInterfaceの処理ルールにより、 Context中のStack Interfaceのデータ格納場所に書き込まれる。 +pop2で取り出したデータは、 上記で確認した通りContext中のStack Interfaceのデータ格納場所に書き込まれる。 しかしソースコード\ref{src:pop2stub-origin}の例では\texttt{Gearef(context, StackTest)}でContext中の\texttt{StackTest} Interfaceのdataの置き場所から値を取得している。 -これではpop2でせっかく取り出した値を取得できない。 +これはInterfaceのImplのCodeGearは、Interfaceから値を取得するというGearsOSのルールの為である。 +現状ではpop2でせっかく取り出した値をStubCodeGearで取得できない。 -ここで必要となってくるのは、 呼び出し元のStack Interfaceからの値の取得である。 +ここで必要となってくるのは、 実装しているInterface以外の呼び出し元のInterfaceからの値の取得である。 +今回の例ではStackTest InterfaceではなくStack Interfaceからdata、 data1を取得したい。 どのInterfaceから呼び出されているかは、 コンパイルタイムには確定できるのでPerlのトランスコンパイラでStub Codeを生成したい。 \begin{figure}[h] @@ -129,7 +132,7 @@ しかしStubCodeGearそのものを、 別Interfaceから値を取り出すように書き換えてはいけない。 これは別Interfaceの継続として渡されるケースと、 次のgoto先として遷移するケースがあるためである。 前者のみの場合は書き換えで問題ないが、 後者のケースで書き換えを行ってしまうとStubで値を取り出す先が異なってしまう。 -どのような呼び出し方をしても対応できるようにするには工夫が必要となる。 +どのような呼び出し方をしても対応できるようにするには、 Stubを別に別ける必要がある。 GearsOSでは継続として渡す場合や、 次のgoto文で遷移する先のCodeGearはノーマルレベルではenumの番号として表現されていた。 @@ -139,4 +142,32 @@ 呼び出し元のCodeGearが継続として渡すStubCodeGearのenumを、独自定義したenumに差し替えることでこの問題は解決する。 この機能をPerlのトランスコンパイラである\texttt{generate\_stub.pl}に導入した。 -\subsection{実装の手法} +\section{別Interfaceからの書き出しを取得するStubの生成} +別Interfaceからの書き出しを取得する場合、 generate\_stub.plでは次の点をサポートする機能をいれれば実現可能である。 + +\begin{itemize} + \item goto先のCodeGearが出力を持つInterfaceでかつ継続で渡しているCodeGearが別Interfaceの場合の検知 + \begin{itemize} + \item この場合はgotoしている箇所で渡している継続のenumを、新たに作製したstubのenumに差し替える + \end{itemize} + \item 継続で実行された場合に別にInterfaceから値をとってこないといけないCodeGear自身 + \begin{itemize} + \item Stubを別のInterfaceから値をとる実装のものを別に作製する + \end{itemize} +\end{itemize} + +\texttt{generate\_stub.pl}内では変換対象のCbCのソースコードを2度読み込む。 +最初の読み込み時に継続の状況を確認し、 2度目の読み込み時に状況を踏まえてコードを生成すれば良い。 +初回の読み込み時にInterface経由の\texttt{goto}文があった場合に、別Interfaceからの出力があるかなどの情報を確認したい。 +Interface経由でのgoto文は\texttt{goto interface->method()}の形式で呼び出される。 +ソースコード\ref{src:parsedOutputStub.pl}はこの形式で来ていた行を読み込んだタイミングで実行される処理である。 +\lstinputlisting[label=src:parsedOutputStub.pl, caption=goto時に使用するinterfaceの解析]{src/parsedOutputStub.pl} + +1行目の正規表現はInterface経由でのgoto文の正規表現パターンである。 +変数\texttt{\$instance}はInterfaceのインスタンスである。正規表現パターンでは\texttt{interface->method}の\texttt{->}の前に来ている変数名に紐づけられる。 +変数\texttt{\$method}はgoto先のInterfaceのAPIである。正規表現パターンでは\texttt{interface->method}の\texttt{->}の後に来ているAPI名である。 +ソースコード\ref{src:insertTest1}の\texttt{pop2Test}では、 \texttt{stack->pop2}の呼び出しをしているため、 \texttt{stack}がインスタンスであり、 \texttt{pop2}がAPIである。 +現在解析しているgoto文が含まれているCodeGearの名前は、変数\texttt{\$currentCodeGear}で別途保存している。 +連想配列である\texttt{\$codeGearInfo}の中には、 各CodeGearで使われている変数と変数の型などの情報が格納されている。 +ソースコード\ref{src:parsedOutputStub.pl}の9行目では、 \texttt{\$codeGearInfo}経由でInterfaceのインスタンスから、具体的にどの型が呼ばれているかを取得している。 +\texttt{pop2Test}では、 \texttt{stack}がインスタンスに対応する型名は\texttt{Stack}となる。 \ No newline at end of file