annotate paper/chapter3.tex @ 41:5169e3bc40f9

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 14 Feb 2019 17:49:14 +0900
parents d11c91e8a1fc
children 49e6b3116f12
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の概要}
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
3 Perl6は2002年にLarryWallが、 Perl5を置き換える言語として設計を開始したプログラミング言語である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
4 Perl5の言語的な問題点である、 オブジェクト指向機能の強力なサポートや、 正規表現の表現力の拡大などを取り入れた言語として設計された。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
5 Perl5は設計と実装が同一であり、 Unixベースの環境で主に利用されている perl はLarryらによって開発されているC言語による実装のみである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
6 Perl6は仕様と実装が分離されており、 現在はテストスイートであるRoastが仕様となっている。
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
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と入れ替わる形で実装が進んでいる。
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
11 Perl6そのものはスクリプト言語として実装されており、 漸進的型付け言語である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
12 言語的な特徴としては、 独自にPerl6の文法を拡張可能なGrammer、 Perl5と比較してオブジェクト指向言語としての機能の強化などが見られる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
13
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
14 Perl6は言語的な仕様や、 実装がPerl5と大幅に異なっており、 言語的な互換性が存在しない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
15 その為、 現在ではPerl5とPerl6は別言語として開発されており、 Perl6は主要な処理系であるRakudoから名前を取り、 Rakuという別名がついている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
16
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
17 \section{Rakudo}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
18
41
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
19 RakudoとはNQPによって記述され、 MoarVM、 JVM上で動作するPerl6の実装である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
20 NQPとはNotQuitPerlの略であり、 Perl6のサブセットである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
22 RakudoがPerl6のコンパイラかつインタプリタとして機能する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
23 Rakudoの構成を図\ref{fig:perl6nqp}に示す。
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
41
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
25 \begin{figure}[ht]
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
26 \caption{Rakudoの構成図}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
27 \begin{center}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
28 \includegraphics[width=50mm]{./fig/prosym/perl6nqp.pdf}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
29 \end{center}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
30 \label{fig:perl6nqp}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
31 \end{figure}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
32
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
33 Perl6そのものはNQPで大本が記述されており、 その上にPerl6自身で記述された箇所が存在する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
34 図\ref{fig:perl6nqp}に示すとおり、 MoarVMが解釈するのはNQPが発行したMoarVMバイトコードである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
35 Perl6のプログラムはPerl6及びNQPコンパイラによってMoarVMバイトコードに変換され、 MoarVMが評価する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
36 現在はMoarVMの他にJVMも動作環境として選択可能であるが、 JVM側にはMoarVMと比較して実装された機能が少ないなどの特徴がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
38 MoarMVそのものはPerl6やNQPプログラムを直接は評価する事が出来ない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
39 従って、 NQP及びPerl6で書かれているRakudoをソースコードからビルドする際は、 予めNQPインタプリタであるnqpをビルドする必要が存在する。
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
40 Rakudoのビルド時にはこのnqpと、 nqpが動作するVMを設定として与える必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
41 この両者を指定しない場合、 ビルド時に動的にNQP、 MoarVMをソースコードをダウンロードし、 ビルドを行う。
41
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
42 実際にNQPで記述されたRakudoの実装の一部をソースコード\ref{nqp_on_rakud}に示す。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
43 \lstinputlisting[frame=lrbt, label=nqp_on_rakud, caption=Rakudoの実装の一部]{./codes/src_main.nqp}
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
44
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
45 \section{MoarVM}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
46 MoarVMとはRakudo実装で主に使われる仮想機械である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
47 RakudoではPerl6とNQPを実行する際に仮想機械上で実行する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
48 この仮想機械はOSレベルの仮想化に使用するVirtualBoxやqemuと異なり、プロセスレベルの仮想機械である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
49 Rakudoではこの仮想機械にMoarVM、 Javaの仮想機械であるJVM(JavaVirtualMachine)が選択可能である。
36
25ef2b0220df add macro
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
50 MoarVMはこの中でRakudo独自に作成されたプロセス仮想機械であり、 現在のRakudoプロジェクトの主流な実装となっている。
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
51
36
25ef2b0220df add macro
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
52 MoarVMはC言語で実装されており、 レジスタマシンである。
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
53 MoarVMはNQPやPerl6から与えられたMoarVMバイトコードを評価する。
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
55 MoarVM自体の改良は現在も行われているが、 開発者の多くは新機能の実装などを中心に行っている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
56 速度上昇を目指したプロジェクトも存在はするが、 介入する余地があると考えられる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
57 また、 内部ではLuaJitというJITコンパイル用のライブラリを利用しているが、 JITに対して開発者チームの力が注がれていない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
58 その為、 本研究ではJITや速度上昇を最終的な目標として考え、 速度上昇までに必要なモジュール化などの実装を行う。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
59
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 \section{NQP}
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 NQPとはRakudoにおけるPerl6の実装に利用されているプログラミング言語である。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 NQP自体は、 Perl6のサブセットとして開発されている。
20
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
63 歴史的にはPerl6の主力実装がParrotであった際に開発され、 現在のRakudoに引き継がれている。
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
64 RakudoにおけるNQPは、 Parrot依存であった実装が取り払われている。
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
65
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 基本文法などはPerl6に準拠しているが、 変数を束縛で宣言する。インクリメント演算子が一部利用できない。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 Perl6に存在する関数などが一部利用できないなどの制約が存在する。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
32
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
69 NQPのコード例をソースコード\ref{fib_nqp}に示す。
19
365856474363 update Makefile and main.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
70 \lstinputlisting[frame=lrbt, label=fib_nqp, caption=フィボナッチ数列を求めるNQPのソースコード]{./codes/fib.nqp}
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
17
9d5db297d154 use listings for chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
72
9d5db297d154 use listings for chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
73 Perl6はNQPで実装されている為、 Perl6におけるVMはNQPの実行を目標として開発されている。
20
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
74
17
9d5db297d154 use listings for chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
75 NQP自体もNQPで実装されており、 NQPのビルドには予め用意されたMoarVMなどのVMバイトコードによるNQPインタプリタが必要となる。
32
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
76 実際にNQP内部で入力として与えられたNQPから加算命令を生成する部分をソースコード\ref{nqp_code_add_ops}に示す。
20
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
77
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
78 \lstinputlisting[frame=lrbt, label=nqp_code_add_ops, caption=NQPが加算命令を生成する箇所]{./codes/nqp_ops.nqp}
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
79
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
80
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 MoarVMを利用する場合、 MoarVMの実行バイナリであるmoarに対して、 ライブラリパスなどを予め用意したNQPインタプリタのバイトコードに設定する。
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
82 moarの起動時の設定は、 コマンドライン引数のオプションで与える事が可能である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
83 その為、 既に存在しているMoarVMバイトコードで記述されたNQPのインプリタファイルを、 適切にオプションで指定し、moarを実行することでNQPのインタプリタが起動する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
84
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
85
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 NQPのビルドには、 このNQPインタプリタをまず利用し、 NQP自体のソースコードを入力して与え、 ターゲットとなるVMのバイトコードを生成する。
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
87 既に用意されている、 ターゲットのVMのバイトコード化しているNQPインタプリタの状態を Stage0 と呼ぶ。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
88 Stage0を利用し、NQPソースコードからビルドしたNQPインタプリタであるバイトコードを、 Stage1と呼ぶ。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
89
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
90 Stage1をmoarの起動時オプションにライブラリとして設定し、 起動したNQPインタプリタで再度ビルドしたNQPインタプリタを、 Stage2と呼ぶ。
20
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
91 この2度目のビルドで、ソースコードからビルドされたVMバイトコードでNQP自身をビルドした事になる。
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
92 処理系自身をその処理系でビルドする事をセルフビルドと呼び、 NQPはセルフビルドしたStage2のバイトコードを利用する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
93 2度目のビルドの際に生成されたStage2を利用して、 moarを起動するスクリプトの事を小文字のnqpと呼び、これがNQPのインタプリタのコマンドとなる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
94
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
95 nqpは使用しているVMのバイトコードを生成する機能があり、 Rakudoのビルド時にはこの機能を利用してバイトコードを生成する。
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
20
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
98
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 %Data Gear はデータの単位であり、int や文字列などの Primitive Type を持っている。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 %Code Gear は 任意の数の Input Data Gear を参照して処理を行い、Output Data Gear を出力し処理を終える。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 %また、接続された Data Gear 以外には参照を行わない。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 %処理やデータの構造が Code Gear、Data Gear に閉じているため、これにより実行時間、メモリ使用量などを予測可能なものにすることが可能になる。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106