Mercurial > hg > Events > OSC2019
annotate slide.pdf.html @ 18:1fc9d0bd924f default tip
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 20 Apr 2019 18:06:35 +0900 |
parents | a176ea5c0264 |
children |
rev | line source |
---|---|
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
1 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
2 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
3 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
4 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
5 |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 <!DOCTYPE html> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 <html> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 <head> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 <meta http-equiv="content-type" content="text/html;charset=utf-8"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 <title>Perl6の内部表現</title> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
12 <meta name="generator" content="Slide Show (S9) v4.1.0 on Ruby 2.6.3 (2019-04-16) [x86_64-darwin17]"> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
13 <meta name="author" content="Takahiro Shimizu" > |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 <!-- style sheet links --> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 <link rel="stylesheet" href="s6/themes/screen.css" media="screen"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 <link rel="stylesheet" href="s6/themes/print.css" media="print"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 <link rel="stylesheet" href="s6/themes/blank.css" media="screen,projection"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 <!-- JS --> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 <script src="s6/js/jquery-1.11.3.min.js"></script> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 <script src="s6/js/jquery.slideshow.js"></script> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 <script src="s6/js/jquery.slideshow.counter.js"></script> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 <script src="s6/js/jquery.slideshow.controls.js"></script> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 <script src="s6/js/jquery.slideshow.footer.js"></script> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 <script src="s6/js/jquery.slideshow.autoplay.js"></script> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 <!-- prettify --> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 <link rel="stylesheet" href="scripts/prettify.css"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 <script src="scripts/prettify.js"></script> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 <style> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 .slide {page-break-after: always;} |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 </style> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 </head> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 <body> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 <div class="layout"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 <div id="header"></div> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 <div id="footer"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 <div align="right"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 <img src="s6/images/logo.svg" width="200px"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 </div> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 </div> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 </div> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 <div class="presentation"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 <div class='slide cover'> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 <table width="90%" height="90%" border="0" align="center"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 <tr> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 <td> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 <div align="center"> |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
58 <h1><font color="#808db5">Perl6の内部表現</font></h1> |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 </div> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 </td> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 </tr> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 <tr> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 <td> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 <div align="left"> |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
65 Takahiro Shimizu |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
66 |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;"> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 </div> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 </td> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 </tr> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 </table> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 </div> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74 |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
75 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
76 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
77 <!-- _S9SLIDE_ --> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
78 <h2 id="このセッションの内容">このセッションの内容</h2> |
1 | 79 |
80 <ul> | |
81 <li>Perl6の主要な実装であるRakudoの内部構造を探ります</li> | |
82 <li>Rakudoの内部で利用されているVMや, Perl6のサブセットなどについて探索します</li> | |
3 | 83 <li>スクリプト言語で主に使われているバイトコードインタプリタの気持ちになります</li> |
1 | 84 </ul> |
85 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
86 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
87 |
1 | 88 </div> |
89 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
90 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
91 <!-- _S9SLIDE_ --> |
9 | 92 <h2 id="内容">内容</h2> |
93 <ul> | |
94 <li>Perl6とは?</li> | |
95 <li>スクリプト言語処理系の動き</li> | |
96 <li>Perl6の内部構造 | |
97 <ul> | |
98 <li>NQP</li> | |
14 | 99 <li>MoarVM |
100 <ul> | |
101 <li>NQPとMoarVMのバイトコード対応</li> | |
102 <li>バイトコードインタプリタのC言語実装</li> | |
103 <li>MoarVMの詳細</li> | |
104 </ul> | |
105 </li> | |
9 | 106 </ul> |
107 </li> | |
108 <li>MoarVMのバイトコード実行</li> | |
109 <li>まとめ</li> | |
110 </ul> | |
111 | |
112 | |
113 | |
114 </div> | |
115 | |
116 <div class='slide'> | |
117 <!-- _S9SLIDE_ --> | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
118 <h2 id="perl6とは">Perl6とは</h2> |
1 | 119 <ul> |
9 | 120 <li>当初Perl5の時期バージョンとして開発されていたプログラミング言語 |
121 <ul> | |
122 <li>現在は別の言語として開発がそれぞれ進んでいる</li> | |
123 </ul> | |
124 </li> | |
1 | 125 <li>仕様と実装が分離しており, 現在はテストが仕様となっている</li> |
18 | 126 <li>実装は歴史上複数存在しているが,主流な実装はRakudo |
127 <ul> | |
128 <li>Haskellで実装されたPugs</li> | |
129 <li>Pythonとの共同基板を目指したParrot</li> | |
130 </ul> | |
131 </li> | |
9 | 132 <li>言語的にはスクリプト言語であり, 漸進的型付き言語</li> |
133 <li>動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する</li> | |
1 | 134 </ul> |
135 | |
14 | 136 <p><img src="fig/2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;" /></p> |
2 | 137 |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
138 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
139 |
1 | 140 </div> |
141 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
142 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
143 <!-- _S9SLIDE_ --> |
9 | 144 <h2 id="現在のperl6">現在のPerl6</h2> |
145 | |
146 <ul> | |
147 <li>現在のバージョンは <code>6.d</code></li> | |
148 <li><a href="https://perl6.github.io/6pad/">ブラウザ上で実行可能な環境</a>が存在する</li> | |
149 <li><a href="https://commaide.com/">IDE</a>が開発されている</li> | |
150 <li>WebApplicationFrameworkなども開発されており、 Perl5のモジュールを移行したものがいくつか存在する</li> | |
151 <li>日本では趣味のプロダクト以外社会では使用されていない | |
152 <ul> | |
153 <li>海外では実際に使われているケースも存在する</li> | |
154 </ul> | |
155 </li> | |
156 <li>処理速度では一部Perl5に勝っているが、それでも大分遅い</li> | |
157 </ul> | |
158 | |
159 | |
160 | |
161 </div> | |
162 | |
163 <div class='slide'> | |
164 <!-- _S9SLIDE_ --> | |
165 <h2 id="参考perl5のソースコード">[参考]Perl5のソースコード</h2> | |
166 | |
167 <ul> | |
168 <li>Perl5時代 | |
169 <ul> | |
170 <li>スカラ、配列、ハッシュの3種類</li> | |
171 <li>それぞれの変数への参照であるリファレンスが使用可能</li> | |
172 </ul> | |
173 </li> | |
174 </ul> | |
175 | |
176 <pre><code class="language-perl">use ustrict; | |
177 use warnings; | |
178 | |
179 my $scalar_value = "hello!"; | |
180 print "$scalar_value\n"; | |
181 | |
182 my @array = (1..10); | |
183 print "$array[0]\n"; | |
184 | |
185 my %hash = ( this_is_key => "this_is_value"); | |
186 print "$hash{this_is_key}\n"; | |
187 | |
188 my $hash_ref = \%hash; | |
189 print "$hash_ref->{this_is_key}\n"; | |
190 </code></pre> | |
191 | |
192 | |
193 | |
194 </div> | |
195 | |
196 <div class='slide'> | |
197 <!-- _S9SLIDE_ --> | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
198 <h2 id="perl6のソースコード概要">Perl6のソースコード概要</h2> |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
199 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
200 <ul> |
9 | 201 <li>Perl5の文法とは比較的変更が多い |
202 <ul> | |
203 <li>雰囲気は似ている</li> | |
204 </ul> | |
205 </li> | |
1 | 206 <li>変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能</li> |
207 </ul> | |
208 | |
209 <pre><code>my $str_value = 'hello world!'; | |
210 $str_value.say; # hello world! | |
211 </code></pre> | |
212 | |
213 <ul> | |
214 <li>Perl5と同様に,変数にはデフォルトでは型がないような振る舞いをする</li> | |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
215 </ul> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
216 |
1 | 217 <pre><code>my $sample_value = 'hello world!'; |
218 $sample_value.say; # hello world! | |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
219 |
1 | 220 $sample_value = '31'; |
221 $sample_value.say; # 31 | |
222 | |
223 say($sample_value * 3); | |
224 </code></pre> | |
225 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
226 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
227 |
1 | 228 </div> |
229 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
230 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
231 <!-- _S9SLIDE_ --> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
232 <h2 id="perl6の言語的な特徴">Perl6の言語的な特徴</h2> |
1 | 233 |
234 <ul> | |
235 <li>漸進的型付き言語である為, 型を強制することも可能となる</li> | |
236 </ul> | |
237 | |
238 <pre><code>my Int $int_value = 31; | |
239 $int_value = "hello"; # Compile error! | |
240 </code></pre> | |
2 | 241 |
7 | 242 <pre><code>$ perl6 type_invalid.p6 |
243 Type check failed in assignment to $int_value; expected Int but got Str ("hello") | |
244 in block <unit> at type_invalid.p6 line 4 | |
245 </code></pre> | |
246 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
247 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
248 |
2 | 249 </div> |
250 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
251 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
252 <!-- _S9SLIDE_ --> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
253 <h2 id="perl6の言語的な特徴-1">Perl6の言語的な特徴</h2> |
4 | 254 |
255 <ul> | |
256 <li>型を独自に定義することも可能</li> | |
257 <li>入力の型によって実行する関数を変える事などができる</li> | |
258 </ul> | |
259 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
260 <pre><code class="language-perl6">my subset Fizz of Int where * %% 3; |
4 | 261 my subset Buzz of Int where * %% 5; |
262 my subset FizzBuzz of Int where Fizz&Buzz; | |
263 my subset Number of Int where none Fizz|Buzz; | |
264 | |
265 proto sub fizzbuzz ($) { * } | |
266 multi sub fizzbuzz (FizzBuzz) { "FuzzBuzz" } | |
267 multi sub fizzbuzz (Fizz) { "Fizz" } | |
268 multi sub fizzbuzz (Buzz) { "Buzz" } | |
269 multi sub fizzbuzz (Number $number) { $number } | |
270 | |
271 fizzbuzz($_).say for 1..15; | |
272 </code></pre> | |
273 | |
9 | 274 <ul> |
275 <li>型を利用したFizzBuzz</li> | |
276 </ul> | |
277 | |
278 | |
279 | |
280 </div> | |
281 | |
282 <div class='slide'> | |
283 <!-- _S9SLIDE_ --> | |
284 <h2 id="スクリプト言語">スクリプト言語</h2> | |
285 <ul> | |
286 <li>Perl6は現状コンパイルすることはできない | |
287 <ul> | |
288 <li>スクリプト言語の分類</li> | |
289 </ul> | |
290 </li> | |
291 <li>現在広く使われているスクリプト言語(Perl,Python,Ruby…)などとPerl6の構成は類似している</li> | |
292 <li>今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する</li> | |
293 </ul> | |
294 | |
295 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
296 |
7 | 297 </div> |
298 | |
299 <div class='slide'> | |
300 <!-- _S9SLIDE_ --> | |
301 <h2 id="スクリプト言語処理系">スクリプト言語処理系</h2> | |
302 <ul> | |
303 <li>スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている</li> | |
304 <li>その為スクリプト言語の実装は大きく2つで構成されている | |
305 <ul> | |
306 <li>バイトコードに変換するフロントエンド部分</li> | |
307 <li>バイトコードを解釈する仮想機械</li> | |
308 </ul> | |
309 </li> | |
310 </ul> | |
311 | |
312 <p><img src="fig/bytecode_sample_generally_lang.svg" width="80%" /></p> | |
313 | |
314 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
315 |
4 | 316 </div> |
317 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
318 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
319 <!-- _S9SLIDE_ --> |
9 | 320 <h2 id="perl6以外のスクリプト言語">Perl6以外のスクリプト言語</h2> |
321 | |
322 <ul> | |
323 <li>現在使われているプロセスVMは言語に組み込まれているものが多い</li> | |
324 <li>JVMやElixirなどのVMは複数の言語で使用されている</li> | |
325 <li>Java | |
326 <ul> | |
327 <li>JVM</li> | |
328 </ul> | |
329 </li> | |
330 <li>Ruby | |
331 <ul> | |
332 <li>YARV</li> | |
333 </ul> | |
334 </li> | |
335 <li>Python | |
336 <ul> | |
337 <li>PythonVM</li> | |
338 </ul> | |
339 </li> | |
12 | 340 <li>Erlang</li> |
9 | 341 <li>Elixir |
342 <ul> | |
343 <li>BEAM</li> | |
344 </ul> | |
345 </li> | |
346 </ul> | |
347 | |
348 | |
349 | |
350 </div> | |
351 | |
352 <div class='slide'> | |
353 <!-- _S9SLIDE_ --> | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
354 <h2 id="perl6の処理系の構成">Perl6の処理系の構成</h2> |
2 | 355 |
356 <ul> | |
9 | 357 <li>Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する)</li> |
2 | 358 <li>Rakudoは3つのレイヤーから構成されている |
359 <ul> | |
360 <li>Perl6インタプリタ</li> | |
361 <li>Perl6インタプリタを記述するPerl6のサブセットNQP</li> | |
362 <li>Perl6のバイトコードを解釈するMoarVM</li> | |
363 </ul> | |
364 </li> | |
9 | 365 <li>Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する</li> |
2 | 366 </ul> |
367 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
368 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
369 |
2 | 370 </div> |
371 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
372 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
373 <!-- _S9SLIDE_ --> |
9 | 374 <h2 id="rakudoの構成図">Rakudoの構成図</h2> |
375 | |
18 | 376 <p><img src="fig/Rakudo_overview.svg" alt="" /></p> |
9 | 377 |
378 <p>(http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html)</p> | |
379 | |
380 | |
381 | |
382 </div> | |
383 | |
384 <div class='slide'> | |
385 <!-- _S9SLIDE_ --> | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
386 <h2 id="perl6とnqp">Perl6とNQP</h2> |
2 | 387 |
388 <ul> | |
9 | 389 <li>NQP(NotQuitPerl Perl) |
390 <ul> | |
391 <li>Perl6のサブセット。Perl6っぽい言語</li> | |
392 </ul> | |
393 </li> | |
394 <li>Perl6、 NQP自体がNQPで記述されている</li> | |
2 | 395 <li>NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う</li> |
396 <li>NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する</li> | |
9 | 397 <li>元々はPerl6の主力実装がParrotだった時代に登場 |
398 <ul> | |
399 <li>文法がアップデートされており、当時の資料は古くなっている</li> | |
400 </ul> | |
401 </li> | |
402 </ul> | |
403 | |
404 <pre><code>my $value := "hello!"; | |
405 say($value); | |
406 </code></pre> | |
407 | |
408 | |
409 | |
410 </div> | |
411 | |
412 <div class='slide'> | |
413 <!-- _S9SLIDE_ --> | |
414 <h2 id="nqpスクリプト">NQPスクリプト</h2> | |
415 | |
416 <ul> | |
417 <li>変数は束縛 <code>:=</code> を使う</li> | |
418 <li>関数の間に空白を入れてはいけない</li> | |
419 <li>再帰呼び出しを使うフィボナッチ数列</li> | |
2 | 420 </ul> |
421 | |
4 | 422 <pre><code>#! nqp |
423 sub fib($n) { | |
424 $n < 2 ?? $n !! fib($n-1) + fib($n - 2); | |
425 } | |
426 | |
427 my $N := 29; | |
428 | |
429 my $z := fib($N); | |
430 | |
431 nqp::say("fib($N) = " ~ fib($N)); | |
432 </code></pre> | |
433 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
434 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
435 |
2 | 436 </div> |
437 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
438 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
439 <!-- _S9SLIDE_ --> |
9 | 440 <h2 id="nqpスクリプトnまでの整数の和">NQPスクリプト(nまでの整数の和)</h2> |
441 | |
442 <pre><code class="language-perl6">sub add_test($n){ | |
10 | 443 my $sum := 0; |
9 | 444 while ( $n > 1) { |
445 $sum := $sum + $n; | |
446 --$n; | |
447 } | |
448 return $sum; | |
449 } | |
450 | |
451 say(add_test(10000)); | |
452 </code></pre> | |
453 | |
454 | |
455 | |
456 </div> | |
457 | |
458 <div class='slide'> | |
459 <!-- _S9SLIDE_ --> | |
10 | 460 <h2 id="nqp">NQP</h2> |
9 | 461 |
2 | 462 <ul> |
9 | 463 <li>NQPはPerl6の中で一番レイヤーが低い言語</li> |
464 <li>その為、 実行するVMのオペコード(処理単位)を使用することができる</li> | |
10 | 465 <li>NQPオペコードは、 Perl6の内部の抽象構文木でも使用されている</li> |
466 <li>また、 Perl6と同様に型を指定することが可能</li> | |
9 | 467 </ul> |
468 | |
10 | 469 <pre><code class="language-perl6">sub add_test(int $n){ |
470 mu $sum := 0; | |
471 while nqp::isgt_i($n,1) { | |
472 $sum := nqp::add_i($sum,$n); | |
473 $n := nqp::sub_i($n,1); | |
474 } | |
475 return $sum; | |
476 } | |
477 </code></pre> | |
478 | |
9 | 479 |
480 | |
481 </div> | |
482 | |
483 <div class='slide'> | |
484 <!-- _S9SLIDE_ --> | |
485 <h2 id="nqpとmoarvm">NQPとMoarVM</h2> | |
486 <ul> | |
14 | 487 <li>NQPは実行する際にMoarVM/JVMが必要となる |
5 | 488 <ul> |
9 | 489 <li>NQPコンパイラが各VMに対応したバイトコードに変換する</li> |
3 | 490 </ul> |
491 </li> | |
14 | 492 <li>MoarVMの場合は、MoarVMのバイナリ moar に、 NQPのインタプリタのバイトコードをライブラリや入力として与える</li> |
7 | 493 </ul> |
494 | |
495 | |
496 | |
497 </div> | |
498 | |
499 <div class='slide'> | |
500 <!-- _S9SLIDE_ --> | |
9 | 501 <h2 id="perl6のvm">Perl6のVM</h2> |
7 | 502 <ul> |
9 | 503 <li>MoarVM, JVM , JavaScriptが選択可能 |
504 <ul> | |
505 <li>メインで開発されているのはMoarVMであり、 他のVMは機能が実装されていないものが存在する</li> | |
506 </ul> | |
507 </li> | |
508 <li><code>rakudo-star</code> というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる</li> | |
509 </ul> | |
510 | |
511 | |
512 | |
513 </div> | |
514 | |
515 <div class='slide'> | |
516 <!-- _S9SLIDE_ --> | |
517 <h2 id="moarvm">MoarVM</h2> | |
518 <ul> | |
14 | 519 <li>Metamodel On A Runtime</li> |
9 | 520 <li>C言語で記述されているPerl6専用の仮想機械</li> |
7 | 521 <li>レジスタマシン |
522 <ul> | |
523 <li>型情報を持つレジスタに対しての演算として処理される</li> | |
9 | 524 <li>Rubyなどはスタックマシンとして実装されている</li> |
7 | 525 </ul> |
526 </li> | |
14 | 527 <li>Unicodeのサポートや、LuaJITなどを利用したJITコンパイルなども可能</li> |
7 | 528 <li>Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する</li> |
529 </ul> | |
530 | |
531 | |
532 | |
533 </div> | |
534 | |
535 <div class='slide'> | |
536 <!-- _S9SLIDE_ --> | |
537 <h2 id="バイトコード">バイトコード</h2> | |
538 <ul> | |
3 | 539 <li>Perl6も、Rakudo/NQPはバイトコードに変換され、 バイトコードをVMが実行する</li> |
10 | 540 <li>Perl6/NQPはバイトコードにコンパイルすることが可能 |
541 <ul> | |
542 <li>直接実行することはできない</li> | |
543 </ul> | |
544 </li> | |
545 </ul> | |
546 | |
547 <pre><code>$nqp --target=mbc --output=fib.moarvm fib.nqp | |
548 </code></pre> | |
549 | |
550 | |
551 | |
552 </div> | |
553 | |
554 <div class='slide'> | |
555 <!-- _S9SLIDE_ --> | |
12 | 556 <h2 id="バイトコード-1">バイトコード</h2> |
557 <ul> | |
558 <li>バイナリ形式で表現される為、 VMがどのように読み取るかでバイトコードの意味が異なる</li> | |
14 | 559 <li>スクリプト言語系のVMは、 VMという名前の通り、 計算機をエミュレートしている |
560 <ul> | |
561 <li>その為、通常のCPUのストア命令などに相当する命令が実装されている</li> | |
562 <li>スクリプト言語は、その命令の実行を繰り返すことでプログラムを評価する</li> | |
563 </ul> | |
564 </li> | |
12 | 565 <li>スクリプト言語で重要なバイトコード表現は、「仮想機械がどの命令を実行するか」のバイトコード |
566 <ul> | |
14 | 567 <li>CPUに対するアセンブラの数値に対応する</li> |
12 | 568 </ul> |
569 </li> | |
570 <li>どういった構成なのかは仮想機械によって異なる</li> | |
571 </ul> | |
572 | |
573 | |
574 | |
575 </div> | |
576 | |
577 <div class='slide'> | |
578 <!-- _S9SLIDE_ --> | |
10 | 579 <h2 id="バイトコードとmoarvm">バイトコードとMoarVM</h2> |
580 | |
581 <ul> | |
582 <li>MoarVMバイトコードはMoarVMの実行バイナリ <code>moar</code> でディスアセンブルすることが可能</li> | |
2 | 583 </ul> |
584 | |
10 | 585 <pre><code> annotation: add_test.nqp:1 |
586 00003 const_i64_16 loc_2_int, 0 | |
587 00004 hllboxtype_i loc_3_obj | |
588 00005 box_i loc_3_obj, loc_2_int, loc_3_obj | |
589 00006 set loc_1_obj, loc_3_obj | |
590 label_1: | |
591 00007 decont loc_3_obj, loc_0_obj | |
592 00008 smrt_numify loc_4_num, loc_3_obj | |
593 00009 const_i64_16 loc_2_int, 1 | |
594 00010 coerce_in loc_5_num, loc_2_int | |
595 00011 gt_n loc_2_int, loc_4_num, loc_5_num | |
596 00012 unless_i loc_2_int, label_2(00031) | |
597 00013 osrpoint | |
598 annotation: add_test.nqp:3 | |
599 00014 decont loc_3_obj, loc_1_obj | |
600 00015 smrt_numify loc_5_num, loc_3_obj | |
601 00016 decont loc_3_obj, loc_0_obj | |
602 00017 smrt_numify loc_4_num, loc_3_obj | |
603 00018 add_n loc_4_num, loc_5_num, loc_4_num | |
604 00019 hllboxtype_n loc_3_obj | |
605 00020 box_n loc_3_obj, loc_4_num, loc_3_obj | |
606 00021 set loc_1_obj, loc_3_obj | |
607 00022 decont loc_3_obj, loc_0_obj | |
608 00023 smrt_numify loc_4_num, loc_3_obj | |
609 00024 coerce_ni loc_6_int, loc_4_num | |
610 00025 const_i64_16 loc_7_int, 1 | |
611 00026 sub_i loc_7_int, loc_6_int, loc_7_int | |
612 00027 hllboxtype_i loc_3_obj | |
613 00028 box_i loc_3_obj, loc_7_int, loc_3_obj | |
614 00029 set loc_0_obj, loc_3_obj | |
615 00030 goto label_1(00007) | |
616 </code></pre> | |
617 | |
618 | |
619 | |
620 </div> | |
621 | |
622 <div class='slide'> | |
623 <!-- _S9SLIDE_ --> | |
624 <h2 id="nqpとバイトコードの対応">NQPとバイトコードの対応</h2> | |
625 | |
626 <pre><code>say(add_test(10000)); | |
627 </code></pre> | |
628 | |
629 <pre><code> annotation: add_test.nqp:1 | |
630 label_1: | |
631 00020 getlex_no loc_7_obj, '&say' | |
632 00021 decont loc_7_obj, loc_7_obj | |
633 00022 const_s loc_3_str, '&add_test' | |
634 00023 getlexstatic_o loc_8_obj, loc_3_str | |
635 00024 decont loc_8_obj, loc_8_obj | |
636 00025 const_i64_16 loc_5_int, 10000 | |
637 00026 prepargs Callsite_1 | |
638 00027 arg_i 0, loc_5_int | |
639 00028 invoke_o loc_8_obj, loc_8_obj | |
640 00029 prepargs Callsite_0 | |
641 00030 arg_o 0, loc_8_obj | |
642 00031 invoke_v loc_7_obj | |
643 00032 null loc_7_obj | |
644 00033 return_o loc_7_obj | |
645 </code></pre> | |
646 | |
647 <ul> | |
648 <li>Perl6の変数は直接実態を参照せず、中身が入っているコンテナを参照するようになっている。</li> | |
649 <li>その為 <code>decont</code> 命令で、コンテナの中身をレジスタに設定する必要がある</li> | |
650 <li><code>const_i64_16</code> などは64bitの数という意味で、 <code>int</code> 型としてレジスタに登録している</li> | |
651 <li><code>prepargs</code> で引数の確認を行い, <code>invoke_o</code> で実際にサブルーチンに移行する</li> | |
652 </ul> | |
653 | |
654 | |
655 | |
656 </div> | |
657 | |
658 <div class='slide'> | |
659 <!-- _S9SLIDE_ --> | |
660 <h2 id="nqpとバイトコードの対応-1">NQPとバイトコードの対応</h2> | |
661 | |
662 <pre><code>my $sum := 0; | |
663 </code></pre> | |
664 | |
665 <pre><code> annotation: add_test.nqp:1 | |
666 00003 const_i64_16 loc_2_int, 0 | |
667 00004 hllboxtype_i loc_3_obj | |
668 00005 box_i loc_3_obj, loc_2_int, loc_3_obj | |
669 00006 set loc_1_obj, loc_3_obj | |
670 </code></pre> | |
671 | |
672 <ul> | |
673 <li>まず <code>loc_2</code> レジスタをint型の整数0で初期化する</li> | |
674 <li>変数 <code>$sum</code> はint型の指定がないので、 obj型で登録しなければならない</li> | |
675 <li>その為, 整数として登録された <code>loc_2</code> から、 obj型に一旦キャストし、 <code>loc_3</code> レジスタに設定したものを、 <code>loc_1</code> レジスタに設定する</li> | |
676 </ul> | |
677 | |
678 | |
679 | |
680 </div> | |
681 | |
682 <div class='slide'> | |
683 <!-- _S9SLIDE_ --> | |
684 <h2 id="nqpとバイトコードの対応-2">NQPとバイトコードの対応</h2> | |
685 | |
686 <pre><code> while ( $n > 1) { | |
687 </code></pre> | |
688 | |
689 <pre><code> label_1: | |
690 00007 decont loc_3_obj, loc_0_obj | |
691 00008 smrt_numify loc_4_num, loc_3_obj | |
692 00009 const_i64_16 loc_2_int, 1 | |
693 00010 coerce_in loc_5_num, loc_2_int | |
694 00011 gt_n loc_2_int, loc_4_num, loc_5_num | |
695 00012 unless_i loc_2_int, label_2(00031) | |
696 00013 osrpoint | |
697 </code></pre> | |
698 | |
699 <ul> | |
700 <li>比較にもint型の指定がない為、 <code>num</code> 型にキャストし、 <code>num</code> 型のレジスタでの大小を比較する</li> | |
701 <li>比較命令は <code>gt_n</code> であり、 結果により <code>unless_i</code> 命令で、別のラベルにジャンプする</li> | |
702 </ul> | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
703 |
14 | 704 |
705 | |
706 </div> | |
707 | |
708 <div class='slide'> | |
709 <!-- _S9SLIDE_ --> | |
710 <h2 id="decode命令">decode命令</h2> | |
711 | |
712 <pre><code> while ( $n > 1) { | |
713 </code></pre> | |
714 | |
715 <pre><code>00007 decont loc_3_obj, loc_0_obj | |
716 </code></pre> | |
717 | |
718 <p><img src="fig/decont_perl6_loc3.svg" alt="" /></p> | |
719 | |
720 <ul> | |
721 <li>変数 <code>$n</code> と 整数 <code>1</code> を大小比較する為、 まず <code>$n</code> から値を取り出す</li> | |
722 <li>とりだした時点では、何の型で使うかは決定していない為、 obj型として判定する</li> | |
723 </ul> | |
724 | |
725 | |
726 | |
727 </div> | |
728 | |
729 <div class='slide'> | |
730 <!-- _S9SLIDE_ --> | |
731 <h2 id="smrt_nomify">smrt_nomify</h2> | |
732 | |
733 <pre><code> while ( $n > 1) { | |
734 </code></pre> | |
735 | |
736 <pre><code>00008 smrt_numify loc_4_num, loc_3_obj | |
737 </code></pre> | |
738 | |
17 | 739 <ul> |
740 <li><code>smrt_numify</code> はレジスタ上のオブジェクトを、 num型に変換し、 別のレジスタに登録する命令</li> | |
18 | 741 <li>今回の整数の比較では、 int型の強制がない為、 数値として比較するためにn64型にキャストしている |
742 <ul> | |
743 <li>numはn64型であり、 64ビットの浮動小数点定数の意味</li> | |
744 </ul> | |
745 </li> | |
17 | 746 </ul> |
747 | |
748 <p><img src="fig/perl6_num_convert.svg" alt="" /></p> | |
749 | |
750 | |
751 | |
752 </div> | |
753 | |
754 <div class='slide'> | |
755 <!-- _S9SLIDE_ --> | |
18 | 756 <h2 id="const_i64_16とcoerece_in">const_i64_16とcoerece_in</h2> |
757 | |
758 <pre><code> while ( $n > 1) { | |
759 </code></pre> | |
760 | |
761 <pre><code>00009 const_i64_16 loc_2_int, 1 | |
762 00010 coerce_in loc_5_num, loc_2_int | |
763 </code></pre> | |
764 <ul> | |
765 <li>64ビット整数として1をレジスタ <code>loc_2</code> に設定する</li> | |
766 <li>その後、 numでの比較のためにキャストし, <code>loc_5</code> レジスタに設定している</li> | |
767 </ul> | |
768 | |
769 | |
770 | |
771 </div> | |
772 | |
773 <div class='slide'> | |
774 <!-- _S9SLIDE_ --> | |
775 <h2 id="比較とif文の判定">比較とif文の判定</h2> | |
776 | |
777 <pre><code> while ( $n > 1) { | |
778 </code></pre> | |
779 | |
780 <pre><code>00011 gt_n loc_2_int, loc_4_num, loc_5_num | |
781 00012 unless_i loc_2_int, label_2(00031) | |
782 </code></pre> | |
783 | |
784 <ul> | |
785 <li><code>gt_n</code> で <code>loc_4</code> (nが入っている) レジスタと <code>loc_5</code> (1が入っているレジスタ)を比較する | |
786 <ul> | |
787 <li>結果により <code>loc_2</code> レジスタに真偽値がint型で代入される</li> | |
788 </ul> | |
789 </li> | |
790 <li>その結果を <code>unless_i</code> で読み取り、 値が偽であったら <code>label_2(00031)</code> にジャンプする</li> | |
791 </ul> | |
792 | |
793 | |
794 | |
795 </div> | |
796 | |
797 <div class='slide'> | |
798 <!-- _S9SLIDE_ --> | |
799 <h2 id="c言語での実装へ">C言語での実装へ</h2> | |
800 <ul> | |
801 <li>今まではスクリプトレベルでの実装を見てきました</li> | |
802 <li>スクリプトが実行されるVMの実装をCレベルで見ていきましょう</li> | |
803 </ul> | |
804 | |
805 | |
806 | |
807 </div> | |
808 | |
809 <div class='slide'> | |
810 <!-- _S9SLIDE_ --> | |
17 | 811 <h2 id="moarvmのバイトコードインタプリタ部分">MoarVMのバイトコードインタプリタ部分</h2> |
812 <p>MoarVMなどの言語処理系のバイトコードインタプリタは次のことを繰り返している</p> | |
813 <ol> | |
814 <li>入力されたバイトコード列から命令に対応する部分を読み取る</li> | |
815 <li>読み込んだ数値から、 対応する命令を取得する</li> | |
816 <li>命令部分を実行する</li> | |
817 <li>バイトコード列を次に進め、繰り返す</li> | |
818 </ol> | |
819 | |
820 <ul> | |
18 | 821 <li>この部分の実装は大体次のようなパターンで記述されている</li> |
17 | 822 </ul> |
823 | |
824 | |
825 | |
826 </div> | |
827 | |
828 <div class='slide'> | |
829 <!-- _S9SLIDE_ --> | |
830 <h2 id="巨大なswitch文を使うケース">巨大なswitch文を使うケース</h2> | |
831 | |
832 <ul> | |
833 <li>命令に対応するバイトコードを数値に変換できるようにし、 switch-case文で分岐させる</li> | |
834 <li>実行のたびにループで先頭に戻り、次の命令を計算する必要があるので低速</li> | |
835 </ul> | |
836 | |
18 | 837 <pre><code> while( pc != NULL) { |
838 switch(pc){ | |
839 case ADD_INSTRUCTION: | |
840 // instruction.... | |
841 break; | |
842 case SUBD_INSTRUCTION: | |
843 // instruction.... | |
844 break; | |
845 } | |
846 } | |
17 | 847 </code></pre> |
848 | |
849 | |
850 | |
851 </div> | |
852 | |
853 <div class='slide'> | |
854 <!-- _S9SLIDE_ --> | |
855 <h2 id="cコンパイラのラベルgotoを使うケース">Cコンパイラのラベルgotoを使うケース</h2> | |
856 | |
857 <ul> | |
858 <li>巨大なcase文とループではなく、 次の命令の実行場所に直接jmpで移動する</li> | |
18 | 859 <li>GCC拡張でサポートしている場合「<code>&&ラベル名</code> 」でラベルのアドレスが取得できる |
860 <ul> | |
861 <li>取得したアドレスに対して「goto アドレス」でgoto文でjmpする</li> | |
862 </ul> | |
863 </li> | |
17 | 864 <li>次の命令に対応するラベルを取得する必要があるが、 ループする必要がなく高速</li> |
865 <li>ラベルgotoであり、 Cコンパイラの拡張機能として搭載されている | |
866 <ul> | |
867 <li>gccおよびLLVM/clangには実装されている</li> | |
868 </ul> | |
869 </li> | |
870 </ul> | |
871 | |
18 | 872 <pre><code> static const void *CODES[] = {&&ADD_INSTRUCTION, &&SUB_INSTRCUTION}; |
873 | |
874 goto *CODES[pc]; | |
875 | |
876 ADD_INSTRUCTION: | |
877 // instruction... | |
878 pc++; | |
879 goto *CODES[pc]; | |
880 | |
881 SUB_INSTRUCTION: | |
882 // instruction... | |
883 pc++; | |
884 goto *CODES[pc]; | |
17 | 885 </code></pre> |
886 | |
887 | |
888 | |
889 </div> | |
890 | |
891 <div class='slide'> | |
892 <!-- _S9SLIDE_ --> | |
893 <h2 id="moarvmでは">MoarVMでは</h2> | |
894 <ul> | |
895 <li>ラベルgotoが利用できる場合は利用する</li> | |
896 <li>使えないコンパイラの場合は、 switch文を利用する | |
897 <ul> | |
898 <li>この判断はマクロで処理をしている</li> | |
899 </ul> | |
900 </li> | |
901 <li>一般的にはラベルgotoの方が高速である為、他のスクリプト言語でもラベルgotoが使われている</li> | |
902 </ul> | |
14 | 903 |
18 | 904 |
905 | |
906 </div> | |
907 | |
908 <div class='slide'> | |
909 <!-- _S9SLIDE_ --> | |
910 <h2 id="moarvmのc言語での実装">MoarVMのC言語での実装</h2> | |
911 | |
912 <ul> | |
913 <li><a href="https://github.com/MoarVM/MoarVM">GitHub上にリポジトリ</a>がある</li> | |
914 <li><code>src/core/interp.c</code> がバイトコードインタプリタの実装コード</li> | |
915 <li>この中でマクロを使いつつ、 バイトコードに対応した命令を処理している</li> | |
916 <li><code>MVM_interp_run</code>が実際にバイトコードを解釈している</li> | |
917 </ul> | |
918 | |
919 <pre><code>/* This is the interpreter run loop. We have one of these per thread. */ | |
920 void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContext *, void *), void *invoke_data) { | |
921 #if MVM_CGOTO | |
922 #include "oplabels.h" | |
923 #endif | |
924 | |
925 /* Points to the place in the bytecode right after the current opcode. */ | |
926 /* See the NEXT_OP macro for making sense of this */ | |
927 MVMuint8 *cur_op = NULL; | |
928 | |
929 /* The current frame's bytecode start. */ | |
930 MVMuint8 *bytecode_start = NULL; | |
931 | |
932 /* Points to the base of the current register set for the frame we | |
933 * are presently in. */ | |
934 MVMRegister *reg_base = NULL; | |
935 | |
936 /* Points to the current compilation unit. */ | |
937 MVMCompUnit *cu = NULL; | |
938 | |
939 /* The current call site we're constructing. */ | |
940 MVMCallsite *cur_callsite = NULL; | |
941 | |
942 /* Stash addresses of current op, register base and SC deref base | |
943 * in the TC; this will be used by anything that needs to switch | |
944 * the current place we're interpreting. */ | |
945 tc->interp_cur_op = &cur_op; | |
946 tc->interp_bytecode_start = &bytecode_start; | |
947 tc->interp_reg_base = &reg_base; | |
948 tc->interp_cu = &cu; | |
949 | |
950 /* With everything set up, do the initial invocation (exactly what this does | |
951 * varies depending on if this is starting a new thread or is the top-level | |
952 * program entry point). */ | |
953 initial_invoke(tc, invoke_data); | |
954 </code></pre> | |
955 | |
956 | |
957 | |
958 </div> | |
959 | |
960 <div class='slide'> | |
961 <!-- _S9SLIDE_ --> | |
962 <h2 id="moarvmのレジスタ構成">MoarVMのレジスタ構成</h2> | |
963 | |
964 <ul> | |
965 <li>レジスタはそれぞれの型を共用体のデータ構造で持っている</li> | |
966 <li>型名は各命令の接尾辞に対応している</li> | |
967 </ul> | |
968 | |
969 <pre><code>/* Different views of a register. */ | |
970 union MVMRegister { | |
971 MVMObject *o; | |
972 MVMString *s; | |
973 MVMint8 i8; | |
974 MVMuint8 u8; | |
975 MVMint16 i16; | |
976 MVMuint16 u16; | |
977 MVMint32 i32; | |
978 MVMuint32 u32; | |
979 MVMint64 i64; | |
980 MVMuint64 u64; | |
981 MVMnum32 n32; | |
982 MVMnum64 n64; | |
983 }; | |
984 </code></pre> | |
985 | |
986 | |
987 | |
988 </div> | |
989 | |
990 <div class='slide'> | |
991 <!-- _S9SLIDE_ --> | |
992 <h2 id="mvm_interp_runの登場人物">MVM_interp_runの登場人物</h2> | |
993 | |
994 <ul> | |
995 <li><code>cur_op</code> が読み取るのバイトコード列の先頭ポインタを保存している</li> | |
996 <li><code>op</code> が現在実行する命令の数値が入っている</li> | |
997 <li><code>reg_base</code> がMoarVMのレジスタの集合配列</li> | |
998 </ul> | |
999 | |
1000 <pre><code> /* Points to the place in the bytecode right after the current opcode. */ | |
1001 /* See the NEXT_OP macro for making sense of this */ | |
1002 MVMuint8 *cur_op = NULL; | |
1003 | |
1004 /* The current frame's bytecode start. */ | |
1005 MVMuint8 *bytecode_start = NULL; | |
1006 | |
1007 /* Points to the base of the current register set for the frame we | |
1008 * are presently in. */ | |
1009 MVMRegister *reg_base = NULL; | |
1010 </code></pre> | |
1011 | |
1012 | |
1013 | |
1014 </div> | |
1015 | |
1016 <div class='slide'> | |
1017 <!-- _S9SLIDE_ --> | |
1018 <h2 id="mvm_interp_runメインループ">MVM_interp_runメインループ</h2> | |
1019 | |
1020 <ul> | |
1021 <li><code>runloop</code>がメインのループで処理を行っている | |
1022 <ul> | |
1023 <li><code>DISPATCH</code>部分で命令をバイトコード列から取り出している</li> | |
1024 </ul> | |
1025 </li> | |
1026 </ul> | |
1027 | |
1028 <pre><code> /* Enter runloop. */ | |
1029 runloop: { | |
1030 MVMuint16 op; | |
1031 | |
1032 #if MVM_TRACING | |
1033 if (tracing_enabled) { | |
1034 char *trace_line; | |
1035 trace_line = MVM_exception_backtrace_line(tc, tc->cur_frame, 0, cur_op); | |
1036 fprintf(stderr, "Op %d%s\n", (int)*((MVMuint16 *)cur_op), trace_line); | |
1037 /* slow tracing is slow. Feel free to speed it. */ | |
1038 MVM_free(trace_line); | |
1039 } | |
1040 #endif | |
1041 | |
1042 /* The ops should be in the same order here as in the oplist file, so | |
1043 * the compiler can can optimise the switch properly. To check if they | |
1044 * are in the same order as the oplist use the | |
1045 * tools/compare-oplist-interp-order.sh helper script. */ | |
1046 DISPATCH(NEXT_OP) { | |
1047 OP(no_op): | |
1048 goto NEXT; | |
1049 OP(const_i8): | |
1050 OP(const_i16): | |
1051 OP(const_i32): | |
1052 MVM_exception_throw_adhoc(tc, "const_iX NYI"); | |
1053 OP(const_i64): | |
1054 GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); | |
1055 cur_op += 10; | |
1056 goto NEXT; | |
1057 </code></pre> | |
1058 | |
1059 | |
1060 | |
1061 </div> | |
1062 | |
1063 <div class='slide'> | |
1064 <!-- _S9SLIDE_ --> | |
1065 <h2 id="mvm_interp_runメインループ-1">MVM_interp_runメインループ</h2> | |
1066 | |
1067 <ul> | |
1068 <li><code>DISPATCH</code>はマクロになっている | |
1069 <ul> | |
1070 <li>ラベルgotoが使えるケースはDISPATCHは何も意味を持たない</li> | |
1071 <li>使えない場合はswitch文に展開される | |
1072 <ul> | |
1073 <li><code>op</code> に実行する命令の数値が格納されているので、 これに応じてswitchで飛ぶ</li> | |
1074 </ul> | |
1075 </li> | |
1076 </ul> | |
1077 </li> | |
1078 </ul> | |
1079 | |
1080 <pre><code>#if MVM_CGOTO | |
1081 #define DISPATCH(op) | |
1082 #define OP(name) OP_ ## name | |
1083 #define NEXT *LABELS[NEXT_OP] | |
1084 #else | |
1085 #define DISPATCH(op) switch (op) | |
1086 #define OP(name) case MVM_OP_ ## name | |
1087 #define NEXT runloop | |
1088 #endif | |
1089 </code></pre> | |
1090 | |
1091 | |
1092 | |
1093 </div> | |
1094 | |
1095 <div class='slide'> | |
1096 <!-- _S9SLIDE_ --> | |
1097 <h2 id="mvm_interp_runメインループ-2">MVM_interp_runメインループ</h2> | |
1098 | |
1099 <ul> | |
1100 <li><code>OP</code> が命令のスコープを切るマクロとなっている | |
1101 <ul> | |
1102 <li>gotoが使える場合 | |
1103 <ul> | |
1104 <li><code>##name</code> に展開され、 それぞれの命令の名前を持つラベルになる</li> | |
1105 </ul> | |
1106 </li> | |
1107 <li>gotoが使えない場合 | |
1108 <ul> | |
1109 <li>case文に展開される</li> | |
1110 </ul> | |
1111 </li> | |
1112 </ul> | |
1113 </li> | |
1114 </ul> | |
1115 | |
1116 <pre><code>#if MVM_CGOTO | |
1117 #define DISPATCH(op) | |
1118 #define OP(name) OP_ ## name | |
1119 #define NEXT *LABELS[NEXT_OP] | |
1120 #else | |
1121 #define DISPATCH(op) switch (op) | |
1122 #define OP(name) case MVM_OP_ ## name | |
1123 #define NEXT runloop | |
1124 #endif | |
1125 </code></pre> | |
1126 | |
1127 | |
1128 | |
1129 </div> | |
1130 | |
1131 <div class='slide'> | |
1132 <!-- _S9SLIDE_ --> | |
1133 <h2 id="mvm_interp_runメインループ-3">MVM_interp_runメインループ</h2> | |
1134 | |
1135 <ul> | |
1136 <li>次の命令には <code>NEXT</code> マクロで移動する | |
1137 <ul> | |
1138 <li>gotoが使える場合 | |
1139 <ul> | |
1140 <li>次のラベルに対応したアドレスを配列LABELSから取り出しgotoする</li> | |
1141 </ul> | |
1142 </li> | |
1143 <li>gotoが使えない場合 | |
1144 <ul> | |
1145 <li><code>runloop</code>に対してgotoする(先頭へのループ)</li> | |
1146 </ul> | |
1147 </li> | |
1148 </ul> | |
1149 </li> | |
1150 </ul> | |
1151 | |
1152 <pre><code>#if MVM_CGOTO | |
1153 #define DISPATCH(op) | |
1154 #define OP(name) OP_ ## name | |
1155 #define NEXT *LABELS[NEXT_OP] | |
1156 #else | |
1157 #define DISPATCH(op) switch (op) | |
1158 #define OP(name) case MVM_OP_ ## name | |
1159 #define NEXT runloop | |
1160 #endif | |
1161 </code></pre> | |
1162 | |
1163 | |
1164 | |
1165 </div> | |
1166 | |
1167 <div class='slide'> | |
1168 <!-- _S9SLIDE_ --> | |
1169 <h2 id="それぞれの命令の実装">それぞれの命令の実装</h2> | |
1170 | |
1171 <ul> | |
1172 <li>マクロ <code>GET_REG</code> でレジスタ情報を取得する | |
1173 <ul> | |
1174 <li>末尾で型を指定する</li> | |
1175 </ul> | |
1176 </li> | |
1177 <li>よしなに処理をした後に、バイトコード列 <code>cur_op</code> をインクリメントする | |
1178 <ul> | |
1179 <li>計算機のプログラムカウンタを進めることに対応する</li> | |
1180 </ul> | |
1181 </li> | |
1182 </ul> | |
1183 | |
1184 <pre><code> OP(add_i): | |
1185 GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 + GET_REG(cur_op, 4).i64; | |
1186 cur_op += 6; | |
1187 goto NEXT; | |
1188 OP(sub_i): | |
1189 GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 - GET_REG(cur_op, 4).i64; | |
1190 cur_op += 6; | |
1191 goto NEXT; | |
1192 OP(mul_i): | |
1193 GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 * GET_REG(cur_op, 4).i64; | |
1194 cur_op += 6; | |
1195 goto NEXT; | |
1196 </code></pre> | |
1197 | |
1198 | |
1199 | |
1200 </div> | |
1201 | |
1202 <div class='slide'> | |
1203 <!-- _S9SLIDE_ --> | |
1204 <h2 id="本日の展示について">本日の展示について</h2> | |
1205 | |
1206 <ul> | |
1207 <li>現在当研究室で開発しているContinuationBasedC(CbC)で一部Perl6の処理系を書いています</li> | |
1208 <li>また、 CbCを用いたGearsOSの展示も行っています</li> | |
1209 </ul> | |
1210 | |
1211 | |
1212 | |
1213 </div> | |
1214 | |
1215 <div class='slide'> | |
1216 <!-- _S9SLIDE_ --> | |
1217 <h2 id="まとめ">まとめ</h2> | |
1218 <ul> | |
1219 <li>Perl6の内部構造に迫りました</li> | |
1220 <li>スクリプト言語の中身も通常の計算機と同じような処理をしています</li> | |
1221 <li>OSSなので皆さん読んで改造してみましょう!!</li> | |
1222 </ul> | |
1223 | |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1224 </div> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1225 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1226 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1227 </div><!-- presentation --> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1228 </body> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1229 </html> |