Parrot

歴史

プロジェクトはPerl 6を実装するために始まり、非常に長い時間、「Perl 6 を動作させるために開発中のソフトウェア」であった。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 が作成した解析構文木を変換する。

クライアントの言語

予定されているPerl 6のサブセットに加えて、多数のプログラム言語が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ライブラリを利用して新しいコンパイラを用意するとしている。

PMC

Polymorphic Container(PMC, 以前はParrot Magic Cookieの略とされていた)は、クライアント言語が扱う型を拡張するための仕組みである。

数値演算

PASMコード

   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"
   end
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 の文化

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 の元配布されている。