パスワードを忘れた? アカウント作成
292773 journal
Perl

taro-nishinoの日記: 私は何故Perlを続けたのか

日記 by taro-nishino

私は以前、Jonathan Rockway氏の"何故、私はPerlを続けるのか"を紹介したことがありました。このエッセイの原題は勿論"Why I stick with Perl"です。ところが、最近Jeffrey Kegler氏がよく似た題名で"Why I stuck with Perl"を書いております。題名の違いは、現在形か過去形の違いだけですが、視点は全然違います。前者はモジュールの再利用の視点からCPANを見ており、後者は総合テスト環境(つまり、cpantestersのこと)の視点からCPANを論じています。
他言語の人が分かっていないのは、CPANをただのモジュール格納庫としてしか見ていないことです。cpantestersのことを全然分かっていないのです。テストするのみならず、モジュール作者がテスターにコンタクトすれば、もっと詳細なデータや、それどころかもうパッチすら用意している優秀なテスターもいます。こんなことが用意されている言語はPerl以外にないでしょう。
私もテスターに参加していますが、いわゆるスモークテスト出来る環境とリソースを持たず、マニュアルでテストするので本当にレポート数は申し訳ない程少ないです。これはテストするモジュールを先ず選別するところから始めるので、どうしても時間がかかるし、選別に主観が入るのでテストしていないモジュールの方が圧倒的に多いでしょう。ですから、モジュール作者(特に日本人)にお願いしたいのは、モジュールを何故作ったのか、動機や目的をしっかり英語で書け、です。何か一つでも面白いことが書いてあれば自然に応援したくなるし、テストもいろいろとやって見ようと思うのは人情でしょう。メソッド名の羅列を見て誰が面白いと思いますか? スモークテストする人は機械的にしますからこんな感情を持たないでしょうが。
もう一つあります、外部依存を無くすことです。特に外部のCライブラリに依存は決してしないでほしいです。ライセンスが許す限りモジュールに同封するのが望ましいと思います。業務で使うかどうかも分からないのに、テストのために誰がわざわざ外部のライブラリを個別にインストールしますか? 常識で考えても分かるはずです。
以上、いろいろ御託を並べましたが、Jeffrey Kegler氏の"Why I stuck with Perl"の私訳を以下に載せておきます。

私は何故Perlを続けたのか
2011年1月22日 Jeffrey Kegler

私は、一人のPerlプログラマがPythonに転向した理由の非常に心のこもった説明を読んだばかりだ。
このブログ投稿では、私が何故転向しなかったのか説明しよう。

私がMarpaプロジェクトを始めた時、Perlは当然の選択ではなかった。それどころか、悪いものと見られていた。その頃、今と同じくPythonが非常に持てはやされていた。いや、もっとすごかったかも知れない。私はPythonの経験があって、素晴らしかった。テスト目的のためのスレッド化されたメールクライアントを作るためにPythonを使った。私はPythonが学びやすく、使って楽しく、私の仕事を完成させる有効な方法だと分かった。

Perlは別の問題を持っていた。私の新しいパーサーMarpaの重要な参加者は学界だ。学界人は確かにPerlを使う。私の経験は、彼等はある意味でPerlを重んじている。だが、学界を尚も支配する最小のパラダイムにPerlは殆ど入らない。貴方が学界人にPerlを話すなら、彼等の言葉で話していない。それは、誰も聞いていない恐れにぶち当たることを意味する。

私はいろいろなスクリプト言語の相対的な長所短所の多くを読み学習した。それは非常に広範囲に渡る。何故私はPerlを続けたのか直接的に説明する。PerlはCPANを持つ。そして、CPANは…うーん、ストーリーを話させてほしい。

CPANでのある出来事
最近、私のMarpa::XS開発バージョンがcpantestersからの多くの失敗を見せた。ポータブルなCコードを書くことに私が早く出来たか、このブログで少々自慢した後に、これが発生した。ギリシャ神話の一つ、つまりオリンポスの神の一人が、大口を叩く人間の鼻柱を折る必要があると決心したかのようだった。

私は何ら手掛かりを受けなかったが、確実にいろいろなテストの失敗を得た。相当な奮闘努力で、私自身のもの以外のすべてを解消できた。残っている失敗はAndreas Koenigによって実施されたテストだけに発生した。Andreasのセットアップに落度があると思ったわけではない。他者のセットアップが甘いところをAndreasは厳格にしていることはあり得ることだった。それは事実だった。

私はAndreasにメールした。正直言って、私は全く期待していなかった。Andreasは多くの重要なことをしている。私の憶測は、新しいモジュールの不安定開発バージョンの新Cコードが彼のセットアップで実行しない理由を発見することだが、彼の"すべきこと"リストの上位に上がるには時間がかかる、だった。

だから、すぐに返事が来たのにはびっくりした。私のMarpa::XS開発バージョンは、あるバージョン以降のModule::Build開発バージョンと共になって失敗した。Andreasが退化分析をするためのセットアップをしていることが判明し、その退化分析は直接その組合せを指していた。

知らない人のために言うと、退化分析は、いろいろな要因(今の場合では、モジュールバージョン、Perlバージョン、ハードウェア、OS等)を結果(今の場合、成功か失敗か)と共に組合せた方程式をセットアップする。どの要因がどの結果と相関関係があるか見るために使用出来る。つまり、今の場合、どのモジュール、どのハードウェア等が失敗と関係があるかである。

それは素晴らしい技法だ(私が実際にコンサルトしている処で、顧客に使ってもらおうと試したことがあった。だが、計算するにはプッシュバックが多すぎた)。Andreasの退化ツールは直接問題を指摘した。Module::Buildがダイナミックコードの非遅延ローディングに切り替った時に、たまたま始まった。

ここに私のバグがあった。私はC関数を宣言していた。仮にこれをxyz()としよう。だが、私はxyz()を定義しなかった。と言うのは、そのためのコードが無かったから。しかし、遅延ダイナミックローディングを用いれば、xyz()をロードすることは無かった。だから、遅延ローディングでは私のバグは無害だった。

完全テストの大義において、Module::Buildは非遅延ローディングに切り替わった。これは、呼ぶと呼ばないとに関わらず、実行コードはxyz()を探し、見つからない時異常終了した。

David Goldenの私へのメールの中で、彼は遅延か非遅延のどちらがいいのか公開質問した。私は最終的な解決は彼の判断に委任するだろう。Marpaにとっては、最新の振舞いでいいと私は考えるし、既に私のテストは必ず非遅延でセットアップしている。将来、xyz()のような呼ばれず、定義されずは私のテストセットアップにおいて異常終了するだろう。

まとめ
私の探求は、広くポータブルなMarpaのC可能バージョンを作ることだ。結局、CPANは自由な広範囲に渡るテスティングだけではなく、早くて丁寧な品質の高いデバッギングの助けさえも提供する。Perl以外の言語でプログラミングしていたら、そんなことを受けたであろうか?

この議論は、taro-nishino (32033)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...