Mercurial > hg > Papers > 2019 > anatofuz-thesis
changeset 37:d11c91e8a1fc
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 14 Feb 2019 15:17:26 +0900 |
parents | 25ef2b0220df |
children | c4dbd7b81302 |
files | paper/chapter3.tex paper/main.pdf |
diffstat | 2 files changed, 24 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter3.tex Wed Feb 13 16:03:10 2019 +0900 +++ b/paper/chapter3.tex Thu Feb 14 15:17:26 2019 +0900 @@ -1,16 +1,19 @@ \chapter{Perl6} \section{Perl6の概要} -Perl6は現在開発が勧められているプログラミング言語である。 -スクリプト言語Perl5の次期バージョンとして当初は開発されていたが、 現在では互換性の無さなどから別言語として開発されている。 +Perl6は2002年にLarryWallが、 Perl5を置き換える言語として設計を開始したプログラミング言語である。 +Perl5の言語的な問題点である、 オブジェクト指向機能の強力なサポートや、 正規表現の表現力の拡大などを取り入れた言語として設計された。 +Perl5は設計と実装が同一であり、 Unixベースの環境で主に利用されている perl はLarryらによって開発されているC言語による実装のみである。 +Perl6は仕様と実装が分離されており、 現在はテストスイートであるRoastが仕様となっている。 - -Perl6は仕様と実装が分離されており、 現在はテストスイートであるRoastが仕様となっている。 実装は歴史的に様々なものが開発されており、 Haskellで実装されたPugs、 Pythonとの共同実行環境を目指したParrotなどが存在する。 PugsやParrotは現在は歴史的な実装となっており、 開発は行われていない。 現在の主要な実装であるRakudoは、 Parrotと入れ替わる形で実装が進んでいる。 Perl6そのものはスクリプト言語として実装されており、 漸進的型付け言語である。 言語的な特徴としては、 独自にPerl6の文法を拡張可能なGrammer、 Perl5と比較してオブジェクト指向言語としての機能の強化などが見られる。 +Perl6は言語的な仕様や、 実装がPerl5と大幅に異なっており、 言語的な互換性が存在しない。 +その為、 現在ではPerl5とPerl6は別言語として開発されており、 Perl6は主要な処理系であるRakudoから名前を取り、 Rakuという別名がついている。 + \section{Rakudo} RakudoとはNQPによって記述され、 MoarVM、 JVM、 Javascript上で動作するPerl6の実装である。 @@ -33,6 +36,11 @@ MoarVMはC言語で実装されており、 レジスタマシンである。 MoarVMはNQPやPerl6から与えられたMoarVMバイトコードを評価する。 +MoarVM自体の改良は現在も行われているが、 開発者の多くは新機能の実装などを中心に行っている。 +速度上昇を目指したプロジェクトも存在はするが、 介入する余地があると考えられる。 +また、 内部ではLuaJitというJITコンパイル用のライブラリを利用しているが、 JITに対して開発者チームの力が注がれていない。 +その為、 本研究ではJITや速度上昇を最終的な目標として考え、 速度上昇までに必要なモジュール化などの実装を行う。 + \section{NQP} NQPとはRakudoにおけるPerl6の実装に利用されているプログラミング言語である。 NQP自体は、 Perl6のサブセットとして開発されている。 @@ -55,12 +63,20 @@ MoarVMを利用する場合、 MoarVMの実行バイナリであるmoarに対して、 ライブラリパスなどを予め用意したNQPインタプリタのバイトコードに設定する。 -設定はオプションで与える事が可能であり、 moarを実行することでNQPのインタプリタが起動する。 +moarの起動時の設定は、 コマンドライン引数のオプションで与える事が可能である。 +その為、 既に存在しているMoarVMバイトコードで記述されたNQPのインプリタファイルを、 適切にオプションで指定し、moarを実行することでNQPのインタプリタが起動する。 + + NQPのビルドには、 このNQPインタプリタをまず利用し、 NQP自体のソースコードを入力して与え、 ターゲットとなるVMのバイトコードを生成する。 -このバイトコードはNQPソースコードから生成されたNQPインタプリタのバイトコードであり、 次にこのバイトコードをライブラリとしてmoarに与え、 再びNQPをビルドする。 +既に用意されている、 ターゲットのVMのバイトコード化しているNQPインタプリタの状態を Stage0 と呼ぶ。 +Stage0を利用し、NQPソースコードからビルドしたNQPインタプリタであるバイトコードを、 Stage1と呼ぶ。 + +Stage1をmoarの起動時オプションにライブラリとして設定し、 起動したNQPインタプリタで再度ビルドしたNQPインタプリタを、 Stage2と呼ぶ。 この2度目のビルドで、ソースコードからビルドされたVMバイトコードでNQP自身をビルドした事になる。 -処理系自身をその処理系でビルドする事をセルフビルドと呼び、 NQPはセルフビルドしたバイナリを利用する。 -2度目のビルドの際に生成されたNQPインタプリタの事を小文字のnqpと呼び、これがNQPのインタプリタのコマンドとなる。 +処理系自身をその処理系でビルドする事をセルフビルドと呼び、 NQPはセルフビルドしたStage2のバイトコードを利用する。 +2度目のビルドの際に生成されたStage2を利用して、 moarを起動するスクリプトの事を小文字のnqpと呼び、これがNQPのインタプリタのコマンドとなる。 + +nqpは使用しているVMのバイトコードを生成する機能があり、 Rakudoのビルド時にはこの機能を利用してバイトコードを生成する。