comparison Paper/nobu-prosym.tex @ 2:4c5a29c7bb47

modify nobu-prosym.tex
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Fri, 18 Nov 2011 06:33:48 +0900
parents 878e70793abe
children 5dfa978ee319
comparison
equal deleted inserted replaced
1:878e70793abe 2:4c5a29c7bb47
96 % }{ 96 % }{
97 97
98 % 本文はここから始まる 98 % 本文はここから始まる
99 \section{歴史的経緯} 99 \section{歴史的経緯}
100 当研究室では,継続により処理を行うプログラミング言語 Continuation based C (以下CbC) を開発している. 100 当研究室では,継続により処理を行うプログラミング言語 Continuation based C (以下CbC) を開発している.
101 CbC の構文は C と同じであるが,継続によりループ制御や関数コールを取り除かれる. 101 CbC の構文は C と同じであるが,継続によりループ制御や関数コールが取り除かれる.
102 102
103 2008年の研究において GCC-4.2 ベースの CbC コンパイラが開発された. 103 CbC のコンパイルには元々 Micoro-C 版の独自のコンパイラを用いていたが,
104 以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている. 104 2008年の研究において GCC-4.2 ベースの CbC コンパイラが開発され,
105 お陰で,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった. 105 2010年には GCC-4.4 へとアップデートが行われた.
106 106 GCC への実装により,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった.
107 しかし,未だに GCC ベースのコンパイラには幾つかのバグがある. 107 %以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている.
108 今回,GCC-4.6 への実装も兼ねながら問題の部分の改善を行った. 108
109 本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を具体的に述べる. 109 今回,CbC コンパイラを GCC-4.6 へとアップデートを行った.
110 110 本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を述べる.
111 111
112 % }{ 112 % }{
113 113
114 \section{Continuation based C (CbC)} 114 \section{Continuation based C (CbC)}
115 Continuation based C (以下CbC) は当研究室で開発しているプログラミング言語である. 115 Continuation based C (以下CbC) は当研究室で開発しているプログラミング言語である.
117 また,コードセグメント単位で処理を記述するという特徴がある. 117 また,コードセグメント単位で処理を記述するという特徴がある.
118 図\ref{fig:cs}は CbC におけるプログラムの処理の流れを表している. 118 図\ref{fig:cs}は CbC におけるプログラムの処理の流れを表している.
119 119
120 \begin{figure}[htpb] 120 \begin{figure}[htpb]
121 \begin{center} 121 \begin{center}
122 \scalebox{0.50}{\includegraphics{figure/codesegment.eps}} 122 \scalebox{0.35}{\includegraphics{figure/codesegment.eps}}
123 \end{center} 123 \end{center}
124 \caption{コードセグメント間の継続(goto)} 124 \caption{コードセグメント間の継続(goto)}
125 \label{fig:cs} 125 \label{fig:cs}
126 \end{figure} 126 \end{figure}
127 127
128 128
129 \subsection{継続(goto)} 129 \subsection{継続(goto)}
130 コードセグメントへと移った処理は C の関数と違って呼び出し元の関数に戻ることはない. 130 コードセグメントへと移った処理は C の関数と違って呼び出し元の関数に戻ることはない.
131 コードセグメントは自身の処理が終われば goto により次のコードセグメントでの処理に移る. 131 コードセグメントは自身の処理が終えると goto により次のコードセグメントへと処理に移る.
132 goto によるコードセグメント間の移動を継続と言う. 132 この goto によるコードセグメント間の移動を継続と言う.
133
134 継続の実態は jmp による関数の移動となる.
133 135
134 136
135 \subsection{コードセグメント(code segment)} 137 \subsection{コードセグメント(code segment)}
136 CbC におけるプログラムの基本単位としてコードセグメントという概念がある. 138 CbC におけるプログラムの基本単位としてコードセグメントという概念がある.
137 コードセグメントの記述の仕方は C の関数と同じだが, 型に“\_\_code”を使って宣言を行うところだけが違う. 139 コードセグメントの記述の仕方は C の関数と同じだが, 型に“\_\_code”を使って宣言を行うところだけが違う.
140 図\ref{fig:factorial}は CbC で書いたプログラムの例である. 142 図\ref{fig:factorial}は CbC で書いたプログラムの例である.
141 与えられた数 x の階上を計算して出力するプログラムとなっている. 143 与えられた数 x の階上を計算して出力するプログラムとなっている.
142 144
143 \begin{figure}[htpb] 145 \begin{figure}[htpb]
144 \begin{center} 146 \begin{center}
145 \scalebox{0.50}{\includegraphics{figure/factorial.eps}} 147 \scalebox{0.40}{\includegraphics{figure/factorial.eps}}
146 \end{center} 148 \end{center}
147 \caption{CbC のプログラム例} 149 \caption{階上を計算する CbC プログラムの例}
148 \label{fig:factorial} 150 \label{fig:factorial}
149 \end{figure} 151 \end{figure}
150 152
151 153
152 %コードセグメントは関数よりも小さな単位で記述される為,最適化がされやすくなる. 154 %コードセグメントは関数よりも小さな単位で記述される為,最適化がされやすくなる.
153 %コードセグメントの記述の仕方は C の関数と同じで,引数を持たせて継続を行うことができる. 155 %コードセグメントの記述の仕方は C の関数と同じで,引数を持たせて継続を行うことができる.
154 156
155 157
156 158 \section{GCCの3つの内部表現}
157 \section{Gnu Compiler Collection} 159 GCC-4.6 への実装の前に,GCC で扱われる3つの内部表現について触れておく.
158 GCC-4.6 への実装の前に,GCC によるコンパイルの一連の流れについて触れておく. 160
159 161
160 \subsection{3つの中間言語} 162 \subsection{3つの内部表現}
161 GCC は内部で Generic Tree, GIMPLE, RTL の3つの中間言語を扱われる. 163 GCC は内部で Generic Tree, GIMPLE, RTL という3つの内部表現を扱う.
164 それぞれが
165 読み込んだソースコードは Generic Tree, GIMPLE, RTL の順に変換されていき,
166 最後にアセンブラ言語へと出力される.
167 図\ref{fig:ir}は
168
169
170 \begin{figure}[htpb]
171 \begin{center}
172 \scalebox{0.35}{\includegraphics{figure/ir.eps}}
173 \end{center}
174 \caption{GCC によるコンパイルの一連の流れ}
175 \label{fig:ir}
176 \end{figure}
177
162 178
163 \subsubsection{Generic Tree} 179 \subsubsection{Generic Tree}
164 まず,GCC で読み込まれたソースコードは Generic Tree 呼ばれる構文木のデータ構造で表される. 180 ソースコードより読み込んだ関数の情報を木構造で表したものが Generic Tree となる.
165 図...に Generic Tree で表現された例を示す. 181 関数の返り値,引数,変数の型,条件式とプログラムの処理全てが木構造で表される.
182 CbC の実装では parse の部分からこの Generic Tree 生成の部分に手が加わっている.
183
166 184
167 \subsubsection{GIMPLE} 185 \subsubsection{GIMPLE}
168 Generic Tree により表現されたデータは次に GIMPLE という構文木へと変換される. 186 Generic Tree で表現されたデータは GIMPLE というデータ構造に変換される.
169 GIMPLE は Generic Tree より制約がかかった状態で作成される. 187 GIMPLE も Generic Tree と同じ構文木だが、より制約がかかった状態で作成された構文木となる.
170 制約は「1つの枝に4つ以上の子を持たせない」といったもので, 188 制約は「1つの枝に4つ以上の子を持たせない」等といったもので,
171 GIMPLE へと変換されたデータは Generic Tree より簡単な命令で表されることになる. 189 GIMPLE へと変換されたデータは Generic Tree より簡単な命令で表されることになり最適化がかけやすくなる.
172 190 CbC の実装では特に修正は加えていない.
173 191
174 \subsubsection{RTL} 192
175 193 \subsubsection{Register Transfer Language (RTL)}
176 194 構文木 GIMPLE は解析が行われた後 RTL へと変換される.
177 195 RTL での表現は低レベルで,アセンブラとほぼ同じ表現を行うことができる.
178 Gneric Tree から GIMPLE, そして RTL へとデータは変換され最後にアセンブリ言語で出力される. 196
179 197
198 CbC における継続は,この RTL で行われる最適化の1つ Tail Call Elimination が重要となってくる.
180 199
181 200
182 \section{GCC-4.6 への実装} 201 \section{GCC-4.6 への実装}
202 前節までで CbC の基本仕様と GCC でのアセンブラ出力までの流れを確認した.
203 ここからは GCC-4.6 への実装について述べていく.
204
205
206 \subsection{“__code” のパース}
207
183 208
184 209
185 \subsection{Tail Call Elimination} 210 \subsection{Tail Call Elimination}
186 CbC の継続の実装には GCC の最適化の1つである Tail Call Elimination (末尾除去) が使われる. 211 CbC の継続の実装には GCC の最適化の1つである Tail Call Elimination (末尾除去) が使われる.
187 Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に, 212 Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に,
188 call ではなく jmp を用いて大元の関数へ戻るようにする最適化のことである. 213 call ではなく jmp を用いることができるという最適化である.
189 図\ref{continue}は Tail Call Elimination が行われた際のプログラムの処理を表している. 214 図\ref{continue}は Tail Call Elimination が行われた際のプログラムの処理を表している.
190 215
191 216
192 \begin{figure}[htpb] 217 \begin{figure}[htpb]
193 \begin{center} 218 \begin{center}
194 \scalebox{0.50}{\includegraphics{figure/continuation.eps}} 219 \scalebox{0.50}{\includegraphics{figure/continuation.eps}}
195 \end{center} 220 \end{center}
196 \caption{Tail Call Elimination} 221 \caption{Tail Call Elimination}
197 \label{fig:continue} 222 \label{fig:continue}
198 \end{figure} 223 \end{figure}
199 224 funcB の処理の最後に呼ばれた funcC は,返り値を funcB ではなく funcA へと返す.
200 225
201 226
202 \subsubsection{expand\_call} 227 \subsubsection{expand\_call}
228 ある関数が Tail Call Elimination を行えるかどうかは expand\_call 関数によって判断される.
229 Tail call Elimination が行える場合 try\_tail_call
230 expand\_call 関数の中で try_tail_call というフラグ
203 231
204 232
205 233
206 \subsection{引数渡し} 234 \subsection{引数渡し}
207 通常コードセグメントの継続において,引数は C の関数と同じスタックを用いて渡される. 235 通常コードセグメントの継続において,引数は C の関数と同じスタックを用いて渡される.