annotate slide.md @ 12:58cd4dd86896

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 19 Apr 2019 19:07:07 +0900
parents 4b1eb4d69695
children d3036d998236
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 title: Perl6の内部表現
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 author: Takahiro Shimizu
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 profile:
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 lang: Japanese
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 ## このセッションの内容
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
8 - Perl6の主要な実装であるRakudoの内部構造を探ります
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
9 - Rakudoの内部で利用されているVMや, Perl6のサブセットなどについて探索します
3
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
10 - スクリプト言語で主に使われているバイトコードインタプリタの気持ちになります
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
11
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
12 ## 内容
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
13 - Perl6とは?
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
14 - スクリプト言語処理系の動き
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
15 - Perl6の内部構造
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
16 - NQP
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
17 - MoarVM
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
18 - MoarVMのバイトコード実行
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
19 - まとめ
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
20
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
21 ## Perl6とは
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
22 - 当初Perl5の時期バージョンとして開発されていたプログラミング言語
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
23 - 現在は別の言語として開発がそれぞれ進んでいる
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
24 - 仕様と実装が分離しており, 現在はテストが仕様となっている
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
25 - 実装は歴史上複数存在しているが,主流な実装はRakudo
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
26 - 言語的にはスクリプト言語であり, 漸進的型付き言語
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
27 - 動作環境は、独自のVMのMoarVM, JVM、一部JavaScript上で動作する
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
28
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
29 <img src="2000px-Camelia.svg.png" alt="" style="width: 31%; height: auto;">
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
30
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
31 ## 現在のPerl6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
32
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
33 - 現在のバージョンは `6.d`
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
34 - [ブラウザ上で実行可能な環境](https://perl6.github.io/6pad/)が存在する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
35 - [IDE](https://commaide.com/)が開発されている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
36 - WebApplicationFrameworkなども開発されており、 Perl5のモジュールを移行したものがいくつか存在する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
37 - 日本では趣味のプロダクト以外社会では使用されていない
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
38 - 海外では実際に使われているケースも存在する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
39 - 処理速度では一部Perl5に勝っているが、それでも大分遅い
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
40
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
41 ## [参考]Perl5のソースコード
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
42
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
43 - Perl5時代
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
44 − スカラ、配列、ハッシュの3種類
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
45 - それぞれの変数への参照であるリファレンスが使用可能
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
46
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
47 ```perl
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
48 use ustrict;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
49 use warnings;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
50
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
51 my $scalar_value = "hello!";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
52 print "$scalar_value\n";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
53
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
54 my @array = (1..10);
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
55 print "$array[0]\n";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
56
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
57 my %hash = ( this_is_key => "this_is_value");
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
58 print "$hash{this_is_key}\n";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
59
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
60 my $hash_ref = \%hash;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
61 print "$hash_ref->{this_is_key}\n";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
62 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
63
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
64 ## Perl6のソースコード概要
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
65
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
66 - Perl5の文法とは比較的変更が多い
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
67 - 雰囲気は似ている
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
68 - 変数がオブジェクトと化した事により, 変数からsayメソッドを呼ぶことが可能
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
69
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
70 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
71 my $str_value = 'hello world!';
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
72 $str_value.say; # hello world!
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
73 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
74
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
75 - Perl5と同様に,変数にはデフォルトでは型がないような振る舞いをする
0
19155754a586 create OSC2019 slide template
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
77 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
78 my $sample_value = 'hello world!';
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
79 $sample_value.say; # hello world!
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
80
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
81 $sample_value = '31';
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
82 $sample_value.say; # 31
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
83
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
84 say($sample_value * 3);
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
85 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
86
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
87 ## Perl6の言語的な特徴
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
88
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
89 - 漸進的型付き言語である為, 型を強制することも可能となる
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
90
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
91 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
92 my Int $int_value = 31;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
93 $int_value = "hello"; # Compile error!
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
94 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
95
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
96 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
97 $ perl6 type_invalid.p6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
98 Type check failed in assignment to $int_value; expected Int but got Str ("hello")
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
99 in block <unit> at type_invalid.p6 line 4
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
100 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
101
4
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
102 ## Perl6の言語的な特徴
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
103
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
104 - 型を独自に定義することも可能
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
105 - 入力の型によって実行する関数を変える事などができる
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
106
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
107 ```perl6
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
108 my subset Fizz of Int where * %% 3;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
109 my subset Buzz of Int where * %% 5;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
110 my subset FizzBuzz of Int where Fizz&Buzz;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
111 my subset Number of Int where none Fizz|Buzz;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
112
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
113 proto sub fizzbuzz ($) { * }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
114 multi sub fizzbuzz (FizzBuzz) { "FuzzBuzz" }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
115 multi sub fizzbuzz (Fizz) { "Fizz" }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
116 multi sub fizzbuzz (Buzz) { "Buzz" }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
117 multi sub fizzbuzz (Number $number) { $number }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
118
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
119 fizzbuzz($_).say for 1..15;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
120 ```
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
121
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
122 - 型を利用したFizzBuzz
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
123
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
124 ## スクリプト言語
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
125 - Perl6は現状コンパイルすることはできない
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
126 - スクリプト言語の分類
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
127
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
128 - 現在広く使われているスクリプト言語(Perl,Python,Ruby...)などとPerl6の構成は類似している
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
129 - 今回はPerl6の実装を追いながら、最近のスクリプト言語処理系の大まかな実装を理解する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
130
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
131 ## スクリプト言語処理系
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
132 - スクリプト言語は入力として与えられたソースコードを、 直接評価せずにバイトコードにコンパイルする形式が主流となっている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
133 - その為スクリプト言語の実装は大きく2つで構成されている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
134 - バイトコードに変換するフロントエンド部分
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
135 - バイトコードを解釈する仮想機械
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
136
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
137 <img src="fig/bytecode_sample_generally_lang.svg" width="80%">
4
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
138
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
139
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
140 ## Perl6以外のスクリプト言語
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
141
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
142 - 現在使われているプロセスVMは言語に組み込まれているものが多い
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
143 - JVMやElixirなどのVMは複数の言語で使用されている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
144 - Java
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
145 - JVM
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
146 - Ruby
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
147 - YARV
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
148 - Python
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
149 - PythonVM
12
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
150 - Erlang
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
151 - Elixir
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
152 - BEAM
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
153
1
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
154 ## Perl6の処理系の構成
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
155
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
156 - Perl6の処理系で現在主流なものはRakudoと呼ばれる実装である(歴史上複数存在する)
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
157 - Rakudoは3つのレイヤーから構成されている
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
158 - Perl6インタプリタ
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
159 - Perl6インタプリタを記述するPerl6のサブセットNQP
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
160 - Perl6のバイトコードを解釈するMoarVM
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
161 - Perl6/NQPがフロントエンドに相当し、MoarVMがバックエンドに相当する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
162
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
163 ## Rakudoの構成図
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
164
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
165 ![](fig/Rakudo_System_overview.png)
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
166
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
167 (http://brrt-to-the-future.blogspot.com/2015/03/advancing-jit-compiler.html)
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
168
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
169 ## Perl6とNQP
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
170
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
171 - NQP(NotQuitPerl Perl)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
172 - Perl6のサブセット。Perl6っぽい言語
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
173 - Perl6、 NQP自体がNQPで記述されている
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
174 - NQPもNQPで記述されている為、 セルフビルド(自分自身で自分自身をコンパイルする)を行う
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
175 - NQPはPerl6の文法をベースにしているが、 制約がいくつか存在する
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
176 - 元々はPerl6の主力実装がParrotだった時代に登場
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
177 - 文法がアップデートされており、当時の資料は古くなっている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
178
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
179 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
180 my $value := "hello!";
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
181 say($value);
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
182 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
183
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
184 ## NQPスクリプト
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
185
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
186 - 変数は束縛 `:=` を使う
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
187 − 関数の間に空白を入れてはいけない
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
188 - 再帰呼び出しを使うフィボナッチ数列
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
189
4
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
190 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
191 #! nqp
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
192 sub fib($n) {
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
193 $n < 2 ?? $n !! fib($n-1) + fib($n - 2);
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
194 }
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
195
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
196 my $N := 29;
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
197
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
198 my $z := fib($N);
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
199
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
200 nqp::say("fib($N) = " ~ fib($N));
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
201 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
202
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
203 ## NQPスクリプト(nまでの整数の和)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
204
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
205 ```perl6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
206 sub add_test($n){
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
207 my $sum := 0;
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
208 while ( $n > 1) {
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
209 $sum := $sum + $n;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
210 --$n;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
211 }
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
212 return $sum;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
213 }
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
214
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
215 say(add_test(10000));
4
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
216 ```
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
217
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
218 ## NQP
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
219
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
220 - NQPはPerl6の中で一番レイヤーが低い言語
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
221 - その為、 実行するVMのオペコード(処理単位)を使用することができる
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
222 - NQPオペコードは、 Perl6の内部の抽象構文木でも使用されている
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
223 - また、 Perl6と同様に型を指定することが可能
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
224
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
225 ```perl6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
226 sub add_test(int $n){
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
227 mu $sum := 0;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
228 while nqp::isgt_i($n,1) {
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
229 $sum := nqp::add_i($sum,$n);
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
230 $n := nqp::sub_i($n,1);
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
231 }
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
232 return $sum;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
233 }
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
234 ```
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
235
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
236 ## NQPとMoarVM
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
237 - NQPそのものは実行することはできない
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
238 - NQPの実行にはMoarVM/JVMが必要となる
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
239 - NQPコンパイラが各VMに対応したバイトコードに変換する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
240
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
241 ## Perl6のVM
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
242 - MoarVM, JVM , JavaScriptが選択可能
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
243 - メインで開発されているのはMoarVMであり、 他のVMは機能が実装されていないものが存在する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
244 - `rakudo-star` というPerl6のパッケージ環境では、 MoarVMがデフォルトでインストールされる
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
245
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
246 ## MoarVM
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
247 - C言語で記述されているPerl6専用の仮想機械
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
248 - レジスタマシン
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
249 - 型情報を持つレジスタに対しての演算として処理される
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
250 - Rubyなどはスタックマシンとして実装されている
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
251 - LuaJITなどを利用したJITコンパイルなども可能
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
252 - Perl6やNQPは、MoarVMに対してライブラリなどを設定して起動する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
253
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
254
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
255
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
256 ## バイトコード
3
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
257 - Perl6も、Rakudo/NQPはバイトコードに変換され、 バイトコードをVMが実行する
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
258 - Perl6/NQPはバイトコードにコンパイルすることが可能
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
259 - 直接実行することはできない
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
260
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
261 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
262 $nqp --target=mbc --output=fib.moarvm fib.nqp
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
263 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
264
12
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
265 ## バイトコード
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
266 - バイナリ形式で表現される為、 VMがどのように読み取るかでバイトコードの意味が異なる
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
267 - スクリプト言語で重要なバイトコード表現は、「仮想機械がどの命令を実行するか」のバイトコード
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
268 - CPUに対するアセンブラの命令に対応する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
269 - どういった構成なのかは仮想機械によって異なる
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
270
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
271
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
272 ## バイトコードとMoarVM
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
273
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
274
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
275 - MoarVMバイトコードはMoarVMの実行バイナリ `moar` でディスアセンブルすることが可能
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
276
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
277
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
278 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
279 annotation: add_test.nqp:1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
280 00003 const_i64_16 loc_2_int, 0
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
281 00004 hllboxtype_i loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
282 00005 box_i loc_3_obj, loc_2_int, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
283 00006 set loc_1_obj, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
284 label_1:
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
285 00007 decont loc_3_obj, loc_0_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
286 00008 smrt_numify loc_4_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
287 00009 const_i64_16 loc_2_int, 1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
288 00010 coerce_in loc_5_num, loc_2_int
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
289 00011 gt_n loc_2_int, loc_4_num, loc_5_num
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
290 00012 unless_i loc_2_int, label_2(00031)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
291 00013 osrpoint
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
292 annotation: add_test.nqp:3
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
293 00014 decont loc_3_obj, loc_1_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
294 00015 smrt_numify loc_5_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
295 00016 decont loc_3_obj, loc_0_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
296 00017 smrt_numify loc_4_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
297 00018 add_n loc_4_num, loc_5_num, loc_4_num
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
298 00019 hllboxtype_n loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
299 00020 box_n loc_3_obj, loc_4_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
300 00021 set loc_1_obj, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
301 00022 decont loc_3_obj, loc_0_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
302 00023 smrt_numify loc_4_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
303 00024 coerce_ni loc_6_int, loc_4_num
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
304 00025 const_i64_16 loc_7_int, 1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
305 00026 sub_i loc_7_int, loc_6_int, loc_7_int
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
306 00027 hllboxtype_i loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
307 00028 box_i loc_3_obj, loc_7_int, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
308 00029 set loc_0_obj, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
309 00030 goto label_1(00007)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
310 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
311
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
312 ## NQPとバイトコードの対応
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
313
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
314 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
315 say(add_test(10000));
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
316 ```
2
Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
317
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
318 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
319 annotation: add_test.nqp:1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
320 label_1:
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
321 00020 getlex_no loc_7_obj, '&say'
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
322 00021 decont loc_7_obj, loc_7_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
323 00022 const_s loc_3_str, '&add_test'
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
324 00023 getlexstatic_o loc_8_obj, loc_3_str
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
325 00024 decont loc_8_obj, loc_8_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
326 00025 const_i64_16 loc_5_int, 10000
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
327 00026 prepargs Callsite_1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
328 00027 arg_i 0, loc_5_int
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
329 00028 invoke_o loc_8_obj, loc_8_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
330 00029 prepargs Callsite_0
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
331 00030 arg_o 0, loc_8_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
332 00031 invoke_v loc_7_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
333 00032 null loc_7_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
334 00033 return_o loc_7_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
335 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
336
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
337 - Perl6の変数は直接実態を参照せず、中身が入っているコンテナを参照するようになっている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
338 - その為 `decont` 命令で、コンテナの中身をレジスタに設定する必要がある
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
339 - `const_i64_16` などは64bitの数という意味で、 `int` 型としてレジスタに登録している
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
340 - `prepargs` で引数の確認を行い, `invoke_o` で実際にサブルーチンに移行する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
341
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
342 ## NQPとバイトコードの対応
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
343
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
344 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
345 my $sum := 0;
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
346 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
347
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
348 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
349 annotation: add_test.nqp:1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
350 00003 const_i64_16 loc_2_int, 0
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
351 00004 hllboxtype_i loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
352 00005 box_i loc_3_obj, loc_2_int, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
353 00006 set loc_1_obj, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
354 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
355
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
356 - まず `loc_2` レジスタをint型の整数0で初期化する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
357 - 変数 `$sum` はint型の指定がないので、 obj型で登録しなければならない
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
358 - その為, 整数として登録された `loc_2` から、 obj型に一旦キャストし、 `loc_3` レジスタに設定したものを、 `loc_1` レジスタに設定する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
359
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
360 ## NQPとバイトコードの対応
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
361
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
362 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
363 while ( $n > 1) {
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
364 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
365
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
366 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
367 label_1:
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
368 00007 decont loc_3_obj, loc_0_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
369 00008 smrt_numify loc_4_num, loc_3_obj
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
370 00009 const_i64_16 loc_2_int, 1
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
371 00010 coerce_in loc_5_num, loc_2_int
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
372 00011 gt_n loc_2_int, loc_4_num, loc_5_num
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
373 00012 unless_i loc_2_int, label_2(00031)
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
374 00013 osrpoint
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
375 ```
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
376
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
377 - 変数 `$n` と 整数 `1` を大小比較する為、 まず `$n` から値を取り出す
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
378 − 比較にもint型の指定がない為、 `num` 型にキャストし、 `num` 型のレジスタでの大小を比較する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
379 - 比較命令は `gt_n` であり、 結果により `unless_i` 命令で、別のラベルにジャンプする