# HG changeset patch # User anatofuz # Date 1555665844 -32400 # Node ID 642787982a808a77b05eacf00abdc82f8adae212 # Parent d8feb607c44e534a23f96393d807a282ddb6a160 update diff -r d8feb607c44e -r 642787982a80 slide.html --- 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 @@
+

内容

+ + + + +
+ +
+

Perl6とは

@@ -122,10 +146,68 @@
+

現在のPerl6

+ +
    +
  • 現在のバージョンは 6.d
  • +
  • ブラウザ上で実行可能な環境が存在する
  • +
  • IDEが開発されている
  • +
  • WebApplicationFrameworkなども開発されており、 Perl5のモジュールを移行したものがいくつか存在する
  • +
  • 日本では趣味のプロダクト以外社会では使用されていない +
      +
    • 海外では実際に使われているケースも存在する
    • +
    +
  • +
  • 処理速度では一部Perl5に勝っているが、それでも大分遅い
  • +
+ + + +
+ +
+ +

[参考]Perl5のソースコード

+ +
    +
  • Perl5時代 +
      +
    • スカラ、配列、ハッシュの3種類
    • +
    • それぞれの変数への参照であるリファレンスが使用可能
    • +
    +
  • +
+ +
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 => "this_is_value");
+print "$hash{this_is_key}\n";
+
+my $hash_ref = \%hash;
+print "$hash_ref->{this_is_key}\n";
+
+ + + +
+ +
+

Perl6のソースコード概要

    -
  • Perl5の文法とは比較的変更が多い
  • +
  • Perl5の文法とは比較的変更が多い +
      +
    • 雰囲気は似ている
    • +
    +
  • 変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能
@@ -194,6 +276,28 @@ fizzbuzz($_).say for 1..15; +
    +
  • 型を利用したFizzBuzz
  • +
+ + + +
+ +
+ +

スクリプト言語

+
    +
  • Perl6は現状コンパイルすることはできない +
      +
    • スクリプト言語の分類
    • +
    +
  • +
  • 現在広く使われているスクリプト言語(Perl,Python,Ruby…)などとPerl6の構成は類似している
  • +
  • 今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する
  • +
+ +
@@ -218,10 +322,43 @@
+

Perl6以外のスクリプト言語

+ +
    +
  • 現在使われているプロセスVMは言語に組み込まれているものが多い
  • +
  • JVMやElixirなどのVMは複数の言語で使用されている
  • +
  • Java +
      +
    • JVM
    • +
    +
  • +
  • Ruby +
      +
    • YARV
    • +
    +
  • +
  • Python +
      +
    • PythonVM
    • +
    +
  • +
  • Elixir +
      +
    • BEAM
    • +
    +
  • +
+ + + +
+ +
+

Perl6の処理系の構成

    -
  • Perl6の処理系は現在はRakudoと呼ばれる(歴史上複数存在する)
  • +
  • Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する)
  • Rakudoは3つのレイヤーから構成されている
    • Perl6インタプリタ
    • @@ -229,8 +366,7 @@
    • Perl6のバイトコードを解釈するMoarVM
  • -
  • このうちPerl6インタプリタとNQPはNQP自身で記述されている
  • -
  • MoarVMはC言語で記述されている
  • +
  • Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する
@@ -239,12 +375,52 @@
+

Rakudoの構成図

+ +

+ +

(http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html)

+ + + +
+ +
+

Perl6とNQP

    -
  • NQP(NotQuitPerl Perlっぽい別の言語)でRakudoを記述している
  • +
  • NQP(NotQuitPerl Perl) +
      +
    • Perl6のサブセット。Perl6っぽい言語
    • +
    +
  • +
  • Perl6、 NQP自体がNQPで記述されている
  • NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う
  • NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する
  • +
  • 元々はPerl6の主力実装がParrotだった時代に登場 +
      +
    • 文法がアップデートされており、当時の資料は古くなっている
    • +
    +
  • +
+ +
my $value := "hello!";
+say($value);
+
+ + + +
+ +
+ +

NQPスクリプト

+ +
    +
  • 変数は束縛 := を使う
  • +
  • 関数の間に空白を入れてはいけない
  • +
  • 再帰呼び出しを使うフィボナッチ数列
#! 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));
 
@@ -268,37 +441,45 @@
-

プログラミング言語とVM

+

NQPスクリプト(nまでの整数の和)

+ +
sub add_test($n){
+    mu $sum := 0;
+    while ( $n > 1) {
+        $sum := $sum + $n;
+        --$n;
+    }
+    return $sum;
+}
+
+say(add_test(10000));
+
+ + + +
+ +
+ +

NQPとオペコード

+
    -
  • 最近のスクリプト言語は、 ソースコードを直接解釈せず、バイトコードに変換しVMが評価する -
      -
    • 全体的な処理速度の向上の為
    • -
    • 実装を分離することでの見通しの良さ
    • -
    -
  • -
  • 言語処理系の実行にのみ動作するVM(プロセスVM)
  • -
  • 他言語の環境 +
  • NQPはPerl6の中で一番レイヤーが低い言語
  • +
  • その為、 実行するVMのオペコード(処理単位)を使用することができる
  • +
+ + + +
+ +
+ +

NQPとMoarVM

+
    +
  • NQPそのものは実行することはできない
  • +
  • NQPの実行にはMoarVM/JVMが必要となる
      -
    • Java -
        -
      • JVM
      • -
      -
    • -
    • Ruby -
        -
      • YARV
      • -
      -
    • -
    • Python -
        -
      • PythonVM
      • -
      -
    • -
    • Elixir -
        -
      • BEAM
      • -
      -
    • +
    • NQPコンパイラが各VMに対応したバイトコードに変換する
@@ -309,13 +490,29 @@
-

Perl6のVMの構成

+

Perl6のVM

    -
  • MoarVMと呼ばれるVM
  • -
  • C言語で記述されている
  • +
  • MoarVM, JVM , JavaScriptが選択可能 +
      +
    • メインで開発されているのはMoarVMであり、 他のVMは機能が実装されていないものが存在する
    • +
    +
  • +
  • rakudo-star というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる
  • +
+ + + +
+ +
+ +

MoarVM

+
    +
  • C言語で記述されているPerl6専用の仮想機械
  • レジスタマシン
    • 型情報を持つレジスタに対しての演算として処理される
    • +
    • Rubyなどはスタックマシンとして実装されている
  • LuaJITなどを利用したJITコンパイルなども可能
  • diff -r d8feb607c44e -r 642787982a80 slide.md --- a/slide.md Fri Apr 19 15:52:38 2019 +0900 +++ b/slide.md Fri Apr 19 18:24:04 2019 +0900 @@ -9,18 +9,62 @@ - Rakudoの内部で利用されているVMや, Perl6のサブセットなどについて探索します - スクリプト言語で主に使われているバイトコードインタプリタの気持ちになります +## 内容 +- Perl6とは? +- スクリプト言語処理系の動き +- Perl6の内部構造 + - NQP + - MoarVM +- MoarVMのバイトコード実行 +- まとめ + ## Perl6とは - 当初Perl5の時期バージョンとして開発されていたプログラミング言語 + - 現在は別の言語として開発がそれぞれ進んでいる - 仕様と実装が分離しており, 現在はテストが仕様となっている -- 実装は複数存在しているが,現在主流な実装はRakudoとなっている -- 言語的にはスクリプト言語であり, 漸進的型付き言語となっている -- MoarVM, JVMで動作する +- 実装は歴史上複数存在しているが,主流な実装はRakudo +- 言語的にはスクリプト言語であり, 漸進的型付き言語 +- 動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する +## 現在のPerl6 + +- 現在のバージョンは `6.d` +- [ブラウザ上で実行可能な環境](https://perl6.github.io/6pad/)が存在する +- [IDE](https://commaide.com/)が開発されている +- WebApplicationFrameworkなども開発されており、 Perl5のモジュールを移行したものがいくつか存在する +- 日本では趣味のプロダクト以外社会では使用されていない + - 海外では実際に使われているケースも存在する +- 処理速度では一部Perl5に勝っているが、それでも大分遅い + +## [参考]Perl5のソースコード + +- Perl5時代 + − スカラ、配列、ハッシュの3種類 + - それぞれの変数への参照であるリファレンスが使用可能 + +```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 => "this_is_value"); +print "$hash{this_is_key}\n"; + +my $hash_ref = \%hash; +print "$hash_ref->{this_is_key}\n"; +``` + ## Perl6のソースコード概要 - Perl5の文法とは比較的変更が多い + - 雰囲気は似ている - 変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能 ``` @@ -74,6 +118,16 @@ fizzbuzz($_).say for 1..15; ``` + +- 型を利用したFizzBuzz + +## スクリプト言語 +- Perl6は現状コンパイルすることはできない + - スクリプト言語の分類 + +- 現在広く使われているスクリプト言語(Perl,Python,Ruby...)などとPerl6の構成は類似している +- 今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する + ## スクリプト言語処理系 - スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている - その為スクリプト言語の実装は大きく2つで構成されている @@ -82,24 +136,55 @@ + +## Perl6以外のスクリプト言語 + +- 現在使われているプロセスVMは言語に組み込まれているものが多い +- JVMやElixirなどのVMは複数の言語で使用されている +- Java + - JVM +- Ruby + - YARV +- Python + - PythonVM +- Elixir + - BEAM + ## Perl6の処理系の構成 -- Perl6の処理系は現在はRakudoと呼ばれる(歴史上複数存在する) +- Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する) - Rakudoは3つのレイヤーから構成されている - Perl6インタプリタ - Perl6インタプリタを記述するPerl6のサブセットNQP - Perl6のバイトコードを解釈するMoarVM -- このうちPerl6インタプリタとNQPはNQP自身で記述されている -- MoarVMはC言語で記述されている +- Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する + +## Rakudoの構成図 +![](fig/Rakudo_System_overview.png) - +(http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html) ## Perl6とNQP -- NQP(NotQuitPerl Perlっぽい別の言語)でRakudoを記述している +- NQP(NotQuitPerl Perl) + - Perl6のサブセット。Perl6っぽい言語 +- Perl6、 NQP自体がNQPで記述されている - NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う - NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する +- 元々はPerl6の主力実装がParrotだった時代に登場 + - 文法がアップデートされており、当時の資料は古くなっている + +``` +my $value := "hello!"; +say($value); +``` + +## NQPスクリプト + +- 変数は束縛 `:=` を使う +− 関数の間に空白を入れてはいけない +- 再帰呼び出しを使うフィボナッチ数列 ``` #! nqp @@ -109,34 +194,47 @@ 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)); +``` + +## NQPスクリプト(nまでの整数の和) + +```perl6 +sub add_test($n){ + mu $sum := 0; + while ( $n > 1) { + $sum := $sum + $n; + --$n; + } + return $sum; +} + +say(add_test(10000)); ``` -## プログラミング言語とVM -- 最近のスクリプト言語は、 ソースコードを直接解釈せず、バイトコードに変換しVMが評価する - - 全体的な処理速度の向上の為 - - 実装を分離することでの見通しの良さ -- 言語処理系の実行にのみ動作するVM(プロセスVM) -- 他言語の環境 - - Java - - JVM - - Ruby - - YARV - - Python - - PythonVM - - Elixir - - BEAM +## NQPとオペコード + +- NQPはPerl6の中で一番レイヤーが低い言語 +- その為、 実行するVMのオペコード(処理単位)を使用することができる + -## Perl6のVMの構成 -- MoarVMと呼ばれるVM -- C言語で記述されている +## NQPとMoarVM +- NQPそのものは実行することはできない +- NQPの実行にはMoarVM/JVMが必要となる + - NQPコンパイラが各VMに対応したバイトコードに変換する + +## Perl6のVM +- MoarVM, JVM , JavaScriptが選択可能 + - メインで開発されているのはMoarVMであり、 他のVMは機能が実装されていないものが存在する +- `rakudo-star` というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる + +## MoarVM +- C言語で記述されているPerl6専用の仮想機械 - レジスタマシン - 型情報を持つレジスタに対しての演算として処理される + - Rubyなどはスタックマシンとして実装されている - LuaJITなどを利用したJITコンパイルなども可能 - Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する diff -r d8feb607c44e -r 642787982a80 slide.pdf.html --- a/slide.pdf.html Fri Apr 19 15:52:38 2019 +0900 +++ b/slide.pdf.html Fri Apr 19 18:24:04 2019 +0900 @@ -89,13 +89,37 @@
    +

    内容

    +
      +
    • Perl6とは?
    • +
    • スクリプト言語処理系の動き
    • +
    • Perl6の内部構造 +
        +
      • NQP
      • +
      • MoarVM
      • +
      +
    • +
    • MoarVMのバイトコード実行
    • +
    • まとめ
    • +
    + + + +
    + +
    +

    Perl6とは

      -
    • 当初Perl5の時期バージョンとして開発されていたプログラミング言語
    • +
    • 当初Perl5の時期バージョンとして開発されていたプログラミング言語 +
        +
      • 現在は別の言語として開発がそれぞれ進んでいる
      • +
      +
    • 仕様と実装が分離しており, 現在はテストが仕様となっている
    • -
    • 実装は複数存在しているが,現在主流な実装はRakudoとなっている
    • -
    • 言語的にはスクリプト言語であり, 漸進的型付き言語となっている
    • -
    • MoarVM, JVMで動作する
    • +
    • 実装は歴史上複数存在しているが,主流な実装はRakudo
    • +
    • 言語的にはスクリプト言語であり, 漸進的型付き言語
    • +
    • 動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する

    @@ -106,10 +130,68 @@
    +

    現在のPerl6

    + +
      +
    • 現在のバージョンは 6.d
    • +
    • ブラウザ上で実行可能な環境が存在する
    • +
    • IDEが開発されている
    • +
    • WebApplicationFrameworkなども開発されており、 Perl5のモジュールを移行したものがいくつか存在する
    • +
    • 日本では趣味のプロダクト以外社会では使用されていない +
        +
      • 海外では実際に使われているケースも存在する
      • +
      +
    • +
    • 処理速度では一部Perl5に勝っているが、それでも大分遅い
    • +
    + + + +
    + +
    + +

    [参考]Perl5のソースコード

    + +
      +
    • Perl5時代 +
        +
      • スカラ、配列、ハッシュの3種類
      • +
      • それぞれの変数への参照であるリファレンスが使用可能
      • +
      +
    • +
    + +
    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 => "this_is_value");
    +print "$hash{this_is_key}\n";
    +
    +my $hash_ref = \%hash;
    +print "$hash_ref->{this_is_key}\n";
    +
    + + + +
    + +
    +

    Perl6のソースコード概要

      -
    • Perl5の文法とは比較的変更が多い
    • +
    • Perl5の文法とは比較的変更が多い +
        +
      • 雰囲気は似ている
      • +
      +
    • 変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能
    @@ -178,6 +260,28 @@ fizzbuzz($_).say for 1..15; +
      +
    • 型を利用したFizzBuzz
    • +
    + + + +
    + +
    + +

    スクリプト言語

    +
      +
    • Perl6は現状コンパイルすることはできない +
        +
      • スクリプト言語の分類
      • +
      +
    • +
    • 現在広く使われているスクリプト言語(Perl,Python,Ruby…)などとPerl6の構成は類似している
    • +
    • 今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する
    • +
    + +
    @@ -202,10 +306,43 @@
    +

    Perl6以外のスクリプト言語

    + +
      +
    • 現在使われているプロセスVMは言語に組み込まれているものが多い
    • +
    • JVMやElixirなどのVMは複数の言語で使用されている
    • +
    • Java +
        +
      • JVM
      • +
      +
    • +
    • Ruby +
        +
      • YARV
      • +
      +
    • +
    • Python +
        +
      • PythonVM
      • +
      +
    • +
    • Elixir +
        +
      • BEAM
      • +
      +
    • +
    + + + +
    + +
    +

    Perl6の処理系の構成

      -
    • Perl6の処理系は現在はRakudoと呼ばれる(歴史上複数存在する)
    • +
    • Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する)
    • Rakudoは3つのレイヤーから構成されている
      • Perl6インタプリタ
      • @@ -213,8 +350,7 @@
      • Perl6のバイトコードを解釈するMoarVM
    • -
    • このうちPerl6インタプリタとNQPはNQP自身で記述されている
    • -
    • MoarVMはC言語で記述されている
    • +
    • Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する
    @@ -223,12 +359,52 @@
    +

    Rakudoの構成図

    + +

    + +

    (http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html)

    + + + +
    + +
    +

    Perl6とNQP

      -
    • NQP(NotQuitPerl Perlっぽい別の言語)でRakudoを記述している
    • +
    • NQP(NotQuitPerl Perl) +
        +
      • Perl6のサブセット。Perl6っぽい言語
      • +
      +
    • +
    • Perl6、 NQP自体がNQPで記述されている
    • NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う
    • NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する
    • +
    • 元々はPerl6の主力実装がParrotだった時代に登場 +
        +
      • 文法がアップデートされており、当時の資料は古くなっている
      • +
      +
    • +
    + +
    my $value := "hello!";
    +say($value);
    +
    + + + +
    + +
    + +

    NQPスクリプト

    + +
      +
    • 変数は束縛 := を使う
    • +
    • 関数の間に空白を入れてはいけない
    • +
    • 再帰呼び出しを使うフィボナッチ数列
    #! nqp
    @@ -238,12 +414,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));
     
    @@ -252,37 +425,45 @@
    -

    プログラミング言語とVM

    +

    NQPスクリプト(nまでの整数の和)

    + +
    sub add_test($n){
    +    mu $sum := 0;
    +    while ( $n > 1) {
    +        $sum := $sum + $n;
    +        --$n;
    +    }
    +    return $sum;
    +}
    +
    +say(add_test(10000));
    +
    + + + +
    + +
    + +

    NQPとオペコード

    +
      -
    • 最近のスクリプト言語は、 ソースコードを直接解釈せず、バイトコードに変換しVMが評価する -
        -
      • 全体的な処理速度の向上の為
      • -
      • 実装を分離することでの見通しの良さ
      • -
      -
    • -
    • 言語処理系の実行にのみ動作するVM(プロセスVM)
    • -
    • 他言語の環境 +
    • NQPはPerl6の中で一番レイヤーが低い言語
    • +
    • その為、 実行するVMのオペコード(処理単位)を使用することができる
    • +
    + + + +
    + +
    + +

    NQPとMoarVM

    +
      +
    • NQPそのものは実行することはできない
    • +
    • NQPの実行にはMoarVM/JVMが必要となる
        -
      • Java -
          -
        • JVM
        • -
        -
      • -
      • Ruby -
          -
        • YARV
        • -
        -
      • -
      • Python -
          -
        • PythonVM
        • -
        -
      • -
      • Elixir -
          -
        • BEAM
        • -
        -
      • +
      • NQPコンパイラが各VMに対応したバイトコードに変換する
    @@ -293,13 +474,29 @@
    -

    Perl6のVMの構成

    +

    Perl6のVM

      -
    • MoarVMと呼ばれるVM
    • -
    • C言語で記述されている
    • +
    • MoarVM, JVM , JavaScriptが選択可能 +
        +
      • メインで開発されているのはMoarVMであり、 他のVMは機能が実装されていないものが存在する
      • +
      +
    • +
    • rakudo-star というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる
    • +
    + + + +
    + +
    + +

    MoarVM

    +
      +
    • C言語で記述されているPerl6専用の仮想機械
    • レジスタマシン
      • 型情報を持つレジスタに対しての演算として処理される
      • +
      • Rubyなどはスタックマシンとして実装されている
    • LuaJITなどを利用したJITコンパイルなども可能