Mercurial > hg > Events > OSC2019
changeset 14:d3036d998236
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 19 Apr 2019 20:44:24 +0900 |
parents | 58cd4dd86896 |
children | a176ea5c0264 |
files | slide.html slide.md slide.pdf.html |
diffstat | 3 files changed, 151 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/slide.html Fri Apr 19 19:07:07 2019 +0900 +++ b/slide.html Fri Apr 19 20:44:24 2019 +0900 @@ -112,7 +112,13 @@ <li>Perl6の内部構造 <ul> <li>NQP</li> - <li>MoarVM</li> + <li>MoarVM + <ul> + <li>NQPとMoarVMのバイトコード対応</li> + <li>バイトコードインタプリタのC言語実装</li> + <li>MoarVMの詳細</li> + </ul> + </li> </ul> </li> <li>MoarVMのバイトコード実行</li> @@ -138,7 +144,7 @@ <li>動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する</li> </ul> -<p><img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;" /></p> +<p><img src="fig/2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;" /></p> @@ -489,12 +495,12 @@ <!-- _S9SLIDE_ --> <h2 id="nqpとmoarvm">NQPとMoarVM</h2> <ul> - <li>NQPそのものは実行することはできない</li> - <li>NQPの実行にはMoarVM/JVMが必要となる + <li>NQPは実行する際にMoarVM/JVMが必要となる <ul> <li>NQPコンパイラが各VMに対応したバイトコードに変換する</li> </ul> </li> + <li>MoarVMの場合は、MoarVMのバイナリ moar に、 NQPのインタプリタのバイトコードをライブラリや入力として与える</li> </ul> @@ -521,6 +527,7 @@ <!-- _S9SLIDE_ --> <h2 id="moarvm">MoarVM</h2> <ul> + <li>Metamodel On A Runtime</li> <li>C言語で記述されているPerl6専用の仮想機械</li> <li>レジスタマシン <ul> @@ -528,7 +535,7 @@ <li>Rubyなどはスタックマシンとして実装されている</li> </ul> </li> - <li>LuaJITなどを利用したJITコンパイルなども可能</li> + <li>Unicodeのサポートや、LuaJITなどを利用したJITコンパイルなども可能</li> <li>Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する</li> </ul> @@ -560,9 +567,15 @@ <h2 id="バイトコード-1">バイトコード</h2> <ul> <li>バイナリ形式で表現される為、 VMがどのように読み取るかでバイトコードの意味が異なる</li> + <li>スクリプト言語系のVMは、 VMという名前の通り、 計算機をエミュレートしている + <ul> + <li>その為、通常のCPUのストア命令などに相当する命令が実装されている</li> + <li>スクリプト言語は、その命令の実行を繰り返すことでプログラムを評価する</li> + </ul> + </li> <li>スクリプト言語で重要なバイトコード表現は、「仮想機械がどの命令を実行するか」のバイトコード <ul> - <li>CPUに対するアセンブラの命令に対応する</li> + <li>CPUに対するアセンブラの数値に対応する</li> </ul> </li> <li>どういった構成なのかは仮想機械によって異なる</li> @@ -695,11 +708,46 @@ </code></pre> <ul> - <li>変数 <code>$n</code> と 整数 <code>1</code> を大小比較する為、 まず <code>$n</code> から値を取り出す</li> <li>比較にもint型の指定がない為、 <code>num</code> 型にキャストし、 <code>num</code> 型のレジスタでの大小を比較する</li> <li>比較命令は <code>gt_n</code> であり、 結果により <code>unless_i</code> 命令で、別のラベルにジャンプする</li> </ul> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="decode命令">decode命令</h2> + +<pre><code> while ( $n > 1) { +</code></pre> + +<pre><code>00007 decont loc_3_obj, loc_0_obj +</code></pre> + +<p><img src="fig/decont_perl6_loc3.svg" alt="" /></p> + +<ul> + <li>変数 <code>$n</code> と 整数 <code>1</code> を大小比較する為、 まず <code>$n</code> から値を取り出す</li> + <li>とりだした時点では、何の型で使うかは決定していない為、 obj型として判定する</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="smrt_nomify">smrt_nomify</h2> + +<pre><code> while ( $n > 1) { +</code></pre> + +<pre><code>00008 smrt_numify loc_4_num, loc_3_obj +</code></pre> + + </div>
--- a/slide.md Fri Apr 19 19:07:07 2019 +0900 +++ b/slide.md Fri Apr 19 20:44:24 2019 +0900 @@ -15,6 +15,9 @@ - Perl6の内部構造 - NQP - MoarVM + - NQPとMoarVMのバイトコード対応 + - バイトコードインタプリタのC言語実装 + - MoarVMの詳細 - MoarVMのバイトコード実行 - まとめ @@ -26,7 +29,7 @@ - 言語的にはスクリプト言語であり, 漸進的型付き言語 - 動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する -<img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;"> +<img src="fig/2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;"> ## 現在のPerl6 @@ -234,9 +237,9 @@ ``` ## NQPとMoarVM -- NQPそのものは実行することはできない -- NQPの実行にはMoarVM/JVMが必要となる +- NQPは実行する際にMoarVM/JVMが必要となる - NQPコンパイラが各VMに対応したバイトコードに変換する +- MoarVMの場合は、MoarVMのバイナリ moar に、 NQPのインタプリタのバイトコードをライブラリや入力として与える ## Perl6のVM - MoarVM, JVM , JavaScriptが選択可能 @@ -244,11 +247,12 @@ - `rakudo-star` というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる ## MoarVM +- Metamodel On A Runtime - C言語で記述されているPerl6専用の仮想機械 - レジスタマシン - 型情報を持つレジスタに対しての演算として処理される - Rubyなどはスタックマシンとして実装されている -- LuaJITなどを利用したJITコンパイルなども可能 +- Unicodeのサポートや、LuaJITなどを利用したJITコンパイルなども可能 - Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する @@ -264,8 +268,11 @@ ## バイトコード - バイナリ形式で表現される為、 VMがどのように読み取るかでバイトコードの意味が異なる +- スクリプト言語系のVMは、 VMという名前の通り、 計算機をエミュレートしている + - その為、通常のCPUのストア命令などに相当する命令が実装されている + - スクリプト言語は、その命令の実行を繰り返すことでプログラムを評価する - スクリプト言語で重要なバイトコード表現は、「仮想機械がどの命令を実行するか」のバイトコード - - CPUに対するアセンブラの命令に対応する + - CPUに対するアセンブラの数値に対応する - どういった構成なのかは仮想機械によって異なる @@ -374,6 +381,34 @@ 00013 osrpoint ``` -- 変数 `$n` と 整数 `1` を大小比較する為、 まず `$n` から値を取り出す − 比較にもint型の指定がない為、 `num` 型にキャストし、 `num` 型のレジスタでの大小を比較する - 比較命令は `gt_n` であり、 結果により `unless_i` 命令で、別のラベルにジャンプする + +## decode命令 + +``` + while ( $n > 1) { +``` + +``` +00007 decont loc_3_obj, loc_0_obj +``` + + +![](fig/decont_perl6_loc3.svg) + +- 変数 `$n` と 整数 `1` を大小比較する為、 まず `$n` から値を取り出す +- とりだした時点では、何の型で使うかは決定していない為、 obj型として判定する + +## smrt_nomify + + +``` + while ( $n > 1) { +``` + +``` +00008 smrt_numify loc_4_num, loc_3_obj +``` + +
--- a/slide.pdf.html Fri Apr 19 19:07:07 2019 +0900 +++ b/slide.pdf.html Fri Apr 19 20:44:24 2019 +0900 @@ -96,7 +96,13 @@ <li>Perl6の内部構造 <ul> <li>NQP</li> - <li>MoarVM</li> + <li>MoarVM + <ul> + <li>NQPとMoarVMのバイトコード対応</li> + <li>バイトコードインタプリタのC言語実装</li> + <li>MoarVMの詳細</li> + </ul> + </li> </ul> </li> <li>MoarVMのバイトコード実行</li> @@ -122,7 +128,7 @@ <li>動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する</li> </ul> -<p><img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;" /></p> +<p><img src="fig/2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;" /></p> @@ -473,12 +479,12 @@ <!-- _S9SLIDE_ --> <h2 id="nqpとmoarvm">NQPとMoarVM</h2> <ul> - <li>NQPそのものは実行することはできない</li> - <li>NQPの実行にはMoarVM/JVMが必要となる + <li>NQPは実行する際にMoarVM/JVMが必要となる <ul> <li>NQPコンパイラが各VMに対応したバイトコードに変換する</li> </ul> </li> + <li>MoarVMの場合は、MoarVMのバイナリ moar に、 NQPのインタプリタのバイトコードをライブラリや入力として与える</li> </ul> @@ -505,6 +511,7 @@ <!-- _S9SLIDE_ --> <h2 id="moarvm">MoarVM</h2> <ul> + <li>Metamodel On A Runtime</li> <li>C言語で記述されているPerl6専用の仮想機械</li> <li>レジスタマシン <ul> @@ -512,7 +519,7 @@ <li>Rubyなどはスタックマシンとして実装されている</li> </ul> </li> - <li>LuaJITなどを利用したJITコンパイルなども可能</li> + <li>Unicodeのサポートや、LuaJITなどを利用したJITコンパイルなども可能</li> <li>Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する</li> </ul> @@ -544,9 +551,15 @@ <h2 id="バイトコード-1">バイトコード</h2> <ul> <li>バイナリ形式で表現される為、 VMがどのように読み取るかでバイトコードの意味が異なる</li> + <li>スクリプト言語系のVMは、 VMという名前の通り、 計算機をエミュレートしている + <ul> + <li>その為、通常のCPUのストア命令などに相当する命令が実装されている</li> + <li>スクリプト言語は、その命令の実行を繰り返すことでプログラムを評価する</li> + </ul> + </li> <li>スクリプト言語で重要なバイトコード表現は、「仮想機械がどの命令を実行するか」のバイトコード <ul> - <li>CPUに対するアセンブラの命令に対応する</li> + <li>CPUに対するアセンブラの数値に対応する</li> </ul> </li> <li>どういった構成なのかは仮想機械によって異なる</li> @@ -679,11 +692,46 @@ </code></pre> <ul> - <li>変数 <code>$n</code> と 整数 <code>1</code> を大小比較する為、 まず <code>$n</code> から値を取り出す</li> <li>比較にもint型の指定がない為、 <code>num</code> 型にキャストし、 <code>num</code> 型のレジスタでの大小を比較する</li> <li>比較命令は <code>gt_n</code> であり、 結果により <code>unless_i</code> 命令で、別のラベルにジャンプする</li> </ul> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="decode命令">decode命令</h2> + +<pre><code> while ( $n > 1) { +</code></pre> + +<pre><code>00007 decont loc_3_obj, loc_0_obj +</code></pre> + +<p><img src="fig/decont_perl6_loc3.svg" alt="" /></p> + +<ul> + <li>変数 <code>$n</code> と 整数 <code>1</code> を大小比較する為、 まず <code>$n</code> から値を取り出す</li> + <li>とりだした時点では、何の型で使うかは決定していない為、 obj型として判定する</li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="smrt_nomify">smrt_nomify</h2> + +<pre><code> while ( $n > 1) { +</code></pre> + +<pre><code>00008 smrt_numify loc_4_num, loc_3_obj +</code></pre> + + </div>