annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
1 title: Raku(Perl6)のサーバーを使った高速実行
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 author: Kouki Fukuda, Shinji Kono
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
3 profile: 並列信頼研
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
5 ## スクリプト言語の高速実行
16
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
6 - 現在多くのスクリプト言語はインタプリタ型言語であり, 実行時にインタプリタの立ち上げ, モジュールを読み込み, スクリプトの解釈, スクリプトの実行 といったような処理を担っている.
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
7 - 頻繁にコードを書き換え実行するスクリプト言語では起動時間をできるだけ短くしたい.
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
8 - その手法として同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案する
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
9 - この提案手法に沿って『Abyss サーバー』を実装した.
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
11 ##
16
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
12 <!--
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 ## 研究概要
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 - Raku の実装の一つであるRakudoは、Byte code である MoarVM と、それ上で動作する Raku のsubsetであるnqp (Not Quite Perl)上に構成されている。
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 - 現状のRakuの実行はRakuで記述されたコンパイラをloadしてJITしながら実行すること自体に時間がかかっている。
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 - そこで, 同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案し実装する.
16
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
17 -->
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 ## Raku と他言語の起動時間の比較
16
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
20 - Raku と他言語の起動時間の比較行なった.
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
21
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
22 <!--
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 - 実行環境
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 ```
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 macOS Mojave version 10.14.5
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 メモリ8GB
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 プロセッサ2.7GHz Intel Core i5
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 ```
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
29 -->
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
15
e2d2da777af0 update Slide & add NativeCall section
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
31 - perl5,ruby,raku,pythonでhelloworldを出力するプログラムを用いて行なった実行結果である.
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 <table style="border-collapse: collapse;" border="1" width="400" height="300">
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 <tr>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 <th>Language</th>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 <th>Version</th>
15
e2d2da777af0 update Slide & add NativeCall section
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
36 <th>Time</th>
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
37 <th>Ratio</th>
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 </tr>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 <tr>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 <td>raku</td>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 <td>2019.03.1</td>
15
e2d2da777af0 update Slide & add NativeCall section
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
42 <td>249 ms</td>
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
43 <td>62.25</td>
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 </tr>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 <tr>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 <td>perl5</td>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 <td>v5.18.4</td>
15
e2d2da777af0 update Slide & add NativeCall section
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
48 <td>4 ms</td>
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
49 <td>1</td>
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 </tr>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 <tr>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 <td>python</td>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 <td>2.7.10</td>
15
e2d2da777af0 update Slide & add NativeCall section
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
54 <td>13 ms</td>
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
55 <td>3.25</td>
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 </tr>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 <tr>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 <td>ruby</td>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 <td>2.3.7p456</td>
15
e2d2da777af0 update Slide & add NativeCall section
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
60 <td>83 ms</td>
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
61 <td>20.75</td>
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 </tr>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 </table>
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
65 Perl5 を基準とすると Raku はその62.25倍と非常に起動時間が遅いことがわかる.
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
66
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
67 <!--
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 ## Rakudo
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 - Rakudoとは現在のRakuの主力な実装である.(Raku は言語名, Rakudo はコンパイラ)
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 - Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQP と Raku 自身で記述された Raku という構成である.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 - Rakudo は MoarVMの他に JVM やJava Script を動作環境として選択可能である.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 ![](fig/Rakudo.svg)
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 - Rakudoの構成
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
75 -->
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
77 <!--
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 ## NQP
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 - NQPとはNot Quite Perl の略で Raku のサブセットである.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 - 基本的な文法などは Raku に準拠しているが, 変数を束縛で宣言するなどの違いがある.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 - NQPコンパイラ自身もNQPで記述されている
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 - NQP は MoarVM や JVMの違いを吸収してAPIを提供している
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
83 -->
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
85 <!--
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 ## MoarVM
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 - MoarVM は Raku に特化したVM
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 - C 言語で実装されている
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 - JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
90 -->
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
92 <!--
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 ## Perl6 の名称変更
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 - Raku はPerlの次期メジャーバージョンとして設計が始められ, 元々Perl6という名称であったが, Perl6 は言語仕様及び処理実装が Perl5 と大幅に異なっており, 言語的な互換性が存在しないため別名がつけられました.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 - 現在有力な処理系である Rakudo から名前を取り Raku という別名がつけられた.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 ## Rakudoの語源
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 - ちなみに Rakudo の語源は, 楽土と駱駝道で
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
99 - 楽土の方は日本語で「楽園」という意味で
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 - 駱駝道の方は Perlのマスコットキャラクターが🐪だったからです
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 - http://blogs.perl.org/users/zoffix_znet/2017/07/the-hot-new-language-named-rakudo.html
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
102 -->
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 ## Rakuが遅い理由
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 - 通常 Ruby のようなスクリプト言語ではまず YARV などのプロセスVM が起動し,その後スクリプトを Byte code に変換して実行という手順を踏む.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 - Rakudo はインタプリタの起動時間及び, 全体的な処理時間が他のスクリプト言語と比較して低速である.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 - これは Rakudo 自体が Raku と NQP で書かれているため, MoarVMを起動し, Rakudo と NQP のByte codeを読み取り, Rakudoを起動し, その後スクリプトを読み取り, スクリプトの Byte code 変換というような手順で進むためである.
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
108 - また Raku は実行する際に実行時の情報が必要であり, メソッドを実行する際に invoke が走ることも遅い原因である.
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 - invoke はMoarVM の method 呼び出しのbyte codeです.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 ## Raku による Abyss Server の実装
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 - 提案手法に沿い『Abyss Server』を実装した.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 - Abyss Server はUnix domain socketを用いて送信した Raku スクリプトを実行するための Server である.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 - 下記の図は, Abyss Server を用いたスクリプト言語の実行手順です.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 ![](fig/Abyss.svg)
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
118 <!--
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 ## Raku の Unix domain socket 実装
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 - Unix domain socket でなくINET で実装した場合, 他者からスクリプトを送りつけられる可能性がある.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 - そのため今回はUnix domain socket を用いて実装しました.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 - Rakuには現在Unix domain socketの実装がないため, Unix domain socket の実装を行なった.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 - IO::Socketがroleとして定義されている
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 - Raku での role は他の言語の interface に相当するものである
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 - 現状 Raku にはIO::Socket::INETとIO::Socket::Asyncの実装がある
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 - 先ほど上で説明したようにINETとAsyncはセキュリティの問題で使えない
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 - IO::Socketを実装した IO::Socket::Unix を実装した
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 - IO::Socket::Unixの中ではnqpの機能を使う必要がある
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
129 -->
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
130
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 ## 通常実行と提案手法の速度比較
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 - 今回は,提案手法での実行速度と通常実行での実行速度, この二つの速度の比較を行う
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 - 題材として行うのはhelloworldを出力するだけのプログラムとフィボナッチ数列の例題である.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 ## 予測
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 - 前述した通り, Raku はコンパイラの起動に時間がかかっているため, 提案手法を用いることで起動時間分早く実行することができると予測する.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 ## 実行結果
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 - 通常実行
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 - 0.2695 sec
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 - 提案手法
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 - 0.0238 sec
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 - 提案手法は通常実行に比べて約10倍早い実行結果になった
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 ## フィボナッチ数列の例題
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 - 通常実行
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 - 0.2128 sec
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 - 提案手法
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 - 0.0415 sec
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 - 先ほどと同様,提案手法は通常実行に比べて早い結果となり,約5倍早い実行結果になった
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 ## Abyss Server側の実装
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 - Abyss Server は起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後ファイルを受け取るための待機ループに入る.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 - ファイルパスを受け取ると, ファイルを開き実行する.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 ```
16
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
164 sub close(int32) returns int32 is native { ... }
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
165 sub dup(int32 $old) returns int32 is native { ... }
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
166 sub dup2(int32 $new, int32 $old) returns int32 is native { ... }
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
167
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
168 method readeval
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
169 {
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
170 my $listen = IO::Socket::Unix.new( :listen,
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
171 :localhost<localhost>,
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
172 :localport(3333) );
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
173 my $backup = dup(1);
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
174 say DateTime.now;
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
175
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
176 loop
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
177 {
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
178 my $conn = $listen.accept;
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
179 my $sock_msg;
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
180 my $buf = $conn.recv();
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
181 $sock_msg = $buf;
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
182 close(1);
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
183 dup2($conn.native-descriptor(), 1);
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
184 EVALFILE $sock_msg;
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
185 dup2($backup, 1);
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
186 close($backup);
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
187 $conn.close;
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 }
16
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
189
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
190 $listen.close;
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
191 }
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 ```
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 ## Abyss Client側の実装
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 - ユーザーは Abyss Server を起動後,ファイルパスをサーバーに送信する.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 ```
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
198 my $conn = IO::Socket::Unix.new( :host<localhost>,
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 :port(3333) );
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200
16
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
201 $conn.print: 'Absolute file path';
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
202
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
203 my $sock_msg;
16
05eac76e8c24 update paper
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
204
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
205 while my $buf = $conn.recv(:bin)
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
206 {
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
207 $sock_msg = $buf.decode;
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
208 last;
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
209 }
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
210
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
211 say $sock_msg;
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 ```
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 ## Raku のEVAL
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 - Raku では EVAL 関数があり文字列を Raku のソースコード自身として評価できる
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 - Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 ```
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 use MONKEY-SEE-NO-EVAL;
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 EVAL "say { 5 + 5 }"; # OUTPUT: 10
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 ```
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 - EVALFILEはファイルパスを受け取ると, ファイルの中身をバイト文字列に変換し, それをEVALと同様に解釈する.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 ## Abyss Serverの利点
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 - Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Raku スクリプトの実行を行うため, Rakudo の起動時間を短縮できる.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 - 約10倍早くなる
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 - 一度投げられたスクリプトのバイトコード, もしくは計算結果をキャッシュで保存しておき, 再度実行する際に, そのキャッシュを用いてコンパイル時間を省くような仕組みを入れやすいと考えられる.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 - 他の起動時間遅いスクリプト言語や, モジュールの読み込みが遅い言語などにも, 応用しやすいと考えられる.
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 - 普通のスクリプト言語だと実行するたびにforkして実行しインタプリタの立ち上げという処理になるが, プロセス毎回起動しなくて済む
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 ## Abyss Serverの欠点
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 - 現在 Abyss Server には 一度スクリプトを実行した後にサーバー内の環境をリセットする機能が存在しないため,スクリプトがサーバー内の環境に影響を及ぼした場合,通常実行と違う挙動をする危険性がある
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 - 同時に二つ以上のタスクを与えられると実行順のスケジューリングができない
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 - 異常に長いタスクが投げられた場合, 次のタスクが前のタスクが終わるまで実行ができない
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 - 起動時のオプションが選択出来ない
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
239 ## OS上でスクリプト言語を実行する方法の改善点
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
240 - OS上でスクリプト言語を実行する際の最適な方法として,提案手法のように事前に起動したコンパイラを再利用する方法は有効であると考える
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
241 - またOS上でスクリプト言語を実行する際に, OS側で用意されてあるべきAPIとしては以下のようなものが挙げられる
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
242 - 提案手法のように一度立ち上げられたインタプリタを立ち上げたままにする
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
243 - 複数回投げられたスクリプトの実行結果もしくはbasic block を保存できる
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
244 - 実行するスクリプトの周りにあるJsonファイルをあらかじめParseしておく
22
b96b3244307b update paper & slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
245
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 ## まとめと今後の課題
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
247 - スクリプト言語 Raku の新たな実行方法の提案,及び提案手法に添って「Abyss Server」の実装を行なった.
7
d38af6a6aece add Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 - Raku にUnix domain socket の実装を行なった.
23
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
249 - Raku を用いて「Abyss Server」の実装を行なった
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
250 - また今後今後の課題としては以下のようなものが挙げられる
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
251 - 一度投げられたスクリプトをキャッシュで保存しておき,再度実行する際に,そのキャッシュを用いてコンパイル時間を省くような仕組み
58dd8e127e4b update paper & Slide
e165727 <e165727@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
252 - 複数タスクが投げられた場合の処理の実装