view paper/chapter3.tex @ 28:f6a579a77708

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 12 Feb 2019 16:37:57 +0900
parents da266bef2120
children 96e9cf9c2ea2
line wrap: on
line source

\chapter{Continuation Based C}
\section{CbCの概要}
Continuation Based C (CbC) は当研究室で開発を行っているプログラミング言語である。
現在はCコンパイラであるgcc及びllvmをバックエンドとしたclang、 MicroCコンパイラ上の3種類の実装がある。

C言語を用いてプログラミングを行い場合、本来プログラマが行いたい処理の他に、 mallocなどの関数を利用したメモリのアロケートなどのメモリ管理が必要となる。
他にもエラーハンドリングなどの雑多な処理が必要となる。

これらの処理をmeta computationと呼ぶ。
実装しているプログラムにおけるエラーの原因が、 通常の処理かmeta computationなのか区別を行いたい。
また、 プログラム自身の検証や証明も、 通常の関数などと meta computationは区別したい。
通常C言語などを用いたプログラミングの場合、 meta computationと通常の処理を分割を行おうとすると、 それぞれ事細やかに関数やクラスを分割せねばならず容易ではない。

CbCでは関数よりmeta computationを細かく記述する為に、 CodeGearと呼ばれる単位を導入する。
CodeGearでは、 データの入出力としてDetaGearという単位を導入する。
CbCでは、 これらCodeGear と DetaGearを基本単位として実装していくプログラミングスタイルを取る。

\section{CodeGear}

CbCではC言語の関数の代わりに CodeGear を導入する。
CodeGearはC言語の関数宣言の型名の代わりに \_\_codeと書く事で宣言出来る。
\_\_codeはCbCコンパイラでの扱いはvoidと同じ型として扱うが、 CbCプログラミングではCodeGearである事を示す、 識別子として利用する。

CodeGear間の移動はgoto文で行い、 gotoの後に対応するCodeGear名を記述することで遷移する。
通常C言語の関数呼び出しでは、 スタックポインタを操作し、 ローカル変数や、 レジスタ情報をスタックに保存する。
これらは通常アセンブラのcall命令として処理される。

CbCの場合、 スタックフレームを操作せず、 レジスタの値を変更せずに次のCodeGearに遷移する。
この際Cの関数呼び出しとは異なり、 プログラムカウンタを操作するのみのjmp命令として処理される。
通常Schemeのcall/ccなどの継続と呼ばれる処理は、 現在のプログラムまでの位置や情報を、 環境として所持した状態で遷移する。
CbCの場合これら環境を持たず遷移する為、 通常の継続と比較して軽量であるから、 軽量継続であると言える。
CbCは軽量継続を利用するためにレジスタレベルでの実装が可能となり、 Cよりも低級な言語と言える。


CodeGear間の入出力の受け渡しは引数を利用して行う。
これは軽量継続時に、 CodeGearの入出力のインターフェイスを揃えることで、 引数で与えられたレジスタを変更せずに繊維する事が可能であるためである。


実際にCbCで書いたコード例をCode\ref{cbc_example_test}に示す。

\lstinputlisting[frame=lrbt, label=cbc_example_test, caption=加算と文字列を設定するCbCコードの例]{./codes/cbc_example_test.cbc}