Mercurial > hg > Papers > 2020 > koo-thesis
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<0.0.1>; | 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<localhost>, | |
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<localhost>, | |
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<localhost>, | |
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<localhost>, | |
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> |