あなたが今日 print("Hello") と書いて実行できるのは、70年以上にわたる無数の試行錯誤の上に立っているからです。
本シリーズ「プログラミング言語の歴史 Deep Dive」は、その壮大な旅を全10章でたどります。第1章ではまず、
そもそもなぜ「プログラミング言語」というものが必要になったのかを、コンピュータ以前の前史から解き明かし、
これから訪れる70年間を俯瞰するための「地図」——世代論——を手に入れます。
言語以前 — 0と1で機械と対話する
1940年代に登場した最初の電子計算機には、もちろん「プログラミング言語」などありませんでした。 CPUが直接実行できるのは、2進数で表現された命令の列——機械語(machine code)だけです。 プログラマは「このビット列はメモリ番地3の値をレジスタに読み込め、という意味」といった対応表を片手に、 延々と0と1を並べていました。
これは想像を絶する苦行でした。命令もデータも数値アドレスも、すべて人間が手で管理しなければなりません。 1ビットの打ち間違いがプログラム全体を狂わせ、しかもどこが間違っているのか見つける手がかりはほとんどない。 さらに深刻な問題が移植性の欠如です。機械語はCPUの設計に完全に依存するため、 別の機種に移ると命令体系がまるごと変わり、プログラムを一から書き直す羽目になりました。
第一歩 — アセンブリ言語というニーモニック
最初の救いはアセンブリ言語(assembly language)でした。これは機械語の数値命令に、
人間が読める記号(ニーモニック)を1対1で対応させたものです。たとえば「加算せよ」という命令を
10110000 ではなく ADD と書ける。アセンブラというプログラムが、
この記号列を機械語へ機械的に翻訳してくれます。
; x86アセンブリの例: レジスタ同士の加算
MOV AX, 5 ; AXに5を代入
ADD AX, 3 ; AXに3を加算 (AX = 8)
MOV result, AX ; 結果をメモリへ格納 アセンブリは確かに機械語より人間に優しい。しかし本質的な限界は残ったままでした。命令はやはりCPU命令と1対1で対応しているため、 x86のアセンブリはARMでは動かない——移植性の問題は解決していません。そして「3つの数の平均を求める」といった ごく簡単な処理でも、レジスタの出し入れを延々と書く必要があり、人間が考える単位(数式やロジック)とコードの単位が かけ離れたままでした。アセンブリは「第2世代言語」と呼ばれますが、まだ機械の都合に人間が合わせる世界だったのです。
高水準言語への渇望 — 3つの動機
1950年代、「もっと人間の言葉に近い形で書きたい」という渇望が頂点に達します。 高水準言語(high-level language)が生まれた動機は、突き詰めると次の3つに整理できます。
| 動機 | 何が問題だったか | 高水準言語が与えた解決 |
|---|---|---|
| 認知的負荷 | 機械語・アセンブリは命令が細かすぎ、人間の思考単位と乖離。バグの温床 | x = (a + b + c) / 3 のように数式そのままで書ける |
| 移植性 | 機械語・アセンブリはCPU固有。機種が変わると全面書き直し | 同じソースを各機種のコンパイラで翻訳すれば動く(理想) |
| 生産性 | 簡単な処理にも膨大な記述。専門家しか書けない | 少ない行数で意図を表現。科学者や事務員も書ける |
象徴的なのが、ドイツのコンラート・ツーゼが1940年代に「機械語でのプログラミングは複雑すぎる」と痛感し、 世界初の高水準言語 Plankalkül を構想したことです(詳しくは第2章)。 そしてIBMの FORTRAN は、まさに「数学記法で書いたプログラムを機械命令へ自動翻訳するシステム」として開発されました。 ここで決定的に重要なのは、高水準言語が単独では成立しないという事実です。人間が書いた高水準なコードを機械語へ変換する コンパイラあるいはインタプリタという「翻訳機」が同時に必要でした。言語と翻訳機は車の両輪なのです。
地図を手に入れる — 言語の「世代」論
70年の旅に出る前に、全体を俯瞰する地図を持っておきましょう。プログラミング言語はしばしば 「世代(generation)」で分類されます。これは厳密な科学的分類ではありませんが、 「機械寄り」から「人間寄り・問題寄り」へと進化してきた大きな流れをつかむのに便利です。
| 世代 | 名称 | 特徴 | 代表例 | 登場時期 |
|---|---|---|---|---|
| 1GL | 機械語 | CPUが直接実行する0/1の命令列 | 機械語 | 1940年代〜 |
| 2GL | アセンブリ言語 | 機械命令をニーモニックで記号化 | 各CPUのアセンブリ | 1950年代 |
| 3GL | 高水準言語 | 機械独立・人間フレンドリー。データ型と抽象化 | FORTRAN, C, Java, Python | 1950年代後半〜 |
| 4GL | 第4世代言語 | 特定ドメインに特化。人間言語に近い | SQL, R, ABAP | 1970〜80年代 |
| 5GL | 第5世代言語 | 「解き方」でなく「制約・条件」を記述 | Prolog, Mercury | 1980年代〜 |
この地図には1つ重大な注意書きが必要です。世代論は3GL以降で急速に精度を失います。 実際、この分類の元になった考え方は3GLより上では「のちにおそらく放棄された」とも評されます。 たとえばSQLを4GL、Prologを5GLと分類する基準には一貫性が乏しく、現代の言語の大半は3GLの枠に収まってしまいます。
これから訪れる70年
地図を手にしたところで、これからの旅程を予告しておきましょう。
前史: エイダ・ラブレス
解析機関のためのアルゴリズム(Note G)。コンピュータ以前の「最初のプログラム」
第2章: 黎明期
FORTRAN・LISP・COBOL・ALGOL。4つの源流とコンパイラの誕生
第3〜4章: 構造とオブジェクト
構造化プログラミング革命、GOTO論争、Simula/Smalltalk/C++のOOP
第5〜6章: 関数型と系統樹
λ計算からHaskellへ、型システムの進化、言語の家系図と世代交代
第7章: スクリプトの爆発
Python・Ruby・Java・JavaScript・PHPがインターネットと共に登場
第8〜10章: 人気・統治・未来
人気の計測、設計者とガバナンス、Rust・AI・WebAssemblyの現代
プログラミング言語の歴史は、単なる年表の暗記ではありません。それは「人間はどうすればコンピュータに 自分の意図を、より正確に、より楽に、より安全に伝えられるか」という問いへの、70年分の回答の積み重ねです。 機械語の0と1から始まったこの問いが、どんな驚くべき答えを生んでいったのか——次章から本格的に旅を始めましょう。
理解度チェック
機械語(第1世代言語)の最大の問題点として、本章が特に強調したものはどれですか?
キーボード: 1〜4 で選択、Enter で回答