Mercurial > hg > Papers > 2021 > anatofuz-master
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から取り出す必要がある。
--- /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;