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

第11回 Devel::Declare:醜い部分を隠すための工夫あれこれ

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

Perl界を牽引しているのはやはりネットまわり

Perlの世界でいま何が起こっているかを調べるには,最近どんなCPANモジュールが更新されているかを追いかけてみるのが簡単です。筆者も日頃からCPAN検索サイト更新情報や,typesterこと村瀬大輔氏のCPAN Recent Changesのフィードを読んでいますが,ここでは日頃みなさんもおそらく肌で感じているであろう傾向を具体的な数字に落とすために,cpan-uploadsという,CPANにアップロードされたファイルの情報が流れてくる受信専用のメーリングリストを利用して,この1年間にどのような名前のモジュールがアップロードされたかをまとめてみました。

このリストによると,2008年7月から2009年6月までの1年間にアップロードされたファイルの数は27,009個。そのファイル名(ディストリビューション名)を整理・分解して,共通の名前空間に属するものを出現回数順にまとめると,上位10傑はこのようになります。

 回数名前空間
1905Net
2614Catalyst
3532POE
4515WWW
5493Test
6434App
7401POE-Component
8369HTML
9355Data
10351MooseX

ひとつでもバグが見つかったら修正版をCPANにアップロードするという人もいれば,「不安定で実用に耐えない」という悪評が立たないように更新頻度を調整している人もいますから,出現回数が多いからといってかならずしも人気のある,重要な名前空間とは限りませんが,これを見る限り,やはりいまのPerl界はインターネットがらみ,特にCatalystの勢力が強いのがわかりますし,この連載ではまだ取り上げていませんが,20世紀のPerl界を締めくくる一大プロジェクトとなったPOEの堅調ぶりや,CPANモジュールの品質を支えるTest系モジュールの充実,以前取り上げたMooseの成長などもうかがえます。

ハック系のモジュールも毎日のように更新されています

ここまでは予想通りの結果といってよいのですが,興味深いのはその次,11位から20位までのリストです。

 回数名前空間
11318XML
12262Padre
13257DBIx
14252Class
15249Devel
16242Acme
17241CGI
18241Text
19231CPAN
20226Parse

12位のPadreは最近活発に開発が続けられているPerl製のIDE。16位のAcmeはいわゆる「ネタ」系のモジュールを入れておく名前空間なのですが,ここで筆者の目を引いたのは15位にランクインしたDevelという名前空間。

これは,1996年リリースのPerl 5.002で導入されたDevel::SelfStubberを筆頭に,2000年に初お目見えした5.6系列でコア入りしたDevel::DProfDevel::Peek2002年の5.007003でコア入りしたDevel::PPPortなど,もともとはかなり高度な開発者向けのツールを入れておく名前空間でした。

典型的なDevel系モジュールであれば,perlコマンドの-dスイッチといっしょに使うと「Devel::」という名前空間を省略できる,という特徴があるくらいPerlの内部に密着した名前空間ですから(たとえば2008年に登場して新たな定番となりつつあるDevel::NYTProfというプロファイラであれば,「perl -d:NYTProf <プロファイルを取りたいスクリプト>」という形で実行できます),ふつうに考えれば2日に1回以上のハイペースで更新があるような場所ではないのですが,この数年は,従来のデバッグや開発支援といった分野だけでなく,前回話題にしたMooseX::Declareの背後にあるDevel::Declareなど,近年のモダンPerl界を特徴づける技術を支える黒魔術的なモジュールを入れておく場所としても活況を呈している様子がうかがえます。

もっとも,活況を呈しているのはDevelだけではありません。そのつもりで見ていくと,たとえば63位(年79回更新)には,Bという,Perl 5.10系列ではコアから外されてしまったPerlコンパイラ関連の名前空間が登場しますし,87位(62回更新)にはSubという,サブルーチン/メソッドまわりの名前空間が登場します。14位のClassや,62位(81回更新)のObjectといった名前空間のなかにもよりよい書き方を実現するためのツールが登録されていますから,均してしまえばそれこそ毎日ひとつやふたつはこの手のモジュールが目に入る,といってよいでしょう。

このようなモジュールはPerl内部の詳しい知識がないと使いこなせないものも少なくないので,なかなか日常業務のなかで取り入れるところまではいかないものですが,今回はそれぞれの名前空間からいくつか,話のネタになりそうなモジュールをピックアップしていきたいと思います。

モダン世代のソースフィルタ

Perlには1996年リリースのPerl 5.002からソースフィルタ用のAPIが組み込まれています。これは,もともとは(おもにソースコードを保護するために)圧縮・暗号化したファイルを動的に展開してコードを実行するために用意されたものなのですが(詳しくはPerlに同梱されているperlfilter.podをご覧ください),2000年にPerl 6の議論が始まってからはもっぱら理想的な書き方をPerl 5のコードに変換するためのツールとして使われるようになりました。古くからのPerlユーザであれば,宮川達彦氏が2001年に書いたFilter::Pyuutaというモジュールを思い出す方も少なくないでしょう。伊藤直也氏が以前紹介していたClass::HPLOOPerl6::Classesといったモジュールもソースフィルタを使ってPerl5らしからぬ表記を可能にしていました(いずれも2003年リリース)。

比較的モダンに近いところでは,インギー・ドット・ネット(Ingy döt Net)氏が2005年にリリースしたTest::Baseなどの裏で使われているSpiffy(こちらは2004年リリース)がソースフィルタを活用していることで知られています。

ただ,このようなソースフィルタは,ソースコードを先頭から末尾まで一律に修正してしまうため,実装によっては本来壊してはいけないコードやデータまで汚染してしまうこともありました。

この問題を解決するため,ソースフィルタ用のAPIに手を加えて,ソースコードをパースしながらフィルタリングできるようにしたのが,2007年に開発が始まったDevel::Declareです。

その詳細についてはPODをご覧いただくとして,これもまた影響範囲をなるべく局所化しようという大きな流れの中に位置づけられるもの。いまでは前回紹介したMooseX::Declareだけでなく,Method::SignaturesTryCatchといったモダンなモジュールの裏方としても利用されています。

著者プロフィール

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

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

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

コメント

コメントの記入