プログラミング言語の優秀さと道具としての評価は別

ワシは、cgi.rb なんかが標準添付になっている RubyPHP を dis る資格はないと思ってる (cgi.rbの元ネタである CGI.pm を擁する Perl も同じじゃないかな)。cgi.rb は、標準添付モジュールのくせにコードが汚いし遅いし、cgi[] の戻り値が String だったり File だったりするし、どう考えても設計ミス。

## Ruby だと
cgi = CGI.new
p cgi['name']    #=> これが File である可能性がある

## PHP だとそんな問題はない
$name = $_REQUEST['name'];   # 必ず文字列
$file = $_FILE['name'];      # ファイルは別途取り出す

そして大半の Rubyist はこういった問題に気づいてすらいない。そういう人たちが PHP を dis ってるのは「ハァ?」と思う。

実は Python も似たようなもん。知ってるか、21 世紀になって 10 年近くたつというのに、Python 標準添付の cgi.py はセッション機能をサポートしてないんだぜ? びっくりだろ。しかも Google App Engine でも Python SDK ではやっぱりセッション機能が用意されてない。Python はセッションになんか恨みでもあるのだろうか。加えてプロセスの起動はトロいわ、cgi.py の読み込みはもっとトロいわで (これは urllib.py のせい)、ちょろっとした掲示板を作りたいときに Python を選ぶのは躊躇する。まあ Python は昔から mod_python が優秀だったから CGI はさほど重要視されてなかったのかもしれんけど、それでも wsgiref を標準添付するまえにやることがあるんじゃねーの? と思う。


結局のところ、言語としての優秀さと道具としての評価は別の話ということだよね。これは言語の速度とアプリケーションの速度とは別の話であるのとよく似ている。RubyPythonプログラミング言語としてはすごくよくできているけども、Web アプリケーションを作る道具としての評価は、ワシからみると PHP とそれほどの差はない*1

逆に初心者向けでいえば、PHP のほうがずっとよく出来ている。初心者が RubyCGI スクリプトを作成すると、

  1. まずファイルに実行属性をつけるところでつまづく (そんな高度な概念は理解できない)。
  2. 次に #!/usr/local/bin/ruby の書き換えがわからなくてつまづく (そんな暗号は理解できない)。
  3. 最後に 1 行目が「"#!/usr/local/bin/ruby\r\n"」となっているせいで理解不能なエラーになってつまづく (←ワシもワシも)。

これに比べると、PHP は天国だ。なにせ拡張子を「.php」にするだけでいい。これは初心者でも分かりやすい! つまづくポイントが少ない方が、道具としては優秀だ (まあ PHP はそれ以外のところではまりポイントが多数あるけど)。

ドキュメントもそうだよね。PHPの公式ドキュメントは優秀すぎる。関数の一覧も見やすいし、検索もできるし、有益なコメントがついててこれがまたドキュメントの価値を高めている。これに比べて Ruby のドキュメントは、揃ってはいるんだけど、見やすさや検索性という点ではダメダメ。これを初心者が見て理解できるかというと、まあ難しいよね (そういうわけで、このプロジェクトには期待してる (競争が発生するという意味で))。言語を「道具」として見た場合、ドキュメントは非常に重要。この点でいえば、PHPRubyPython よりも優秀な道具だといえる。


「言語の速度 != アプリの速度」という話をすると、スクリプト言語屋さんはだいたい同意してもらえる。けどそういう人でも「言語の優秀さ != 道具としての優秀さ (道具としてみれば RubyPHP もさほど変わんないよ?)」という話をすると、怒ったり無理な反論したり感情的な態度になる (ここらへんの反応とだいたい同じだと思えばわかるだろうか)。

でもさ、「言語としての優秀さと道具としての評価は別」なんて、よく考えたら当たり前のことでしょ? いくら RubyPython が優秀だからといって、Windows 用のゲームを作りたい人にとっては VBHSP のほうが優秀な道具なわけよ。あるいは英語がわからない子供にとっては、道具としてはなでしこのほうが優秀なわけよ。優秀な言語がいつも優秀な道具であるとは限らない。そんなの当たり前のことでしょ?

だから、Rubyist や Pythonista が PHP の言語仕様を dis るのは別にいいけどさ、確かにプログラミング言語としての RubyPython は本当によくできてるけどさ、それと道具としての価値はまた別だということを知ってほしい。そんなこととっくに知っとるわい! という人はぜひ cgi.rb の代替物を作るか cgi.py にセッション機能を追加するか urllib.py の _hextochr まわりを修正してから出直してきてほしい。
#他の言語屋さんから dis られて困っている PHPer の方がいたら教えてください。相談にのります。


今日のまとめ:「言語仕様の優秀さ != 道具としての優秀さ」


・・・え、PHP は道具として優秀じゃないって? そこはぜひ Read Air, PLEASE!!


(追記)

ngsw プログラマではないけれど、言語がそもそも道具だと思うんだ。だから評価は不可分なんじゃないでしょうか。 2010/06/14

http://b.hatena.ne.jp/ngsw/20100614#bookmark-22280889

道具としての価値を決定する要素は、言語仕様以外にもいろいろありますよ、ということです。

oukayuka CGIなんて誰も使ってないから放置されてるだけじゃないの? Webフレームワーク全盛の時代にCGIがダメだからこの言語はダメなんて言う人がいるとは思わなんだ。 2010/06/13

http://b.hatena.ne.jp/oukayuka/20100613#bookmark-22280889

キミはせめてtdiaryhikiぐらいは知るべき。Matz日記もるびまcgi.rbに依存してるじゃないか。
こういうこと言ってるのはきっと事情をよく知らないRails使いに違いない。Railsだってcgi.rb使ってる (た) のにね。
#つうか標準添付ライブラリが放置されてたらまずいだろww

denchuinc ruby 最近RubyでWebプログラミングする人たちって,cgi.rbなんて使ってるのかしら? 拡張子をphpにすれば良い,ってのもサーバ側の設定次第な気が……。2010/06/13

http://b.hatena.ne.jp/denchuinc/20100613#bookmark-22280889

キミもtdiaryhikiを知った方がいい。それともcgi.rbを使ってるtdiaryhikiに対するあてつけか? 高度だなあ。

ssig33 はあ、 cgi.rb の代替って sinatra でいいんじゃないですかね 2010/06/13

http://b.hatena.ne.jp/ssig33/20100613#bookmark-22280889

動作がひどく遅い require 'rubygems' が必要な時点で、代替にはならないんじゃないですかね。
あと代替として推薦するならsinatraじゃなくてrackじゃないですかね。

nazoking PHPの $_REQUEST[xxx] は配列が入ってることがあるよ! 2010/06/13

http://b.hatena.ne.jp/nazoking/20100613#bookmark-22280889

それはキーとして「"xxx"」じゃなくて「"xxx[]"」を指定したとき*だけ*だよね。取り出すデータをプログラマがコントロールできるならそれでいいけど、cgi.rbの場合は違うから。

*1:もちろん今なら RailsDjango の存在が前提だろうけど、そこまで含めるとそれは RailsDjango の評価であって RubyPython の評価じゃないし、PHP だってたくさんのフレームワークがある。