comparison Slide/slide.html @ 96:38ab79fff396

update
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 11 Jan 2019 13:59:41 +0900
parents 01f148c3de98
children b360b0159390
comparison
equal deleted inserted replaced
95:01f148c3de98 96:38ab79fff396
176 <li>Rakudoとは現在のPerl6の主力な実装である.</li> 176 <li>Rakudoとは現在のPerl6の主力な実装である.</li>
177 <li>実行環境のVM, Perl6のサブセットであるNQP(NotQuitPerl), NQPで記述されたPerl6(Rakudo)という構成になっている.</li> 177 <li>実行環境のVM, Perl6のサブセットであるNQP(NotQuitPerl), NQPで記述されたPerl6(Rakudo)という構成になっている.</li>
178 <li>コンパイラは, NQPで記述されたPerl6コンパイラ, NQPで記述されたNQPコンパイラ, MoarVMバイトコードを解釈するMoarVMという構成である</li> 178 <li>コンパイラは, NQPで記述されたPerl6コンパイラ, NQPで記述されたNQPコンパイラ, MoarVMバイトコードを解釈するMoarVMという構成である</li>
179 </ul> 179 </ul>
180 180
181 <img src="fig/tgraph/1.svg" alt="" width="50%" height="50%" />
182
181 183
182 184
183 </div> 185 </div>
184 186
185 <div class='slide'> 187 <div class='slide'>
257 259
258 <pre><code> OP_const_i16: 260 <pre><code> OP_const_i16:
259 OP_const_i32: 261 OP_const_i32:
260 MVM_exception_throw_adhoc(tc, "const_iX NYI"); 262 MVM_exception_throw_adhoc(tc, "const_iX NYI");
261 OP_const_i64: 263 OP_const_i64:
262
263 </code></pre> 264 </code></pre>
264 265
265 266
266 267
267 </div> 268 </div>
284 <li><code>GET_REG</code>はバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする</li> 285 <li><code>GET_REG</code>はバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする</li>
285 <li><code>GET_REG</code>は次の様に展開される</li> 286 <li><code>GET_REG</code>は次の様に展開される</li>
286 </ul> 287 </ul>
287 288
288 <pre><code> reg_base[*((MVMuint16 *)(cur_op + 0))].i64 = MVM_BC_get_I64(cur_op, 2); 289 <pre><code> reg_base[*((MVMuint16 *)(cur_op + 0))].i64 = MVM_BC_get_I64(cur_op, 2);
289
290 </code></pre> 290 </code></pre>
291 291
292 <ul> 292 <ul>
293 <li><code>reg_base</code> はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, MVM_interp_runではローカル変数として利用している</li> 293 <li><code>reg_base</code> はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, MVM_interp_runではローカル変数として利用している</li>
294 </ul> 294 </ul>
517 517
518 </div> 518 </div>
519 519
520 <div class='slide'> 520 <div class='slide'>
521 <!-- _S9SLIDE_ --> 521 <!-- _S9SLIDE_ -->
522 <h2 id="nqpのバイトコードとcbc">NQPのバイトコードとCbC</h2>
523
524 <ul>
525 <li>NQPが生成したMoarVMバイトコードは確実に次に実行される命令がある箇所が複数存在する</li>
526 <li>静的にCのソースファイルに, NQPが生成したバイトコードと対応するCbCのCodeGearの実行を書くことで決定的に命令を実行可能でえある.</li>
527 </ul>
528
529
530
531 </div>
532
533 <div class='slide'>
534 <!-- _S9SLIDE_ -->
535 <h2 id="cbcmoarvmの利点">CbCMoarVMの利点</h2>
536
537 <ul>
538 <li>バイトコードインタプリタの箇所をモジュール化する事が可能となり, CodeGearの再利用性や記述生が高まる</li>
539 <li>デバッグ時にラベルではなくCodeGearにbreakpointを設定可能となり,デバッグが安易となる</li>
540 </ul>
541
542
543
544 </div>
545
546 <div class='slide'>
547 <!-- _S9SLIDE_ -->
548 <h2 id="cbcmoarvmの欠点">CbCMoarVMの欠点</h2>
549
550 <ul>
551 <li>CbCコンパイラがバグを発生させやすく, 意図しない挙動を示す事がある
552 <ul>
553 <li>CbCコンパイラ自体のバグも存在する</li>
554 </ul>
555 </li>
556 <li>MoarVMのオリジナルの更新頻度が高い為, 追従していく必要がある</li>
557 <li>CodeGear側からCに戻る際に手順が複雑となる</li>
558 <li>CodeGearを単位として用いる事で複雑なプログラミングが要求される.</li>
559 </ul>
560
561
562
563 </div>
564
565 <div class='slide'>
566 <!-- _S9SLIDE_ -->
522 <h2 id="moarvmのデバッグ手法">MoarVMのデバッグ手法</h2> 567 <h2 id="moarvmのデバッグ手法">MoarVMのデバッグ手法</h2>
523 568
524 <ul> 569 <ul>
525 <li>MoarVMはバイトコードをランダムに生成する仕様となっている 570 <li>MoarVMはバイトコードをランダムに生成する仕様となっている
526 <ul> 571 <ul>
543 <li>CbC側では次のオペコードの遷移は <code>cbc_next</code> というCodeGearで行う</li> 588 <li>CbC側では次のオペコードの遷移は <code>cbc_next</code> というCodeGearで行う</li>
544 <li>CodeGearは関数として扱える為, これに直接break pointを設定する</li> 589 <li>CodeGearは関数として扱える為, これに直接break pointを設定する</li>
545 </ul> 590 </ul>
546 591
547 <pre><code>(gdb) b cbc_next 592 <pre><code>(gdb) b cbc_next
548 Breakpoint 2 at 0x7ffff7560288: file src/core 593 Breakpoint 2 at 0x7ffff7560288: file src/core/cbc-interp.cbc, line 61.
549 /cbc-interp.cbc, line 61.
550 (gdb) command 2 594 (gdb) command 2
551 Type commands for breakpoint(s) 2, one per 595 Type commands for breakpoint(s) 2, one per line.
552 line.
553 End with a line saying just "end". 596 End with a line saying just "end".
554 &gt;p CODES[*(MVMuint16 *)i-&gt;cur_op] 597 &gt;p CODES[*(MVMuint16 *)i-&gt;cur_op]
555 &gt;p *(MVMuint16 *)i-&gt;cur_op 598 &gt;p *(MVMuint16 *)i-&gt;cur_op
556 &gt;c 599 &gt;c
557 &gt;end 600 &gt;end
558 </code></pre> 601 </code></pre>
559 <ul> 602 <ul>
560 <li>オリジナルの場合マクロである為, dummy関数をマクロに記述し, この関数にbreakpointを設定する</li> 603 <li>オリジナルの場合マクロである為, dummy関数をマクロに記述し, この関数にbreakpointを設定する</li>
561 </ul> 604 </ul>
562 605
563 <pre><code>dalmore gdb --args ../../MoarVM_Original/ 606 <pre><code>dalmore gdb --args ../../MoarVM_Original/MoarVM/moar --libpath=src/vm/moar/stage0 gen/moar/stage1/nqp
564 MoarVM/moar --libpath=src/vm/moar/stage0
565 gen/moar/stage1/nqp
566 (gdb) b dummy 607 (gdb) b dummy
567 Function "dummy" not defined. 608 Function "dummy" not defined.
568 Make breakpoint pending on future shared 609 Make breakpoint pending on future shared library load? (y or [n]) y
569 library load? (y or [n]) y
570 Breakpoint 1 (dummy) pending. 610 Breakpoint 1 (dummy) pending.
571 (gdb) command 1 611 (gdb) command 1
572 Type commands for breakpoint(s) 1, one per 612 Type commands for breakpoint(s) 1, one per line.
573 line.
574 End with a line saying just "end". 613 End with a line saying just "end".
575 &gt;up 614 &gt;up
576 &gt;p *(MVMuint16 *)(cur_op) 615 &gt;p *(MVMuint16 *)(cur_op)
577 &gt;c 616 &gt;c
578 &gt;end 617 &gt;end
618
579 </code></pre> 619 </code></pre>
580 620
581 621
582 622
583 </div> 623 </div>
589 <ul> 629 <ul>
590 <li>トレース時には次の様なデバッグ情報の表示を利用する</li> 630 <li>トレース時には次の様なデバッグ情報の表示を利用する</li>
591 <li>デバッガに, breakpointで停止した際のcur_opの値を表示する様に設定する.</li> 631 <li>デバッガに, breakpointで停止した際のcur_opの値を表示する様に設定する.</li>
592 </ul> 632 </ul>
593 633
594 <pre><code>Breakpoint 1, dummy () at src/core/interp.c 634 <pre><code>Breakpoint 1, dummy () at src/core/interp.c:46
595 :46 635 46 }
596 46 } 636 #1 0x00007ffff75608fe in MVM_interp_run (tc=0x604a20,
597 #1 0x00007ffff75608fe in MVM_interp_run (tc=0 637 initial_invoke=0x7ffff76c7168 &lt;toplevel_initial_invoke&gt;, invoke_data=0x67ff10)
598 x604a20,
599 initial_invoke=0x7ffff76c7168 &lt;
600 toplevel_initial_invoke&gt;, invoke_data
601 =0x67ff10)
602 at src/core/interp.c:119 638 at src/core/interp.c:119
603 119 goto NEXT; 639 119 goto NEXT;
604 $1 = 159 640 $1 = 159
605 Breakpoint 1, dummy () at src/core/interp.c 641
606 :46 642 Breakpoint 1, dummy () at src/core/interp.c:46
607 46 } 643 46 }
608 #1 0x00007ffff75689da in MVM_interp_run (tc=0 644 #1 0x00007ffff75689da in MVM_interp_run (tc=0x604a20,
609 x604a20, 645 initial_invoke=0x7ffff76c7168 &lt;toplevel_initial_invoke&gt;, invoke_data=0x67ff10)
610 initial_invoke=0x7ffff76c7168 &lt;
611 toplevel_initial_invoke&gt;, invoke_data
612 =0x67ff10)
613 at src/core/interp.c:1169 646 at src/core/interp.c:1169
614 1169 goto NEXT; 647 1169 goto NEXT;
615 $2 = 162 648 $2 = 162
649 </code></pre>
650
651
652
653 </div>
654
655 <div class='slide'>
656 <!-- _S9SLIDE_ -->
657 <h2 id="cbcmoarvmのデバッグ">CbCMoarVMのデバッグ</h2>
658
659 <pre><code>Breakpoint 2, cbc_next (i=0x7fffffffdc30) at src/core/cbc-interp.cbc:61
660 61 goto NEXT(i);
661 $1 = (void (*)(INTERP)) 0x7ffff7566f53 &lt;cbc_takeclosure&gt;
662 $2 = 162
663
664 Breakpoint 2, cbc_next (i=0x7fffffffdc30) at src/core/cbc-interp.cbc:61
665 61 goto NEXT(i);
666 $3 = (void (*)(INTERP)) 0x7ffff7565f86 &lt;cbc_checkarity&gt;
667 $4 = 140
668
669 Breakpoint 2, cbc_next (i=0x7fffffffdc30) at src/core/cbc-interp.cbc:61
670 61 goto NEXT(i);
671 $5 = (void (*)(INTERP)) 0x7ffff7579d06 &lt;cbc_paramnamesused&gt;
672 $6 = 558
673
674
616 </code></pre> 675 </code></pre>
617 676
618 677
619 678
620 </div> 679 </div>
663 722
664 </div> 723 </div>
665 724
666 <div class='slide'> 725 <div class='slide'>
667 <!-- _S9SLIDE_ --> 726 <!-- _S9SLIDE_ -->
668 <h2 id="cbcmoarvmの利点">CbCMoarVMの利点</h2>
669
670 <ul>
671 <li>バイトコードインタプリタの箇所をモジュール化する事が可能となり, CodeGearの再利用性や記述生が高まる</li>
672 <li>デバッグ時にラベルではなくCodeGearにbreakpointを設定可能となり,デバッグが安易となる</li>
673 <li>ThreadedCodeを実装する場合, CodeGearを組み合わせることにより実装する事が可能となる</li>
674 </ul>
675
676
677
678 </div>
679
680 <div class='slide'>
681 <!-- _S9SLIDE_ -->
682 <h2 id="cbcmoarvmの欠点">CbCMoarVMの欠点</h2>
683
684 <ul>
685 <li>CbCコンパイラがバグを発生させやすく, 意図しない挙動を示す事がある
686 <ul>
687 <li>CbCコンパイラ自体のバグも存在する</li>
688 </ul>
689 </li>
690 <li>MoarVMのオリジナルの更新頻度が高い為, 追従していく必要がある</li>
691 <li>CodeGear側からCに戻る際に手順が複雑となる</li>
692 <li>CodeGearを単位として用いる事で複雑なプログラミングが要求される.</li>
693 </ul>
694
695
696
697 </div>
698
699 <div class='slide'>
700 <!-- _S9SLIDE_ -->
701 <h2 id="threadedcodeの実装">ThreadedCodeの実装</h2> 727 <h2 id="threadedcodeの実装">ThreadedCodeの実装</h2>
702 728
703 <ul> 729 <ul>
704 <li>MoarVM内のオペコードに対応する処理が分離出来たことにより, オペコードに該当するCodeGearを書き連ねることによってThreadedCodeが実装可能となる</li> 730 <li>MoarVM内のオペコードに対応する処理が分離出来たことにより, オペコードに該当するCodeGearを書き連ねることによってThreadedCodeが実装可能となる</li>
705 </ul> 731 </ul>
732 758
733 sub fib($n) { 759 sub fib($n) {
734 $n &lt; 2 ?? $n !! fib($n-1) + fib($n - 2); 760 $n &lt; 2 ?? $n !! fib($n-1) + fib($n - 2);
735 } 761 }
736 762
737 my $N := 29; 763 my $N := 30;
738 764
739 my $t0 := nqp::time_n();
740 my $z := fib($N); 765 my $z := fib($N);
741 my $t1 := nqp::time_n();
742 766
743 say("fib($N) = " ~ fib($N)); 767 say("fib($N) = " ~ fib($N));
744 say("time = " ~ ($t1-$t0));
745 768
746 </code></pre> 769 </code></pre>
747 770
748 771
749 </div> 772 </div>
751 <div class='slide'> 774 <div class='slide'>
752 <!-- _S9SLIDE_ --> 775 <!-- _S9SLIDE_ -->
753 <h2 id="フィボナッチの例題">フィボナッチの例題</h2> 776 <h2 id="フィボナッチの例題">フィボナッチの例題</h2>
754 777
755 <ul> 778 <ul>
779 <li>オリジナル
780 <ul>
781 <li>1.379 sec</li>
782 <li>1.350 sec</li>
783 <li>1.346 sec</li>
784 </ul>
785 </li>
786 <li>CbCMoarVM
787 <ul>
788 <li>1.636 sec</li>
789 <li>1.804 sec</li>
790 <li>1.787 sec</li>
791 </ul>
792 </li>
756 <li>フィボナッチの例題ではCbCMoarVMが劣る結果となった</li> 793 <li>フィボナッチの例題ではCbCMoarVMが劣る結果となった</li>
757 </ul> 794 </ul>
758 795
759 796
760 797
767 <ul> 804 <ul>
768 <li>オリジナル 805 <li>オリジナル
769 <ul> 806 <ul>
770 <li>7.499 sec</li> 807 <li>7.499 sec</li>
771 <li>7.844 sec</li> 808 <li>7.844 sec</li>
772 <li>6.074 sec</li> 809 <li>6.746 sec</li>
773 </ul> 810 </ul>
774 </li> 811 </li>
775 <li>CbCMoarVM 812 <li>CbCMoarVM
776 <ul> 813 <ul>
777 <li>6.135 sec</li> 814 <li>6.135 sec</li>
786 823
787 </div> 824 </div>
788 825
789 <div class='slide'> 826 <div class='slide'>
790 <!-- _S9SLIDE_ --> 827 <!-- _S9SLIDE_ -->
791 <h2 id="まとめ">まとめ</h2>
792
793 <ul>
794 <li>速度を計測した所, 現在はCbCMoarVMの方が僅かに劣る結果となった</li>
795 <li>ただしフィボナッチを求める例題などで, ケースによってはCbCMoarVMの方が高速に動作する場合もある</li>
796 </ul>
797
798
799
800 </div>
801
802 <div class='slide'>
803 <!-- _S9SLIDE_ -->
804 <h2 id="基本ブロックとcodegear">基本ブロックとCodeGear</h2> 828 <h2 id="基本ブロックとcodegear">基本ブロックとCodeGear</h2>
805 829
806 <ul> 830 <ul>
807 <li>コンパイラなどでは, 関数あるいはループの先頭から, 別の関数呼び出し, あるいはジャンプするまでの間のコードを基本ブロックと呼ぶ</li> 831 <li>コンパイラなどでは, 関数あるいはループの先頭から, 別の関数呼び出し, あるいはジャンプするまでの間のコードを基本ブロックと呼ぶ</li>
808 <li>基本ブロックは入力に影響を受けず, 基本ブロックが決定したタイミングである決定的な処理を行う</li> 832 <li>基本ブロックは入力に影響を受けず, 基本ブロックが決定したタイミングである決定的な処理を行う</li>
809 </ul> 833 <li>予め実行する基本ブロックが確定していれば, その部分のみ抜き出してコンパイルする事が可能である</li>
834 <li>CbCのCodeGearは, この基本ブロックとみなす事が可能である</li>
835 <li>その為, NQPの例題の様に, 予め実行する基本ブロックが確定すれば, その部分の処理が可能となる</li>
836 <li>これを行うことで, CbCを用いてMoarVMのThreadedCode実装が可能となる</li>
837 </ul>
838
839 <pre><code>__code cbc_const_i64(INTERP i,__code cbc_next(INTERP i)){
840 GET_REG(i-&gt;cur_op, 0,i).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
841 i-&gt;cur_op += 10;
842 goto cbc_next(i);
843 }
844
845 goto cbc_const_i64_16(i,cbc_gt_i_01);
846
847 __code cbc_gt_i_01(INTERP i){
848 goto cbc_gt_i(i,cbc_unless_i_01);
849 }
850
851 __code cbc_unless_i_01(INTERP i,cbc_osrpoint_01){
852 goto cbc_unless_i(i,cbc_osrpoint_01);
853 }
854 </code></pre>
810 855
811 856
812 857
813 </div> 858 </div>
814 859