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