81
|
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>CbCによるPerl6処理系</title>
|
|
11
|
|
12 <meta name="generator" content="Slide Show (S9) v4.0.1 on Ruby 2.5.1 (2018-03-29) [x86_64-darwin17]">
|
100
|
13 <meta name="author" content="清水隆博" >
|
81
|
14
|
|
15 <!-- style sheet links -->
|
|
16 <link rel="stylesheet" href="s6/themes/screen.css" media="screen">
|
|
17 <link rel="stylesheet" href="s6/themes/print.css" media="print">
|
|
18 <link rel="stylesheet" href="s6/themes/blank.css" media="screen,projection">
|
|
19
|
|
20 <!-- JS -->
|
|
21 <script src="s6/js/jquery-1.11.3.min.js"></script>
|
|
22 <script src="s6/js/jquery.slideshow.js"></script>
|
|
23 <script src="s6/js/jquery.slideshow.counter.js"></script>
|
|
24 <script src="s6/js/jquery.slideshow.controls.js"></script>
|
|
25 <script src="s6/js/jquery.slideshow.footer.js"></script>
|
|
26 <script src="s6/js/jquery.slideshow.autoplay.js"></script>
|
|
27
|
|
28 <!-- prettify -->
|
|
29 <link rel="stylesheet" href="scripts/prettify.css">
|
|
30 <script src="scripts/prettify.js"></script>
|
|
31
|
|
32 <style>
|
|
33 .slide {page-break-after: always;}
|
|
34 </style>
|
|
35
|
|
36
|
|
37
|
|
38
|
|
39 </head>
|
|
40 <body>
|
|
41
|
|
42 <div class="layout">
|
|
43 <div id="header"></div>
|
|
44 <div id="footer">
|
|
45 <div align="right">
|
|
46 <img src="s6/images/logo.svg" width="200px">
|
|
47 </div>
|
|
48 </div>
|
|
49 </div>
|
|
50
|
|
51 <div class="presentation">
|
|
52
|
|
53 <div class='slide cover'>
|
|
54 <table width="90%" height="90%" border="0" align="center">
|
|
55 <tr>
|
|
56 <td>
|
|
57 <div align="center">
|
|
58 <h1><font color="#808db5">CbCによるPerl6処理系</font></h1>
|
|
59 </div>
|
|
60 </td>
|
|
61 </tr>
|
|
62 <tr>
|
|
63 <td>
|
|
64 <div align="left">
|
100
|
65 清水隆博
|
|
66 並列信頼研
|
81
|
67 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;">
|
|
68 </div>
|
|
69 </td>
|
|
70 </tr>
|
|
71 </table>
|
|
72 </div>
|
|
73
|
|
74
|
|
75 <div class='slide'>
|
|
76
|
|
77 <!-- _S9SLIDE_ -->
|
|
78 <h2 id="研究目的">研究目的</h2>
|
|
79 <ul>
|
105
|
80 <li>Continuation based C (CbC)という言語は継続を基本とするC言語であり, 言語処理系に応用出来ると考えられる</li>
|
|
81 <li>スクリプト言語などは, バイトコードを扱うが, この実行にcae文や, ラベルgotoなどを利用している。
|
|
82 <ul>
|
|
83 <li>この部分はCbCの機能で書き換える事が可能である</li>
|
|
84 </ul>
|
|
85 </li>
|
|
86 <li>命令実行処理部分をモジュール化することで、各命令ごとの最適化や、 命令ディスパッチ部分の最適化を行う事が可能であると考える。</li>
|
92
|
87 </ul>
|
|
88
|
|
89
|
|
90
|
|
91 </div>
|
|
92
|
|
93 <div class='slide'>
|
|
94 <!-- _S9SLIDE_ -->
|
|
95 <h2 id="研究目的-1">研究目的</h2>
|
|
96 <ul>
|
108
|
97 <li>現在開発されているPerl6の実装にRakudoがある</li>
|
|
98 <li>Rakudoはバイトコードを生成する
|
|
99 <ul>
|
|
100 <li>このバイトコードはMoarVMという専用の仮想機械が評価する</li>
|
110
|
101 <li>MoarVMはC言語で記述されている為、 Cと互換性のある言語であるCbCで書き直す事が可能である</li>
|
108
|
102 </ul>
|
|
103 </li>
|
105
|
104 <li>本研究では, CbC用いてPerl6にC処理系であるMoarVMの一部書き換えを行い, 命令のモジュール化を検討する.</li>
|
81
|
105 </ul>
|
|
106
|
|
107
|
|
108
|
|
109 </div>
|
|
110
|
|
111 <div class='slide'>
|
|
112 <!-- _S9SLIDE_ -->
|
|
113 <h2 id="continuation-based-c-cbc">Continuation Based C (CbC)</h2>
|
|
114 <ul>
|
|
115 <li>Continuation Based C (CbC) はCodeGearを単位として用いたプログラミング言語である.</li>
|
|
116 <li>CodeGearはCの通常の関数呼び出しとは異なり,スタックに値を積まず, 次のCodeGearにgoto文によって遷移する.</li>
|
92
|
117 <li>CodeGear同士の移動は、 状態遷移として捉える事が出来る</li>
|
85
|
118 </ul>
|
|
119
|
100
|
120 <p><img src="fig/cbc_sample.svg" /></p>
|
|
121
|
85
|
122
|
|
123
|
|
124 </div>
|
|
125
|
|
126 <div class='slide'>
|
|
127 <!-- _S9SLIDE_ -->
|
|
128 <h2 id="continuation-based-c-cbc-1">Continuation Based C (CbC)</h2>
|
|
129
|
|
130 <ul>
|
|
131 <li>CodeGearはCの関数宣言の型名の代わりに<code>__code</code>と書く事で宣言出来る</li>
|
|
132 <li>CodeGearの引数は, 各CodeGearの入出力として利用する</li>
|
92
|
133 <li>gotoしてしまうと、元のCodeGearに戻る事が出来ない</li>
|
81
|
134 </ul>
|
|
135
|
92
|
136 <pre><code>__code cg1(TEST testin){
|
81
|
137 TEST testout;
|
|
138 testout.number = testin.number + 1;
|
|
139 testout.string = "Hello";
|
|
140 goto cg2(testout);
|
|
141 }
|
|
142
|
|
143 __code cg2(TEST testin){
|
|
144 printf("number = %d\t string= %s\n",testin.number,testin.string);
|
|
145 }
|
|
146
|
|
147 int main(){
|
|
148 TEST test = {0,0};
|
|
149 goto cg1(test);
|
|
150 }
|
|
151 </code></pre>
|
|
152
|
|
153
|
|
154
|
|
155 </div>
|
|
156
|
|
157 <div class='slide'>
|
|
158 <!-- _S9SLIDE_ -->
|
105
|
159 <h2 id="スクリプト言語処理系">スクリプト言語処理系</h2>
|
81
|
160 <ul>
|
92
|
161 <li>スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている</li>
|
|
162 <li>その為スクリプト言語の実装は大きく2つで構成されている
|
|
163 <ul>
|
|
164 <li>バイトコードに変換するフロントエンド部分</li>
|
|
165 <li>バイトコードを解釈する仮想機械</li>
|
|
166 </ul>
|
|
167 </li>
|
81
|
168 </ul>
|
|
169
|
100
|
170 <p><img src="fig/bytecode_sample_generally_lang.svg" width="80%" /></p>
|
|
171
|
81
|
172
|
|
173
|
|
174 </div>
|
|
175
|
|
176 <div class='slide'>
|
|
177 <!-- _S9SLIDE_ -->
|
|
178 <h2 id="rakudo">Rakudo</h2>
|
|
179 <ul>
|
|
180 <li>Rakudoとは現在のPerl6の主力な実装である.</li>
|
93
|
181 <li>Rakudoは次の構成になっている
|
|
182 <ul>
|
108
|
183 <li>実行環境のVM (MoarVM)</li>
|
93
|
184 <li>Perl6のサブセットであるNQP(NotQuitPerl)</li>
|
|
185 <li>NQPで記述されたPerl6(Rakudo)</li>
|
|
186 </ul>
|
|
187 </li>
|
81
|
188 </ul>
|
|
189
|
|
190
|
|
191
|
|
192 </div>
|
|
193
|
|
194 <div class='slide'>
|
|
195 <!-- _S9SLIDE_ -->
|
|
196 <h2 id="moarvm">MoarVM</h2>
|
|
197
|
|
198 <ul>
|
|
199 <li>Perl6専用のVMであり, Cで記述されている</li>
|
|
200 <li>レジスタマシンとして実装されている.</li>
|
92
|
201 </ul>
|
|
202
|
|
203
|
|
204
|
|
205 </div>
|
|
206
|
|
207 <div class='slide'>
|
|
208 <!-- _S9SLIDE_ -->
|
|
209 <h2 id="moarvmのバイトコード">MoarVMのバイトコード</h2>
|
|
210
|
|
211 <ul>
|
|
212 <li>MoarVMは16ビットのバイナリを命令バイトコードとして利用している</li>
|
|
213 <li>命令にはその後に16ビットごとにオペランド(引数)を取るものがある</li>
|
|
214 </ul>
|
|
215
|
|
216 <pre><code>add_i loc_3_int, loc_0_int, loc_1_int
|
|
217 set loc_2_obj, loc_3_obj
|
|
218 </code></pre>
|
|
219
|
|
220
|
111
|
221 </div>
|
|
222
|
|
223 <div class='slide'>
|
|
224 <!-- _S9SLIDE_ -->
|
|
225 <h2 id="moarvmのバイトコード-1">MoarVMのバイトコード</h2>
|
|
226
|
|
227 <pre><code>sub test_func(int $left, int $right){
|
|
228 my int $sum := $left + $right;
|
|
229 ++$sum;
|
|
230 return $sum;
|
|
231 }
|
|
232
|
|
233 my $arg1 := 1;
|
|
234 my $arg2 := 8;
|
|
235
|
|
236 say(test_func($arg1,$arg2));
|
|
237
|
|
238 </code></pre>
|
|
239
|
|
240
|
|
241
|
|
242 </div>
|
|
243
|
|
244 <div class='slide'>
|
|
245 <!-- _S9SLIDE_ -->
|
|
246 <h2 id="moarvmのバイトコード-2">MoarVMのバイトコード</h2>
|
|
247
|
|
248 <p><img src="fig/code_to_bytecode.svg" width="80%" style="text-align:center;padding-left: 100px;" /></p>
|
|
249
|
|
250
|
92
|
251
|
|
252 </div>
|
|
253
|
|
254 <div class='slide'>
|
|
255 <!-- _S9SLIDE_ -->
|
|
256 <h2 id="moarvmのバイトコードインタプリタ">MoarVMのバイトコードインタプリタ</h2>
|
93
|
257 <ul>
|
|
258 <li>バイトコードは連続したメモリに確保されている</li>
|
|
259 <li>その為次の処理を繰り返す必要がある
|
|
260 <ul>
|
|
261 <li>16ビットごとで読み込み</li>
|
|
262 <li>読み込んだビットから、命令に対応する処理を呼び出し</li>
|
|
263 <li>その処理を実行する</li>
|
|
264 </ul>
|
|
265 </li>
|
|
266 <li>この処理をバイトコードディスパッチと呼び、 実行する部分をバイトコードインタプリタと呼ぶ</li>
|
|
267 </ul>
|
|
268
|
|
269
|
|
270
|
|
271 </div>
|
|
272
|
|
273 <div class='slide'>
|
|
274 <!-- _S9SLIDE_ -->
|
106
|
275 <h2 id="mvm_interp_runの内部処理">MVM_interp_runの内部処理</h2>
|
|
276
|
|
277 <ul>
|
|
278 <li>MoarVMは関数 <code>MVM_interp_run</code> でバイトコードに応じた処理を実行する</li>
|
|
279 <li>gccやclangを利用してコンパイルした場合、 ラベルgotoで命令ディスパッチが実行される</li>
|
|
280 </ul>
|
|
281
|
108
|
282 <p><img src="fig/origin_label_goto.svg" width="30%" style="text-align:center;padding-left: 300px;" /></p>
|
106
|
283
|
|
284
|
|
285
|
|
286 </div>
|
|
287
|
|
288 <div class='slide'>
|
|
289 <!-- _S9SLIDE_ -->
|
93
|
290 <h2 id="moarvmのバイトコードインタプリタ-1">MoarVMのバイトコードインタプリタ</h2>
|
92
|
291
|
|
292 <ul>
|
93
|
293 <li>マクロDISPATCHで, ラベルgotoかcase文に変換が行われる
|
81
|
294 <ul>
|
93
|
295 <li>バイトコードは数値として見る事が出来る為、 case文に対応する事が出来る</li>
|
81
|
296 <li>この中の <code>OP</code> で宣言されたブロックがそれぞれバイトコードに対応する処理となっている.</li>
|
|
297 </ul>
|
|
298 </li>
|
|
299 </ul>
|
|
300
|
|
301 <pre><code>DISPATCH(NEXT_OP) {
|
|
302 OP(const_i64):
|
|
303 GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2);
|
|
304 cur_op += 10;
|
|
305 goto NEXT;
|
|
306 }
|
|
307
|
|
308 </code></pre>
|
|
309
|
|
310
|
|
311
|
|
312 </div>
|
|
313
|
|
314 <div class='slide'>
|
|
315 <!-- _S9SLIDE_ -->
|
|
316 <h2 id="mvm_interp_runで使用されているマクロ">MVM_interp_runで使用されているマクロ</h2>
|
|
317
|
|
318 <pre><code>DISPATCH(NEXT_OP) {
|
|
319 OP(const_i64):
|
|
320 </code></pre>
|
|
321
|
|
322 <ul>
|
107
|
323 <li>マクロ <code>OP</code> は次の様に定義している</li>
|
81
|
324 </ul>
|
|
325
|
|
326 <pre><code> #define OP(name) OP_ ## name
|
|
327 </code></pre>
|
|
328
|
|
329 <ul>
|
102
|
330 <li>マクロ <code>OP</code> が, バイトコードの名前をC言語のラベルに変換する</li>
|
81
|
331 </ul>
|
|
332
|
|
333 <pre><code> OP_const_i16:
|
102
|
334 </code></pre>
|
|
335
|
|
336 <pre><code> #OP_const_i16
|
81
|
337 </code></pre>
|
|
338
|
|
339
|
|
340
|
|
341 </div>
|
|
342
|
|
343 <div class='slide'>
|
|
344 <!-- _S9SLIDE_ -->
|
|
345 <h2 id="mvm_interp_runで使用されているマクロ-1">MVM_interp_runで使用されているマクロ</h2>
|
|
346
|
108
|
347 <pre><code> OP(const_i64):
|
|
348 GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2);
|
|
349 cur_op += 10;
|
|
350 goto NEXT;
|
|
351 </code></pre>
|
|
352
|
|
353 <ul>
|
|
354 <li><code>cur_op</code>は次のバイトコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のバイトコードに対応した処理に遷移する.</li>
|
|
355 </ul>
|
|
356
|
|
357
|
|
358
|
|
359 </div>
|
|
360
|
|
361 <div class='slide'>
|
|
362 <!-- _S9SLIDE_ -->
|
|
363 <h2 id="mvm_interp_runで使用されているマクロ-2">MVM_interp_runで使用されているマクロ</h2>
|
|
364
|
|
365 <pre><code> OP(const_i64):
|
|
366 GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2);
|
|
367 cur_op += 10;
|
|
368 goto NEXT;
|
|
369 </code></pre>
|
|
370
|
81
|
371 <ul>
|
107
|
372 <li>次の命令に移動する <code>NEXT</code>はラベルテーブルにアクセスし, ラベルを取り出す
|
102
|
373 <ul>
|
|
374 <li>取り出したNEXTはラベルなので、 ラベルgotoの拡張が実装されている場合はgoto文でジャンプ出来る</li>
|
|
375 </ul>
|
|
376 </li>
|
108
|
377 <li>次の命令に対応する数値は, <code>NEXT_OP</code> というマクロで取り出す</li>
|
81
|
378 </ul>
|
|
379
|
|
380 <pre><code>#define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op)
|
|
381 #define NEXT *LABELS[NEXT_OP]
|
|
382
|
|
383 </code></pre>
|
|
384
|
|
385
|
|
386
|
|
387 </div>
|
|
388
|
|
389 <div class='slide'>
|
|
390 <!-- _S9SLIDE_ -->
|
|
391 <h2 id="mvm_interp_runのラベルテーブル">MVM_interp_runのラベルテーブル</h2>
|
|
392
|
|
393 <ul>
|
93
|
394 <li>利用するCコンパイラが、ラベルgotoをサポートしている場合に実行される</li>
|
|
395 <li>配列<code>LABELS</code>にアクセスし, ラベル情報を取得する</li>
|
|
396 <li>ラベル情報を取得出来ると、 そのラベルに対してラベルgotoを利用する</li>
|
81
|
397 </ul>
|
|
398
|
|
399 <pre><code>static const void * const LABELS[] = {
|
|
400 &&OP_no_op,
|
|
401 &&OP_const_i8,
|
|
402 &&OP_const_i16,
|
|
403 &&OP_const_i32,
|
|
404 &&OP_const_i64,
|
|
405 &&OP_const_n32,
|
|
406 &&OP_const_n64,
|
|
407 &&OP_const_s,
|
|
408 &&OP_set,
|
|
409 &&OP_extend_u8,
|
|
410 &&OP_extend_u16,
|
|
411 &&OP_extend_u32,
|
|
412 &&OP_extend_i8,
|
|
413 &&OP_extend_i16,
|
|
414 </code></pre>
|
|
415
|
|
416
|
|
417
|
|
418 </div>
|
|
419
|
|
420 <div class='slide'>
|
|
421 <!-- _S9SLIDE_ -->
|
|
422 <h2 id="mvm_interp_run">MVM_interp_run</h2>
|
|
423
|
|
424 <ul>
|
93
|
425 <li>Cの実装の場合, switch文に展開される可能性がある
|
81
|
426 <ul>
|
102
|
427 <li>命令ディスパッチが書かれているCソースファイルの指定の場所にのみ処理を記述せざるを得ない</li>
|
93
|
428 <li>1ファイルあたりの記述量が膨大になり, 命令のモジュール化ができない</li>
|
81
|
429 </ul>
|
|
430 </li>
|
93
|
431 <li>高速化手法の、 Threaded Codeの実装を考えた場合, この命令に対応して大幅に処理系の実装を変更する必要がある.</li>
|
81
|
432 <li>デバッグ時には今どの命令を実行しているか, ラベルテーブルを利用して参照せざるを得ず, 手間がかかる.</li>
|
|
433 </ul>
|
|
434
|
|
435
|
|
436
|
|
437 </div>
|
|
438
|
|
439 <div class='slide'>
|
|
440 <!-- _S9SLIDE_ -->
|
95
|
441 <h2 id="cbcでの変換">CbCでの変換</h2>
|
81
|
442
|
|
443 <ul>
|
93
|
444 <li>CbCのCodeGearは関数よりも小さな単位である</li>
|
|
445 <li>その為、 従来は関数化出来なかった単位をCodeGearに変換する事が出来る</li>
|
81
|
446 <li>CbCをMoarVMに適応すると, ラベルなどで制御していた命令に対応する処理をCodeGearで記述する事が可能である</li>
|
95
|
447 </ul>
|
|
448
|
|
449
|
|
450
|
|
451 </div>
|
|
452
|
|
453 <div class='slide'>
|
|
454 <!-- _S9SLIDE_ -->
|
|
455 <h2 id="cbcmoarvmのバイトコードディスパッチ">CbCMoarVMのバイトコードディスパッチ</h2>
|
|
456
|
|
457 <ul>
|
107
|
458 <li>オリジナルでは, マクロ <code>NEXT</code> が担当していた、 次のバイトコードへの移動は, NEXT相当のCodeGear <code>cbc_next</code>で処理を行う</li>
|
81
|
459 <li>CodeGearの入出力として, MoarVMなどの情報をまとめた構造体を利用する</li>
|
|
460 </ul>
|
|
461
|
|
462 <pre><code>__code cbc_next(INTERP i){
|
|
463 __code (*c)(INTERP)
|
|
464 c = CODES[(i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op)]; // c = NEXT(i)
|
|
465 goto c(i);
|
|
466 }
|
|
467
|
|
468 __code cbc_const_i64(INTERP i){
|
|
469 GET_REG(i->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2);
|
|
470 i->cur_op += 10;
|
|
471 goto cbc_next(i);
|
|
472 }
|
|
473
|
|
474 </code></pre>
|
|
475
|
|
476
|
|
477
|
|
478 </div>
|
|
479
|
|
480 <div class='slide'>
|
|
481 <!-- _S9SLIDE_ -->
|
|
482 <h2 id="codegearの入出力インターフェイス">CodeGearの入出力インターフェイス</h2>
|
|
483
|
|
484 <ul>
|
|
485 <li>MoarVMではレジスタの集合や命令列などをMVM_interp_runのローカル変数として利用し, 各命令実行箇所で参照している</li>
|
|
486 <li>CodeGearに書き換えた場合, このローカル変数にはアクセスする事が不可能となる.</li>
|
108
|
487 </ul>
|
|
488
|
|
489
|
|
490
|
|
491 </div>
|
|
492
|
|
493 <div class='slide'>
|
|
494 <!-- _S9SLIDE_ -->
|
|
495 <h2 id="codegearの入出力インターフェイス-1">CodeGearの入出力インターフェイス</h2>
|
|
496 <ul>
|
|
497 <li>入出力としてMoarVMの情報をまとめた構造体interpのポインタであるINTERPを受け渡し, これを利用してアクセスする</li>
|
81
|
498 </ul>
|
|
499
|
|
500 <pre><code>typedef struct interp {
|
|
501 MVMuint16 op;
|
|
502 MVMuint8 *cur_op;
|
|
503 MVMuint8 *bytecode_start;
|
|
504 MVMRegister *reg_base;
|
|
505 /* Points to the current compilation unit
|
|
506 . */
|
|
507 MVMCompUnit *cu;
|
|
508 /* The current call site we’re
|
|
509 constructing. */
|
|
510 MVMCallsite *cur_callsite;
|
|
511 MVMThreadContext *tc;
|
|
512 } INTER,*INTERP;
|
|
513 </code></pre>
|
|
514
|
|
515
|
|
516
|
|
517 </div>
|
|
518
|
|
519 <div class='slide'>
|
|
520 <!-- _S9SLIDE_ -->
|
|
521 <h2 id="cbcmoarvmのcodegearテーブル">CbCMoarVMのCodeGearテーブル</h2>
|
|
522
|
|
523 <ul>
|
|
524 <li>CodeGearテーブルは引数としてINTERを受け取るCodeGearの配列として定義する</li>
|
95
|
525 <li>テーブルとして宣言することで、 バイトコードの値をそのままテーブルに反映させる事が可能である</li>
|
81
|
526 </ul>
|
|
527
|
|
528 <pre><code>__code (* CODES[])(INTERP) = {
|
|
529 cbc_no_op,
|
|
530 cbc_const_i8,
|
|
531 cbc_const_i16,
|
|
532 cbc_const_i32,
|
|
533 cbc_const_i64,
|
|
534 cbc_const_n32,
|
|
535 cbc_const_n64,
|
|
536 cbc_const_s,
|
|
537 cbc_set,
|
|
538 cbc_extend_u8,
|
|
539 cbc_extend_u16,
|
|
540 </code></pre>
|
|
541
|
|
542
|
|
543
|
|
544 </div>
|
|
545
|
|
546 <div class='slide'>
|
|
547 <!-- _S9SLIDE_ -->
|
108
|
548 <h2 id="cbcmoarvmの状態遷移">CbCMoarVMの状態遷移</h2>
|
|
549
|
|
550 <p><img src="fig/cbc_next.svg" width="80%" style="text-align:center;padding-left: 120px;" /></p>
|
|
551
|
|
552
|
|
553
|
|
554 </div>
|
|
555
|
|
556 <div class='slide'>
|
|
557 <!-- _S9SLIDE_ -->
|
96
|
558 <h2 id="moarvmとcbcmoarvmのトレース">MoarVMとCbCMoarVMのトレース</h2>
|
81
|
559
|
|
560 <ul>
|
96
|
561 <li>MoarVMのデバッグ時には、 次の命令が何であるかは直接は判断出来なかった</li>
|
81
|
562 </ul>
|
|
563
|
|
564 <pre><code>Breakpoint 1, dummy () at src/core/interp.c:46
|
|
565 46 }
|
|
566 #1 0x00007ffff75689da in MVM_interp_run (tc=0x604a20,
|
|
567 initial_invoke=0x7ffff76c7168 <toplevel_initial_invoke>, invoke_data=0x67ff10)
|
|
568 at src/core/interp.c:1169
|
|
569 1169 goto NEXT;
|
|
570 $2 = 162
|
|
571 </code></pre>
|
96
|
572 <ul>
|
|
573 <li>CbCMoarVMの場合は、 次に実行する命令名を確認する事が出来る</li>
|
|
574 </ul>
|
81
|
575
|
|
576 <pre><code>Breakpoint 2, cbc_next (i=0x7fffffffdc30) at src/core/cbc-interp.cbc:61
|
|
577 61 goto NEXT(i);
|
|
578 $1 = (void (*)(INTERP)) 0x7ffff7566f53 <cbc_takeclosure>
|
|
579 $2 = 162
|
|
580 </code></pre>
|
|
581
|
|
582
|
|
583
|
|
584 </div>
|
|
585
|
|
586 <div class='slide'>
|
|
587 <!-- _S9SLIDE_ -->
|
|
588 <h2 id="moarvmのデバッグ">MoarVMのデバッグ</h2>
|
|
589
|
|
590 <ul>
|
|
591 <li>cur_opのみをPerlスクリプトなどを用いて抜き出し, 並列にログを取得したオリジナルと差分を図る</li>
|
|
592 <li>この際に差異が発生したバイトコードを確認し, その前の状態で確認していく</li>
|
|
593 </ul>
|
|
594
|
|
595 <pre><code>25 : 25 : cbc_unless_i
|
|
596 247 : 247 : cbc_null
|
|
597 54 : 54 : cbc_return_o
|
|
598 140 : 140 : cbc_checkarity
|
|
599 558 : 558 : cbc_paramnamesused
|
|
600 159 : 159 : cbc_getcode
|
|
601 391 : 391 : cbc_decont
|
|
602 127 : 127 : cbc_prepargs
|
|
603 *139 : 162
|
|
604 cbc_invoke_o:cbc_takeclosure
|
|
605 </code></pre>
|
|
606
|
|
607
|
|
608
|
|
609 </div>
|
|
610
|
|
611 <div class='slide'>
|
|
612 <!-- _S9SLIDE_ -->
|
|
613 <h2 id="現在のcbcmoarvm">現在のCbCMoarVM</h2>
|
|
614
|
|
615 <ul>
|
95
|
616 <li>現在はNQP, Rakudoのセルフビルドが達成でき, オリジナルと同等のテスト達成率を持っている
|
|
617 <ul>
|
|
618 <li>その為、 NQP, Rakudoの実行コマンドであるnqp perl6が起動する様になった</li>
|
|
619 </ul>
|
|
620 </li>
|
108
|
621 </ul>
|
|
622
|
|
623
|
|
624
|
|
625 </div>
|
|
626
|
|
627 <div class='slide'>
|
|
628 <!-- _S9SLIDE_ -->
|
|
629 <h2 id="現在のcbcmoarvm-1">現在のCbCMoarVM</h2>
|
|
630 <ul>
|
95
|
631 <li>moarの起動時のオプションとして <code>--cbc</code> を与えることによりCbCかオリジナルを選択可能である</li>
|
108
|
632 <li><code>--cbc</code> オプションをmoarの起動時に設定することでCbCで書き換えたインタプリタが起動する</li>
|
81
|
633 </ul>
|
|
634
|
|
635 <pre><code>#!/bin/sh
|
|
636 exec /mnt/dalmore-home/one/src/Perl6/Optimize/llvm/build_perl6/bin/moar --cbc \
|
|
637 --libpath=/mnt/dalmore-home/one/src/Perl6/Optimize/llvm/build_perl6/share/nqp/lib \
|
|
638 /mnt/dalmore-home/one/src/Perl6/Optimize/llvm/build_perl6/share/nqp/lib/nqp.moarvm "$@"
|
|
639 </code></pre>
|
|
640
|
|
641
|
|
642
|
|
643 </div>
|
|
644
|
|
645 <div class='slide'>
|
|
646 <!-- _S9SLIDE_ -->
|
|
647 <h2 id="cbcmoarvmと通常のmoarvmの比較">CbCMoarVMと通常のMoarVMの比較</h2>
|
|
648
|
|
649 <ul>
|
|
650 <li>CbCMoarVMと通常のMoarVMの速度比較を行った</li>
|
102
|
651 <li>NQPで実装した2種類の例題を用いた
|
|
652 <ul>
|
|
653 <li>単純なループで数値をインクリメントする例題</li>
|
|
654 <li>再帰呼び出しを用いてフィボナッチ数列を求める例題</li>
|
|
655 </ul>
|
|
656 </li>
|
|
657 </ul>
|
|
658
|
|
659
|
|
660
|
|
661 </div>
|
|
662
|
|
663 <div class='slide'>
|
|
664 <!-- _S9SLIDE_ -->
|
|
665 <h2 id="フィボナッチの例題">フィボナッチの例題</h2>
|
|
666
|
|
667 <pre><code>#! nqp
|
|
668
|
|
669 sub fib($n) {
|
|
670 $n < 2 ?? $n !! fib($n-1) + fib($n - 2);
|
|
671 }
|
|
672
|
|
673 my $N := 30;
|
|
674 my $z := fib($N);
|
|
675 say("fib($N) = " ~ fib($N));
|
|
676 </code></pre>
|
|
677
|
112
|
678
|
|
679
|
|
680 </div>
|
|
681
|
|
682 <div class='slide'>
|
|
683 <!-- _S9SLIDE_ -->
|
|
684 <h2 id="フィボナッチの例題-1">フィボナッチの例題</h2>
|
|
685
|
102
|
686 <ul>
|
|
687 <li>フィボナッチの例題ではCbCMoarVMが劣る結果となった</li>
|
81
|
688 </ul>
|
|
689
|
104
|
690 <table style="border: 2px solid #595959;">
|
102
|
691 <tbody>
|
104
|
692 <tr style="border: 2px solid #595959;">
|
|
693 <td style="border: 2px solid #595959;">[単位 sec]</td>
|
105
|
694 <td style="border: 2px solid #595959;"></td>
|
|
695 <td style="border: 2px solid #595959;"></td>
|
|
696 <td style="border: 2px solid #595959;"></td>
|
104
|
697 </tr>
|
|
698 <tr style="border: 2px solid #595959;">
|
|
699 <td style="border: 2px solid #595959;">MoarVM</td>
|
|
700 <td style="border: 2px solid #595959;">1.379</td>
|
|
701 <td style="border: 2px solid #595959;">1.350</td>
|
|
702 <td style="border: 2px solid #595959;">1.346</td>
|
102
|
703 </tr>
|
|
704 <tr>
|
104
|
705 <td style="border: 2px solid #595959;">CbCMoarVM</td>
|
|
706 <td style="border: 2px solid #595959;">1.636</td>
|
|
707 <td style="border: 2px solid #595959;">1.804</td>
|
|
708 <td style="border: 2px solid #595959;">1.787</td>
|
102
|
709 </tr>
|
|
710 </tbody>
|
|
711 </table>
|
|
712
|
104
|
713 <style type="text/css">
|
|
714 table , td, th {
|
|
715 border-collapse: collapse;
|
|
716 }
|
|
717 td, th {
|
|
718 padding: 12px;
|
|
719 width: 120px;
|
|
720 height: 40px;
|
|
721 }
|
|
722 th {
|
|
723 background: #f0e6cc;
|
|
724 }
|
|
725 .even {
|
|
726 background: #fbf8f0;
|
|
727 }
|
|
728 .odd {
|
|
729 background: #fefcf9;
|
|
730 }
|
|
731 </style>
|
|
732
|
102
|
733
|
|
734
|
|
735 </div>
|
|
736
|
|
737 <div class='slide'>
|
|
738 <!-- _S9SLIDE_ -->
|
|
739 <h2 id="単純ループ">単純ループ</h2>
|
|
740
|
81
|
741 <pre><code>#! nqp
|
|
742
|
|
743 my $count := 100_000_000;
|
|
744
|
|
745 my $i := 0;
|
|
746
|
|
747 while ++$i <= $count {
|
|
748 }
|
|
749 </code></pre>
|
|
750
|
112
|
751
|
|
752
|
|
753 </div>
|
|
754
|
|
755 <div class='slide'>
|
|
756 <!-- _S9SLIDE_ -->
|
|
757 <h2 id="単純ループ-1">単純ループ</h2>
|
|
758
|
81
|
759 <ul>
|
102
|
760 <li>単純ループの場合は1.5secほど高速化した</li>
|
|
761 <li>これは実行する命令コードが、 CPUのキャッシュに収まった為であると考えられる</li>
|
81
|
762 </ul>
|
|
763
|
104
|
764 <table style="border: 2px solid #595959;">
|
102
|
765 <tbody>
|
104
|
766 <tr style="border: 2px solid #595959;">
|
|
767 <td style="border: 2px solid #595959;">[単位 sec]</td>
|
105
|
768 <td style="border: 2px solid #595959;"></td>
|
|
769 <td style="border: 2px solid #595959;"></td>
|
|
770 <td style="border: 2px solid #595959;"></td>
|
102
|
771 </tr>
|
|
772 <tr>
|
104
|
773 <td style="border: 2px solid #595959;">MoarVM</td>
|
|
774 <td style="border: 2px solid #595959;">7.499</td>
|
|
775 <td style="border: 2px solid #595959;">7.844</td>
|
|
776 <td style="border: 2px solid #595959;">7.822</td>
|
102
|
777 </tr>
|
|
778 <tr>
|
104
|
779 <td style="border: 2px solid #595959;">CbCMoarVM</td>
|
|
780 <td style="border: 2px solid #595959;">6.135</td>
|
|
781 <td style="border: 2px solid #595959;">6.362</td>
|
|
782 <td style="border: 2px solid #595959;">6.074</td>
|
102
|
783 </tr>
|
|
784 </tbody>
|
|
785 </table>
|
81
|
786
|
|
787
|
|
788
|
|
789 </div>
|
|
790
|
|
791 <div class='slide'>
|
|
792 <!-- _S9SLIDE_ -->
|
95
|
793 <h2 id="cbcmoarvmの利点">CbCMoarVMの利点</h2>
|
|
794 <ul>
|
|
795 <li>バイトコードインタプリタの箇所をモジュール化する事が可能となった
|
|
796 <ul>
|
|
797 <li>CodeGearの再利用性や記述生が高まる</li>
|
|
798 <li>CodeGearは関数の様に扱える為、 命令ディスパッチの最適化につながる実装が可能となった</li>
|
|
799 </ul>
|
|
800 </li>
|
|
801 <li>デバッグ時にラベルではなくCodeGearにbreakpointを設定可能となった
|
|
802 <ul>
|
|
803 <li>デバッグが安易となる</li>
|
|
804 </ul>
|
|
805 </li>
|
|
806 <li>CPUがキャッシュに収まる範囲の命令の場合、 通常のMoarVMよりも高速に動作する</li>
|
|
807 </ul>
|
|
808
|
|
809
|
|
810
|
|
811 </div>
|
|
812
|
|
813 <div class='slide'>
|
|
814 <!-- _S9SLIDE_ -->
|
|
815 <h2 id="cbcmoarvmの欠点">CbCMoarVMの欠点</h2>
|
|
816
|
|
817 <ul>
|
|
818 <li>MoarVMのオリジナルの更新頻度が高い為, 追従していく必要がある</li>
|
|
819 <li>CodeGear側からCに戻る際に手順が複雑となる</li>
|
|
820 <li>CodeGearを単位として用いる事で複雑なプログラミングが要求される.</li>
|
|
821 </ul>
|
|
822
|
|
823
|
|
824
|
|
825 </div>
|
|
826
|
|
827 <div class='slide'>
|
|
828 <!-- _S9SLIDE_ -->
|
102
|
829 <h2 id="まとめ">まとめ</h2>
|
81
|
830 <ul>
|
102
|
831 <li>継続と基本としたC言語 Continuation Based Cを用いてPerl6の処理系の一部を書き直した
|
|
832 <ul>
|
105
|
833 <li>CodeGearによって, 本来はモジュール化出来ない箇所をモジュール化が可能となった</li>
|
|
834 <li>デバッグが通常のディスパッチと比較して安易になった</li>
|
102
|
835 <li>CPUキャッシュに収まるループなどの命令の場合は、 通常のMoarVMよりも高速に動作する</li>
|
|
836 </ul>
|
|
837 </li>
|
|
838 <li>今後はCodeGearの特性を活用し、 直接次の命令を実行する処理を実装する</li>
|
81
|
839 </ul>
|
|
840
|
|
841 </div>
|
|
842
|
|
843
|
|
844 </div><!-- presentation -->
|
|
845 </body>
|
|
846 </html>
|