有名なプログラミング言語はなぜ人気があるのか

é¢é£ç»å

こんにちは、Taikiです。

前回は、プログラミング発展の経緯とその発展を支えた要因について、考察しました。

vtaiki.hatenablog.com

今回は有名なプログラミング言語(以下言語)はなぜ人気があるのか、を考察します。

言語の良し悪しを決めるポイント

まずは言語の人気ランキングをみてみましょう。

 

  1. Java
  2. C
  3. Python
  4. C++
  5. C#
  6. Visual Basic .NET
  7. JavaScript
  8. PHP
  9. SQL
  10. Objective-C

出典:マイナビニュース

いかがでしょうか。上位の言語はよく目につきますね。なぜ人気があるのでしょうか。5つのポイントにわけて、その理由を説明したいと思います。

  • 速い
  • 移植性
  • 簡単さ
  • 高機能
  • 安全性

 速い

なぜ人気があるのか。一番分かりやすい理由は速いからです。その速さはどうやって決まるのでしょうか。それは機械語にどう訳すかです。訳し方は、スクリプト言語コンパイル言語に分かれます。

スクリプト言語

ソースコードを逐次機械語に翻訳しながら実行するため、比較的低速で動作しますが、短い記述で処理を実現できます。
例:PythonPerlPHPRubyJavaScript

コンパイル言語

ソースコードを事前にコンパイルして、先に機械語に変換するため、 高速で動作しますが、記述が困難です。
例:C、C++JavaC#

コンパイル言語の中でも、C/C++は特に速いです。その秘密はインラインアセンブラです。Wikiの言葉を借りると、インラインアセンブラとは、ソースコード中(インライン)にアセンブリ言語によるコードを埋込むことができる、という機能です。アセンブリ言語は、限りなく機械語に近い言語、そのため、機械が解読しやすく処理が速くなります。

実用例ですが、C/C++は機械製品によく使われますが、何故でしょうか。

機械製品は直ぐに反応しないと問題があるため、処理の速い言語が良いです。例えば暑い日にエアコンの反応が遅いとイライラしませんか。それはまだ許せますが、工場の機械だとどうでしょう。反応が遅ければ生産性にも関わります。事故に関わるかもしれません。

機械製品に使われるもう1つの理由は、搭載されているメモリ量が小さい点です

機械は大きさに制限があるため、PCと比べ搭載できるメモリ量も限られてしまいます。しかしC/C++だと最小限の実行ファイルにソースを収めることができます。なぜでしょうか。その理由を引用します。

C言語は、アセンブラレベルと同等の処理を簡潔に記述でき、またJavaなどに代表される他の高級言語にあるような暗黙のコード生成やバックグラウンドで動く処理が無い。プログラマが意図したコードだけがコンパイラで生成されるため、実行ファイルが肥大化してしまうことも無く生成コードに無駄がなくコンパクト、かつ処理速度も高速である。そのため、特にハードウェアを操作するファームウェアや、スループットを保証する必要があるリアルタイム処理、プログラムサイズをコンパクトに収める必要がある小型MCUのソフトウェア開発に向いている。

出典:富士ソフト

つまり、C/C++は、他の言語と比べ、書かれている以外のことはしないので、その分ファイルのサイズを抑えることができます。

移植性

移植性とは、同じソースを別のブラウザやOSで実行したときに同じように動作するかという意味です。クラウドマルチプラットフォームが主流の今、移植性はとても重要です。

JavaScript

それでは移植性の高い言語は何でしょうか。

スクリプト言語の中ではJavaScriptです。この言語はフロントエンドで実行されます。フロントエンドとは、実行環境がInternet ExplorerChromeなどのブラウザに依存することです。JavaScriptはどのブラウザにも最初からインストールされているため、ブラウザを選ばず実行することができます。

なぜ最初からインストール済みなのでしょうか。JavaScriptの歴史は古く今日に至るまで、セキュリティが問題視されたり、ブラウザ毎で動作が異なるなど課題が山積していました。

しかし、同言語の標準化団体ができ、JavaScriptはセキュリティが向上し、どのブラウザでも同じように動作できるようになりました。その上、MicrosoftGoogleがそのエンジン開発に多くの投資をしたため、異なるブラウザでも快適に動作するようになりました。今では、スマートフォンタブレット、PC、ゲーム機などWEBブラウザが搭載されているデバイスでは、当たり前のようにJavaScriptが動作します。

C/C++

コンパイル語のC/C++の移植性はどうでしょうか。

低水準言語を使う分、どうしてもハードウェア依存などの制約が強くなるため、他への移植が難しくなります。こういった融通の利かなさをみると、C/C++は職人気質の尖ったイメージに映ります。

Java

Javaはどうでしょうか。

Javaコンパイル語ですが、その違いは中間コードにコンパイルできる点です。通常は各OSに合わせてソースコードを用意しますが、Javaだとこの中間コード1つで各OSに適応した機械語に変換できます。詳しい説明を引用します。

Javaは移植性を高める中間コードを採用しています。これは、Javaが多くの端末で動作する理由でもあります。そしてJavaコンパイラ言語です。Javaのプログラムは、中間コード(Javaバイトコード)にコンパイル(変換)されます。その中間コードは、各プラットフォームに依存することのない中間形式です。Java仮想マシン上で中間コードが実行されます。そのため、Javaは開発環境と実行環境を切り分けることができます。つまり、いろいろなプラットフォームに対して、フル機能のJavaを用意する必要はなく、携帯端末などメモリなど資源の限られた端末には、中間コードを実行する仮想マシンを用意するだけでよいのです。移植が簡単で、多くの環境で動かすことができます。この中間言語の仕組みは、利点が多く、Java以後、C#など他のプログラミング言語でも積極的に採用されています。

出典:マイナビ

この中間コードの利点は、All in Oneです。1つのソースでどのOSでも動作します。そして、中間コードはソースコードよりも機械語に近いため、処理もより高速になります。

簡単さ

ソースコードの書きやすさや書きやすくするための仕組みも人気がでる理由の1つです。ポイントはこちらの3点になります。

その言語の文法が簡単なこと

簡単な言語といえば、PHPを思い浮かべる人もいるのではないでしょうか。

PHPは文法が簡単な上、制約も少ない自由度の高い言語です。動的型付けに見られるよう、少し適当に書いてもPHP側が良いように解釈してくれることが多々あります。

しかし、その解釈の分だけ、ランタイムのオーバーヘッドが高まり処理の足かせになることもあります。更に、適当に書いた分だけ、PHPの暗黙の処理が走るため、全体の整合性が取れなくなります。

フレームワークが優秀なこと

WEBアプリ作成で欠かせないものがフレームワークです。

フレームワークはプログラム作成の開発効率を高めるツールです。

なぜ開発効率を高めることができるのか、Ruby on RailsというオープンソースのWEBアプリケーションフレームワークを例に説明します。

Railsは、MVCアーキテクチャという設計概念に基づき、処理を受け渡しをする要素、データの参照や更新を行う要素、ユーザーに結果を返す要素があります。通常はこの3要素を結べ付ける設定が必要です。しかし、Railsには、CoC(Convention over Configuration)という設計思想があり設定よりも規約を重視します。

例えば、ある命名規則に従えば、クラスやデータベースなどオブジェクト同士を自動で結び付けてくれます。その結果、間を繋ぐ設定が不要になり手作業が少なくなります。他にもDRYやRESTなど色々なギミックがありますが、ここでは割愛します。

クラウドで管理ができる

ソースをクラウド管理ができると時間や場所に拘束されない、より自由な環境でプログラムを書くことができます。中でもWEBサービスやWEBアプリの開発はクラウドと相性が非常に良いです。テレワークもしやすい仕事です。

例えば、GitHubのようなプラットフォームを使えば、クラウド上で進捗管理やソースのバージョン管理ができ、プログラムのリリースまでを完結できます。GitHub上で人気のある言語は、やはりJavaScriptJavaPythonPHPRubyあたりのWeb系です。

対して、C/C++でみるような機械製品の組み込み系やパッケージ商品、基幹システムなどクローズドな開発はまだオンプレが多いのではないでしょうか。

高機能

機能が十分に備わっていれば開発も捗ります。多くのメンバーで開発するときは特にそうです。その機能を提供してくれるものが、統合開発環境IDE)とライブラリです。

統合開発環境IDE

プログラム作成に必要な機能はこちらです。

  • テキストエディタ(プログラム記述)
  • デバッガ(バグの検出)
  • ビルド(プログラムを実行可能な状態に変換する)
  • ソースコードのバージョン管理
  • ファイルの構成管理

これら機能を1つの固まりにしたものが、統合開発環境IDE)です。IDEを使うと、仕様やルールの統制が取れやすくなるため、規模の大きいプロジェクトではでよく利用されます。Gitと連携すると、ソースコードのバージョン管理やファイルの構成管理も簡単になります。

これだけ高機能でありながらIDEは無償で提供されています。なぜでしょうか。

提供元はGoogleAppleMicrosoftなど大手です。彼らは、拡販のため、自社製OSに乗せるアプリ開発を支援すべく高機能なIDEを無償で提供しています。

主なIDEはこちらになります。

ライブラリ

ライブラリとは関数の集合体であり、関数とは一連の処理をモジュール化したものです。このライブラリが豊富にあると開発の幅が広がり新しいプログラムも作成しやすくなります。特に、Pythonの場合だと第三者によるライブラリが豊富にあるため、時間を大幅に削減する事ができます。

Pythonは昨今のAIブームで特に注目されています。その人気の理由は、機械学習ディープラーニングで必要とされる科学技術計算や統計のライブラリがPythonには元々多く用意されているためです。そして、もう1つの理由はAIブームでPythonの魅力が再認識され多方面で使われる機会が増えたからです。

ではPythonの魅力とは何でしょうか。Pythonは文法が単純なため、書きやすく可読性が高い上、クロスプラットフォームで動作し、処理速度をみても強力な言語です。そして、先にあげたようにライブラリも多数用意されています。

今では、WEBアプリ、デスクトップアプリ、自動化、科学技術計算、統計など幅広い分野で使われ、Googleも主要言語に採用しています。

安全性

まずは安全性が低い順のランキングをみてみましょう。最も低いとされているのが、なんと人気の高いC言語ですね。

 

  1. C言語 
  2. PHP
  3. Java
  4. JavaScript
  5. Python

出典:マイナビ

安全性の低い言語とは何でしょうか。

それは脆弱性が多い言語といえます。それでは脆弱性はどうやって引き起こされるのでしょうか。脆弱性には2つのタイプがあります。攻撃者によってセキュリティホールが発見されてしまうパターンと開発者が意図しないバグを作りこんでしまうパターンです。こでは、前者の例として安全性が低いランキング2位のPHPをあげ、後者の例として1位のC言語をあげます。

PHPで見る脆弱性の一例

まずはPHP脆弱性の報告事例です。

PHP」に脆弱性「CVE-2018-17082」が見つかった問題で、同脆弱性によりウェブサーバのキャッシュへサイト運営者が意図しないスクリプトが埋め込まれるなど、攻撃者によって悪用される可能性があるとしてセキュリティ専門家が注意を呼びかけている。

この例に限らず、PHPのセキュリティは甘いという指摘は以前からありました。PHPのバージョンが今も変わり続ける理由もセキュリティが関係しています。

PHPの起源を辿ると、ラードフという開発者が動的なWebページを作成するために個人的な用途で開発したことがその始まりです。

こういった経緯もあり、PHPは書きやすさ重視で作られています。CやPerl, Javaなどの言語に強く影響を受け、これらの言語から関数を直輸入し親和性が欠如した結果、各所にほころびができ、セキュリティ上深刻な問題が起きたこともありました。歴史的な経緯をみるとその根深さが分かります。

C言語でみる脆弱性の一例

次に、C言語脆弱性です。

MSRCによれば、「CVE(共通脆弱性識別子)」を割り当てられ、Microsoftが修正してきた同社ソフトウェアのセキュリティ脆弱(ぜいじゃく)性の大部分は1つの要因から起こっている。開発者がC/C++コードにうっかりメモリ破壊バグを作り込んでしまったことだ。  メモリ破壊バグとは、配列に対する指標値の誤りや、ポインタ変数の誤りなどにより、意図しないメモリ領域を書き換えてしまい、以降のプログラム動作がおかしくなる、というものである。

PHPは言語自体が脆弱性な印象ですが、C言語は先の例のように開発者が自ら脆弱性を作りこんでしまうケースが目立ちます。

なぜC言語は開発者のミスを誘発するのでしょうか。

C言語はプログラミングだけでなくハードウェアの分野でも高度な知識が要求されます。メモリやCPUなどハードウェアの性質をよく理解していないと、最悪、OSが起動しない場合もあります。例えば、代表的な問題の例として「メモリリーク」があります。これは不要なメモリ領域を解放できない問題です。メモリリークの説明は引用します。

例えば、C言語C++言語における関数malloc()で動的に確保されたメモリ領域は、それに対応する関数free()の呼び出しでプログラム終了後に解放するのが基本的な流れですが、アプリケーションプログラムが動的に確保したメモリ領域を解放する、つまりfree()の記述を忘れていると、そのメモリ領域はシステムのメモリ資源を無駄に占有し続けることになってしまいます…

出典:https://itmanabi.com/memory-leak/

このようにC言語は処理が強力な分、扱いの難易度が高くミスを誘発しやすい言語です。

まとめ

以上、個人的な見解になりますが、5つのポイントで、なぜ有名な言語は人気があるのか、を考察してみましたが、いかがでしたでしょうか。

少しまとめると、最も人気のあるJavaは、中間共通言語を使い、スクリプト言語よりも高速に動作し、C/C++よりも移植性の高い優秀な言語です。また強力なオブジェクト指向言語であり、EclipseAndroid Studioなど統合開発環境も整っているため、大規模開発で重宝されます。世界で7割のシェアを占めるAndroidJavaで開発され、その安定感が伺えますね

次点のC言語は、コンパイル語に属し、ネイティブコードを組み込む事で高速に動作する上、忖度0で書いた通りにしか動かないため、ソースファイルのサイズも最小限に抑えることができます。その特性から、応答速度が求められる基幹システムや機械製品の制御に利用されています。

3位のPythonは、豊富なライブラリや充実したフレームワークを武器にAIの技術を支えています。純粋な言語としての総合力も高いため、AIだけでなくWEBアプリやデスクトップアプリ、処理の自動化、科学技術計算や統計など幅広い分野で使われています。

今後はどんな言語が出てくるのでしょうか。例えば、C系よりも速くセキュリティが優れていれば評価されるでしょう。そこで今注目されている言語が、「RUST」です。RUST(ラスト)はMozillaが支援するオープンソースの言語です。その速度、並行性、安全性において、C言語C++に代わる言語といわれ、Microsoftも高く評価しています。

プログラミング言語は、他の技術と比べ、その良し悪しが分かりにくいことがあります。結局は書いてみないと分からないことが多いからです。

そこで今回は、その言語の優位性は何か、他の言語と何が違うのか。どういう経緯で注目されるようになったのか、を意識して記事を書いてみました。全体がイメージしやすいよう5つの指標を軸に、できるだけ分かりやすく(?)したつもりですが、まだしっくりこない方は前回の記事も合わせ読んで頂くと幸いです。

vtaiki.hatenablog.com