changeset 10:95325401552b draft

modify
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Wed, 22 Feb 2012 03:26:39 +0900
parents 942888c0f8aa
children 8bf97bf22f54
files paper/resume.tex
diffstat 1 files changed, 18 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/paper/resume.tex	Wed Feb 22 02:29:12 2012 +0900
+++ b/paper/resume.tex	Wed Feb 22 03:26:39 2012 +0900
@@ -53,7 +53,7 @@
 
 \section{GCC-4.6 への実装}
 GCC における軽量継続は Tail Call Ellimination (末尾除去)を強制することで実装する.
-これにより, コードセグメント間の移動を, call ではなく jmp 命令行う.
+これにより, コードセグメント間の移動を, call ではなく jmp 命令で行う.
 コードセグメント自体には戻値はない.
 
 図\ref{fig:continue}は Tail Call Elimination によるプログラムの処理の流れを表す.
@@ -65,36 +65,26 @@
   \label{fig:continue}
 \end{figure}
 
-\subsection{末尾除去の矯正付与}
-関数が末尾除去にかかる為には, ``呼び出し先関数と呼び出し元関数の方が一致している''
-といったいくつかの条件をクリアしなければならない.
-%といったいくつかの条件をクリアしなければならない.
+\subsection{Tail Call Elimination の矯正付与}
+関数が Tail Call Elimination にかかる為には, ``呼び出し先関数と呼び出し元関数の方が一致している''
+等といった幾つかの条件をクリアしなければならない.
 これまでの実装ではコードセグメントに条件をクリアさせる為, 専用の関数を用意していた.
 しかし今回の実装ではその関数を撤廃し, 末尾除去にかかるフラグを落とさせない
-コードを追加することで末尾除去の条件をクリアさせるようになった.
+コードを追加することで Tail Call Elimination の条件をクリアさせるようになった.
 これにより GCC のアップデート時に伴う専用関数の修正が不要となり, 楽な管理が行えるようになった.
 
 \subsection{環境付き継続}
 CbC には通常の C の関数からコードセグメントに継続する際,
  その関数から値を戻す処理への継続を得ることができる.
 これを環境付き継続という.
-これらは, 以下の二種類の CbC で定義した特殊変数である.
-\_\_environment は, 環境を表す情報である.
-\_\_return は,  これを環境付き継続の行き先であり, 関数の戻値と \_\_environment の二つの引数を持つ
-コードセグメントである. 例えば, 以下のように使うと, \verb+main()+ は 1 を返す.
-
-\begin{verbatim}
-__code c1(__code ret(int,void *),void *env) {
-    goto ret(1,env);
-}
-
-int main() {
-    goto c1(__return, __environment);
-}
-\end{verbatim}
-
-GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す.
-戻値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(Listing\ref{code:retval}) .
+環境付き継続は, \verb+__environment+ と \verb+__return+ キーワードを
+引数に渡しコードセグメントとして扱うことで使用できる.
+%\verb+environment+ は 環境を表す情報を持つ.
+%\verb+__return+ は環境付き継続の行き先であり, 関数の戻り値と\verb+__environment+ の二つの引数を
+%持つコードセグメントになる.
+%GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す.
+%戻値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(Listing\ref{code:retval}) .
+実際には \verb+__return+ キーワードにより GCC 内部でlisting\ref{code:retval}のコードが生成される.
 \begin{figure}[h]
   \begin{minipage}[b]{.45\textwidth}
     \begin{lstlisting}[caption=環境付き継続を行うコード,label=code:retval]
@@ -134,7 +124,7 @@
 この時\verb+__rectype+は funcPtr を指し, selftype は struct node を指す.
 \begin{figure}[h]
   \begin{minipage}[b]{.45\textwidth}
-    \begin{lstlisting}[caption=\_\_rectype 構文使用例,label=code:rectype]
+    \begin{lstlisting}[caption=\_\_rectype\, selftype 構文の使用例,label=code:rectype]
 typedef __code (*funcPtr)(int,__rectype*);
 struct node {
  int num;
@@ -148,9 +138,9 @@
 \section{評価}
 今回実装を行った GCC-4.6 ベース と安定版である GCC-4.4 ベース,
  それと Micro-C の CbC コンパイラでベンチマークを行った.
-プログラムは Micro-C のベンチマークを使用した. 
-引数 1 は C で書かれたプログラムをただ CbC へと変換したプログラムである.
-引数 2 と 3 は Micro-C 用に手動で最適化を行ったプログラムになる.
+プログラムは Micro-C のベンチマークにも使用されるものである.
+引数 1 は C で書かれたプログラムをただ CbC へと変換したプログラムになる.
+引数 2 と 3 は Micro-C 用に手動で最適化を行ったプログラムである.
 Linux 上で 32bit と 64bit それぞれに最適化オプション(-O2)をつけての評価を行った.
 結果を図\ref{fig:linux_conv}に示す.
 \begin{figure}[htpb]
@@ -165,7 +155,7 @@
 まず, Micro-C 版より GCC 版コンパイラの方が結果が良いことが確認できる.
 GCC-4.5 と GCC-4.6 版を比較してみると手動で最適化を行なっている引数 2 と 3 の結果に余り差はみられない.
 しかし CbC へと変換しただけの引数 1 の場合には GCC-4.6 版が 32bit 版は 2.43倍, 64bit 版は 1.68 倍と優っている.
-これは GCC-4.5 に比べ GCC-4.6 の最適化が修正されている為である. 
+つまり GCC-4.5 に比べ GCC-4.6 の最適化が修正されよりよくなっているのが確認できる.
 
 \section{今後の課題}
 今回, CbC コンパイラを GCC-4.6 へとアップデートを行った.