Mercurial > hg > Events > OSC2019
comparison 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 |
comparison
equal
deleted
inserted
replaced
7:d8feb607c44e | 9:642787982a80 |
---|---|
7 | 7 |
8 - Perl6の主要な実装であるRakudoの内部構造を探ります | 8 - Perl6の主要な実装であるRakudoの内部構造を探ります |
9 - Rakudoの内部で利用されているVMや, Perl6のサブセットなどについて探索します | 9 - Rakudoの内部で利用されているVMや, Perl6のサブセットなどについて探索します |
10 - スクリプト言語で主に使われているバイトコードインタプリタの気持ちになります | 10 - スクリプト言語で主に使われているバイトコードインタプリタの気持ちになります |
11 | 11 |
12 ## 内容 | |
13 - Perl6とは? | |
14 - スクリプト言語処理系の動き | |
15 - Perl6の内部構造 | |
16 - NQP | |
17 - MoarVM | |
18 - MoarVMのバイトコード実行 | |
19 - まとめ | |
20 | |
12 ## Perl6とは | 21 ## Perl6とは |
13 - 当初Perl5の時期バージョンとして開発されていたプログラミング言語 | 22 - 当初Perl5の時期バージョンとして開発されていたプログラミング言語 |
23 - 現在は別の言語として開発がそれぞれ進んでいる | |
14 - 仕様と実装が分離しており, 現在はテストが仕様となっている | 24 - 仕様と実装が分離しており, 現在はテストが仕様となっている |
15 - 実装は複数存在しているが,現在主流な実装はRakudoとなっている | 25 - 実装は歴史上複数存在しているが,主流な実装はRakudo |
16 - 言語的にはスクリプト言語であり, 漸進的型付き言語となっている | 26 - 言語的にはスクリプト言語であり, 漸進的型付き言語 |
17 - MoarVM, JVMで動作する | 27 - 動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する |
18 | 28 |
19 <img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;"> | 29 <img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;"> |
20 | 30 |
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 | |
21 ## Perl6のソースコード概要 | 64 ## Perl6のソースコード概要 |
22 | 65 |
23 - Perl5の文法とは比較的変更が多い | 66 - Perl5の文法とは比較的変更が多い |
67 - 雰囲気は似ている | |
24 - 変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能 | 68 - 変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能 |
25 | 69 |
26 ``` | 70 ``` |
27 my $str_value = 'hello world!'; | 71 my $str_value = 'hello world!'; |
28 $str_value.say; # hello world! | 72 $str_value.say; # hello world! |
72 multi sub fizzbuzz (Buzz) { "Buzz" } | 116 multi sub fizzbuzz (Buzz) { "Buzz" } |
73 multi sub fizzbuzz (Number $number) { $number } | 117 multi sub fizzbuzz (Number $number) { $number } |
74 | 118 |
75 fizzbuzz($_).say for 1..15; | 119 fizzbuzz($_).say for 1..15; |
76 ``` | 120 ``` |
121 | |
122 - 型を利用したFizzBuzz | |
123 | |
124 ## スクリプト言語 | |
125 - Perl6は現状コンパイルすることはできない | |
126 - スクリプト言語の分類 | |
127 | |
128 - 現在広く使われているスクリプト言語(Perl,Python,Ruby...)などとPerl6の構成は類似している | |
129 - 今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する | |
130 | |
77 ## スクリプト言語処理系 | 131 ## スクリプト言語処理系 |
78 - スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている | 132 - スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている |
79 - その為スクリプト言語の実装は大きく2つで構成されている | 133 - その為スクリプト言語の実装は大きく2つで構成されている |
80 - バイトコードに変換するフロントエンド部分 | 134 - バイトコードに変換するフロントエンド部分 |
81 - バイトコードを解釈する仮想機械 | 135 - バイトコードを解釈する仮想機械 |
82 | 136 |
83 <img src="fig/bytecode_sample_generally_lang.svg" width="80%"> | 137 <img src="fig/bytecode_sample_generally_lang.svg" width="80%"> |
84 | 138 |
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 | |
85 ## Perl6の処理系の構成 | 153 ## Perl6の処理系の構成 |
86 | 154 |
87 - Perl6の処理系は現在はRakudoと呼ばれる(歴史上複数存在する) | 155 - Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する) |
88 - Rakudoは3つのレイヤーから構成されている | 156 - Rakudoは3つのレイヤーから構成されている |
89 - Perl6インタプリタ | 157 - Perl6インタプリタ |
90 - Perl6インタプリタを記述するPerl6のサブセットNQP | 158 - Perl6インタプリタを記述するPerl6のサブセットNQP |
91 - Perl6のバイトコードを解釈するMoarVM | 159 - Perl6のバイトコードを解釈するMoarVM |
92 - このうちPerl6インタプリタとNQPはNQP自身で記述されている | 160 - Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する |
93 - MoarVMはC言語で記述されている | 161 |
94 | 162 ## Rakudoの構成図 |
95 | 163 |
96 | 164 ![](fig/Rakudo_System_overview.png) |
165 | |
166 (http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html) | |
97 | 167 |
98 ## Perl6とNQP | 168 ## Perl6とNQP |
99 | 169 |
100 - NQP(NotQuitPerl Perlっぽい別の言語)でRakudoを記述している | 170 - NQP(NotQuitPerl Perl) |
171 - Perl6のサブセット。Perl6っぽい言語 | |
172 - Perl6、 NQP自体がNQPで記述されている | |
101 - NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う | 173 - NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う |
102 - NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する | 174 - NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する |
175 - 元々はPerl6の主力実装がParrotだった時代に登場 | |
176 - 文法がアップデートされており、当時の資料は古くなっている | |
177 | |
178 ``` | |
179 my $value := "hello!"; | |
180 say($value); | |
181 ``` | |
182 | |
183 ## NQPスクリプト | |
184 | |
185 - 変数は束縛 `:=` を使う | |
186 − 関数の間に空白を入れてはいけない | |
187 - 再帰呼び出しを使うフィボナッチ数列 | |
103 | 188 |
104 ``` | 189 ``` |
105 #! nqp | 190 #! nqp |
106 sub fib($n) { | 191 sub fib($n) { |
107 $n < 2 ?? $n !! fib($n-1) + fib($n - 2); | 192 $n < 2 ?? $n !! fib($n-1) + fib($n - 2); |
108 } | 193 } |
109 | 194 |
110 my $N := 29; | 195 my $N := 29; |
111 | 196 |
112 my $t0 := nqp::time_n(); | |
113 my $z := fib($N); | 197 my $z := fib($N); |
114 my $t1 := nqp::time_n(); | |
115 | 198 |
116 nqp::say("fib($N) = " ~ fib($N)); | 199 nqp::say("fib($N) = " ~ fib($N)); |
117 nqp::say("time = " ~ ($t1-$t0)); | 200 ``` |
118 ``` | 201 |
119 | 202 ## NQPスクリプト(nまでの整数の和) |
120 ## プログラミング言語とVM | 203 |
121 - 最近のスクリプト言語は、 ソースコードを直接解釈せず、バイトコードに変換しVMが評価する | 204 ```perl6 |
122 - 全体的な処理速度の向上の為 | 205 sub add_test($n){ |
123 - 実装を分離することでの見通しの良さ | 206 mu $sum := 0; |
124 - 言語処理系の実行にのみ動作するVM(プロセスVM) | 207 while ( $n > 1) { |
125 - 他言語の環境 | 208 $sum := $sum + $n; |
126 - Java | 209 --$n; |
127 - JVM | 210 } |
128 - Ruby | 211 return $sum; |
129 - YARV | 212 } |
130 - Python | 213 |
131 - PythonVM | 214 say(add_test(10000)); |
132 - Elixir | 215 ``` |
133 - BEAM | 216 |
134 | 217 ## NQPとオペコード |
135 ## Perl6のVMの構成 | 218 |
136 - MoarVMと呼ばれるVM | 219 - NQPはPerl6の中で一番レイヤーが低い言語 |
137 - C言語で記述されている | 220 - その為、 実行するVMのオペコード(処理単位)を使用することができる |
221 | |
222 | |
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専用の仮想機械 | |
138 - レジスタマシン | 235 - レジスタマシン |
139 - 型情報を持つレジスタに対しての演算として処理される | 236 - 型情報を持つレジスタに対しての演算として処理される |
237 - Rubyなどはスタックマシンとして実装されている | |
140 - LuaJITなどを利用したJITコンパイルなども可能 | 238 - LuaJITなどを利用したJITコンパイルなども可能 |
141 - Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する | 239 - Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する |
142 | 240 |
143 ## バイトコード | 241 ## バイトコード |
144 - Perl6も、Rakudo/NQPはバイトコードに変換され、 バイトコードをVMが実行する | 242 - Perl6も、Rakudo/NQPはバイトコードに変換され、 バイトコードをVMが実行する |