changeset 39:4f4d3f1fc568

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sun, 31 Jan 2021 22:42:23 +0900
parents ae00fdac2e99
children 66b32f3ec7fa
files paper/chapter/02-interface.tex paper/master_paper.pdf
diffstat 2 files changed, 20 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter/02-interface.tex	Sun Jan 31 21:29:23 2021 +0900
+++ b/paper/chapter/02-interface.tex	Sun Jan 31 22:42:23 2021 +0900
@@ -90,4 +90,23 @@
 取得したAPIはGearsOSのInterfaceの処理ルールにより、 Context中のStack Interfaceのデータ格納場所に書き込まれる。
 しかしソースコード\ref{src:pop2stub-origin}の例では\texttt{Gearef(context, StackTest)}でContext中の\texttt{StackTest} Interfaceのdataの置き場所から値を取得している。
 これではpop2でせっかく取り出した値を取得できない。
-ここで必要となってくるのは、 呼び出し元のInterfaceからの値の取得である。
\ No newline at end of file
+ここで必要となってくるのは、 呼び出し元のStack Interfaceからの値の取得である。
+どのInterfaceから呼び出されているかは、 コンパイルタイムには確定できるのでPerlのトランスコンパイラでStub Codeを生成したい。
+
+
+別Interfaceから値を取得するには別の出力があるCodeGearの継続で渡されたCodeGearをまず確定させる。
+今回の例では\texttt{pop2Test1}が該当する。
+このCodeGearの入力の値と、 出力があるCodeGearの出力を見比べ、 出力をマッピングすれば良い。
+Stack Interfaceのpop2はdataとdata1に値を書き込む。
+pop2Test1の引数はdata, data1, stackであるので、前2つにpop2の出力を代入したい。
+
+Contextから値を取り出すのはメタ計算であるStub CodeGearで行われる。
+別Interfaceから値を取り出そうとする場合、 すでにPerlトランスコンパイラが生成しているStubを書き換えてしまう方法も取れる。
+しかしStubCodeGearそのものを、 別Interfaceから値を取り出すように書き換えてはいけない。
+これは別Interfaceの継続として渡されるケースと、 次のgoto先として遷移するケースがあるためである。
+前者のみの場合は書き換えで問題ないが、 後者のケースで書き換えを行ってしまうとStubで値を取り出す先が異なってしまう。
+どのような呼び出し方をしても対応できるようにするには工夫が必要となる。
+
+
+GearsOSでは継続として渡す場合や、 次のgoto文で遷移する先のCodeGearはノーマルレベルではenumの番号として表現されていた。
+今回のような次に実行するStub CodeGear、つまりメタCodeGearを切り替えたい場合は、ノーマルレベルからメタレベルへの変換時にenumの番号を切り替えることで実現可能である。
Binary file paper/master_paper.pdf has changed