view paper/chapter4.tex @ 17:3afb4bfe1100

fix
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Mon, 15 Feb 2016 07:30:44 +0900
parents ea7938131775
children fc397777a7e2
line wrap: on
line source

\chapter{Gears OS サポート}
\ref{sec:Gears} 節で述べた Gears OS の記述を助ける構文について記す.

Gears OS のための構文のサポートには python スクリプトを用いた. 記述したプログラムをこのスクリプトに読み込ませることで CbC コンパイラでコンパイル可能な構文へと変換される. このようにすることで meta code segment, data segment を用いるGears OS のコードのコンパイルが可能になる.

\section{meta Code Segment の接続}
Gears OS では code segment 間の遷移に meta レベルの meta code segment を挟む. その様子を表したのが図 \ref{fig:metaCS} である. 通常レベルの code segment は一度 meta code segment へと継続し, その後次の code segment へと継続する. このとき通常レベルの code segment からは meta code segment への継続は見えず, 通常レベルの code segment に直接継続しているように見えるべきである (リスト \ref{hideMeta}). しかし既存の CbC コンパイラでは meta code segment への継続等は自分で記述する必要がある(リスト \ref{GearsCode}). これをリスト \ref{hideMeta} の形に変換するのが今回作成した python スクリプトである.

もう一つの機能として stub の自動生成がある. Gears OS では code segment は meta code segment に継続し, その後 code segment に継続すると述べたが, 正確には meta code segment から code segment に継続する際に stub という継続を挟む. stub では, code segment が必要とする data segment を context から取り出すという処理を行うもので, リスト \ref{GearsCode}, code1\_stub, code2\_stub がそれにあたる. stub は code segment 毎に生成されるためこの自動生成を行うことで code segment の記述量を約半分にすることができる. 

\begin{figure}[htpb]
 \begin{center}
  \scalebox{0.55}{\includegraphics{fig/metaCS.pdf}}
 \end{center}
 \caption{meta computation}
 \label{fig:metaCS}
\end{figure}

\begin{lstlisting}[frame=lrbt,label=GearsCode,caption={スクリプトにより出力される Gears OS コード}]
__code meta(struct Context* context, enum Code next) {
  goto (context->code[next])(context);
}

__code code1_stub(struct Context* context) {
  goto code1(context, &context->data[Allocate]->allocate);
}

__code code1(struct Context* context, struct Allocate* allocate) {
  allocate->size = sizeof(long);
  allocator(context);
  goto meta(context, Code2);
}

__code code2(struct Context* context, long* count) {
  *count = 0;
  goto meta(context, Code3);
}

__code code2_stub(struct Context* context) {
  goto code2(context, &context->data[Count]->count);
}
\end{lstlisting}

\begin{lstlisting}[frame=lrbt,label=hideMeta,caption={Gears OS のコード}]
__code meta(struct Context* context, enum Code next) {
  goto (context->code[next])(context);
}

__code code1(struct Allocate* allocate) {
  allocate->size = sizeof(long);
  allocator();
  goto code2();
}

__code code2(long* count) {
  *count = 0;
  goto code3();
}
\end{lstlisting}