# HG changeset patch # User mir3636 # Date 1549904452 -32400 # Node ID 8be23dffcd3f03024a54bce1a8331cf82a76d143 # Parent 3179b8daa958b79de3d3c5ea013fe8dacbb40d7c update diff -r 3179b8daa958 -r 8be23dffcd3f paper/evaluation.tex --- a/paper/evaluation.tex Mon Feb 11 23:22:07 2019 +0900 +++ b/paper/evaluation.tex Tue Feb 12 02:00:52 2019 +0900 @@ -7,11 +7,18 @@ \section{Gears OS のモジュール化} Gears OS の モジュール化について評価を行う。 -Gears OS では、ある Data Gear を Code Gear が扱う場合、 +モジュール化されていない以前の Gears OS ではソースコード \ref{prevgear} 4行目のように、 +Code Gear 直接指定しなければならなかった。 +Interface を用いた ソースコード \ref{intergear} ではここを stack->push のように抽象化することができる。 + +また、Gears OS では、ある Data Gear を Code Gear が扱う場合、 Code Gear に対応する Data Gear を Context が持つ Data Gear のリストから取り出す必要があるが、 -Context に 全ての Code Gear と Data Gear +ソースコード \ref{prevgear} 12、13行目のように Context に引数格納用として型ごとに確保された Data Gear を、 +複数の Code Gear で使いまわしてしまう問題があった。 +これも Interface を用いることで、Interface 用に実装で用いる Data Gear を持てるようになり、 +ソースコード \ref{intergear} 12、13行目のように使うことができるようになった。 -\begin{lstlisting}[frame=lrbt,label=syscall_list,caption={\footnotesize xv6 のシステムコールのリスト}] +\begin{lstlisting}[frame=lrbt,label=prevgear,caption={\footnotesize Interface を用いない Gears}] __code cg1 (struct Context* context, struct Element* element) { struct Node* node1 = new Node(); element->data = (union Data*)node1; @@ -25,8 +32,31 @@ __code pushSingleLinkedStack_stub(struct Context* context){ SingleLinkedStack* stack = &context->data[SingleLinkedStack]->SingleLinkedStack; Element *element = &context->data[Element]->element; - goto pushSingleLinkedStack(context, stack, data) + goto pushSingleLinkedStack(context, stack, data); } \end{lstlisting} - + +\begin{lstlisting}[frame=lrbt,label=intergear,caption={\footnotesize Interface を用いた Gears}] +__code cg1 (struct Context* context, struct Stack* stack) { + struct Node* node1 = new Node(); + goto stack->push((union Data*)node1,cg2); +} + +__code pushSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, union Data* data, __code next(...)) { + ... +} + +__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; + enum Code next = &context->data[D_Stack]->Stack->next; + goto pushSingleLinkedStack(context, stack, data, next); +} + +\end{lstlisting} + +\section{Meta Gear の自動生成} + + +