(もともと「Yahoo!知恵袋」の「知恵ノート」だったものを転載しています)
(最終更新日時:2017/4/19)投稿日:2014/1/21
はじめに
優に数百を数える、多種多様なプログラミング言語……本ノートでは、おおよそ年代順に、代表的な言語について概観してみます。 なお、スクリプト言語については、別ノート https://khurata.hatenablog.com/entry/2019/04/04/075424 にしました。
machine language「マシン語、機械語」
多くのコンピュータが直接実行出来る唯一のプログラミング言語だが、その実態は「2種類の電圧をいくつか並べたもの」であり、普通の人が持つ「言語」のイメージとは程遠い。
この2種類の電圧を「0」と「1」で表すのが慣例になっているので、機械語は「0と1の羅列」、つまり2進数の数列として書き表される。
この「2種類の電圧」を並べてコンピュータの電子回路に入力すると、それらの電圧により「加算回路」などの電子回路が駆動し、コンピュータに計算をさせることが出来る。
もちろん、その「2種類の電圧の並び」は、コンピュータの電子回路が受け付けられる並びでなければならない。 その並び方は、コンピュータのハードウェア設計によって異なるため、CPU の種類が違うと機械語も異なる。
(参考 https://khurata.hatenablog.com/entry/2019/04/04/050217 )
人間にとって、きわめて扱いにくい言語であるが、コンピュータの登場初期は、人間が機械語でプログラムを作っていた。 後に、2進数の3桁を8進数の1桁にまとめたり、2進数の4桁を16進数の1桁にまとめたりして、多少は扱いやすくなったものの、「数値の羅列」である事には変わりない。
assembly language「アセンブリ言語」
機械語の1命令を、英略語に置き換えた「対訳」言語。 機械語の対訳なので、当然ながら、アセンブリ言語は、違う CPU では異なる。
かつて、プログラムは紙に手書きして作っていたため、たとえば JUMP は JP と縮めて書く方が望ましく、そのためアセンブリ言語は、このような「短縮した英単語」で機械語の命令を表す事が多い。 この短縮形を mnemonic「ニモニック」と呼ぶ(記憶を助ける、の意)。
数値よりもニモニックの方が憶えやすいので、アセンブリ言語の「発明」により、プログラム作成の手間は大きく軽減された(IP アドレスよりも URL の方が憶えやすいのと同様)。
しかし、アセンブリ言語で書かれたプログラムは、機械語に変換しなければ、コンピュータで実行する事は出来ない。 この変換作業を assemble「アセンブル」と呼ぶ。
当初は、人間が「アセンブリ言語→機械語」の変換表を見ながら手作業でアセンブルしていた。 これを hand assemble「ハンド・アセンブル」と呼ぶが、手間がかかり、変換間違いも多かった。
1954年頃、アセンブルを行うプログラム assembler「アセンブラ」が作成され、プログラマはハンド・アセンブルから解放された(最初のアセンブラが機械語で作られた事は言うまでもない)。
かのフォン・ノイマンは「人間でも出来る事をコンピュータにやらせるのはナンセンス」と言ったそうだが、アセンブラは登場当時「自動プログラミング」と呼ばれ、大歓迎された。
現在でも、新規 CPU の最初の開発言語処理系として、アセンブラは作られ続けている。
FORTRAN「フォートラン」
1950年代後半に出現し、広く普及した、最初期の compiler language「コンパイラ言語」。 言語指向(プログラミング・パラダイム)としては「手続き型」言語である。
FORTRAN の発明は、compiler「コンパイラ」という、それまでに無かったプログラムの発明でもあった。
「FORTRAN コンパイラ」とは、「『FORTRAN 言語で書かれたプログラム』を、機械語プログラムに自動変換するプログラム」である。
FORTRAN 言語で書かれたプログラム、つまりコンパイラにとっての入力データを source program「ソース・プログラム」と呼び、コンパイラの出力データ、すなわち実行可能な(機械語)プログラムを object program「目的プログラム」と呼ぶ。
FORTRAN 言語では、普段、数学で書くのと近い形の数式が書ける。 たとえば A = B + 5 * C などのように。
機械語やアセンブリ言語では、こうした数式を計算したい場合、演算子の優先順位やカッコの処理などを人間が考えてプログラミングするのだが(たとえばこの式では、B + よりも先に、5 * C を処理せねばならない)、FORTRAN コンパイラは、数式(ソースプログラム)を与えると、優先順位やカッコなどを考慮した機械語プログラムを自動生成する。 あたかも、人間がそのような機械語プログラムを作ったかのように。
FORTRAN コンパイラは、数式を、一定の法則に従って機械語プログラムに置き換えてくれる「アセンブラの大改良版」なのだが、これは画期的な発明だった。
機械語やアセンブリ言語は CPU が違えば異なるが、コンピュータに計算させたい数式は、違う CPU であっても異なるわけではない。 そこで、FORTRAN を使えば、目的の CPU 用コンパイラさえあれば、どこでも「同じ数式計算プログラム」が動かせる。 「数式を書ける FORTRAN のソースプログラム」は、CPU の違いを超えたのである。
この性質を machine independent「機械独立」と呼び、その性質を備えたプログラミング言語を、high level language「高級言語」と呼ぶ。 対して、機械依存であるアセンブリ言語や機械語は、low level language「低級言語」と呼ばれるようになった。
「高級言語」でソースプログラムを書けば、「同じプログラムが、異なるコンピュータで動く」。 これは革新であり、その後のコンピュータ利用を大きく拡げた。
FORTRAN は誕生から60年ほど経った現在も、科学技術計算用言語として、メインフレームやスーパーコンピュータで使われている。 また、gcc に含まれており、誰でも無償で使える。
LISP「リスプ」
現代のコンピュータは、Turing machine「チューリング・マシン」を実現した機械だとも言える。 LISP は、そうした性質を記述・実行するため、1960年頃に作られた高級言語である。 プログラミング・パラダイムとしては「関数型」言語と言えるが、「手続き型」の性格も併せ持つ。
LISP は、言語としては簡単な機能しか持っていないが、データをプログラムとして実行できる(evaluate、評価)という、チューリングマシンならではの特色を持つ。
このため、LISP プログラムは、プログラマの工夫次第で、機能を際限無く拡張出来る。 その結果、LISP には非常に多くの「方言」が生まれ、それらの方言のうち人気を博したものは、独立した言語として発展していった。
(ただし、拡張すればするほど潤沢なメモリを必要とするため、LISP 出現当時のコンピュータでは「拡張しまくった LISP プログラム」は実用的ではなかった)
LISP は、高級言語の実行様式に interpreter「インタプリタ」という新しい動作を導入した最初の言語でもある。
コンパイラは、ソースプログラム全体を一括で機械語プログラムに変換するが、インタプリタは、ソースプログラムを逐次読み取り、その都度、インタプリタ自身が持つ、その場面に応じた機械語プログラムを実行する。
コンパイラが「翻訳家」であるなら、インタプリタは「同時通訳者」であると言える。 インタプリタはソースプログラムをコンパイルせず即座に実行出来るが、コンパイル済みの機械語プログラムに比べて実行速度はかなり遅い。
最初期の LISP はコンパイラ言語だったが、実行時にデータを動的に生成し・拡張し・書き換えて・評価(実行)する、という特徴を生かすにはインタプリタ言語とする方が適しており、1960年頃には LISP インタプリタが作られた。
LISP インタプリタは、LISP ソースプログラムに書かれたデータ(リスト)を逐次「評価」する。 データが評価される事により、プログラムが実行されていく。
現在、多くのスクリプト言語が「eval」(評価)機能を持っているが、それらの起源は LISP であると言える。
COBOL「コボル」
金融・帳票などの事務計算処理に特化した、手続き型のコンパイラ言語。 最初の言語仕様は1960年に策定された。
FORTRAN の発明により、機械語を扱わなくても数値計算プログラムが作れるようになった。 そうなると、おカネの計算、つまり事務処理をやりたいと思うのは自然な発想であったが、当時、コンピュータはきわめて特殊な機械であり、FORTRAN が「機械語よりはるかに簡単」とは言っても、会社勤めの事務職が FORTRAN で会計プログラムを作るのは困難だった。
COBOL は、その溝を埋めるため、FORTRAN よりもはるかに英文に近い書法・文法を採用した。 COBOL で数式は COMPUTE A = A + B. とも書けるが、ADD B TO A. とも書ける。 後者はまさに英文である。
COBOL プログラムは、通常の文書に似せた書法・構造を持っており、「部」、「節」、「文」と細分化してソースプログラムを作る。 つまり、事務計算処理を COBOL 文法に従って詳細に文書化すると、プログラムになる。
更に、COBOL は固定小数点10進数演算を言語仕様に組み入れ、事務計算における計算誤差を追放した。
(多くのコンピュータが内部で採用する2進数計算は、小数計算で10進数との変換誤差が生じてしまう)
以上の特色から、COBOL は事務・金融計算の分野で、非常に好んで使われた。 メインフレーム製品の中には、固定小数点10進数を処理する専用の機械語命令を持つものさえ現れた。
1980年代には、RDB「リレーショナル・データベース」用言語の SQL「シークェル、エスキューエル」が COBOL プログラムから使えるようになり、RDB の普及に一役買った。
誕生から50年以上経つが、現在も金融系などでは現役で使われ続けている。
ALGOL「アルゴル」
algorithmic language の略で、その名の通り、algorithm「アルゴリズム(問題を解く手順)」を簡潔に記述する事を目指して1950年代後期に作られた手続き型コンパイラ言語。
FORTRAN や COBOL は、ソースプログラムの column「カラム、桁」ごとに何を書くべきかが定まっており(行番号は1~6カラムに書かねばならない、など)、1行あたりの文字数にも制限があった。 これは、当時のコンピュータの性能や処理方式に合わせた結果であった。
ALGOL は、そうした「コンピュータの都合」は考えずに、純粋にアルゴリズムを書き表そうとして作られた。 ALGOL では「まともな文法」を導入する事によって、「カラムの束縛」等を追放し、どの桁に何を書くかはプログラマの自由となった(free format「フリー・フォーマット」)。
また「ブロック構造」を導入する事により、プログラムの nesting「ネスティング、入れ子」を可能にした。
フリー・フォーマットであるがゆえに、ブロック構造に従ってプログラムを indent「インデント、字下げ」するという「コーディング文化」も、ALGOL から生まれた。
「ブロック構造」を持ち「フリーフォーマット」である、という特色は、後に多くの高級言語に受け継がれた。
PL/I(Programming Language One)「ピーエルワン」
FORTRAN と COBOL の特徴を併せ持ち、ALGOL のように自由に書ける「万能の言語」として IBM 社が1964年に作った手続き型コンパイラ言語。
IBM は OS もシステム・プログラムもアプリケーションも、全てを PL/I で書くという野望を抱いていた。 科学技術計算も事務処理も、全て PL/I で書けるのだから、高級言語は PL/I だけが有れば良い、という思想だった。
(名称にも、その意図がはっきりと現れている)
しかし、当時としては過度な万能言語を目指した結果、当時のコンピュータにとっては荷が重い巨大な処理系になってしまい、IBM の目論見ほどには使われず、FORTRAN と COBOL の人気には及ばなかった。
2013年現在も IBM のメインフレームでは使われているが、今後は Java に置き換わっていくと見られている。
BASIC「ベーシック」
プログラミング教育用の高級言語として、1964年に開発された手続き型インタプリタ言語。
BASIC インタプリタと「対話」をしながらプログラムを作る、という、新しいプログラミング・パラダイムを示した。 1970~80年代に流行した8ビット PC のほぼ全ての機種に組み込まれ、一世を風靡した。
しかしインタプリタ形式ゆえに実行速度は遅く、言語機能も乏しいため、実用的なプログラム作成には力不足であり、当時の「マイコン少年」の中には、BASIC に見切りを付け、コンパイラ言語やアセンブリ言語を学び始める者も少なくなかった。
ビル・ゲイツが非常に好んでいる言語としても有名である。
Pascal「パスカル」
プログラミング教育用の高級言語として、1970年に開発された手続き型コンパイラ言語。
ALGOL の影響であるブロック構造とフリーフォーマットに加え、簡潔な文法と、ポインタやリストをはじめとする多彩なデータ構造記述を持ち、Pascal コンパイラを Pascal で書く事も出来るという、教育用途にとどまらない強力な言語。
後年、オブジェクト指向を採り入れた Object Pascal「オブジェクト・パスカル」が作られ、さらにそれを元に Windows アプリケーション作成用言語 Delphi「デルファイ」が作られ、強い人気を誇った。
C「シー」
UNIX OS を作るための言語として1972年に作られた手続き型コンパイラ言語。 言語の「血筋」としては ALGOL 系であり、ブロック構造、フリーフォーマットをサポートする。
プラットフォームに依存する機能をライブラリとして言語仕様から切り離し、処理系をコンパクトにした。 そのため、非力なシステムでも使え、8ビット CPU の組み込み系から、64ビット CPU のエンタープライズ・サーバまで、ほとんど全てのプラットフォームに処理系が存在する。 C が使えないコンピュータは、まず無いと言って良い。
きわめて広く普及し、後の言語に強い影響を与えたので、C が出来る人は、大抵の言語が読める。 もっとも、職業プログラマの基礎教養としては必要かも知れないが、日曜プログラマにとって必修とまでは言えない。
OS を作るための言語ゆえに、デバイスドライバや OS など「ハードウェア寄りのプログラミング」に強く、GUI アプリ、音声・画像処理、科学技術計算、機械制御、ゲーム、ウェブプログラミングに至るまで、何にでも使える万能選手。
しかし他の高級言語と比べて、プログラマの責任・分担範囲が広く、他の言語では処理系がやってくれるような事でも、プログラマが実装しなければならなかったりする。 メモリ管理は、その最たるものであろう。
これは、C の開発者が「とにかくすぐに使いたい」と考え、「実用的にシンプル」、悪く言えば「中途半端」な言語仕様にした結果である。 もっとも、そのおかげで、非力なコンピュータでも処理系が実現出来、これが C を普及させた事も否めない。
プログラマの技能次第で、小さく高速なプログラムが作れる、自由で強力な言語だが、「良いプログラム」を作るのは難しい。 C プログラマには芸の細かさが要求されるので、C は「高級アセンブラ」と揶揄される事もある。
後に普及した諸言語に比べると、生産性を高めるための言語機能に乏しく、大規模なプログラミングや、多人数でのプログラミングがやりにくい「過去の言語」である。 オブジェクト指向が使える C++ や C# 等に比べ、C では、同機能のプログラムを作るために大量のソースプログラムを書かねばならない。 現在普通に使われている GUI プログラムの実用的なものを C で作ると、およそ千行以上のプログラムになる。
C++「シープラスプラス、シープラプラ」
C の言語仕様に「柔軟なクラスベース・オブジェクト指向」や名前空間、テンプレートなどの、「大規模なプログラムを多人数で協調して作りやすくする(生産性の向上)仕組み」を導入し、1983年に出現したマルチパラダイム・コンパイラ言語。
C++ プログラムはオブジェクト指向で書く事も出来るし、オブジェクト指向を使わず better C(より良い C)として手続き型プログラムを書く事も出来る(マルチ・パラダイム)。 非常に柔軟で万能度も自由度も高く、小さなツールから大規模なエンタープライズ・アプリケーションまで、何でも対応出来る。
ただし、代表的なオブジェクト指向言語である Java と比べて、C++ のオブジェクト指向は柔軟であり、その分、使いこなしは難しい。
良いライブラリさえあれば、実用的なプログラムが短い行数で書けるのは、オブジェクト指向の恩恵である。 代表的なクラス・ライブラリには STL や Boost や Qt など多数あり、選択はプログラマに任される。
C の完全上位互換ではないが互換性は高く、C が出来る事は C++ でも出来るし、C が得意な事は C++ も得意である。 C++ コンパイラの多くは C コンパイラの機能を持つため、まとめて C/C++ と称される事も多い。
「良いプログラム」はプログラマの技能次第、という性格も C から引き継いでおり、実用的で良いプログラムを作るための技術習得は容易ではない。 現在広く使われているコンパイラ言語において、総合難易度はトップクラスであろう。
Objective-C「オブジェクティブ・シー」
C++ とは異なるアプローチで C にオブジェクト指向を加えたマルチパラダイム・コンパイラ言語。 1983年に開発され、NeXT で採用された。 C++ と同様に、C の上位互換言語でもある。 現在は Swift と共に Mac OS と iOS の主力開発言語であり、開発者人口も多いが、事実上、MacOS/iOS 限定の言語である。
VB(Visual Basic)「ヴイビー、ヴィジュアル・ベーシック」
Windows アプリケーション作成専用言語として Microsoft 社が1991年に作ったコンパイラ言語。
1995年の VB 4.0 で、GUI コンポーネント(ボタンやテキストボックスなどの「GUI 部品」)をマウスでドラッグして配置し、そこにプログラムを書き足していくという HyperTalk のような分かりやすいプログラミング・スタイルを確立し、Windows 日曜プログラマの増加に貢献した。
(Microsoft は、このようなスタイルを RAD(Rapid Application Development)と呼んだが、RAD という用語は現在全く別の意味で使われる事が多いため要注意)
習得は容易だが、言語仕様は同時代の他言語に比べると時代遅れであり、大規模なプログラム開発には向かない。 コンパイル済みプログラムの実行速度も遅い。 スタンドアロン・デスクトップ・アプリケーション開発に限定した言語と割り切るべきであろう。
Java「ジャヴァ」
Sun Microsystems 社が主導して1996年に作り上げた、比較的新しいオブジェクト指向コンパイラ言語。 2013年現在は Oracle 社が主導している。
言語の「血筋」としては ALGOL 系であり、簡潔で整理された言語仕様を持ち、厳格なクラスベース・オブジェクト指向、名前空間、テンプレートなどの「生産性を高める」言語機能が有るため、大規模なプログラムを大人数で作っていくのに適している。
コンパイルされた Java プログラムは JRE(Java Runtime Environment)というランタイム・ライブラリ群をインストールしたプラットフォーム上で動作する。 JRE には JVM(Java Virtual Machine)というインタプリタが含まれており、これがコンパイル済み Java プログラムを実行する。
つまり、JRE が有るプラットフォームなら、コンパイル済みの Java プログラムは、どこでもそのまま動作する。 これを WORA(Write Once Run Anywhere)思想と呼ぶ。
JRE は巨大なプログラム群なので、貧弱なコンピュータには処理系が載せられないし、JVM を介して動作する以上、ハードウェア寄りのプログラミングはほぼ不可能であり、高速性にも乏しい。 このため、Java の適用範囲は、C/C++ より狭い。
とは言うものの、教育や協調開発がやりやすい言語であるため、企業内での開発言語として強い人気があり、エンタープライズ・アプリケーションの多くは Java で書かれている。
また、ゲームや PC 用アプリケーションにもよく使われ、Android アプリのプログラミング言語としても採用されており、アプリケーション作成用言語としてはほぼ万能と言える。
なお、厳格なクラスベース・オブジェクト指向を持つ Java は、オブジェクト指向を普及・発展させ、理解を助けるのに、大いに貢献した。 デザインパターンや UML は、Java が無ければ生まれなかったかも知れない。
C#「シーシャープ」
Microsoft 社が2000年に作った比較的新しいオブジェクト指向コンパイラ言語。 Microsoft が提唱するクラス・ライブラリ群である .NET Framework(ドットネット・フレームワーク)の上でのみ使える。 そのため、事実上、Windows 専用言語となっている。
C と名前は似ているが全く異なる言語仕様と動作態様であり、むしろ Java に近い。
(「JRE の代わりに .NET を使う Java」だと言っても良いほどである)
オブジェクト指向による機能の拡張性に富み、ライブラリは基本的に .NET Framework しか無いため、C++ のような「迷い」が無く、事実上 Microsoft 1社の占有言語であるため「方言」や規格の乱立なども無く、統一感があって学びやすい。
(この点も Java に似ている)
生産性と習得性が高く、オブジェクト指向でしかプログラミング出来ない点は Java と同様であるが、C# が持つオブジェクト指向機能は、Java よりやや柔軟で、C++ 寄りである。
Windows 限定だがハードウェア操作系のクラスライブラリも用意されているため、適用範囲は Java より広く、GUI プログラムも作りやすい。 C/C++ よりも高速性ではやや劣るが、Windows アプリケーション作成に関してはほぼ万能と言える。
VB.NET(Visual Basic .NET)「ヴイビードットネット」
Microsoft 社が2002年に発表した、VB と一見似ているが、全く違う新しいオブジェクト指向コンパイラ言語。 文法は一見 VB っぽいが .NET Framework 専用の言語であり、要は「VB っぽい姿をした C#」である。
そのため、特徴や用途は C# と全く同じ。 VB で育ったプログラマが VB.NET を学び始めると、あまりの違いに驚く。
おわりに
FORTH、LOGO、Ada、Prolog、Smalltalk 等々……筆者の力不足と、字数不足から、取り上げられなかった言語達もたくさんありますが、普及し・一世を風靡し・今も使われている言語のまとめとしては、まずまずのものではないかと思います(現在9989字なのでこれ以上は難しいです)。
(転載以上)