2014-02-19

プログラミング言語をいろんな視点で分類してみた

languages.png

[ PR ]


最近はいろんなタイプのプログラミング言語があるので、全然知らない言語もあるんじゃないでしょうか。

そんなときは、大局的に見るとよくわかると思うので、いくつかの視点で分類してみました。

人気ランキング

pg_ranking_graph_2013.jpg

上記はTIOBEが毎年公開するランキングの推移ですが、特徴としては、

  • Javaが徐々に衰退
  • Objective-Cの人気が急上昇
  • C++の人気が徐々に衰退
  • 一方でC言語の人気は横ばい
  • スクリプト言語の人気が徐々に上昇

という傾向が見られます。

2012年にJavaが2位に下落したということが、時代を表しているように感じますね。

Objective-C人気はiPhoneの登場と共に上昇していますが、今後はどうなるのか注目です。

動的型付けと静的型付け

動的型付け静的型付けは、

  • 動的型付け: 実行時に型が決定される型システム
  • 静的型付け: コンパイル時に型が決定される型システム

のことです。また、型の強さ・弱さ(安全性)という指標もあり、

  • 弱い型とは、'a' + 1 (= 'a1') のような比較的緩やかな型の扱いが行われるシステム
  • 強い型とは、1 + 1 と 1.0 .+ 1.0のように、違う型同士の演算や変換に厳密な型システム

のことです。例えばJavaScriptは「弱い動的型付け」、Javaは「強い静的型付け」に分類されます。

これらの性質が言語の大きな方針を決めると言っても過言ではありません。

strongweakstaticdynamic_type.png

この表から読み取れることは、

  • スクリプト言語は動的型付けであるものが多い
  • 静的型付けの言語には、動作が高速なものが多い
  • 強い型弱い型かは、言語によって違う
  • JVMや.NETで動く言語は強い型のものが多い

ということがわかります。

ちなみに、以下の図は動的型付けと静的型付け言語の利用率のグラフです。

これを見ると徐々に動的型付け言語が使われる傾向にあるということが分かります。

スクリプト言語は生産性が高いといわれているため、徐々に採用する企業が増えているためと思われます。

パラダイム

パラダイムとはプログラミング言語が採用する考え方や概念の種類を表します。

大まかには以下の2つに分類できます。

  • 手続き型言語: 時系列にそって1行1行実行(逐次実行)していく言語
  • 宣言型言語: 構造や概念および性質を記述し、その処理具体的な処理はシステムに委ねる言語

例えば、C言語やJavaScriptは手続き型言語、SQLやLispは宣言型言語と呼ばれます。

具体的にはさらに分類され、以下のような派生をたどっています。

ppp.png

英語なので分かりづらいかと思いますが、右半分が手続き型言語からの派生、左半分が宣言型言語からの派生です。

ちょっと「うーんこれは・・・」と思うようなものもありますが、例えば、

  • オブジェクト指向プログラミングは手続き型言語から派生
  • プロトタイプベース言語(JavaScriptなど)はオブジェクト指向の一種
  • 第一級関数を持つ言語(JavaScriptなど)は宣言型言語から派生
  • 関数型言語は宣言型言語の一種
  • 論理型言語は宣言型言語の一種
  • データフロー型言語は宣言型言語の一種

という分類・歴史をたどっています。

こう考えると、JavaScriptやC#は様々な言語から影響を受けているということがわかりますね。

ちなみに、宣言型言語でありながら手続き型言語という言語も最近は増えています(Scala、OCamlなど)。

なお、派生という言い方はあまりふさわしくないかもしれないので、そういう分類だと思ってもらえればいいと思います。

仮想マシンとネイティブコンパイル

必ず触れておかないといけないのが、仮想マシンガベージコレクションです。

JavaやRubyを使っている方はご存知だと思いますが、仮想マシンで動くプログラミング言語は、

  • コードをほとんど変えずに別のマシンで動く
  • メモリ管理を気にしなくて良い
  • メモリ関係でクラッシュする可能性が少なく、他のプロセスに影響を与えない
  • ただしメモリ使用量が大きい(富豪的プログラミング

という特徴があります。逆にネイティブコンパイルされる言語は、

  • 非常に高速で動く
  • メモリを手動で管理できるため、組み込み分野などでも使える
  • コンピュータ毎にコンパイルし直す必要があるため、ソースコードも配布されることが多い

という特徴があります。

以下に表を作ってみました。

pg_vm_native.png

この表を見ると、関数型言語は仮想マシンが必須であることがわかります。

ただし、ネイティブコンパイルできる言語も多いので、実際のところは様々ですが、メモリ管理を自動化している点は仮想マシンと同様です。

これは宣言型言語の大きな特徴で、メモリ管理が手動でできるというのは、手続き型が有利な点でもあります。

実行速度

実行速度はプログラミング言語だけでなく、コンパイラや実装によっても変わってきます。

それがわかるグラフが以下です。

特にJavaScriptとPython、Rubyは実装の差が顕著ですね。

関数型言語は以下のグラフで比較されています。

OCamlがずば抜けて高速ですね。C言語にも匹敵する勢いです。

続いてErlang、Haskellと続きますが、いずれもスクリプト言語より高速です。

なお、OCamlはocamlcとocamloptで、Haskellはオプションで速度が全く異なるので気をつけてください。

メモリ使用量

最後に、メモリ使用量を比較してみます。

pg_memory.png

Javaはこの図ではgcj版でOracle版とは違いますが、それでもメモリ使用量はダントツで大きいです。

続いてJavaScript、PHP、Lua、Ruby、Pythonと続きます。

やはりスクリプト言語はメモリ使用量は大きい傾向にありますね。

この図には.NETが載っていませんが、おそらくメモリ使用量はJava並だと思います。

まとめ

こうやってトップダウン式にプログラミング言語を分類すると、それぞれの特性が見えてきます。

もちろん性能だけではなくて、人気も大きく左右するので、今後も動向を見守っていきたいですね。

パーフェクトRuby (PERFECT SERIES 6)
Rubyサポーターズ すがわら まさのり 寺田 玄太郎 三村 益隆 近藤 宇智朗 橋立 友宏 関口 亮一
技術評論社
売り上げランキング: 5,842

コメントはTwitterアカウントにお願いします。

RECENT POSTS


[ PR ]

.