Perl6がマルチコア・メニーコアと相性が良い(とされている)理由が、ようやく分かりました。言語組み込みで並列化の仕組みが提供されていることが強みであるようです。
結論は上記の通りで、それだけの内容を粥よりも薄く水増ししているようで恐縮ですが、これはあくまで感想の記事なのでご容赦ください。
- 私のPerl6への浅い理解
- R. Diceさんの基調講演 ~ ハードウェアベンダーと仲良くなれるPerl6
- 小飼弾さんによるPerl6の紹介 ~ hyper operatorの例
- 牧さんによるPerl6話でようやく納得
- 次世代の言語が拓く次世代のプログラミング
- 待望のPerl6
1. 私のPerl6への浅い理解
恥ずかしながら、私はPerl6の具体的な中身をほとんど勉強しておらず、キャッチアップも十分ではありません。せいぜい、以下のような認識しかありませんでした。
- (Perl6からPerl5のモジュールを使える機構があるにせよ)後方互換性よりも抜本的な書き直しに重きが置かれる
- Perl 5.10やMooseやPerl6::*で、Perl6の機能がPerl5の世界に逆輸入されている事例がある
- Cによる実装としてRakudoや、Huskellによる実装としてPugsなど、いくつかの実装があり得る
- Rakudoは(スタック型でない)レジスタ型のVMであるParrotで動くPerl6である
この通り、私のPerl6への造詣が極めて浅いこともあって、本記事では間違ったことを書いている可能性もありますので、お気をつけください。
とはいえ、虎の威を借りるわけではありませんが、YAPC::Asia 2009特別研修で牧さん(lestrratさん)が「(Perl6を)無視していると置いて行かれるが、現段階では追って振り回されるほどでもない」述べられたことは、実感に適っていました。
2. R. Diceさんの基調講演 ~ ハードウェアベンダーと仲良くなれるPerl6
Perl6とマルチコア・メニーコアとの相性について、私が最初に疑問に思った切っ掛けは、YAPC::Asia 2009の初日朝、牧さんの開幕挨拶に引き続いて登壇した、TPFのRichard Diceさんによる基調講演でした。
例によって、トークの委細は他の立派な記事をご覧ください。
- Perl界の重鎮 リチャード・ダイス氏が登場!「YAPC::Asia Tokyo 2009」開催
- YAPC::Asia Tokyo 2009 スペシャルレポート 1日目レポート[随時更新]
- 上記記事の元ネタでもあるhttp://d.hatena.ne.jp/hiratara/20090910/p1
- 刺身☆ブーメランさんのYAPC::Asia Tokyo 2009 に行ってきた (9/10, day1)
- lesamoureusesさんのYAPC::Asia2009 09/10のメモ
トークでは、Perlのコミュニティーと企業などとの関係も論じられました。そこで、マルチコア時代の現代に於いて、IBMやIntelなどといったハードウェアベンダーと仲良くなる戦略もある、という選択肢が提示されました。そして、Perl6はこの辺りが得意分野であるとも。
Perl6をよく理解している人であれば、この論旨は明確であったのでしょうが、そのときの私にはPerl6がなぜマルチコア・メニーコアと仲が良いのか、皆目見当もつきませんでした。
3. 小飼弾さんによるPerl6の紹介 ~ hyper operatorの例
Perl6絡みの続いての出来事は、小飼弾さんによるトークPerl? Which Perl?を拝聴したことです。
これもまた例によって、トークの委細は他のすばらしい記事などをご覧ください。
- YAPC::Asia Tokyo 2009 スペシャルレポート 2日目レポート[随時更新]
- 404 Blog Not Foundより、#yapcasia2009 - Perl? Which Perl?
- 弾さんのスライド
そこでは、「Perl6ではあんなこともこんなことも出来ちゃうんだぞ」という様々な実例が飛び交う様を目の当たりにしました。しかし、匿名クラスの紹介などには、あまり心が動かされませんでした。そもそも燦然と登場したMooseによって、OOに関しては多大な恩恵を享受出来ていると感じています。なので、OOについては「完全なOO言語だからいろいろなことが出来るという事例の紹介なのだな」という、学術的な感を抱いてしまったことを正直に告白しておきます。それで何が便利になるのかというところまで、今の私には頭が回らないことが理由であって、馬の耳に念仏となってしまったという反省があります。
馬から人間にクラスチェンジすることを期するとして、それよりはむしろブレース{}で括られたブロックが全てクロージャーになっているなど、FO(functional oriented)の方面に興味を抱きました。そして(ようやくここで)今回の記事の主題につながるわけですが、Rubyの人が本気でうらやましがっていたというhyper operatorが登場しました。
例題は1から9までのそれぞれの整数の平方根を求めるコードスニペットです。
- Perl5の場合
print map { sqrt } (1 .. 9);- Perl6で
hyper operatorを使った場合 say [ [1 .. 9]>>.sqrt ];
この>>.という代物がhyper operatorです(どうも他にもhyper operatorがあるようなのですが、一次資料に当たる前に記事を書いています。ごめんなさい)。メソッド呼び出しのドット.におまけが付いた感じですね。
しかし、hyper operatorの何がそんなにすごいのか、ここでも私は分かりませんでした。それまでいろいろなヒントがあったので、そろそろ気付いても良さそうなものでしたが。
4. 牧さんによるPerl6話でようやく納得
結局、私が膝を打ったのは、牧さんによるhyper operatorの効用の解説をいただいた時でした。
小飼弾さんによるYAPC::Asia 2009特別研修コースPerl, Unicode, and AJAXでは、たいそうJavaScript成分が強いものでびっくりしましたが、研修後に展開された牧さんとE. Millsさんによる濃厚な「Tips紹介および何でも質問コーナー」では、Perl6の話題が頻出していました。並列化との相性も、その一環として触れられた次第です。マルチコア・メニーコア時代のCPUパワーを余らせない並列化の機構が、言語組み込みとして仕組まれていることの恩恵を紹介してくださいました。
Perl6は並列化に強い。牧さんの解説でこのことが分かった瞬間は、晩夏・初秋のイベントでの出来事をピースとする、Perl6や並列処理についてのジグソーパズルがぴたりとはまった瞬間だったように思えました。
5. 次世代の言語が拓く次世代のプログラミング
Perl6は(現状では)遅い遅いと散々言われています。弾さんによるlleval(Lightweight Language Evaluator?)も、Perl6だけ実行時間を2秒まで許容する制約緩和策が採られているそうです(他は1秒まで)。といっても、いわゆる「早すぎる最適化」が害悪でしかないように、正式リリースを迎えていない現段階で速度を云々するのは時期尚早というものですので、私もあまり気にしていません。
Perl6の処理速度を大きく左右するParrotの最適化については、(ありうるかもしれない、という段階の話ですが)TPFやJPAの金銭的バックアップなどに期待するところ大です。 しかし口を開けてVM高速化を待っているだけでは、せっかくのPerl6を活かすことにはなりません。コードの書き方次第で、プログラムが最適化出来る余地があるのです。
それは例えば、LLTVで小飼弾さんが語った、foreachでなくmapにする工夫でしょう(LLTVの感想記事でも言及しています)。平方根を求める例であれば、各整数の平方根を求める計算自体は、順不同に行えます。ということでPerl5でもmapを使っているのですが、Perl6のhyper operatorでは、CPUリソース(ファイルIOやDBやネットワークもそうなのかは、いつかきちんと調べようと思います)の並列的な割り当てを言語自体がやってくれるので、プログラマーは簡単にマルチコア・メニーコアの恩恵を享受することが出来るという次第です。
私は「やや真面目なサイト」としてこのブログのサイドバーにErmitejo - エスペラント日本語翻訳へのリンクを掲げていますが、このような自然言語処理(NLP)は膨大な組み合わせ爆発と直面することが多いので、とても興味深いです。
他にも、いわゆるenumであるところのset(集合)を言語組み込みで扱えるようになる(junctionの実装)という話も魅力的です。これはPythonでの集合演算と同様と理解しており、Perl5では例えばCPANモジュールSet::Scalarなどで扱えます。事実、私もSet::Scalarを実際に使わせていただいていますが、速度面ではPerl5の限界を感じることもあります。Perl6でこれが言語組み込みで提供されるとなると、それなりの最適化を期待しても罪ではないでしょう。上記の翻訳サービスでの統語処理(構文解析など)ではHPSG(Head-driven Phrase Structure Grammar; 主辞駆動句構造文法)という理論に基づいた実装をゴリゴリ書いているところですが、Perl6ではかなり洗練された書き方が可能になりそうで、とてもわくわくしています。
6. 待望のPerl6
こうなると、いままでろくにPerl6のことを勉強しようとしなかったくせに、とたんにPerl6の到来を待ちわびる欠食児童のような気分になりました。人間というのは罪な生き物ですね。急に綺麗になったあの子に、掌を返すように群れる男の子のような、という形容もありかも知れません(何を書いているんですか私は)。
Perl6のRakudo実装の正式リリースであるRakudo *(ラクド・スター)は来年第二四半期にリリースされる予定ですが、弾さんは「仕事などで常用出来るようになるまでには短く見積もって2年ほど」、牧さんは「Perl5系が10年続いてPerl 5.20なんてものが出る可能性だってある(Perl5は6と並行して存在するが、その期間はかなり長い)」と、それぞれおっしゃっていました。
私のような、Perlをもっぱら日曜プログラミングとして使っているような人間は、アプリを満足に書けるようになったくらいのタイミングで、積極的に飛びついて使っていきたいと思います。
コメントする