comparison slide.md @ 9:642787982a80

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 19 Apr 2019 18:24:04 +0900
parents d8feb607c44e
children 4b1eb4d69695
comparison
equal deleted inserted replaced
7:d8feb607c44e 9:642787982a80
7 7
8 - Perl6の主要な実装であるRakudoの内部構造を探ります 8 - Perl6の主要な実装であるRakudoの内部構造を探ります
9 - Rakudoの内部で利用されているVMや, Perl6のサブセットなどについて探索します 9 - Rakudoの内部で利用されているVMや, Perl6のサブセットなどについて探索します
10 - スクリプト言語で主に使われているバイトコードインタプリタの気持ちになります 10 - スクリプト言語で主に使われているバイトコードインタプリタの気持ちになります
11 11
12 ## 内容
13 - Perl6とは?
14 - スクリプト言語処理系の動き
15 - Perl6の内部構造
16 - NQP
17 - MoarVM
18 - MoarVMのバイトコード実行
19 - まとめ
20
12 ## Perl6とは 21 ## Perl6とは
13 - 当初Perl5の時期バージョンとして開発されていたプログラミング言語 22 - 当初Perl5の時期バージョンとして開発されていたプログラミング言語
23 - 現在は別の言語として開発がそれぞれ進んでいる
14 - 仕様と実装が分離しており, 現在はテストが仕様となっている 24 - 仕様と実装が分離しており, 現在はテストが仕様となっている
15 - 実装は複数存在しているが,現在主流な実装はRakudoとなっている 25 - 実装は歴史上複数存在しているが,主流な実装はRakudo
16 - 言語的にはスクリプト言語であり, 漸進的型付き言語となっている 26 - 言語的にはスクリプト言語であり, 漸進的型付き言語
17 - MoarVM, JVMで動作する 27 - 動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する
18 28
19 <img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;"> 29 <img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;">
20 30
31 ## 現在のPerl6
32
33 - 現在のバージョンは `6.d`
34 - [ブラウザ上で実行可能な環境](https://perl6.github.io/6pad/)が存在する
35 - [IDE](https://commaide.com/)が開発されている
36 - WebApplicationFrameworkなども開発されており、 Perl5のモジュールを移行したものがいくつか存在する
37 - 日本では趣味のプロダクト以外社会では使用されていない
38 - 海外では実際に使われているケースも存在する
39 - 処理速度では一部Perl5に勝っているが、それでも大分遅い
40
41 ## [参考]Perl5のソースコード
42
43 - Perl5時代
44 − スカラ、配列、ハッシュの3種類
45 - それぞれの変数への参照であるリファレンスが使用可能
46
47 ```perl
48 use ustrict;
49 use warnings;
50
51 my $scalar_value = "hello!";
52 print "$scalar_value\n";
53
54 my @array = (1..10);
55 print "$array[0]\n";
56
57 my %hash = ( this_is_key => "this_is_value");
58 print "$hash{this_is_key}\n";
59
60 my $hash_ref = \%hash;
61 print "$hash_ref->{this_is_key}\n";
62 ```
63
21 ## Perl6のソースコード概要 64 ## Perl6のソースコード概要
22 65
23 - Perl5の文法とは比較的変更が多い 66 - Perl5の文法とは比較的変更が多い
67 - 雰囲気は似ている
24 - 変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能 68 - 変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能
25 69
26 ``` 70 ```
27 my $str_value = 'hello world!'; 71 my $str_value = 'hello world!';
28 $str_value.say; # hello world! 72 $str_value.say; # hello world!
72 multi sub fizzbuzz (Buzz) { "Buzz" } 116 multi sub fizzbuzz (Buzz) { "Buzz" }
73 multi sub fizzbuzz (Number $number) { $number } 117 multi sub fizzbuzz (Number $number) { $number }
74 118
75 fizzbuzz($_).say for 1..15; 119 fizzbuzz($_).say for 1..15;
76 ``` 120 ```
121
122 - 型を利用したFizzBuzz
123
124 ## スクリプト言語
125 - Perl6は現状コンパイルすることはできない
126 - スクリプト言語の分類
127
128 - 現在広く使われているスクリプト言語(Perl,Python,Ruby...)などとPerl6の構成は類似している
129 - 今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する
130
77 ## スクリプト言語処理系 131 ## スクリプト言語処理系
78 - スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている 132 - スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている
79 - その為スクリプト言語の実装は大きく2つで構成されている 133 - その為スクリプト言語の実装は大きく2つで構成されている
80 - バイトコードに変換するフロントエンド部分 134 - バイトコードに変換するフロントエンド部分
81 - バイトコードを解釈する仮想機械 135 - バイトコードを解釈する仮想機械
82 136
83 <img src="fig/bytecode_sample_generally_lang.svg" width="80%"> 137 <img src="fig/bytecode_sample_generally_lang.svg" width="80%">
84 138
139
140 ## Perl6以外のスクリプト言語
141
142 - 現在使われているプロセスVMは言語に組み込まれているものが多い
143 - JVMやElixirなどのVMは複数の言語で使用されている
144 - Java
145 - JVM
146 - Ruby
147 - YARV
148 - Python
149 - PythonVM
150 - Elixir
151 - BEAM
152
85 ## Perl6の処理系の構成 153 ## Perl6の処理系の構成
86 154
87 - Perl6の処理系は現在はRakudoと呼ばれる(歴史上複数存在する) 155 - Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する)
88 - Rakudoは3つのレイヤーから構成されている 156 - Rakudoは3つのレイヤーから構成されている
89 - Perl6インタプリタ 157 - Perl6インタプリタ
90 - Perl6インタプリタを記述するPerl6のサブセットNQP 158 - Perl6インタプリタを記述するPerl6のサブセットNQP
91 - Perl6のバイトコードを解釈するMoarVM 159 - Perl6のバイトコードを解釈するMoarVM
92 - このうちPerl6インタプリタとNQPはNQP自身で記述されている 160 - Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する
93 - MoarVMはC言語で記述されている 161
94 162 ## Rakudoの構成図
95 163
96 164 ![](fig/Rakudo_System_overview.png)
165
166 (http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html)
97 167
98 ## Perl6とNQP 168 ## Perl6とNQP
99 169
100 - NQP(NotQuitPerl Perlっぽい別の言語)でRakudoを記述している 170 - NQP(NotQuitPerl Perl)
171 - Perl6のサブセット。Perl6っぽい言語
172 - Perl6、 NQP自体がNQPで記述されている
101 - NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う 173 - NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う
102 - NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する 174 - NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する
175 - 元々はPerl6の主力実装がParrotだった時代に登場
176 - 文法がアップデートされており、当時の資料は古くなっている
177
178 ```
179 my $value := "hello!";
180 say($value);
181 ```
182
183 ## NQPスクリプト
184
185 - 変数は束縛 `:=` を使う
186 − 関数の間に空白を入れてはいけない
187 - 再帰呼び出しを使うフィボナッチ数列
103 188
104 ``` 189 ```
105 #! nqp 190 #! nqp
106 sub fib($n) { 191 sub fib($n) {
107 $n < 2 ?? $n !! fib($n-1) + fib($n - 2); 192 $n < 2 ?? $n !! fib($n-1) + fib($n - 2);
108 } 193 }
109 194
110 my $N := 29; 195 my $N := 29;
111 196
112 my $t0 := nqp::time_n();
113 my $z := fib($N); 197 my $z := fib($N);
114 my $t1 := nqp::time_n();
115 198
116 nqp::say("fib($N) = " ~ fib($N)); 199 nqp::say("fib($N) = " ~ fib($N));
117 nqp::say("time = " ~ ($t1-$t0)); 200 ```
118 ``` 201
119 202 ## NQPスクリプト(nまでの整数の和)
120 ## プログラミング言語とVM 203
121 - 最近のスクリプト言語は、 ソースコードを直接解釈せず、バイトコードに変換しVMが評価する 204 ```perl6
122 - 全体的な処理速度の向上の為 205 sub add_test($n){
123 - 実装を分離することでの見通しの良さ 206 mu $sum := 0;
124 - 言語処理系の実行にのみ動作するVM(プロセスVM) 207 while ( $n > 1) {
125 - 他言語の環境 208 $sum := $sum + $n;
126 - Java 209 --$n;
127 - JVM 210 }
128 - Ruby 211 return $sum;
129 - YARV 212 }
130 - Python 213
131 - PythonVM 214 say(add_test(10000));
132 - Elixir 215 ```
133 - BEAM 216
134 217 ## NQPとオペコード
135 ## Perl6のVMの構成 218
136 - MoarVMと呼ばれるVM 219 - NQPはPerl6の中で一番レイヤーが低い言語
137 - C言語で記述されている 220 - その為、 実行するVMのオペコード(処理単位)を使用することができる
221
222
223 ## NQPとMoarVM
224 - NQPそのものは実行することはできない
225 - NQPの実行にはMoarVM/JVMが必要となる
226 - NQPコンパイラが各VMに対応したバイトコードに変換する
227
228 ## Perl6のVM
229 - MoarVM, JVM , JavaScriptが選択可能
230 - メインで開発されているのはMoarVMであり、 他のVMは機能が実装されていないものが存在する
231 - `rakudo-star` というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる
232
233 ## MoarVM
234 - C言語で記述されているPerl6専用の仮想機械
138 - レジスタマシン 235 - レジスタマシン
139 - 型情報を持つレジスタに対しての演算として処理される 236 - 型情報を持つレジスタに対しての演算として処理される
237 - Rubyなどはスタックマシンとして実装されている
140 - LuaJITなどを利用したJITコンパイルなども可能 238 - LuaJITなどを利用したJITコンパイルなども可能
141 - Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する 239 - Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する
142 240
143 ## バイトコード 241 ## バイトコード
144 - Perl6も、Rakudo/NQPはバイトコードに変換され、 バイトコードをVMが実行する 242 - Perl6も、Rakudo/NQPはバイトコードに変換され、 バイトコードをVMが実行する