view paper/interface.tex @ 20:1c7e6703724a

update
author mir3636
date Wed, 30 Jan 2019 20:11:35 +0900
parents 68ea0500773f
children 1d8c163b7255
line wrap: on
line source

\chapter{Interface}
Interface は Gears OS のモジュール化の仕組みである。 
Interface は呼び出しの引数になる Data Gear の集合であり、そこで呼び出される Code Gear のエントリである。
呼び出される Code Gear の引数となる Data Gear はここで全て定義される。

Data Gear は、ノーマルレベルとメタレベルで見え方が異なる。
ノーマルレベルの Code Gear では Data Gear の引数に見える。
しかし、メタレベルでは Data Gear は Context が持つ構造体である。
この見え方の違いを Meta Code Gear である stub Code Gear によって調整する必要がある。

また、CbC は関数呼び出しと異なり、goto による継続で遷移を行う。
このため CbC の継続にはスタックフレームがなく引数を格納する場所がない。

Context は初期化の際に引数格納用の Data Gear の領域を確保する。
Code Gear が継続する際にはこの領域に引数の Data Gear を格納する。
この領域に確保された Data Gear へのアクセスは Interface の情報から行われる。

ソースコード\ref{pushStack} は、pushSingleLinkedStack のソースコードである。
ノーマルレベルの Code Gear では Stack の push の操作は、
push するデータと次の継続先の Code Gear という引数の集合のように見える。
しかしメタレベルでは Context が持つ構造体である。

stub Code Gear では Context が確保した 引数格納用の領域に格納した Data Gear を取り出している。
Interface を導入することでノーマルレベルとメタレベルのズレの調整を解決した。

\begin{lstlisting}[frame=lrbt,label=pushStack,caption={pushSingleLinkedStack}]
__code stackTest1(struct Stack* stack) {
    Node* node = new Node();
    node->color = Red;
    goto stack->push(node, stackTest2);
}

__code pushSingleLinkedStack_stub(struct Context* context) {
    SingleLinkedStack* stack = (SingleLinkedStack*)context->data[D_Stack]->Stack.stack->Stack.stack;
    Data* data = context->data[D_Stack]->Stack.data;
    num Code next = context->data[D_Stack]->Stack.next;
    goto pushSingleLinkedStack(context, stack, data, next);
}

__code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) {
    Element* element = new Element();
    element->next = stack->top;
    element->data = data;
    stack->top = element;
    goto next(...);
}
\end{lstlisting}

\section{Interface の定義}

ソースコード\ref{interface}は Stack の Interface である。
typedef struct Stack で Interface を定義する。
Impl には実装の型が入る。
ソースコード\ref{interface}、2〜4行目のunion Data で定義されてるものは、
Interface の API で用いる全ての Data Gear である。
Interface の全ての API で用いる全ての Data Gear は Interface で定義される。
ソースコード\ref{interface}、5〜13行目の \_\_code で記述されているものは、
Interface の API である。
ここでは Stack のAPI である push や pop などの Code Gear となっている。

\lstinputlisting[label=interface, caption=StackのInterface]{./src/Stack.cbc}


通常 Code Gear、Data Gear に参照するためには Context を通す必要があるが、
Interface を記述することでデータ構造の API と Data Gear を結びつけることが出来る。
これによりノーマルレベルとメタレベルの分離が可能となった。

\section{Interface の実装}
ソースコード\ref{implement}は Stack の実装の例である。
create の関数は 実装の初期化である。
ソースコード\ref{implement}、6〜12行目で実装の Code Gear に代入しているものは Context が
持つ enum で定義された Code Gear の番号である。
ソースコード \ref{Gears_code}、3行目で stack\verb|->|pop へと goto しているが、
stack\verb|->|pop には Code Gear の番号が入っているため実装した Code Gear へと継続する。
このため、ソースコード \ref{Gears_code} では 6行目の popSingleLinkedStack へと継続している。

\lstinputlisting[label=implement, caption=SingleLinkedStackの実装]{./src/stackimpl.cbc}