rakudo perl6をテストドライブ

rakudo、perl6、Grammer

perl6は言語仕様と実装が最初から分けて作られている。Larry Wall自身がSTD.pmという言語定義モジュールを管理していて、それに対する実装が複数提供されている。Haskellによるpugsという実装がしばらくリードして、perl6のデザインにも影響を与えたらしい。確かにfunctionalっぽいシンタックスがperl6に見られる。

現在主力のperl6の実装はダイナミック言語用のVM、Parrot上のものだ。このParrotっていうのはperl6を実装するために作られたようだが、ダイナミック言語をホスティングするための汎用VMとして位置付けされている。現にparrotのソースツリーにはコンパイラーの実例がある。Rakudoのソースではperl6このうちの一つに含まれている。ソースツリーを垣間見るだけでもparrotのポテンシャルが伺える。さらにparrot上でpython, ruby, schemeを実装するプロジェクトが始まっているようだ。

ダイナミック言語を征覇するためにバックエンドとなるVMを作ったが、言語開発環境としてはフロントエンド、つまりパーサも必要になる。「Grammar」がそれにあたる。perl5正規表現(を越えたもの)をさらにパワフルにしたものと言われている。functional言語のMLとかHaskellは言語実装にたけていると言われるけど、こういう言語によるパーサの実装を汎用スクリプティング言語でも可能にしたものとも見える。これもPugsの影響だろうか。

perl5からperl6というとバージョンアップに見えるが、実は汎用VMとパーサ系によるダイナミック言語のエコシステムを作ってしまったわけだ。なんかガウディの教会のように壮大なプロジェクトだ。どうりで何年かかっても完成しない訳だ。

でもそれだけの内容のものになっていると思う。LLVMがハイパフォーマンス言語の開発を変えたようにParrotはハイレベル言語の流れを変える予感がする。そしてGrammarは言語開発者だけでなく、一般プログラマの開発にも大きな影響を及ぼすものになる気がする。新しいもの嫌いのテングがまだリリースされていないbleeding edgeの言語に挑戦するのも、このGrammerを使いたいからだ。

前置きが長くなってしまった。

どのperl6?

Parrot+perl6はここから
http://github.com/rakudo/rakudo/downloads
「Rakudo 2010-01 release (#25 "Minneapolis")」をダウンロードする
http://github.com/downloads/rakudo/rakudo/rakudo-2010-01.tar.gz

最新のもの(#26)はモジュールインポート系でバグがあって簡単なプログラムも動かないので、避けた方がいい。

インストール

README に従って


perl Configure.pl --gen-parrot && make
make install
でparrot_install/に必要なものが入るから、これを好きなところにインストールする。ソースツリーのトップにできるperl6はそこから動かすと壊れるので注意。

hello world

perlでもインタプリターが使えるようになった!


$ /usr/local/share/perl6/bin/perl6
> say 'hello world'
hello world

標準入出力: catもどき


#!/usr/local/share/perl6/bin/perl6
# 例とかでみんな使っているおまじない。触らぬ神にたた無し。
use v6;

# 古いハウツー見るとこんなのがあるが駄目:
#for $fh.readline -> $line {
# say $line;
#}

# 一行読み込む
say get($fh);

# built-in関数がメソッドとなる?
say $fh.get();

#
# どうやら 「readline」は「lines」に変えられたらしい。
# 命令形の「readline」よりも返り値を表すだけの「lines」の方が
# functionalっぽいからかな。
#
for $fh.lines -> $line {
say $line;
}

perl6はかなり前から作業が行なわれているので、ネットの情報が古かったりするのでソースツリーの「t/」下のテストプログラムを参照するのがベストのようだ。 次回はGrammarに挑戦。