今日は1日の1/4をPHPの悪口(@nitro_idiot参照)をつぶやくことに費やしました。自分でもバカだとは思いますが、迷いがなかった分すっきりしました。
そうして散々disりましたが、反応をくれたのは @tejima さんと @omasanori さんだけでした。きっとフォロワーの方々には嫌な思いをさせてしまったんじゃないかなぁと半ば反省もしています。本当ですよ :)
ただ、言いっぱなしだとほんとに愚痴になってしまうのでブログにまとめてみることにしました。
僕は少なからずPHPプログラマである
僕はアルバイトで手嶋屋のお世話になっています。手嶋屋はOpenPNEというSNSエンジンを作っている会社です。
そこで僕は開発者としてOpenPNEを作っています。そしてOpenPNEは完全にPHPで書かれています。つまり僕はPHPプログラマなのです。
ただし、僕はPHP歴7ヶ月です。決して立派なPHPプログラマではありません。けれどまったくPHPについて無知でdisってるわけじゃないというのは断っておきたいです。僕はPHPで食っている他言語プログラマの1人なのです。
PHPはプログラム言語として不完全である
まず僕が一番言いたいこと。それはPHPはプログラム言語として不完全であるということ。
この文章はこの記事の要約であるとともに、僕がただの宗教戦争家ではないという意味合いを含めてあります。
僕は単に、構文や思想が好かないとか、バージョンアップごとに仕様がころころ変わることにうんざりしているとか、自分のお気に入りの言語(つまりLisp!)を使っていることで優越感に浸りたいからとか、お気に入りにも関わらずその言語で仕事を見つけられないことへの嫉妬とか。
そんなつまらない理由でPHPを貶めようとしているわけではないってことです(別に有益な議論をしたいわけでもないですけど)。
僕の主張をより具体的に言い換えるならば、PHPはプログラム言語ではなく、HTMLテンプレート言語である。そしてそのテンプレート言語に思いつく限りの魅力的な機能を盛りに盛った言語であるということ。これはPHPの出自を思い返せば納得のいく話。
にもかかわらず、PHPは5になってオブジェクト指向のための構文まで備えちゃったそうですね。そして、もはやPHPはプログラム言語らしさを持ってしまった。他の言語でできることの多くもPHPでできちゃうようになっちゃいました。
結構なことです。僕もたまに電子レンジで洗濯もできればいいのになんて考えることがあります。ついでにこたつ代わりにもなってくれればそれに越したことはない。
でもきっと電子レンジで洗濯ができないのには理由があると思います。僕は高校で物理学が得意じゃなかったのでよくわからないですが、きっと水道をつなぐ穴がないからとか、そういう理由だと思います。
それでもいろんな機能を盛り込んだ電子レンジ、じゃなくてPHPは、ここにきて本来の目的を見失っている気がします。それもPHP自身さえも自分が何者であるかわからなくなるほどに。
symfonyは変態だ
OpenPNEはVersion 3になるときに大きな技術的洗濯、じゃなくて選択をしたようです。それは、使うフレームワークとしてsymfonyを選んだことです。
symfonyはMVCな大規模PHPアプリケーション向けのWebフレームワークです。流行のMVCです。
ちなみに僕はsymfonyも嫌いです。理由は簡単。PHPらしくないからです。PHP歴7ヶ月の僕にはそう見えます。
さっきも書いたようにPHPはテンプレート言語であるはずです。でもsymfonyでのPHPの使われ方はテンプレート言語(View)としてじゃない。ModelもViewもControllerもPHP。実際、symfonyを使っているとHTMLを書くことがほとんどありません。PHPかYAML。さらにそれに拍車をかけて、OpenPNE3では国際化するために、ViewでもほとんどがPHPコードになっています。
もはや変態としか思えない。
テンプレート言語でここまでやるなんて。Excelでシューティングゲーム作ってる人と似た香りがするじゃないですか。
まあ、まともに動いてるんだし、そこは趣向ってことで良しとしますか。ね?
PHPは大抵のことができるかもしれないが…
上記のことをポジティブに捉えるなら、PHPは最強の言語ということになります。ネイティブでテンプレート言語を備えているし、オブジェクト指向もばりばり。
ただちょっと待ってください。確かにPHPは大抵の用途に使えるかもしれません。
けれどPHPは大抵の用途で不完全さを醸します。僕はたった7ヶ月の間にPHPの言語としての不完全さを身に染みて実感させられる仕事を任されました。
それは、OpenPNEのver.2からver.3へのDBコンバータ。このプログラムにはHTMLなど微塵も関係がないですが、これをPHPで書くことになりました。※
言うまでもないですが、こういったバッチ処理にPHPは向きません。機能をほとんど実装し終わって気づいたのですが、PHPのメモリリークが尋常じゃないんです。
PHP経験の薄いうぶな僕は不思議に思って何度もググってみました。するとPHPに絶望する内容が出る出る。
PHPはループの途中でreturnするとメモリリークするとか、再帰させるとメモリリークするとか。問題の多くはORMであるDoctrineにありましたが、MLを見ると「PHP5.3を使ってね」って言葉で結んであって愕然としたり。※(追記) これらは嘘です。詳細はこのリンクを踏んでね
この話の多くは最新版のPHPでは改善しているのかもしれません。そもそも僕のコードが悪いのかもしれません。でも言いたいのはそういったことではないんです。これらの問題を解決したいがためにこんな記事を書いているわけじゃない。
僕はそのとき思いました。それは、僕たちはPHPというテンプレート言語に期待しすぎてるんじゃないの?って。
いくら電子レンジが万能だからって、こたつ代わりにはならないでしょう? ただ温めるという目的が同じというだけでこたつみたいな使い方をしてもあんまりいいことはないと思いますよ。
一方、PHPはビジネス面で成功している
プログラマには評判がよくない一方で、PHPは多くのWebサイトや企業で採用されています。求人サイトでWebプログラマの募集を見れば、十中八九がPHPプログラマの募集です。
何でプログラム言語でもないPHPがそれほど人気を保っているのか。
さぁ? 僕にもさっぱり分からないです :p
ただ、PHPはある種のやっつけ仕事をこなすのにはちょうどいい言語であることが多いってのが結論じゃないでしょうか。
良くも悪くも、PHPにWebフロントエンドをやらせれば一番うまくやるでしょうから。
結局何が言いたいのか?
んー。何か僕自身も何が言いたいのかわからなくなってきました。この記事はきっと誰の目にも止まらないか、止まっても2、3はてぶされるくらいで終わると思うので適当に結んでおきます。
僕はPHPは嫌いです。symfonyも嫌いです。でもOpenPNEは好きです。どこかで読んだことがあるセリフですね :)
追記 : はてぶしてくれた方々を受けて
書き終わるころにはとどめのことなんてすっかり忘れてしまっていました :p タイトル決めたときも何を書くかはっきり決まってなかったです。
ただ1日置いて考え直してみると、自分の言いたかったことがはっきり説明できる気がしてきたので追記させてください。
僕はPHPをただのテンプレート言語だと認識しています。これはPerlで言うMasonとか、GaucheのSXMLとかの類です。
テンプレート言語はフロントエンドの動的表示を簡単にするために使われますが、決してプログラムの大部分を占めるわけではありません。Viewだけです。PHPはこのViewに特化した言語だと認識しています。
こういった言語を使うと、簡単なWebページがさくっと書けちゃいます。たとえば現在時刻を表示するだけのPHPプログラムなんて数分で書けます。
だけど、プログラムは大きくなるものです。Web上のほとんどの動的サイトがそう簡単なものとは思えない。きっと○○指向とかよくわかんない技術が使われてるに違いありません。
そうすると抽象化のためにRailsみたいなMVCのWAFが必要になってくる。MVC以外にもKahuaやPiece Frameworkみたいな継続ベースとかありますね。symfonyもそうやって作られた1つと言えるでしょう。
けれど、そもそも出自がプログラム言語ではないPHPでそこまでやるのは無茶だと思います。メモリ管理なんて意識しなくても使えるように高級言語を使ってるのに、どうしてわざわざ変数をunset()しなくちゃならないんですか。
ここから導き出された僕の主張はこうです。symfonyを使わなきゃいけないほどの大規模アプリを作るんだったらPHP以外の言語にしようってこと。
特にこれからはこの傾向が強まってくるんじゃないかなぁと思います。フロントエンドだってもっとリッチにするためにJavaScriptが多く使われるようになってきた。もはやPHPの得意分野は重要でなくなってきており、さらに他の分野ではもっとうまくやってくれる言語がある。
…結局とどめは刺せず終い。ごめんなさい。今度disるときはもっと気の利いたタイトルを考えます ;)
追記 : PHPでのメモリリークに関する嘘について
上で書いた「PHPはループの途中でreturnするとメモリリークするとか、再帰させるとメモリリークするとか」について追記です。
はてぶコメントを読んでもう一回ググってみましたが、情報ソースを見つけられませんでした。僕の見間違いか思い込みだったんでしょう。すいませんでした :p 僕の言うことは間違いだらけなので信用しないでくださいね。
おそらくこの話から勘違いしたんだと思います。
PHPはブロックごとにスコープがあるわけではないので、ループ中に毎回メモリを解放しない、というのは仕様みたいです。なのでループ中で毎回メモリを確保してたらメモリ使いまくって落ちるって話。それで途中でreturnするとそのまま解放されずにleakするとか考えたのかもしれません。
再帰すると〜、ってのはおそらくオブジェクトの再帰的な参照を作るとメモリリークするって話で、再帰関数を呼び出すとって話ではなさそうです。まあリークはしないまでも、PHPの再帰関数は他言語より効率が悪いらしいですけどね。
※ただ僕はこのときの決定を後悔はしていません。このプログラムはOpenPNEと密接に関連しているため、書けるものならPHPで書くに越したことはないからです。今ではPerlやLispでこれを書き直したいという願望は2%程度です。
なんか自分の基準から外れてるから嫌いって、乱暴な考え方だなぁ。
せっかく若いのに、思考が片寄ってコリコリに凝り固まってて格好悪いどす。
プログラマだったら色々な言語を経験して、良いところ悪いところを認識して、自分でカバー出来るようにしましょうよ。
「嫌い」って言って投げた時点で、もうあなたの脳みそは老人並に劣ってます。
それに何故かとどめを刺したいみたいですが、何を言ってもとどめは刺されないかと。
だって、PHPerはその辺のだらしなさを自覚してますし、逆にそこがお気楽で良いと思って使ってる人が多いですから。
実際にあなた自身がテンプレート以外の目的でPHPを使用しているにも関わらず、「いやいやまだPHPはテンプレート言語だぜ」と盛んにおっしゃってるのも訳分かりませんし(誰かの影響受けてる?)、Javascriptと比べるのも「なんで?」って感じです。
私はPHPはそう簡単には無くならないと思いますね-。何つったって、どのレン鯖でも簡単に使えますから。
wordpressとかpukiwikiとかphpmyadminとかxoopsとか有名なアプリがあって、それらもUPしたらすぐ使えて楽ですもん。
あ、それと今度はCakePHPも使ってやってください。symfonyはYahooが使ったってんで一瞬有名になりましたが、今はこっちが主流なんで。
「やりたいことを正しく書いたのにまともに動かないからむかつく」
っていう事にはすごく同意します。
でも、
>PHPはビジネス面で成功している
>PHPはある種のやっつけ仕事をこなすのには
>ちょうどいい言語であることが多い
この点は、コードを書いてメシを食う上では
言語としての不完全さなんて全然問題にならないほど
非常に重要な長所だと思います。
面白そうだから読んでみましたが、メモリーリーク以外は具体的な説明がありません。
残念です、ぜひ分析を勧めてよいレポートを脱稿してください。
大きなお世話かも知れませんが、気になった点をメモしておきます。
1.プログラム言語として不完全など
・どう不完全なのか全く書いてない(メモリーリークがあるからとかテンプレートだからと
読めなくもないが、それだとプログラム言語と対峙させるには格が違う)
・不完全であれば悪いという点が主観的(不完全なプログラム言語しか無いわけで、
だからアセンブラは今でも必要。と思う人への配慮があればいいのでは)
2.不完全さを醸す
・「醸す」など全般的に既述が定性的すぎるのが残念
・問題点もメモリーリーク位しか書いていない
・この程度であれば、お作法が明文化されていないだけのように私には見える
・ただし、インタプリタがメモリーリークするのはださいですね
*ちなみに私はPHPでちょっとしたプログラムを書いてバグを2カ所発見しました。
テストされていない処理系だなぁという印象は持ちましたが便利だから
それに勝るものはないと思いますね
3.そもそもPHPの使い方がおかしい
・テンプレート言語という解釈は正しい(踏み込んで使わせているOpenPNEがださい。
っていうことにつきるので、ただの勤め先の会社の愚痴のように感じるのが
大変残念)