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