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 =&gt; "this_is_value");
175 print "$hash{this_is_key}\n";
176
177 my $hash_ref = \%hash;
178 print "$hash_ref-&gt;{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 &lt; 2 ?? $n !! fib($n-1) + fib($n - 2); 412 $n &lt; 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 &gt; 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>