プログラミング言語
人間がコンピュータに対する命令を記述するための人工言語。このノートは vault 内の言語・言語理論ノートへの入口(ハブ)。
構文は主に文脈自由文法で定義され、型チェックや名前解決など意味的な処理は文脈依存以上の問題になる(→ チョムスキー階層)。
言語を分類する3つの軸
言語は単一の分類に収まらず、独立した複数の軸の組み合わせで位置づけられる。
1. 実行方式(どう動かすか)
| 方式 | 仕組み | 例 |
|---|---|---|
| コンパイル(ネイティブ) | 機械語に変換してから実行 | Rust、C、Go |
| コンパイル(バイトコード/VM) | 中間表現に変換し VM が実行 | Java、C#、Grain(WASM) |
| トランスパイル | 別の高級言語へ変換 | Almide(→Rust/TS/JS/WASM)、TypeScript |
| インタプリタ | ソースを直接解釈実行 | Ruby、Python |
| JIT | 実行時に機械語へ動的コンパイル | V8(JS)、PyPy、JVM HotSpot |
実体はグラデーション。多くの「インタプリタ言語」も内部でバイトコードへコンパイルしてから VM で回す(Ruby/CRuby、Python/CPython)。コンパイル/インタプリタは言語そのものの性質ではなく実装の選択である点に注意。
2. 型システム(誤りをいつ・どれだけ捕まえるか)
2つの独立した軸がある。よくある混同(「動的=弱い」)は誤りで、両者は直交する。
| 静的型付け(実行前に検査) | 動的型付け(実行時に検査) | |
|---|---|---|
| 強い型付け(暗黙変換を許さない) | Rust、Haskell、OCaml | Ruby、Python |
| 弱い型付け(暗黙変換が多い) | C(キャストで型を欺ける) | JavaScript("1"+1="11") |
- 静的 / 動的 = 型検査のタイミング(コンパイル時 / 実行時)。
- 強い / 弱い = 型の境界の堅さ(暗黙の型変換・型の踏み破りをどれだけ許すか)。
- 型推論(Hindley–Milner)があれば静的型付けでも注釈をほぼ書かずに済む。型理論の体系的入門は TAPL。
3. パラダイム(計算をどうモデル化するか)
| パラダイム | 計算の捉え方 | 代表 |
|---|---|---|
| 命令型 / 手続き型 | 状態の逐次的な書き換え | C、なでしこ |
| オブジェクト指向 | 状態と振る舞いを持つオブジェクトの相互作用 | Ruby、Java |
| 関数型 | 式を値に評価する。関数が第一級 | Haskell、OCaml、Clojure |
| 論理型 | 事実と規則からの導出 | Prolog |
| スタック指向 | オペランドスタックの操作 | Forth、Mind |
| 並行・アクター | メッセージを送り合う独立プロセス | Erlang / Elixir |
ほとんどの実用言語はマルチパラダイム(例:Rust は命令型+関数型+一部 OO 的)。パラダイムは言語が第一級で何を扱うか——状態・オブジェクト・関数・述語・スタック——の違いとして読める。
概念軸(言語を語るときの語彙)
言語の「動き」を理解するには3層を分けて考える。
- 構文(syntax) — 何が文法的に正しい文字列か。主に 文脈自由文法で定義し、パーサコンビネータや PDA ベースのパーサで認識する。
- 意味論(semantics) — プログラムが何を意味するか。操作的意味論(抽象機械の状態遷移として定義)/表示的意味論(数学的対象への写像)/公理的意味論(事前・事後条件)に大別。
- 評価戦略(evaluation strategy) — 式をいつ評価するか。正格(先に評価)vs 遅延、値呼び vs 名前呼び。理論的な核は λ計算の簡約順序。
型システムは構文と意味論の橋渡し——カリー=ハワード対応では「型=命題、プログラム=証明」となり、言語理論と論理学が一致する。
このナレッジベースにある言語
- Almide — LLM コード生成に最適化。Rust/WASM にコンパイル
- Rust — 所有権システムで GC なしメモリ安全。システムプログラミング
- Ruby — プログラマの幸福を一次価値にした動的型付け言語
- LISP — コード = データ。1958年生まれ
- Grain — WebAssembly ネイティブの関数型言語。LLVM 不使用
- Forth — スタック指向の元祖。1970年
- Mind — 日本語 × スタック指向
- なでしこ — 日本語 × 手続き型
押さえどころ(カード化候補)
- 3つの分類軸 → 実行方式(コンパイル/VM/トランスパイル/インタプリタ/JIT)・型システム・パラダイムは独立。一言語は各軸での座標の組み合わせ。
- コンパイル/インタプリタは実装の選択 → 言語の性質ではない。Ruby も Python も内部はバイトコードへコンパイルして VM で回す。
- 静的/動的 と 強い/弱い は直交 → 前者は型検査のタイミング、後者は暗黙変換の許容度。「動的=弱い」は誤り(Python は動的かつ強い)。
- 概念3層 → 構文(CFG で定義)/意味論(操作的・表示的・公理的)/評価戦略(正格 vs 遅延、λ計算の簡約順序)。
- マルチパラダイムが主流 → パラダイムは「第一級で何を扱うか」(状態・オブジェクト・関数・述語・スタック)の違い。
- 理論への接続 → 構文は チョムスキー階層、型は TAPL / カリー=ハワード、関数型は λ計算に根を持つ。
関連
言語理論・形式の基盤
- チョムスキー階層 — 構文の表現力の形式的分類。言語の文法は主に Type 2
- λ計算 — 関数型言語と評価戦略の理論的基盤
- 簡約 — 式を値に書き換える計算のステップ(評価戦略の核)
- 抽象機械 — 操作的意味論を状態遷移で与える(SECD/CEK 等)
型・論理
- TAPL — 型とプログラミング言語の標準教科書
- Hindley–Milner — 注釈なしで型を推論する関数型言語の型推論
- カリー=ハワード対応 — 型=命題、プログラム=証明。言語理論と論理の一致
パラダイム
パーサ・構文処理
- パーサコンビネータ — 小さなパーサを合成して文法を認識する
- プッシュダウン・オートマトン — Type 2(CFG)を受理する機械。構文解析の理論的土台