Parrot
Parrot virtual machine
Parrot はレジスタベースの仮想機械(仮想マシン)で、動的プログラミング言語を効率的に動作させるために開発された、C言語で書かれたソフトウェアである。Parrotは他の多くの仮想マシンと異なり、型情報を扱うことができる。Parrot アセンブリ言語とPIR(Parrot中間言語)をParrotのバイトコードに変換し、実行することができる。
ParrotプロジェクトはPerlのコミュニティにより開始され、Parrotはオープンソースとフリーソフトウェアのコミュニティの協力により開発されている。結果として、Parrotはライセンスの互換性 (Artistic License 2.0)、非常に広い範囲のプラットフォーム互換性、現代的なほとんどのプロセッサアーキテクチャに対する互換性、実行速度、サイズ(プラットフォームによるが 700K 程度)、Perlおよび全てではないがほとんどの現代的な動的プログラミング言語の様々な要求に対して柔軟に対応できること、に焦点を置いている。また、イントロスペクション、デバッガの機能、コンパイル時のセマンティックの調節 (semantic modulation) にも焦点を置いている。
プロジェクトはRakuを実装するために始まり、非常に長い時間、「Raku を動作させるために開発中のソフトウェア」であった。Parrotという名前は、「新しい想像上の言語 Parrot がPythonとPerlを統一するとアナウンスされた」という、エイプリルフールのジョークに由来している。後に、PerlとPythonをサポートすることが目的で、プロジェクトはこの名前を採用した。
Parrot仮想マシンで動作するよう、複数の言語がParrotとともに開発されている。
2009年3月17日にバージョン1.0がリリースされた。"Haru Tatsu" というコードネームがついている。
過去のバージョンのリリースの日付は、Parrot のウェブサイトに記載されている。
Parrot仮想マシンの目標はクライアントの言語をホストし、それらの相互運用を可能にすることである。目標を実現するには多数のハードルが存在する。
静的な型付けと動的な型付け言語の異なる性質がParrotの開発の動機となっている。
現在のJava仮想マシンや共通言語ランタイム (CLR) などの人気のある仮想マシンは、静的に型付けされた言語のために開発されているが、Parrotが対象としている言語は動的な型付けのものである。
また、Java仮想マシンや現行のPerl 5 仮想マシンはスタックマシンである。Parrotの開発者達は、Parrotがレジスタを備えているため実際のハードウェアの設計に近く、バイトコードを機械語に近い速度で動作させるためにこれまでの膨大なコンパイラ最適化の学術的な資産をParrot仮想マシン用のコード生成に利用できる利点があると考えている。
Parrotは、クロージャや継続などの、いずれも例外処理やマルチスレッドと組み合わせた場合には、正しくかつ移植性を保って実現するのが特に難しいような関数型プログラミングの機能を数多くサポートしている。こうした問題を仮想マシンのレベルで解決することにより、Parrotのクライアント言語で実現する労力を著しく軽減することができる。
Parrotはコンパイラ作成ツールセットを提供している。再帰下降構文解析や演算子順位パーサーを表現できるハイブリッドのParser Grammar Engine (PGE) を備えており、この2つを同じ文法で自由に遷移できる。
PGEはTree Grammar Engine (TGE) に解析結果を与え、TGE は最適化のため、究極的にはコード生成のために、PGE が作成した解析構文木を変換する。
予定されているRakuのサブセットに加えて、多数のプログラム言語がParrot assembly languageにコンパイルできるようにすることが次々に計画されている。
APL、BASIC、Befunge、Brainfuck、Cola、Forth、Jako、LISP、m4、Miniperl、Parakeet、OpenComal、PHP、Plot、Pheme、Punie、
Python、Ruby、Scheme、Span、Tcl(別名partcl)、URM、YAL、Zork Z-codeなどである。しかし、これらの言語の実装のほとんどは、まだ不完全であったり、実験的であったり、さらに放棄されてしまったりしている。
Rubyコミュニティの一部にParrotに対する強い興味がある。すでにPythonからマシンコードへのJITコンパイラPsycoや、Python からバイドコードへのコンパイラJython、.NETプラットフォームへのコンパイラ IronPython、現在開発中の高レベルの最適化や静的なコード生成を目的としたPyPyなどがあるため、Pythonコミュニティは見守る様子を見せている。
Parrot のコードには3つの形態がある。バイトコード(Parrot Bytecode, PBC)はネイティブでParrotに解釈される機械語であり、ほかの2つのコードはIMCC(旧バージョン)またはPIRC(新バージョン)によってバイトコードにコンパイルされる中間言語である。
アセンブリ言語(Parrot Assembly Language, PASM) は、バイトコードにほぼ1対1で対応する低レベルの言語である。
Parrot intermediate representation (PIR) はPASMより若干高レベルの言語であるが、直接バイトコードにコンパイルすることができる。Parrot上で動作させる言語処理系は、普通はPASMより扱いやすいPIRへのコンパイラを実装する。
PIRを使うと、Parrotのルーチン間の呼び出し規約の違いを管理・吸収し、またより実効効率のよい命令への変換(命令選択, instruction selection)や、変数のレジスタ割り付けやメモリ退避(レジスタスピル) などの最適化を個別に実装することなくParrot (IMCCやPIRC) に任せることができる。
もともとは独自のJITコンパイラを開発していたが、2009年のバージョン1.7.0で放棄された。将来的には、LLVMやnanojitなどの既存のJITライブラリを利用して新しいコンパイラを用意するとしている。
Polymorphic Container(PMC, 以前はParrot Magic Cookieの略とされていた)は、クライアント言語が扱う型を拡張するための仕組みである。
Parrotは大半のハードウェアのCPUと同様レジスタベースであり、大半の仮想マシンがスタックマシンであるのとは異なる。Parrotは4種類のレジスタを提供する。
I: ネイティブの整数型
N: 浮動小数点数
S: Unicodeをサポートする先進的な文字列レジスタ
P: Parrotのオブジェクト型であるPMC(あるいは Parrot Magic Cookie)
Parrot は任意の数のレジスタを提供する。レジスタの数は、コンパイル時にサブルーチンごとに決定される。
set I1, 4
inc I1        # I1 は 5
add I1, 2     # I1 は 7
set N1, 42.0
dec N1        # N1 は 41.0
sub N1, 2.0   # N1 は 39.0
print I1
print ', '
print N1
print "\n"
PIR コード
.sub 'main' :main
$I1 = 4
inc $I1     # $I1 は 5
$I1 += 2    # $I1 は 7
$N1 = 42.0
dec $N1     # $N1 は 41.0
$N1 -= 2.0  # $N1 は 39.0
print $I1
print ', '
print $N1
print "\n"
.end
Parrot のキャッチフレーズは「1つのバイトコードは全てを統べる」である。これはJ・R・R・トールキンの『ホビットの冒険』『指輪物語』のキーアイテム「一つの指輪」に刻まれた銘に由来する。
2005年後半まで、Dan SugalskiがParrotの設計者のリードでありチーフアーキテクトであった。
長年のPerl、Linuxカーネル、C++のハッカーであるチップ・ザルツェンベルクが2006年半ば開発者のリードとなったときにこれを引き継いだ。Punieの先導開発者(リード・デヴェロッパー)であり、Parrotのコンパイラツールのチーフアーキテクトでもあるアリソン・ランダルが現在のチーフアーキテクトである。
開発に関する議論は主にIRC上で行われており、普段はirc.perl.orgの#parrotチャンネルが使われる。また、#parrotsketchチャンネルで毎週Parrotおよび言語開発者のためのミーティングが開かれている。加えて、parrot.orgでホストされているparrot-devメーリングリスト上でも更なる議論がなされている。
Parrotの設計上の議論はParrotのリポジトリに Parrot設計文書、PDDの形で存在している。チーフアーキテクトや指名された設計者が、ある機能についての考えや、インタフェース、設計メモを説明するためにこれらのドキュメントを記述している。Parrotハッカーは、これらの文書を実行可能なテストに変換し、次に実在する機能に変えて行く。
Parrotの安定版は毎月第3火曜日にリリースされる。リリース作業は中心的な開発者が交代で担当し、同じ開発者が連続してリリース担当になることがないよう配慮されている。この慣習はプロジェクトの進行速度と安定性を高めるのに一役買っている。
Parrot はフリーソフトウェアプロジェクトであり、Artistic License Version 2.0 の元配布されている。