comparison paper/chapter/02-interface.tex @ 39:4f4d3f1fc568

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sun, 31 Jan 2021 22:42:23 +0900
parents ae00fdac2e99
children
comparison
equal deleted inserted replaced
38:ae00fdac2e99 39:4f4d3f1fc568
88 \texttt{\_\_code pop2Test}で遷移する先のCodeGearはStackInterfaceであり、 呼び出しているAPIは\texttt{pop2}である。 88 \texttt{\_\_code pop2Test}で遷移する先のCodeGearはStackInterfaceであり、 呼び出しているAPIは\texttt{pop2}である。
89 pop2はスタックから値を2つ取得するAPIである。 89 pop2はスタックから値を2つ取得するAPIである。
90 取得したAPIはGearsOSのInterfaceの処理ルールにより、 Context中のStack Interfaceのデータ格納場所に書き込まれる。 90 取得したAPIはGearsOSのInterfaceの処理ルールにより、 Context中のStack Interfaceのデータ格納場所に書き込まれる。
91 しかしソースコード\ref{src:pop2stub-origin}の例では\texttt{Gearef(context, StackTest)}でContext中の\texttt{StackTest} Interfaceのdataの置き場所から値を取得している。 91 しかしソースコード\ref{src:pop2stub-origin}の例では\texttt{Gearef(context, StackTest)}でContext中の\texttt{StackTest} Interfaceのdataの置き場所から値を取得している。
92 これではpop2でせっかく取り出した値を取得できない。 92 これではpop2でせっかく取り出した値を取得できない。
93 ここで必要となってくるのは、 呼び出し元のInterfaceからの値の取得である。 93 ここで必要となってくるのは、 呼び出し元のStack Interfaceからの値の取得である。
94 どのInterfaceから呼び出されているかは、 コンパイルタイムには確定できるのでPerlのトランスコンパイラでStub Codeを生成したい。
95
96
97 別Interfaceから値を取得するには別の出力があるCodeGearの継続で渡されたCodeGearをまず確定させる。
98 今回の例では\texttt{pop2Test1}が該当する。
99 このCodeGearの入力の値と、 出力があるCodeGearの出力を見比べ、 出力をマッピングすれば良い。
100 Stack Interfaceのpop2はdataとdata1に値を書き込む。
101 pop2Test1の引数はdata, data1, stackであるので、前2つにpop2の出力を代入したい。
102
103 Contextから値を取り出すのはメタ計算であるStub CodeGearで行われる。
104 別Interfaceから値を取り出そうとする場合、 すでにPerlトランスコンパイラが生成しているStubを書き換えてしまう方法も取れる。
105 しかしStubCodeGearそのものを、 別Interfaceから値を取り出すように書き換えてはいけない。
106 これは別Interfaceの継続として渡されるケースと、 次のgoto先として遷移するケースがあるためである。
107 前者のみの場合は書き換えで問題ないが、 後者のケースで書き換えを行ってしまうとStubで値を取り出す先が異なってしまう。
108 どのような呼び出し方をしても対応できるようにするには工夫が必要となる。
109
110
111 GearsOSでは継続として渡す場合や、 次のgoto文で遷移する先のCodeGearはノーマルレベルではenumの番号として表現されていた。
112 今回のような次に実行するStub CodeGear、つまりメタCodeGearを切り替えたい場合は、ノーマルレベルからメタレベルへの変換時にenumの番号を切り替えることで実現可能である。