プログラミング言語がたくさんある理由

2011年4月13日(水)
渡辺 将人

プログラミング言語の実行速度

プログラミング言語の比較をする際に、よく「PHPは遅い」とか「C++は速い」といった速度の話が出てきます。プログラミング言語は同じような処理を書いても、それぞれ実行するのにかかる時間が変わってきます。

特にCやC++は、高速で処理を行えるようにコンパイラが時間をかけて最適化することができるので、処理内容によってはPHPやRubyなどの軽量言語と比べると数十倍の速度で動作することもあります。

各言語の実行速度については、下記のサイトが参考になります。

Computer Language Benchmarks Game

処理内容によって各言語に得手不得手があったり、バージョンやOSによって性能が変化することもあるので、一概に「言語Aは言語Bの10倍の速さで動く」と言うことはできません。ざっくりと「こっちの言語の方が速い場合が多いのだな」という参考値としてご覧ください。

こうした処理速度の違いも、プログラミング言語の使いどころを分ける一因になっています。例えば同じデータ処理をする上でも、数百~数万程度のデータであればPythonやRubyなどの、実行速度はそれほど速くないものの素早く記述できる言語を使った方が効率が良いです。しかし数千万、数億といったデータを処理することになると、C++やJavaなどの高速で動く言語を使わないと、いつまで待っても処理が終わらない状況になることも考えられます。

スクリプト言語とコンパイラ言語

プログラミング言語にはスクリプト言語と呼ばれる部類の言語と、コンパイラ言語と呼ばれる部類の言語があります。一般的に、コンパイラ言語の方が高速で動作する代わりに記述が面倒になります。スクリプト言語は低速で動作するものの短い記述で処理を実現することができます。

プログラムは、人間が書いた命令文を、コンピュータが解釈して実行することで動いています。コンピュータは人間の言葉が理解できません。「機械語」と呼ばれる0と1の羅列を解釈して処理を実行しています。

人間が機械語を理解するのはなかなかに難しいことです。例えばC言語を使って、「hello, world」という文字が出力されるプログラムを書いた場合、こんな記述になります(多くのプログラミング言語の入門書では、まずhello, worldを出力することから始めます。これはプログラミング言語の入門書の原典的な存在である「プログラミング言語C」がそうしていたからです)。

main( ) {
  printf("hello, world\n");
}

mainとかprintfとかhello, worldなど、なんとなく人間にも理解できそうな記述が並んでいますね。プログラミング言語を学ぶと、こうした記述がスラスラ読み書きできるようになります。

このソースコードをコンパイルすると、機械語に変換されたファイルが出力されます。実際にコンパイルされたファイルの中をのぞいてみると、こんな記述になっています。

377   H 203 304  \b 303  \0  \0 001  \0 002  \0  \0  \0  \0  \0
 \0  \0  \0  \0  \0  \0  \0  \0   h   e   l   l   o   ,       w
  o   r   l   d  \0  \0  \0  \0 001 033 003   ;   $  \0  \0  \0
003  \0  \0  \0 334 376 377 377   @  \0  \0  \0 370 376 377 377

※od -cでファイルの一部を出力

はい、何が書いてあるのかさっぱり意味が分かりませんね。極力分かりやすいように、2進数ではなく文字として表せる部分は文字として出力して、hello, worldという言葉が入っている箇所(2行目の真ん中あたりにいますね)を抜き出してみたのですが、それでもよほど詳しい人でないと意味不明な内容になっています。上で提示したC言語のソースコードの方が人間には数倍読みやすそうです。

世の中には機械語で書かれたファイルに手動でパッチをあてる(バグの修正をしたりする)ことができるプログラマもいるそうです。こうした人はハッカーとかウィザードと呼ばれて尊敬を集めています。もちろん筆者はそんなことはできませんし、世の中の大半のプログラマにとっても不可能な芸当です。

コンパイルされたファイルを実行すると、下図のように画面にhello, worldと表示されます。

図4:コンパイルされたファイルでhello, worldを表示させたところ

プログラミング言語はこのように、人間が分かりやすいように記述されたソースコードを機械語に変換することで、コンピュータに任意の命令を実行させています。

この「機械語への翻訳」の仕方には大きく分けて2種類があります。1つはソースコードを事前にコンパイルして、先に機械語に変換しておく「コンパイラ言語」。もう1つはソースコードを逐次機械語に翻訳しながら実行する「スクリプト言語」です。

コンパイラ言語では事前に時間をかけて、効率良く処理が動く機械語に翻訳をすることができるので、スクリプト言語と比べて高速で動く言語が多いです。C、C++、Java、C#などはコンパイラ言語です(※厳密にはJavaやC#は機械語ではなく中間言語に翻訳します)。コンパイルする際にコンパイラがエラーチェックなどを行ってくれるのも、コンパイラ言語のメリットの1つです。

スクリプト言語はコンパイルなどの前処理をしなくても、実行する際にその場でソースコードの翻訳を行ってくれます。実行速度はコンパイラ言語よりも劣る場合が多いですが、ソースコードを書き換えればすぐに結果に反映されるので、手軽に扱うことができます。Python、Perl、PHP、Ruby、JavaScriptなどはスクリプト言語です。

どちらのタイプの方が優れている、ということは特にはありません。どちらも適材適所で使い分けられています。

まとめ

このように、世の中には様々なプログラミング言語が存在し、それぞれに特徴(向き不向き)があります。

次回は各言語の違いがもう少し詳しく分かるように、入門用としてよく取り上げられる言語を個別に取り上げて、その特徴や使いどころについて解説していきます。

フリーランスのプログラマ兼ライター。C、C++、Java、PHP、Perl、Python、Ruby、VB、JavaScript、ActionScriptなど、多数の言語の開発経験を持つ。現在はScalaを用いた大規模データ処理に携わっている。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています