view paper/cbc.tex @ 16:958634b9fa32

make paper directory
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Wed, 17 Feb 2016 16:59:46 +0900
parents cbc.tex@205805e6a6d8
children 9e1747657acd
line wrap: on
line source

\chapter{CbC}
Gears OS の実装には LLVM/Clang 上に実装した CbC を用いる。

CbC は C から for 文、while 文といったループ制御構文や関数呼び出しを取り除き、Code Segment と goto による軽量継続を導入している。
図:\ref{fig:cs} は goto による Code Segment の遷移を表したものである。

本章では CbC の特徴である Code Segment と Gears OS に対するサポートについて説明する。


\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.6]{./images/codesegment2.pdf}
  \end{center}
  \caption{goto による Code Segment 間の継続}
  \label{fig:cs}
\end{figure}

\section{Code Segment}
CbC では処理の単位として Code Segment を用いる。
Code Segment は CbC における最も基本的な処理単位であり、C の関数と異なり戻り値を持たない。
Code Segment の宣言は C の関数の構文と同じように行い、型に \_\_code を用いる。
前述した通り、Code Segment は戻り値を持たないので \_\_code はそれが関数ではなく Code Segment であることを示すフラグのようなものである。
Code Segment の処理内容の定義も C の関数同様に行うが、CbC にはループ制御構文が存在しないのでループ処理は自分自身への再帰的な継続を行うことで実現する。

現在の Code Segment から次の Code Segment への処理の移動は goto の後に Code Segment 名と引数を並べて記述するという構文を用いて行う。
この goto による処理の遷移を継続と呼ぶ。
C において関数呼び出しを繰り返し行う場合、呼び出された関数の引数の数だけスタックに値が積まれていくが、戻り値を持たない Code Segment ではスタックに値を積んでいく必要が無くスタックは変更されない。
このようなスタックに値を積まない継続を軽量継続と呼ぶ。
この軽量継続により並列化、ループ制御、関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようになる。

\section{プロトタイプ宣言の自動化}
Code Segment の処理単位は小さく、目的の計算を実現するためには多くの Code Segment を書く必要がある。
Code Segment と同じ数だけプロトタイプ宣言を書く必要があり、好ましくない。
また、tail call elimination を強制するためにはプロトタイプの宣言を正確に記述することを要求するためプログラマに対する負担が大きい。
つまり、プロトタイプ宣言を自動的に行うようにすることで tail call elimnation の条件を安定して満たすことができ、プログラマの負担も減らすことができる。

プロトタイプ宣言の自動化は、パーサーが Code Segment への継続の解析を行なった際にプロトタイプ宣言の有無を確認し、存在しない場合に接続先の Code Segment のプロトタイプ宣言を生成するというようにして行う。

\section{Gear OS の構文サポート}
Gears OS では Context から必要なデータを取り出して処理を行う。
しかし、Context を直接扱うのはセキュリティ的に好ましくない。
そこで Context から必要なデータを取り出して Code Segment に接続する stub を定義する。
stub は接続される Code Segment から推論することが可能である。
また、Code Segment の遷移には Meta Code Segment を挟む。
Meta Code Segment への接続も省略して記述できるようにする。
省略形のソースコード:\ref{sample}から実際にコンパイルされるソースコード:\ref{sample_trans}へ変換される。

\newpage

\lstinputlisting[label=sample, caption=省略形]{src/sample.c}
\lstinputlisting[label=sample_trans, caption=変換後]{src/sample_transform.c}