view paper/evaluation.tex @ 54:cf325c78edc1

update
author mir3636
date Tue, 12 Feb 2019 07:20:51 +0900
parents 8be23dffcd3f
children 1e1804a9269a
line wrap: on
line source

\chapter{評価}

本研究では、Gears OS のモジュール化、メタレベルの計算の自動生成、
xv6 の CbC 書き換えの考察と、システムコールの書き換えを行なった。

これらの実装についての評価を行う。

\section{Gears OS のモジュール化}
Gears OS の モジュール化について評価を行う。
モジュール化されていない以前の 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 のリストから取り出す必要があるが、
ソースコード \ref{prevgear} 12、13行目のように Context に引数格納用として型ごとに確保された Data Gear を、
複数の Code Gear で使いまわしてしまう問題があった。
これも Interface を用いることで、Interface 用に実装で用いる Data Gear を持てるようになり、
ソースコード \ref{intergear} 12、13行目のように使うことができるようになった。

\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;
    goto meta(context, pushSingleLinkedStack)
}

__code pushSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, struct Element *element) {
    ...
}

__code pushSingleLinkedStack_stub(struct Context* context){
    SingleLinkedStack* stack = &context->data[SingleLinkedStack]->SingleLinkedStack;
    Element *element = &context->data[Element]->element;
    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{Code Gear の変換と Meta Gear の自動生成}

CbC はノーマルレベルとメタレベルという異なる階層を持つ言語である。
メタレベルのコードの変換と生成は本来コンパイラで行うべきものだが、
Code Gear の変換や Meta Gear の生成の考察や評価のため、
現在は Perl スクリプトにより、コンパイル時に生成、変換を行なっている。

Code Gear の引数は、ノーマルレベルと、メタレベルによって意味が異なる。
ノーマルレベルでは引数はそのまま次の Code Gear へと渡す引数の集合だが、
メタレベルでは Context から参照して取り出す Data Gear を表す。
この意味のズレを調整するのが stub Code Gear である。

stub Code Gear は、Code Gear 間の継続の間に挟まれる。
この stub Code Gear へ継続するための ノーマルレベルの Code Gear の変換作業を行うことは、
ノーマルレベルとメタレベルでのズレを調整するために必要な作業である。

また、stub Code Gear は Code Gear 毎に挿入されるため、               
これが自動生成されることによってソースコードの記述量が大幅に減少した。