2011年3月1日火曜日

perl6が大変な事になってる件

「CGI言語」として、一時期は一斉を風靡したperlですが、
perl6に至って、迷走を繰り返しているようです。

端的にいって、
2000年に始めます、と言ってから、
2011年現在、未だに正式リリースできてないというのです。

当時のプレスリリースでも有れば良かったのですが、
見当たりません。
とりあえず、perl6.orgは2003年辺りから稼働しているもよう。
http://web.archive.org/web/20031007002655/http://www.perl6.org/

2000年からの歴代の議論は追えるっぽい。
http://perl6.cz/wiki/Perl_6_and_Parrot_links#Articles.2C_Blogs.2C_Discussions

迷走は構文にも現れています。
究極は「ハイパー演算子」。ネーミングで既に怪しいですが、構文がヤバい。
http://perl6advent.wordpress.com/2009/12/06/day-6-going-into-hyperspace/
http://d.hatena.ne.jp/uasi/20100108/1262951364

> lsay (1, 2, 3, 4) <<+>> (3, 1, 3, 1)
[4, 3, 6, 5]
> lsay (1, 2, 3, 4) >>+<< (3, 1, 3, 1)
[4, 3, 6, 5]
どう見てもアスキーアートです。有難うございました。

正直、これっぽっちの記号群に、「意味」を持たせすぎで、
サンプルを見てすら、何が起こってるのか判りません。

こんなもんじゃないです。不等号を使ってるのには理由があります。

> lsay (1, 2, 3, 4) >>+>> 2
[3, 4, 5, 6]
> lsay 3 <<+<< (1, 2, 3, 4)
[4, 5, 6, 7]

逆向きキター。

結論から言うと、どうやら行列演算であったらしい。
普通は、ライブラリで用意してよいレベルでしょう。

なんで記号で頑張っちゃうかなあ。
言語仕様に色々取り込みすぎるから
いつまで経ってもリリースできないのかと。

合体ロボに、ビームライフルを付けるか、
核酸粒子砲を付けるかで揉めてるようなもんですよ。

これが、非オブジェクト指向言語の末路か、と思わざるを得ません。
(関数型を否定しているわけではないので念のため)

[1,2,3,4].add(2)
こっちの方が、解りやすいですよね。

perlは、昔から記号類を積極的に使う言語で、
具体的には、変数を使う構文では$,%,@の使い分けが必要です。
配列だろうが、連想配列だろうが、単純変数だろうが、
プログラマに構文を使い分けさせるのは

昨今のオブジェクト指向を鑑みるに、これは時代遅れだと思われます。

その一方で、sayとかdieとか、英単語の中途半端な導入が気になります。
ステートメントだから英単語。な訳ではありません。
演算子にも、記号群と、英単語群が混在しています。

例えば、比較演算子は、 <=> と cmpとの使い分けが必要です。
いまだに、どっちが文字列用で、どっちが数値用か覚えられません。
#これはPHPにも伝わっちゃってる、悪しき遺伝子ですね。

perl族は、配列操作が豊富、っていう意見も見かけましたが、
例えば配列スライスはpythonにもあるし、
行列演算とか、何に使うんだ?と正直思います。

かく言う筆者も、perl5のmapとgrepに凝ったことがありましたが、
第3者にソースを見せるときには、ぶっちゃけ評判悪かったですね。
pythonでは内包表記とかを使って、人間に優しく記述できます。

perl5までは例外がない。というか、catchする方法が無いわけですが。
evalで例外をキャッチできます。という記事も見かけましたが、
http://www.geocities.jp/ky_webid/perl5/040.html
これは頓知の領域でしょう。
livedoorクリップで、この記事へのツッコミを見かけましたが、間違っちゃいけません。evalが補足するのはエラーであって例外ではありません。だって例外をプログラマが任意に投げる方法って、無いでしょ? dieを使うの? dieはエラー終了ではありません。正常終了です。それを「例外として使ってます」ってだけです。
故に「evalで例外処理のエミュレーションが出来る」というなら判る。がそれは何処まで行っても「例外処理」とは言いません。まあ頑張りたいならもちろん個人の自由なので止める理由はありませんが、例外が必要な案件でそもそもperlを使うのが間違ってます。というのが筆者の見解。ちなみにJavaは別の理由で反対です。 
ちなみに「evalで例外処理」を正しく実装しているのは、筆者の知る限りtclだけです。筆者はtclの言語仕様を美しいと思っています。
言語本体に手を入れずにMooseとか、
エミュレーション手段が出てきたのはperl自体の底力を感じさせるものですが、

この辺り、perl6ではどうなんだろうと思っていたのですが
筆者は知らなかったんですが、perl6|rakudoは例外を実装したらしい。
だたし、「その他」の切り口が、気持ち悪いものが多いので、
業務とかに使うかどうか、というと正直判らないですね。って言うか使わない。

perl族は、短い記述をめざしている感がありますが、
その手段として記号を使ったり、暗黙の挙動を盛り込んだりと、
かなり慣れが必要。逆に機構は複雑になってると思います。
こんな問題が出てくるくらいだから。
http://d.hatena.ne.jp/gfx/20110301/1298944990
昔からどうやらperlとrubyは、世の中のgeekな方々に人気っぽいのですが、perl6の事をどう思っているのだろうか?と思ったら、弾氏は、特になんとも思ってなさそうですね。http://blog.livedoor.jp/dankogai/archives/51493739.html
筆者はgeekでは無かったんですかそうですか。