view paper/interface.tex @ 17:9295b0c90a84

update
author mir3636
date Wed, 30 Jan 2019 17:06:49 +0900
parents ddf62b739703
children c38593d39041
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{notref} は、pushSingleLinkedStack の stub Code Gear を含めたソースコードである。
ノーマルレベルの Code Gear では Stack の push の操作は、
push するデータと次の継続先の Code Gear という引数の集合のように見える。
しかしメタレベルでは Context が

\begin{lstlisting}[frame=lrbt,label=notref,caption={pop stub Code Gear}]
__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}

(もっと細かく書く)

ソースコード\ref{interface}は Stack の Interface である。
\_\_code で記述されているものは Stack が実装するべき push や pop などの Code Gear、
union Data で記述されているものは、Stack の Code Gear の引数の Data 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->pop へと goto しているが、
stack->pop には Code Gear の番号が入っているため実装した Code Gear へと継続する。
このため、ソースコード \ref{Gears_code} では 6行目の popSingleLinkedStack へと継続している。

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