annotate slide.md @ 17:a176ea5c0264

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 19 Apr 2019 23:22:02 +0900
parents d3036d998236
children 1fc9d0bd924f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 title: Perl6の内部表現
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 author: Takahiro Shimizu
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 profile:
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 lang: Japanese
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 ## このセッションの内容
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
8 - Perl6の主要な実装であるRakudoの内部構造を探ります
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
9 - Rakudoの内部で利用されているVMや, Perl6のサブセットなどについて探索します
3
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
10 - スクリプト言語で主に使われているバイトコードインタプリタの気持ちになります
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
11
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
12 ## 内容
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
13 - Perl6とは?
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
14 - スクリプト言語処理系の動き
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
15 - Perl6の内部構造
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
16 - NQP
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
17 - MoarVM
14
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
18 - NQPとMoarVMのバイトコード対応
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
19 - バイトコードインタプリタのC言語実装
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
20 - MoarVMの詳細
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
21 - MoarVMのバイトコード実行
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
22 - まとめ
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
23
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
24 ## Perl6とは
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
25 - 当初Perl5の時期バージョンとして開発されていたプログラミング言語
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
26 - 現在は別の言語として開発がそれぞれ進んでいる
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
27 - 仕様と実装が分離しており, 現在はテストが仕様となっている
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
28 - 実装は歴史上複数存在しているが,主流な実装はRakudo
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
29 - 言語的にはスクリプト言語であり, 漸進的型付き言語
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
30 - 動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
31
14
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
32 <img src="fig/2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;">
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
33
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
34 ## 現在のPerl6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
35
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
36 - 現在のバージョンは `6.d`
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
37 - [ブラウザ上で実行可能な環境](https://perl6.github.io/6pad/)が存在する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
38 - [IDE](https://commaide.com/)が開発されている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
39 - WebApplicationFrameworkなども開発されており、 Perl5のモジュールを移行したものがいくつか存在する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
40 - 日本では趣味のプロダクト以外社会では使用されていない
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
41 - 海外では実際に使われているケースも存在する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
42 - 処理速度では一部Perl5に勝っているが、それでも大分遅い
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
43
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
44 ## [参考]Perl5のソースコード
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
45
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
46 - Perl5時代
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
47 − スカラ、配列、ハッシュの3種類
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
48 - それぞれの変数への参照であるリファレンスが使用可能
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
49
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
50 ```perl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
51 use ustrict;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
52 use warnings;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
53
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
54 my $scalar_value = "hello!";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
55 print "$scalar_value\n";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
56
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
57 my @array = (1..10);
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
58 print "$array[0]\n";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
59
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
60 my %hash = ( this_is_key => "this_is_value");
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
61 print "$hash{this_is_key}\n";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
63 my $hash_ref = \%hash;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
64 print "$hash_ref->{this_is_key}\n";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
65 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
66
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
67 ## Perl6のソースコード概要
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
68
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
69 - Perl5の文法とは比較的変更が多い
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
70 - 雰囲気は似ている
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
71 - 変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
72
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
73 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
74 my $str_value = 'hello world!';
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
75 $str_value.say; # hello world!
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
76 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
77
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
78 - Perl5と同様に,変数にはデフォルトでは型がないような振る舞いをする
0
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
80 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
81 my $sample_value = 'hello world!';
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
82 $sample_value.say; # hello world!
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
83
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
84 $sample_value = '31';
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
85 $sample_value.say; # 31
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
86
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
87 say($sample_value * 3);
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
88 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
89
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
90 ## Perl6の言語的な特徴
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
91
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
92 - 漸進的型付き言語である為, 型を強制することも可能となる
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
93
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
94 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
95 my Int $int_value = 31;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
96 $int_value = "hello"; # Compile error!
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
97 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
98
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
99 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
100 $ perl6 type_invalid.p6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
101 Type check failed in assignment to $int_value; expected Int but got Str ("hello")
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
102 in block <unit> at type_invalid.p6 line 4
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
103 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
104
4
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
105 ## Perl6の言語的な特徴
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
106
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
107 - 型を独自に定義することも可能
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
108 - 入力の型によって実行する関数を変える事などができる
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
109
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
110 ```perl6
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
111 my subset Fizz of Int where * %% 3;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
112 my subset Buzz of Int where * %% 5;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
113 my subset FizzBuzz of Int where Fizz&Buzz;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
114 my subset Number of Int where none Fizz|Buzz;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
115
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
116 proto sub fizzbuzz ($) { * }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
117 multi sub fizzbuzz (FizzBuzz) { "FuzzBuzz" }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
118 multi sub fizzbuzz (Fizz) { "Fizz" }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
119 multi sub fizzbuzz (Buzz) { "Buzz" }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
120 multi sub fizzbuzz (Number $number) { $number }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
121
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
122 fizzbuzz($_).say for 1..15;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
123 ```
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
124
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
125 - 型を利用したFizzBuzz
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
126
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
127 ## スクリプト言語
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
128 - Perl6は現状コンパイルすることはできない
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
129 - スクリプト言語の分類
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
130
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
131 - 現在広く使われているスクリプト言語(Perl,Python,Ruby...)などとPerl6の構成は類似している
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
132 - 今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
133
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
134 ## スクリプト言語処理系
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
135 - スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
136 - その為スクリプト言語の実装は大きく2つで構成されている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
137 - バイトコードに変換するフロントエンド部分
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
138 - バイトコードを解釈する仮想機械
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
139
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
140 <img src="fig/bytecode_sample_generally_lang.svg" width="80%">
4
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
141
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
142
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
143 ## Perl6以外のスクリプト言語
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
144
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
145 - 現在使われているプロセスVMは言語に組み込まれているものが多い
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
146 - JVMやElixirなどのVMは複数の言語で使用されている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
147 - Java
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
148 - JVM
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
149 - Ruby
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
150 - YARV
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
151 - Python
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
152 - PythonVM
12
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
153 - Erlang
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
154 - Elixir
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
155 - BEAM
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
156
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
157 ## Perl6の処理系の構成
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
158
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
159 - Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する)
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
160 - Rakudoは3つのレイヤーから構成されている
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
161 - Perl6インタプリタ
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
162 - Perl6インタプリタを記述するPerl6のサブセットNQP
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
163 - Perl6のバイトコードを解釈するMoarVM
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
164 - Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
165
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
166 ## Rakudoの構成図
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
167
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
168 ![](fig/Rakudo_System_overview.png)
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
169
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
170 (http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html)
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
171
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
172 ## Perl6とNQP
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
173
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
174 - NQP(NotQuitPerl Perl)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
175 - Perl6のサブセット。Perl6っぽい言語
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
176 - Perl6、 NQP自体がNQPで記述されている
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
177 - NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
178 - NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
179 - 元々はPerl6の主力実装がParrotだった時代に登場
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
180 - 文法がアップデートされており、当時の資料は古くなっている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
181
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
182 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
183 my $value := "hello!";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
184 say($value);
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
185 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
186
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
187 ## NQPスクリプト
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
188
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
189 - 変数は束縛 `:=` を使う
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
190 − 関数の間に空白を入れてはいけない
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
191 - 再帰呼び出しを使うフィボナッチ数列
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
192
4
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
193 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
194 #! nqp
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
195 sub fib($n) {
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
196 $n < 2 ?? $n !! fib($n-1) + fib($n - 2);
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
197 }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
198
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
199 my $N := 29;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
200
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
201 my $z := fib($N);
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
202
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
203 nqp::say("fib($N) = " ~ fib($N));
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
204 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
205
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
206 ## NQPスクリプト(nまでの整数の和)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
207
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
208 ```perl6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
209 sub add_test($n){
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
210 my $sum := 0;
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
211 while ( $n > 1) {
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
212 $sum := $sum + $n;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
213 --$n;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
214 }
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
215 return $sum;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
216 }
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
217
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
218 say(add_test(10000));
4
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
219 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
220
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
221 ## NQP
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
222
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
223 - NQPはPerl6の中で一番レイヤーが低い言語
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
224 - その為、 実行するVMのオペコード(処理単位)を使用することができる
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
225 - NQPオペコードは、 Perl6の内部の抽象構文木でも使用されている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
226 - また、 Perl6と同様に型を指定することが可能
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
227
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
228 ```perl6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
229 sub add_test(int $n){
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
230 mu $sum := 0;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
231 while nqp::isgt_i($n,1) {
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
232 $sum := nqp::add_i($sum,$n);
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
233 $n := nqp::sub_i($n,1);
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
234 }
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
235 return $sum;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
236 }
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
237 ```
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
238
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
239 ## NQPとMoarVM
14
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
240 - NQPは実行する際にMoarVM/JVMが必要となる
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
241 - NQPコンパイラが各VMに対応したバイトコードに変換する
14
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
242 - MoarVMの場合は、MoarVMのバイナリ moar に、 NQPのインタプリタのバイトコードをライブラリや入力として与える
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
243
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
244 ## Perl6のVM
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
245 - MoarVM, JVM , JavaScriptが選択可能
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
246 - メインで開発されているのはMoarVMであり、 他のVMは機能が実装されていないものが存在する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
247 - `rakudo-star` というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
248
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
249 ## MoarVM
14
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
250 - Metamodel On A Runtime
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
251 - C言語で記述されているPerl6専用の仮想機械
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
252 - レジスタマシン
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
253 - 型情報を持つレジスタに対しての演算として処理される
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
254 - Rubyなどはスタックマシンとして実装されている
14
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
255 - Unicodeのサポートや、LuaJITなどを利用したJITコンパイルなども可能
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
256 - Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
257
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
258
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
259
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
260 ## バイトコード
3
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
261 - Perl6も、Rakudo/NQPはバイトコードに変換され、 バイトコードをVMが実行する
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
262 - Perl6/NQPはバイトコードにコンパイルすることが可能
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
263 - 直接実行することはできない
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
264
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
265 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
266 $nqp --target=mbc --output=fib.moarvm fib.nqp
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
267 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
268
12
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
269 ## バイトコード
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
270 - バイナリ形式で表現される為、 VMがどのように読み取るかでバイトコードの意味が異なる
14
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
271 - スクリプト言語系のVMは、 VMという名前の通り、 計算機をエミュレートしている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
272 - その為、通常のCPUのストア命令などに相当する命令が実装されている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
273 - スクリプト言語は、その命令の実行を繰り返すことでプログラムを評価する
12
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
274 - スクリプト言語で重要なバイトコード表現は、「仮想機械がどの命令を実行するか」のバイトコード
14
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
275 - CPUに対するアセンブラの数値に対応する
12
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
276 - どういった構成なのかは仮想機械によって異なる
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
277
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
278
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
279 ## バイトコードとMoarVM
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
280
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
281
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
282 - MoarVMバイトコードはMoarVMの実行バイナリ `moar` でディスアセンブルすることが可能
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
283
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
284
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
285 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
286 annotation: add_test.nqp:1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
287 00003 const_i64_16 loc_2_int, 0
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
288 00004 hllboxtype_i loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
289 00005 box_i loc_3_obj, loc_2_int, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
290 00006 set loc_1_obj, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
291 label_1:
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
292 00007 decont loc_3_obj, loc_0_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
293 00008 smrt_numify loc_4_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
294 00009 const_i64_16 loc_2_int, 1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
295 00010 coerce_in loc_5_num, loc_2_int
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
296 00011 gt_n loc_2_int, loc_4_num, loc_5_num
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
297 00012 unless_i loc_2_int, label_2(00031)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
298 00013 osrpoint
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
299 annotation: add_test.nqp:3
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
300 00014 decont loc_3_obj, loc_1_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
301 00015 smrt_numify loc_5_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
302 00016 decont loc_3_obj, loc_0_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
303 00017 smrt_numify loc_4_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
304 00018 add_n loc_4_num, loc_5_num, loc_4_num
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
305 00019 hllboxtype_n loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
306 00020 box_n loc_3_obj, loc_4_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
307 00021 set loc_1_obj, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
308 00022 decont loc_3_obj, loc_0_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
309 00023 smrt_numify loc_4_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
310 00024 coerce_ni loc_6_int, loc_4_num
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
311 00025 const_i64_16 loc_7_int, 1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
312 00026 sub_i loc_7_int, loc_6_int, loc_7_int
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
313 00027 hllboxtype_i loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
314 00028 box_i loc_3_obj, loc_7_int, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
315 00029 set loc_0_obj, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
316 00030 goto label_1(00007)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
317 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
318
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
319 ## NQPとバイトコードの対応
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
320
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
321 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
322 say(add_test(10000));
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
323 ```
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
324
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
325 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
326 annotation: add_test.nqp:1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
327 label_1:
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
328 00020 getlex_no loc_7_obj, '&say'
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
329 00021 decont loc_7_obj, loc_7_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
330 00022 const_s loc_3_str, '&add_test'
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
331 00023 getlexstatic_o loc_8_obj, loc_3_str
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
332 00024 decont loc_8_obj, loc_8_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
333 00025 const_i64_16 loc_5_int, 10000
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
334 00026 prepargs Callsite_1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
335 00027 arg_i 0, loc_5_int
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
336 00028 invoke_o loc_8_obj, loc_8_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
337 00029 prepargs Callsite_0
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
338 00030 arg_o 0, loc_8_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
339 00031 invoke_v loc_7_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
340 00032 null loc_7_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
341 00033 return_o loc_7_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
342 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
343
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
344 - Perl6の変数は直接実態を参照せず、中身が入っているコンテナを参照するようになっている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
345 - その為 `decont` 命令で、コンテナの中身をレジスタに設定する必要がある
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
346 - `const_i64_16` などは64bitの数という意味で、 `int` 型としてレジスタに登録している
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
347 - `prepargs` で引数の確認を行い, `invoke_o` で実際にサブルーチンに移行する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
348
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
349 ## NQPとバイトコードの対応
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
350
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
351 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
352 my $sum := 0;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
353 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
354
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
355 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
356 annotation: add_test.nqp:1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
357 00003 const_i64_16 loc_2_int, 0
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
358 00004 hllboxtype_i loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
359 00005 box_i loc_3_obj, loc_2_int, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
360 00006 set loc_1_obj, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
361 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
362
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
363 - まず `loc_2` レジスタをint型の整数0で初期化する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
364 - 変数 `$sum` はint型の指定がないので、 obj型で登録しなければならない
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
365 - その為, 整数として登録された `loc_2` から、 obj型に一旦キャストし、 `loc_3` レジスタに設定したものを、 `loc_1` レジスタに設定する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
366
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
367 ## NQPとバイトコードの対応
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
368
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
369 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
370 while ( $n > 1) {
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
371 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
372
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
373 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
374 label_1:
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
375 00007 decont loc_3_obj, loc_0_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
376 00008 smrt_numify loc_4_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
377 00009 const_i64_16 loc_2_int, 1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
378 00010 coerce_in loc_5_num, loc_2_int
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
379 00011 gt_n loc_2_int, loc_4_num, loc_5_num
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
380 00012 unless_i loc_2_int, label_2(00031)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
381 00013 osrpoint
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
382 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
383
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
384 − 比較にもint型の指定がない為、 `num` 型にキャストし、 `num` 型のレジスタでの大小を比較する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
385 - 比較命令は `gt_n` であり、 結果により `unless_i` 命令で、別のラベルにジャンプする
14
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
386
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
387 ## decode命令
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
388
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
389 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
390 while ( $n > 1) {
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
391 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
392
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
393 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
394 00007 decont loc_3_obj, loc_0_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
395 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
396
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
397
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
398 ![](fig/decont_perl6_loc3.svg)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
399
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
400 - 変数 `$n` と 整数 `1` を大小比較する為、 まず `$n` から値を取り出す
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
401 - とりだした時点では、何の型で使うかは決定していない為、 obj型として判定する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
402
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
403 ## smrt_nomify
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
404
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
405
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
406 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
407 while ( $n > 1) {
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
408 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
409
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
410 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
411 00008 smrt_numify loc_4_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
412 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
413
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
414
17
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
415 - `smrt_numify` はレジスタ上のオブジェクトを、 num型に変換し、 別のレジスタに登録する命令
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
416 - 今回の整数の比較では、 int型の強制がない為、 数値として比較するためにnum型にキャストしている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
417
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
418 ![](fig/perl6_num_convert.svg)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
419
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
420 ## MoarVMのバイトコードインタプリタ部分
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
421 MoarVMなどの言語処理系のバイトコードインタプリタは次のことを繰り返している
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
422 1. 入力されたバイトコード列から命令に対応する部分を読み取る
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
423 2. 読み込んだ数値から、 対応する命令を取得する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
424 3. 命令部分を実行する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
425 4. バイトコード列を次に進め、繰り返す
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
426
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
427 - この部分の実装は大体次のような処理をしている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
428
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
429 ## 巨大なswitch文を使うケース
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
430
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
431 - 命令に対応するバイトコードを数値に変換できるようにし、 switch-case文で分岐させる
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
432 - 実行のたびにループで先頭に戻り、次の命令を計算する必要があるので低速
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
433
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
434 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
435 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
436
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
437 ## Cコンパイラのラベルgotoを使うケース
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
438
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
439 - 巨大なcase文とループではなく、 次の命令の実行場所に直接jmpで移動する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
440 - 次の命令に対応するラベルを取得する必要があるが、 ループする必要がなく高速
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
441 - ラベルgotoであり、 Cコンパイラの拡張機能として搭載されている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
442 - gccおよびLLVM/clangには実装されている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
443
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
444 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
445 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
446
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
447 ## MoarVMでは
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
448 - ラベルgotoが利用できる場合は利用する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
449 - 使えないコンパイラの場合は、 switch文を利用する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
450 - この判断はマクロで処理をしている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
451 − 一般的にはラベルgotoの方が高速である為、他のスクリプト言語でもラベルgotoが使われている