# HG changeset patch # User kent # Date 1213760887 -32400 # Node ID b61e7bfa07c4b9935c643d924aae4ac3aa4b15f7 # Parent 456565b8c828962dcacafac7ea08c71251041f2a *** empty log message *** diff -r 456565b8c828 -r b61e7bfa07c4 main.tex --- a/main.tex Sun Jun 15 10:43:59 2008 +0900 +++ b/main.tex Wed Jun 18 12:48:07 2008 +0900 @@ -42,8 +42,17 @@ %\twocolumn[\maketitle]{} \maketitle +\section{概要} +当研究室ではContinuation based C(以下CbC)という言語を提案しており、 +そのコンパイルにはこれまでMicro-Cをベースにした独自のコンパイラを使用していた。 +また、以前の論文で +GCCのTail call optimizationを用いてGCC上に実装が可能である事を示した。 +ここではGCC上に実際にCbC言語の実装し、その評価を行った。 +この実装はアーキテクチャに依存しないので、GCCが対応する全てのアーキテクチャ上でCbCが動く事になるはずであるが、若干の問題があり、その点に付いても考察を行う。 + + \section{CbCについて}\label{sec:CbC} -Continuation based C (以下CbC) は当研究室が提案するアセンブラよりも上位で +Continuation based Cは当研究室が提案するアセンブラよりも上位で Cよりも下位な記述言語である\cite{kono2}。 Cの仕様からループ制御や関数コールを取り除き、 継続(goto) や コードセグメントを導入している。 @@ -91,7 +100,33 @@ 代わりにgotoを発行したコードセグメントの持つスタック自体に次のコードセグメント の引数を書き込むことになる。また、returnアドレスのpushなども行わない。 -\subsection{コードセグメントの例文} +\subsection{CbCの例文} +以上の2つの構文を使った例題をリスト\ref{code:cbc_example}に示す。 +\begin{lstlisting}[caption=CbC 例,label=code:cbc_example] +__code while_cond(int total, int count){ + if ( count <= 100 ){ + goto while_process(total,count); + }else{ + goto while_end(total); + } +} +__code while_process(int total, + int count){ + /* some processes */ + goto while_cond(total, count); +} +__code while_end(int total){ + goto cs_exit(0); +} +\end{lstlisting} +これは単純なループ構造である。 +まず\verb|while_cond|が実行されると、そこでは条件判定により +\verb|while_process|か\verb|while_end|に継続する。 +\verb|while_process|では処理が終了すると再び\verb|while_cond|に +継続することでループが形成される。 +このようにCbCではforやwhileを使用せずコードセグメントから +同じコードセグメントへ継続する形でループが表現される。 + \section{GCCの構成} 今回の実装ではGCCのソースコードを修正することになる。 @@ -280,7 +315,7 @@ \section{実装} 次に、実際の実装方法を簡単に説明する。 -今回実装したソースコードはSourceForge上の以下のURLにて公開されている。 +今回実装したソースコードはSourceForge上の以下のURLにて公開されている。\\ \url{http://sourceforge.jp/projects/cbc/} 実装に置ける最大の問題はgoto文でのコードセグメントへのjump @@ -528,7 +563,7 @@ \end{comment} -\section{環境付き継続に関する考察} +\section{環境付き継続に関する考察}\label{sec:env} また前説までにその実装方法を説明した。 しかしまだ実装されていない構文があるので、その実装方法に関して ここで考察する。 @@ -550,7 +585,6 @@ goto error(no); goto envCheck(10, 20), stack+OFFSET; - //OFFSET is a half of STACKSIZE or so. } \end{lstlisting} このコードセグメントenvSwitchではスタック領域をmallocで取得した領域に切り替えた @@ -747,7 +781,7 @@ 最適化をGCC上で実行できるようになり、CbCプログラムをより高速化することに成功した。 また、環境付き継続の実装方法に関して考察を行いその問題点を洗い出した。 -今後は\ref{}で説明した様に環境付き継続の +今後は\ref{sec:env}で説明した様に環境付き継続の 実装が課題となる。 また、SPUアーキテクチャにGCCが対応してないという問題もある。 今回の実装の目的の一つとしてPS3上でCbCを動かしたいということがあったので、 @@ -757,38 +791,6 @@ 既存の言語とCbC を組み合わせた言語に付いても今後実装していく。 -\begin{comment} -しかしまだいくつかの問題が残っているので、 -今後の課題と併せて、以下に簡単に説明する。 -\begin{description} - \item[environment] - CbCにはもう一つ、environment付きの継続という構文が存在する。 - これは関数からコードセグメントにgotoした場合に関数の呼び出し元に戻る - ことを可能にするものだが、今回この実装は間に合わなかった。 - \item[PPCのRTL変換不能] PowerPCアーキテクチャにおいて、コードセグメント - のポインタ参照へgotoすることができない。 - これはRTLレベルで対応されてないことが原因と思われる。 - \item[オプションの強制] -O2オプションや、コードセグメントへのfasecall属性の付加 - などを強制させる必要がある。 - \item[SPU対応とGCCのversion] 実装できたversionは4.2.3である。 - しかし現在SPUに対応したGCCは4.1までしかでていないうえに、 - GCCのversion間の差異によって移植が難しくなっている。 -\end{description} -ここで、二つ目のPowerPCへの対応が大きな問題となっている。 -本来、このコンパイラはアーキテクチャに依存しない形で -実装したのが、実装後、PowerPCはTailcall eliminationにたいして一部対応してない -ことがわかった。 -これはMachineDescriptionとよばれるRTLからアセンブラへの対応を表す -ファイルを記述することで対応させることができるはずだが、今回その実装には至らなかった。 - -またこれらに加えて、GCCはすでにC++や -Objective-C のコンパイルが可能である。これを活かし、 -CbC++, もしくはObjective-CbC といった -既存の言語とCbC を組み合わせた言語に付いても今後実装していく。 -%考えてみる価値があるだろう。 -\end{comment} - - \begin{thebibliography}{9} \bibitem{kono1} 河野真治. ``継続を基本とした言語CbCのgcc上の実装''. 日本ソフトウェア科学会第19回大会論文集, Sep, 2002.