Mercurial > hg > Papers > 2020 > koo-thesis
changeset 23:58dd8e127e4b
update paper & Slide
author | e165727 <e165727@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 16 Feb 2020 20:49:19 +0900 |
parents | b96b3244307b |
children | 27f7561b1135 |
files | .DS_Store Paper/chapter4.tex Paper/chapter5.tex Paper/main.pdf Slide/Slide.html Slide/Slide.md Slide/Slide.pdf.html |
diffstat | 7 files changed, 200 insertions(+), 122 deletions(-) [+] |
line wrap: on
line diff
--- a/Paper/chapter4.tex Sun Feb 16 18:20:36 2020 +0900 +++ b/Paper/chapter4.tex Sun Feb 16 20:49:19 2020 +0900 @@ -23,7 +23,7 @@ \end{itemize} \section{Abyss Server の利点} - +Abyss Server の利点には以下のようなものが挙げられる. \begin{itemize} \item Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の起動時間を短縮できる. \item 一度投げられたスクリプトのバイトコード, もしくは計算結果をキャッシュで保存しておき, 再度実行する際に, そのキャッシュを用いてコンパイル時間を省くような仕組みを入れやすいと考えられる. @@ -32,7 +32,7 @@ \end{itemize} \section{Abyss Server の欠点} - +Abyss Server の欠点は以下のようなものが挙げられる. \begin{itemize} \item 現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある \item 同時に二つ以上のタスクを与えられると実行順のスケジューリングができない
--- a/Paper/chapter5.tex Sun Feb 16 18:20:36 2020 +0900 +++ b/Paper/chapter5.tex Sun Feb 16 20:49:19 2020 +0900 @@ -2,9 +2,18 @@ 本稿では実行する Raku スクリプトのファイル名をサーバーに転送し,コンパイラサーバーでコンパイルを行い実行する手法の提案を行なった. また, 提案手法に沿って「Abyss Server」を実装した. \\ -Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる +Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる \\ -今後のAbyssサーバーの開発において期待される改善点には以下のようなものがある \\ +OS上でスクリプト言語を実行する際の最適な方法として,提案手法のようにコンパイラを再利用する方法は有効である. \\ +またOS上でスクリプト言語を実行する際に, OS側で用意されてあるべきAPIとしては以下のようなものが挙げられる +\begin{itemize} +\item 提案手法のように一度立ち上げられたインタプリタを立ち上げたままにする機能 +\item 複数回投げられたスクリプトの実行結果もしくはbasic block を保存できる機能 +\item モジュールをRuntimeでロードする機能 +\item 実行するスクリプトの周りにあるJsonファイルをあらかじめParseしておく +\end{itemize} + +また今後のAbyssサーバーの開発において期待される改善点には以下のようなものがある \\ \begin{itemize} \item コンパイラの起動が遅い言語だけでなく, モジュールの読み込みが遅い言語などを, あらかじめサーバーを側でモジュールを読み込んでおき, それを利用してプログラムを実行する手法も応用できるように改良を行う. \item スクリプトを送る際にモジュールも送信する機能の追加
--- a/Slide/Slide.html Sun Feb 16 18:20:36 2020 +0900 +++ b/Slide/Slide.html Sun Feb 16 20:49:19 2020 +0900 @@ -7,7 +7,7 @@ <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> - <title>Perl6(Raku)のサーバーを使った高速実行</title> + <title>Raku(Perl6)のサーバーを使った高速実行</title> <meta name="generator" content="Slide Show (S9) v4.0.1 on Ruby 2.3.7 (2018-03-28) [universal.x86_64-darwin18]"> <meta name="author" content="Kouki Fukuda, Shinji Kono" > @@ -70,7 +70,7 @@ <tr> <td> <div align="center"> - <h1><font color="#808db5">Perl6(Raku)のサーバーを使った高速実行</font></h1> + <h1><font color="#808db5">Raku(Perl6)のサーバーを使った高速実行</font></h1> </div> </td> </tr> @@ -78,7 +78,7 @@ <td> <div align="left"> Kouki Fukuda, Shinji Kono - 琉球大学 + 並列信頼研 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;"> </div> </td> @@ -94,10 +94,11 @@ <h2 id="スクリプト言語の高速実行">スクリプト言語の高速実行</h2> <ul> <li>現在多くのスクリプト言語はインタプリタ型言語であり, 実行時にインタプリタの立ち上げ, モジュールを読み込み, スクリプトの解釈, スクリプトの実行 といったような処理を担っている.</li> - <li>これらの処理の中にはOS上で事前に行うことで, より起動時間, 及び処理時間の短縮が予想される.</li> + <li>これらの処理の中にはOS上で事前に行うことで, より起動時間, 及び処理時間の短縮が予想されるものもある.</li> <li>頻繁にコードを書き換え実行するスクリプト言語では起動時間をできるだけ短くしたい.</li> <li>その手法として同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案する</li> <li>この提案手法に沿って『Abyss サーバー』を実装した.</li> + <li>またスクリプト言語の速度改善を行うにあたり, 本研究では Raku というスクリプト言語を用いた.</li> </ul> <!-- @@ -116,13 +117,16 @@ <h2 id="raku-と他言語の起動時間の比較">Raku と他言語の起動時間の比較</h2> <ul> <li>Raku と他言語の起動時間の比較行なった.</li> - <li>実行環境</li> </ul> -<pre><code>macOS Mojave version 10.14.5 +<!-- +- 実行環境 +``` +macOS Mojave version 10.14.5 メモリ8GB プロセッサ2.7GHz Intel Core i5 -</code></pre> +``` +--> <ul> <li>perl5,ruby,raku,pythonでhelloworldを出力するプログラムを用いて行なった実行結果である.</li> @@ -132,47 +136,45 @@ <th>Language</th> <th>Version</th> <th>Time</th> + <th>Ratio</th> </tr> <tr> <td>raku</td> <td>2019.03.1</td> <td>249 ms</td> + <td>62.25</td> </tr> <tr> <td>perl5</td> <td>v5.18.4</td> <td>4 ms</td> + <td>1</td> </tr> <tr> <td>python</td> <td>2.7.10</td> <td>13 ms</td> + <td>3.25</td> </tr> <tr> <td>ruby</td> <td>2.3.7p456</td> <td>83 ms</td> + <td>20.75</td> </tr> </table> -<p>Raku は最も早い perl5 の約62.25倍, python の約19倍, ruby の約3倍起動速度が遅いことがわかる.</p> - - -</div> +<p>Perl5 を基準とすると Raku はその62.25倍と非常に起動時間が遅いことがわかる.</p> -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="rakudo">Rakudo</h2> -<ul> - <li>Rakudoとは現在のRakuの主力な実装である.(Raku は言語名, Rakudo はコンパイラ)</li> - <li>Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQP と Raku 自身で記述された Raku という構成である.</li> - <li>Rakudo は MoarVMの他に JVM やJava Script を動作環境として選択可能である.</li> -</ul> +<!-- +## Rakudo +- Rakudoとは現在のRakuの主力な実装である.(Raku は言語名, Rakudo はコンパイラ) +- Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQP と Raku 自身で記述された Raku という構成である. +- Rakudo は MoarVMの他に JVM やJava Script を動作環境として選択可能である. -<p><img src="fig/Rakudo.svg" alt="" /></p> -<ul> - <li>Rakudoの構成</li> -</ul> +![](fig/Rakudo.svg) +- Rakudoの構成 +--> <!-- ## NQP @@ -180,12 +182,16 @@ - 基本的な文法などは Raku に準拠しているが, 変数を束縛で宣言するなどの違いがある. - NQPコンパイラ自身もNQPで記述されている - NQP は MoarVM や JVMの違いを吸収してAPIを提供している +--> +<!-- ## MoarVM - MoarVM は Raku に特化したVM - C 言語で実装されている - JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある +--> +<!-- ## Perl6 の名称変更 - Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しないため別名がつけられました. - 現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた. @@ -208,7 +214,7 @@ <li>通常 Ruby のようなスクリプト言語ではまず YARV などのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む.</li> <li>Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して低速である.</li> <li>これは Rakudo 自体が Raku と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである.</li> - <li>また Raku は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. + <li>また Raku は実行する際に実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. <ul> <li>invoke はMoarVM の method 呼び出しのbyte codeです.</li> </ul> @@ -278,15 +284,11 @@ <li>通常実行 <ul> <li>0.2695 sec</li> - <li>0.2131 sec</li> - <li>0.3143 sec</li> </ul> </li> <li>提案手法 <ul> <li>0.0238 sec</li> - <li>0.0219 sec</li> - <li>0.0275 sec</li> </ul> </li> <li>提案手法は通常実行に比べて約10倍早い実行結果になった</li> @@ -353,7 +355,7 @@ } $listen.close; -}} +} </code></pre> @@ -367,28 +369,42 @@ <li>ユーザーは Abyss Server を起動後,ファイルパスをサーバーに送信する.</li> </ul> -<pre><code>my $conn = IO::Socket::INET.new( :host<localhost>, +<pre><code>my $conn = IO::Socket::Unix.new( :host<localhost>, :port(3333) ); $conn.print: 'Absolute file path'; -say $conn.lines; +my $sock_msg; -$conn.close; +while my $buf = $conn.recv(:bin) +{ + $sock_msg = $buf.decode; + last; +} + +say $sock_msg; </code></pre> -<!-- -## Raku のEVAL -- Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる -- Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる. + + + +</div> -``` -use MONKEY-SEE-NO-EVAL; +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="raku-のeval">Raku のEVAL</h2> +<ul> + <li>Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる</li> + <li>Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.</li> +</ul> + +<pre><code>use MONKEY-SEE-NO-EVAL; EVAL "say { 5 + 5 }"; # OUTPUT: 10 -``` +</code></pre> -- EVALFILEはファイルパスを受け取ると, ファイルの中身をバイト文字列に変換し, それをEVALと同様に解釈する. ---> +<ul> + <li>EVALFILEはファイルパスを受け取ると, ファイルの中身をバイト文字列に変換し, それをEVALと同様に解釈する.</li> +</ul> @@ -417,11 +433,7 @@ <h2 id="abyss-serverの欠点">Abyss Serverの欠点</h2> <ul> <li>現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある</li> - <li>同時に二つ以上のタスクを与えられると実行順のスケジューリングができない - <ul> - <li>与えられた順番に処理していく</li> - </ul> - </li> + <li>同時に二つ以上のタスクを与えられると実行順のスケジューリングができない</li> <li>異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない</li> <li>起動時のオプションが選択出来ない</li> </ul> @@ -432,12 +444,35 @@ <div class='slide'> <!-- _S9SLIDE_ --> +<h2 id="os上でスクリプト言語を実行する方法の改善点">OS上でスクリプト言語を実行する方法の改善点</h2> +<ul> + <li>OS上でスクリプト言語を実行する際の最適な方法として,提案手法のように事前に起動したコンパイラを再利用する方法は有効であると考える</li> + <li>またOS上でスクリプト言語を実行する際に, OS側で用意されてあるべきAPIとしては以下のようなものが挙げられる + <ul> + <li>提案手法のように一度立ち上げられたインタプリタを立ち上げたままにする機能</li> + <li>複数回投げられたスクリプトの実行結果もしくはbasic block を保存できる機能</li> + <li>実行するスクリプトの周りにあるJsonファイルをあらかじめParseしておく機能</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> <h2 id="まとめと今後の課題">まとめと今後の課題</h2> <ul> - <li>Raku の新たな実行方法の提案,及び実装を行なった.</li> + <li>スクリプト言語 Raku の新たな実行方法の提案,及び提案手法に添って「Abyss Server」の実装を行なった.</li> <li>Raku にUnix domain socket の実装を行なった.</li> <li>Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる</li> - <li>今後は一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組みを入れて開発を進めたいです.</li> + <li>また今後今後の課題としては以下のようなものが挙げられる + <ul> + <li>一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組み</li> + <li>複数タスクが投げられた場合の処理の実装</li> + </ul> + </li> </ul> </div>
--- a/Slide/Slide.md Sun Feb 16 18:20:36 2020 +0900 +++ b/Slide/Slide.md Sun Feb 16 20:49:19 2020 +0900 @@ -1,15 +1,14 @@ -title: Perl6(Raku)のサーバーを使った高速実行 +title: Raku(Perl6)のサーバーを使った高速実行 author: Kouki Fukuda, Shinji Kono -profile: 琉球大学 +profile: 並列信頼研 ## スクリプト言語の高速実行 - 現在多くのスクリプト言語はインタプリタ型言語であり, 実行時にインタプリタの立ち上げ, モジュールを読み込み, スクリプトの解釈, スクリプトの実行 といったような処理を担っている. - - これらの処理の中にはOS上で事前に行うことで, より起動時間, 及び処理時間の短縮が予想される. - 頻繁にコードを書き換え実行するスクリプト言語では起動時間をできるだけ短くしたい. - その手法として同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案する - この提案手法に沿って『Abyss サーバー』を実装した. - - またスクリプト言語の速度改善を行うにあたり, 本研究では Raku というスクリプト言語を用いた. +## <!-- ## 研究概要 - Raku の実装の一つであるRakudoは、Byte code である MoarVM と、それ上で動作する Raku のsubsetであるnqp (Not Quite Perl)上に構成されている。 @@ -19,13 +18,15 @@ ## Raku と他言語の起動時間の比較 - Raku と他言語の起動時間の比較行なった. + +<!-- - 実行環境 - ``` macOS Mojave version 10.14.5 メモリ8GB プロセッサ2.7GHz Intel Core i5 ``` +--> - perl5,ruby,raku,pythonでhelloworldを出力するプログラムを用いて行なった実行結果である. <table style="border-collapse: collapse;" border="1" width="400" height="300"> @@ -81,10 +82,12 @@ - NQP は MoarVM や JVMの違いを吸収してAPIを提供している --> +<!-- ## MoarVM - MoarVM は Raku に特化したVM - C 言語で実装されている - JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある +--> <!-- ## Perl6 の名称変更 @@ -100,10 +103,9 @@ ## Rakuが遅い理由 - 通常 Ruby のようなスクリプト言語ではまず YARV などのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む. -- - Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して低速である. - これは Rakudo 自体が Raku と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである. -- また Raku は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. +- また Raku は実行する際に実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. - invoke はMoarVM の method 呼び出しのbyte codeです. ## Raku による Abyss Server の実装 @@ -138,13 +140,9 @@ - 通常実行 - 0.2695 sec - - 0.2131 sec - - 0.3143 sec - 提案手法 - 0.0238 sec - - 0.0219 sec - - 0.0275 sec - 提案手法は通常実行に比べて約10倍早い実行結果になった @@ -190,16 +188,14 @@ } $listen.close; -}} +} ``` ## Abyss Client側の実装 - ユーザーは Abyss Server を起動後,ファイルパスをサーバーに送信する. ``` -use IO::Socket::Unix; - -my $conn = IO::Socket::INET.new( :host<localhost>, +my $conn = IO::Socket::Unix.new( :host<localhost>, :port(3333) ); $conn.print: 'Absolute file path'; @@ -215,7 +211,6 @@ say $sock_msg; ``` -<!-- ## Raku のEVAL - Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる - Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる. @@ -227,7 +222,6 @@ ``` - EVALFILEはファイルパスを受け取ると, ファイルの中身をバイト文字列に変換し, それをEVALと同様に解釈する. ---> ## Abyss Serverの利点 - Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の起動時間を短縮できる. @@ -239,15 +233,20 @@ ## Abyss Serverの欠点 - 現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある - 同時に二つ以上のタスクを与えられると実行順のスケジューリングができない - - 与えられた順番に処理していく - 異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない - 起動時のオプションが選択出来ない ## OS上でスクリプト言語を実行する方法の改善点 -- +- OS上でスクリプト言語を実行する際の最適な方法として,提案手法のように事前に起動したコンパイラを再利用する方法は有効であると考える +- またOS上でスクリプト言語を実行する際に, OS側で用意されてあるべきAPIとしては以下のようなものが挙げられる + - 提案手法のように一度立ち上げられたインタプリタを立ち上げたままにする + - 複数回投げられたスクリプトの実行結果もしくはbasic block を保存できる + - 実行するスクリプトの周りにあるJsonファイルをあらかじめParseしておく ## まとめと今後の課題 -- Raku の新たな実行方法の提案,及び実装を行なった. +- スクリプト言語 Raku の新たな実行方法の提案,及び提案手法に添って「Abyss Server」の実装を行なった. - Raku にUnix domain socket の実装を行なった. -- Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる -- 今後は一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組みを入れて開発を進めたいです. +- Raku を用いて「Abyss Server」の実装を行なった +- また今後今後の課題としては以下のようなものが挙げられる + - 一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組み + - 複数タスクが投げられた場合の処理の実装
--- a/Slide/Slide.pdf.html Sun Feb 16 18:20:36 2020 +0900 +++ b/Slide/Slide.pdf.html Sun Feb 16 20:49:19 2020 +0900 @@ -7,7 +7,7 @@ <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> - <title>Perl6(Raku)のサーバーを使った高速実行</title> + <title>Raku(Perl6)のサーバーを使った高速実行</title> <meta name="generator" content="Slide Show (S9) v4.0.1 on Ruby 2.3.7 (2018-03-28) [universal.x86_64-darwin18]"> <meta name="author" content="Kouki Fukuda, Shinji Kono" > @@ -55,7 +55,7 @@ <tr> <td> <div align="center"> - <h1><font color="#808db5">Perl6(Raku)のサーバーを使った高速実行</font></h1> + <h1><font color="#808db5">Raku(Perl6)のサーバーを使った高速実行</font></h1> </div> </td> </tr> @@ -63,7 +63,7 @@ <td> <div align="left"> Kouki Fukuda, Shinji Kono - 琉球大学 + 並列信頼研 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;"> </div> </td> @@ -78,10 +78,11 @@ <h2 id="スクリプト言語の高速実行">スクリプト言語の高速実行</h2> <ul> <li>現在多くのスクリプト言語はインタプリタ型言語であり, 実行時にインタプリタの立ち上げ, モジュールを読み込み, スクリプトの解釈, スクリプトの実行 といったような処理を担っている.</li> - <li>これらの処理の中にはOS上で事前に行うことで, より起動時間, 及び処理時間の短縮が予想される.</li> + <li>これらの処理の中にはOS上で事前に行うことで, より起動時間, 及び処理時間の短縮が予想されるものもある.</li> <li>頻繁にコードを書き換え実行するスクリプト言語では起動時間をできるだけ短くしたい.</li> <li>その手法として同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案する</li> <li>この提案手法に沿って『Abyss サーバー』を実装した.</li> + <li>またスクリプト言語の速度改善を行うにあたり, 本研究では Raku というスクリプト言語を用いた.</li> </ul> <!-- @@ -100,13 +101,16 @@ <h2 id="raku-と他言語の起動時間の比較">Raku と他言語の起動時間の比較</h2> <ul> <li>Raku と他言語の起動時間の比較行なった.</li> - <li>実行環境</li> </ul> -<pre><code>macOS Mojave version 10.14.5 +<!-- +- 実行環境 +``` +macOS Mojave version 10.14.5 メモリ8GB プロセッサ2.7GHz Intel Core i5 -</code></pre> +``` +--> <ul> <li>perl5,ruby,raku,pythonでhelloworldを出力するプログラムを用いて行なった実行結果である.</li> @@ -116,47 +120,45 @@ <th>Language</th> <th>Version</th> <th>Time</th> + <th>Ratio</th> </tr> <tr> <td>raku</td> <td>2019.03.1</td> <td>249 ms</td> + <td>62.25</td> </tr> <tr> <td>perl5</td> <td>v5.18.4</td> <td>4 ms</td> + <td>1</td> </tr> <tr> <td>python</td> <td>2.7.10</td> <td>13 ms</td> + <td>3.25</td> </tr> <tr> <td>ruby</td> <td>2.3.7p456</td> <td>83 ms</td> + <td>20.75</td> </tr> </table> -<p>Raku は最も早い perl5 の約62.25倍, python の約19倍, ruby の約3倍起動速度が遅いことがわかる.</p> - - -</div> +<p>Perl5 を基準とすると Raku はその62.25倍と非常に起動時間が遅いことがわかる.</p> -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="rakudo">Rakudo</h2> -<ul> - <li>Rakudoとは現在のRakuの主力な実装である.(Raku は言語名, Rakudo はコンパイラ)</li> - <li>Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQP と Raku 自身で記述された Raku という構成である.</li> - <li>Rakudo は MoarVMの他に JVM やJava Script を動作環境として選択可能である.</li> -</ul> +<!-- +## Rakudo +- Rakudoとは現在のRakuの主力な実装である.(Raku は言語名, Rakudo はコンパイラ) +- Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQP と Raku 自身で記述された Raku という構成である. +- Rakudo は MoarVMの他に JVM やJava Script を動作環境として選択可能である. -<p><img src="fig/Rakudo.svg" alt="" /></p> -<ul> - <li>Rakudoの構成</li> -</ul> +![](fig/Rakudo.svg) +- Rakudoの構成 +--> <!-- ## NQP @@ -164,12 +166,16 @@ - 基本的な文法などは Raku に準拠しているが, 変数を束縛で宣言するなどの違いがある. - NQPコンパイラ自身もNQPで記述されている - NQP は MoarVM や JVMの違いを吸収してAPIを提供している +--> +<!-- ## MoarVM - MoarVM は Raku に特化したVM - C 言語で実装されている - JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある +--> +<!-- ## Perl6 の名称変更 - Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しないため別名がつけられました. - 現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた. @@ -192,7 +198,7 @@ <li>通常 Ruby のようなスクリプト言語ではまず YARV などのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む.</li> <li>Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して低速である.</li> <li>これは Rakudo 自体が Raku と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである.</li> - <li>また Raku は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. + <li>また Raku は実行する際に実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. <ul> <li>invoke はMoarVM の method 呼び出しのbyte codeです.</li> </ul> @@ -262,15 +268,11 @@ <li>通常実行 <ul> <li>0.2695 sec</li> - <li>0.2131 sec</li> - <li>0.3143 sec</li> </ul> </li> <li>提案手法 <ul> <li>0.0238 sec</li> - <li>0.0219 sec</li> - <li>0.0275 sec</li> </ul> </li> <li>提案手法は通常実行に比べて約10倍早い実行結果になった</li> @@ -337,7 +339,7 @@ } $listen.close; -}} +} </code></pre> @@ -351,28 +353,42 @@ <li>ユーザーは Abyss Server を起動後,ファイルパスをサーバーに送信する.</li> </ul> -<pre><code>my $conn = IO::Socket::INET.new( :host<localhost>, +<pre><code>my $conn = IO::Socket::Unix.new( :host<localhost>, :port(3333) ); $conn.print: 'Absolute file path'; -say $conn.lines; +my $sock_msg; -$conn.close; +while my $buf = $conn.recv(:bin) +{ + $sock_msg = $buf.decode; + last; +} + +say $sock_msg; </code></pre> -<!-- -## Raku のEVAL -- Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる -- Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる. + + + +</div> -``` -use MONKEY-SEE-NO-EVAL; +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="raku-のeval">Raku のEVAL</h2> +<ul> + <li>Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる</li> + <li>Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.</li> +</ul> + +<pre><code>use MONKEY-SEE-NO-EVAL; EVAL "say { 5 + 5 }"; # OUTPUT: 10 -``` +</code></pre> -- EVALFILEはファイルパスを受け取ると, ファイルの中身をバイト文字列に変換し, それをEVALと同様に解釈する. ---> +<ul> + <li>EVALFILEはファイルパスを受け取ると, ファイルの中身をバイト文字列に変換し, それをEVALと同様に解釈する.</li> +</ul> @@ -401,11 +417,7 @@ <h2 id="abyss-serverの欠点">Abyss Serverの欠点</h2> <ul> <li>現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある</li> - <li>同時に二つ以上のタスクを与えられると実行順のスケジューリングができない - <ul> - <li>与えられた順番に処理していく</li> - </ul> - </li> + <li>同時に二つ以上のタスクを与えられると実行順のスケジューリングができない</li> <li>異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない</li> <li>起動時のオプションが選択出来ない</li> </ul> @@ -416,12 +428,35 @@ <div class='slide'> <!-- _S9SLIDE_ --> +<h2 id="os上でスクリプト言語を実行する方法の改善点">OS上でスクリプト言語を実行する方法の改善点</h2> +<ul> + <li>OS上でスクリプト言語を実行する際の最適な方法として,提案手法のように事前に起動したコンパイラを再利用する方法は有効であると考える</li> + <li>またOS上でスクリプト言語を実行する際に, OS側で用意されてあるべきAPIとしては以下のようなものが挙げられる + <ul> + <li>提案手法のように一度立ち上げられたインタプリタを立ち上げたままにする機能</li> + <li>複数回投げられたスクリプトの実行結果もしくはbasic block を保存できる機能</li> + <li>実行するスクリプトの周りにあるJsonファイルをあらかじめParseしておく機能</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> <h2 id="まとめと今後の課題">まとめと今後の課題</h2> <ul> - <li>Raku の新たな実行方法の提案,及び実装を行なった.</li> + <li>スクリプト言語 Raku の新たな実行方法の提案,及び提案手法に添って「Abyss Server」の実装を行なった.</li> <li>Raku にUnix domain socket の実装を行なった.</li> <li>Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる</li> - <li>今後は一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組みを入れて開発を進めたいです.</li> + <li>また今後今後の課題としては以下のようなものが挙げられる + <ul> + <li>一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組み</li> + <li>複数タスクが投げられた場合の処理の実装</li> + </ul> + </li> </ul> </div>