7
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6 <!DOCTYPE html>
|
|
7 <html>
|
|
8 <head>
|
|
9 <meta http-equiv="content-type" content="text/html;charset=utf-8">
|
|
10 <title>Perl6(Raku)のサーバーを使った高速実行</title>
|
|
11
|
|
12 <meta name="generator" content="Slide Show (S9) v4.0.1 on Ruby 2.3.7 (2018-03-28) [universal.x86_64-darwin18]">
|
|
13 <meta name="author" content="Kouki Fukuda, Shinji Kono" >
|
|
14
|
|
15 <!-- style sheet links -->
|
|
16 <link rel="stylesheet" href="s6/themes/projection.css" media="screen,projection">
|
|
17 <link rel="stylesheet" href="s6/themes/screen.css" media="screen">
|
|
18 <link rel="stylesheet" href="s6/themes/print.css" media="print">
|
|
19 <link rel="stylesheet" href="s6/themes/blank.css" media="screen,projection">
|
|
20
|
|
21 <!-- JS -->
|
|
22 <script src="s6/js/jquery-1.11.3.min.js"></script>
|
|
23 <script src="s6/js/jquery.slideshow.js"></script>
|
|
24 <script src="s6/js/jquery.slideshow.counter.js"></script>
|
|
25 <script src="s6/js/jquery.slideshow.controls.js"></script>
|
|
26 <script src="s6/js/jquery.slideshow.footer.js"></script>
|
|
27 <script src="s6/js/jquery.slideshow.autoplay.js"></script>
|
|
28
|
|
29 <!-- prettify -->
|
|
30 <link rel="stylesheet" href="scripts/prettify.css">
|
|
31 <script src="scripts/prettify.js"></script>
|
|
32
|
|
33 <script>
|
|
34 $(document).ready( function() {
|
|
35 Slideshow.init();
|
|
36
|
|
37 $('code').each(function(_, el) {
|
|
38 if (!el.classList.contains('noprettyprint')) {
|
|
39 el.classList.add('prettyprint');
|
|
40 }
|
|
41 });
|
|
42 prettyPrint();
|
|
43 } );
|
|
44
|
|
45 </script>
|
|
46
|
|
47 <!-- Better Browser Banner for Microsoft Internet Explorer (IE) -->
|
|
48 <!--[if IE]>
|
|
49 <script src="s6/js/jquery.microsoft.js"></script>
|
|
50 <![endif]-->
|
|
51
|
|
52
|
|
53
|
|
54 </head>
|
|
55 <body>
|
|
56
|
|
57 <div class="layout">
|
|
58 <div id="header"></div>
|
|
59 <div id="footer">
|
|
60 <div align="right">
|
|
61 <img src="s6/images/logo.svg" width="200px">
|
|
62 </div>
|
|
63 </div>
|
|
64 </div>
|
|
65
|
|
66 <div class="presentation">
|
|
67
|
|
68 <div class='slide cover'>
|
|
69 <table width="90%" height="90%" border="0" align="center">
|
|
70 <tr>
|
|
71 <td>
|
|
72 <div align="center">
|
|
73 <h1><font color="#808db5">Perl6(Raku)のサーバーを使った高速実行</font></h1>
|
|
74 </div>
|
|
75 </td>
|
|
76 </tr>
|
|
77 <tr>
|
|
78 <td>
|
|
79 <div align="left">
|
|
80 Kouki Fukuda, Shinji Kono
|
|
81 琉球大学
|
|
82 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;">
|
|
83 </div>
|
|
84 </td>
|
|
85 </tr>
|
|
86 </table>
|
|
87 </div>
|
|
88
|
|
89
|
|
90
|
|
91 <div class='slide'>
|
|
92
|
|
93 <!-- _S9SLIDE_ -->
|
|
94 <h2 id="研究背景">研究背景</h2>
|
|
95 <ul>
|
9
|
96 <li>現在開発の進んでいる言語に Raku がある.
|
|
97 スクリプト言語 Raku は任意の VM が選択できるようになっており, 主に利用されている VM に C で書かれた MoarVM が存在する.</li>
|
7
|
98 <li>MoarVM は JIT コンパイルなどをサポートしているが, 全体的な起動時間及び処理速度が Perl5 や Python , Ruby などの他のスクリプト言語と比較し非常に低速である.
|
|
99 その為, 現在日本国内では Perl6 は実務としてあまり使われていない.</li>
|
9
|
100 <li>Raku の持つ言語機能や型システムは非常に柔軟かつ強力であるため, 実用的な処理速度に達すれば, 言語の利用件数が向上することが期待される.</li>
|
7
|
101 </ul>
|
|
102
|
|
103
|
|
104
|
|
105 </div>
|
|
106
|
|
107 <div class='slide'>
|
|
108 <!-- _S9SLIDE_ -->
|
|
109 <h2 id="研究概要">研究概要</h2>
|
|
110 <ul>
|
9
|
111 <li>Raku の実装の一つであるRakudoは、Byte code である MoarVM と、それ上で動作する Raku のsubsetであるnqp (Not Quite Perl)上に構成されている。</li>
|
|
112 <li>現状のRakuの実行はRakuで記述されたコンパイラをloadしてJITしながら実行すること自体に時間がかかっている。</li>
|
|
113 <li>そこで、Rakuをサーバとして動作させ、実行するファイルをサーバに投げて実行する方法を検討する</li>
|
8
|
114 <li>同一ホスト内で終了せずに実行を続けるサーバープロセスを立ち上げ, このサーバープロセス上で立ち上げておいたコンパイラに実行するファイル名を転送し, サーバー上でコンパイルを行う手法を提案し実装する.</li>
|
7
|
115 </ul>
|
|
116
|
|
117
|
|
118
|
|
119 </div>
|
|
120
|
|
121 <div class='slide'>
|
|
122 <!-- _S9SLIDE_ -->
|
8
|
123 <h2 id="rakudo">Rakudo</h2>
|
|
124 <ul>
|
9
|
125 <li>Rakudoとは現在のRakuの主力な実装である.</li>
|
|
126 <li>Rakudo は MoarVM, と NQP と呼ばれる Raku のサブセット, NQP と Raku 自身で記述された Raku という構成である.</li>
|
8
|
127 </ul>
|
|
128
|
|
129 <p><img src="fig/Rakudo.pdf" alt="" /></p>
|
|
130 <ul>
|
|
131 <li>Rakudoの構成</li>
|
|
132 </ul>
|
|
133
|
|
134
|
|
135
|
|
136 </div>
|
|
137
|
|
138 <div class='slide'>
|
|
139 <!-- _S9SLIDE_ -->
|
|
140 <h2 id="nqp">NQP</h2>
|
9
|
141 <ul>
|
|
142 <li>NQPとはNot Quite Perl の略で Raku のサブセットである</li>
|
|
143 <li>基本的な文法などは Perl6 に準拠しているが, 変数を束縛で宣言するなどの違いがある.</li>
|
|
144 </ul>
|
8
|
145
|
|
146
|
|
147
|
|
148 </div>
|
|
149
|
|
150 <div class='slide'>
|
|
151 <!-- _S9SLIDE_ -->
|
9
|
152 <h2 id="moarvm">MoarVM</h2>
|
|
153 <ul>
|
|
154 <li>MoarVM は Perl6 に特化した VM</li>
|
|
155 <li>C 言 語で実装されている</li>
|
|
156 <li>JIT コンパイルなどが現在導入されているが, 起動時間などが低速である問題がある</li>
|
|
157 </ul>
|
|
158
|
|
159
|
|
160
|
|
161 </div>
|
|
162
|
|
163 <div class='slide'>
|
|
164 <!-- _S9SLIDE_ -->
|
|
165 <h2 id="raku-による-abyssサーバーの実装">Raku による Abyssサーバーの実装</h2>
|
8
|
166 <ul>
|
|
167 <li>提案手法に沿い『Abyssサーバー』を実装した.</li>
|
9
|
168 <li>Abyssサーバーはクライアント側から投げられた Raku を実行するためのサーバーである.</li>
|
8
|
169 <li>下記の図は,Abyss サーバーを用いたスクリプト言語の実行手順である.</li>
|
|
170 </ul>
|
|
171
|
|
172 <p><img src="fig/abyss.pdf" alt="" /></p>
|
|
173
|
|
174
|
|
175
|
|
176 </div>
|
|
177
|
|
178 <div class='slide'>
|
|
179 <!-- _S9SLIDE_ -->
|
9
|
180 <h2 id="abyss-serverの利点">Abyss Serverの利点</h2>
|
|
181 <ul>
|
|
182 <li>Abyss Serverを用いて実行することで, サーバー上で事前に起動した Rakudo を再利用し, 投げられた Perl6 スクリプトの実行を行うため, Rakudo の全体的な処理時間を短縮できる.</li>
|
|
183 </ul>
|
|
184
|
|
185
|
|
186
|
|
187 </div>
|
|
188
|
|
189 <div class='slide'>
|
|
190 <!-- _S9SLIDE_ -->
|
|
191 <h2 id="abyss-serverの欠点">Abyss Serverの欠点</h2>
|
|
192 <ul>
|
|
193 <li></li>
|
|
194 </ul>
|
|
195
|
|
196
|
|
197
|
|
198 </div>
|
|
199
|
|
200 <div class='slide'>
|
|
201 <!-- _S9SLIDE_ -->
|
8
|
202 <h2 id="abyss-server側の実装">Abyss Server側の実装</h2>
|
|
203 <ul>
|
9
|
204 <li>Abyss サーバーは起動すると, まず自身にファイルパスを転送するためのソケットを生成し, その後 ファイルを受け取るための待機ループに入る.</li>
|
|
205 <li>ファイルパスを受け取ると,ファイルを開き実行する.</li>
|
8
|
206 </ul>
|
7
|
207
|
|
208 <pre><code>unit class Abyss::Server:ver<0.0.1>;
|
|
209 use MONKEY-SEE-NO-EVAL;
|
|
210
|
|
211 method readeval {
|
|
212 my $listen = IO::Socket::INET.new(
|
|
213 :listen,
|
|
214 :localhost<localhost>,
|
|
215 :localport(3333)
|
|
216 );
|
|
217 loop {
|
|
218 my $conn = $listen.accept;
|
|
219 while my $buf = $conn.read(1024) {
|
|
220 EVALFILE $buf.decode;
|
|
221 }
|
|
222 $conn.close;
|
|
223 }
|
|
224 }
|
|
225 </code></pre>
|
|
226
|
|
227
|
|
228
|
|
229 </div>
|
|
230
|
|
231 <div class='slide'>
|
|
232 <!-- _S9SLIDE_ -->
|
8
|
233 <h2 id="abyss-client側の実装">Abyss Client側の実装</h2>
|
|
234 <ul>
|
|
235 <li>ユーザーはAbyssのサーバーを起動後,ファイルパスをサーバーに送信する.</li>
|
|
236 </ul>
|
|
237
|
|
238 <pre><code>my $conn = IO::Socket::INET.new( :host<localhost>,
|
|
239 :port(3333) );
|
|
240
|
|
241 $conn.print: 'FILEPASS';
|
|
242 </code></pre>
|
|
243
|
|
244
|
|
245
|
|
246 </div>
|
|
247
|
|
248 <div class='slide'>
|
|
249 <!-- _S9SLIDE_ -->
|
9
|
250 <h2 id="raku-のeval">Raku のEVAL</h2>
|
8
|
251 <ul>
|
9
|
252 <li>Raku では EVAL 関数があり文字列を Perl6 のソースコード自身として評価できる</li>
|
|
253 <li>Raku では, EVAL は通常は使用できないようになっており, MONKEY-SEE-NO-EVAL という pragma を実行することで使うことができるようになる.</li>
|
8
|
254 </ul>
|
|
255
|
|
256 <pre><code>use MONKEY-SEE-NO-EVAL;
|
|
257
|
|
258 EVAL "say { 5 + 5 }"; # OUTPUT: 10
|
|
259 </code></pre>
|
|
260
|
|
261
|
|
262
|
|
263 </div>
|
|
264
|
|
265 <div class='slide'>
|
|
266 <!-- _S9SLIDE_ -->
|
|
267 <h2 id="まとめと今後の課題">まとめと今後の課題</h2>
|
|
268 <ul>
|
9
|
269 <li>Raku の新たな実行方法の提案,及び実装を行なった.</li>
|
8
|
270 </ul>
|
7
|
271
|
9
|
272
|
|
273
|
|
274 </div>
|
|
275
|
|
276 <div class='slide'>
|
|
277 <!-- _S9SLIDE_ -->
|
|
278 <h2 id="perl6の実装に関わる様々な言語">Perl6の実装に関わる様々な言語</h2>
|
|
279 <ul>
|
|
280 <li>Raku は,Larry wallにより設計されたオブジェクト指向スクリプト言語である.</li>
|
|
281 <li>また Raku は漸進的型付け言語である.</li>
|
|
282 </ul>
|
|
283
|
|
284 <p><img src="fig/Raku.pdf" alt="" /></p>
|
|
285
|
|
286
|
7
|
287 </div>
|
|
288
|
|
289
|
|
290 </div><!-- presentation -->
|
|
291 </body>
|
|
292 </html>
|