view paper/chapter2.tex @ 21:e6e66afc3a73

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 11 Feb 2019 15:59:08 +0900
parents bb510f08d601
children
line wrap: on
line source

\chapter{Perl6}
\section{Perl6の概要}
Perl6は現在開発が勧められているプログラミング言語である。
スクリプト言語Perl5の次期バージョンとして当初は開発されていたが、 現在では互換性の無さなどから別言語として開発されている。


Perl6は仕様と実装が分離されており、 現在はテストスイートであるRoastが仕様となっている。
実装は歴史的に様々なものが開発されており、 Haskellで実装されたPugs、 Pythonとの共同実行環境を目指したParrotなどが存在する。
PugsやParrotは現在は歴史的な実装となっており、 開発は行われていない。
現在の主要な実装であるRakudoは、 Parrotと入れ替わる形で実装が進んでいる。
Perl6そのものはスクリプト言語として実装されており、 漸進的型付け言語である。
言語的な特徴としては、 独自にPerl6の文法を拡張可能なGrammer、 Perl5と比較してオブジェクト指向言語としての機能の強化などが見られる。

\section{Rakudo}

RakudoとはNQPによって記述され、 MoarVM、 JVM、 Javascript上で動作するPerl6の実装である。
Rakudo自体はNQPで実装されている箇所と、 Perl6で実装されている箇所が混在する。
これらは拡張子によって区別され、 NQPは.nqp、 Perl6は .pm6が拡張として設定されている。
実際にNQPで実装されている箇所の一部をCode\ref{nqp_on_rakud}に示す。
\lstinputlisting[frame=lrbt, label=nqp_on_rakud, caption=Rakudoの実装の一部]{./codes/src_main.nqp}

Rakudoをソースコードからビルドする際は予めNQPインタプリタであるnqpをビルドする必要が存在する。
Rakudoのビルド時にはこのnqpと、 nqpが動作するVMを設定として与える必要がある。
この両者を指定しない場合、 ビルド時に動的にNQP、 MoarVMをソースコードをダウンロードし、 ビルドを行う。

\section{MoarVM}
MoarVMとはRakudo実装で主に使われる仮想機械である。
RakudoではPerl6とNQPを実行する際に仮想機械上で実行する。
この仮想機械はOSレベルの仮想化に使用するVirtualBoxやqemuと異なり、プロセスレベルの仮想機械である。
Rakudoではこの仮想機械にMoarVM、 Javaの仮想機械であるJVM(JavaVirtualMachine)が選択可能である。
MoarVMはこの中でRakudo独自に作成された仮想機械であり、 現在のRakudoプロジェクトの主流な実装となっている。

MoarVMはC言語で実装されており、 レジスタベースの仮想機械である。
MoarVMはNQPやPerl6から与えられたMoarVMバイトコードを評価する。

\section{NQP}
NQPとはRakudoにおけるPerl6の実装に利用されているプログラミング言語である。
NQP自体は、 Perl6のサブセットとして開発されている。
歴史的にはPerl6の主力実装がParrotであった際に開発され、 現在のRakudoに引き継がれている。
RakudoにおけるNQPは、 Parrot依存であった実装が取り払われている。

基本文法などはPerl6に準拠しているが、 変数を束縛で宣言する。インクリメント演算子が一部利用できない。
Perl6に存在する関数などが一部利用できないなどの制約が存在する。

NQPのコード例をCode\ref{fib_nqp}に示す。
\lstinputlisting[frame=lrbt, label=fib_nqp, caption=フィボナッチ数列を求めるNQPのソースコード]{./codes/fib.nqp}


Perl6はNQPで実装されている為、 Perl6におけるVMはNQPの実行を目標として開発されている。

NQP自体もNQPで実装されており、 NQPのビルドには予め用意されたMoarVMなどのVMバイトコードによるNQPインタプリタが必要となる。
実際にNQP内部で入力として与えられたNQPから加算命令を生成する部分をCode\ref{nqp_code_add_ops}に示す。

\lstinputlisting[frame=lrbt, label=nqp_code_add_ops, caption=NQPが加算命令を生成する箇所]{./codes/nqp_ops.nqp}


MoarVMを利用する場合、 MoarVMの実行バイナリであるmoarに対して、 ライブラリパスなどを予め用意したNQPインタプリタのバイトコードに設定する。
設定はオプションで与える事が可能であり、 moarを実行することでNQPのインタプリタが起動する。
NQPのビルドには、 このNQPインタプリタをまず利用し、 NQP自体のソースコードを入力して与え、 ターゲットとなるVMのバイトコードを生成する。
このバイトコードはNQPソースコードから生成されたNQPインタプリタのバイトコードであり、 次にこのバイトコードをライブラリとしてmoarに与え、 再びNQPをビルドする。
この2度目のビルドで、ソースコードからビルドされたVMバイトコードでNQP自身をビルドした事になる。
処理系自身をその処理系でビルドする事をセルフビルドと呼び、 NQPはセルフビルドしたバイナリを利用する。
2度目のビルドの際に生成されたNQPインタプリタの事を小文字のnqpと呼び、これがNQPのインタプリタのコマンドとなる。




%Data Gear はデータの単位であり、int や文字列などの Primitive Type を持っている。

%Code Gear は 任意の数の Input Data Gear を参照して処理を行い、Output Data Gear を出力し処理を終える。
%また、接続された Data Gear 以外には参照を行わない。

%処理やデータの構造が Code Gear、Data Gear に閉じているため、これにより実行時間、メモリ使用量などを予測可能なものにすることが可能になる。