comparison presen/index.html @ 60:a21d16da431a

modify addition of goto syntax
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Mon, 26 Dec 2011 09:58:11 +0900
parents 6ef99d3e66b2
children 2c543a47737b
comparison
equal deleted inserted replaced
59:6ef99d3e66b2 60:a21d16da431a
139 <ul> 139 <ul>
140 <li>続く命令のアドレス</li> 140 <li>続く命令のアドレス</li>
141 <li>命令に必要なデータ</li> 141 <li>命令に必要なデータ</li>
142 <li>スタックに積まれている値(環境)</li> 142 <li>スタックに積まれている値(環境)</li>
143 </ul> 143 </ul>
144 <li>CbCの継続(軽量継続)</li> 144 </div>
145 <!-- PAGE -->
146 <div class="slide">
147 <h1>Continuation Based C (軽量継続)</h1>
148 <h2>CbCの継続(軽量継続)</h2>
149 <li>関数コールが無い -> 呼び出し元への復帰がない</li>
145 <ul> 150 <ul>
146 <li>Cの継続から環境を除外</li> 151 <li>Cの継続から環境を除外</li>
147 <li>続く命令とその命令に必要なデータのみ</li> 152 <li>続く命令とその命令に必要なデータのみ</li>
148 </ul> 153 </ul>
149 </div> 154 <!-- <li>継続の際にスタックに載せるデータはコードセグメントへの引数だけとなる。</li> -->
150 <div class="slide">
151 <h1>Continuation Based C (軽量継続)</h1>
152 <li>関数コールが無い -> 呼び出し元への復帰がない</li>
153 <li>継続の際にスタックに載せるデータはコードセグメントへの引数だけとなる。</li>
154 <!-- <li>スタックポインタの位置を変えずにすむ。</li> --> 155 <!-- <li>スタックポインタの位置を変えずにすむ。</li> -->
155 <p style=" margin-right:auto; margin-left:auto;"> 156 <p style=" margin-right:auto; margin-left:auto;">
156 <img class="scale" src="./pix/cs_stack.png" style="height: 7em;"> 157 <img class="scale" src="./pix/cs_stack.png" style="height: 7em;">
157 </p> 158 </p>
158 </div> 159 </div>
159 <!-- PAGE -->
160 <!-- PAGE --> 160 <!-- PAGE -->
161 <div class="slide"> 161 <div class="slide">
162 <h1>Continuation based C </h1> 162 <h1>Continuation based C </h1>
163 <small> 163 <small>
164 <table width=100% > 164 <table width=100% >
195 </pre> 195 </pre>
196 </td> 196 </td>
197 </tr> 197 </tr>
198 </table> 198 </table>
199 </small> 199 </small>
200 </div> 200 <li>__code キーワードによるコードセグメントの宣言</li>
201 <!-- PAGE --> 201 <li>goto によるコードセグメントへの継続(Cの関数呼び出しと同等)</li>
202 <div class="slide">
203 <h1>Continuation Based C</h1>
204 <li></li>
205 </div> 202 </div>
206 <!-- PAGE --> 203 <!-- PAGE -->
207 <div class="slide"> 204 <div class="slide">
208 <h1>GCC によるコンパイル</h1> 205 <h1>GCC によるコンパイル</h1>
209 <li>GCC についての簡単な説明を行う...</li> 206 <li>GCC についての簡単な説明を行う...</li>
207 <li>TODO: NEXT_PASS() の把握</li>
210 <img src="./pix/ir.png" style="height: 6em;"> 208 <img src="./pix/ir.png" style="height: 6em;">
211 <li>CbCの実装は主に Parser の部分と RTL を生成する部分に行われる。</li> 209 <li>CbCの実装は主に Parser の部分と RTL を生成する部分に行われる。</li>
212 </div> 210 </div>
213 <!-- PAGE --> 211 <!-- PAGE -->
214 <div class="slide"> 212 <div class="slide">
216 <ul> 214 <ul>
217 <li>シンタックスの追加</li> 215 <li>シンタックスの追加</li>
218 <li>fastcall属性の付与</li> 216 <li>fastcall属性の付与</li>
219 <li>Tail Call Elimination</li> 217 <li>Tail Call Elimination</li>
220 <li>環境付き継続</li> 218 <li>環境付き継続</li>
221 </ul> 219 <li>__rectype の実装</li>
222 </div> 220 </ul>
223 <!-- PAGE --> 221 </div>
224 <div class="slide"> 222 <!-- PAGE -->
225 <h1>シンタックスの追加</h1> 223 <div class="slide">
226 <ul> 224 <h1>CbCの実装:シンタックスの追加</h1>
227 <li>__code でコードセグメントの宣言</li> 225 <ul>
228 <li>goto にコードセグメントへの継続処理を追加</li> 226 <li>__code キーワードでのコードセグメントの宣言</li>
229 </ul> 227 <ul>
230 <li></li> 228 <li>__code 用idとkeywordを作成。</li>
231 </div> 229 <li>戻り値が無い為、コードセグメントは void 型の関数で作成される木と同じ木が作られる。</li>
232 <!-- PAGE --> 230 </ul>
233 <div class="slide"> 231 <li>goto によるコードセグメントへの継続</li>
234 <h1>シンタックスの追加</h1> 232 <ul>
235 <h2>__code でコードセグメントの宣言</h2> 233 <li>通常の goto に加え、コードセグメントを呼び出す処理を追加。</li>
236 <ul> 234 <li>コードセグメントへのgoto後は、 return の処理を自動で追加。</li>
237 <li>__code 用idとkeywordを作成。</li> 235 </ul>
238 <li>戻り値が無い為、コードセグメントは void 型の関数で作成される木と同じ木が作られる。</li> 236 </ul>
239 </ul> 237 <li class="incremental">gotoシンタックスの追加部分のソースは次のようになる。</li>
240 </div> 238 </div>
241 <!-- PAGE --> 239 <!-- PAGE -->
242 <div class="slide"> 240 <div class="slide">
243 <h1>シンタックスの追加</h1> 241 <h1>CbCの実装:シンタックスの追加</h1>
242 <h2>gotoシンタックスの追加</h2>
243 <small>
244 <pre>
245 expr = c_parser_expr_no_commas (parser, NULL);
246 if (TREE_CODE(expr.value) == CALL_EXPR )
247 {
248 location_t loc = c_parser_peek_token (parser)->location;
249 cbc_replace_arguments (loc, expr.value);
250
251 TREE_TYPE(expr.value) = void_type_node;
252 /*tree env = NULL_TREE;**/
253 CbC_IS_CbC_GOTO (expr.value) = 1;
254 CALL_EXPR_TAILCALL (expr.value) = 1;
255 add_stmt(expr.value);
256 stmt = c_finish_return(loc, NULL_TREE, NULL_TREE); /* stmt = c_finish_return (0); */
257 }
258 </pre>
259 </small>
260 <li>CALL_EXPR_TAILCALLマクロにより tail call フラグを立てている。</li>
261 <li>cbc_replace_arguments関数は引数のデータを一時的な変数へと代入させる関数</li>
262 <li>最後にc_finish_return関数によりreturn文を生成している。</li>
263 </div>
264 <!-- PAGE -->
265 <div class="slide">
266 <h1>CbCの実装:シンタックスの追加</h1>
244 <h2>goto シンタックスの追加</h2> 267 <h2>goto シンタックスの追加</h2>
245 <ul> 268 <li>最後にリターン文を生成することにより、次へと制御を映させず。また末尾最適化がかかるようになる。</li>
246 <li>通常の goto に加え、コードセグメントを呼び出す処理を追加。</li>
247 <li>コードセグメントへのgoto後は、 return の処理を自動で追加。</li>
248 </ul>
249 <table border=1 width=100%> 269 <table border=1 width=100%>
250 <tr class="center"> 270 <tr class="center">
251 <small> 271 <small>
252 <td>実際のコード </td> 272 <td>実際のコード </td>
253 <td>GCC 内で処理されるコード</td> 273 <td>GCC 内で処理されるコード</td>
265 return; 285 return;
266 </pre> 286 </pre>
267 </td> 287 </td>
268 </tr> 288 </tr>
269 </table> 289 </table>
290 <li>末尾最適化(末尾除去)については後ほど詳しく説明する。</li>
270 </div> 291 </div>
271 <!-- PAGE --> 292 <!-- PAGE -->
272 <div class="slide"> 293 <div class="slide">
273 <h1>引数渡し</h1> 294 <h1>引数渡し</h1>
274 <li>当初、GCCを使ってコンパイルしたCbCのプログラムはMicro-C版に速度面で勝てなかった。</li> 295 <li>当初、GCCを使ってコンパイルしたCbCのプログラムはMicro-C版に速度面で勝てなかった。</li>