# HG changeset patch # User mir3636 # Date 1548835609 -32400 # Node ID 9295b0c90a840bac0afef8f6a0e262084e8664d6 # Parent a2f7c20be41688450890441fa1bc1b16d58e29d8 update diff -r a2f7c20be416 -r 9295b0c90a84 paper/generate_code.tex --- a/paper/generate_code.tex Mon Jan 28 13:29:23 2019 +0900 +++ b/paper/generate_code.tex Wed Jan 30 17:06:49 2019 +0900 @@ -22,7 +22,7 @@ この Code Gear を generate stub によって変換、 stub Code Gear の生成を行なったコードがソースコード \ref{MetaCodeGear} である。 -\begin{lstlisting}[frame=lrbt,label=MetaCodeGear,caption={\footnotesize Stack pop の MetaCodeGear}] +\begin{lstlisting}[frame=lrbt,label=MetaCodeGear,caption={\footnotesize Stack pop の変換}] __code popSingleLinkedStack_stub(struct Context* context) { SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); @@ -64,18 +64,6 @@ 実装の Data Gear を取り出す際も、ポインタでの記述が複雑になってしまうため 同様に GearImpl を定義した。 GearImpl は Context と Data Gear の型、実装の Data Gear 名を指定することで参照する。 -ソースコード\ref{Gearef} は Gearef、GearImpl を用いずに書いた popSingleLinkedStack\_stub である。 - - -\begin{lstlisting}[frame=lrbt,label=ref,caption={Gearef、GearImplのないコード}] -__code popSingleLinkedStack_stub(struct Context* context) { - SingleLinkedStack* stack = (SingleLinkedStack*)context->data[D_Stack]->Stack.stack->Stack.stack; - enum Code next = context->data[D_Stack]->Stack.next; - Data** O_data = &context->data[D_Stack]->Stack.data; - goto popSingleLinkedStack(context, stack, next, O_data); -} -\end{lstlisting} - また、Code Gear は継続の際 meta へと goto する。 Context はすべての Code Gear のリストを持っており、継続先の Code Gear のアドレスは enum で対応付けられた Code Gear のアドレスのリストを参照して継続を行う。 diff -r a2f7c20be416 -r 9295b0c90a84 paper/interface.tex --- a/paper/interface.tex Mon Jan 28 13:29:23 2019 +0900 +++ b/paper/interface.tex Wed Jan 30 17:06:49 2019 +0900 @@ -1,9 +1,51 @@ - \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 である。 diff -r a2f7c20be416 -r 9295b0c90a84 paper/master_paper.pdf Binary file paper/master_paper.pdf has changed diff -r a2f7c20be416 -r 9295b0c90a84 paper/meta_computation.tex --- a/paper/meta_computation.tex Mon Jan 28 13:29:23 2019 +0900 +++ b/paper/meta_computation.tex Wed Jan 30 17:06:49 2019 +0900 @@ -65,7 +65,7 @@ \label{fig:IODataGear} \end{figure} -リスト \ref{Gears_code} は Gears OS での Stack の操作の Code Gear の例である。 +ソースコード \ref{Gears_code} は Gears OS での Stack の操作の Code Gear の例である。 popSingleLinkedStack での引数 stack が Input Data Gear、next は継続先の Code Gear のアドレス、 next の引数の data が Output Data Gear、... は可変長引数であることを示している。 pop の操作を行った後に goto next で引数で受けた次の Code Gear へと継続する。