Mercurial > hg > Papers > 2020 > ryokka-master
view paper/cbc.tex @ 19:046b2b20d6c7 default tip
fix
author | ryokka |
---|---|
date | Mon, 09 Mar 2020 11:25:49 +0900 |
parents | 831316a767e8 |
children |
line wrap: on
line source
\chapter{Continuation based C} \label{c:cbc} Continuation based C\cite{kaito-lola} (以下 CbC) は CodeGear を処理の単位、 DataGear をデータの単位として記述するプログラミング言語である。 CbC は C 言語とほぼ同じ構文を持つが、よりアセンブラに近い記述になる。 CbC のプログラミングでは DataGear を CodeGear で変更し、その変更を次の CodeGear に渡して処理を行う。 現在 CbC の処理系には llvm/clang による実装 \cite{utah-master} \cite{cbc-llvm} と gcc \cite{weko_82695_1} \cite{cbc-gcc} による実装が存在する。 本章は CbC の概要についての説明する。 \section{Code Gear と Data Gear} CbC では検証しやすいプログラムの単位として DataGear と CodeGear という 単位を用いるプログラミングスタイルを提案している。 DataGear は CodeGear で扱うデータの単位であり、処理に必要なデータである。 CodeGear の入力となる DataGear を Input DataGear と呼び、 出力は Output DataGear と呼ぶ。 CodeGear はプログラムの処理そのもので、\figref{fig:cgdg}で示しているように任意の数の Input DataGear を参照し、処理が完了すると任意の数の Output DataGear に書き込む。 CodeGear 間の移動は継続を用いて行われる。継続は関数呼び出しとは異なり、呼び出し た後に元のコードに戻らず、次の CodeGear へ継続を行う。 これは、関数型プログラミングでは末尾関数呼び出しを行うことに相当する。 \begin{figure}[htpb] \begin{center} \scalebox{0.6}{\includegraphics{fig/cgdg.pdf}} \end{center} \caption{CodeGear と DataGear} \label{fig:cgdg} \end{figure} \section{Meta CodeGear、 Meta DataGear} プログラムの記述する際は、ノーマルレベルの計算の他に、メモリ管理、スレッド管理、資源管理等を記述しなければならない処理が存在する。 これらの計算はノーマルレベルの計算と区別してメタ計算と呼ぶ。 メタ計算は OS の機能を通して処理することが多く、信頼性の高い記述が求められる。 そのため、 CbC ではメタ計算を分離するために Meta CodeGear、 Meta DataGear を定義している。 Meta CodeGear は CbC 上でのメタ計算で、通常の CodeGear を実行する際に必要なメタ計算を分離するための単位である。 \figref{fig:meta-cgdg} のように CodeGear を実行する前後や DataGear の大枠として Meta Gear が存在している。 \begin{figure}[htpb] \begin{center} \scalebox{0.54}{\includegraphics{fig/meta-cg-dg.pdf}} \end{center} \caption{メタ計算を可視化した CodeGear と DataGear} \label{fig:meta-cgdg} \end{figure} 例として CodeGear が DataGear から値を取得する際に使われる、 stub CodeGear について説明する。 CbC では CodeGear を実行する際、ノーマルレベルの計算からは見えないが必要な DataGear を Context と呼ばれる Meta DataGear を通して取得することになる。これはユーザーが直接データを扱える状態では信頼性が高いとは言えないと考えるからである。 そのために、 Meta CodeGear として Context から必要な DataGear を取り出し、 CodeGear に接続する stub CodeGear という Meta CodeGear を定義している。 Meta DataGear は CbC 上のメタ計算で扱われる DataGear である。 例えば stub CodeGear では Context と呼ばれる接続可能な CodeGear、 DataGear のリストや、DataGear のメモリ空間等を持った Meta DataGear を扱っている。