概要
- プログラミング言語学習の本質は 基礎的なパターン の理解
- 世界の主要な言語群は 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)が重要
- 自分が習得したい分野や用途 に合った系統を選ぶことで、効率的な学習が可能
- 基礎パターンの習熟 が、どんな新しい言語にも応用できる普遍的な力となる