comparison presen/slide.html @ 94:19df48819b8d

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 19 Feb 2019 15:02:16 +0900
parents 9c5bf7231557
children 77fb6e9e3c08
comparison
equal deleted inserted replaced
93:9c5bf7231557 94:19df48819b8d
176 <ul> 176 <ul>
177 <li>バイトコードに変換するフロントエンド部分</li> 177 <li>バイトコードに変換するフロントエンド部分</li>
178 <li>バイトコードを解釈する仮想機械</li> 178 <li>バイトコードを解釈する仮想機械</li>
179 </ul> 179 </ul>
180 </li> 180 </li>
181 <li>バイトコードを出力する形式の言語にJavaがあり、 内部的に利用している言語にRubyやPerlなどがある</li>
182 <li>Perl6も一度バイトコードを生成し、 このバイトコードを専用のVMが評価している</li>
183 </ul> 181 </ul>
184 182
185 183
186 184
187 </div> 185 </div>
194 <li>Rakudoは次の構成になっている 192 <li>Rakudoは次の構成になっている
195 <ul> 193 <ul>
196 <li>実行環境のVM</li> 194 <li>実行環境のVM</li>
197 <li>Perl6のサブセットであるNQP(NotQuitPerl)</li> 195 <li>Perl6のサブセットであるNQP(NotQuitPerl)</li>
198 <li>NQPで記述されたPerl6(Rakudo)</li> 196 <li>NQPで記述されたPerl6(Rakudo)</li>
199 </ul>
200 </li>
201 <li>コンパイラも複数存在する
202 <ul>
203 <li>NQPで記述されたNQPコンパイラ</li>
204 <li>NQPで記述されたPerl6コンパイラ</li>
205 <li>MoarVMバイトコードを解釈するMoarVM</li>
206 </ul> 197 </ul>
207 </li> 198 </li>
208 </ul> 199 </ul>
209 200
210 201
480 471
481 </div> 472 </div>
482 473
483 <div class='slide'> 474 <div class='slide'>
484 <!-- _S9SLIDE_ --> 475 <!-- _S9SLIDE_ -->
485 <h2 id="nqp">NQP</h2>
486 <ul>
487 <li>Perl6の機能を制約したプログラミング言語であり, Perl6はNQPで記述されている
488 <ul>
489 <li>その為Perl6処理系は, NQPの動作を目的に実装することでPerl6の動作が可能となる</li>
490 <li>NQPコンパイラ自身もNQPで記述されている</li>
491 </ul>
492 </li>
493 <li>Perl6と違い, 変数の宣言を <code>:=</code> を利用した束縛で行う, <code>++</code> 演算子が使用できないなどの違いがある</li>
494 <li>nqpのオペコードを利用する際に,型を指定する事が可能である</li>
495 </ul>
496
497 <pre><code>sub add_test(int $n) {
498 my $sum := 0;
499 while nqp::isgt_i($n,1) {
500 $sum := nqp::add_i($sum,$n);
501 $n := nqp::sub_i($n,1);
502 }
503 return $sum;
504 }
505
506 say(add_test(10));
507 </code></pre>
508
509
510
511 </div>
512
513 <div class='slide'>
514 <!-- _S9SLIDE_ -->
515 <h2 id="nqpのバイトコード">NQPのバイトコード</h2>
516
517 <ul>
518 <li>NQPはMoarVMのバイトコードにコンパイルし, バイトコードをファイルに保存することが可能である</li>
519 <li>MoarVMのバイトコードは, アセンブリの様にダンプする事が可能である</li>
520 <li>実際に先程のコードをバイトコードにコンパイルし, 対応するバイトコードをダンプすると次の様に表示される</li>
521 </ul>
522
523 <pre><code> annotation: hoge.nqp:3
524 label_1:
525 00007 const_i64_16 loc_2_int, 1
526 00008 gt_i loc_2_int, loc_0_int, loc_2_int
527 00009 unless_i loc_2_int, label_2(00022)
528 00010 osrpoint
529 annotation: hoge.nqp:4
530 00011 decont loc_3_obj, loc_1_obj
531 00012 smrt_numify loc_4_num, loc_3_obj
532 00013 coerce_ni loc_5_int, loc_4_num
533 00014 add_i loc_5_int, loc_5_int, loc_0_int
534 00015 hllboxtype_i loc_3_obj
535 00016 box_i loc_3_obj, loc_5_int, loc_3_obj
536 00017 set loc_1_obj, loc_3_obj
537 annotation: hoge.nqp:5
538 00018 const_i64_16 loc_5_int, 1
539 00019 sub_i loc_5_int, loc_0_int, loc_5_int
540 00020 set loc_0_int, loc_5_int
541 00021 goto label_1(00007)
542 </code></pre>
543
544
545
546 </div>
547
548 <div class='slide'>
549 <!-- _S9SLIDE_ -->
550 <h2 id="nqpのバイトコードとcbc">NQPのバイトコードとCbC</h2>
551
552 <ul>
553 <li>NQPが生成したMoarVMバイトコードは確実に次に実行される命令がある箇所が複数存在する</li>
554 <li>静的にCのソースファイルに, NQPが生成したバイトコードと対応するCbCのCodeGearの実行を書くことで決定的に命令を実行可能でえある.</li>
555 </ul>
556
557
558
559 </div>
560
561 <div class='slide'>
562 <!-- _S9SLIDE_ -->
563 <h2 id="cbcmoarvmの利点">CbCMoarVMの利点</h2> 476 <h2 id="cbcmoarvmの利点">CbCMoarVMの利点</h2>
564 477
565 <ul> 478 <ul>
566 <li>バイトコードインタプリタの箇所をモジュール化する事が可能となり, CodeGearの再利用性や記述生が高まる</li> 479 <li>バイトコードインタプリタの箇所をモジュール化する事が可能となった
567 <li>デバッグ時にラベルではなくCodeGearにbreakpointを設定可能となり,デバッグが安易となる</li> 480 <ul>
481 <li>CodeGearの再利用性や記述生が高まる</li>
482 <li>CodeGearは関数の様に扱えるの為、 命令ディスパッチの最適化につながる実装が可能となった</li>
483 </ul>
484 </li>
485 <li>デバッグ時にラベルではなくCodeGearにbreakpointを設定可能となった
486 <ul>
487 <li>デバッグが安易となる</li>
488 </ul>
489 </li>
490 <li>CPUがキャッシュに収まる範囲の命令の場合、 通常のMoarVMよりも高速に動作する</li>
568 </ul> 491 </ul>
569 492
570 493
571 494
572 </div> 495 </div>