comparison Paper/nobu-prosym.tex @ 9:de1193768ef9

modify
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Sat, 19 Nov 2011 18:03:15 +0900
parents 3d1135b3519c
children 3d1f778dc358
comparison
equal deleted inserted replaced
7:3d1135b3519c 9:de1193768ef9
19 % ユーザが定義したマクロなど. 19 % ユーザが定義したマクロなど.
20 \makeatletter 20 \makeatletter
21 \let\@ARRAY\@array \def\@array{\def\<{\inhibitglue}\@ARRAY} 21 \let\@ARRAY\@array \def\@array{\def\<{\inhibitglue}\@ARRAY}
22 \def\<{\(\langle\)} 22 \def\<{\(\langle\)}
23 \def\>{\(\rangle\)} 23 \def\>{\(\rangle\)}
24 \def\|{\verb|} 24 %\def\|{\verb|}
25 \def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline} 25 \def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline}
26 \def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\} 26 \def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\}
27 \def\LATEX{\iLATEX\Large} 27 \def\LATEX{\iLATEX\Large}
28 \def\LATEx{\iLATEX\normalsize} 28 \def\LATEx{\iLATEX\normalsize}
29 \def\LATex{\iLATEX\small} 29 \def\LATex{\iLATEX\small}
99 99
100 % }{ 100 % }{
101 101
102 % 本文はここから始まる 102 % 本文はここから始まる
103 \section{歴史的経緯} 103 \section{歴史的経緯}
104 当研究室では,継続により処理を行うプログラミング言語 Continuation based C (以下CbC) を開発している. 104 %当研究室では, 継続により処理を行うプログラミング言語 Continuation based C (以下CbC) を開発している.
105 CbC の構文は C と同じであるが,継続によりループ制御や関数コールが取り除かれる. 105 %CbC の構文は C と同じであるが,継続によりループ制御や関数コールが取り除かれる.
106 当研究室ではコードセグメント (Code Segment) 単位で記述するプログラミング言語 Continuation based C (以下CbC) を開発している.
107 コードセグメントは並列実行の単位として使うことができ, プログラムの正しさを示す単位としても使用することができる.これにより,
108 Many Core での並列実行を高い性能と高い信頼性で実現することができると考えている.
106 109
107 CbC のコンパイルには元々 Micoro-C 版の独自のコンパイラを用いていたが, 110 CbC のコンパイルには元々 Micoro-C 版の独自のコンパイラを用いていたが,
108 2008年の研究において GCC-4.2 ベースの CbC コンパイラが開発され, 111 2008年の研究において GCC-4.2 ベースの CbC コンパイラが開発され,
109 2010年には GCC-4.4 へとアップデートが行われた. 112 2010年には GCC-4.4 へとアップデートが行われた.
110 GCC への実装により,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった. 113 GCC への実装により,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった.
111 %以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている. 114 %以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている.
112 115 %今回,CbC コンパイラを GCC-4.6 へとアップデートを行った.
113 今回,CbC コンパイラを GCC-4.6 へとアップデートを行った. 116 %本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を述べる.
114 本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を述べる. 117 だが, GCC をベースとした CbC のコンパイラ (以下 CbC-GCC)は, GCC のアップデートに合わせて変更する必要がある.
118 本研究では, GCC-4.5 をベースとしていた CbC-GCC を GCC-4.6 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う.
119
115 120
116 % }{ 121 % }{
117 122
118 \section{Continuation based C (CbC)} 123 \section{Continuation based C (CbC)}
119 Continuation based C (以下CbC) は当研究室で開発しているプログラミング言語である. 124 CbC のプログラムはコードセグメント毎に記述され, コード間をgoto(軽量継続)により処理を移る.
120 構文は C と同じであるが,ループ制御や関数コールを取り除き継続(goto)を用いている. 125 構文は C と同じであるが, ループ制御や関数コールが取り除かれる.
121 また,コードセグメント単位で処理を記述するという特徴がある. 126
122 図\ref{fig:cs}は CbC におけるプログラムの処理の流れを表している. 127 %Continuation based C (以下CbC) は当研究室で開発しているプログラミング言語である.
128 %構文は C と同じであるが,ループ制御や関数コールを取り除き継続(goto)を用いている.
129 %また,コードセグメント単位で処理を記述するという特徴がある.
130 %図\ref{fig:cs}は CbC におけるプログラムの処理の流れを表している.
131
132
133 \subsection{継続(goto)}
134 コードセグメントの記述は C の関数の構文と同じで, 型に“\verb+code+” を使うことで宣言できる.
135 コードセグメントへの移動は“goto” の後にコードセグメント名と引数を並べて記述することで行える.
136 図\ref{fig:cs}はコードセグメント間の処理の流れを表している.
137
138 %コードセグメントへと移った処理は C の関数と違って呼び出し元の関数に戻ることはない.
139 %コードセグメントは自身の処理が終えると goto により次のコードセグメントへと処理に移る.
140 %この goto によるコードセグメント間の移動を継続と言う.
141 %継続の実態は jmp による関数の移動となる.
123 142
124 \begin{figure}[htpb] 143 \begin{figure}[htpb]
125 \begin{center} 144 \begin{center}
126 \scalebox{0.35}{\includegraphics{figure/codesegment.eps}} 145 \scalebox{0.35}{\includegraphics{figure/codesegment.eps}}
127 \end{center} 146 \end{center}
128 \caption{コードセグメント間の継続(goto)} 147 \caption{コードセグメント間の継続(goto)}
129 \label{fig:cs} 148 \label{fig:cs}
130 \end{figure} 149 \end{figure}
131 150
132
133 \subsection{継続(goto)}
134 コードセグメントへと移った処理は C の関数と違って呼び出し元の関数に戻ることはない.
135 コードセグメントは自身の処理が終えると goto により次のコードセグメントへと処理に移る.
136 この goto によるコードセグメント間の移動を継続と言う.
137
138 継続の実態は jmp による関数の移動となる.
139
140
141 \subsection{コードセグメント(code segment)} 151 \subsection{コードセグメント(code segment)}
142 CbC におけるプログラムの基本単位としてコードセグメントという概念がある. 152 コードセグメントは C の関数と違って返り値を持たず, 処理が終われば次のコードセグメントへと処理を移る.
143 コードセグメントの記述の仕方は C の関数と同じだが, 型に“\_\_code”を使って宣言を行うところだけが違う. 153 C において関数呼び出しを繰り返し行う場合, 呼び出された関数の引数の数だけスタックに値が積まれていく.
144 関数と同じように引数を持たせて継続させることもできる. 154 だが, 返り値を持たないコードセグメントではスタックに値を積んでいく必要な無く, スタックは変更されない.
145 しかし,関数とは違ってリターンを行わない為返り値を取得することはできない. 155
156 軽量継続により並列化, ループ制御, 関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようになる.
157
146 図\ref{fig:factorial}は CbC で書いたプログラムの例である. 158 図\ref{fig:factorial}は CbC で書いたプログラムの例である.
147 与えられた数 x の階上を計算して出力するプログラムとなっている. 159 与えられた数 x の階上を計算して出力するプログラムとなっている.
148 160
149 \begin{figure} 161 \begin{figure}
150 \lstinputlisting[language=c]{source/factorial.cbc} 162 \lstinputlisting[language=c]{source/factorial.cbc}
151 \caption{階上を計算する CbC プログラムの例} 163 \caption{階上を計算する CbC プログラムの例}
152 \end{figure} 164 \end{figure}
153 165
166 %CbC におけるプログラムの基本単位としてコードセグメントという概念がある.
167 %コードセグメントの記述の仕方は C の関数と同じだが, 型に“\_\_code”を使って宣言を行うところだけが違う.
168 %関数と同じように引数を持たせて継続させることもできる.
169 %しかし,関数とは違ってリターンを行わない為返り値を取得することはできない.
154 170
155 %コードセグメントは関数よりも小さな単位で記述される為,最適化がされやすくなる. 171 %コードセグメントは関数よりも小さな単位で記述される為,最適化がされやすくなる.
156 %コードセグメントの記述の仕方は C の関数と同じで,引数を持たせて継続を行うことができる. 172 %コードセグメントの記述の仕方は C の関数と同じで,引数を持たせて継続を行うことができる.
157
158
159 \section{GCCの3つの内部表現} 173 \section{GCCの3つの内部表現}
160 GCC-4.6 への実装の前に,GCC で扱われる3つの内部表現について触れておく. 174 GCC-4.6 への実装の前に,GCC で扱われる3つの内部表現について触れておく.
161
162 175
163 \subsection{3つの内部表現} 176 \subsection{3つの内部表現}
164 GCC は内部で Generic Tree, GIMPLE, RTL という3つの内部表現を扱う. 177 GCC は内部で Generic Tree, GIMPLE, RTL という3つの内部表現を扱う.
165 それぞれが 178 それぞれが
166 読み込んだソースコードは Generic Tree, GIMPLE, RTL の順に変換されていき, 179 読み込んだソースコードは Generic Tree, GIMPLE, RTL の順に変換されていき,
167 最後にアセンブラ言語へと出力される. 180 最後にアセンブラ言語へと出力される.
168 図\ref{fig:ir}はアセンブラ出力までの流れを表した図である. 181 図\ref{fig:ir}は GCC がソースコードを読み込みアセンブラ言語出力までの流れを表した図である.
169 182
170 \begin{figure}[htpb] 183 \begin{figure}[htpb]
171 \begin{center} 184 \begin{center}
172 \scalebox{0.35}{\includegraphics{figure/ir.eps}} 185 \scalebox{0.35}{\includegraphics{figure/ir.eps}}
173 \end{center} 186 \end{center}
193 \subsubsection{Register Transfer Language (RTL)} 206 \subsubsection{Register Transfer Language (RTL)}
194 構文木 GIMPLE は解析が行われた後 RTL へと変換される. 207 構文木 GIMPLE は解析が行われた後 RTL へと変換される.
195 RTL はレジスタの割り当てといった低レベルの表現で,アセンブラとほぼ同じ表現を行うことができる. 208 RTL はレジスタの割り当てといった低レベルの表現で,アセンブラとほぼ同じ表現を行うことができる.
196 プログラム内部では RTL も木構造で表される. 209 プログラム内部では RTL も木構造で表される.
197 210
198 CbC における継続は,この RTL で行われる最適化の1つ Tail Call Elimination が重要となってくる. 211 CbC における継続は,この RTL への変換で行われる最適化の1つ Tail Call Elimination が重要となってくる.
199 212
200 213
201 \section{GCC-4.6 への実装} 214 \section{GCC-4.6 への実装}
202 前節までで CbC の基本仕様と GCC でのアセンブラ出力までの流れを確認した. 215 前節までで CbC の基本仕様と GCC でのアセンブラ出力までの流れを確認した.
203 ここからは GCC-4.6 への実装について述べていく. 216 ここからは GCC-4.6 への実装について述べていく.
204 217
205 218
206 \subsection{“\_\_code” のパース} 219 %\subsection{“\_\_code” のパース}
207
208 220
209 221
210 \subsection{Tail Call Elimination} 222 \subsection{Tail Call Elimination}
211 CbC の継続の実装には GCC の最適化の1つである Tail Call Elimination (末尾除去) が使われる. 223 CbC の継続の実装には GCC の最適化の1つ, Tail Call Elimination (末尾除去) を強制することで実装する.
212 Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に, 224 これにより, コードセグメント間の移動を, call ではなく jmp 命令で実現する.
213 call ではなく jmp を用いることができるという最適化である. 225 %Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に,
226 %call ではなく jmp を用いることができるという最適化である.
214 図\ref{fig:continue}は Tail Call Elimination が行われた際のプログラムの処理を表している. 227 図\ref{fig:continue}は Tail Call Elimination が行われた際のプログラムの処理を表している.
215 228
216 229 \begin{figure}[htpb]
217 \begin{figure}[htpb] 230 \begin{center}
218 \begin{center} 231 \scalebox{0.35}{\includegraphics{figure/continuation.eps}}
219 \scalebox{0.50}{\includegraphics{figure/continuation.eps}}
220 \end{center} 232 \end{center}
221 \caption{Tail Call Elimination} 233 \caption{Tail Call Elimination}
222 \label{fig:continue} 234 \label{fig:continue}
223 \end{figure} 235 \end{figure}
224 funcB の処理の最後に呼ばれた funcC は,返り値を funcB ではなく funcA へと返す. 236 funcB は jmp 命令で funcC を呼び出す.
225 237 funcC は,返り値を funcB ではなく funcA へと返すことになる.
226 238
227 \subsubsection{expand\_call} 239 \subsubsection{expand\_call}
228 ある関数が Tail Call Elimination を行えるかどうかは expand\_call 関数で判断される. 240 ある関数が Tail Call Elimination を行えるかどうかは \verb+expand_call+ 関数で判断される.
229 expand\_call 関数内でチェックされる Tail Call Elimination が行える条件は以下になる. 241 \verb+expand_call+ 関数内でチェックされる Tail Call Elimination が行える条件は以下になる.
230 242
231 \begin{itemize} 243 \begin{itemize}
232 \item caller 側と callee 側の返す値の型が一致している. 244 \item caller 側と callee 側の戻値の型が一致している.
233 \item 関数呼び出しがリターンの直前に行われている. 245 \item 関数呼び出しがリターンの直前に行われている.
234 \item 呼出先関数の引数に用いられるスタックサイズが呼出元関数のそれより少ない. 246 \item 呼出先関数の引数に用いられるスタックサイズが呼出元関数のそれより少ない.
235 \item[] 247 \item 引数の並びのコピーに上書きがない.
236 \end{itemize} 248 \end{itemize}
237
238
239 CbC の実装では上記の条件を,以下の様にして解決させている. 249 CbC の実装では上記の条件を,以下の様にして解決させている.
240 250
241 \begin{itemize} 251 \begin{itemize}
242 \item 呼び出す関数がコードセグメントの場合返す値の型チェックを行わない. 252 \item コードセグメントは void 型で統一する
243 \item コードセグメントへの継続を Generic Tree で表す際に,return の情報も直後に持たせる. 253 \item Cの関数からコードセグメントにgotoする場合は返す値の型チェックを行わない.
244 \item スタックサイズは決め打ちで行う. 254 \item goto の直後に retrun を置く.
245 \item[] 255 \item スタックサイズは関数宣言時に決まったサイズにする.
256 \item 引数は一旦, 一時変数にコピーして重なりがないようにする.
246 \end{itemize} 257 \end{itemize}
247 258
248 スタックサイズを決め打ちで行うことで,ベースポインタを変えずにスタックを扱うことができる. 259 スタックサイズを決め打ちで行うことで,ベースポインタを変えずにスタックを扱うことができる.
249 これも CbC の1つの特徴である. 260 これも CbC の1つの特徴である.
250 図\ref{fig:cs_stack}はコードセグメントの継続の際にスタックに積まれる引数を表している. 261 図\ref{fig:cs_stack}はコードセグメントの継続の際にスタックに積まれる引数を表している.