comparison presentation/slide.pdf.html @ 121:137aae675a94

Update slide
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Tue, 14 Feb 2017 15:03:04 +0900
parents 8a84cda440f3
children c195713cf7d7
comparison
equal deleted inserted replaced
120:8a84cda440f3 121:137aae675a94
68 68
69 <div class='slide '> 69 <div class='slide '>
70 <!-- === begin markdown block === 70 <!-- === begin markdown block ===
71 71
72 generated by markdown/1.2.0 on Ruby 2.3.3 (2016-11-21) [x86_64-darwin16] 72 generated by markdown/1.2.0 on Ruby 2.3.3 (2016-11-21) [x86_64-darwin16]
73 on 2017-02-14 11:30:47 +0900 with Markdown engine kramdown (1.13.0) 73 on 2017-02-14 15:02:42 +0900 with Markdown engine kramdown (1.13.0)
74 using options {} 74 using options {}
75 --> 75 -->
76 76
77 <!-- _S9SLIDE_ --> 77 <!-- _S9SLIDE_ -->
78 <h1 id="section">プログラミング言語とソフトウェアの信頼性</h1> 78 <h1 id="section">プログラミング言語とソフトウェアの信頼性</h1>
128 </div> 128 </div>
129 <div class='slide '> 129 <div class='slide '>
130 <!-- _S9SLIDE_ --> 130 <!-- _S9SLIDE_ -->
131 <h1 id="section-3">モデル検査的アプローチについての流れ</h1> 131 <h1 id="section-3">モデル検査的アプローチについての流れ</h1>
132 <ul> 132 <ul>
133 <li>既存のモデル検査器について</li>
133 <li>Continuation based C (CbC) 言語について</li> 134 <li>Continuation based C (CbC) 言語について</li>
134 <li>CbC における CodeSegment と DataSegment を用いたプログラミングスタイル</li> 135 <li>CbC における CodeSegment と DataSegment を用いたプログラミングスタイル</li>
135 <li>CbC とメタ計算について</li> 136 <li>CbC とメタ計算について</li>
136 <li>CbC で記述された GearsOS とそのデータ構造である赤黒木</li> 137 <li>CbC で記述された GearsOS とそのデータ構造である赤黒木</li>
137 <li>赤黒木の仕様の定義とその検証手法</li> 138 <li>赤黒木の仕様の定義とその検証手法</li>
138 </ul>
139
140
141 </div>
142 <div class='slide '>
143 <!-- _S9SLIDE_ -->
144 <h1 id="continuation-based-c">Continuation based C</h1>
145 <ul>
146 <li>当研究室で開発しているプログラミング言語</li>
147 <li>アセンブラとC言語の中間のような言語であり、構文はほとんど C 言語</li>
148 <li>OS や組み込みソフトウェアなどを対象にしている</li>
149 <li>CodeSegment と DataSegment という単位を用いてプログラミングする</li>
150 <li>両検証手法をメタ計算として利用可能</li>
151 </ul>
152
153
154 </div>
155 <div class='slide '>
156 <!-- _S9SLIDE_ -->
157 <h1 id="codesegment">CodeSegment</h1>
158 <ul>
159 <li>CodeSegment とは
160 <ul>
161 <li>処理の単位であり、入力と出力を持つ</li>
162 <li>結合や分割が容易</li>
163 </ul>
164 </li>
165 <li>CodeSegment どうしを接続することによりプログラム全体を作る
166 <ul>
167 <li>関数呼び出しと違って戻ってこない(goto)</li>
168 </ul>
169 </li>
170 </ul>
171
172 <p><img src="./images/cs.svg" alt="cs" width="50%" /></p>
173
174 <pre><code>__code cs0(int a, int b){
175 goto cs1(a+b);
176 }
177 </code></pre>
178
179
180 </div>
181 <div class='slide '>
182 <!-- _S9SLIDE_ -->
183 <h1 id="datasegment">DataSegment</h1>
184 <ul>
185 <li>DataSegment とは
186 <ul>
187 <li>データの単位</li>
188 <li>CodeSegment の入出力にあたる</li>
189 <li>接続元の Output DataSegment は接続先の Input DataSegment</li>
190 </ul>
191 </li>
192 </ul>
193
194 <p><img src="./images/ds.svg" alt="ds" width="50%" /></p>
195
196 <pre><code>__code cs0(int a, int b){
197 goto cs1(a+b);
198 }
199 </code></pre>
200
201
202 </div>
203 <div class='slide '>
204 <!-- _S9SLIDE_ -->
205 <h1 id="section-4">メタ計算</h1>
206 <ul>
207 <li>とある計算を実現するための計算</li>
208 <li>ネットワーク接続、例外処理、メモリ確保、並列処理など</li>
209 <li>CbC は通常レベルの計算とメタ計算を分離して考える
210 <ul>
211 <li>通常レベルではポインタは出てこない、など</li>
212 </ul>
213 </li>
214 <li>CodeSegment の接続部分に処理を追加することで実現</li>
215 </ul>
216
217 <p><img src="./images/meta.svg" alt="meta" width="50%" /></p>
218
219
220 </div>
221 <div class='slide '>
222 <!-- _S9SLIDE_ -->
223 <h1 id="meta-codesegment">Meta CodeSegment</h1>
224 <ul>
225 <li>メタ計算を行なう CodeSegment</li>
226 <li>通常の CodeSegment どうしの接続の間に入る</li>
227 </ul>
228
229 <p><img src="./images/mcs.svg" alt="mcs" width="50%" /></p>
230
231
232 </div>
233 <div class='slide '>
234 <!-- _S9SLIDE_ -->
235 <h1 id="meta-datasegment">Meta DataSegment</h1>
236 <ul>
237 <li>メタ計算用の DataSegment</li>
238 <li>通常の DataSegment を含むような DataSegment</li>
239 </ul>
240
241 <p><img src="./images/mds.svg" alt="mds" width="50%" /></p>
242
243
244 </div>
245 <div class='slide '>
246 <!-- _S9SLIDE_ -->
247 <h1 id="gearsos">並列に信頼性高く動作する GearsOS</h1>
248 <ul>
249 <li>CbC を用いたメタ計算の例として本研究室で開発している GearsOS がある</li>
250 <li>並列実行やモデル検査をメタ計算として提供する</li>
251 <li>現在はメモリ管理、Synchronized Queue、非破壊赤黒木などが実装済み</li>
252 <li>今回はこの非破壊赤黒木の検証を行なう</li>
253 </ul>
254
255
256 </div>
257 <div class='slide '>
258 <!-- _S9SLIDE_ -->
259 <h1 id="section-5">赤黒木</h1>
260 <ul>
261 <li>データの保存に用いる二分木</li>
262 <li>特に赤黒木はノードが持つ赤か黒の色を使って木のバランスを取る
263 <ul>
264 <li>ルートノードと葉ノードの色は黒</li>
265 <li>赤ノードは2つの黒ノードを子として持つ(よって赤ノードが続くことは無い)</li>
266 <li>ルートから最下位ノードへの経路に含まれる黒ノードの数はどの最下位ノードでも一定</li>
267 </ul>
268 </li>
269 </ul>
270
271 <p><img src="./images/rbtree.svg" alt="rbtree" width="35%" /></p>
272
273
274 </div>
275 <div class='slide '>
276 <!-- _S9SLIDE_ -->
277 <h1 id="gearsos-">GearsOS における赤黒木の利用例(ノードの挿入)</h1>
278 <ul>
279 <li>挿入したい要素を DataSegment に格納して次の CodeSegment へ goto</li>
280 <li>goto する前に Meta CodeSegment が実行されて木に挿入する</li>
281 <li>GearsOS では木の実装のためにスタックを用いて経路情報を保持している</li>
282 </ul>
283
284 <p><img src="./images/put.svg" alt="put" width="50%" /></p>
285
286 <pre><code>goto meta(context, Put);
287 </code></pre>
288
289
290 </div>
291 <div class='slide '>
292 <!-- _S9SLIDE_ -->
293 <h1 id="section-6">仕様の記述とその確認</h1>
294 <ul>
295 <li>「バランスが取れている」とは何かを表現できる必要がある
296 <ul>
297 <li>実行可能な CbC の式を使った assert になる</li>
298 </ul>
299 </li>
300 <li>そしてそれを保証したい
301 <ul>
302 <li>プログラムの全ての状態においてこれは常に成り立つのか?</li>
303 </ul>
304 </li>
305 </ul> 139 </ul>
306 140
307 141
308 </div> 142 </div>
309 <div class='slide '> 143 <div class='slide '>
337 <ul> 171 <ul>
338 <li>条件分岐を網羅的に実行</li> 172 <li>条件分岐を網羅的に実行</li>
339 </ul> 173 </ul>
340 </li> 174 </li>
341 <li>仕様は bool になる式を用いた assert</li> 175 <li>仕様は bool になる式を用いた assert</li>
342 <li>有限ステップ検証する有界モデル検査器</li> 176 <li>有限ステップだけ検証する有界モデル検査器</li>
343 </ul> 177 </ul>
344 </li> 178 </li>
345 </ul> 179 </ul>
346 180
347 <pre><code>assert(x &lt; 10); 181 <pre><code>assert(x &lt; 10);
348 </code></pre> 182 </code></pre>
183
184
185 </div>
186 <div class='slide '>
187 <!-- _S9SLIDE_ -->
188 <h1 id="continuation-based-c">Continuation based C</h1>
189 <ul>
190 <li>当研究室で開発しているプログラミング言語</li>
191 <li>アセンブラとC言語の中間のような言語であり、構文はほとんど C 言語</li>
192 <li>OS や組み込みソフトウェアなどを対象にしている</li>
193 <li>CodeSegment と DataSegment という単位を用いてプログラミングする</li>
194 <li>モデル検査と証明の両検証手法をメタ計算として利用可能
195 <ul>
196 <li>CbC で CbC 自身を検証可能</li>
197 </ul>
198 </li>
199 </ul>
200
201
202 </div>
203 <div class='slide '>
204 <!-- _S9SLIDE_ -->
205 <h1 id="codesegment">CodeSegment</h1>
206 <ul>
207 <li>CodeSegment とは
208 <ul>
209 <li>処理の単位であり、入力と出力を持つ</li>
210 <li>結合や分割が容易</li>
211 </ul>
212 </li>
213 <li>CodeSegment どうしを接続することによりプログラム全体を作る
214 <ul>
215 <li>関数呼び出しと違って戻ってこない(goto)</li>
216 </ul>
217 </li>
218 </ul>
219
220 <p><img src="./images/cs.svg" alt="cs" width="50%" /></p>
221
222 <pre><code>__code cs0(int a, int b){
223 goto cs1(a+b);
224 }
225 </code></pre>
226
227
228 </div>
229 <div class='slide '>
230 <!-- _S9SLIDE_ -->
231 <h1 id="datasegment">DataSegment</h1>
232 <ul>
233 <li>DataSegment とは
234 <ul>
235 <li>データの単位</li>
236 <li>CodeSegment の入出力にあたる</li>
237 <li>接続元の Output DataSegment は接続先の Input DataSegment</li>
238 </ul>
239 </li>
240 </ul>
241
242 <p><img src="./images/ds.svg" alt="ds" width="50%" /></p>
243
244 <pre><code>__code cs0(int a, int b){
245 goto cs1(a+b);
246 }
247 </code></pre>
248
249
250 </div>
251 <div class='slide '>
252 <!-- _S9SLIDE_ -->
253 <h1 id="section-4">メタ計算</h1>
254 <ul>
255 <li>とある計算を実現するための計算</li>
256 <li>ネットワーク接続、例外処理、メモリ確保、並列処理など</li>
257 <li>CbC は通常レベルの計算とメタ計算を分離して考える
258 <ul>
259 <li>通常レベルではポインタは出てこない、など</li>
260 </ul>
261 </li>
262 <li>CodeSegment の接続部分に処理を追加することで実現</li>
263 </ul>
264
265 <p><img src="./images/meta.svg" alt="meta" width="50%" /></p>
266
267
268 </div>
269 <div class='slide '>
270 <!-- _S9SLIDE_ -->
271 <h1 id="meta-codesegment">Meta CodeSegment</h1>
272 <ul>
273 <li>メタ計算を行なう CodeSegment</li>
274 <li>通常の CodeSegment どうしの接続の間に入る</li>
275 </ul>
276
277 <p><img src="./images/mcs.svg" alt="mcs" width="75%" /></p>
278
279
280 </div>
281 <div class='slide '>
282 <!-- _S9SLIDE_ -->
283 <h1 id="meta-datasegment">Meta DataSegment</h1>
284 <ul>
285 <li>メタ計算用の DataSegment</li>
286 <li>通常の DataSegment を含むような DataSegment</li>
287 </ul>
288
289 <p><img src="./images/mds.svg" alt="mds" width="75%" /></p>
290
291
292 </div>
293 <div class='slide '>
294 <!-- _S9SLIDE_ -->
295 <h1 id="gearsos">並列に信頼性高く動作する GearsOS</h1>
296 <ul>
297 <li>CbC を用いたメタ計算の例として本研究室で開発している GearsOS がある</li>
298 <li>並列実行やモデル検査をメタ計算として提供する</li>
299 <li>現在はメモリ管理、Synchronized Queue、非破壊赤黒木などが実装済み</li>
300 <li>今回はこの非破壊赤黒木の検証を行なう</li>
301 </ul>
302
303
304 </div>
305 <div class='slide '>
306 <!-- _S9SLIDE_ -->
307 <h1 id="section-5">赤黒木</h1>
308 <ul>
309 <li>データの保存に用いる二分木</li>
310 <li>特に赤黒木はノードが持つ赤か黒の色を使って木のバランスを取る
311 <ul>
312 <li>ルートノードと葉ノードの色は黒</li>
313 <li>赤ノードは2つの黒ノードを子として持つ(よって赤ノードが続くことは無い)</li>
314 <li>ルートから最下位ノードへの経路に含まれる黒ノードの数はどの最下位ノードでも一定</li>
315 </ul>
316 </li>
317 </ul>
318
319 <p><img src="./images/rbtree.svg" alt="rbtree" width="35%" /></p>
320
321
322 </div>
323 <div class='slide '>
324 <!-- _S9SLIDE_ -->
325 <h1 id="gearsos-">GearsOS における赤黒木の利用例(ノードの挿入)</h1>
326 <ul>
327 <li>挿入したい要素を DataSegment に格納して次の CodeSegment へ goto</li>
328 <li>goto する前に Meta CodeSegment が実行されて木に挿入する</li>
329 </ul>
330
331 <p><img src="./images/put.svg" alt="put" width="50%" /></p>
332
333 <pre><code>goto meta(context, Put);
334 </code></pre>
335
336
337 </div>
338 <div class='slide '>
339 <!-- _S9SLIDE_ -->
340 <h1 id="section-6">仕様の記述とその確認</h1>
341 <ul>
342 <li>「バランスが取れている」とは何かを表現できる必要がある
343 <ul>
344 <li>実行可能な CbC の条件式を使った assert になる</li>
345 </ul>
346 </li>
347 <li>そしてそれを保証したい
348 <ul>
349 <li>プログラムの全ての状態においてこれは常に成り立つのか?</li>
350 </ul>
351 </li>
352 </ul>
349 353
350 354
351 </div> 355 </div>
352 <div class='slide '> 356 <div class='slide '>
353 <!-- _S9SLIDE_ --> 357 <!-- _S9SLIDE_ -->
389 </ul> 393 </ul>
390 </li> 394 </li>
391 <li>ノーマルレベルのコードを検証用に変更せず検証可能</li> 395 <li>ノーマルレベルのコードを検証用に変更せず検証可能</li>
392 </ul> 396 </ul>
393 397
394 <p><img src="./images/akashaPut.svg" alt="akashaPut" width="51%" /></p> 398 <p><img src="./images/akashaPut.svg" alt="akashaPut" width="50%" /></p>
395 399
396 400
397 </div> 401 </div>
398 <div class='slide '> 402 <div class='slide '>
399 <!-- _S9SLIDE_ --> 403 <!-- _S9SLIDE_ -->
420 <div class='slide '> 424 <div class='slide '>
421 <!-- _S9SLIDE_ --> 425 <!-- _S9SLIDE_ -->
422 <h1 id="continuation-based-c-">定理証明を Continuation based C へ適用するには</h1> 426 <h1 id="continuation-based-c-">定理証明を Continuation based C へ適用するには</h1>
423 <ul> 427 <ul>
424 <li>任意の回数だけ木の操作を行なっても大丈夫なことを保証したい</li> 428 <li>任意の回数だけ木の操作を行なっても大丈夫なことを保証したい</li>
425 <li>そのままプログラムの性質を保証してやる</li> 429 <li>直接プログラムの性質を証明</li>
426 <li>Coq, Agda, ATS2 などのプログラミング言語で証明が可能 430 <li>Coq, Agda, ATS2 などのプログラミング言語で証明が可能
427 <ul> 431 <ul>
428 <li>本当は CbC で CbC 自身を証明したい</li> 432 <li>本当は CbC で CbC 自身を証明したい</li>
429 <li>しかし CbC の形式的な定義が無いために今はできない</li> 433 <li>しかし CbC の形式的な定義が無いために今はできない</li>
430 </ul> 434 </ul>
436 </div> 440 </div>
437 <div class='slide '> 441 <div class='slide '>
438 <!-- _S9SLIDE_ --> 442 <!-- _S9SLIDE_ -->
439 <h1 id="agda--datasegment">Agda と DataSegment</h1> 443 <h1 id="agda--datasegment">Agda と DataSegment</h1>
440 <ul> 444 <ul>
441 <li>CbC の DataSegment は Agda のレコード型</li> 445 <li>CbC の DataSegment は Agda のレコード型
446 <ul>
447 <li>名前付きの値が複数ある(C の構造体)</li>
448 </ul>
449 </li>
442 </ul> 450 </ul>
443 451
444 <pre><code>__code cs0(int a, int b){ 452 <pre><code>__code cs0(int a, int b){
445 goto cs1(a+b); 453 goto cs1(a+b);
446 } 454 }
455 </div> 463 </div>
456 <div class='slide '> 464 <div class='slide '>
457 <!-- _S9SLIDE_ --> 465 <!-- _S9SLIDE_ -->
458 <h1 id="agda--codesegment">Agda と CodeSegment</h1> 466 <h1 id="agda--codesegment">Agda と CodeSegment</h1>
459 <ul> 467 <ul>
460 <li>CbC の CodeSegment は、Agda の関数型(Input を取って Output を返す)</li> 468 <li>CbC の CodeSegment は、Agda の関数型
469 <ul>
470 <li>Input を取って Output を返す</li>
471 </ul>
472 </li>
461 </ul> 473 </ul>
462 474
463 <pre><code>__code cs0(int a, int b){ 475 <pre><code>__code cs0(int a, int b){
464 goto cs1(a+b); 476 goto cs1(a+b);
465 } 477 }
562 </div> 574 </div>
563 <div class='slide '> 575 <div class='slide '>
564 <!-- _S9SLIDE_ --> 576 <!-- _S9SLIDE_ -->
565 <h1 id="section-10">今後の課題</h1> 577 <h1 id="section-10">今後の課題</h1>
566 <ul> 578 <ul>
579 <li>より大きなサイズの赤黒木の検証</li>
580 <li>赤黒木の挿入に関する性質を証明する</li>
567 <li>部分型を利用してCbCを型付け</li> 581 <li>部分型を利用してCbCを型付け</li>
568 <li>依存型をCbC に導入して自身を証明可能にする</li> 582 <li>依存型をCbC に導入して自身を証明可能にする</li>
569 <li>型情報から stub を自動生成すkる</li> 583 <li>型情報から stub を自動生成すkる</li>
570 <li>赤黒木の挿入に関する性質を証明する</li>
571 </ul> 584 </ul>
572 585
573 586
574 </div> 587 </div>
575 <div class='slide '> 588 <div class='slide '>