changeset 53:1a4d4e64f0b8

add Stack Interface code
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 01 Feb 2021 21:16:47 +0900
parents a25692dd0ca2
children 2cbaf041b085
files paper/chapter/04-interface.tex paper/master_paper.pdf paper/src/old-stack.h paper/src/stack.h
diffstat 4 files changed, 39 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter/04-interface.tex	Mon Feb 01 18:55:20 2021 +0900
+++ b/paper/chapter/04-interface.tex	Mon Feb 01 21:16:47 2021 +0900
@@ -4,6 +4,8 @@
 GearsOSのInterfaceでは、 従来はDataGearとCodeGearを分離して記述していた。
 CodeGearの入出力をDataGearとして列挙する必要があった。
 CodeGearの入出力として\texttt{\_\_code()}の間に記述したDataGearの一覧と、Interface上部で記述したDataGearの集合が一致している必要がある。
+ソースコード\ref{src:old-stack}はStackのInterfaceの例である。
+\lstinputlisting[label=src:old-stack, caption=従来のStack Interface]{src/old-stack.h}
 
 従来の分離している記法の場合、 このDataGearの宣言が一致していないケースが多々発生した。
 またInterfaceの入力としてのDataGearではなく、 フィールド変数としてDataGearを使うようなプログラミングスタイルを取ってしまうケースも見られた。
@@ -25,6 +27,15 @@
 }
 \end{lstlisting}
 
+GearsOSのInterfaceは入力と出力のAPIを定義するものであるので、 golangのInterfaceのように、関数のAPIを並べて記述するほうが簡潔であると考えた。
+\lstinputlisting[label=src:stack, caption=変更後のStack Interface]{src/stack.h}
+
+構文を変更するには、 GearsOSのビルドシステム上でInterfaceを利用している箇所を修正する必要がある。
+Interfaceはgenerate\_stub.plで読み込まれ、 CodeGearと入出力のDataGearの数え上げが行われる。
+この処理はInterfaceのパースに相当するものである。
+当然ではあるが、パース対象のInterfaceの構文は、変更前の構文にしか対応していない。
+
+
 \section{Implementの型をいれたことによる間違ったGearsプログラミング}
 Implementの型を導入したが、 GearsOSのプログラミングをするにつれていくつかの間違ったパターンがあることがわかった。
 自動生成されるStubCodeGearは、 goto metaから遷移するのが前提であるため、 引数をContextから取り出す必要がある。
Binary file paper/master_paper.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/old-stack.h	Mon Feb 01 21:16:47 2021 +0900
@@ -0,0 +1,17 @@
+typedef struct Stack<Type, Impl>{
+        union Data* stack;
+        union Data* data;
+        union Data* data1;
+        /* Type* stack; */
+        /* Type* data; */
+        /* Type* data1; */
+        __code whenEmpty(...);
+        __code clear(Impl* stack,__code next(...));
+        __code push(Impl* stack,Type* data, __code next(...));
+        __code pop(Impl* stack, __code next(Type* data, ...));
+        __code pop2(Impl* stack, __code next(Type* data, Type* data1, ...));
+        __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...));
+        __code get(Impl* stack, __code next(Type* data, ...));
+        __code get2(Impl* stack, __code next(Type* data, Type* data1, ...));
+        __code next(...);
+} Stack;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/stack.h	Mon Feb 01 21:16:47 2021 +0900
@@ -0,0 +1,11 @@
+typedef struct Stack<>{
+        __code clear(Impl* stack,__code next(...));
+        __code push(Impl* stack,union Data* data, __code next(...));
+        __code pop(Impl* stack, __code next(union Data* data, ...));
+        __code pop2(Impl* stack, __code next(union Data* data, union Data* data1, ...));
+        __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...));
+        __code get(Impl* stack, __code next(union Data* data, ...));
+        __code get2(Impl* stack, __code next(union Data* data, union Data* data1, ...));
+        __code next(...);
+        __code whenEmpty(...);
+} Stack;