view Paper/tex/cbc.tex @ 15:f0d512637e52

Add ref
author soto <soto@cr.ie.u-ryukyu.ac.jp>
date Wed, 01 Feb 2023 22:16:45 +0900
parents c28e8156a37b
children 40a9af45b375
line wrap: on
line source

\chapter{Continuation based C}
Continuation based C\cite{kaito-lola} (以下 CbC) は 
関数呼び出しの際にjmp命令で遷移をし,環境を持たずに遷移する
ことができるC言語である,
すなわちC言語の下位言語にあたり,よりアセンブラに近い記述を行う.

CbC では CodeGear を処理の単位,
DataGear をデータの単位として記述するプログラミング言語である.

jmp命令で関数遷移するため関数遷移し実行が終了しても,もとの関数に戻ることはない.
そのため次に遷移する Code Gear を指定する.
これは,関数型プログラミングでの末尾関数呼び出しに相当する.
したがって,Code Gear に Deta Gear を与え,それをもとに処理を行い,
出力として Data Gear を返し,また次の Code Gearに遷移していく流れとなる.

本章ではCbCの概要について説明する.

\section{Code Gear / Data Gear}
CbCでは,検証しやすいプログラムの単位として DataGear と CodeGear という単位を用いる.

CodeGear はプログラムの処理そのものであり,一般的なプログラム言語における関数と同じ役割である.
DataGear は CodeGear で扱うデータの単位であり,処理に必要なデータである.
CodeGear の入力となる DataGear を Input DataGear と呼び,出力は Output DataGear と呼ぶ.

CodeGear 間の移動は継続を用いて行われる.
継続は関数呼び出しとは異なり,呼び出した後に元のコードに戻れず,次の CodeGear へ継続を行う.
これは,関数型プログラミングでは末尾再帰をしていることと同義である.


\section{CbC と C言語の違い}
同じ仕様でCbCとC言語で実装した際の違いを,実際のコードを元に比較する.
比較するにあたり,再起処理が含まれるコードの例として,
フィボナッチ数列の n 番目を求めるコードを挙げる.
C言語で記述したものが\coderef{fib_c}.CbCで記述したものが\coderef{fib_cbc}になる.
CbCは実行を継続するため, return を行えない.そのためC言語での実装も return を書
かず関数呼び出しを行い,最後にexitをして実行終了するように記述している.

\lstinputlisting[label=code:fib_c, caption=C言語で記述した フィボナッチ数列の n 番目
を求めるコード, firstline=5] {src/cbc/fib.c}
\lstinputlisting[label=code:fib_cbc, caption=CbCで記述した フィボナッチ数列の n 番目
を求めるコード, firstline=5] {src/cbc/fib.cbc}

軽量実装になっているのか,上記のコードをアセンブラ変換した結果を見て確認する.
全てを記載すると長くなるので,アセンブラ変換した際のfib関数のみを記載する.
C言語で記述した\coderef{fib_c}をアセンブラ変換した結果が\coderef{c-ass}.
CbCで記述した\coderef{fib_cbc}をアセンブラ変換した結果が\coderef{cbc-ass}になる.

比較すると,fib 関数の内部で再度 fib 関数を呼び出す際,
C言語で実装した\coderef{c-ass}の30行目では callq で fib 関数を呼び出している.
対して CbC で実装した\coderef{cbc-ass}の32行目では, jmp により fib 関数に移動
している.

\lstinputlisting[label=code:c-ass, caption=cで記述した際の fib 関数のアセンブラ] {src/cbc/c.txt}
\lstinputlisting[label=code:cbc-ass, caption=cbcで記述した際の fib 関数のアセンブラ] {src/cbc/cbc.txt}

以上のことから CbCが軽量継続を行っていると言える.


\section{Meta Code Gear / Meta Data Gear}
Meta DataGear は CbC 上のメタ計算で扱われる DataGear である.例えば stub
CodeGear では Context と呼ばれる接続可能な CodeGear,DataGear のリストや,DataGear
のメモリ空間等を持った Meta DataGear を扱っている.

また,プログラムを記述する際は,ノーマルレベルの計算の他に,メモリ管理,スレッド管理,資源管理等を記述しなければならない処理が存在する.
これらの計算はノーマルレベルの計算と区別してメタ計算と呼ぶ.

メタ計算は OS の機能を通して処理することが多く,信頼性の高い記述が求められる.
そのため, CbC ではメタ計算を分離するために Meta CodeGear, Meta DataGear を定義している.

Meta CodeGear は CbC 上でのメタ計算で,通常の CodeGear を実行する際に必要なメタ計算を分離するための単位である.
図 \ref{fig:meta-cgdg} のように CodeGear を実行する前後や DataGear の大枠として Meta Gear が存在している.

\begin{figure}[htpb]
 \begin{center}
  \scalebox{0.65}{\includegraphics{fig/cbc_codegear.pdf}}
 \end{center}
 \caption{メタ計算を可視化した CodeGear と DataGear}
 \label{fig:meta-cgdg}
\end{figure}