あなたが今日 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から始まったこの問いが、どんな驚くべき答えを生んでいったのか——次章から本格的に旅を始めましょう。

理解度チェック

問題 0 / 50%
Q1

機械語(第1世代言語)の最大の問題点として、本章が特に強調したものはどれですか?

キーボード: 1〜4 で選択、Enter で回答