The Rational Edgeより:本稿は、今日使われている中で最も人気の高い3つのプログラミング言語について解説する。ダイナミック言語のPerl、Python、そしてRubyだ。これらが利用されている理由は何か? どのような共通点があり、それぞれどこがユニークなのだろうか?
プログラミング手法は、われわれの多くがソフトウェア開発業界に足を踏み入れたときから大きな変化を遂げてきた。開発ツールだけでなく、複雑な問題に対するソリューションを明示するために利用する言語も変化した。
今日、ソフトウェアの開発を仕事にする人々は複数の言語を駆使する。通常、彼らには必ず複数のプログラミング言語でアプリケーションを開発した経験がある。多くのアプリケーションを実装するに当たり、「ダイナミック言語」と呼ばれるクラスの言語が優先的に選ばれるようになった過程が興味深いので、ここでそれを見ていこう。
本稿はこのタイプの言語について、なぜ人気が高いのかを考え、これらのうちPerl、Python、そしてRubyを中心に、主な仕様や各言語の違いをいくつか理解できるよう見ていく。
技術的には、実行時に機能の修正が可能なものをダイナミック言語という。どういうことかというと、この機能を提示した最初期の言語の1つであるLISPを考えればよい。LISPの主な仕様の1つが、命令をデータとして扱えるものだ。LISPのプログラムは、テキストファイルからLISPの命令文を読み出し、それらがオリジナルのプログラムの一部であったかのように実行する。プログラムは新しい式をメモリ内で作成し、これらをその場で実行することもできる。例えば、PerlのプログラムはPerlのコードが含まれたテキストファイルを読み込むことができる。そして、オリジナルのプログラムの一部としてプログラマが書いたかのように、ファイルの中のコードを実行することができる。LISPは関数型プログラミング言語の1つだが、それがダイナミック言語に必要な条件ではない。オブジェクト指向や命令型といったほかのプログラミング言語パラダイムを採用する多くの言語もダイナミック言語だ。
ダイナミック言語は、プログラムをかなりコンパクトに書ける高度な構成になっている場合が多い。つまり、プログラマーは非常に複雑で巧妙なプログラムを開発するために大量のソースコードを書く必要がない。[注1]
多くの人は、実際にはダイナミック言語であるにもかかわらず、スクリプティング言語という言葉を使う。ダイナミック言語の多くが、具体的な目的のために素早く書ける中小規模のスクリプトを書くために使われるのがその理由だ。だが現在は、これらの言語が複雑な本番システムの開発に使われることが多くなってきた。
Tiobe Softwareでは、プログラミング言語に関する指標を毎月公表している。[注2]これらの指標からは、複数の要因に基づいたプログラミング言語の流行が見えてくる。この指標は最も人気の高いものではなく、実際は、ソフトウェアを書くために最も頻繁に利用される言語を示している。だが、そこから各言語に対するソフトウェア開発コミュニティーの関心度が多少見えてくるのだ。[注3]
2007年6月の指標では、上位10種類の中にダイナミック言語が5種類ランクインした。これは多くの読者にとって驚きかもしれない。その5つの言語とは、PHP、Perl、Python、JavaScript、そしてRubyだ。これらの言語はいずれも異なる目標を掲げて登場してきた。そして、時間をかけて実証されてきた多くの優れた概念のようにこれらの言語も拡張を遂げ、多くのほかの目標に対応するようになった。実際、ダイナミック言語が適している多くのアプリケーションでは、相違点より類似点の方が重視される。Java、C、C++、そして(Visual)Basicという、Tiobeの指標にある上位4つの言語を見た場合、直面している具体的な問題に応じて選択の是非を判断するには、それにふさわしい理由がある。しかし、ダイナミック言語の多くでは同じことが当てはまらなくなる。選択は個人的な嗜好(しこう)や、組織内の既存アプリケーションですでに利用されているなど、言語の利用要件によることが多い。
本稿の残りの部分では、これらのうち3つの言語に共通する仕様について説明し、個々のユニークな仕様についても解説する。Perl、Python、そしてRubyを選んだ理由は、簡単にいうと、いずれも筆者が個人的にコードを書いた経験があるためだ。1990年代はPerlで大量のコードを書き、近年はRubyでかなり書いている。Pythonを選んだのは、Perlのように歴史が長く、Perlで人気を得てRubyにも搭載されるようになったと思われる仕様をいくつか搭載するなど、これら2つを補完するからだ。
これらの3つの言語を徹底的に説明するつもりはなく、各言語の感触だけつかんでいただければと思っている。うまくいけば、これらの言語の詳細や、これらがどのように問題解決を楽にしてくれるかをもっと学びたくなることだろう。
では本題に移ろう。
言語設計のクラスで1つ学ぶのが、どの言語も目的を持って設計せよということだ。「面白半分で」新しい言語を開発する人も見たことはあるが、言語デザイナーの大半は、動機があってこれらを開発している。
言語デザイナーが新しい言語を開発するときにありがちな動機は以下の3つだ。
1つ目の動機は、既存の言語で特定の問題を解決できないこと。技術の変化や、基本的な計算処理手法およびパラダイムの進化により、われわれは常に新しい課題に直面している。言語は、これらの課題に効果的に対応するために進化する必要がある。既存の言語でサポートできない新しいものが出てくると、プログラマーは新しい技術や手法によってこれらの問題を解決すべく新しい手法を探し求め、新しい言語の開発に頼ることも多い。その好例がSmalltalkの開発だ。Smalltalkは、ビットマップ画面上でのグラフィカルアプリケーション開発のための豊富な機能を提供するだけでなく、オブジェクト指向パラダイムをサポートする目的でも設計された。
新しい言語を開発する際に一般的な動機の2つ目は、既存の言語が陳腐化し、肥大化し過ぎたというものだ。プログラマーは「コードがにおう」という言葉を使う。これは、魚が腐るように、コードもだんだんにおい始めることを意味する。われわれは、リファクタリングテクニックやデザインパターンなどの各種計算手法を使ってコードがにおう部分をアプリケーションから削除する。言語にも同様の幣害がある。言語は、新しい技術やパラダイムに対処する新機能が追加されて徐々に進化する。新機能がその言語のほかの部分とあまり「合わない」場合、その言語はにおい始める。そして、ある時点になると頭の良いプログラマーが出てきて、その言語は新しいものと交換する時期が来ているとする判断を下す(Perlは、陳腐化しつつある言語に取って代わったわけではないが、sedやawkなどの複数の言語の機能と、Cスタイルの多数の式やshellスクリプトを組み合わせている)。
新しい言語を開発する理由の3つ目は最も説得力に欠ける。自分にできるから開発する、というものだ。そして、このような言語は各自のユニークな世界観とプログラム開発手法を反映している。これは知的価値のある目標だが、通常はこれで言語本体の利便性が高まることはない。このカテゴリに分類される言語は、その大半が日の目を見ることはない。しかし、本稿で詳しく解説するRubyの発端は、この動機によって多少の説明が付く。
ここで検討している3つの言語の目的はそれぞれ何なのだろうか?[注4]まず、Perlは3つの中で最も古く、1987年に登場している。Perlを生み出したLarry Wall氏は、UNISYSのプログラマーだった。同氏はCで書かれたプログラムと一緒にUNIX用プログラムのsed、awk、そしてshなどの言語を使ってさまざまな作業をこなしていた。同氏は言語をあれこれ取り換えることにいら立ち、これらの言語がしていたことに加え、それ以上のこともできる1つの言語を開発することにした。そこには、プログラマーにとっては難問解決に最も効果的でありながら、簡単なことが簡単にできる言語にするという理念があった。Perlが最初に利用された作業の多くはテキスト処理やシステム運用関連だった。
PerlはWeb アプリケーション用のCGIスクリプトを書く際に最も好まれる言語になっていき、ネットワークアプリケーションやデータベースを扱うプログラマーの熱心な支持を得た。最新バージョンのPerlはオブジェクトやクロージャをはじめとする多くの高度な言語コンセプトをサポートしている。この進化により、(筆者の私見として)1つのプログラミングシステムとしてはきれいにまとまらない、かなり大規模な言語が誕生した(もちろん、Perlファンにはこの意見に異論もあるだろう)。
Pythonは、Perlの2年後に登場した。これを開発したGuido van Rossum氏は、Perlと同じように、簡単な作業が簡単にできるのに難しい作業もサポートできる、という言語を望んでいた。しかしvan Rossum氏は、言語の速度や表現力よりも読みやすさとオブジェクト指向の方を選んだ。Pythonがほかの多くのダイナミック言語より遅いことはないが、van Rossum氏は読みやすさと分かりやすさをPythonプログラム最大の特性にしたかった。読みやすさを強化するPythonの特長の1つが、コードは矛盾のないよう字下げするという要件だ。例えば、下記のコードにある次の2つの例は異なるものだ。
if x == y : if x == y : print 'hello' print 'hello' print 'world' print 'world'
ここでは、x=yの場合はどちらの例も1行目に「hello」、そして2行目に「world」をプリントする。一方、もしx=yでない場合は、最初の例は何もプリントせず、2番目は「world」の1行をプリントする。この「仕様」はミスを招きやすいというのが筆者の見解であり、これがPythonを使ってあまりプログラミングをしない大きな理由の1つだ。
Pythonはこれまでに進化を遂げ、ネットワーク、マルチメディア、データベース、そしてシステムプログラミングアプリケーションに従事する多くの開発者に真っ先に選ばれる言語になった。Pythonはまた、コンポーネント同士をつなぐ役割を果たす優れた言語でもある。Perl同様、PythonもCなどのほかの言語とのやりとりが可能になっている。van Rossum氏は現在Googleに在籍しており、そこで、Googleが関心を持つ応用分野での利便性強化に向け、Pythonの開発を継続している。
Rubyはここで解説している3つの中でも最も後から登場してきた。これを開発したのは「まつもとゆきひろ」氏(松本行弘、Matz)で、1993年に同言語の開発を開始し、1995年にこれをリリースした。[注5]ある意味、Rubyは前述の3つ目の動機からそのスタートを切っている。つまり、まつもと氏には以前から言語をデザインしたいという願望があったのだ。同氏はPerlやPythonに関する知識も豊富だが、自分が「Perlより強力で、Pythonよりオブジェクト指向の強い」と感じる言語が欲しいと考えていた。同氏はRubyについても、これをプログラミングをやさしく楽しくする言語にしたい、と話していた。だが同氏以外は、Rubyは予想どおりの動きをする、という意見だった。使いたいコマンドの適切な文法は、通常は推測することができる。これは、「驚き最小の法則」と呼ばれている。
Rubyは純粋なオブジェクト指向言語だ。これは、Rubyではすべてのものがオブジェクトだ、という意味だ。20年以上たってしまったが、筆者はいまになって、Smalltalkのプログラミングコミュニティーがあれだけこの言語に熱中していた理由が分かるようになった。筆者はこれまで、Smalltalkを本当に理解することはできなかった。それは、その文法が(筆者にとって)かなり謎めいていたからだ。しかし、RubyもSmalltalkのようにいずれは消える運命にある。だが、筆者もいまは「分かる」ようになり、楽しいと感じている。
Rubyは多くの人々にとって、手早くスクリプトを書くための言語としてPerlやPythonに取って代わった。しかし最近になると、Rubyは完成度の高いアプリケーションの実装に利用されるようになり、Webベースのアプリケーション開発で真っ先に選ばれる言語として、「Rails」Webアプリケーションフレームワークと一緒に多くの組織に採用されている。[注6]
Copyright © ITmedia, Inc. All Rights Reserved.