SSブログ

スクリプト言語の美学


404 Blog Not Found:「PHPなめんな」と「(Perl|Python|Ruby)をなめんな」の違いとか、Matzにっき Attacking PHPとかを見て




 「そういえば最近、"結局PHPばかり使っている"という理由でJavaを使うのをやめる方向にしたなあ」




ということを思ったのでメモ。




PHPに関するご批判については全くお二方のご指摘の通りで、ぐうの根も出ません。

まあ一言でいえばPHPはアヤシイ言語です。




他のいろいろな言語と違ってPHPだけはZendという会社が一手に実装している感じがあり、コミュニティが作っているというよりも会社が作っているように見えて、オープンソースなのにイマイチ"参加者がつくっている"感じがしない言語としてもちょっと毛色が違うのかな、と思います。




それでも最終的に僕が商売人としてPHPを選択してしまう理由。




1)最初からインストールされていることが多い




2)教育環境が揃っている




3)他の全ての言語と異なり、Webアプリケーションの記述を主目的として作られた言語である




たとえばPerlで構築した方が都合のいい環境、というのもあるのですが、Perlはやはりもっと汎用的な言語なので、Webアプリケーションを書くときにいくつかのお約束を満たさなければなりません。




Rubyはもう少し複雑です。Railsを使えば良い、という話もあるのですが、Railsのお約束を学ばないといけません。




でもたいていのWebアプリケーションって、そんなに複雑なことはさせないのです。




個別のアプリは単純化されていて、全体として複雑になることはあるかもしれませんが、それでもかつてオブジェクト指向がないと絶対に無理、と言われていたようなことというのは、あまりなく、過去の資産の継承というやつも、同じデータベース構造を使うとか、RESTfulなAPIを実装して粗結合するシステムを作るなどしてたいていのことは解決できてしまうのです。




また、PHPで書かれたソースを見せられて、それを誰かが読み解くのはとても簡単なのですが、JavaやRubyのコード、とりわけ複雑なフレームワークで作られたソースを見て、それが何をしているのか読み解くには言語そのものの知識だけでなくフレームワークの知識も必要になり、何倍も時間が掛かります。そもそもJavaはパッケージによってクラス名が被っていたりとか、名前が死ぬほど長かったりして恐怖感すら感じます。




  InputStream is = new BufferedInputStream(new FileInputStream("foo"));




を見てですよ、なぜInputStream = new FileInputStream("foo")ではだめなのか、なぜBufferedInputStreamを介す必要があるのか、理解するだけで数分は浪費します。

こんなの




  $fp = fopen("foo");




と書けるPHPの方がラクに決まっています。




HTTP上のリソースにアクセスするために




  URL url = new URL("http://www.debian.org/");

  HttpURLConnection urlconn = (HttpURLConnection)url.openConnection();

  urlconn.connect();




  BufferedReader reader =new BufferedReader(new InputStreamReader(urlconn.getInputStream()));

  while (true){

    String line = reader.readLine();

    if(line==null)break;

    System.out.println(line);

  }

  reader.close();

  urlconn.disconnect();




と暗号めいたことをやるJava(上記の例はこちら参照)に対し、




  $fp = fopen("http://www.debian.org/");

  while(!feof($fp)){

    echo fgets($fp);

  }

  fclose($fp);




で済んでしまうPHPはC言語育ちの目から見て実に馴染みやすいわけです。

Rubyだったら格好良く




  require 'open-uri'

  open("http://www.ruby-lang.org/") {|f|

    f.each_line {|line| p line}

  }




などと書けるのですが、open{|f|}とか、f.each_line{|line| p line}とかを見て、Rubyを普段使ってない人が理解するまで相当の時間を要します。




QWERTY配列に対するドヴォラック配列というか親指シフトっぽい感じで、効率的なんだけど不気味な感じが否めません。慣れると戻りたくないくらい気持ちいいんですけどね。それは本当に悩みどころです。




でも僕しか使えないとすると、そもそも言語として業務で使えないし、まだ業務でRubyを使うのは、実利というよりも技術者の趣味という感じがするのですよ。とかいうと無数に反論を頂きそうですが。




B2C向けサイト作成がメインのうちの業務で本当にお客様にRubyで作ったシステムを納入して、場合にも依りますがあらゆるオーバーヘッドを差し置いても大丈夫だ、といえる可能性は結構低い気がします。




たとえば「年内に10万人から100万人規模のサービスをやるからシステム規模を出してくれ。けど予算はこれしかない」と言われて、「わかりましたRuby on Railsでやりましょう」とはなかなか言える勇気はありません。よく、「RoRが遅いならサーバを増やした方がいい」と言われるのですが、サーバが増えると純粋に土地代がかかるので、それを補って余りあるメリットって本当にあるの?と言われるとやっぱり「いやあどうなんでしょう」と答えるしかない。Perlとかは「mixiも使ってます」とか、Pythonとかは「googleも使ってます」で逃げることもできますが、Rubyは「twitterも使ってます」「けっこう落ちてるじゃない」と言われてしまう(実話)。




そのうえ、PythonとかRubyとかややマイナーな言語で書くという話をすると、将来的にうちではない別の会社に改良や引き継ぎをしてもらう可能性を考慮すると出来るだけ沢山のベンダーが使える言語で書かれたモノの方が保守コストも安いわけで、PHPで記述するということはそれだけメリットがあるのです。




そういうときに「Rubyじゃないほうがいいんじゃないの?」と言われてもぐうの音も出ないので、JavaやPHPを使うと。まさに事なかれ主義。でもそれが零細企業の現実です。




さらに言えば、PHPの各ファイル(スクリプト)同士はデータベースを介在するか、もしくはRESTfulなやり方で粗結合するとか、とにかく外部的なインターフェースをPHPに依存せずに作るので、極めてどうでもいい処理はPHPで記述して、よほど複雑だったり、よほど違うことをしたりしたい場合に他の言語(たとえばJava)で記述する、といったことが今は簡単なので、PHPで小さいスクリプトを沢山書いた方が、実はかゆいところに手が届いていくのです。




C++がどんなに醜いアヒルの子と言われようと、上品で血統書付きのObjective-Cよりも世間に受け入れられたように、PHPがどんなにマヌケな言語だろうと、受け入れられてしまっているのだと思いますね。結局K&R的というか、見た目のエレガンスさよりもコモンセンスを受け継いでいることが需要、というか。






少なくとも僕みたいに業務でコードを書いてない人間にとってはPHPはちょっとかじったRubyやPerlよりも何倍も便利で使いやすく、結局メインで使っていたC++やJavaよりも手に馴染んでしまいました。




去年趣味で書いたコードは凄く沢山ありますが、殆どがPHPとJavascriptの組み合わせだけです。それぞれのコードは100〜500行前後で、凄く大袈裟な奴でも1000行くらい。

それだけ短いと開発時間は数十分から数時間。




たとえば勝手にブログ評論の最初のバージョンは30分で作って、それをローカルからサーバに転送するのもアップロード一発なわけですが、RubyやらJavaやらだとわりとどんな設定で動かすか考えたりするのがそもそも面倒で、テスト環境から公開環境へのデプロイそのものがなんだか凄く「仕事」然としてしまいます。




後先考えずにノリとスピード感でへんてこなものをバンバンつくれるPHPは、やっぱり楽しい。




PHPの、目を疑いたくなるというか、耐えがたい仕様というのも確かに無数にあるのですが、Webアプリケーションって実は言語そのものよりもデータ構造による制約を受けていることの方が圧倒的に多くて、言語が変わることよりもDBMSが変わることの方が意味が大きかったりします(だからPHPのDB関係の関数の実装は耐えがたいもののひとつではあるのですが)。




PHPってC--かな。デタラメでテキトーなところが。




汚いしテキトーだけど、たいていの欲しい機能は最初から揃っている、というのがPHPの最大の利点かもしれません。




RubyもPerlも、そもそももともとWebアプリケーションのため「だけ」の言語ではないから、ライブラリやフレームワークを必要とする時点でちょっと面倒になってしまいます。




PHPと(Perl|Python|Ruby)の違いは、その主目的ということに尽きるでしょう。

PHPの方がレイヤーが一段上というか、古来からの意味でより"高級"なのです。これを同列に比較してしまうと、そもそも実は違うのではないでしょうか。敢えて比較するとすればPHP vs eRuby、とかでしょうかね。この場合、eRubyの弱点は最初からインストールされていないことくらいです。




 「初心者にはとっつきやすいがそのまま上達してもろくなコードが書けない」




という点は、すごくかつてのBASICに似ています。




本来スクリプトって、ラクをするための疑似プログラム言語だったハズなので、ラクであるに超したことはないのです。




脆弱性の問題とかは、プロトタイプを渡されて製品を実装する人が考えるべきことですが、まあそれはJavaで書いていても脆弱なコードはポンポン生まれますからね。しかも時代が進むにつれて攻撃方法や気をつけるべきことも進化してくるので、これはもはや技量の問題ではないかと思います。少なくとも脆弱である原因を言語処理系や言語体系に依ってはいかんのではないかと。




僕みたいなジジイは、連想配列とforeachと正規表現とHTTPストリームが当たり前のように使えるというだけで、あとはJavaやC++の悪いところも含めてマネできます、という言語のほうがやっぱり取っつきやすいし、小回りがきくような気がするのです。




だからPHPをプログラム言語と見なすのはむしろ間違いで、HTML生成スクリプトくらいに思った方が良いのではないでしょうか。




RubyやPerlみたいな高尚な言語と比較するのはちょっと違うのではないかなあ。




PHP,JSP,eRuby vs Java,Ruby,Perl,Python




というのが正しい比較ではないかと。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。