あなたが今日 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, Python1950年代後半〜
4GL第4世代言語特定ドメインに特化。人間言語に近いSQL, R, ABAP1970〜80年代
5GL第5世代言語「解き方」でなく「制約・条件」を記述Prolog, Mercury1980年代〜

この地図には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 で回答