Mercurial > hg > Events > OSC2019
annotate slide.pdf.html @ 17:a176ea5c0264
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 19 Apr 2019 23:22:02 +0900 |
parents | d3036d998236 |
children | 1fc9d0bd924f |
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> |
9 | 126 <li>実装は歴史上複数存在しているが,主流な実装はRakudo</li> |
127 <li>言語的にはスクリプト言語であり, 漸進的型付き言語</li> | |
128 <li>動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する</li> | |
1 | 129 </ul> |
130 | |
14 | 131 <p><img src="fig/2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;" /></p> |
2 | 132 |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
133 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
134 |
1 | 135 </div> |
136 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
137 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
138 <!-- _S9SLIDE_ --> |
9 | 139 <h2 id="現在のperl6">現在のPerl6</h2> |
140 | |
141 <ul> | |
142 <li>現在のバージョンは <code>6.d</code></li> | |
143 <li><a href="https://perl6.github.io/6pad/">ブラウザ上で実行可能な環境</a>が存在する</li> | |
144 <li><a href="https://commaide.com/">IDE</a>が開発されている</li> | |
145 <li>WebApplicationFrameworkなども開発されており、 Perl5のモジュールを移行したものがいくつか存在する</li> | |
146 <li>日本では趣味のプロダクト以外社会では使用されていない | |
147 <ul> | |
148 <li>海外では実際に使われているケースも存在する</li> | |
149 </ul> | |
150 </li> | |
151 <li>処理速度では一部Perl5に勝っているが、それでも大分遅い</li> | |
152 </ul> | |
153 | |
154 | |
155 | |
156 </div> | |
157 | |
158 <div class='slide'> | |
159 <!-- _S9SLIDE_ --> | |
160 <h2 id="参考perl5のソースコード">[参考]Perl5のソースコード</h2> | |
161 | |
162 <ul> | |
163 <li>Perl5時代 | |
164 <ul> | |
165 <li>スカラ、配列、ハッシュの3種類</li> | |
166 <li>それぞれの変数への参照であるリファレンスが使用可能</li> | |
167 </ul> | |
168 </li> | |
169 </ul> | |
170 | |
171 <pre><code class="language-perl">use ustrict; | |
172 use warnings; | |
173 | |
174 my $scalar_value = "hello!"; | |
175 print "$scalar_value\n"; | |
176 | |
177 my @array = (1..10); | |
178 print "$array[0]\n"; | |
179 | |
180 my %hash = ( this_is_key => "this_is_value"); | |
181 print "$hash{this_is_key}\n"; | |
182 | |
183 my $hash_ref = \%hash; | |
184 print "$hash_ref->{this_is_key}\n"; | |
185 </code></pre> | |
186 | |
187 | |
188 | |
189 </div> | |
190 | |
191 <div class='slide'> | |
192 <!-- _S9SLIDE_ --> | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
193 <h2 id="perl6のソースコード概要">Perl6のソースコード概要</h2> |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
194 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
195 <ul> |
9 | 196 <li>Perl5の文法とは比較的変更が多い |
197 <ul> | |
198 <li>雰囲気は似ている</li> | |
199 </ul> | |
200 </li> | |
1 | 201 <li>変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能</li> |
202 </ul> | |
203 | |
204 <pre><code>my $str_value = 'hello world!'; | |
205 $str_value.say; # hello world! | |
206 </code></pre> | |
207 | |
208 <ul> | |
209 <li>Perl5と同様に,変数にはデフォルトでは型がないような振る舞いをする</li> | |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
210 </ul> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
211 |
1 | 212 <pre><code>my $sample_value = 'hello world!'; |
213 $sample_value.say; # hello world! | |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
214 |
1 | 215 $sample_value = '31'; |
216 $sample_value.say; # 31 | |
217 | |
218 say($sample_value * 3); | |
219 </code></pre> | |
220 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
221 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
222 |
1 | 223 </div> |
224 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
225 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
226 <!-- _S9SLIDE_ --> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
227 <h2 id="perl6の言語的な特徴">Perl6の言語的な特徴</h2> |
1 | 228 |
229 <ul> | |
230 <li>漸進的型付き言語である為, 型を強制することも可能となる</li> | |
231 </ul> | |
232 | |
233 <pre><code>my Int $int_value = 31; | |
234 $int_value = "hello"; # Compile error! | |
235 </code></pre> | |
2 | 236 |
7 | 237 <pre><code>$ perl6 type_invalid.p6 |
238 Type check failed in assignment to $int_value; expected Int but got Str ("hello") | |
239 in block <unit> at type_invalid.p6 line 4 | |
240 </code></pre> | |
241 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
242 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
243 |
2 | 244 </div> |
245 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
246 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
247 <!-- _S9SLIDE_ --> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
248 <h2 id="perl6の言語的な特徴-1">Perl6の言語的な特徴</h2> |
4 | 249 |
250 <ul> | |
251 <li>型を独自に定義することも可能</li> | |
252 <li>入力の型によって実行する関数を変える事などができる</li> | |
253 </ul> | |
254 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
255 <pre><code class="language-perl6">my subset Fizz of Int where * %% 3; |
4 | 256 my subset Buzz of Int where * %% 5; |
257 my subset FizzBuzz of Int where Fizz&Buzz; | |
258 my subset Number of Int where none Fizz|Buzz; | |
259 | |
260 proto sub fizzbuzz ($) { * } | |
261 multi sub fizzbuzz (FizzBuzz) { "FuzzBuzz" } | |
262 multi sub fizzbuzz (Fizz) { "Fizz" } | |
263 multi sub fizzbuzz (Buzz) { "Buzz" } | |
264 multi sub fizzbuzz (Number $number) { $number } | |
265 | |
266 fizzbuzz($_).say for 1..15; | |
267 </code></pre> | |
268 | |
9 | 269 <ul> |
270 <li>型を利用したFizzBuzz</li> | |
271 </ul> | |
272 | |
273 | |
274 | |
275 </div> | |
276 | |
277 <div class='slide'> | |
278 <!-- _S9SLIDE_ --> | |
279 <h2 id="スクリプト言語">スクリプト言語</h2> | |
280 <ul> | |
281 <li>Perl6は現状コンパイルすることはできない | |
282 <ul> | |
283 <li>スクリプト言語の分類</li> | |
284 </ul> | |
285 </li> | |
286 <li>現在広く使われているスクリプト言語(Perl,Python,Ruby…)などとPerl6の構成は類似している</li> | |
287 <li>今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する</li> | |
288 </ul> | |
289 | |
290 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
291 |
7 | 292 </div> |
293 | |
294 <div class='slide'> | |
295 <!-- _S9SLIDE_ --> | |
296 <h2 id="スクリプト言語処理系">スクリプト言語処理系</h2> | |
297 <ul> | |
298 <li>スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている</li> | |
299 <li>その為スクリプト言語の実装は大きく2つで構成されている | |
300 <ul> | |
301 <li>バイトコードに変換するフロントエンド部分</li> | |
302 <li>バイトコードを解釈する仮想機械</li> | |
303 </ul> | |
304 </li> | |
305 </ul> | |
306 | |
307 <p><img src="fig/bytecode_sample_generally_lang.svg" width="80%" /></p> | |
308 | |
309 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
310 |
4 | 311 </div> |
312 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
313 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
314 <!-- _S9SLIDE_ --> |
9 | 315 <h2 id="perl6以外のスクリプト言語">Perl6以外のスクリプト言語</h2> |
316 | |
317 <ul> | |
318 <li>現在使われているプロセスVMは言語に組み込まれているものが多い</li> | |
319 <li>JVMやElixirなどのVMは複数の言語で使用されている</li> | |
320 <li>Java | |
321 <ul> | |
322 <li>JVM</li> | |
323 </ul> | |
324 </li> | |
325 <li>Ruby | |
326 <ul> | |
327 <li>YARV</li> | |
328 </ul> | |
329 </li> | |
330 <li>Python | |
331 <ul> | |
332 <li>PythonVM</li> | |
333 </ul> | |
334 </li> | |
12 | 335 <li>Erlang</li> |
9 | 336 <li>Elixir |
337 <ul> | |
338 <li>BEAM</li> | |
339 </ul> | |
340 </li> | |
341 </ul> | |
342 | |
343 | |
344 | |
345 </div> | |
346 | |
347 <div class='slide'> | |
348 <!-- _S9SLIDE_ --> | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
349 <h2 id="perl6の処理系の構成">Perl6の処理系の構成</h2> |
2 | 350 |
351 <ul> | |
9 | 352 <li>Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する)</li> |
2 | 353 <li>Rakudoは3つのレイヤーから構成されている |
354 <ul> | |
355 <li>Perl6インタプリタ</li> | |
356 <li>Perl6インタプリタを記述するPerl6のサブセットNQP</li> | |
357 <li>Perl6のバイトコードを解釈するMoarVM</li> | |
358 </ul> | |
359 </li> | |
9 | 360 <li>Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する</li> |
2 | 361 </ul> |
362 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
363 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
364 |
2 | 365 </div> |
366 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
367 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
368 <!-- _S9SLIDE_ --> |
9 | 369 <h2 id="rakudoの構成図">Rakudoの構成図</h2> |
370 | |
371 <p><img src="fig/Rakudo_System_overview.png" alt="" /></p> | |
372 | |
373 <p>(http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html)</p> | |
374 | |
375 | |
376 | |
377 </div> | |
378 | |
379 <div class='slide'> | |
380 <!-- _S9SLIDE_ --> | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
381 <h2 id="perl6とnqp">Perl6とNQP</h2> |
2 | 382 |
383 <ul> | |
9 | 384 <li>NQP(NotQuitPerl Perl) |
385 <ul> | |
386 <li>Perl6のサブセット。Perl6っぽい言語</li> | |
387 </ul> | |
388 </li> | |
389 <li>Perl6、 NQP自体がNQPで記述されている</li> | |
2 | 390 <li>NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う</li> |
391 <li>NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する</li> | |
9 | 392 <li>元々はPerl6の主力実装がParrotだった時代に登場 |
393 <ul> | |
394 <li>文法がアップデートされており、当時の資料は古くなっている</li> | |
395 </ul> | |
396 </li> | |
397 </ul> | |
398 | |
399 <pre><code>my $value := "hello!"; | |
400 say($value); | |
401 </code></pre> | |
402 | |
403 | |
404 | |
405 </div> | |
406 | |
407 <div class='slide'> | |
408 <!-- _S9SLIDE_ --> | |
409 <h2 id="nqpスクリプト">NQPスクリプト</h2> | |
410 | |
411 <ul> | |
412 <li>変数は束縛 <code>:=</code> を使う</li> | |
413 <li>関数の間に空白を入れてはいけない</li> | |
414 <li>再帰呼び出しを使うフィボナッチ数列</li> | |
2 | 415 </ul> |
416 | |
4 | 417 <pre><code>#! nqp |
418 sub fib($n) { | |
419 $n < 2 ?? $n !! fib($n-1) + fib($n - 2); | |
420 } | |
421 | |
422 my $N := 29; | |
423 | |
424 my $z := fib($N); | |
425 | |
426 nqp::say("fib($N) = " ~ fib($N)); | |
427 </code></pre> | |
428 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
429 |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
430 |
2 | 431 </div> |
432 | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
433 <div class='slide'> |
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
434 <!-- _S9SLIDE_ --> |
9 | 435 <h2 id="nqpスクリプトnまでの整数の和">NQPスクリプト(nまでの整数の和)</h2> |
436 | |
437 <pre><code class="language-perl6">sub add_test($n){ | |
10 | 438 my $sum := 0; |
9 | 439 while ( $n > 1) { |
440 $sum := $sum + $n; | |
441 --$n; | |
442 } | |
443 return $sum; | |
444 } | |
445 | |
446 say(add_test(10000)); | |
447 </code></pre> | |
448 | |
449 | |
450 | |
451 </div> | |
452 | |
453 <div class='slide'> | |
454 <!-- _S9SLIDE_ --> | |
10 | 455 <h2 id="nqp">NQP</h2> |
9 | 456 |
2 | 457 <ul> |
9 | 458 <li>NQPはPerl6の中で一番レイヤーが低い言語</li> |
459 <li>その為、 実行するVMのオペコード(処理単位)を使用することができる</li> | |
10 | 460 <li>NQPオペコードは、 Perl6の内部の抽象構文木でも使用されている</li> |
461 <li>また、 Perl6と同様に型を指定することが可能</li> | |
9 | 462 </ul> |
463 | |
10 | 464 <pre><code class="language-perl6">sub add_test(int $n){ |
465 mu $sum := 0; | |
466 while nqp::isgt_i($n,1) { | |
467 $sum := nqp::add_i($sum,$n); | |
468 $n := nqp::sub_i($n,1); | |
469 } | |
470 return $sum; | |
471 } | |
472 </code></pre> | |
473 | |
9 | 474 |
475 | |
476 </div> | |
477 | |
478 <div class='slide'> | |
479 <!-- _S9SLIDE_ --> | |
480 <h2 id="nqpとmoarvm">NQPとMoarVM</h2> | |
481 <ul> | |
14 | 482 <li>NQPは実行する際にMoarVM/JVMが必要となる |
5 | 483 <ul> |
9 | 484 <li>NQPコンパイラが各VMに対応したバイトコードに変換する</li> |
3 | 485 </ul> |
486 </li> | |
14 | 487 <li>MoarVMの場合は、MoarVMのバイナリ moar に、 NQPのインタプリタのバイトコードをライブラリや入力として与える</li> |
7 | 488 </ul> |
489 | |
490 | |
491 | |
492 </div> | |
493 | |
494 <div class='slide'> | |
495 <!-- _S9SLIDE_ --> | |
9 | 496 <h2 id="perl6のvm">Perl6のVM</h2> |
7 | 497 <ul> |
9 | 498 <li>MoarVM, JVM , JavaScriptが選択可能 |
499 <ul> | |
500 <li>メインで開発されているのはMoarVMであり、 他のVMは機能が実装されていないものが存在する</li> | |
501 </ul> | |
502 </li> | |
503 <li><code>rakudo-star</code> というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる</li> | |
504 </ul> | |
505 | |
506 | |
507 | |
508 </div> | |
509 | |
510 <div class='slide'> | |
511 <!-- _S9SLIDE_ --> | |
512 <h2 id="moarvm">MoarVM</h2> | |
513 <ul> | |
14 | 514 <li>Metamodel On A Runtime</li> |
9 | 515 <li>C言語で記述されているPerl6専用の仮想機械</li> |
7 | 516 <li>レジスタマシン |
517 <ul> | |
518 <li>型情報を持つレジスタに対しての演算として処理される</li> | |
9 | 519 <li>Rubyなどはスタックマシンとして実装されている</li> |
7 | 520 </ul> |
521 </li> | |
14 | 522 <li>Unicodeのサポートや、LuaJITなどを利用したJITコンパイルなども可能</li> |
7 | 523 <li>Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する</li> |
524 </ul> | |
525 | |
526 | |
527 | |
528 </div> | |
529 | |
530 <div class='slide'> | |
531 <!-- _S9SLIDE_ --> | |
532 <h2 id="バイトコード">バイトコード</h2> | |
533 <ul> | |
3 | 534 <li>Perl6も、Rakudo/NQPはバイトコードに変換され、 バイトコードをVMが実行する</li> |
10 | 535 <li>Perl6/NQPはバイトコードにコンパイルすることが可能 |
536 <ul> | |
537 <li>直接実行することはできない</li> | |
538 </ul> | |
539 </li> | |
540 </ul> | |
541 | |
542 <pre><code>$nqp --target=mbc --output=fib.moarvm fib.nqp | |
543 </code></pre> | |
544 | |
545 | |
546 | |
547 </div> | |
548 | |
549 <div class='slide'> | |
550 <!-- _S9SLIDE_ --> | |
12 | 551 <h2 id="バイトコード-1">バイトコード</h2> |
552 <ul> | |
553 <li>バイナリ形式で表現される為、 VMがどのように読み取るかでバイトコードの意味が異なる</li> | |
14 | 554 <li>スクリプト言語系のVMは、 VMという名前の通り、 計算機をエミュレートしている |
555 <ul> | |
556 <li>その為、通常のCPUのストア命令などに相当する命令が実装されている</li> | |
557 <li>スクリプト言語は、その命令の実行を繰り返すことでプログラムを評価する</li> | |
558 </ul> | |
559 </li> | |
12 | 560 <li>スクリプト言語で重要なバイトコード表現は、「仮想機械がどの命令を実行するか」のバイトコード |
561 <ul> | |
14 | 562 <li>CPUに対するアセンブラの数値に対応する</li> |
12 | 563 </ul> |
564 </li> | |
565 <li>どういった構成なのかは仮想機械によって異なる</li> | |
566 </ul> | |
567 | |
568 | |
569 | |
570 </div> | |
571 | |
572 <div class='slide'> | |
573 <!-- _S9SLIDE_ --> | |
10 | 574 <h2 id="バイトコードとmoarvm">バイトコードとMoarVM</h2> |
575 | |
576 <ul> | |
577 <li>MoarVMバイトコードはMoarVMの実行バイナリ <code>moar</code> でディスアセンブルすることが可能</li> | |
2 | 578 </ul> |
579 | |
10 | 580 <pre><code> annotation: add_test.nqp:1 |
581 00003 const_i64_16 loc_2_int, 0 | |
582 00004 hllboxtype_i loc_3_obj | |
583 00005 box_i loc_3_obj, loc_2_int, loc_3_obj | |
584 00006 set loc_1_obj, loc_3_obj | |
585 label_1: | |
586 00007 decont loc_3_obj, loc_0_obj | |
587 00008 smrt_numify loc_4_num, loc_3_obj | |
588 00009 const_i64_16 loc_2_int, 1 | |
589 00010 coerce_in loc_5_num, loc_2_int | |
590 00011 gt_n loc_2_int, loc_4_num, loc_5_num | |
591 00012 unless_i loc_2_int, label_2(00031) | |
592 00013 osrpoint | |
593 annotation: add_test.nqp:3 | |
594 00014 decont loc_3_obj, loc_1_obj | |
595 00015 smrt_numify loc_5_num, loc_3_obj | |
596 00016 decont loc_3_obj, loc_0_obj | |
597 00017 smrt_numify loc_4_num, loc_3_obj | |
598 00018 add_n loc_4_num, loc_5_num, loc_4_num | |
599 00019 hllboxtype_n loc_3_obj | |
600 00020 box_n loc_3_obj, loc_4_num, loc_3_obj | |
601 00021 set loc_1_obj, loc_3_obj | |
602 00022 decont loc_3_obj, loc_0_obj | |
603 00023 smrt_numify loc_4_num, loc_3_obj | |
604 00024 coerce_ni loc_6_int, loc_4_num | |
605 00025 const_i64_16 loc_7_int, 1 | |
606 00026 sub_i loc_7_int, loc_6_int, loc_7_int | |
607 00027 hllboxtype_i loc_3_obj | |
608 00028 box_i loc_3_obj, loc_7_int, loc_3_obj | |
609 00029 set loc_0_obj, loc_3_obj | |
610 00030 goto label_1(00007) | |
611 </code></pre> | |
612 | |
613 | |
614 | |
615 </div> | |
616 | |
617 <div class='slide'> | |
618 <!-- _S9SLIDE_ --> | |
619 <h2 id="nqpとバイトコードの対応">NQPとバイトコードの対応</h2> | |
620 | |
621 <pre><code>say(add_test(10000)); | |
622 </code></pre> | |
623 | |
624 <pre><code> annotation: add_test.nqp:1 | |
625 label_1: | |
626 00020 getlex_no loc_7_obj, '&say' | |
627 00021 decont loc_7_obj, loc_7_obj | |
628 00022 const_s loc_3_str, '&add_test' | |
629 00023 getlexstatic_o loc_8_obj, loc_3_str | |
630 00024 decont loc_8_obj, loc_8_obj | |
631 00025 const_i64_16 loc_5_int, 10000 | |
632 00026 prepargs Callsite_1 | |
633 00027 arg_i 0, loc_5_int | |
634 00028 invoke_o loc_8_obj, loc_8_obj | |
635 00029 prepargs Callsite_0 | |
636 00030 arg_o 0, loc_8_obj | |
637 00031 invoke_v loc_7_obj | |
638 00032 null loc_7_obj | |
639 00033 return_o loc_7_obj | |
640 </code></pre> | |
641 | |
642 <ul> | |
643 <li>Perl6の変数は直接実態を参照せず、中身が入っているコンテナを参照するようになっている。</li> | |
644 <li>その為 <code>decont</code> 命令で、コンテナの中身をレジスタに設定する必要がある</li> | |
645 <li><code>const_i64_16</code> などは64bitの数という意味で、 <code>int</code> 型としてレジスタに登録している</li> | |
646 <li><code>prepargs</code> で引数の確認を行い, <code>invoke_o</code> で実際にサブルーチンに移行する</li> | |
647 </ul> | |
648 | |
649 | |
650 | |
651 </div> | |
652 | |
653 <div class='slide'> | |
654 <!-- _S9SLIDE_ --> | |
655 <h2 id="nqpとバイトコードの対応-1">NQPとバイトコードの対応</h2> | |
656 | |
657 <pre><code>my $sum := 0; | |
658 </code></pre> | |
659 | |
660 <pre><code> annotation: add_test.nqp:1 | |
661 00003 const_i64_16 loc_2_int, 0 | |
662 00004 hllboxtype_i loc_3_obj | |
663 00005 box_i loc_3_obj, loc_2_int, loc_3_obj | |
664 00006 set loc_1_obj, loc_3_obj | |
665 </code></pre> | |
666 | |
667 <ul> | |
668 <li>まず <code>loc_2</code> レジスタをint型の整数0で初期化する</li> | |
669 <li>変数 <code>$sum</code> はint型の指定がないので、 obj型で登録しなければならない</li> | |
670 <li>その為, 整数として登録された <code>loc_2</code> から、 obj型に一旦キャストし、 <code>loc_3</code> レジスタに設定したものを、 <code>loc_1</code> レジスタに設定する</li> | |
671 </ul> | |
672 | |
673 | |
674 | |
675 </div> | |
676 | |
677 <div class='slide'> | |
678 <!-- _S9SLIDE_ --> | |
679 <h2 id="nqpとバイトコードの対応-2">NQPとバイトコードの対応</h2> | |
680 | |
681 <pre><code> while ( $n > 1) { | |
682 </code></pre> | |
683 | |
684 <pre><code> label_1: | |
685 00007 decont loc_3_obj, loc_0_obj | |
686 00008 smrt_numify loc_4_num, loc_3_obj | |
687 00009 const_i64_16 loc_2_int, 1 | |
688 00010 coerce_in loc_5_num, loc_2_int | |
689 00011 gt_n loc_2_int, loc_4_num, loc_5_num | |
690 00012 unless_i loc_2_int, label_2(00031) | |
691 00013 osrpoint | |
692 </code></pre> | |
693 | |
694 <ul> | |
695 <li>比較にもint型の指定がない為、 <code>num</code> 型にキャストし、 <code>num</code> 型のレジスタでの大小を比較する</li> | |
696 <li>比較命令は <code>gt_n</code> であり、 結果により <code>unless_i</code> 命令で、別のラベルにジャンプする</li> | |
697 </ul> | |
6
f8f9af788fa7
remove !#SLIDE for use slideshow latest version
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
698 |
14 | 699 |
700 | |
701 </div> | |
702 | |
703 <div class='slide'> | |
704 <!-- _S9SLIDE_ --> | |
705 <h2 id="decode命令">decode命令</h2> | |
706 | |
707 <pre><code> while ( $n > 1) { | |
708 </code></pre> | |
709 | |
710 <pre><code>00007 decont loc_3_obj, loc_0_obj | |
711 </code></pre> | |
712 | |
713 <p><img src="fig/decont_perl6_loc3.svg" alt="" /></p> | |
714 | |
715 <ul> | |
716 <li>変数 <code>$n</code> と 整数 <code>1</code> を大小比較する為、 まず <code>$n</code> から値を取り出す</li> | |
717 <li>とりだした時点では、何の型で使うかは決定していない為、 obj型として判定する</li> | |
718 </ul> | |
719 | |
720 | |
721 | |
722 </div> | |
723 | |
724 <div class='slide'> | |
725 <!-- _S9SLIDE_ --> | |
726 <h2 id="smrt_nomify">smrt_nomify</h2> | |
727 | |
728 <pre><code> while ( $n > 1) { | |
729 </code></pre> | |
730 | |
731 <pre><code>00008 smrt_numify loc_4_num, loc_3_obj | |
732 </code></pre> | |
733 | |
17 | 734 <ul> |
735 <li><code>smrt_numify</code> はレジスタ上のオブジェクトを、 num型に変換し、 別のレジスタに登録する命令</li> | |
736 <li>今回の整数の比較では、 int型の強制がない為、 数値として比較するためにnum型にキャストしている</li> | |
737 </ul> | |
738 | |
739 <p><img src="fig/perl6_num_convert.svg" alt="" /></p> | |
740 | |
741 | |
742 | |
743 </div> | |
744 | |
745 <div class='slide'> | |
746 <!-- _S9SLIDE_ --> | |
747 <h2 id="moarvmのバイトコードインタプリタ部分">MoarVMのバイトコードインタプリタ部分</h2> | |
748 <p>MoarVMなどの言語処理系のバイトコードインタプリタは次のことを繰り返している</p> | |
749 <ol> | |
750 <li>入力されたバイトコード列から命令に対応する部分を読み取る</li> | |
751 <li>読み込んだ数値から、 対応する命令を取得する</li> | |
752 <li>命令部分を実行する</li> | |
753 <li>バイトコード列を次に進め、繰り返す</li> | |
754 </ol> | |
755 | |
756 <ul> | |
757 <li>この部分の実装は大体次のような処理をしている</li> | |
758 </ul> | |
759 | |
760 | |
761 | |
762 </div> | |
763 | |
764 <div class='slide'> | |
765 <!-- _S9SLIDE_ --> | |
766 <h2 id="巨大なswitch文を使うケース">巨大なswitch文を使うケース</h2> | |
767 | |
768 <ul> | |
769 <li>命令に対応するバイトコードを数値に変換できるようにし、 switch-case文で分岐させる</li> | |
770 <li>実行のたびにループで先頭に戻り、次の命令を計算する必要があるので低速</li> | |
771 </ul> | |
772 | |
773 <pre><code> | |
774 </code></pre> | |
775 | |
776 | |
777 | |
778 </div> | |
779 | |
780 <div class='slide'> | |
781 <!-- _S9SLIDE_ --> | |
782 <h2 id="cコンパイラのラベルgotoを使うケース">Cコンパイラのラベルgotoを使うケース</h2> | |
783 | |
784 <ul> | |
785 <li>巨大なcase文とループではなく、 次の命令の実行場所に直接jmpで移動する</li> | |
786 <li>次の命令に対応するラベルを取得する必要があるが、 ループする必要がなく高速</li> | |
787 <li>ラベルgotoであり、 Cコンパイラの拡張機能として搭載されている | |
788 <ul> | |
789 <li>gccおよびLLVM/clangには実装されている</li> | |
790 </ul> | |
791 </li> | |
792 </ul> | |
793 | |
794 <pre><code> | |
795 </code></pre> | |
796 | |
797 | |
798 | |
799 </div> | |
800 | |
801 <div class='slide'> | |
802 <!-- _S9SLIDE_ --> | |
803 <h2 id="moarvmでは">MoarVMでは</h2> | |
804 <ul> | |
805 <li>ラベルgotoが利用できる場合は利用する</li> | |
806 <li>使えないコンパイラの場合は、 switch文を利用する | |
807 <ul> | |
808 <li>この判断はマクロで処理をしている</li> | |
809 </ul> | |
810 </li> | |
811 <li>一般的にはラベルgotoの方が高速である為、他のスクリプト言語でもラベルgotoが使われている</li> | |
812 </ul> | |
14 | 813 |
0
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
814 </div> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
815 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
816 |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
817 </div><!-- presentation --> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
818 </body> |
19155754a586
create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
819 </html> |