Mercurial > hg > Papers > 2016 > kaito-master
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}