diff slide.html @ 9:642787982a80

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 19 Apr 2019 18:24:04 +0900
parents d8feb607c44e
children 4b1eb4d69695
line wrap: on
line diff
--- a/slide.html	Fri Apr 19 15:52:38 2019 +0900
+++ b/slide.html	Fri Apr 19 18:24:04 2019 +0900
@@ -105,13 +105,37 @@
 
 <div class='slide'>
   <!-- _S9SLIDE_ -->
+<h2 id="内容">内容</h2>
+<ul>
+  <li>Perl6とは?</li>
+  <li>スクリプト言語処理系の動き</li>
+  <li>Perl6の内部構造
+    <ul>
+      <li>NQP</li>
+      <li>MoarVM</li>
+    </ul>
+  </li>
+  <li>MoarVMのバイトコード実行</li>
+  <li>まとめ</li>
+</ul>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
 <h2 id="perl6とは">Perl6とは</h2>
 <ul>
-  <li>当初Perl5の時期バージョンとして開発されていたプログラミング言語</li>
+  <li>当初Perl5の時期バージョンとして開発されていたプログラミング言語
+    <ul>
+      <li>現在は別の言語として開発がそれぞれ進んでいる</li>
+    </ul>
+  </li>
   <li>仕様と実装が分離しており, 現在はテストが仕様となっている</li>
-  <li>実装は複数存在しているが,現在主流な実装はRakudoとなっている</li>
-  <li>言語的にはスクリプト言語であり, 漸進的型付き言語となっている</li>
-  <li>MoarVM, JVMで動作する</li>
+  <li>実装は歴史上複数存在しているが,主流な実装はRakudo</li>
+  <li>言語的にはスクリプト言語であり, 漸進的型付き言語</li>
+  <li>動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する</li>
 </ul>
 
 <p><img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;" /></p>
@@ -122,10 +146,68 @@
 
 <div class='slide'>
   <!-- _S9SLIDE_ -->
+<h2 id="現在のperl6">現在のPerl6</h2>
+
+<ul>
+  <li>現在のバージョンは <code>6.d</code></li>
+  <li><a href="https://perl6.github.io/6pad/">ブラウザ上で実行可能な環境</a>が存在する</li>
+  <li><a href="https://commaide.com/">IDE</a>が開発されている</li>
+  <li>WebApplicationFrameworkなども開発されており、 Perl5のモジュールを移行したものがいくつか存在する</li>
+  <li>日本では趣味のプロダクト以外社会では使用されていない
+    <ul>
+      <li>海外では実際に使われているケースも存在する</li>
+    </ul>
+  </li>
+  <li>処理速度では一部Perl5に勝っているが、それでも大分遅い</li>
+</ul>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="参考perl5のソースコード">[参考]Perl5のソースコード</h2>
+
+<ul>
+  <li>Perl5時代
+    <ul>
+      <li>スカラ、配列、ハッシュの3種類</li>
+      <li>それぞれの変数への参照であるリファレンスが使用可能</li>
+    </ul>
+  </li>
+</ul>
+
+<pre><code class="language-perl">use ustrict;
+use warnings;
+
+my $scalar_value = "hello!";
+print "$scalar_value\n";
+
+my @array = (1..10);
+print "$array[0]\n";
+
+my %hash = ( this_is_key =&gt; "this_is_value");
+print "$hash{this_is_key}\n";
+
+my $hash_ref = \%hash;
+print "$hash_ref-&gt;{this_is_key}\n";
+</code></pre>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
 <h2 id="perl6のソースコード概要">Perl6のソースコード概要</h2>
 
 <ul>
-  <li>Perl5の文法とは比較的変更が多い</li>
+  <li>Perl5の文法とは比較的変更が多い
+    <ul>
+      <li>雰囲気は似ている</li>
+    </ul>
+  </li>
   <li>変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能</li>
 </ul>
 
@@ -194,6 +276,28 @@
 fizzbuzz($_).say for 1..15;
 </code></pre>
 
+<ul>
+  <li>型を利用したFizzBuzz</li>
+</ul>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="スクリプト言語">スクリプト言語</h2>
+<ul>
+  <li>Perl6は現状コンパイルすることはできない
+    <ul>
+      <li>スクリプト言語の分類</li>
+    </ul>
+  </li>
+  <li>現在広く使われているスクリプト言語(Perl,Python,Ruby…)などとPerl6の構成は類似している</li>
+  <li>今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する</li>
+</ul>
+
+
 
 </div>
 
@@ -218,10 +322,43 @@
 
 <div class='slide'>
   <!-- _S9SLIDE_ -->
+<h2 id="perl6以外のスクリプト言語">Perl6以外のスクリプト言語</h2>
+
+<ul>
+  <li>現在使われているプロセスVMは言語に組み込まれているものが多い</li>
+  <li>JVMやElixirなどのVMは複数の言語で使用されている</li>
+  <li>Java
+    <ul>
+      <li>JVM</li>
+    </ul>
+  </li>
+  <li>Ruby
+    <ul>
+      <li>YARV</li>
+    </ul>
+  </li>
+  <li>Python
+    <ul>
+      <li>PythonVM</li>
+    </ul>
+  </li>
+  <li>Elixir
+    <ul>
+      <li>BEAM</li>
+    </ul>
+  </li>
+</ul>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
 <h2 id="perl6の処理系の構成">Perl6の処理系の構成</h2>
 
 <ul>
-  <li>Perl6の処理系は現在はRakudoと呼ばれる(歴史上複数存在する)</li>
+  <li>Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する)</li>
   <li>Rakudoは3つのレイヤーから構成されている
     <ul>
       <li>Perl6インタプリタ</li>
@@ -229,8 +366,7 @@
       <li>Perl6のバイトコードを解釈するMoarVM</li>
     </ul>
   </li>
-  <li>このうちPerl6インタプリタとNQPはNQP自身で記述されている</li>
-  <li>MoarVMはC言語で記述されている</li>
+  <li>Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する</li>
 </ul>
 
 
@@ -239,12 +375,52 @@
 
 <div class='slide'>
   <!-- _S9SLIDE_ -->
+<h2 id="rakudoの構成図">Rakudoの構成図</h2>
+
+<p><img src="fig/Rakudo_System_overview.png" alt="" /></p>
+
+<p>(http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html)</p>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
 <h2 id="perl6とnqp">Perl6とNQP</h2>
 
 <ul>
-  <li>NQP(NotQuitPerl Perlっぽい別の言語)でRakudoを記述している</li>
+  <li>NQP(NotQuitPerl Perl)
+    <ul>
+      <li>Perl6のサブセット。Perl6っぽい言語</li>
+    </ul>
+  </li>
+  <li>Perl6、 NQP自体がNQPで記述されている</li>
   <li>NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う</li>
   <li>NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する</li>
+  <li>元々はPerl6の主力実装がParrotだった時代に登場
+    <ul>
+      <li>文法がアップデートされており、当時の資料は古くなっている</li>
+    </ul>
+  </li>
+</ul>
+
+<pre><code>my $value := "hello!";
+say($value);
+</code></pre>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="nqpスクリプト">NQPスクリプト</h2>
+
+<ul>
+  <li>変数は束縛 <code>:=</code> を使う</li>
+  <li>関数の間に空白を入れてはいけない</li>
+  <li>再帰呼び出しを使うフィボナッチ数列</li>
 </ul>
 
 <pre><code>#! nqp
@@ -254,12 +430,9 @@
 
 my $N := 29;
 
-my $t0 := nqp::time_n();
 my $z  := fib($N);
-my $t1 := nqp::time_n();
 
 nqp::say("fib($N) = " ~ fib($N));
-nqp::say("time    = " ~ ($t1-$t0));
 </code></pre>
 
 
@@ -268,37 +441,45 @@
 
 <div class='slide'>
   <!-- _S9SLIDE_ -->
-<h2 id="プログラミング言語とvm">プログラミング言語とVM</h2>
+<h2 id="nqpスクリプトnまでの整数の和">NQPスクリプト(nまでの整数の和)</h2>
+
+<pre><code class="language-perl6">sub add_test($n){
+    mu $sum := 0;
+    while ( $n &gt; 1) {
+        $sum := $sum + $n;
+        --$n;
+    }
+    return $sum;
+}
+
+say(add_test(10000));
+</code></pre>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="nqpとオペコード">NQPとオペコード</h2>
+
 <ul>
-  <li>最近のスクリプト言語は、 ソースコードを直接解釈せず、バイトコードに変換しVMが評価する
-    <ul>
-      <li>全体的な処理速度の向上の為</li>
-      <li>実装を分離することでの見通しの良さ</li>
-    </ul>
-  </li>
-  <li>言語処理系の実行にのみ動作するVM(プロセスVM)</li>
-  <li>他言語の環境
+  <li>NQPはPerl6の中で一番レイヤーが低い言語</li>
+  <li>その為、 実行するVMのオペコード(処理単位)を使用することができる</li>
+</ul>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="nqpとmoarvm">NQPとMoarVM</h2>
+<ul>
+  <li>NQPそのものは実行することはできない</li>
+  <li>NQPの実行にはMoarVM/JVMが必要となる
     <ul>
-      <li>Java
-        <ul>
-          <li>JVM</li>
-        </ul>
-      </li>
-      <li>Ruby
-        <ul>
-          <li>YARV</li>
-        </ul>
-      </li>
-      <li>Python
-        <ul>
-          <li>PythonVM</li>
-        </ul>
-      </li>
-      <li>Elixir
-        <ul>
-          <li>BEAM</li>
-        </ul>
-      </li>
+      <li>NQPコンパイラが各VMに対応したバイトコードに変換する</li>
     </ul>
   </li>
 </ul>
@@ -309,13 +490,29 @@
 
 <div class='slide'>
   <!-- _S9SLIDE_ -->
-<h2 id="perl6のvmの構成">Perl6のVMの構成</h2>
+<h2 id="perl6のvm">Perl6のVM</h2>
 <ul>
-  <li>MoarVMと呼ばれるVM</li>
-  <li>C言語で記述されている</li>
+  <li>MoarVM, JVM , JavaScriptが選択可能
+    <ul>
+      <li>メインで開発されているのはMoarVMであり、 他のVMは機能が実装されていないものが存在する</li>
+    </ul>
+  </li>
+  <li><code>rakudo-star</code> というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる</li>
+</ul>
+
+
+
+</div>
+
+<div class='slide'>
+  <!-- _S9SLIDE_ -->
+<h2 id="moarvm">MoarVM</h2>
+<ul>
+  <li>C言語で記述されているPerl6専用の仮想機械</li>
   <li>レジスタマシン
     <ul>
       <li>型情報を持つレジスタに対しての演算として処理される</li>
+      <li>Rubyなどはスタックマシンとして実装されている</li>
     </ul>
   </li>
   <li>LuaJITなどを利用したJITコンパイルなども可能</li>