view final_main/chapter2.tex @ 1:0035f6d4826f

fix MindMap,add some chapter
author ryokka
date Thu, 01 Feb 2018 01:14:30 +0900
parents 46d543c569d2
children 2155c6ff589f
line wrap: on
line source

\chapter{Continuation based C (CbC)}

%% CbCとはなにか?どのようなものか?どのようにしてなりたっているか?

Continuation based C (以下 CbC )は当研究室で開発しているプログラミング言語である。
CbC は殆ど C 言語と同じ構文を持つが、関数よりも細かい記述でプログラミングする。
CbC では処理を CodeSegment という単位で定義し、処理に使うデータをまとめて
 DataSegment という単位で定義している。
実行時には CodeSegment で DataSegment を変更しながら処理を遷移していくことでプロ
グラムを実行する。
CbCの処理系には llvm/clang による実装と gcc による実装などが存在している。


\section{CodeSegment と DataSegment}
%% どういう概念? どうしてそうするの? どうやってつかうの? 

本研究室では検証しやすいプログラムの単位として CodeSegment と DataSegment を用いるプ
ログラミングスタイルを提案している。% 本当に検証のためだけなの?
この単位では通常の関数より細かいもので、通常の関数処理をより細かく分割できる。そのため通常より細かい単位で検証できる。
 CodeSegment は処理の単位である。入力を受け取り、処理を行なった後に出力を行う。
 CodeSegment は他の CodeSegment と接続することができる。

 DataSegment は CodeSegment で扱うデータの単位であり、処理に必要なデータが全て入って
いる。CodeSegment の入力となる DataSegment は Input DataSegment と呼ばれ、
出力は Output DataSegment と呼ばれる。
リスト \ref{code_simple} の場合, cs0 は cs1 に継続すると cs0 の環境は破棄されて
しまうため, cs0 に戻ることは出来ない. 
\begin{lstlisting}[frame=lrbt,label=code_simple,caption={\footnotesize code segment の軽量継続}]
__code cs0(int a, int b){
  goto cs1(a+b);
}

__code cs1(int c){
  goto cs2(c);
}
\end{lstlisting}

\begin{figure}[htpb]
 \begin{center}
  \scalebox{0.55}{\includegraphics{fig/codesegment.pdf}}
 \end{center}
 \caption{code segment の軽量継続}
 \label{fig:code_simple}
\end{figure}


\begin{lstlisting}[frame=lrbt,label=factorial,caption={\footnotesize 階乗を求め
る CbC プログラムの例}]
__code print_factorial(int prod)
{
  printf("factorial = %d\n",prod);
  exit(0);
}

__code factorial0(int prod, int x)
{
  if ( x >= 1) {
    goto factorial0(prod*x, x-1);
  }else{
    goto print_factorial(prod);
  }
  
}

__code factorial(int x)
{
  goto factorial0(1, x);
}

int main(int argc, char **argv)
{
  int i;
  i = atoi(argv[1]);
  
  goto factorial(i);
}
\end{lstlisting}

\begin{figure}[htpb]
 \begin{center}
  \scalebox{0.55}{\includegraphics{fig/factorial.pdf}}
 \end{center}
 \caption{階乗を求める CbC プログラムの軽量継続図}
 \label{fig:factorial}
\end{figure}

% \section{環境付き継続}
% \label{sec:withEnv}
% 環境付き継続の話いれる。。。?


\section{CbC での CodeSegment と DataSegment の表現} %% 例題
%% CbCの具体的なコード類。どういう風に書くのか〜?
%% Metaな話は今書いてもどうせ使わないので検証に使える〜くらいで置いておく。Meta
%% 部分は生成でき、そこで検証用の動作をする感じでは?hora理論使ったりするといい
%% かんじにできるんじゃないかな

% 流れ CbCではどうやってCodeSegmentつかうの?他との違いは?軽量継続って何?ルー
% プ処理とかってどうするの? Metaってなに?なるほど?ってかんじ

CbC 上で CodeSegment を定義するためには、C言語の関数を定義する構文の返り値の型部
分に \_\_code キーワードを指定する。その際、Input DataSegment は関数の引数として定義される。
次の CodeSegment をの実行には goto キーワードの後に CodeSegment 名と Input
DataSegment を指定する必要がある。

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

軽量継続時には関数呼び出しのスタックは存在しないが、計算中の値を DataSegment で
スタックを持つことで再帰を含むループ処理を行なうことも可能である。


% meta とか stub とかはmirさんの論文から持ってこようよ
% 見てみたけどattonさん以外はGearsのとこにmetaのお話入ってるからどうしたものか。。。

% \section{MetaCodeSegment と MetaDataSegment}
% プログラムを記述する際、本来行いたい処理の他に記述しなければならないメタレベルの処理が存在し
% ている。例えば、メモリ管理、並列処理、エラーハンドリングなどの処理がこれにあたり、これ
% らをメタ計算と呼ぶ。% 自己反映計算〜とかリフレクション〜っていいたい気もする
% CodeSegment と DataSegment を用いたプログラミングでは通常の処理とメタレベルの処
% 理を分離して記述する。
% 通常の処理と比べてメタレベルの処理は高度なものが多く、通常メタレベルの処理はライブラ
% リや OS 側が提供している。そのため、ユーザー側は通常メタレベルの処理を触ることが
% できない。CbCでは通常の処理を書いているプログラムにメタレベルの処理を追
% 加することができる。また、通常の処理からメタレベルの処理は遮蔽されているため、通
% 常の処理を弄ることなくメタレベルの処理を切り替えることもできる。
% CbC ではメタレベルの処理を行う CodeSegment のことを Meta CodeSegmentと呼び、メタ
% レベルの処理に必要な DataSegment を Meta DataSegment と呼ぶ。Meta CodeSegment は通
% 常の CodeSegment の前に