Mercurial > hg > Papers > 2019 > anatofuz-thesis
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> |