Mercurial > hg > Papers > 2011 > nobu-prosym
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 |