view paper/cbc.tex @ 15:6dedd4ed6b6d

Update cbc description
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Thu, 19 Jan 2017 11:39:10 +0900
parents 6bf2e0196a1e
children 3ffd17f96e06
line wrap: on
line source

\chapter{Continuation based C}

Continuation based C (CbC)は当研究室で開発しているプログラミング言語であり、OSや組み込みソフトウェアの開発を主な対象としている。
CbC は C言語の下位の言語であり、構文はほぼC言語と同じものを持つが、よりアセンブラに近い形でプログラムを記述する。
CbC は CodeSegment と呼ばれる単位で処理を定義し、それらを組み合わせることにでプログラム全体を構成する。
データの単位は DataSegment と呼ばれる単位で定義し、それら CodeSegment によって変更していくことでプログラムの実行となる。
CbC の処理系には llvm/clang による実装\cite{110009766999} と gcc\cite{weko_82695_1}による実装などが存在する。

% {{{ section: CodeSegment と DataSegment

\section{CodeSegment と DataSegment}
本研究室では検証を行ないやすいプログラムの単位として CodeSegment と DataSegment を用いるプラグラミングスタイルを提案している。

CodeSegment は処理の単位である。
入力を受け取り、それに対して処理を行なった後を出力を行なう。
また、CodeSegment は他の CodeSegment と組み合わせることが可能である。
あるCodeSegment A を CodeSegment B に接続した場合、 A の出力は B の入力となる。

% TODO: figure (cs A . cs B)

DataSegment は CodeSegment が扱うデータの単位であり、処理に必要なデータが全て入っている。
CodeSegment の入力となる DataSegment は Input DataSegment と呼ばれ、出力は Output DataSegment と呼ばれる。
CodeSegment A と CodeSegment B を接続した時、A の Output DataSegment は B の入力 Input DataSegment となる。

% TODO: figure (cs A --(ds)--> cs B)

% }}}

% {{{ Continuation based C における CodeSegment と DataSegment

\section{Continuation based C における CodeSegment と DataSegment}
最も基本的な CbC のソースコードをリスト\ref{src:goto}に、ソースコードが実行される流れを図\ref{fig:goto}に示す。
Continuation based C における CodeSegment は返り値を持たない関数として表現される。
CodeSegment を定義するためには、C言語の関数を定義する構文の返り値の型部分に \verb/__code/ キーワードを指定する。
Input DataSegment は関数の引数として定義される。
次の CodeSegment へ処理を移す際には \verb/goto/ キーワードの後に CodeSegment 名と Input DataSegment を指定する。
処理の移動を軽量継続と呼び、リスト\ref{src:goto}内の \verb/goto cs1(a+b);/ がこれにあたる。
この時の \verb/(a+b)/ が次の CodeSegment である cs1 の Input DataSegment となる cs0 の Output DataSegment である。

\lstinputlisting[label=src:goto, caption=CodeSegment の軽量継続] {src/goto.cbc}

\begin{figure}[htbp]
    \begin{center}
        \includegraphics[scale=1.0]{fig/goto.pdf}
        \caption{CodeSegment の軽量継続}
        \label{fig:goto}
    \end{center}
\end{figure}

% TODO: scheme ref?
Scheme などの call/cc といった継続はトップレベルから現在までの位置を環境として保持する。
通常環境とは関数の呼び出しスタックの状態である。
CbC の軽量継続は呼び出し元の情報を持たないため、スタックを破棄しながら処理を続けていく。
よって、リスト\ref{src:goto} のプログラムでは cs0  から cs1 へと継続した後にcs0 へ戻ることはできない。

もう少し複雑な CbC のソースコードをリスト\ref{src:factrial}に、実行される流れを図\ref{fig:factrial}に示す。
このソースコードは整数の階乗を求めるプログラムである。
CodeSegment factorial0 では自分自身への再帰的な継続を用いて階乗を計算している。
軽量継続時には関数呼び出しのスタックは存在しないが、計算中の値を DataSegment で持つことで再帰を含むループ処理も行なうことができる。

\lstinputlisting[label=src:factrial, caption=階乗を求める CbC プログラム] {src/factrial.cbc}

\begin{figure}[htbp]
    \begin{center}
        \includegraphics[scale=0.8]{fig/factorial.pdf}
        \caption{階乗を求める CbC プログラム}
        \label{fig:factrial}
    \end{center}
\end{figure}

% }}}

\section{MetaCodeSegment と MetaDataSegment}
\section{GearsOS}
\section{メタ計算ライブラリ akasha}
\section{akasha を用いた赤黒木の実装の検証}