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 =&gt; "this_is_value");
191 print "$hash{this_is_key}\n";
192
193 my $hash_ref = \%hash;
194 print "$hash_ref-&gt;{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 &lt; 2 ?? $n !! fib($n-1) + fib($n - 2); 428 $n &lt; 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 &gt; 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>