今更ながら、比較というか、意見を述べる。ただの自己満足と私的見解。
誕生の歴史的経緯
それぞれの言語が作られた経緯と目的を知ることは、その言語を使う意味で重要であると思う。
Perl前の時代
Perl前の時代、世の中にはC言語のようなコンパイル言語しかなく、コンパイルせずに処理ができるのはシェルやsedやawkぐらいしかなかった。ちょっとしたテキストを自動的に処理したいが、C言語とかで本格的に作成するような物ではないとき、人はみんな、シェルスクリプトとしてUNIXのコマンドを並び立てて処理していた。sortやtestなどの便利なコマンドがUNIXには用意されていたし、ちょっと複雑な処理でもsedやawkを駆使しして、何とかできていた。
しかし、シェルと言ってもBourne Shell系とC Shell系の二つがあったり、同じUNIXコマンドでもOSによってオプションが異なるなど、移植性が低くかったり、そもそも、コマンド実行の連続であるため、処理が重いという欠点があった。
テキスト処理最強のスクリプト言語 - Perl 登場 -
そんな中、シェルスクリプトの不満を解決するために誕生したのがPerlであった。シェルやsed、awkの機能を内包し、テキスト処理に必要な各関数に加え、強力な正規表現が実装されていた。テキスト処理においてはシェルによるコマンドの組み合わせよりもはるかに強力で、高速な処理ができるようになった。また、同じPerlなら同じように動くという移植性の高さもあり、みんなPerlを使うようになった。
そして、インターネットが一般に広がり、多くの人がWebサイトを作るような時代になった。静的なHTMLだけでは無く、カウンタや掲示板と言った動的ページ(CGI)も置きたくなる人が増えた。そんなときに、CGIを実装する選択肢としてPerlは妥当であった。スクリプト言語なので、置いただけで使えるという点、正規表現などの強力なテキスト処理が可能(CGIでHTML吐き出しは突き詰めればテキスト処理)、UNIX/Linuxでは標準でインストールされるためサポートや提供が楽と言うこともあり、CGIといえばPerlという時代があった。
こうして、Perlは大人気となり、一時代を築くのだが、大きく三つの問題があった。
- 「やり方は一つではない」のモットーもあり、書く人のレベルによって質がバラバラになりやすい。コードが継ぎ接ぎだらけとなり、保守性が下がる傾向がある。
- CGI用に作られた言語ではないため、CGIを実装するには多くのprint文が入るなど冗長な表現が多くなる。
- 元々オブジェクト指向でなかったため、後付けのオブジェクト指向が綺麗とは言いがたい。
誰でも同じコードになればいいという発想 - Python 登場 -
やり方を一つにしてしまえば、アルゴリズムの書き方は誰でも同じになるため、コードが綺麗になり、読みやすくなる。そして、保守性も上がる。という逆転の発想の元に作られたのがPythonである。インデントをブロックにするという他の言語にはあまり見られないスタイルを用いることもあり、読みやすさは群を抜いている。行儀がよいプログラミングをするには至高の言語になった。
Webに特化すればいいという発想 - PHP 登場 -
コードでHTMLを作るのでは無く、HTMLの中にコードを埋め込めば、冗長なprint文も不要になるという発想で作られたのがPHPである。また、mod_phpというApacheモジュールも一緒にコンパイル、インストールすることで、CGI特有のプロセス起動の遅さを解消することもできた。ちょっとしたWeb動的ページを作るには最適な言語になった。
純粋なオブジェクト指向言語が使いたいという願望 - Ruby 登場 -
はじめから純粋なオブジェクト指向言語として設計して作られたのがRubyである。Perlは言うまでも無く、Pythonもオブジェクト指向は後付けであったため、オブジェクト指向としてみた言語仕様には不満があった(PHPもオブジェクト指向は後付け)。Rubyははじめから全てをオブジェクトにした本格的なオブジェクト指向言語であるため、オブジェクト指向プログラミングをするときにとても素直に書ける言語になった。
そして現代
Perlは歴史が古く、一日の長もあり、ライブラリの数、参考になるコードの数、日本語の情報サイトや書籍の数、OS標準が用意されているかどうかなどで、当初は他よりも優位であった。しかし、現代においては、他の言語についても必要なライブラリは全て揃っているし、参考になるコードは多くあるし、日本語の情報サイトや書籍も多く、Linuxでパッケージがそれぞれ用意されていることはもちろんのこと、最新のMac OS Xでは四つの言語全てが最初からインストールされている。つまり、環境面での差異は完全に無くなったと言える。
そんな時代になったからこそ、それぞれの目的にあった選択をすることが一番であろう。古くからのコードを生かしたいならPerlのままでいいし、保守性を重視したいならPythonを採用すればいいし、ちょっとしたWeb動的ページならPHPが最適だし、オブジェクト指向で素直に書きたいならRubyを使えばいいのだ。
で、終わってはつまらないので、視点を未来に向ける。
言語の未来
Perl - 緩やかな衰退と6への希望 -
現行のPerl5は既に枯れていると言えている。それは、それ以上発展しないという悪い意味では無く、安定しているという意味だ。Perl5である限り、今書いたコードは将来も動くだろうし、10年前書いたコードも問題なく動いたりする。
しかし、将来的にはPerl6がリリースされる予定である。Perl6は後方互換を切り捨て、全く別の言語であるとまで言われている。別言語としてPerl6は受け入れられる可能性があるが、Perl5の次期バージョンとしては捉えられない可能性が高い。しかし、Perl5のままではいいとこ取りをした後継の言語に居場所を取られていくのは確かである。このまま緩やかな衰退を続けるか、Perl6となって新たに生まれ変わるのか、そして、それはPerlと呼んでもいいのか?見えない未来が続いている。
Python - いつまでも2のまま -
現行のPythonはPython2とPython3が保守されている。Python2とPython3は互換性が無い部分が有り、書き換えがほぼ必須になっている。移行用のツールも多数用意されているが、進んでいるようには見えない。なぜなら、OSの多くが未だにPython2を採用しているからである。Pythonで作られたOSの基盤をなす補助ツールが多く存在する。そして、それはPython2で作られている。Python3に変更するには書き換えが必要であり、現在安定して動作しているものを一から確認する必要がある。それよりは現在動いているPython2で動かし続けた方がいい。結局OS標準で搭載するPythonはPython2のままになり、それにあわせて作られるツールはPython2になってしまう。そう、いつまでたってもPython3に移行することが無くなってしまうのである。
これは、PythonがPython2で成功してしまったが故の皮肉かもしれない。言語的にはPython3の方がとてもすっきりしていていいのであるが、はたしてPython3が主流になる日が来るのであろうか?
PHP - バージョン番号は気にしない -
PHPの互換性の切り捨ては有名かもしれない。通常、言語の互換性切り捨てはメジャーバージョンでおきる。Perlは5->6で大きく変わるし、Pythonは2->3でいくつか切り捨てている。Rubyも1.8->1.9(1.9はもともと2.0の開発バージョンという位置づけだった)で互換性をいくつか切り捨てている。しかし、PHPはマイナーバージョンで切り捨てる。一応最初は非推奨扱いにするが、次のバージョンではエラーになる。つまり、マイナーバージョンが二つ変わるだけで動かないコードが山ほど出てくるのだ。そして、PHPは二つのマイナーバージョンまでしかサポートしない。開発者は古いコードをいつまでもメンテナンスし続けないと、脆弱性が残っているバージョンでしか動かないようになってしまう。
そして、PHP5の次はPHP7という分けわからないことになっている。このようにPHPの開発指針は色々と批判されまくっている。君が書いたPHPはたぶん、数年すると確実に動かなくなる。いつまでも保守しつづけるしかない、ジレンマが続く。
Ruby - 結局流行ってない? -
Rubyも1.8->1.9でいくつかの互換性切り捨てがあったが、そもそもそんなに使ってないということもあり、最新のOSでは1.9以降を採用するようになってきた(1.8を既にサポートしていないというのもあるが)。1.9以降はほぼ互換性は維持されているので、他の言語のような互換性の心配も無い。
しかし、Rubyって結局どれだけの人が使っているのだろうか?Ruby on Railsで一躍有名にはなったが、似たようなフレームワークがどんどん出てきたため、Railsがあるという利点は失われつつある。簡易なWebアプリではPHPにかなわないし、可読性や保守性ではPythonにもかなわない。以前のように遅いとか、環境が少ない、ライブラリが少ないと言った欠点は無くなったけど、他の言語には無い利点ができたわけでは無い。結局オブジェクト指向好きが細く長く使っていくような感じになるような気がする。
JavaScript - Webとの統合を夢見て -
最後に、ここにきて、JavaScriptがただのWeb用言語を越えて使われるようになってきている。サーバサイドのnode.jsという存在もあり、Perlとそこから派生していったPython、PHP、Rubyの牙城を将来崩すかもしれない。しかし、JavaScript自体の言語仕様が駄目すぎて、そのままでは使い物にならない。Alt JSといわれるJavaScriptへコンパイルする言語や次のECMAScript6がどのように発展していくのか、そして、それらはかつてのPerlを越えるのか?未来はまだ未確定のままである。