Mercurial > hg > Papers > 2019 > anatofuz-thesis
changeset 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 |
files | presen/slide.html presen/slide.md presen/slide.pdf.html |
diffstat | 3 files changed, 30 insertions(+), 241 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/slide.html Tue Feb 19 14:49:04 2019 +0900 +++ b/presen/slide.html Tue Feb 19 15:02:16 2019 +0900 @@ -178,8 +178,6 @@ <li>バイトコードを解釈する仮想機械</li> </ul> </li> - <li>バイトコードを出力する形式の言語にJavaがあり、 内部的に利用している言語にRubyやPerlなどがある</li> - <li>Perl6も一度バイトコードを生成し、 このバイトコードを専用のVMが評価している</li> </ul> @@ -198,13 +196,6 @@ <li>NQPで記述されたPerl6(Rakudo)</li> </ul> </li> - <li>コンパイラも複数存在する - <ul> - <li>NQPで記述されたNQPコンパイラ</li> - <li>NQPで記述されたPerl6コンパイラ</li> - <li>MoarVMバイトコードを解釈するMoarVM</li> - </ul> - </li> </ul> @@ -482,89 +473,21 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="nqp">NQP</h2> -<ul> - <li>Perl6の機能を制約したプログラミング言語であり, Perl6はNQPで記述されている - <ul> - <li>その為Perl6処理系は, NQPの動作を目的に実装することでPerl6の動作が可能となる</li> - <li>NQPコンパイラ自身もNQPで記述されている</li> - </ul> - </li> - <li>Perl6と違い, 変数の宣言を <code>:=</code> を利用した束縛で行う, <code>++</code> 演算子が使用できないなどの違いがある</li> - <li>nqpのオペコードを利用する際に,型を指定する事が可能である</li> -</ul> - -<pre><code>sub add_test(int $n) { - my $sum := 0; - while nqp::isgt_i($n,1) { - $sum := nqp::add_i($sum,$n); - $n := nqp::sub_i($n,1); - } - return $sum; -} - -say(add_test(10)); -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="nqpのバイトコード">NQPのバイトコード</h2> - -<ul> - <li>NQPはMoarVMのバイトコードにコンパイルし, バイトコードをファイルに保存することが可能である</li> - <li>MoarVMのバイトコードは, アセンブリの様にダンプする事が可能である</li> - <li>実際に先程のコードをバイトコードにコンパイルし, 対応するバイトコードをダンプすると次の様に表示される</li> -</ul> - -<pre><code> annotation: hoge.nqp:3 - label_1: -00007 const_i64_16 loc_2_int, 1 -00008 gt_i loc_2_int, loc_0_int, loc_2_int -00009 unless_i loc_2_int, label_2(00022) -00010 osrpoint - annotation: hoge.nqp:4 -00011 decont loc_3_obj, loc_1_obj -00012 smrt_numify loc_4_num, loc_3_obj -00013 coerce_ni loc_5_int, loc_4_num -00014 add_i loc_5_int, loc_5_int, loc_0_int -00015 hllboxtype_i loc_3_obj -00016 box_i loc_3_obj, loc_5_int, loc_3_obj -00017 set loc_1_obj, loc_3_obj - annotation: hoge.nqp:5 -00018 const_i64_16 loc_5_int, 1 -00019 sub_i loc_5_int, loc_0_int, loc_5_int -00020 set loc_0_int, loc_5_int -00021 goto label_1(00007) -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="nqpのバイトコードとcbc">NQPのバイトコードとCbC</h2> - -<ul> - <li>NQPが生成したMoarVMバイトコードは確実に次に実行される命令がある箇所が複数存在する</li> - <li>静的にCのソースファイルに, NQPが生成したバイトコードと対応するCbCのCodeGearの実行を書くことで決定的に命令を実行可能でえある.</li> -</ul> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> <h2 id="cbcmoarvmの利点">CbCMoarVMの利点</h2> <ul> - <li>バイトコードインタプリタの箇所をモジュール化する事が可能となり, CodeGearの再利用性や記述生が高まる</li> - <li>デバッグ時にラベルではなくCodeGearにbreakpointを設定可能となり,デバッグが安易となる</li> + <li>バイトコードインタプリタの箇所をモジュール化する事が可能となった + <ul> + <li>CodeGearの再利用性や記述生が高まる</li> + <li>CodeGearは関数の様に扱えるの為、 命令ディスパッチの最適化につながる実装が可能となった</li> + </ul> + </li> + <li>デバッグ時にラベルではなくCodeGearにbreakpointを設定可能となった + <ul> + <li>デバッグが安易となる</li> + </ul> + </li> + <li>CPUがキャッシュに収まる範囲の命令の場合、 通常のMoarVMよりも高速に動作する</li> </ul>
--- a/presen/slide.md Tue Feb 19 14:49:04 2019 +0900 +++ b/presen/slide.md Tue Feb 19 15:02:16 2019 +0900 @@ -55,8 +55,6 @@ - その為スクリプト言語の実装は大きく2つで構成されている - バイトコードに変換するフロントエンド部分 - バイトコードを解釈する仮想機械 -- バイトコードを出力する形式の言語にJavaがあり、 内部的に利用している言語にRubyやPerlなどがある -- Perl6も一度バイトコードを生成し、 このバイトコードを専用のVMが評価している ## Rakudo - Rakudoとは現在のPerl6の主力な実装である. @@ -64,11 +62,6 @@ - 実行環境のVM - Perl6のサブセットであるNQP(NotQuitPerl) - NQPで記述されたPerl6(Rakudo) -- コンパイラも複数存在する - - NQPで記述されたNQPコンパイラ - - NQPで記述されたPerl6コンパイラ - - MoarVMバイトコードを解釈するMoarVM - ## MoarVM @@ -257,64 +250,14 @@ ``` -## NQP -- Perl6の機能を制約したプログラミング言語であり, Perl6はNQPで記述されている - - その為Perl6処理系は, NQPの動作を目的に実装することでPerl6の動作が可能となる - - NQPコンパイラ自身もNQPで記述されている -- Perl6と違い, 変数の宣言を `:=` を利用した束縛で行う, `++` 演算子が使用できないなどの違いがある -- nqpのオペコードを利用する際に,型を指定する事が可能である - -``` -sub add_test(int $n) { - my $sum := 0; - while nqp::isgt_i($n,1) { - $sum := nqp::add_i($sum,$n); - $n := nqp::sub_i($n,1); - } - return $sum; -} - -say(add_test(10)); -``` - -## NQPのバイトコード - -- NQPはMoarVMのバイトコードにコンパイルし, バイトコードをファイルに保存することが可能である -- MoarVMのバイトコードは, アセンブリの様にダンプする事が可能である -- 実際に先程のコードをバイトコードにコンパイルし, 対応するバイトコードをダンプすると次の様に表示される - - -``` - annotation: hoge.nqp:3 - label_1: -00007 const_i64_16 loc_2_int, 1 -00008 gt_i loc_2_int, loc_0_int, loc_2_int -00009 unless_i loc_2_int, label_2(00022) -00010 osrpoint - annotation: hoge.nqp:4 -00011 decont loc_3_obj, loc_1_obj -00012 smrt_numify loc_4_num, loc_3_obj -00013 coerce_ni loc_5_int, loc_4_num -00014 add_i loc_5_int, loc_5_int, loc_0_int -00015 hllboxtype_i loc_3_obj -00016 box_i loc_3_obj, loc_5_int, loc_3_obj -00017 set loc_1_obj, loc_3_obj - annotation: hoge.nqp:5 -00018 const_i64_16 loc_5_int, 1 -00019 sub_i loc_5_int, loc_0_int, loc_5_int -00020 set loc_0_int, loc_5_int -00021 goto label_1(00007) -``` - -## NQPのバイトコードとCbC - -- NQPが生成したMoarVMバイトコードは確実に次に実行される命令がある箇所が複数存在する -- 静的にCのソースファイルに, NQPが生成したバイトコードと対応するCbCのCodeGearの実行を書くことで決定的に命令を実行可能でえある. - ## CbCMoarVMの利点 -- バイトコードインタプリタの箇所をモジュール化する事が可能となり, CodeGearの再利用性や記述生が高まる -- デバッグ時にラベルではなくCodeGearにbreakpointを設定可能となり,デバッグが安易となる +- バイトコードインタプリタの箇所をモジュール化する事が可能となった + - CodeGearの再利用性や記述生が高まる + - CodeGearは関数の様に扱える為、 命令ディスパッチの最適化につながる実装が可能となった +- デバッグ時にラベルではなくCodeGearにbreakpointを設定可能となった + - デバッグが安易となる +- CPUがキャッシュに収まる範囲の命令の場合、 通常のMoarVMよりも高速に動作する ## CbCMoarVMの欠点
--- a/presen/slide.pdf.html Tue Feb 19 14:49:04 2019 +0900 +++ b/presen/slide.pdf.html Tue Feb 19 15:02:16 2019 +0900 @@ -162,8 +162,6 @@ <li>バイトコードを解釈する仮想機械</li> </ul> </li> - <li>バイトコードを出力する形式の言語にJavaがあり、 内部的に利用している言語にRubyやPerlなどがある</li> - <li>Perl6も一度バイトコードを生成し、 このバイトコードを専用のVMが評価している</li> </ul> @@ -182,13 +180,6 @@ <li>NQPで記述されたPerl6(Rakudo)</li> </ul> </li> - <li>コンパイラも複数存在する - <ul> - <li>NQPで記述されたNQPコンパイラ</li> - <li>NQPで記述されたPerl6コンパイラ</li> - <li>MoarVMバイトコードを解釈するMoarVM</li> - </ul> - </li> </ul> @@ -466,89 +457,21 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="nqp">NQP</h2> -<ul> - <li>Perl6の機能を制約したプログラミング言語であり, Perl6はNQPで記述されている - <ul> - <li>その為Perl6処理系は, NQPの動作を目的に実装することでPerl6の動作が可能となる</li> - <li>NQPコンパイラ自身もNQPで記述されている</li> - </ul> - </li> - <li>Perl6と違い, 変数の宣言を <code>:=</code> を利用した束縛で行う, <code>++</code> 演算子が使用できないなどの違いがある</li> - <li>nqpのオペコードを利用する際に,型を指定する事が可能である</li> -</ul> - -<pre><code>sub add_test(int $n) { - my $sum := 0; - while nqp::isgt_i($n,1) { - $sum := nqp::add_i($sum,$n); - $n := nqp::sub_i($n,1); - } - return $sum; -} - -say(add_test(10)); -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="nqpのバイトコード">NQPのバイトコード</h2> - -<ul> - <li>NQPはMoarVMのバイトコードにコンパイルし, バイトコードをファイルに保存することが可能である</li> - <li>MoarVMのバイトコードは, アセンブリの様にダンプする事が可能である</li> - <li>実際に先程のコードをバイトコードにコンパイルし, 対応するバイトコードをダンプすると次の様に表示される</li> -</ul> - -<pre><code> annotation: hoge.nqp:3 - label_1: -00007 const_i64_16 loc_2_int, 1 -00008 gt_i loc_2_int, loc_0_int, loc_2_int -00009 unless_i loc_2_int, label_2(00022) -00010 osrpoint - annotation: hoge.nqp:4 -00011 decont loc_3_obj, loc_1_obj -00012 smrt_numify loc_4_num, loc_3_obj -00013 coerce_ni loc_5_int, loc_4_num -00014 add_i loc_5_int, loc_5_int, loc_0_int -00015 hllboxtype_i loc_3_obj -00016 box_i loc_3_obj, loc_5_int, loc_3_obj -00017 set loc_1_obj, loc_3_obj - annotation: hoge.nqp:5 -00018 const_i64_16 loc_5_int, 1 -00019 sub_i loc_5_int, loc_0_int, loc_5_int -00020 set loc_0_int, loc_5_int -00021 goto label_1(00007) -</code></pre> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="nqpのバイトコードとcbc">NQPのバイトコードとCbC</h2> - -<ul> - <li>NQPが生成したMoarVMバイトコードは確実に次に実行される命令がある箇所が複数存在する</li> - <li>静的にCのソースファイルに, NQPが生成したバイトコードと対応するCbCのCodeGearの実行を書くことで決定的に命令を実行可能でえある.</li> -</ul> - - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> <h2 id="cbcmoarvmの利点">CbCMoarVMの利点</h2> <ul> - <li>バイトコードインタプリタの箇所をモジュール化する事が可能となり, CodeGearの再利用性や記述生が高まる</li> - <li>デバッグ時にラベルではなくCodeGearにbreakpointを設定可能となり,デバッグが安易となる</li> + <li>バイトコードインタプリタの箇所をモジュール化する事が可能となった + <ul> + <li>CodeGearの再利用性や記述生が高まる</li> + <li>CodeGearは関数の様に扱えるの為、 命令ディスパッチの最適化につながる実装が可能となった</li> + </ul> + </li> + <li>デバッグ時にラベルではなくCodeGearにbreakpointを設定可能となった + <ul> + <li>デバッグが安易となる</li> + </ul> + </li> + <li>CPUがキャッシュに収まる範囲の命令の場合、 通常のMoarVMよりも高速に動作する</li> </ul>