七つのプログラミングの原言語 (2022)
13時間前原文(madhadron.com)
概要
- プログラミング言語学習の本質は基礎的なパターンの理解
- 世界の主要な言語群は**7つの「元言語(ur-languages)」**に分類可能
- それぞれのur-languageは独自の思考様式・記述法を持つ
- 新しい言語の学習難易度は同系統かどうかで大きく異なる
- 各ur-languageの特徴・代表例・歴史を簡潔に解説
主要なプログラミング元言語(ur-languages)とその特徴
- プログラミング言語選びで迷う人が多いが、実は根本的な発想やパターンが重要
- ほとんどの言語は7つの元言語のどれかに系譜を持つ
- 代表的な元言語とその特徴を以下に整理
ALGOL系(命令型言語の祖)
- 代入・条件分岐・ループを中心とした構造
- 関数による整理、モジュール・例外処理・多態性などの拡張も多い
- C, Java, Python, C++, Fortran, Pascal, Ada, JavaScript, Rubyなど多数がこの系統
- 歴史:Ada Lovelaceの解析機関プログラムから始まり、Fortran・COBOL・ALGOL 60の登場で確立
- 特徴:他の言語からの機能取り込みも多く、最も普及している系統
Lisp系(リスト処理・マクロ言語)
- 括弧で囲む前置記法とリスト構造が基本
- プログラム自身がリスト(データ)として扱えるため、マクロによる言語拡張が容易
- 代表例:Common Lisp, Scheme, Clojure, Emacs Lisp, AutoLISP
- 歴史:1958年John McCarthyによる誕生。AI分野で一時隆盛。AI冬の時代も生き残る
- 特徴:言語自体の構文や意味を自在に拡張できる柔軟性
ML系(関数型言語)
- 関数が第一級値、Hindley-Milner型推論による強力な型システム
- 反復処理は再帰、もしくは高階関数(map, foldなど)で表現
- 代表例:Standard ML, OCaml, Haskell, Agda, Idris
- 歴史:定理証明支援のために開発。ヨーロッパで普及
- 特徴:型安全性、遅延評価(Haskellなど)、型拡張の発展
Self系(オブジェクト指向言語)
- 全てがオブジェクト、メッセージ送信による動作
- クラスの有無でSmalltalk(クラスあり)とSelf(クラスなし)に分岐
- 代表例:Smalltalk, Self, JavaScript(Self系のクラスレスモデル)
- 歴史:Xerox PARCでSmalltalk誕生、Selfでクラスレス化。JavaのJITもこの流れから
- 特徴:オブジェクト間の動的な振る舞い変更、ライブ環境での開発
Forth系(スタック言語)
- スタックベースの逆ポーランド記法(RPN)
- 関数(ワード)定義や構文自体の再定義が容易
- 代表例:Forth, PostScript, Factor, Joy
- 歴史:1970年に天文台制御用として誕生、組込み系やプリンタ制御で普及
- 特徴:小規模・高速・自己拡張性に優れる
APL系(配列言語)
- 全てがn次元配列、記号的な高階演算子による表現
- コードが非常に短く抽象的になりがち
- 代表例:APL, J, K, Q
- 歴史:1960年代に数学的配列処理のため開発、金融や統計分野で活躍
- 特徴:大量データの高速処理、独特な記号体系
Prolog系(論理型言語)
- 事実と規則を宣言し、論理推論で目的を達成
- プログラムは命題論理・述語論理の記述
- 代表例:Prolog, Mercury, Datalog
- 歴史:1972年フランスでAI研究の一環として誕生
- 特徴:探索・推論処理に強み、AI・知識表現分野で利用
ur-languageごとの学習・応用のポイント
- 同系統の言語同士は、習得コストが低くスムーズな移行が可能
- 異系統の言語は、根本的な思考パターンの切り替えが必要で、学習コストが大きい
- 基礎パターン(ループ、再帰、データ構造操作など)を身につけることが最重要
- 言語選択に迷うより、まずどの系統かを意識して始めることが大切
まとめ
- プログラミング言語は見た目が違っても、根底にある考え方(ur-language)が重要
- 自分が習得したい分野や用途に合った系統を選ぶことで、効率的な学習が可能
- 基礎パターンの習熟が、どんな新しい言語にも応用できる普遍的な力となる