comparison Slide/Slide.md @ 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
comparison
equal deleted inserted replaced
22:b96b3244307b 23:58dd8e127e4b
1 title: Perl6(Raku)のサーバーを使った高速実行 1 title: Raku(Perl6)のサーバーを使った高速実行
2 author: Kouki Fukuda, Shinji Kono 2 author: Kouki Fukuda, Shinji Kono
3 profile: 琉球大学 3 profile: 並列信頼研
4 4
5 ## スクリプト言語の高速実行 5 ## スクリプト言語の高速実行
6 - 現在多くのスクリプト言語はインタプリタ型言語であり, 実行時にインタプリタの立ち上げ, モジュールを読み込み, スクリプトの解釈, スクリプトの実行 といったような処理を担っている. 6 - 現在多くのスクリプト言語はインタプリタ型言語であり, 実行時にインタプリタの立ち上げ, モジュールを読み込み, スクリプトの解釈, スクリプトの実行 といったような処理を担っている.
7 - これらの処理の中にはOS上で事前に行うことで, より起動時間, 及び処理時間の短縮が予想される.
8 - 頻繁にコードを書き換え実行するスクリプト言語では起動時間をできるだけ短くしたい. 7 - 頻繁にコードを書き換え実行するスクリプト言語では起動時間をできるだけ短くしたい.
9 - その手法として同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案する 8 - その手法として同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案する
10 - この提案手法に沿って『Abyss サーバー』を実装した. 9 - この提案手法に沿って『Abyss サーバー』を実装した.
11 - またスクリプト言語の速度改善を行うにあたり, 本研究では Raku というスクリプト言語を用いた. 10
12 11 ##
13 <!-- 12 <!--
14 ## 研究概要 13 ## 研究概要
15 - Raku の実装の一つであるRakudoは、Byte code である MoarVM と、それ上で動作する Raku のsubsetであるnqp (Not Quite Perl)上に構成されている。 14 - Raku の実装の一つであるRakudoは、Byte code である MoarVM と、それ上で動作する Raku のsubsetであるnqp (Not Quite Perl)上に構成されている。
16 - 現状のRakuの実行はRakuで記述されたコンパイラをloadしてJITしながら実行すること自体に時間がかかっている。 15 - 現状のRakuの実行はRakuで記述されたコンパイラをloadしてJITしながら実行すること自体に時間がかかっている。
17 - そこで, 同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案し実装する. 16 - そこで, 同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案し実装する.
18 --> 17 -->
19 18
20 ## Raku と他言語の起動時間の比較 19 ## Raku と他言語の起動時間の比較
21 - Raku と他言語の起動時間の比較行なった. 20 - Raku と他言語の起動時間の比較行なった.
21
22 <!--
22 - 実行環境 23 - 実行環境
23
24 ``` 24 ```
25 macOS Mojave version 10.14.5 25 macOS Mojave version 10.14.5
26 メモリ8GB 26 メモリ8GB
27 プロセッサ2.7GHz Intel Core i5 27 プロセッサ2.7GHz Intel Core i5
28 ``` 28 ```
29 -->
29 30
30 - perl5,ruby,raku,pythonでhelloworldを出力するプログラムを用いて行なった実行結果である. 31 - perl5,ruby,raku,pythonでhelloworldを出力するプログラムを用いて行なった実行結果である.
31 <table style="border-collapse: collapse;" border="1" width="400" height="300"> 32 <table style="border-collapse: collapse;" border="1" width="400" height="300">
32 <tr> 33 <tr>
33 <th>Language</th> 34 <th>Language</th>
79 - 基本的な文法などは Raku に準拠しているが, 変数を束縛で宣言するなどの違いがある. 80 - 基本的な文法などは Raku に準拠しているが, 変数を束縛で宣言するなどの違いがある.
80 - NQPコンパイラ自身もNQPで記述されている 81 - NQPコンパイラ自身もNQPで記述されている
81 - NQP は MoarVM や JVMの違いを吸収してAPIを提供している 82 - NQP は MoarVM や JVMの違いを吸収してAPIを提供している
82 --> 83 -->
83 84
85 <!--
84 ## MoarVM 86 ## MoarVM
85 - MoarVM は Raku に特化したVM 87 - MoarVM は Raku に特化したVM
86 - C 言語で実装されている 88 - C 言語で実装されている
87 - JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある 89 - JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある
90 -->
88 91
89 <!-- 92 <!--
90 ## Perl6 の名称変更 93 ## Perl6 の名称変更
91 - Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しないため別名がつけられました. 94 - Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しないため別名がつけられました.
92 - 現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた. 95 - 現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた.
98 - http://blogs.perl.org/users/zoffix_znet/2017/07/the-hot-new-language-named-rakudo.html 101 - http://blogs.perl.org/users/zoffix_znet/2017/07/the-hot-new-language-named-rakudo.html
99 --> 102 -->
100 103
101 ## Rakuが遅い理由 104 ## Rakuが遅い理由
102 - 通常 Ruby のようなスクリプト言語ではまず YARV などのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む. 105 - 通常 Ruby のようなスクリプト言語ではまず YARV などのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む.
103 -
104 - Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して低速である. 106 - Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して低速である.
105 - これは Rakudo 自体が Raku と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである. 107 - これは Rakudo 自体が Raku と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである.
106 - また Raku は実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である. 108 - また Raku は実行する際に実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である.
107 - invoke はMoarVM の method 呼び出しのbyte codeです. 109 - invoke はMoarVM の method 呼び出しのbyte codeです.
108 110
109 ## Raku による Abyss Server の実装 111 ## Raku による Abyss Server の実装
110 - 提案手法に沿い『Abyss Server』を実装した. 112 - 提案手法に沿い『Abyss Server』を実装した.
111 - Abyss Server はUnix domain socketを用いて送信した Raku スクリプトを実行するための Server である. 113 - Abyss Server はUnix domain socketを用いて送信した Raku スクリプトを実行するための Server である.
136 138
137 ## 実行結果 139 ## 実行結果
138 140
139 - 通常実行 141 - 通常実行
140 - 0.2695 sec 142 - 0.2695 sec
141 - 0.2131 sec
142 - 0.3143 sec
143 143
144 - 提案手法 144 - 提案手法
145 - 0.0238 sec 145 - 0.0238 sec
146 - 0.0219 sec
147 - 0.0275 sec
148 146
149 - 提案手法は通常実行に比べて約10倍早い実行結果になった 147 - 提案手法は通常実行に比べて約10倍早い実行結果になった
150 148
151 ## フィボナッチ数列の例題 149 ## フィボナッチ数列の例題
152 150
188 close($backup); 186 close($backup);
189 $conn.close; 187 $conn.close;
190 } 188 }
191 189
192 $listen.close; 190 $listen.close;
193 }} 191 }
194 ``` 192 ```
195 193
196 ## Abyss Client側の実装 194 ## Abyss Client側の実装
197 - ユーザーは Abyss Server を起動後,ファイルパスをサーバーに送信する. 195 - ユーザーは Abyss Server を起動後,ファイルパスをサーバーに送信する.
198 196
199 ``` 197 ```
200 use IO::Socket::Unix; 198 my $conn = IO::Socket::Unix.new( :host<localhost>,
201
202 my $conn = IO::Socket::INET.new( :host<localhost>,
203 :port(3333) ); 199 :port(3333) );
204 200
205 $conn.print: 'Absolute file path'; 201 $conn.print: 'Absolute file path';
206 202
207 my $sock_msg; 203 my $sock_msg;
213 } 209 }
214 210
215 say $sock_msg; 211 say $sock_msg;
216 ``` 212 ```
217 213
218 <!--
219 ## Raku のEVAL 214 ## Raku のEVAL
220 - Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる 215 - Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる
221 - Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる. 216 - Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.
222 217
223 ``` 218 ```
225 220
226 EVAL "say { 5 + 5 }"; # OUTPUT: 10 221 EVAL "say { 5 + 5 }"; # OUTPUT: 10
227 ``` 222 ```
228 223
229 - EVALFILEはファイルパスを受け取ると, ファイルの中身をバイト文字列に変換し, それをEVALと同様に解釈する. 224 - EVALFILEはファイルパスを受け取ると, ファイルの中身をバイト文字列に変換し, それをEVALと同様に解釈する.
230 -->
231 225
232 ## Abyss Serverの利点 226 ## Abyss Serverの利点
233 - Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の起動時間を短縮できる. 227 - Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の起動時間を短縮できる.
234 - 約10倍早くなる 228 - 約10倍早くなる
235 - 一度投げられたスクリプトのバイトコード, もしくは計算結果をキャッシュで保存しておき, 再度実行する際に, そのキャッシュを用いてコンパイル時間を省くような仕組みを入れやすいと考えられる. 229 - 一度投げられたスクリプトのバイトコード, もしくは計算結果をキャッシュで保存しておき, 再度実行する際に, そのキャッシュを用いてコンパイル時間を省くような仕組みを入れやすいと考えられる.
237 - 普通のスクリプト言語だと実行するたびにforkして実行しインタプリタの立ち上げという処理になるが, プロセス毎回起動しなくて済む 231 - 普通のスクリプト言語だと実行するたびにforkして実行しインタプリタの立ち上げという処理になるが, プロセス毎回起動しなくて済む
238 232
239 ## Abyss Serverの欠点 233 ## Abyss Serverの欠点
240 - 現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある 234 - 現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある
241 - 同時に二つ以上のタスクを与えられると実行順のスケジューリングができない 235 - 同時に二つ以上のタスクを与えられると実行順のスケジューリングができない
242 - 与えられた順番に処理していく
243 - 異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない 236 - 異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない
244 - 起動時のオプションが選択出来ない 237 - 起動時のオプションが選択出来ない
245 238
246 ## OS上でスクリプト言語を実行する方法の改善点 239 ## OS上でスクリプト言語を実行する方法の改善点
247 - 240 - OS上でスクリプト言語を実行する際の最適な方法として,提案手法のように事前に起動したコンパイラを再利用する方法は有効であると考える
241 - またOS上でスクリプト言語を実行する際に, OS側で用意されてあるべきAPIとしては以下のようなものが挙げられる
242 - 提案手法のように一度立ち上げられたインタプリタを立ち上げたままにする
243 - 複数回投げられたスクリプトの実行結果もしくはbasic block を保存できる
244 - 実行するスクリプトの周りにあるJsonファイルをあらかじめParseしておく
248 245
249 ## まとめと今後の課題 246 ## まとめと今後の課題
250 - Raku の新たな実行方法の提案,及び実装を行なった. 247 - スクリプト言語 Raku の新たな実行方法の提案,及び提案手法に添って「Abyss Server」の実装を行なった.
251 - Raku にUnix domain socket の実装を行なった. 248 - Raku にUnix domain socket の実装を行なった.
252 - Raku の速度改善において, 同一ホスト内でサーバープロセスを生成し,サーバープロセス内であらかじめコンパイラを立ち上げて起き, 実行するファイル名を転送し,サーバープロセス上でコンパイルを行う手法は有効であると考えられる 249 - Raku を用いて「Abyss Server」の実装を行なった
253 - 今後は一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組みを入れて開発を進めたいです. 250 - また今後今後の課題としては以下のようなものが挙げられる
251 - 一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組み
252 - 複数タスクが投げられた場合の処理の実装