comparison Paper/nobu-prosym.tex @ 5:c0b91a1c738e

modify tex
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Fri, 18 Nov 2011 17:45:21 +0900
parents 5dfa978ee319
children ea43a580129b
comparison
equal deleted inserted replaced
4:9adf0d4a6033 5:c0b91a1c738e
144 関数と同じように引数を持たせて継続させることもできる. 144 関数と同じように引数を持たせて継続させることもできる.
145 しかし,関数とは違ってリターンを行わない為返り値を取得することはできない. 145 しかし,関数とは違ってリターンを行わない為返り値を取得することはできない.
146 図\ref{fig:factorial}は CbC で書いたプログラムの例である. 146 図\ref{fig:factorial}は CbC で書いたプログラムの例である.
147 与えられた数 x の階上を計算して出力するプログラムとなっている. 147 与えられた数 x の階上を計算して出力するプログラムとなっている.
148 148
149 \begin{figure}
149 \lstinputlisting[language=c]{source/factorial.cbc} 150 \lstinputlisting[language=c]{source/factorial.cbc}
150 151 \caption{階上を計算する CbC プログラムの例}
152 \end{figure}
151 153
152 154
153 %コードセグメントは関数よりも小さな単位で記述される為,最適化がされやすくなる. 155 %コードセグメントは関数よりも小さな単位で記述される為,最適化がされやすくなる.
154 %コードセグメントの記述の仕方は C の関数と同じで,引数を持たせて継続を行うことができる. 156 %コードセグメントの記述の仕方は C の関数と同じで,引数を持たせて継続を行うことができる.
155 157
161 \subsection{3つの内部表現} 163 \subsection{3つの内部表現}
162 GCC は内部で Generic Tree, GIMPLE, RTL という3つの内部表現を扱う. 164 GCC は内部で Generic Tree, GIMPLE, RTL という3つの内部表現を扱う.
163 それぞれが 165 それぞれが
164 読み込んだソースコードは Generic Tree, GIMPLE, RTL の順に変換されていき, 166 読み込んだソースコードは Generic Tree, GIMPLE, RTL の順に変換されていき,
165 最後にアセンブラ言語へと出力される. 167 最後にアセンブラ言語へと出力される.
166 図\ref{fig:ir}は 168 図\ref{fig:ir}はアセンブラ出力までの流れを表した図である.
167
168
169
170 169
171 \begin{figure}[htpb] 170 \begin{figure}[htpb]
172 \begin{center} 171 \begin{center}
173 \scalebox{0.35}{\includegraphics{figure/ir.eps}} 172 \scalebox{0.35}{\includegraphics{figure/ir.eps}}
174 \end{center} 173 \end{center}
210 209
211 \subsection{Tail Call Elimination} 210 \subsection{Tail Call Elimination}
212 CbC の継続の実装には GCC の最適化の1つである Tail Call Elimination (末尾除去) が使われる. 211 CbC の継続の実装には GCC の最適化の1つである Tail Call Elimination (末尾除去) が使われる.
213 Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に, 212 Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に,
214 call ではなく jmp を用いることができるという最適化である. 213 call ではなく jmp を用いることができるという最適化である.
215 図\ref{continue}は Tail Call Elimination が行われた際のプログラムの処理を表している. 214 図\ref{fig:continue}は Tail Call Elimination が行われた際のプログラムの処理を表している.
216 215
217 216
218 \begin{figure}[htpb] 217 \begin{figure}[htpb]
219 \begin{center} 218 \begin{center}
220 \scalebox{0.50}{\includegraphics{figure/continuation.eps}} 219 \scalebox{0.50}{\includegraphics{figure/continuation.eps}}
225 funcB の処理の最後に呼ばれた funcC は,返り値を funcB ではなく funcA へと返す. 224 funcB の処理の最後に呼ばれた funcC は,返り値を funcB ではなく funcA へと返す.
226 225
227 226
228 \subsubsection{expand\_call} 227 \subsubsection{expand\_call}
229 ある関数が Tail Call Elimination を行えるかどうかは expand\_call 関数で判断される. 228 ある関数が Tail Call Elimination を行えるかどうかは expand\_call 関数で判断される.
230 Tail Call Elimination が行える条件は以下のようになる. 229 expand\_call 関数内でチェックされる Tail Call Elimination が行える条件は以下になる.
231 230
232 \begin{description} 231 \begin{description}
233 \item[caller側とcallee側の型の一致] 232 \item[caller 側と callee 側の返す値の型が一致している.]
234 \item[] 233 \item[関数呼び出しがリターンの直前に行われている.]
235 \item[] 234 \item[呼出先関数の引数に用いられるスタックサイズが呼出元関数のそれより少ない.]
235 \item[]
236 \end{description} 236 \end{description}
237
238 CbC の実装では上記の条件を,以下の様にして解決させている.
239
240 \begin{description}
241 \item[呼び出す関数がコードセグメントの場合返す値の型チェックを行わない.]
242 \item[コードセグメントへの継続を Generic Tree で表す際に,return の情報も直後に持たせる.]
243 \item[スタックサイズは決め打ちで行う.]
244 \item[]
245 \end{description}
246
247 スタックサイズを決め打ちで行うことで,ベースポインタを変えずにスタックを扱うことができる.
248 これも CbC の1つの特徴である.
249 図\ref{fig:cs_stack}はコードセグメントの継続の際にスタックに積まれる引数を表している.
250
251
252 \begin{figure}[htpb]
253 \begin{center}
254 \scalebox{0.33}{\includegraphics{figure/cs_stack.eps}}
255 \end{center}
256 \caption{継続による引数のスタック格納の様子}
257 \label{fig:cs_stack}
258 \end{figure}
259
237 260
238 261
239 %expand\call 関数では Tail Call Elimination が可能かどうかを判断するために,try\_tail\_call フラグが用意されている. 262 %expand\call 関数では Tail Call Elimination が可能かどうかを判断するために,try\_tail\_call フラグが用意されている.
240 %Tail call Elimination が行えないと判断されると try\_tail\_call フラグに0がセットされる. 263 %Tail call Elimination が行えないと判断されると try\_tail\_call フラグに0がセットされる.
241 264
280 プログラムだと言える. 303 プログラムだと言える.
281 比較を行うのは以下のアーキテクチャと OS になる. 304 比較を行うのは以下のアーキテクチャと OS になる.
282 305
283 \begin{description} 306 \begin{description}
284 \item[x86/Linux] 307 \item[x86/Linux]
285 \item[x86/OS] 308 \item[x86/OS X]
286 \item[x86/OS X(64bit 動作)]
287 \end{description} 309 \end{description}
288 また,比較を行うプログラムは最適化(-O0 オプション)を行わないものと, 310 また,比較を行うプログラムは最適化(-O0 オプション)を行わないものと,
289 速度最適化(-O2 -fomit-frame-pointer)を行うものの2つを用意する. 311 速度最適化(-O2 -fomit-frame-pointer)を行うものの2つ,
312 それと -m32 オプションと -m64 オプションをつけたものそれぞれで行う.
290 313
291 表\ref{tab:speed-mc-vs-gcc-nonopt}が最適化無し, 314 表\ref{tab:speed-mc-vs-gcc-nonopt}が最適化無し,
292 表\ref{tab:speed-mc-vs-gcc-opt}が速度最適化有りとなる. 315 表\ref{tab:speed-mc-vs-gcc-opt}が速度最適化有りとなる.
293 316
294 \begin{table}[htpb] 317 \begin{table}[htpb]
308 \begin{table}[htpb] 331 \begin{table}[htpb]
309 \centering 332 \centering
310 \small 333 \small
311 \begin{tabular}{|c|c|c|c|} \hline 334 \begin{tabular}{|c|c|c|c|} \hline
312 CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline 335 CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline
313 x86/Linux & 3.252 & 1.768 & 2.890 \\ \hline 336 x86/Linux & 3.252 & 2.906 & 2.890 \\ \hline
314 x86\_64(m32)/OS X& 1.827 & 0.934 & 2.288 \\ \hline 337 x86\_64(m32)/OS X& 1.827 & 0.934 & 2.288 \\ \hline
315 x86\_64/OS X & 1.101 & 2.896 & \\ \hline 338 x86\_64/OS X & 1.101 & 2.896 & \\ \hline
316 \end{tabular} 339 \end{tabular}
317 \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(速度最適化)} 340 \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(速度最適化)}
318 \label{tab:speed-mc-vs-gcc-opt} 341 \label{tab:speed-mc-vs-gcc-opt}
319 \end{table} 342 \end{table}
320 343
321 344
322 \begin{thebibliography}{10} 345
346 \begin{thebibliography}{7}
323 347
324 \bibitem{1}{河野真治}: 348 \bibitem{1}{河野真治}:
325 “継続を基本とした言語 CbC の gcc 上の実装”. 日本ソフトウェア科学会第 19 回大会論文集, Sep, 2002 349 “継続を基本とした言語 CbC の gcc 上の実装”. 日本ソフトウェア科学会第 19 回大会論文集, Sep, 2002
326 350
327 351