Mercurial > hg > Papers > 2020 > koo-thesis
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 - 複数タスクが投げられた場合の処理の実装 |