Mercurial > hg > Papers > 2023 > soto-master
view Paper/tex/cbc.tex @ 32:4915eaa51ee0 default tip
Add front
author | soto <soto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 23 Feb 2023 18:39:56 +0900 |
parents | 76055a4c1dd2 |
children |
line wrap: on
line source
\chapter{Continuation based C} Continuation based C\cite{kaito-lola}は 関数呼び出しの際にjmp命令で遷移をし、環境を持たずに遷移する ことができるC言語である。 すなわちC言語の下位言語にあたり、よりアセンブラに近い記述を行う。 本章ではCbCの概要について説明する。 \section{CodeGear / DataGear} CbCでは、プログラムの単位として DataGear と CodeGear という単位を用いる。 CodeGear はプログラムの処理そのものであり、一般的なプログラム言語における関数と同じ役割である。 DataGear は CodeGear で扱うデータの単位であり、処理に必要なデータである。 jmp命令で関数遷移するため関数遷移し実行が終了しても、もとの関数に戻ることはない。 そのため次に遷移する CodeGear を指定する。 したがって、CodeGear に Deta Gear を与え、それをもとに処理を行い、 出力として DataGear を返し、また次の 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{c-ass}。 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} \section{Meta CodeGear / Meta DataGear} プログラムを記述する際に、メモリ管理、スレッド管理、資源管理等の プログラムの本筋とは別に実装が必要な場合がある。これらの計算をメタ計算と呼ぶ。 CbC ではメタ計算を分離するために Meta CodeGear、Meta DataGear を定義している。 Meta CodeGear ではこのメタ計算を行い、Meta DataGear は CbC 上のメタ計算で扱われる DataGear である。 例えば stub CodeGear では Context と呼ばれる接続可能な CodeGear、DataGear のリストや、DataGear のメモリ空間等を持った Meta DataGear を扱っている。 \figref{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}