Mercurial > hg > Papers > 2011 > nobu-prosym
annotate presen/index.html @ 59:6ef99d3e66b2
modify light-weight continuation
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 26 Dec 2011 08:24:23 +0900 |
parents | 97457764428f |
children | a21d16da431a |
rev | line source |
---|---|
54 | 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" |
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |
3 | |
4 <html xmlns="http://www.w3.org/1999/xhtml"> | |
5 | |
6 <head> | |
7 <style> | |
8 .center { | |
9 margin-left: auto; | |
10 margin-right: auto; | |
11 text-align: center; | |
12 } | |
13 .textcenter { | |
14 text-align: center; | |
15 } | |
16 .taninaritop { | |
17 margin: auto; | |
18 width: 95%; | |
19 font-weight: bold; | |
20 } | |
21 </style> | |
22 <title>2012/ 1/ 7</title> | |
23 <!-- metadata --> | |
24 <meta name="generator" content="S5" /> | |
25 <meta name="version" content="S5 1.1" /> | |
26 <meta name="presdate" content="20120107" /> | |
27 <meta name="author" content="Nobuyasu Oshiro" /> | |
28 <meta name="company" content="University of the Ryukyu" /> | |
29 <!-- meta temporary --> | |
30 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> | |
31 <meta http-equiv="Content-Script-Type" content="text/javascript" /> | |
32 <meta http-equiv="Content-Style-Type" content="text/css" /> | |
33 <!-- configuration parameters --> | |
34 <meta name="defaultView" content="slideshow" /> | |
35 <meta name="controlVis" content="hidden" /> | |
36 <!-- configuration extensions --> | |
37 <meta name="tranSitions" content="true" /> | |
38 <meta name="fadeDuration" content="500" /> | |
39 <meta name="incrDuration" content="250" /> | |
40 <!-- configuration autoplay extension --> | |
41 <meta name="autoMatic" content="false" /> | |
42 <meta name="playLoop" content="true" /> | |
43 <meta name="playDelay" content="10" /> | |
44 <!-- configuration audio extension --> | |
45 <meta name="audioSupport" content="false" /> | |
46 <meta name="audioVolume" content="100" /> | |
47 <meta name="audioError" content="false" /> | |
48 <!-- configuration audio debug --> | |
49 <meta name="audioDebug" content="false" /> | |
50 <!-- style sheet links --> | |
51 <link rel="stylesheet" href="ui/default_utf/slides.css" type="text/css" media="projection" id="slideProj" /> | |
52 <link rel="stylesheet" href="ui/default_utf/outline.css" type="text/css" media="screen" id="outlineStyle" /> | |
53 <link rel="stylesheet" href="ui/default_utf/print.css" type="text/css" media="print" id="slidePrint" /> | |
54 <link rel="stylesheet" href="ui/default_utf/opera.css" type="text/css" media="projection" id="operaFix" /> | |
55 <!-- embedded styles --> | |
56 <style type="text/css" media="all"> | |
57 .imgcon {width: 100%; margin: 0 auto; padding: 0; text-align: center;} | |
58 #anim {width: 33%; height: 320px; position: relative;} | |
59 #anim img {position: absolute; top: 0px; left: 0px;} | |
60 </style> | |
61 <!-- S5 JS --> | |
62 <script src="ui/default_utf/slides.js" type="text/javascript"></script> | |
63 </head> | |
64 <body> | |
65 | |
66 <div class="layout"> | |
67 <div id="controls"><!-- DO NOT EDIT --></div> | |
68 <div id="currentSlide"><!-- DO NOT EDIT --></div> | |
69 <div id="header"></div> | |
70 <div id="footer"> | |
71 <h1>プログラミングシンポジウム: 2012/ 1/ 7</h1> | |
72 <h2>並列信頼研</h2> | |
73 </div> | |
74 </div> | |
75 | |
76 <div class="presentation"> | |
77 | |
78 <div class="slide"> | |
79 <h1>Continuation based Cの GCC 4.6 上の実装について</li> | |
80 <h3></h3> | |
81 <li>大城 信康</li> | |
82 <h4><a href="http://ie.u-ryukyu.ac.jp/" rel="external">琉球大学 並列信頼研究室</a></h4> | |
83 <div class="handout"></div> | |
84 </div> | |
85 <!-- PAGE --> | |
86 <div class="slide"> | |
87 <h1>目的と背景(1)</h1> | |
88 <li>当研究室ではコードセグメント単位で記述するプログラミング言語Continuation based C (以下CbC)という言語を開発している。</li> | |
89 <li>コードセグメントは並列実行の単位として使うことができ、プログラムの正しさを示す単位としても使用することができる。</li> | |
58 | 90 <li>Many Core での並列実行を高い性能と高い信頼性で実現することができると考える。</li> |
54 | 91 </div> |
92 <!-- PAGE --> | |
93 <div class="slide"> | |
94 <h1>目的と背景(2)</h1> | |
58 | 95 <li>CbC のコンパイラは2001年に Micro-C 版、2008年には GCC 4.4 をベースとしたコンパイラが開発された。</li> |
55
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
96 <li>GCC をベースとした CbC コンパイラは、修正・追加された最適化の機能を使用する為に、 GCC のアップデートに合わせ変更する必要がある。</li> |
58 | 97 <li>本研究ではCbC コンパイラを GCC-4.6 へとアップデートを行った。 </li> |
54 | 98 </div> |
99 <!-- PAGE --> | |
100 <div class="slide"> | |
101 <h1>発表内容</h1> | |
102 <ol> | |
103 <li>CbC の紹介</li> | |
104 <li>GCC でのコンパイルの流れ</li> | |
58 | 105 <font color="red"> |
106 <li>CbC の実装</li> | |
107 </font> | |
54 | 108 <!-- |
109 <ul> | |
110 <li>Tail Call Elimination</li> | |
111 <li>goto シンタックスの追加</li> | |
112 <li>環境付き継続</li> | |
113 </ul> | |
114 --> | |
115 <li>Micro-C との性能比較</li> | |
116 <li>mercurial を用いたアップデートの方法</li> | |
117 <li>まとめ</li> | |
118 <ol> | |
119 </div> | |
120 <!-- PAGE --> | |
121 <div class="slide"> | |
122 <h1>Continuation based C </h1> | |
55
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
123 <h2>コードセグメント単位での記述と継続を基本としたプログラミング言語。</h2> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
124 <li>プログラムの記述は C の構文と同じだが、ループ制御や関数コールが取り除かれる。</li> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
125 <li>コードセグメント</li> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
126 <ul> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
127 <li>C の関数よりも細かい単位。</li> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
128 <li>コードセグメントの処理は最後に別のコードセグメントへ継続(goto)することで続いていく。</li> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
129 </ul> |
54 | 130 </div> |
131 <!-- PAGE --> | |
132 <div class="slide"> | |
58 | 133 <h1>Continuation Based C</h1> |
134 <h2>継続:現在の処理を実行していく為の情報</h2> | |
135 <!-- | |
136 <li>Cでは関数呼び出しの後、呼び出し元の環境に復帰する必要がある。</li> | |
137 --> | |
138 <li>Cにおいての継続</li> | |
139 <ul> | |
140 <li>続く命令のアドレス</li> | |
141 <li>命令に必要なデータ</li> | |
142 <li>スタックに積まれている値(環境)</li> | |
143 </ul> | |
59
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
144 <li>CbCの継続(軽量継続)</li> |
58 | 145 <ul> |
59
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
146 <li>Cの継続から環境を除外</li> |
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
147 <li>続く命令とその命令に必要なデータのみ</li> |
58 | 148 </ul> |
149 </div> | |
59
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
150 <div class="slide"> |
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
151 <h1>Continuation Based C (軽量継続)</h1> |
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
152 <li>関数コールが無い -> 呼び出し元への復帰がない</li> |
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
153 <li>継続の際にスタックに載せるデータはコードセグメントへの引数だけとなる。</li> |
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
154 <!-- <li>スタックポインタの位置を変えずにすむ。</li> --> |
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
155 <p style=" margin-right:auto; margin-left:auto;"> |
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
156 <img class="scale" src="./pix/cs_stack.png" style="height: 7em;"> |
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
157 </p> |
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
158 </div> |
6ef99d3e66b2
modify light-weight continuation
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
159 <!-- PAGE --> |
58 | 160 <!-- PAGE --> |
161 <div class="slide"> | |
54 | 162 <h1>Continuation based C </h1> |
163 <small> | |
164 <table width=100% > | |
165 <tr> | |
166 <caption>階乗を求めるCbCのプログラム</caption> | |
167 <td width=50%> | |
168 <pre> | |
169 __code print_factorial(int prod) { | |
170 printf("factorial = %d\n",prod); | |
171 exit(0); | |
172 } | |
58 | 173 |
54 | 174 __code factorial0(int prod, int x) { |
175 if ( x >= 1) { | |
176 goto factorial0(prod*x, x-1); | |
177 }else{ | |
178 goto print_factorial(prod); | |
179 } | |
180 } | |
181 </pre> | |
182 </td> | |
183 <td> | |
184 <pre> | |
185 __code factorial(int x) { | |
186 goto factorial0(1, x); | |
187 } | |
58 | 188 |
54 | 189 int main(int argc, char **argv) { |
190 int i; | |
191 i = atoi(argv[1]); | |
192 goto factorial(i); | |
193 return 0; | |
194 } | |
195 </pre> | |
196 </td> | |
197 </tr> | |
198 </table> | |
199 </small> | |
200 </div> | |
201 <!-- PAGE --> | |
202 <div class="slide"> | |
203 <h1>Continuation Based C</h1> | |
204 <li></li> | |
205 </div> | |
206 <!-- PAGE --> | |
207 <div class="slide"> | |
208 <h1>GCC によるコンパイル</h1> | |
209 <li>GCC についての簡単な説明を行う...</li> | |
210 <img src="./pix/ir.png" style="height: 6em;"> | |
211 <li>CbCの実装は主に Parser の部分と RTL を生成する部分に行われる。</li> | |
212 </div> | |
213 <!-- PAGE --> | |
214 <div class="slide"> | |
215 <h1>CbC の実装</h1> | |
216 <ul> | |
217 <li>シンタックスの追加</li> | |
218 <li>fastcall属性の付与</li> | |
219 <li>Tail Call Elimination</li> | |
220 <li>環境付き継続</li> | |
221 </ul> | |
222 </div> | |
223 <!-- PAGE --> | |
224 <div class="slide"> | |
225 <h1>シンタックスの追加</h1> | |
226 <ul> | |
227 <li>__code でコードセグメントの宣言</li> | |
228 <li>goto にコードセグメントへの継続処理を追加</li> | |
229 </ul> | |
230 <li></li> | |
231 </div> | |
232 <!-- PAGE --> | |
233 <div class="slide"> | |
234 <h1>シンタックスの追加</h1> | |
55
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
235 <h2>__code でコードセグメントの宣言</h2> |
54 | 236 <ul> |
237 <li>__code 用idとkeywordを作成。</li> | |
55
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
238 <li>戻り値が無い為、コードセグメントは void 型の関数で作成される木と同じ木が作られる。</li> |
54 | 239 </ul> |
240 </div> | |
241 <!-- PAGE --> | |
242 <div class="slide"> | |
243 <h1>シンタックスの追加</h1> | |
55
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
244 <h2>goto シンタックスの追加</h2> |
54 | 245 <ul> |
246 <li>通常の goto に加え、コードセグメントを呼び出す処理を追加。</li> | |
247 <li>コードセグメントへのgoto後は、 return の処理を自動で追加。</li> | |
248 </ul> | |
55
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
249 <table border=1 width=100%> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
250 <tr class="center"> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
251 <small> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
252 <td>実際のコード </td> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
253 <td>GCC 内で処理されるコード</td> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
254 </small> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
255 </tr> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
256 <tr style="margin-top: auto;"> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
257 <td> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
258 <pre> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
259 goto factorial0(1, x); |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
260 </pre> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
261 </td> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
262 <td> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
263 <pre> |
58 | 264 factorial0(1, x); |
55
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
265 return; |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
266 </pre> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
267 </td> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
268 </tr> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
269 </table> |
54 | 270 </div> |
271 <!-- PAGE --> | |
272 <div class="slide"> | |
58 | 273 <h1>引数渡し</h1> |
274 <li>当初、GCCを使ってコンパイルしたCbCのプログラムはMicro-C版に速度面で勝てなかった。</li> | |
275 <ul> | |
276 <li>Micro-Cでは関数呼び出しの際にできるだけレジスタを使うようにしていたため。</li> | |
277 </ul> | |
278 <li class="incremental">そこで、GCC版CbCコンパイラの引数渡しもできるだけレジスタで行うことに</li> | |
279 </div> | |
280 <!-- PAGE --> | |
281 <div class="slide"> | |
282 <h1>引数渡し(fastcall属性の付与)</h1> | |
55
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
283 <li>i386 において関数呼び出しの際、引数渡しをできるだけレジスタを用いるGCCの拡張機能。</li> |
58 | 284 <li>__code で宣言された関数は自動でfastcall属性が付与される。</li> |
285 <small> | |
55
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
286 <pre> |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
287 if(!TARGET_64BIT) { |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
288 attrs = build_tree_list (get_identifier("fastcall"), NULL_TREE); |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
289 declspecs_add_attrs(specs, attrs); |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
290 } |
06ce8fb8e278
modify presen/index.html
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
54
diff
changeset
|
291 </pre> |
58 | 292 </small> |
293 <p><small>Intel64 ではレジスタが増えている為、fastcallは標準でつくようになっている。</small></p> | |
294 </div> | |
295 <!-- PAGE --> | |
296 <div class="slide"> | |
297 <h1></h1> | |
298 <li></li> | |
54 | 299 </div> |
300 <!-- PAGE --> | |
301 <div class="slide"> | |
302 <h1></h1> | |
303 <li></li> | |
304 </div> | |
305 <!-- PAGE --> | |
306 <div class="slide"> | |
307 <h1></h1> | |
57
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
308 <pre> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
309 typedef struct node { |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
310 selftype *right; |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
311 selftype *left; |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
312 }*NODE |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
313 </pre> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
314 |
54 | 315 <li></li> |
57
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
316 |
54 | 317 </div> |
318 <!-- PAGE --> | |
319 <div class="slide"> | |
320 <h1>環境付き継続とは</h1> | |
321 <li>コードセグメントを呼び出した C の関数に戻る機能</li> | |
322 <li></li> | |
323 </div> | |
324 <!-- PAGE --> | |
325 <div class="slide"> | |
326 <h1>環境付き継続:クロージャでの実装について</h1> | |
327 <li>『GCC 4.6 と Lion の組合せでは Closure は正しく動作していないことが分かった.』<br>間違い</li> | |
328 <li>訂正</li> | |
329 <ul> | |
330 <li class="incremental">GCC 4.6 への CbC の実装のせいでクロージャがうまくできていなかったことが判明。</li> | |
331 <li class="incremental">GCC 4.6 と Lion でのクロージャは特に問題はない。</li> | |
332 </ul> | |
333 </div> | |
334 <!-- PAGE --> | |
335 <div class="slide"> | |
336 <h1>環境付き継続:クロージャでの実装の問題点</h1> | |
337 <li></li> | |
338 <li></li> | |
339 </div> | |
340 <!-- PAGE --> | |
341 <div class="slide"> | |
342 <h1>環境付き継続: setjmp での実装</h1> | |
343 <li>setjmp での実装</li> | |
344 <small> | |
345 <pre> | |
346 ({ | |
347 int a = setjmp(env); | |
348 int retval; | |
349 void _cbc_internal_return(int retval_, jmp_buf _envp){ | |
350 retval = retval_; | |
351 longjmp(_envp, retval); | |
352 } | |
353 if (a) { | |
354 return retval; | |
355 } | |
356 _cbc_internal_return; | |
357 }) | |
358 </pre> | |
359 </small> | |
360 <li></li> | |
361 </div> | |
362 <!-- PAGE --> | |
363 <div class="slide"> | |
364 <h1>環境付き継続: setjmp での実装の問題</h1> | |
365 <li>GCC 内で setjmp を生成する関数を作る必要がある。</li> | |
366 <li>戻値の型が int </li> | |
367 <ul> | |
368 <li>構造体等ポインタの場合使えない。</li> | |
369 </ul> | |
370 <li class="incremental">setjmp での実装はあまり実用的ではない。</li> | |
371 </div> | |
372 <!-- PAGE --> | |
373 <div class="slide"> | |
57
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
374 <h1>__rectype の実装</h1> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
375 <li>通常、関数の引数に関数ポインタを渡した際は以下の様に使われる。</li> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
376 <small> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
377 <pre> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
378 void factorial(int n, int result, void(*print)()){ |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
379 : |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
380 (*print)(n,result,print,exit1, envp); |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
381 } |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
382 </pre> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
383 </small> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
384 <li>以下の様に扱えるようにしたい。</li> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
385 <small> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
386 <pre> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
387 void factorial(int n, int result, void *print){ |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
388 : |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
389 (*print)(n,result,print,exit1, envp); |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
390 } |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
391 </pre> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
392 </small> |
54 | 393 </div> |
394 <!-- PAGE --> | |
395 <div class="slide"> | |
57
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
396 <h1>__rectype の実装</h1> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
397 <li>そこで、__rectype という予約後を作り、以下の宣言を行えるようにした。</li> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
398 <pre> |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
399 __code factorial(int n, int result, __rectype *print) { |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
400 : |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
401 (*print)(n,result,print,exit1, envp); |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
402 } |
ce844f6c504d
modify __rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
403 </pre> |
54 | 404 </div> |
405 <!-- PAGE --> | |
406 <div class="slide"> | |
407 <h1></h1> | |
408 <li></li> | |
409 </div> | |
410 <!-- PAGE --> | |
411 </div> | |
412 </body> | |
413 </html> |