Mercurial > hg > Events > OSC2019
comparison slide.pdf.html @ 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 |
---|---|
87 | 87 |
88 </div> | 88 </div> |
89 | 89 |
90 <div class='slide'> | 90 <div class='slide'> |
91 <!-- _S9SLIDE_ --> | 91 <!-- _S9SLIDE_ --> |
92 <h2 id="内容">内容</h2> | |
93 <ul> | |
94 <li>Perl6とは?</li> | |
95 <li>スクリプト言語処理系の動き</li> | |
96 <li>Perl6の内部構造 | |
97 <ul> | |
98 <li>NQP</li> | |
99 <li>MoarVM</li> | |
100 </ul> | |
101 </li> | |
102 <li>MoarVMのバイトコード実行</li> | |
103 <li>まとめ</li> | |
104 </ul> | |
105 | |
106 | |
107 | |
108 </div> | |
109 | |
110 <div class='slide'> | |
111 <!-- _S9SLIDE_ --> | |
92 <h2 id="perl6とは">Perl6とは</h2> | 112 <h2 id="perl6とは">Perl6とは</h2> |
93 <ul> | 113 <ul> |
94 <li>当初Perl5の時期バージョンとして開発されていたプログラミング言語</li> | 114 <li>当初Perl5の時期バージョンとして開発されていたプログラミング言語 |
115 <ul> | |
116 <li>現在は別の言語として開発がそれぞれ進んでいる</li> | |
117 </ul> | |
118 </li> | |
95 <li>仕様と実装が分離しており, 現在はテストが仕様となっている</li> | 119 <li>仕様と実装が分離しており, 現在はテストが仕様となっている</li> |
96 <li>実装は複数存在しているが,現在主流な実装はRakudoとなっている</li> | 120 <li>実装は歴史上複数存在しているが,主流な実装はRakudo</li> |
97 <li>言語的にはスクリプト言語であり, 漸進的型付き言語となっている</li> | 121 <li>言語的にはスクリプト言語であり, 漸進的型付き言語</li> |
98 <li>MoarVM, JVMで動作する</li> | 122 <li>動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する</li> |
99 </ul> | 123 </ul> |
100 | 124 |
101 <p><img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;" /></p> | 125 <p><img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;" /></p> |
102 | 126 |
103 | 127 |
104 | 128 |
105 </div> | 129 </div> |
106 | 130 |
107 <div class='slide'> | 131 <div class='slide'> |
108 <!-- _S9SLIDE_ --> | 132 <!-- _S9SLIDE_ --> |
133 <h2 id="現在のperl6">現在のPerl6</h2> | |
134 | |
135 <ul> | |
136 <li>現在のバージョンは <code>6.d</code></li> | |
137 <li><a href="https://perl6.github.io/6pad/">ブラウザ上で実行可能な環境</a>が存在する</li> | |
138 <li><a href="https://commaide.com/">IDE</a>が開発されている</li> | |
139 <li>WebApplicationFrameworkなども開発されており、 Perl5のモジュールを移行したものがいくつか存在する</li> | |
140 <li>日本では趣味のプロダクト以外社会では使用されていない | |
141 <ul> | |
142 <li>海外では実際に使われているケースも存在する</li> | |
143 </ul> | |
144 </li> | |
145 <li>処理速度では一部Perl5に勝っているが、それでも大分遅い</li> | |
146 </ul> | |
147 | |
148 | |
149 | |
150 </div> | |
151 | |
152 <div class='slide'> | |
153 <!-- _S9SLIDE_ --> | |
154 <h2 id="参考perl5のソースコード">[参考]Perl5のソースコード</h2> | |
155 | |
156 <ul> | |
157 <li>Perl5時代 | |
158 <ul> | |
159 <li>スカラ、配列、ハッシュの3種類</li> | |
160 <li>それぞれの変数への参照であるリファレンスが使用可能</li> | |
161 </ul> | |
162 </li> | |
163 </ul> | |
164 | |
165 <pre><code class="language-perl">use ustrict; | |
166 use warnings; | |
167 | |
168 my $scalar_value = "hello!"; | |
169 print "$scalar_value\n"; | |
170 | |
171 my @array = (1..10); | |
172 print "$array[0]\n"; | |
173 | |
174 my %hash = ( this_is_key => "this_is_value"); | |
175 print "$hash{this_is_key}\n"; | |
176 | |
177 my $hash_ref = \%hash; | |
178 print "$hash_ref->{this_is_key}\n"; | |
179 </code></pre> | |
180 | |
181 | |
182 | |
183 </div> | |
184 | |
185 <div class='slide'> | |
186 <!-- _S9SLIDE_ --> | |
109 <h2 id="perl6のソースコード概要">Perl6のソースコード概要</h2> | 187 <h2 id="perl6のソースコード概要">Perl6のソースコード概要</h2> |
110 | 188 |
111 <ul> | 189 <ul> |
112 <li>Perl5の文法とは比較的変更が多い</li> | 190 <li>Perl5の文法とは比較的変更が多い |
191 <ul> | |
192 <li>雰囲気は似ている</li> | |
193 </ul> | |
194 </li> | |
113 <li>変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能</li> | 195 <li>変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能</li> |
114 </ul> | 196 </ul> |
115 | 197 |
116 <pre><code>my $str_value = 'hello world!'; | 198 <pre><code>my $str_value = 'hello world!'; |
117 $str_value.say; # hello world! | 199 $str_value.say; # hello world! |
176 multi sub fizzbuzz (Number $number) { $number } | 258 multi sub fizzbuzz (Number $number) { $number } |
177 | 259 |
178 fizzbuzz($_).say for 1..15; | 260 fizzbuzz($_).say for 1..15; |
179 </code></pre> | 261 </code></pre> |
180 | 262 |
263 <ul> | |
264 <li>型を利用したFizzBuzz</li> | |
265 </ul> | |
266 | |
267 | |
268 | |
269 </div> | |
270 | |
271 <div class='slide'> | |
272 <!-- _S9SLIDE_ --> | |
273 <h2 id="スクリプト言語">スクリプト言語</h2> | |
274 <ul> | |
275 <li>Perl6は現状コンパイルすることはできない | |
276 <ul> | |
277 <li>スクリプト言語の分類</li> | |
278 </ul> | |
279 </li> | |
280 <li>現在広く使われているスクリプト言語(Perl,Python,Ruby…)などとPerl6の構成は類似している</li> | |
281 <li>今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する</li> | |
282 </ul> | |
283 | |
284 | |
181 | 285 |
182 </div> | 286 </div> |
183 | 287 |
184 <div class='slide'> | 288 <div class='slide'> |
185 <!-- _S9SLIDE_ --> | 289 <!-- _S9SLIDE_ --> |
200 | 304 |
201 </div> | 305 </div> |
202 | 306 |
203 <div class='slide'> | 307 <div class='slide'> |
204 <!-- _S9SLIDE_ --> | 308 <!-- _S9SLIDE_ --> |
309 <h2 id="perl6以外のスクリプト言語">Perl6以外のスクリプト言語</h2> | |
310 | |
311 <ul> | |
312 <li>現在使われているプロセスVMは言語に組み込まれているものが多い</li> | |
313 <li>JVMやElixirなどのVMは複数の言語で使用されている</li> | |
314 <li>Java | |
315 <ul> | |
316 <li>JVM</li> | |
317 </ul> | |
318 </li> | |
319 <li>Ruby | |
320 <ul> | |
321 <li>YARV</li> | |
322 </ul> | |
323 </li> | |
324 <li>Python | |
325 <ul> | |
326 <li>PythonVM</li> | |
327 </ul> | |
328 </li> | |
329 <li>Elixir | |
330 <ul> | |
331 <li>BEAM</li> | |
332 </ul> | |
333 </li> | |
334 </ul> | |
335 | |
336 | |
337 | |
338 </div> | |
339 | |
340 <div class='slide'> | |
341 <!-- _S9SLIDE_ --> | |
205 <h2 id="perl6の処理系の構成">Perl6の処理系の構成</h2> | 342 <h2 id="perl6の処理系の構成">Perl6の処理系の構成</h2> |
206 | 343 |
207 <ul> | 344 <ul> |
208 <li>Perl6の処理系は現在はRakudoと呼ばれる(歴史上複数存在する)</li> | 345 <li>Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する)</li> |
209 <li>Rakudoは3つのレイヤーから構成されている | 346 <li>Rakudoは3つのレイヤーから構成されている |
210 <ul> | 347 <ul> |
211 <li>Perl6インタプリタ</li> | 348 <li>Perl6インタプリタ</li> |
212 <li>Perl6インタプリタを記述するPerl6のサブセットNQP</li> | 349 <li>Perl6インタプリタを記述するPerl6のサブセットNQP</li> |
213 <li>Perl6のバイトコードを解釈するMoarVM</li> | 350 <li>Perl6のバイトコードを解釈するMoarVM</li> |
214 </ul> | 351 </ul> |
215 </li> | 352 </li> |
216 <li>このうちPerl6インタプリタとNQPはNQP自身で記述されている</li> | 353 <li>Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する</li> |
217 <li>MoarVMはC言語で記述されている</li> | 354 </ul> |
218 </ul> | 355 |
356 | |
357 | |
358 </div> | |
359 | |
360 <div class='slide'> | |
361 <!-- _S9SLIDE_ --> | |
362 <h2 id="rakudoの構成図">Rakudoの構成図</h2> | |
363 | |
364 <p><img src="fig/Rakudo_System_overview.png" alt="" /></p> | |
365 | |
366 <p>(http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html)</p> | |
219 | 367 |
220 | 368 |
221 | 369 |
222 </div> | 370 </div> |
223 | 371 |
224 <div class='slide'> | 372 <div class='slide'> |
225 <!-- _S9SLIDE_ --> | 373 <!-- _S9SLIDE_ --> |
226 <h2 id="perl6とnqp">Perl6とNQP</h2> | 374 <h2 id="perl6とnqp">Perl6とNQP</h2> |
227 | 375 |
228 <ul> | 376 <ul> |
229 <li>NQP(NotQuitPerl Perlっぽい別の言語)でRakudoを記述している</li> | 377 <li>NQP(NotQuitPerl Perl) |
378 <ul> | |
379 <li>Perl6のサブセット。Perl6っぽい言語</li> | |
380 </ul> | |
381 </li> | |
382 <li>Perl6、 NQP自体がNQPで記述されている</li> | |
230 <li>NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う</li> | 383 <li>NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う</li> |
231 <li>NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する</li> | 384 <li>NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する</li> |
385 <li>元々はPerl6の主力実装がParrotだった時代に登場 | |
386 <ul> | |
387 <li>文法がアップデートされており、当時の資料は古くなっている</li> | |
388 </ul> | |
389 </li> | |
390 </ul> | |
391 | |
392 <pre><code>my $value := "hello!"; | |
393 say($value); | |
394 </code></pre> | |
395 | |
396 | |
397 | |
398 </div> | |
399 | |
400 <div class='slide'> | |
401 <!-- _S9SLIDE_ --> | |
402 <h2 id="nqpスクリプト">NQPスクリプト</h2> | |
403 | |
404 <ul> | |
405 <li>変数は束縛 <code>:=</code> を使う</li> | |
406 <li>関数の間に空白を入れてはいけない</li> | |
407 <li>再帰呼び出しを使うフィボナッチ数列</li> | |
232 </ul> | 408 </ul> |
233 | 409 |
234 <pre><code>#! nqp | 410 <pre><code>#! nqp |
235 sub fib($n) { | 411 sub fib($n) { |
236 $n < 2 ?? $n !! fib($n-1) + fib($n - 2); | 412 $n < 2 ?? $n !! fib($n-1) + fib($n - 2); |
237 } | 413 } |
238 | 414 |
239 my $N := 29; | 415 my $N := 29; |
240 | 416 |
241 my $t0 := nqp::time_n(); | |
242 my $z := fib($N); | 417 my $z := fib($N); |
243 my $t1 := nqp::time_n(); | |
244 | 418 |
245 nqp::say("fib($N) = " ~ fib($N)); | 419 nqp::say("fib($N) = " ~ fib($N)); |
246 nqp::say("time = " ~ ($t1-$t0)); | 420 </code></pre> |
247 </code></pre> | 421 |
248 | 422 |
249 | 423 |
250 | 424 </div> |
251 </div> | 425 |
252 | 426 <div class='slide'> |
253 <div class='slide'> | 427 <!-- _S9SLIDE_ --> |
254 <!-- _S9SLIDE_ --> | 428 <h2 id="nqpスクリプトnまでの整数の和">NQPスクリプト(nまでの整数の和)</h2> |
255 <h2 id="プログラミング言語とvm">プログラミング言語とVM</h2> | 429 |
256 <ul> | 430 <pre><code class="language-perl6">sub add_test($n){ |
257 <li>最近のスクリプト言語は、 ソースコードを直接解釈せず、バイトコードに変換しVMが評価する | 431 mu $sum := 0; |
258 <ul> | 432 while ( $n > 1) { |
259 <li>全体的な処理速度の向上の為</li> | 433 $sum := $sum + $n; |
260 <li>実装を分離することでの見通しの良さ</li> | 434 --$n; |
261 </ul> | 435 } |
262 </li> | 436 return $sum; |
263 <li>言語処理系の実行にのみ動作するVM(プロセスVM)</li> | 437 } |
264 <li>他言語の環境 | 438 |
265 <ul> | 439 say(add_test(10000)); |
266 <li>Java | 440 </code></pre> |
267 <ul> | 441 |
268 <li>JVM</li> | 442 |
269 </ul> | 443 |
270 </li> | 444 </div> |
271 <li>Ruby | 445 |
272 <ul> | 446 <div class='slide'> |
273 <li>YARV</li> | 447 <!-- _S9SLIDE_ --> |
274 </ul> | 448 <h2 id="nqpとオペコード">NQPとオペコード</h2> |
275 </li> | 449 |
276 <li>Python | 450 <ul> |
277 <ul> | 451 <li>NQPはPerl6の中で一番レイヤーが低い言語</li> |
278 <li>PythonVM</li> | 452 <li>その為、 実行するVMのオペコード(処理単位)を使用することができる</li> |
279 </ul> | 453 </ul> |
280 </li> | 454 |
281 <li>Elixir | 455 |
282 <ul> | 456 |
283 <li>BEAM</li> | 457 </div> |
284 </ul> | 458 |
285 </li> | 459 <div class='slide'> |
286 </ul> | 460 <!-- _S9SLIDE_ --> |
287 </li> | 461 <h2 id="nqpとmoarvm">NQPとMoarVM</h2> |
288 </ul> | 462 <ul> |
289 | 463 <li>NQPそのものは実行することはできない</li> |
290 | 464 <li>NQPの実行にはMoarVM/JVMが必要となる |
291 | 465 <ul> |
292 </div> | 466 <li>NQPコンパイラが各VMに対応したバイトコードに変換する</li> |
293 | 467 </ul> |
294 <div class='slide'> | 468 </li> |
295 <!-- _S9SLIDE_ --> | 469 </ul> |
296 <h2 id="perl6のvmの構成">Perl6のVMの構成</h2> | 470 |
297 <ul> | 471 |
298 <li>MoarVMと呼ばれるVM</li> | 472 |
299 <li>C言語で記述されている</li> | 473 </div> |
474 | |
475 <div class='slide'> | |
476 <!-- _S9SLIDE_ --> | |
477 <h2 id="perl6のvm">Perl6のVM</h2> | |
478 <ul> | |
479 <li>MoarVM, JVM , JavaScriptが選択可能 | |
480 <ul> | |
481 <li>メインで開発されているのはMoarVMであり、 他のVMは機能が実装されていないものが存在する</li> | |
482 </ul> | |
483 </li> | |
484 <li><code>rakudo-star</code> というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる</li> | |
485 </ul> | |
486 | |
487 | |
488 | |
489 </div> | |
490 | |
491 <div class='slide'> | |
492 <!-- _S9SLIDE_ --> | |
493 <h2 id="moarvm">MoarVM</h2> | |
494 <ul> | |
495 <li>C言語で記述されているPerl6専用の仮想機械</li> | |
300 <li>レジスタマシン | 496 <li>レジスタマシン |
301 <ul> | 497 <ul> |
302 <li>型情報を持つレジスタに対しての演算として処理される</li> | 498 <li>型情報を持つレジスタに対しての演算として処理される</li> |
499 <li>Rubyなどはスタックマシンとして実装されている</li> | |
303 </ul> | 500 </ul> |
304 </li> | 501 </li> |
305 <li>LuaJITなどを利用したJITコンパイルなども可能</li> | 502 <li>LuaJITなどを利用したJITコンパイルなども可能</li> |
306 <li>Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する</li> | 503 <li>Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する</li> |
307 </ul> | 504 </ul> |