Mercurial > hg > Events > OSC2019
annotate slide.md @ 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 |
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 | 8 - Perl6の主要な実装であるRakudoの内部構造を探ります |
9 - Rakudoの内部で利用されているVMや, Perl6のサブセットなどについて探索します | |
3 | 10 - スクリプト言語で主に使われているバイトコードインタプリタの気持ちになります |
1 | 11 |
9 | 12 ## 内容 |
13 - Perl6とは? | |
14 - スクリプト言語処理系の動き | |
15 - Perl6の内部構造 | |
16 - NQP | |
17 - MoarVM | |
18 - MoarVMのバイトコード実行 | |
19 - まとめ | |
20 | |
1 | 21 ## Perl6とは |
22 - 当初Perl5の時期バージョンとして開発されていたプログラミング言語 | |
9 | 23 - 現在は別の言語として開発がそれぞれ進んでいる |
1 | 24 - 仕様と実装が分離しており, 現在はテストが仕様となっている |
9 | 25 - 実装は歴史上複数存在しているが,主流な実装はRakudo |
26 - 言語的にはスクリプト言語であり, 漸進的型付き言語 | |
27 - 動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する | |
1 | 28 |
2 | 29 <img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;"> |
1 | 30 |
9 | 31 ## 現在のPerl6 |
32 | |
33 - 現在のバージョンは `6.d` | |
34 - [ブラウザ上で実行可能な環境](https://perl6.github.io/6pad/)が存在する | |
35 - [IDE](https://commaide.com/)が開発されている | |
36 - WebApplicationFrameworkなども開発されており、 Perl5のモジュールを移行したものがいくつか存在する | |
37 - 日本では趣味のプロダクト以外社会では使用されていない | |
38 - 海外では実際に使われているケースも存在する | |
39 - 処理速度では一部Perl5に勝っているが、それでも大分遅い | |
40 | |
41 ## [参考]Perl5のソースコード | |
42 | |
43 - Perl5時代 | |
44 − スカラ、配列、ハッシュの3種類 | |
45 - それぞれの変数への参照であるリファレンスが使用可能 | |
46 | |
47 ```perl | |
48 use ustrict; | |
49 use warnings; | |
50 | |
51 my $scalar_value = "hello!"; | |
52 print "$scalar_value\n"; | |
53 | |
54 my @array = (1..10); | |
55 print "$array[0]\n"; | |
56 | |
57 my %hash = ( this_is_key => "this_is_value"); | |
58 print "$hash{this_is_key}\n"; | |
59 | |
60 my $hash_ref = \%hash; | |
61 print "$hash_ref->{this_is_key}\n"; | |
62 ``` | |
63 | |
1 | 64 ## Perl6のソースコード概要 |
65 | |
66 - Perl5の文法とは比較的変更が多い | |
9 | 67 - 雰囲気は似ている |
1 | 68 - 変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能 |
69 | |
70 ``` | |
71 my $str_value = 'hello world!'; | |
72 $str_value.say; # hello world! | |
73 ``` | |
74 | |
75 - Perl5と同様に,変数にはデフォルトでは型がないような振る舞いをする | |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76 |
1 | 77 ``` |
78 my $sample_value = 'hello world!'; | |
79 $sample_value.say; # hello world! | |
80 | |
81 $sample_value = '31'; | |
82 $sample_value.say; # 31 | |
83 | |
84 say($sample_value * 3); | |
85 ``` | |
86 | |
87 ## Perl6の言語的な特徴 | |
88 | |
89 - 漸進的型付き言語である為, 型を強制することも可能となる | |
90 | |
91 ``` | |
92 my Int $int_value = 31; | |
93 $int_value = "hello"; # Compile error! | |
94 ``` | |
95 | |
7 | 96 ``` |
97 $ perl6 type_invalid.p6 | |
98 Type check failed in assignment to $int_value; expected Int but got Str ("hello") | |
99 in block <unit> at type_invalid.p6 line 4 | |
100 ``` | |
101 | |
4 | 102 ## Perl6の言語的な特徴 |
103 | |
104 - 型を独自に定義することも可能 | |
105 - 入力の型によって実行する関数を変える事などができる | |
106 | |
107 ```perl6 | |
108 my subset Fizz of Int where * %% 3; | |
109 my subset Buzz of Int where * %% 5; | |
110 my subset FizzBuzz of Int where Fizz&Buzz; | |
111 my subset Number of Int where none Fizz|Buzz; | |
112 | |
113 proto sub fizzbuzz ($) { * } | |
114 multi sub fizzbuzz (FizzBuzz) { "FuzzBuzz" } | |
115 multi sub fizzbuzz (Fizz) { "Fizz" } | |
116 multi sub fizzbuzz (Buzz) { "Buzz" } | |
117 multi sub fizzbuzz (Number $number) { $number } | |
118 | |
119 fizzbuzz($_).say for 1..15; | |
120 ``` | |
9 | 121 |
122 - 型を利用したFizzBuzz | |
123 | |
124 ## スクリプト言語 | |
125 - Perl6は現状コンパイルすることはできない | |
126 - スクリプト言語の分類 | |
127 | |
128 - 現在広く使われているスクリプト言語(Perl,Python,Ruby...)などとPerl6の構成は類似している | |
129 - 今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する | |
130 | |
7 | 131 ## スクリプト言語処理系 |
132 - スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている | |
133 - その為スクリプト言語の実装は大きく2つで構成されている | |
134 - バイトコードに変換するフロントエンド部分 | |
135 - バイトコードを解釈する仮想機械 | |
136 | |
137 <img src="fig/bytecode_sample_generally_lang.svg" width="80%"> | |
4 | 138 |
9 | 139 |
140 ## Perl6以外のスクリプト言語 | |
141 | |
142 - 現在使われているプロセスVMは言語に組み込まれているものが多い | |
143 - JVMやElixirなどのVMは複数の言語で使用されている | |
144 - Java | |
145 - JVM | |
146 - Ruby | |
147 - YARV | |
148 - Python | |
149 - PythonVM | |
150 - Elixir | |
151 - BEAM | |
152 | |
1 | 153 ## Perl6の処理系の構成 |
154 | |
9 | 155 - Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する) |
2 | 156 - Rakudoは3つのレイヤーから構成されている |
157 - Perl6インタプリタ | |
158 - Perl6インタプリタを記述するPerl6のサブセットNQP | |
159 - Perl6のバイトコードを解釈するMoarVM | |
9 | 160 - Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する |
161 | |
162 ## Rakudoの構成図 | |
2 | 163 |
9 | 164 ![](fig/Rakudo_System_overview.png) |
7 | 165 |
9 | 166 (http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html) |
7 | 167 |
2 | 168 ## Perl6とNQP |
169 | |
9 | 170 - NQP(NotQuitPerl Perl) |
171 - Perl6のサブセット。Perl6っぽい言語 | |
172 - Perl6、 NQP自体がNQPで記述されている | |
2 | 173 - NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う |
174 - NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する | |
9 | 175 - 元々はPerl6の主力実装がParrotだった時代に登場 |
176 - 文法がアップデートされており、当時の資料は古くなっている | |
177 | |
178 ``` | |
179 my $value := "hello!"; | |
180 say($value); | |
181 ``` | |
182 | |
183 ## NQPスクリプト | |
184 | |
185 - 変数は束縛 `:=` を使う | |
186 − 関数の間に空白を入れてはいけない | |
187 - 再帰呼び出しを使うフィボナッチ数列 | |
2 | 188 |
4 | 189 ``` |
190 #! nqp | |
191 sub fib($n) { | |
192 $n < 2 ?? $n !! fib($n-1) + fib($n - 2); | |
193 } | |
194 | |
195 my $N := 29; | |
196 | |
197 my $z := fib($N); | |
198 | |
199 nqp::say("fib($N) = " ~ fib($N)); | |
9 | 200 ``` |
201 | |
202 ## NQPスクリプト(nまでの整数の和) | |
203 | |
204 ```perl6 | |
205 sub add_test($n){ | |
206 mu $sum := 0; | |
207 while ( $n > 1) { | |
208 $sum := $sum + $n; | |
209 --$n; | |
210 } | |
211 return $sum; | |
212 } | |
213 | |
214 say(add_test(10000)); | |
4 | 215 ``` |
216 | |
9 | 217 ## NQPとオペコード |
218 | |
219 - NQPはPerl6の中で一番レイヤーが低い言語 | |
220 - その為、 実行するVMのオペコード(処理単位)を使用することができる | |
221 | |
7 | 222 |
9 | 223 ## NQPとMoarVM |
224 - NQPそのものは実行することはできない | |
225 - NQPの実行にはMoarVM/JVMが必要となる | |
226 - NQPコンパイラが各VMに対応したバイトコードに変換する | |
227 | |
228 ## Perl6のVM | |
229 - MoarVM, JVM , JavaScriptが選択可能 | |
230 - メインで開発されているのはMoarVMであり、 他のVMは機能が実装されていないものが存在する | |
231 - `rakudo-star` というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる | |
232 | |
233 ## MoarVM | |
234 - C言語で記述されているPerl6専用の仮想機械 | |
7 | 235 - レジスタマシン |
236 - 型情報を持つレジスタに対しての演算として処理される | |
9 | 237 - Rubyなどはスタックマシンとして実装されている |
7 | 238 - LuaJITなどを利用したJITコンパイルなども可能 |
239 - Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する | |
240 | |
241 ## バイトコード | |
3 | 242 - Perl6も、Rakudo/NQPはバイトコードに変換され、 バイトコードをVMが実行する |
2 | 243 - バイトコード実行部分は、 命令に対応するバイト列を読み込み、 解釈し、 次の命令を読み取ることを繰り返す |
244 |