comparison Slide/Slide.pdf.html @ 22:b96b3244307b

update paper & slide
author e165727 <e165727@ie.u-ryukyu.ac.jp>
date Sun, 16 Feb 2020 18:20:36 +0900
parents e2d2da777af0
children 58dd8e127e4b
comparison
equal deleted inserted replaced
21:32db366529dd 22:b96b3244307b
73 73
74 74
75 <div class='slide'> 75 <div class='slide'>
76 76
77 <!-- _S9SLIDE_ --> 77 <!-- _S9SLIDE_ -->
78 <h2 id="研究背景">研究背景</h2> 78 <h2 id="スクリプト言語の高速実行">スクリプト言語の高速実行</h2>
79 <ul> 79 <ul>
80 <li>現在開発の進んでいる言語に Raku がある. 80 <li>現在多くのスクリプト言語はインタプリタ型言語であり, 実行時にインタプリタの立ち上げ, モジュールを読み込み, スクリプトの解釈, スクリプトの実行 といったような処理を担っている.</li>
81 スクリプト言語 Raku は任意の VM が選択できるようになっており, 主に利用されている VM に C で書かれた MoarVM が存在する.</li> 81 <li>これらの処理の中にはOS上で事前に行うことで, より起動時間, 及び処理時間の短縮が予想される.</li>
82 <li>MoarVM は JIT コンパイルなどをサポートしているが, 全体的な起動時間及び処理速度が Perl5 や Python , Ruby などの他のスクリプト言語と比較し非常に低速である. 82 <li>頻繁にコードを書き換え実行するスクリプト言語では起動時間をできるだけ短くしたい.</li>
83 その為, 現在日本国内では Raku は実務としてあまり使われていない.</li> 83 <li>その手法として同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案する</li>
84 <li>Raku の持つ言語機能や型システムは非常に柔軟かつ強力であるため, 実用的な処理速度に達すれば, 言語の利用件数が向上することが期待される.</li> 84 <li>この提案手法に沿って『Abyss サーバー』を実装した.</li>
85 </ul> 85 </ul>
86 86
87 87 <!--
88 88 ## 研究概要
89 </div> 89 - Raku の実装の一つであるRakudoは、Byte code である MoarVM と、それ上で動作する Raku のsubsetであるnqp (Not Quite Perl)上に構成されている。
90 90 - 現状のRakuの実行はRakuで記述されたコンパイラをloadしてJITしながら実行すること自体に時間がかかっている。
91 <div class='slide'> 91 - そこで, 同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案し実装する.
92 <!-- _S9SLIDE_ --> 92 -->
93 <h2 id="研究概要">研究概要</h2>
94 <ul>
95 <li>Raku の実装の一つであるRakudoは、Byte code である MoarVM と、それ上で動作する Raku のsubsetであるnqp (Not Quite Perl)上に構成されている。</li>
96 <li>現状のRakuの実行はRakuで記述されたコンパイラをloadしてJITしながら実行すること自体に時間がかかっている。</li>
97 <li>そこで, 同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案し実装する.</li>
98 </ul>
99 93
100 94
101 95
102 </div> 96 </div>
103 97
104 <div class='slide'> 98 <div class='slide'>
105 <!-- _S9SLIDE_ --> 99 <!-- _S9SLIDE_ -->
106 <h2 id="raku-と他言語の起動時間の比較">Raku と他言語の起動時間の比較</h2> 100 <h2 id="raku-と他言語の起動時間の比較">Raku と他言語の起動時間の比較</h2>
107 <ul> 101 <ul>
108 <li>perl6と他言語の起動時間の比較行なった.</li> 102 <li>Raku と他言語の起動時間の比較行なった.</li>
109 <li>実行環境</li> 103 <li>実行環境</li>
110 </ul> 104 </ul>
111 105
112 <pre><code>macOS Mojave version 10.14.5 106 <pre><code>macOS Mojave version 10.14.5
113 メモリ8GB 107 メモリ8GB
162 <p><img src="fig/Rakudo.svg" alt="" /></p> 156 <p><img src="fig/Rakudo.svg" alt="" /></p>
163 <ul> 157 <ul>
164 <li>Rakudoの構成</li> 158 <li>Rakudoの構成</li>
165 </ul> 159 </ul>
166 160
167 161 <!--
168 162 ## NQP
169 </div> 163 - NQPとはNot Quite Perl の略で Raku のサブセットである.
170 164 - 基本的な文法などは Raku に準拠しているが, 変数を束縛で宣言するなどの違いがある.
171 <div class='slide'> 165 - NQPコンパイラ自身もNQPで記述されている
172 <!-- _S9SLIDE_ --> 166 - NQP は MoarVM や JVMの違いを吸収してAPIを提供している
173 <h2 id="nqp">NQP</h2> 167
174 <ul> 168 ## MoarVM
175 <li>NQPとはNot Quite Perl の略で Raku のサブセットである.</li> 169 - MoarVM は Raku に特化したVM
176 <li>基本的な文法などは Raku に準拠しているが, 変数を束縛で宣言するなどの違いがある.</li> 170 - C 言語で実装されている
177 <li>NQPコンパイラ自身もNQPで記述されている</li> 171 - JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある
178 <li>NQP は MoarVM や JVMの違いを吸収してAPIを提供している</li> 172
179 </ul> 173 ## Perl6 の名称変更
180 174 - Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しないため別名がつけられました.
181 175 - 現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた.
182 176
183 </div> 177 ## Rakudoの語源
184 178 - ちなみに Rakudo の語源は, 楽土と駱駝道で
185 <div class='slide'> 179 - 楽土の方は日本語で「楽園」という意味で
186 <!-- _S9SLIDE_ --> 180 - 駱駝道の方は Perlのマスコットキャラクターが🐪だったからです
187 <h2 id="moarvm">MoarVM</h2> 181 - http://blogs.perl.org/users/zoffix_znet/2017/07/the-hot-new-language-named-rakudo.html
188 <ul> 182 -->
189 <li>MoarVM は Raku に特化したVM</li>
190 <li>C 言語で実装されている</li>
191 <li>JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある</li>
192 </ul>
193
194
195
196 </div>
197
198 <div class='slide'>
199 <!-- _S9SLIDE_ -->
200 <h2 id="perl6-の名称変更">Perl6 の名称変更</h2>
201 <ul>
202 <li>Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しないため別名がつけられました.</li>
203 <li>現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた.</li>
204 </ul>
205
206
207
208 </div>
209
210 <div class='slide'>
211 <!-- _S9SLIDE_ -->
212 <h2 id="rakudoの語源">Rakudoの語源</h2>
213 <ul>
214 <li>ちなみに Rakudo の語源は, 楽土と駱駝道で</li>
215 <li>楽土の方はLallyが楽に言語を作りたいという意味で Rakudo</li>
216 <li>駱駝道の方は Perlのマスコットキャラクターが🐪だったからです
217 <ul>
218 <li>http://blogs.perl.org/users/zoffix_znet/2017/07/the-hot-new-language-named-rakudo.html</li>
219 </ul>
220 </li>
221 </ul>
222 183
223 184
224 185
225 </div> 186 </div>
226 187
251 <li>下記の図は, Abyss Server を用いたスクリプト言語の実行手順です.</li> 212 <li>下記の図は, Abyss Server を用いたスクリプト言語の実行手順です.</li>
252 </ul> 213 </ul>
253 214
254 <p><img src="fig/Abyss.svg" alt="" /></p> 215 <p><img src="fig/Abyss.svg" alt="" /></p>
255 216
256 217 <!--
257 218 ## Raku の Unix domain socket 実装
258 </div> 219 - Unix domain socket でなくINET で実装した場合, 他者からスクリプトを送りつけられる可能性がある.
259 220 - そのため今回はUnix domain socket を用いて実装しました.
260 <div class='slide'> 221 - Rakuには現在Unix domain socketの実装がないため, Unix domain socket の実装を行なった.
261 <!-- _S9SLIDE_ --> 222 - IO::Socketがroleとして定義されている
262 <h2 id="raku-の-unix-domain-socket-実装">Raku の Unix domain socket 実装</h2> 223 - Raku での role は他の言語の interface に相当するものである
263 <ul> 224 - 現状 Raku にはIO::Socket::INETとIO::Socket::Asyncの実装がある
264 <li>Unix domain socket でなくINET で実装した場合, 他者からスクリプトを送りつけられる可能性がある. 225 - 先ほど上で説明したようにINETとAsyncはセキュリティの問題で使えない
265 <ul> 226 - IO::Socketを実装した IO::Socket::Unix を実装した
266 <li>そのため今回はUnix domain socket を用いて実装しました.</li> 227 - IO::Socket::Unixの中ではnqpの機能を使う必要がある
267 </ul> 228 -->
268 </li>
269 <li>Rakuには現在Unix domain socketの実装がないため, Unix domain socket の実装を行なった.</li>
270 <li>IO::Socketがroleとして定義されている
271 <ul>
272 <li>Raku での role は他の言語の interface に相当するものである</li>
273 </ul>
274 </li>
275 <li>現状 Raku にはIO::Socket::INETとIO::Socket::Asyncの実装がある
276 <ul>
277 <li>先ほど上で説明したようにINETとAsyncはセキュリティの問題で使えない</li>
278 </ul>
279 </li>
280 <li>IO::Socketを実装した IO::Socket::Unix を実装した
281 <ul>
282 <li>IO::Socket::Unixの中ではnqpの機能を使う必要がある</li>
283 </ul>
284 </li>
285 </ul>
286 229
287 230
288 231
289 </div> 232 </div>
290 233
365 <ul> 308 <ul>
366 <li>Abyss Server は起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後ファイルを受け取るための待機ループに入る.</li> 309 <li>Abyss Server は起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後ファイルを受け取るための待機ループに入る.</li>
367 <li>ファイルパスを受け取ると, ファイルを開き実行する.</li> 310 <li>ファイルパスを受け取ると, ファイルを開き実行する.</li>
368 </ul> 311 </ul>
369 312
370 <pre><code>unit class Abyss::Server:ver&lt;0.0.1&gt;; 313 <pre><code>sub close(int32) returns int32 is native { ... }
314 sub dup(int32 $old) returns int32 is native { ... }
315 sub dup2(int32 $new, int32 $old) returns int32 is native { ... }
316
317 method readeval
318 {
319 my $listen = IO::Socket::Unix.new( :listen,
320 :localhost&lt;localhost&gt;,
321 :localport(3333) );
322 my $backup = dup(1);
323 say DateTime.now;
324
325 loop
326 {
327 my $conn = $listen.accept;
328 my $sock_msg;
329 my $buf = $conn.recv();
330 $sock_msg = $buf;
331 close(1);
332 dup2($conn.native-descriptor(), 1);
333 EVALFILE $sock_msg;
334 dup2($backup, 1);
335 close($backup);
336 $conn.close;
337 }
338
339 $listen.close;
340 }}
341 </code></pre>
342
343
344
345 </div>
346
347 <div class='slide'>
348 <!-- _S9SLIDE_ -->
349 <h2 id="abyss-client側の実装">Abyss Client側の実装</h2>
350 <ul>
351 <li>ユーザーは Abyss Server を起動後,ファイルパスをサーバーに送信する.</li>
352 </ul>
353
354 <pre><code>my $conn = IO::Socket::INET.new( :host&lt;localhost&gt;,
355 :port(3333) );
356
357 $conn.print: 'Absolute file path';
358
359 say $conn.lines;
360
361 $conn.close;
362 </code></pre>
363 <!--
364 ## Raku のEVAL
365 - Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる
366 - Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.
367
368 ```
371 use MONKEY-SEE-NO-EVAL; 369 use MONKEY-SEE-NO-EVAL;
372 use IO::Socket::Unix;
373
374 method readeval {
375 my $listen = IO::Socket::Unix.new(
376 :listen,
377 :localhost&lt;localhost&gt;,
378 :localport(3333)
379 );
380 loop {
381 my $conn = $listen.accept;
382 while my $buf = $conn.read(1024) {
383 EVALFILE $buf.decode;
384 }
385 $conn.close;
386 }
387 }
388 </code></pre>
389
390
391
392 </div>
393
394 <div class='slide'>
395 <!-- _S9SLIDE_ -->
396 <h2 id="abyss-client側の実装">Abyss Client側の実装</h2>
397 <ul>
398 <li>ユーザーは Abyss Server を起動後,ファイルパスをサーバーに送信する.</li>
399 </ul>
400
401 <pre><code>use IO::Socket::Unix;
402
403 my $conn = IO::Socket::Unix.new( :host&lt;localhost&gt;,
404 :port(3333) );
405
406 $conn.print: 'FILEPASS';
407 </code></pre>
408
409
410
411 </div>
412
413 <div class='slide'>
414 <!-- _S9SLIDE_ -->
415 <h2 id="raku-のeval">Raku のEVAL</h2>
416 <ul>
417 <li>Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる</li>
418 <li>Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.</li>
419 </ul>
420
421 <pre><code>use MONKEY-SEE-NO-EVAL;
422 370
423 EVAL "say { 5 + 5 }"; # OUTPUT: 10 371 EVAL "say { 5 + 5 }"; # OUTPUT: 10
424 </code></pre> 372 ```
425 373
426 <ul> 374 - EVALFILEはファイルパスを受け取ると, ファイルの中身をバイト文字列に変換し, それをEVALと同様に解釈する.
427 <li>EVALFILEはファイルパスを受け取ると, ファイルの中身をバイト文字列に変換し, それをEVALと同様に解釈する.</li> 375 -->
428 </ul>
429 376
430 377
431 378
432 </div> 379 </div>
433 380
452 <div class='slide'> 399 <div class='slide'>
453 <!-- _S9SLIDE_ --> 400 <!-- _S9SLIDE_ -->
454 <h2 id="abyss-serverの欠点">Abyss Serverの欠点</h2> 401 <h2 id="abyss-serverの欠点">Abyss Serverの欠点</h2>
455 <ul> 402 <ul>
456 <li>現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある</li> 403 <li>現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある</li>
457 <li>Raku に eval の出力を socket に切り替える機能が存在しないので出力が Server 側に返ってしまい,ユーザー側に返ってこない</li>
458 <li>同時に二つ以上のタスクを与えられると実行順のスケジューリングができない 404 <li>同時に二つ以上のタスクを与えられると実行順のスケジューリングができない
459 <ul> 405 <ul>
460 <li>与えられた順番に処理していく</li> 406 <li>与えられた順番に処理していく</li>
461 </ul> 407 </ul>
462 </li> 408 </li>
476 <li>Raku にUnix domain socket の実装を行なった.</li> 422 <li>Raku にUnix domain socket の実装を行なった.</li>
477 <li>Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる</li> 423 <li>Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる</li>
478 <li>今後は一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組みを入れて開発を進めたいです.</li> 424 <li>今後は一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組みを入れて開発を進めたいです.</li>
479 </ul> 425 </ul>
480 426
481
482
483 </div>
484
485 <div class='slide'>
486 <!-- _S9SLIDE_ -->
487 <h2 id="raku-の実装に関わる様々な言語">Raku の実装に関わる様々な言語</h2>
488 <ul>
489 <li>Raku は, Larry wall により設計されたオブジェクト指向スクリプト言語である.</li>
490 <li>また Raku は漸進的型付け言語である.</li>
491 </ul>
492
493 <p><img src="fig/Raku.svg" alt="" /></p>
494
495
496
497 </div>
498
499 <div class='slide'>
500 <!-- _S9SLIDE_ -->
501 <h2 id="rakuの導入">Rakuの導入</h2>
502
503
504 </div> 427 </div>
505 428
506 429
507 </div><!-- presentation --> 430 </div><!-- presentation -->
508 </body> 431 </body>