世界を動かす技術を、日本語で。

主に死にかけている影響力のあるプログラミング言語(2020年)

概要

この記事では、歴史的に重要だが現在は「ほぼ死んでいる」とされるプログラミング言語について解説します。各言語の背景、技術的意義、衰退の理由を簡潔にまとめます。影響の検証方法や、言語間の影響関係の見極め方にも触れます。現代の主流言語に受け継がれた要素も強調します。「忘れられた」言語の価値再発見を目的としています。

忘れられた歴史的プログラミング言語の意義

  • 歴史的な重要性 を持ちながら、現代ではあまり使われていないプログラミング言語の解説
  • COBOL、ALGOL、APL、BASIC、PL/I などが代表例
  • それぞれの言語が 現代のプログラミング やツールに与えた影響の整理
  • 衰退の理由 や、なぜ「死んだ」と見なされるのかの考察
  • 技術的・社会的な意義 の再評価

言語の影響をどう検証するか

  • 「最初に発明した」「最初に普及させた」 の違いの認識
  • 影響の確実な証拠は 引用(citation) に基づく
    • 言語Yのマニュアルが言語Xを参照
    • Yの論文がXを引用
    • Yの作者が「Xに影響された」と明言
  • 引用は推移的 で、複数段階の影響も追跡可能
  • 言語間の類似構文(cognate) からも影響を推測
    • 例:RubyのselectメソッドはSmalltalkの影響
  • ただし 独立発明や共通祖先 の可能性も考慮

COBOL

  • 1960年、CODASYLによる開発
    • 業務用の標準高水準言語を目指し誕生
  • レコード型データ (構造体的データ)の導入
    • FORTRANやALGOLにはなかった階層的なデータ構造を自動分解
  • 現代言語への直接的な構文的影響は少なめ
    • しかし 業務システムの基幹 として今も稼働
  • 衰退理由
    • 他言語との交流や発展が少なく、後継言語にDNAが引き継がれず
    • 複雑すぎてコンパイラ開発が遅れ、他言語に市場を奪われた

ALGOL

  • 1960年、ALGOL委員会による設計
    • アルゴリズム記述用の「形式化された擬似コード」
  • レキシカルスコープ、構造化プログラミング、ネスト関数 など現代言語の基礎を多数導入
  • BNF記法やブロックコメント などもALGOL由来
  • 衰退理由
    • 研究用途に特化し、I/O未定義で実用性に乏しかった
    • 拡張版(JOVIAL, SIMULA, CLU, CPLなど)が派生し、直接の子孫よりも拡張言語が普及
    • ALGOL-68は大きく仕様変更し、影響力が低下

APL

  • 1962年、Ken Iversonによる開発
    • 元は配列数式記法、後にIBMで言語化
  • 配列処理 を言語の中心に据え、短い記述で大規模数値演算が可能
    • 科学計算や金融分野で大活躍
  • 独自記号キーボード が必要で普及に壁
  • 現代のR、numpy、pandas、Matlab などに大きな影響
  • 衰退理由
    • ASCII非対応、異種データ混在不可、文字列処理の弱さ
    • 後継のJは記号を排除したが普及は限定的

BASIC

  • 1964年、John Kemenyによる開発
    • 非エンジニア向けにFORTRANを簡易化
  • リアルタイムインタプリタ を初めて実装
  • マイクロコンピュータ時代の標準言語 となり家庭・教育現場で普及
  • 社会的インパクト が大きく、多くの著名プログラマの入門言語
  • Visual Basic としてOfficeマクロ言語に発展
  • 衰退理由
    • 「子供向け」「低レベル」と見なされ、ハード進化とともにPascalやCに置き換え

PL/I

  • 1966年、IBMによる開発
    • FORTRANとCOBOLを統合し、科学・業務両用を目指す
  • 構造体型データ、ポインタ、定数、関数オーバーロード など多数の先進機能を初実装
    • C言語への影響も大きい(コメント構文等)
  • 衰退理由
    • FORTRAN派にはCOBOL寄り、COBOL派にはFORTRAN寄りと不評
    • IBM独占のコンパイラ提供によるベンダーロックイン不信
    • マイクロコンピュータ時代にBASIC等に敗北

まとめ

  • 「ほぼ死んでいる」言語にも現代に続く重要な技術や発想が多い
  • 現代プログラミングの礎 となった構文や概念の再発見
  • 歴史を知ることで技術の本質理解が深まる

Hackerたちの意見

COBOLが「死んだ」言語とか「ほぼ死んでる」言語だって言うのはおかしいよね。だって、今でも世界中のビジネス取引の70%以上を処理してるんだから(約8000億行のコードがあって、まだ増えてるし)。例えば、ここを見てみてね。https://markets.businessinsider.com/news/stocks/cobol-market....

BASICはMicrosoft Officeで使われてるスクリプト言語だよ。これが何百万ものビジネスを支えてるって言っても、誇張じゃないと思う。Pascal、特にDelphi/Object Pascalのバージョンも、今でも広く使われてるよ。

もしかしたら、彼らの定義は最近の人気や新しいプロジェクトの数を基準にしてるのかもね。その定義だと、「死んでる」って呼ぶのはかなり安全だと思う。

誰もCOBOLで新しいプロジェクトを始めてないよ。

COBOLが先駆けた大きなことが一つあるんだ。それは、プログラムだけじゃなくてデータも機械間でポータブルでなきゃいけないってこと。機械が異なる文字コードを使ってた時代に、COBOLはポータビリティの問題を大幅に減らすように設計されたんだ(完全には解決できなかったけど)。今では当たり前になってるけど、当時は革命的だったよ。部分的にはUnicodeやIEEE 754を義務付けるようになったけど、今ではほとんどの言語がポータビリティを推奨してる。Windowsのx86_64からLinuxのARMv8にアプリケーションを移動するのも、(GUIの混乱を除けば)あまり気にしないけど、COBOLが作られてた頃は新しい機械に移るときにはプログラムを捨てて(「再プログラミング」)たんだ。50年間COBOLを使ってないけど(教えたのも40年前)、そのポータビリティへのこだわりには本当に感謝してる。

COBOLのもう一つの大きな特徴は、高精度(つまり多くの桁数)の固定小数点演算だね。大きな金額でもペニーを失わないし、さらに定義された演算がポータブルにできるってのは、金融業界では強力な特徴だよ。JavaやC++、他の言語でも近いものを作るには特別な数値型が必要なんだ。

Pythonのインデントって、どこかでCOBOLに影響されてるの?

今は新しい言語エコシステムに移るとき、すべてを捨てる感じだよね。CPUみたいに言語の一部が整合性を持つようになって、いくつかの構文が言語間でポータブルで互換性があればいいな。

COBOLのもう一つの魅力的な点は、ALGOLの影響を積極的に拒否した唯一のプログラミング言語だってことだね。関数や手続きはなくて、ローカル変数の概念もない。一般的に、ラベル付き文以外の抽象化の機能は全くないんだ。ブロック構造の制御フロー(条件文やループ)は、80年代後半になってようやく追加された。

誰かが「ビッグエンディアンとリトルエンディアンを使うことにしよう」って決めるまで、そしてこの新しいインターネットが正しいビッグエンディアンの順序を使うことになったんだよね。

じゃあ、私も反論するね。MLはほとんど死んでないよ。SMLとOCamlの2つの主要な方言に進化したんだ。OCamlは今でも元気だし、SMLがほぼ死んでるかどうかは議論の余地がある。でも、私が一番言いたいのは、そのセクションの最後の文が、Haskellの誕生がSMLを殺したみたいに聞こえること。みんなが突然、純粋で遅延評価のFPだけを欲しがるようになったからって。それは間違いだよ。実際には、これら2つの機能型プログラミングの系統(厳密/不純と遅延/純粋)は、今でも一緒に進化し続けてるんだ。

F#ってMLの影響受けてるんじゃない?

そうだね、私もそれを見て同じことを言いたくなった。Ocamlは元気に生きてるし、SMLもまだ使われてるよ。Ocamlは比較的広いアプリケーションの範囲があるけど、SMLは定理証明器や関連ツールの世界に限られてる感じだね(例えば、PolyMLはHOL4みたいなものを作るのに使われてて、CakeMLはSMLをターゲットにした検証済みコンパイラの分野でかなりアクティブなプロジェクトだよ)。SMLは産業のプログラマーには無関係だと思われてるかもしれないけど(特にHNのコミュニティにいる人たちには)、まだ生きてるよ。F#もまだ元気で、ほぼOcamlのバリアントだね。

Rustは多くの点で現代的なMLだと思うよ、ただCに似た構文を使ってるだけ。純粋なHaskellの代替って感じだね。

「重要性:構文や意味論の観点から、現代のコンピューティングではCOBOLはあまり見かけない。」って言ってるけど、SQLにはCOBOLっぽい構文があるって言ったら間違いかな?直接的にCOBOLとは関係ないってのは分かってるけど、誰かがCOBOLのぎこちない自然言語の試みを見て、「これ、クエリ言語にしたい」って思ったに違いない。

完全に同意だわ。彼らは同じ時代のもので(COBOLは数年古いけど)、あのダサくて真面目な自然言語の影響があるよね。

COBOLは、SAPのスクリプト言語であるABAPとして今でも現役だよ。

パスカルの没落について正確に分析すると、この記事の残りの部分より長くなるだろうね。俺は完全にボーランドの経営陣のせいだと思ってる。彼らは世界をリードする言語を持ってたのに、C++や「エンタープライズ」を追い求めて波に乗ることをしなかった。アンダースがC#を世に出したとき、パスカルとWindowsネイティブコードの終わりだなって思ったよ。みんなまたコンパイルを待つことに慣れなきゃいけなくなるんだ。

同意するよ。そして、それは彼らが二世代以上の新しい開発者や趣味の人たちを無視したり、軽視したりしたことにも関係してる。子供や趣味の人、学び始めたばかりの人が1400ドル以上のコンパイラを買うことはなかったよね。特に、オープンソースの言語やツールが急速に増えていく中で、プロフェッショナルツールのコミュニティエディションもリリースされてたし。確かに彼らはエンタープライズ市場のお金を狙ってたけど、そこにいる人たちは自分が慣れているものに基づいて買うし、簡単にそれを扱える人をたくさん雇えるからね。最後に見たときには、Delphiのコミュニティエディションがあるみたいだけど、それは馬が遠くに逃げた後に納屋の扉を閉めるようなもので、納屋はほとんど崩れかけてた。

真面目な質問なんだけど、アダは死んでるの?実際にアダをググって、「アダ言語」って検索しないとわからなかった。死んでないし、ニッチな存在はあるよ。俺が70年代後半に大学院にいたとき、DoDが定めた言語を設計する大きなコンペがあったんだ。全てのDoDプロジェクトで使われるためのもので、安全性と効率が大きな懸念事項だった。スポンサーは当時存在していた言語の増殖を避けたかったんだ。4つの言語(たしか)を異なるチームが定義して、DoDが評価して、勝者が選ばれた。PLコミュニティではしばらく大きな話題だったんだけど、その後はそうでもなくなった。俺の印象では、Cに負けたって感じ。アダははるかに安全性が高かった(メモリオーバーランはほぼ不可能だったかも)。アダがCのように流行らなかった理由の歴史を読むのは面白そうだね。

アダは死んでないし、いろんな面でRustより優れてるけど、流行りではないね。adacore.comが主要なコンパイラ開発者(GNATをやってる)。adahome.comはリンクがたくさんある古いサイトだよ。

Adaの話は特に面白くないと思うな。 (1) Cがほぼ無料だった時代に、ライセンスがすごく高かった。 (2) Cが(見た目は)シンプルだった時代に、複雑な言語だったから、他のプラットフォームに移植するのが難しかったし、最初に学ぶのも大変だった。 (3) PCやMacの主要なOSは全部Cで書かれてたから、Adaには素晴らしくデザインされた言語以外にほとんど何もなかった。でも、優れたものが採用されるには十分じゃないって、歴史を通じて何度も見てきたよね。今は?ほとんど何もAdaを使うのを止めるものはないよ。低レベルのコードでは、間違いなく俺のお気に入り。Adaを学んだことで、他の言語の経験にも関わらず、プログラミングについてたくさんのことを学べた。デザインには、概念を明確にする何かがあるんだよね。

いや、違うよ。NVIDIAとAdacoreでググってみれば、AdaがNVIDIAの世界でかなり生きてるのがわかるよ。Adaは、Rustみたいな安全な言語が追っている現在のトレンドをある程度予見していた、かなり良い言語なんだ。Sparkもかなりクールな作品だよ。Adaの古さに対する認識が、一番の障害だと思う。

4つの母言語の中で、ALGOLが最も「死んでる」;みんなLISPは知ってるし、COBOLはたくさんのレガシーシステムを支えてるし、ほとんどの科学パッケージにはFORTRANがまだある。COBOLやFORTRANの仕事が存在するのは聞いたことがあるし、LISPも何らかの形で存在し続けてるけど、ALGOLは本当に死んでるみたい。2005年に廃止されたALGOLのコードベースについて聞いたことがあるけど、それはALGOLのコードベースにとってはかなり遅い死だったね。

Algolは、すごく死んでるのに全然死んでないっていう面白い立ち位置にいるよね。そのレガシーを考えると、ある意味避けられないことだと思う。もし言語の精神が新しい言語に食い尽くされちゃったら、古い言語を使う理由を主張するのは難しくなって、結局死んじゃうんだよね。(対照的に、Lispは他の言語に採用されていない独自のアイデアを持ってるから、なんとか生き残ってる。)

でもAlgolは本当に死んでるみたいだね。 Unisysは、Algolのスーパーセット(ESPOL/NEWP)で書かれたMCPメインフレームオペレーティングシステムをまだ積極的にメンテナンスしてるし、維持されたAlgolコンパイラもついてるよ。新しい機能もAlgolに追加し続けてる(たとえ小さいものでも)。だから、Algolは死んでないよ。近づいてるけど、まだ完全にはいってない。Algolよりも死んでる言語の候補は他にあるよ、例えばHAL/S(スペースシャトルのフライトソフトウェアに使われてたプログラミング言語)とかね。

DoDには、JOVIALというAlgol 58のバリアントで開発されたレガシープログラムがいくつかあって、40年以上も新しいもの(Ada)に更新するように義務付けられてるのに、まだサポートされて編集されてるんだ。他にも、少なくとも2016年まではイギリスの航空交通管制でも使われてたよ(それが置き換え計画の最後の日付だった)。

私の記憶では、TFAとは逆に、PL/IまたはPL1(両方の名前が使われた)の開発は1964年かそれ以前に始まったと思う。Fortranの代替を作るつもりだったんだ。何人かはこれをFortran VやFortran VIと呼んでいたと思う。IBMは360メインフレームを展開した後、すぐにPL1を導入したけど、これは高額なハードウェアを売るのに役立つかもしれないからだろうね。ただ、言語の異なる2つのバージョンをコンパイルする2つの異なるコンパイラがあって(少なくとも20年か25年は厄介な障害物だったフォーク)、大きなメインフレーム用(モデル50以上)と経済的なミッドラインメインフレーム用があったけど、モデル20用はなかった。その時期に、Gerald WeinbergがPL1について良いことをいくつか発表して、特に並行処理に対する強い警告を出していた。IBMのバージョンとは少し異なる、学術向けに設計されたMulticsのPL1もあった。1980年代中頃にはPCで動くPL1のサブセットもあったけど、Turbo Pascalができることは何もできなかったし、でもそれをずっと遅くやってた。

PL/Iの目的は、FORTRANとCOBOLのユーザーベースを統一することだったから、両方の言語を「置き換える」ことを目指してたんだよね。PL/IからCPL言語への影響もあったし、それがBCPLやB、Cにつながったんだ。

ALGOL 68の中で「生きる」ってどんな感じなんだろうってずっと思ってたよ。あの野心と独自性のせいで。現代の視点から見て、実際に持っていることで驚くことは何だろう、逆に欠けていることで驚くことは何だろう?(奇抜な用語を除いてね。ファイルモードは「ムード」と呼ばれていて、偶然にもALGOL 68の三つの標準「チャネル」(つまりファイル)は「stand in」、「stand out」、そして「stand back」なんだ。信じられないかもしれないけど、'stdin'や'stdout'にかなり近いよ。)

基本的に、"alg*"パッケージ(algorithm2e、algorithmicx、algorithms、algpseudocode、algxpar、algpseudocodexなど)を使ってLaTeXでCS論文を書くのは、ALGO 60 / ALGO 68の世界にいるようなものだよ。大体、誰も論文で余計な説明が必要になるような標準のものは使わないよね。

ああ、APLね。70年代にネットワーク合成のEEコースで、行列の指数計算を実装する課題があったのを覚えてる。ちょうど行列代数のクラスを終えたばかりで、APLもその過程で学んだから、実装はAPLで2行だったんだ。あの頃は楽しかったなぁ…

ぜひ戻ってきてほしいな。APLはこの50年でかなり現代化してるし、データ並列処理がますます市場シェアを獲得してるから、今がタイミングかもしれないよ…

読み書きはどうなの?いつも見た感じ、Perlよりも冗長でわかりやすいものに見えたんだけど。