annotate paper/chapter2.tex @ 15:83760be3f57f

add chapter2.tex
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 07 Feb 2019 19:54:30 +0900
parents
children 6be34793a3e2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{Perl6}
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \section{Perl6の概要}
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 Perl6は現在開発が勧められているプログラミング言語である。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 スクリプト言語Perl5の次期バージョンとして当初は開発されていたが、 現在では互換性の無さなどから別言語として開発されている。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 Perl6は仕様と実装が分離されており、 現在はテストスイートであるRoastが仕様となっている。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 実装は歴史的に様々なものが開発されており、 Haskellで実装されたPugs、 Pythonとの共同実行環境を目指したParrotなどが存在する。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 PugsやParrotは現在は歴史的な実装となっており、 開発は行われていない。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 現在の主要な実装であるRakudoは、 Parrotと入れ替わる形で実装が進んでいる。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 RakudoはParrot時代に考案された、 NQP(NotQuitPerl)を用いてPerl6を実装し、 NQPはVMによって評価される。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 RakudoのVMはPerl6専用のVMであるMoarVM、 Java実行環境であるJVM、 Javascriptが選択可能である。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 JVM、 Javascriptの動作環境はMoarVMと比較して実装されていない処理などが多数あり、 現在はMoarVMが主流なVMとして利用されている。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 MoarVMはC言語で実装されており、 NQPはNQP自身で記述されている。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 \section{NQP}
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 NQPとはRakudoにおけるPerl6の実装に利用されているプログラミング言語である。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 NQP自体は、 Perl6のサブセットとして開発されている。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 基本文法などはPerl6に準拠しているが、 変数を束縛で宣言する。インクリメント演算子が一部利用できない。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 Perl6に存在する関数などが一部利用できないなどの制約が存在する。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 実際にNQPで記述したコードを に示す。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 Perl6はNQPで記述されている為、 Perl6におけるVMはNQPの実行を目標として開発されている。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 NQP自体もNQPで記述されており、 NQPのビルドには予め用意されたMoarVMなどのVMバイトコードによるNQPインタプリタが必要となる。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 MoarVMを利用する場合、 MoarVMの実行バイナリであるmoarに対して、 ライブラリパスなどを予め用意したNQPインタプリタのバイトコードに設定する。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 設定はオプションで与える事が可能であり、 moarを実行することでNQPのインタプリタが起動する。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 NQPのビルドには、 このNQPインタプリタをまず利用し、 NQP自体のソースコードを入力して与え、 ターゲットとなるVMのバイトコードを生成する。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 このバイトコードはNQPソースコードから生成されたNQPインタプリタのバイトコードであり、 次にこのバイトコードをライブラリとしてmoarに与え、 再びNQPをビルドする。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 2度ビルドする事により、 ソースコードからビルドされたNQPバイトコードでNQP自身をビルドする事が出来たため、 処理系自身をその処理系でビルドするセルフビルドが達成出来たことになる。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 2度目のビルドの際に生成されたNQPインタプリタの事を小文字のnqpと呼び、これがNQPのインタプリタのコマンドとなる。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 \section{Rakudo}
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 RakudoとはNQPによって記述され、 MoarVM、 JVM、 Javascript上で動作するPerl6の実装である。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 Rakudo自体はNQPで記述されている箇所と、 Rakudo自身で記述されている箇所が混在する。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 ビルド時にはNQPインタプリタが必要となる為、 ソースコードからビルドする際は予めNQPインタプリタであるnqpをビルドする必要が存在する。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 図\ref{fig:gotoWithTheEnv}にこの様子を表した。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 \begin{lstlisting}[frame=lrbt,label=gotoWithTheEnv,caption={環境付き継続}]
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 __code cs(__code (*ret)(int, void*), void *env){
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 /* C0 */
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 goto ret(1, env);
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 }
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 int funcB(){
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 /* B0 */
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 goto cs(__return, __environment);
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 /* B1 (never reached). */
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 return -1;
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 }
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 int funcA(){
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 /* A0 */
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 int retval;
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 retval = funcB();
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 /* A1 */
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 printf("retval = %d\n", retval);
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 /* retval should not be -1 but be 1. */
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 return 0;
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 }
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 \end{lstlisting}
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 このように、環境付き継続を用いることで C、CbC 間の処理の移動が可能になる。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 %Data Gear はデータの単位であり、int や文字列などの Primitive Type を持っている。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 %Code Gear は 任意の数の Input Data Gear を参照して処理を行い、Output Data Gear を出力し処理を終える。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 %また、接続された Data Gear 以外には参照を行わない。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 %処理やデータの構造が Code Gear、Data Gear に閉じているため、これにより実行時間、メモリ使用量などを予測可能なものにすることが可能になる。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78