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