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 &gt; 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 &gt; 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 &gt; 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 &gt; 1) {
+</code></pre>
+
+<pre><code>00008      smrt_numify        loc_4_num, loc_3_obj
+</code></pre>
+
+
 </div>