comparison presen/index.html @ 64:743afe406e56

modify
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Thu, 29 Dec 2011 00:38:32 +0900
parents 3cc4a8603489
children 26a3713b2989
comparison
equal deleted inserted replaced
63:3cc4a8603489 64:743afe406e56
3 3
4 <html xmlns="http://www.w3.org/1999/xhtml"> 4 <html xmlns="http://www.w3.org/1999/xhtml">
5 5
6 <head> 6 <head>
7 <style> 7 <style>
8 .src{
9 overflow: scroll;
10 width: 90%;
11 height: 60%;
12 }
8 .center { 13 .center {
9 margin-left: auto; 14 margin-left: auto;
10 margin-right: auto; 15 margin-right: auto;
11 text-align: center; 16 text-align: center;
12 } 17 }
111 <li>goto シンタックスの追加</li> 116 <li>goto シンタックスの追加</li>
112 <li>環境付き継続</li> 117 <li>環境付き継続</li>
113 </ul> 118 </ul>
114 --> 119 -->
115 <li>Micro-C との性能比較</li> 120 <li>Micro-C との性能比較</li>
121 <!--
116 <li>mercurial を用いたアップデートの方法</li> 122 <li>mercurial を用いたアップデートの方法</li>
123 -->
117 <li>まとめ</li> 124 <li>まとめ</li>
118 <ol> 125 <ol>
119 </div> 126 </div>
120 <!-- PAGE --> 127 <!-- PAGE -->
121 <div class="slide"> 128 <div class="slide">
395 <li>引数は一旦、一時変数にコピーする。</li> 402 <li>引数は一旦、一時変数にコピーする。</li>
396 </ul> 403 </ul>
397 <li class="incremental">これでコードセグメントへの処理はjmp命令で移ることになる。</li> 404 <li class="incremental">これでコードセグメントへの処理はjmp命令で移ることになる。</li>
398 </div> 405 </div>
399 <!-- PAGE --> 406 <!-- PAGE -->
407 <!--
400 <div class="slide"> 408 <div class="slide">
401 <h1>CbCの実装:環境付き継続</h1> 409 <h1>CbCの実装:環境付き継続</h1>
402 <li>CbCにおけるCとの互換性を保つための機能。</li> 410 <li>CbCにおけるCとの互換性を保つための機能。</li>
403 <li>コードセグメントを呼び出したCの関数に戻ることができる。</li> 411 <li>コードセグメントを呼び出したCの関数に戻ることができる。</li>
404 <li></li> 412 <li>論文における訂正</li>
405 </div> 413 <li>『GCC 4.6 と Lion の組合せでは Closure は正しく動作していないことが分かった.』</li>
406 <!-- PAGE --> 414 <ul>
407 <div class="slide"> 415 <li>GCC 4.6 への CbC の実装のせいでクロージャがうまくできていなかったことが判明。</li>
408 <h1>環境付き継続:クロージャでの実装について</h1> 416 <li>GCC 4.6 と Lion でのクロージャは特に問題はない。</li>
409 <li>『GCC 4.6 と Lion の組合せでは Closure は正しく動作していないことが分かった.』<br>間違い</li> 417 </ul>
410 <li>訂正</li> 418 </div>
411 <ul> 419 -->
412 <li class="incremental">GCC 4.6 への CbC の実装のせいでクロージャがうまくできていなかったことが判明。</li> 420 <!-- PAGE -->
413 <li class="incremental">GCC 4.6 と Lion でのクロージャは特に問題はない。</li> 421 <!--
414 </ul> 422 <div class="slide">
415 </div> 423 <h1>環境付き継続:論文におけるクロージャの問題の訂正</h1>
416 <!-- PAGE --> 424 <p><small>『GCC 4.6とLionの組み合わせではclosureは正しく動作してないことが分かった。』<br>
417 <div class="slide"> 425 とあるが、これはCbCの実装でTCEを強制的に立てることが原因であったことを訂正させて頂きます。</small></p>
418 <h1>環境付き継続:クロージャでの実装の問題点</h1> 426 </div>
419 <li></li> 427 -->
420 <li></li> 428 <!-- PAGE -->
421 </div> 429 <div class="slide">
422 <!-- PAGE --> 430 <h1>CbCの実装:環境付き継続</h1>
423 <div class="slide"> 431 <li>CbCにおけるCとの互換性を保つための機能。コードセグメントを呼び出したCの関数に戻ることができる。</li>
424 <h1>環境付き継続: setjmp での実装</h1> 432 <li>__returnキーワードを引数に渡すことで使うことができる。</li>
425 <li>setjmp での実装</li> 433 <li>以下の使い方の場合は1を返す。</li>
426 <small> 434 <small>
427 <pre> 435 <pre>
428 ({ 436 __code c1(__code ret(int,void *),void *env) {
429 int a = setjmp(env); 437 goto ret(1,env);
430 int retval; 438 }
431 void _cbc_internal_return(int retval_, jmp_buf _envp){ 439 int main() {
432 retval = retval_; 440 goto c1(__return, __environment);
433 longjmp(_envp, retval); 441 }
434 }
435 if (a) {
436 return retval;
437 }
438 _cbc_internal_return;
439 })
440 </pre> 442 </pre>
441 </small> 443 </small>
442 <li></li> 444 <p><small>__environmentキーワードは関数の環境を保存している。</small></p>
443 </div> 445 </div>
444 <!-- PAGE --> 446 <!-- PAGE -->
445 <div class="slide"> 447 <div class="slide">
446 <h1>環境付き継続: setjmp での実装の問題</h1> 448 <h1>CbCの実装:環境付き継続</h1>
447 <li>GCC 内で setjmp を生成する関数を作る必要がある。</li> 449 <h2>実際には以下のコードを生成している。</h2>
448 <li>戻値の型が int </li> 450 <small>
449 <ul> 451 <pre>
450 <li>構造体等ポインタの場合使えない。</li> 452 goto c1(__return, __environment);
451 </ul> 453
452 <li class="incremental">setjmp での実装はあまり実用的ではない。</li> 454 goto c1(
455 ({
456 __label__ _cbc_exit0;
457 static int retval;
458 void _cbc_internal_return(int retval_, void *_envp){
459 retval = retval_;
460 goto _cbc_exit0; }
461 if (0) { _cbc_exit0:
462 return retval; }
463 _cbc_internal_return;
464 }),
465 __environment);
466 </pre>
467 <p>retval変数はint型になっているが、実際には継続を行った関数と同じ戻値の型となる。</p>
468 </small>
469 <li class="incremental">上記のコードをGCC内で生成するのが次のソースとなる。</li>
470 </div>
471 <!-- PAGE -->
472 <div class="slide">
473 <h1>CbCの実装:環境付き継続</l>
474 <h2>環境付き継続の生成部分:</h2>
475 <div class="src">
476 <small>
477 <pre>
478 {
479 tree value, stmt, label, tlab, decl;
480 c_parser_consume_token (parser);
481
482 stmt = c_begin_stmt_expr ();
483 cbc_return_f = c_parser_peek_token (parser)->value;
484 location_t location = c_parser_peek_token (parser)->location;
485
486 /* create label. (__label__ _cbc_exit0;) */
487 label = get_identifier ("_cbc_exit0");
488 tlab = declare_label (label);
489 C_DECLARED_LABEL_FLAG (tlab) = 1;
490 add_stmt (build_stmt (location, DECL_EXPR, tlab));
491
492 /* declare retval. (int retval;) */
493 tree decl_cond =
494 build_decl (location, VAR_DECL, get_identifier ("retval"),
495 TREE_TYPE (TREE_TYPE (current_function_decl)));
496 TREE_STATIC (decl_cond) = 1;
497 TREE_USED (decl_cond) = 1;
498
499 /* Use thread-local */
500 DECL_TLS_MODEL (decl_cond) = decl_default_tls_model (decl_cond);
501 DECL_NONLOCAL (decl_cond) = 1;
502 add_stmt (build_stmt(location, DECL_EXPR, pushdecl (decl_cond)));
503
504 /* define nested function. */
505 decl =
506 cbc_finish_nested_function (location, label, decl_cond);
507 TREE_USED(decl) = 1;
508
509 /* define if-ed goto label and return statement. */
510 cbc_finish_labeled_goto (location, label, decl_cond);
511
512 /* get pointer to nested function. */
513 value = build_addr (decl , current_function_decl);
514 TREE_USED (current_function_decl) = 1;
515 SET_EXPR_LOCATION (value, location);
516 add_stmt (value);
517
518 TREE_SIDE_EFFECTS (stmt) = 1;
519 expr.value = c_finish_stmt_expr (location, stmt);
520 expr.original_code = ERROR_MARK;
521 }
522 </pre>
523 </small>
524 </div>
525 </div>
526 <!-- PAGE -->
527 <div class="slide">
528 <h1>CbCの実装:環境付き継続</h1>
529 <h2>作成されるTree</h2>
530 <img src="./pix/STATEMENT_LIST_1.png" style="height: 10em;">
531 <!--
532 <small>
533 <pre>
534 ({
535 __label__ _cbc_exit0;
536 static int retval;
537 void _cbc_internal_return(int retval_, void *_envp){
538 retval = retval_;
539 goto _cbc_exit0; }
540 if (0) { _cbc_exit0:
541 return retval; }
542 _cbc_internal_return;
543 }),
544 </pre>
545 </small>
546 -->
547 </div>
548 <!-- PAGE -->
549 <div class="slide">
550 <h1>環境付き継続:実装の問題</h1>
551 <ul>
552 <li>リターンするretval変数が重要になってくる。</li>
553 <li>retval変数のデータをどうやって確保するか。</li>
554 </ul>
555 <li>次の方法が考えられる。</li>
556 <ul>
557 <li>クロージャでの確保</li>
558 <li>staticでの確保</li>
559 <li>static thread local storage(tls)を用いての確保</li>
560 </ul>
561 </div>
562 <!-- PAGE -->
563 <div class="slide">
564 <h1>環境付き継続:実装の問題</h1>
565 <li>クロージャでの実装</li>
566 <ul>
567 <li>クロージャにしてスタックに値を確保する。</li>
568 <li></li>
569 </ul>
570 <li>問題点</li>
571 <ul>
572 <li class="incremental">しかしCbCではスタックの値は破棄されていく。</li>
573 <li class="incremental">その為スタックに値を確保するのは好ましくない。</li>
574 </ul>
575 </div>
576 <!-- PAGE -->
577 <div class="slide">
578 <h1>環境付き継続:実装の問題</h1>
579 <li>staticでの実装</li>
580 <ul>
581 <li>静的に値を確保することでスタック破棄の影響を受けない。</li>
582 </ul>
583 <li>問題点</li>
584 <ul>
585 <li class="incremental">マルチスレッドのプログラムに対応できない。</li>
586 <li class="incremental">値を返し切る前に別スレッドによって値が書き換えられる可能性がある。</li>
587 </ul>
588 </div>
589 <!-- PAGE -->
590 <div class="slide">
591 <h1>環境付き継続:実装の問題</h1>
592 <li>static tlsでの実装</li>
593 <ul>
594 <li>スレッド毎に静的に値を確保する。</li>
595 </ul>
596 <li>現在はこの方法で実装を行なっている。</li>
597 <li>しかし、最適化にかけると正しい値が返ってこない。
598 <br>(恐らくTreeの生成の部分が間違っている。)</li>
599 </div>
600 <!-- PAGE -->
601 <div class="slide">
602 <h1>環境付き継続:その他の実装方法</h1>
603 <ul>
604 <li>setjmpでの実装</li>
605 <ul>
606 <li>setjmpを行うTreeを生成するのが少し手間になる。</li>
607 <li>int型の戻値しか得られない。</li>
608 </ul>
609 <li>戻値を入れるレジスタを明示的に指定する。</li>
610 <ul>
611 <li>まだ実装を試していない。</li>
612 </ul>
613 </ul>
453 </div> 614 </div>
454 <!-- PAGE --> 615 <!-- PAGE -->
455 <div class="slide"> 616 <div class="slide">
456 <h1>__rectype の実装</h1> 617 <h1>__rectype の実装</h1>
457 <li>通常、関数の引数に関数ポインタを渡した際は以下の様に使われる。</li> 618 <li>通常、関数の引数に関数ポインタを渡した際は以下の様に使われる。</li>
484 } 645 }
485 </pre> 646 </pre>
486 </div> 647 </div>
487 <!-- PAGE --> 648 <!-- PAGE -->
488 <div class="slide"> 649 <div class="slide">
650 <h1>CbCの機能の拡張</h1>
651 <h2>selftypeの実装</h2>
652 <li>以下の宣言が行えるようにしたい。</li>
653 <small>
654 <pre>
655 typedef sturct node {
656 selftype *left;
657 selftype *right;
658 int num;
659 }*NODE
660 </pre>
661 <p>selftype は struct node を指す。</p>
662 </small>
663 <ul>
664 <li>上記の構文は実装を行う予定である。</li>
665 </ul>
666 </div>
667 <!-- PAGE -->
668 <div class="slide">
489 <h1></h1> 669 <h1></h1>
670 <li></li>
671 </div>
672 <!-- PAGE -->
673 <div class="slide">
674 <h1></h1>
675 <li></li>
676 </div>
677 <!-- PAGE -->
678 <div class="slide">
679 <h1>まとめ</h1>
680 <li>今回GCC版CbCコンパイラのアップデートを行った。</li>
681 <li>アップデートに伴いTCEの条件クリアや環境付き継続といった部分の修正と機能の拡張も行った。</li>
490 <li></li> 682 <li></li>
491 </div> 683 </div>
492 <!-- PAGE --> 684 <!-- PAGE -->
493 </div> 685 </div>
494 </body> 686 </body>