Mercurial > hg > Events > OSC2019
comparison slide.html @ 10:4b1eb4d69695
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 19 Apr 2019 18:53:12 +0900 |
parents | 642787982a80 |
children | 58cd4dd86896 |
comparison
equal
deleted
inserted
replaced
9:642787982a80 | 10:4b1eb4d69695 |
---|---|
442 <div class='slide'> | 442 <div class='slide'> |
443 <!-- _S9SLIDE_ --> | 443 <!-- _S9SLIDE_ --> |
444 <h2 id="nqpスクリプトnまでの整数の和">NQPスクリプト(nまでの整数の和)</h2> | 444 <h2 id="nqpスクリプトnまでの整数の和">NQPスクリプト(nまでの整数の和)</h2> |
445 | 445 |
446 <pre><code class="language-perl6">sub add_test($n){ | 446 <pre><code class="language-perl6">sub add_test($n){ |
447 mu $sum := 0; | 447 my $sum := 0; |
448 while ( $n > 1) { | 448 while ( $n > 1) { |
449 $sum := $sum + $n; | 449 $sum := $sum + $n; |
450 --$n; | 450 --$n; |
451 } | 451 } |
452 return $sum; | 452 return $sum; |
459 | 459 |
460 </div> | 460 </div> |
461 | 461 |
462 <div class='slide'> | 462 <div class='slide'> |
463 <!-- _S9SLIDE_ --> | 463 <!-- _S9SLIDE_ --> |
464 <h2 id="nqpとオペコード">NQPとオペコード</h2> | 464 <h2 id="nqp">NQP</h2> |
465 | 465 |
466 <ul> | 466 <ul> |
467 <li>NQPはPerl6の中で一番レイヤーが低い言語</li> | 467 <li>NQPはPerl6の中で一番レイヤーが低い言語</li> |
468 <li>その為、 実行するVMのオペコード(処理単位)を使用することができる</li> | 468 <li>その為、 実行するVMのオペコード(処理単位)を使用することができる</li> |
469 </ul> | 469 <li>NQPオペコードは、 Perl6の内部の抽象構文木でも使用されている</li> |
470 <li>また、 Perl6と同様に型を指定することが可能</li> | |
471 </ul> | |
472 | |
473 <pre><code class="language-perl6">sub add_test(int $n){ | |
474 mu $sum := 0; | |
475 while nqp::isgt_i($n,1) { | |
476 $sum := nqp::add_i($sum,$n); | |
477 $n := nqp::sub_i($n,1); | |
478 } | |
479 return $sum; | |
480 } | |
481 </code></pre> | |
470 | 482 |
471 | 483 |
472 | 484 |
473 </div> | 485 </div> |
474 | 486 |
526 <div class='slide'> | 538 <div class='slide'> |
527 <!-- _S9SLIDE_ --> | 539 <!-- _S9SLIDE_ --> |
528 <h2 id="バイトコード">バイトコード</h2> | 540 <h2 id="バイトコード">バイトコード</h2> |
529 <ul> | 541 <ul> |
530 <li>Perl6も、Rakudo/NQPはバイトコードに変換され、 バイトコードをVMが実行する</li> | 542 <li>Perl6も、Rakudo/NQPはバイトコードに変換され、 バイトコードをVMが実行する</li> |
531 <li>バイトコード実行部分は、 命令に対応するバイト列を読み込み、 解釈し、 次の命令を読み取ることを繰り返す</li> | 543 <li>Perl6/NQPはバイトコードにコンパイルすることが可能 |
532 </ul> | 544 <ul> |
533 | 545 <li>直接実行することはできない</li> |
546 </ul> | |
547 </li> | |
548 </ul> | |
549 | |
550 <pre><code>$nqp --target=mbc --output=fib.moarvm fib.nqp | |
551 </code></pre> | |
552 | |
553 | |
554 | |
555 </div> | |
556 | |
557 <div class='slide'> | |
558 <!-- _S9SLIDE_ --> | |
559 <h2 id="バイトコードとmoarvm">バイトコードとMoarVM</h2> | |
560 | |
561 <ul> | |
562 <li>MoarVMバイトコードはMoarVMの実行バイナリ <code>moar</code> でディスアセンブルすることが可能</li> | |
563 </ul> | |
564 | |
565 <pre><code> annotation: add_test.nqp:1 | |
566 00003 const_i64_16 loc_2_int, 0 | |
567 00004 hllboxtype_i loc_3_obj | |
568 00005 box_i loc_3_obj, loc_2_int, loc_3_obj | |
569 00006 set loc_1_obj, loc_3_obj | |
570 label_1: | |
571 00007 decont loc_3_obj, loc_0_obj | |
572 00008 smrt_numify loc_4_num, loc_3_obj | |
573 00009 const_i64_16 loc_2_int, 1 | |
574 00010 coerce_in loc_5_num, loc_2_int | |
575 00011 gt_n loc_2_int, loc_4_num, loc_5_num | |
576 00012 unless_i loc_2_int, label_2(00031) | |
577 00013 osrpoint | |
578 annotation: add_test.nqp:3 | |
579 00014 decont loc_3_obj, loc_1_obj | |
580 00015 smrt_numify loc_5_num, loc_3_obj | |
581 00016 decont loc_3_obj, loc_0_obj | |
582 00017 smrt_numify loc_4_num, loc_3_obj | |
583 00018 add_n loc_4_num, loc_5_num, loc_4_num | |
584 00019 hllboxtype_n loc_3_obj | |
585 00020 box_n loc_3_obj, loc_4_num, loc_3_obj | |
586 00021 set loc_1_obj, loc_3_obj | |
587 00022 decont loc_3_obj, loc_0_obj | |
588 00023 smrt_numify loc_4_num, loc_3_obj | |
589 00024 coerce_ni loc_6_int, loc_4_num | |
590 00025 const_i64_16 loc_7_int, 1 | |
591 00026 sub_i loc_7_int, loc_6_int, loc_7_int | |
592 00027 hllboxtype_i loc_3_obj | |
593 00028 box_i loc_3_obj, loc_7_int, loc_3_obj | |
594 00029 set loc_0_obj, loc_3_obj | |
595 00030 goto label_1(00007) | |
596 </code></pre> | |
597 | |
598 | |
599 | |
600 </div> | |
601 | |
602 <div class='slide'> | |
603 <!-- _S9SLIDE_ --> | |
604 <h2 id="nqpとバイトコードの対応">NQPとバイトコードの対応</h2> | |
605 | |
606 <pre><code>say(add_test(10000)); | |
607 </code></pre> | |
608 | |
609 <pre><code> annotation: add_test.nqp:1 | |
610 label_1: | |
611 00020 getlex_no loc_7_obj, '&say' | |
612 00021 decont loc_7_obj, loc_7_obj | |
613 00022 const_s loc_3_str, '&add_test' | |
614 00023 getlexstatic_o loc_8_obj, loc_3_str | |
615 00024 decont loc_8_obj, loc_8_obj | |
616 00025 const_i64_16 loc_5_int, 10000 | |
617 00026 prepargs Callsite_1 | |
618 00027 arg_i 0, loc_5_int | |
619 00028 invoke_o loc_8_obj, loc_8_obj | |
620 00029 prepargs Callsite_0 | |
621 00030 arg_o 0, loc_8_obj | |
622 00031 invoke_v loc_7_obj | |
623 00032 null loc_7_obj | |
624 00033 return_o loc_7_obj | |
625 </code></pre> | |
626 | |
627 <ul> | |
628 <li>Perl6の変数は直接実態を参照せず、中身が入っているコンテナを参照するようになっている。</li> | |
629 <li>その為 <code>decont</code> 命令で、コンテナの中身をレジスタに設定する必要がある</li> | |
630 <li><code>const_i64_16</code> などは64bitの数という意味で、 <code>int</code> 型としてレジスタに登録している</li> | |
631 <li><code>prepargs</code> で引数の確認を行い, <code>invoke_o</code> で実際にサブルーチンに移行する</li> | |
632 </ul> | |
633 | |
634 | |
635 | |
636 </div> | |
637 | |
638 <div class='slide'> | |
639 <!-- _S9SLIDE_ --> | |
640 <h2 id="nqpとバイトコードの対応-1">NQPとバイトコードの対応</h2> | |
641 | |
642 <pre><code>my $sum := 0; | |
643 </code></pre> | |
644 | |
645 <pre><code> annotation: add_test.nqp:1 | |
646 00003 const_i64_16 loc_2_int, 0 | |
647 00004 hllboxtype_i loc_3_obj | |
648 00005 box_i loc_3_obj, loc_2_int, loc_3_obj | |
649 00006 set loc_1_obj, loc_3_obj | |
650 </code></pre> | |
651 | |
652 <ul> | |
653 <li>まず <code>loc_2</code> レジスタをint型の整数0で初期化する</li> | |
654 <li>変数 <code>$sum</code> はint型の指定がないので、 obj型で登録しなければならない</li> | |
655 <li>その為, 整数として登録された <code>loc_2</code> から、 obj型に一旦キャストし、 <code>loc_3</code> レジスタに設定したものを、 <code>loc_1</code> レジスタに設定する</li> | |
656 </ul> | |
657 | |
658 | |
659 | |
660 </div> | |
661 | |
662 <div class='slide'> | |
663 <!-- _S9SLIDE_ --> | |
664 <h2 id="nqpとバイトコードの対応-2">NQPとバイトコードの対応</h2> | |
665 | |
666 <pre><code> while ( $n > 1) { | |
667 </code></pre> | |
668 | |
669 <pre><code> label_1: | |
670 00007 decont loc_3_obj, loc_0_obj | |
671 00008 smrt_numify loc_4_num, loc_3_obj | |
672 00009 const_i64_16 loc_2_int, 1 | |
673 00010 coerce_in loc_5_num, loc_2_int | |
674 00011 gt_n loc_2_int, loc_4_num, loc_5_num | |
675 00012 unless_i loc_2_int, label_2(00031) | |
676 00013 osrpoint | |
677 </code></pre> | |
678 | |
679 <ul> | |
680 <li>変数 <code>$n</code> と 整数 <code>1</code> を大小比較する為、 まず <code>$n</code> から値を取り出す</li> | |
681 <li>比較にもint型の指定がない為、 <code>num</code> 型にキャストし、 <code>num</code> 型のレジスタでの大小を比較する</li> | |
682 <li>比較命令は <code>gt_n</code> であり、 結果により <code>unless_i</code> 命令で、別のラベルにジャンプする</li> | |
683 </ul> | |
534 | 684 |
535 </div> | 685 </div> |
536 | 686 |
537 | 687 |
538 </div><!-- presentation --> | 688 </div><!-- presentation --> |