Perl6の内部表現

Takahiro Shimizu

このセッションの内容

内容

Perl6とは

現在のPerl6

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

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のソースコード概要

my $str_value = 'hello world!';
$str_value.say; # hello world!
my $sample_value = 'hello world!';
$sample_value.say; # hello world!

$sample_value = '31';
$sample_value.say; # 31

say($sample_value * 3);

Perl6の言語的な特徴

my Int $int_value  = 31;
$int_value = "hello"; # Compile error!
$ perl6 type_invalid.p6
Type check failed in assignment to $int_value; expected Int but got Str ("hello")
  in block <unit> at type_invalid.p6 line 4

Perl6の言語的な特徴

my subset Fizz of Int where * %% 3;
my subset Buzz of Int where * %% 5;
my subset FizzBuzz of Int where Fizz&Buzz;
my subset Number of Int where none Fizz|Buzz;

proto sub fizzbuzz ($) { * }
multi sub fizzbuzz (FizzBuzz) { "FuzzBuzz" }
multi sub fizzbuzz (Fizz) { "Fizz" }
multi sub fizzbuzz (Buzz) { "Buzz" }
multi sub fizzbuzz (Number $number) { $number }

fizzbuzz($_).say for 1..15;

スクリプト言語

スクリプト言語処理系

Perl6以外のスクリプト言語

Perl6の処理系の構成

Rakudoの構成図

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

Perl6とNQP

my $value := "hello!";
say($value);

NQPスクリプト

#! nqp
sub fib($n) {
    $n < 2 ?? $n !! fib($n-1) + fib($n - 2);
}

my $N := 29;

my $z  := fib($N);

nqp::say("fib($N) = " ~ fib($N));

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

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

say(add_test(10000));

NQPとオペコード

NQPとMoarVM

Perl6のVM

MoarVM

バイトコード