我々人類が話す自然言語は、現在約7000ほどもあると言われています。気候や文化に合わせてそれぞれに変化していった結果でしょう。
プログラミング言語も、用途やコンピューター技術の進歩に合わせて、どんどん変化し、新しいものが生み出されています。そして現在、世界には200以上のプログラミング言語があるとされています。
様々なプログラミング言語を学ぶことは、人々が「より良いプログラミング言語を作ろう」と努力してきた歴史を垣間見ることでもあります。
この記事では、プログラミング言語をいくつかの観点から分類することを試み、最後には現役のプログラミング言語のうちのいくつかを短く紹介していきます。
皆さんが次に学習する言語を選ぶ参考になれば幸いです。
実行方法による分類
プログラミング言語を分類する方法はたくさんありますが、ここではプログラムの実行方法によって分類してみます。
プログラミング言語の処理系には、大まかにいってインタープリタとコンパイラと実行時コンパイラがあります。それぞれに長所と短所があります。
ひとつの言語に対して、必ずしもひとつの実行方法しかないわけではありません。インタープリタとコンパイラなど、複数の処理系が存在するものもあります。
インタープリタ
インタープリタというのは、文字で書かれたプログラムを「解釈」するプログラムのことです。
インタープリタでプログラムを実行すると、まずソースコードが書かれたファイルを読み込み、それを解釈して実行します。
インタープリタの長所としては、開発の際、テストがしやすいということがあります。コードを書いてその場で即座に実行できるので、「修正→実行」を繰り返すのが比較的容易です。そのぶん、開発の時間が短縮できます。
これは学習のしやすさにもつながります。中には、コードをファイルに保存せずとも、コマンドラインに直接打ち込んで実行できる環境を提供するインタープリタもあります。
これは心強い学習ツールであるだけでなく、実際の開発過程でも、ライブラリメソッドのちょっとした動作確認などに使える便利なものです。
短所としては、一般に、インタープリタは実行速度が遅いということが挙げられます。高速な処理が求められるプログラムの開発には向いていません。
まとめると、インタープリタは開発時間は短いけれども実行時間は長い傾向があります。その足し算で、全体の時間が短くなるのであれば、インタープリタを使う意味は十分あります。また、学習にも適しています。
インタープリタで実行される言語としては、RubyやPythonが代表的です。
コンパイラ
コンパイラは、ソースコードを機械語に変換するソフトのことです。
人間が分かるように書かれているソースコードを、コンピュータが実行できる機械語に「翻訳」すると考えればはかりやすいでしょう。
コンパイラでプログラムを「コンパイル」すると、ソースコードを読み込んで解析し、オブジェクトコードというものを生成します。その後、いくつかの過程を経て、実行可能なプログラムファイルができあがります。
コンパイラで作られたソフトウエアは、実行速度が速いという長所を持ちます。大量の計算をし続けなければならない用途では、コンパイラ言語が活躍します。
コンパイラの短所としては、コンパイル自体に時間がかかるため、「修正→実行」のサイクルが大変であるということがあります。そのため、学習者が最初に選ぶ言語としては、インタープリタのほうにやや分があると言ってよいでしょう。
CやC++がコンパイラ言語の代表格です。
実行時コンパイラ
実行時コンパイラとは、実行時にその都度コンパイルするタイプのコンパイラのことです。
事前にすべてをコンパイルする方式に比べ、実行時コンパイルは、そのコンパイルの時間のぶん実行速度が遅くなります。
そのマイナスを負ってまで実行時コンパイルするのは、1度の開発でいろいろな環境で動くソフトウエアが作れるからです。Windows用とMac用を両方用意する、というような必要がないのです。これは開発者にとってはとても大きな利点です。
実行時コンパイラ言語の代表であるJavaは、「1度書けばどこでも動く」というのをキャッチフレーズにしています。
プログラミングパラダイムによる分類
次に、プログラミングパラダイムによる言語の分類をしてみましょう。
プログラミングパラダイムというのは、どんなやり方でプログラムを作るのか、ということです。
プログラミングパラダイムには実に多様なものがあり、また、ひとつの言語が複数のパラダイムに対応しているのが普通です。
ここでは、数あるプログラミングパラダイムの中から、手続き型、オブジェクト指向、関数型の3つを取り上げます。
手続き型
コンピューターに実行させる命令や、命令の束である「手続き」を記述することによってプログラムを作る方法です。「手続き」は、言語によっては「関数」や「メソッド」などと呼ばれます。
古くからあるパラダイムです。今では、下で述べるオブジェクト指向に対して「非オブジェクト指向」という意味で使われることも多くなっています。
手続き型言語に分類される言語の代表はC言語で、いまだに多方面で使われています。そのほかにはBASICやFortranやCOBOLなどがありますが、これらを新たに学習する人は減っています。
オブジェクト指向
データと手続きをひとまとまりにした「オブジェクト」というものを用いた開発手法です。
オブジェクトによって、様々な物事が表現できます。例えば「猫」をプログラムで表現する場合、「毛の色」「年齢」というデータと、「鳴く」「ひっかく」という手続きを持つオブジェクトとして表す、という具合です。
オブジェクト間でデータをやりとりする、という形でプログラムを作っていきます。現実に即したシステムを作りやすいので、幅広く使われています。
オブジェクト指向に対応した言語には、C++、Java、Ruby、Rython、C♯などがあります。
関数型
主に関数を使って行うプログラミング手法です。
ここでいう関数とは、数学的な意味の関数のことです。プログラミング用語としての関数とは少し違います。
数学の関数とは、ある値を与えるとそれに対応する値をひとつ返す、ただそれだけのものです。ところが多くのプログラミング言語では、関数はどこかの変数の値を変えてしまうとか、余計な仕事をすることがあります。こういうのを「副作用」といいます。
関数型プログラミングでは、基本的に副作用を許しません。それにより、信頼性の高いコードを書くことができます。
関数型の言語には、LISP、Haskell、Scalaなどがあります。
目的別分類
次に、何を作るか、という目的別に、プログラミング言語を分類してみましょう。
それさえ覚えれば何でもできる、という言語は、残念ながら存在しません。目的によって使い分けるのが普通です。ひとつの目的に、複数の言語を使うことも珍しくありません。
生き残っている言語には、大概何かしらの得意分野があります。その目的を達成するための優れた機能を有しているのです。
従って、その言語の得意分野を知ることが、その言語の特徴を知る近道になります。
Web開発
Web開発には、ユーザーの目に触れるフロントエンドと、内部的な処理を行うバックエンドがあります。
フロントエンドでは、Webサイトの見た目とか、ユーザーインターフェイスを記述するための言語が必要です。
それらに使われるのがHTMLとCSS、それにJavaScriptといった言語です。
バックエンド開発では、Webサーバーやデータベースに関する処理を行います。それに使われるのが、Java、JavaScript、PHP、Ruby、Python、SQLなどです。
PCソフト
Window用やMac用パッケージソフトとしてお店で売られていたり、ダウンロード販売されているものです。フリーウエアやシェアウエアとして配布されているものも多数あります。
パソコン用のソフトを開発するためには、コンパイラや実行時コンパイラ系の言語を使うのが主流です。特に一般に売り出す場合には、Windows用、Mac用などプラットフォーム別に開発されることが多くなっています。
Windows用ソフトの開発環境としては、MicrosoftのVisual Studioが主に使われています。言語としては、C++やVisual Basic、C#などが使用できます。
Visual StudioにはMacバージョンも存在し、そちらではMac用ソフトを開発することができます。
Mac用ソフトの開発では、SwifやObjective-Cが主要な言語となっています。
スマホアプリ
AndroidやiOSのスマホで動くアプリには、Webアプリとネイティブアプリ、そしてそれら両方の特徴を併せ持つハイブリッドアプリがあります。
Webアプリは、上記のWeb開発に準ずるものですので、使用言語も同様にHTML&CSSやJavaScript、PHP、Ruby、Javaなどが挙げられます。
ネイティブアプリの場合は、AndroidとiOSで主に使われる言語が異なります。
AndroidではKotlinやJavaが使われています。
iOSでは、Mac用のソフトと同様に、SwifやObjective-Cがよく使われます。
ハイブリッドアプリは、見た目はネイティブアプリ、中身はWebアプリとなっているもので、使用言語はそれぞれに準じます。
組み込み
組み込み開発とは、家電や自動車、携帯電話、産業用機械、医療機器などの機械類に組み込まれるソフトウエアを開発することです。
組み込み開発をするなら、とりあえずC言語は覚えておけ、ということになります。また、C++で開発するケースも多くなっています。Javaやアセンブラといった言語を使用する場合もあります。
業務系システム
業務系システムとは、企業などの業務の効率化をはかるシステム全般を指します。給与や販売管理など、様々なものがあります。
企業の多くではWindowsパソコンを使用しているため、PCソフトと同じような言語、C++やVisual Basic、C# などが使われることが多くなっています。また、Javaもよく使われます。データベース用言語SQLは、何で開発するにしてもよく使います。
AI開発
人工知能(AI)開発は、近年爆発的に応用範囲が広がっている分野です。車の自動運転といった華々しいものから、宅配業者が配達員の稼働状況を最適化させたりなど、ビジネスへの応用が盛んです。
AI開発に使われる言語としては、PythonやR、Juliaなどがあります。
主要言語紹介
ここからは、現在使われてるプログラミング言語のうち、主立ったものを紹介していきます。
もちろんこのほかにもまだまだたくさんありますが、需要が多いもの、これから伸びそうなもの、話題性のあるものという観点で選んでみました。
HTML&CSS
Web開発を目指すなら、まず最初に覚えるべきなのがHTMLとCSSです。これらはWebページの見た目を形作るものです。
HTMLは Hyper Text Markup Language の頭文字を取ったもので、Webページの骨組みを作る言語です。<>で囲まれたタグと呼ばれるものを使って、タイトルや見出しなどのページの要素を構造化していきます。
CSSは Cascading Style Sheet の頭文字を取ったもので、HTMLで記述されたページに色などの見栄えの要素を追加するものです。
HTMLとCSSはセットで使われます。ブラウザ上の見た目を決めるという用途に特化されており、複雑なロジックを表現することはあまりないため、とても簡単な部類の言語と言えるでしょう。
JavaScript
JavaScript(ジャバスクリプト)は、オブジェクト指向の要素を備え、大規模開発にも耐えられる機能を持ちながら、比較的簡単に記述できる言語です。
その名が表す通り、「スクリプト言語」と呼ばれるタイプに属します。スクリプト言語とは、簡単にいえば「読みやすく書きやすい」言語のことです。
JavaScriptはWeb開発で大活躍しています。フロントエンドにもバックエンドにも使われます。
HTML&CSSと組み合わせることで、Webページに動的な要素を加えることができます。例えば、ページのある場所にマウスカーソルがきたときに、そこの色や画像が変化する、というような処理ができます。
Ruby
Ruby(ルビー)は、オブジェクト指向を前面に押し出したスクリプト言語です。「オブジェクト指向スクリプト言語」と称されます。
Rubyは高い記述力を誇ります。短い文でかなりのことをやってのけます。ひとつのことをやるのにいろいろな書き方ができる、柔軟な言語です。
その高い記述力を活かして開発されたのが、Webアプリケーションフレームワークの Ruby on Rails です。少ないコーディングでWeb開発が簡単にできるので、広く普及しています。Ruby on Rails がRubyを一気にメジャーな言語に押し上げました。
インタープリタで簡単に実行できるので、学びやすい言語です。それでいて非常に高度な機能も備えていて、奥の深い言語でもあります。
Python
Python(パイソン)は、オブジェクト指向のスクリプト言語です。
Rubyとよく似た特徴を持っており、ライバル関係にあると言ってもよいでしょう。
Pythonはとても読みやすい言語です。コードの階層構造をインデント(字下げ)によって表すことが言語仕様で義務化されているので、スッキリと見やすいコードになりやすくなっています。
Pythonにはデータ分析に優れたライブラリがいくつも存在し、データサイエンスの分野で盛んに使われています。とりわけAI開発に使われる言語として注目を集めています。PythonでAI開発、というテーマの書籍が立て続けに発行されています。
また、PythonにはWeb開発用のフレームワークDjangoやFlaskがあって、Web開発にもよく使われます。
C
C言語は、歴史的に重要な、なおかつ現役バリバリのプログラミング言語です。
実行速度が非常に速いというのが大きな特徴です。通常の手続き型プログラミングのほか、ハードウエアを直接制御するような記述もできるため、極限までのチューニングが可能です。
PC用のソフトのほか、組み込みソフトの開発にも用いられます。幅広い用途で使われています。
RubyやPtythonの主要なインタープリタも、C言語で書かれています。また、これらの言語のライブラリのうち、高速な処理が必要なものはCで書かれています。
C言語は後続の言語に多大な影響を与えました。C++やJava、C#などは、Cの構文を受け継いでいて、「C系」の言語と呼ばれることもあります。
ポインタなど難しい概念があり、コンパイラ系なので、初心者が学ぶにはあまり向いていません。
C++
C++(シープラスプラス)は、C言語の直接の子孫にあたる言語です。C言語にオブジェクト指向を組み込んだものとして開発されました。
それだけに留まらず様々な機能が追加されていき、言語仕様はとても複雑になっています。
多くのPCソフトがC++で書かれています。組み込み分野でも、新しい案件はCではなくC++でスタートすることも多くなっています。
とにかく強力なC++ですが、いかんせんこの上なく難解です。最も難しいプログラミング言語と言われています。初心者が最初に学ぶ言語には選びにくいでしょう。
Java
Java(ジャバ)は、CやC++と似た文法を持つ、汎用性の高いオブジェクト指向の言語です。
実行時インタープリタを採用していて、PCやWebサーバー、機械への組み込みなど、あらゆるプラットフォームで使えることを売りにしています。
需要も多く、食いっぱぐれのない言語と言えるでしょう。
C++で複雑になりすぎた仕様をよりスッキリさせた作りになっていて、そのぶん学びやすさは増しています。
C#
C#(シーシャープ)は、CやC++の文法を踏襲しながら、様々な改善を加えた言語です。
Microsoft社の統合開発環境 Visual Studio に含まれている言語で、同社との結びつきが強くなっています。同社の.NET Framework などのテクノロジーに依拠したプログラムを開発できます。
Javaに似た部分が多いため、Javaを使える人ならば学習は容易でしょう。
Visual Basic
Visual Basic(ヴィジュアルベイシック) もまた、Microsoftの Visual Studio に含まれている言語で、現在のバージョンでは.NET技術に依拠しています。
BASICという古い初心者用の言語から派生しているため、プログラミングの入門用言語としても優れています。それに留まらず、開発現場でも普通に使われています。
開発スタイルとしては、画面上でフォームにボタンなどの部品を貼り付け、それぞれの部品の動作などをコードで記述していくという形になります。GUIを直感的に扱えるので、開発効率がよくなります。
Kotlin
Kotlin(コトリン)は、Javaをより簡潔にしたような言語です。
Android用アプリの開発においては、Kotlinが主流になっています。
Javaと完全な互換性があり、Javaの動く環境ではKotlinで書かれたソフトも動きます。これからの伸びが期待できる言語です。
Swift
Swiftは、Apple社によって作られた言語です。MacやiOS搭載スマホなどで動くソフトを開発できます。
RubyやPythonを参考にしていてい、とても読みやすく書きやすい、シンプルが言語になっています。
実行速度がとでも速く、きびきびしたアプリが作れます。
初心者の方がiOSアプリを作りたいと思ったら、ほぼSwift一択と言ってよいでしょう。
R
Rは、統計解析に特化した言語です。
平均や標準偏差といった統計量を算出する関数が標準で搭載されており、極めて短いコードで計算することができます。グラフを描く関数も組み込まれていて、様々なタイプのグラフを描くことができます。
R言語は学術研究の分野で使われてきましたが、ビッグデータやAIの時代になり、ビジネスの現場でも盛んに活用されるようになりました。Pythonとともに熱い注目を集めています。
R言語は、他の言語の経験者からはクセが強い言語と思われることもしばしばです。しかし恐ろしく複雑というわけではなく、インタープリタで実行できることも含め、比較的学びやすい言語と言えるでしょう。
Haskell
Haskell(ハスケル)は、「純粋関数型」といわれる言語です。
命令文というものがなく、すべてを関数で表現します。そのほかにも遅延評価など、他の言語に慣れた人には「普通でない」と思われそうな点がいろいろあります。
Haskellは信頼性の高いプログラムを作ることができるため、金融の分野などで採用されています。
普通のプログラミングにある程度習熟した段階でHaskellに触れれば、「正しい」「信頼性の堅い」プログラムとは何か、ということを考えるきっかけになり、スキルの向上が期待できるでしょう。
まとめ
プログラミング言語の世界は広大無辺です。様々な仕様に触れることで、人間はこんなものを生み出したのか、という驚きと喜びが得られるでしょう。まずは学びやすい簡単な言語から始めて、いろいろな言語に挑戦してみましょう!