モダンPerlの世界へようこそ

第14回 Rakudo:実装する方法だってひとつではないのです

この記事を読むのに必要な時間:およそ 5 分

RakudoとPerl 6

もっとも,生まれたといっても,Rakudoは決して新しいプロジェクトではありません。それまでPerl 6 on Parrotと呼ばれていたものに新しい名前がついただけのことです。

Rakudoは,⁠駱駝道(Rakuda-do⁠⁠」の意味であり,⁠楽土」の意味でもあるというのが公式見解ですが,2006年のYAPC::Asiaでラリー・ウォール氏がキーノートのなかで「駱駝」⁠落第」⁠楽だ」と3つの単語を並べていたことを覚えている方もいるでしょう。

同年のYAPC::Asiaで混合語というタイトルで発表を行った火星ことマーティ・ポーリー(Marty Pauley)氏は,道が長くて,駱駝が遅いという記事の中で,Rakudoはむしろ「Rokudo(六道輪廻⁠⁠」の略だと見た方が(頭に「六」という数字もついているし)いいんじゃないかという意見を述べています。

2004年のYAPC::NAではじめてこの名前を持ち出したダミアン・コンウェイ氏は※2⁠,⁠駱駝といえばPerlであり,Perl on Parrotこそ我々が取るべき道(Way⁠⁠」だからRakudoという名前を推したそうですが(もうひとつ「Rubyのふるさとである日本でPerl 6に興味を持ってくれる開発者が増えないかなあ」という期待もあったといいます※3⁠,どちらかというとこれは「There's more than one Way to do it.(やり方はひとつではない⁠⁠」というPerlのモットーをこそ体現した名前だったのかもしれません。

Perl 6の開発チームは,この改名と前後して「Perl 6というのはあくまでも『仕様』であり,その仕様を満たす(公式仕様テストに通る)ものは,どのような形で書かれていようと,Perl 6の実装である」という方針を打ち出します※4⁠。

これは,一見,実装の遅れているRakudoからオフィシャルの地位を剥奪して,Pugsなどの実装と横一線に並べただけのようにも見えますが,その真意はむしろ,仕様と実装に別々の名前を付けることで,何がどのような状態にあるのか,明確に区別することにあったようです。

たとえば,一口に「リソースを集中する」といっても,単にRakudoで実装されていないだけなのか,Parrot側の実装に問題があって実装が遅れているのか,それともPerl 6の仕様そのものに問題があってRakudoだけでなくPugsの方にまで影響が出ているのかで,リソースを投入すべき場所はかわってきます。

Perl 6という名前を仕様に限定することで,外から様子見をしている人にも話が見えやすくなりますし,すべてをひっくるめて「Perl 6はまだ……」と言われるのを避けられるようになります。

※2

http://web.archive.org/web/20040804225521/http://rakudo.org/

※3

http://www.rakudo.org/2008/01/the-compiler-formerly-known-as.html

※4

Synopsis 1のProject Planの項目には「unlike how it was with Perl 5, none of these projects is designed to be the Official Perl. Perl 6 is anything that passes the official test suite.」と書いてあります。

公式仕様テストの整理と増加

こうして芸名を変え,サイトや,のちにはリポジトリも独自のものを用意して,ほとんど一から仕切り直したRakudoの開発チームは,Rakudo本体の開発と平行して,⁠公式仕様テスト」の整備を始めます。

当時,Pugsのリポジトリには19000個ほどのテストが用意されていたのですが,そのなかには2005年当時とは仕様が変わっているものや,そもそも解釈が間違っていたもの,Synopsisとうまく対応が取れていないものも少なからずありました。

これらを精査して,あるものは修正し,あるものは配置をかえていった結果,2008年5月22日の段階では2905個しかなかった公式仕様テストは,2008年12月31日の段階で9863個になり,どんな修正が入ってもかならず合格させたい後退テストの数や,実際に(スキップしなくても)合格するようになったテストの数も,それぞれ564個から7612個,223個から5911個へと激増します※5⁠。

このテストの拡充はいまもなお続いており,2009年8月12日時点では,17636個の公式仕様テストのうち,後退テストに分類されているものが15098個,そのうち12303個が合格という状態になっています。

参考までにPerl 5系列のテスト数を拾ってみると,Perl 5.005_04本体のテスト(いわゆるminitest)がおよそ4000,5.6.2が8000,5.8.1が27000,5.8.9が68000,5.10.1で80000ほど。コアモジュールなどのテストを含めると,5.005_04が6500,5.6.2が14000,5.8.1が78000,5.8.9が14万,5.10.1が23万ほどになります。

※5

この情報はRakudoの公式サイトやリポジトリ内のdocs/spectest-progress.csvファイルの内容を見れば確認できます。

仕様に準拠しているかどうかと実用性は別物です

もちろんRakudoの実装がこの先もいまのようなハイペースで進む保証はありません。いまは2008年5月にイアン・ヘーグ(Ian Hague)氏が「ラストスパートのための軍資金に」と提供してくださった20万ドルもの助成金のおかげで1月1000件近いペースでテストと実装が増えていますが,先行していたPugsのテストは近いうちに使い切ってしまうでしょうし,設計側でもっと議論を深める必要があるポイントもどんどん出てきています(それに呼応して,仕様の方でも草稿段階のSynopsisが大量に追加されてきています⁠⁠。細部についてはいずれまたじっくり腰を落ち着けて取り組まなければならない時期も来るはずです。

それでも,ごく単純に考えれば,RakudoはすでにPerl 5.5系列や5.6系列よりはよくテストされていますし,来春にはおそらく初期のPerl 5.8系列にかなり近いところまでは到達していることでしょう。

たしかにロードマップ的にはもっと先があることはわかっていますし,クリティカルな場面で使うには時期尚早です。でも,先の発表を聞いて「なんだ,サブセットなのか」とがっかりした人は,もう一度仕様と実用性の関係を考え直してみる必要があるのではないでしょうか。

Pugsのバージョン番号は,6.0から始まります。最終目標は2πに設定されていました。小学生レベルのことしかしないからπ≒3でも用は足りる,という人にとっては2005年の段階でもう十分使えましたし,理想論でしか物事をはかれない人は,もちろん小数点何桁まで追いかけたところで,ゴールにたどり着くことはありません。

RakudoやParrot,⁠仕様としての)Perl 6の場合も同じでしょう。⁠公式仕様テストを100パーセント満たすものだけがPerl 6である」と杓子定規に考えるなら,ひとつ新しい仕様が増えて,すべてのテストが通らなくなった途端にその実装はPerl 6ではないことになってしまうでしょうが,それは――テスト駆動開発をしているPerl 6であればなおさらのこと――あまりに非現実的な見方というものです。

著者プロフィール

石垣憲一(いしがきけんいち)

あるときは翻訳家。あるときはPerlプログラマ。先日『カクテルホントのうんちく話』(柴田書店)を上梓。最新刊は『ガリア戦記』(平凡社ライブラリー)。

URLhttp://d.hatena.ne.jp/charsbar/