プログラミング言語

人間がコンピュータに対する命令を記述するための人工言語。このノートは 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、OCamlRuby、Python
弱い型付け(暗黙変換が多い)C(キャストで型を欺ける)JavaScript("1"+1="11")

3. パラダイム(計算をどうモデル化するか)

パラダイム計算の捉え方代表
命令型 / 手続き型状態の逐次的な書き換えC、なでしこ
オブジェクト指向状態と振る舞いを持つオブジェクトの相互作用Ruby、Java
関数型式を値に評価する。関数が第一級Haskell、OCaml、Clojure
論理型事実と規則からの導出Prolog
スタック指向オペランドスタックの操作Forth、Mind
並行・アクターメッセージを送り合う独立プロセスErlang / Elixir

ほとんどの実用言語はマルチパラダイム(例:Rust は命令型+関数型+一部 OO 的)。パラダイムは言語が第一級で何を扱うか——状態・オブジェクト・関数・述語・スタック——の違いとして読める。

概念軸(言語を語るときの語彙)

言語の「動き」を理解するには3層を分けて考える。

型システムは構文と意味論の橋渡し——カリー=ハワード対応では「型=命題、プログラム=証明」となり、言語理論と論理学が一致する。

このナレッジベースにある言語

押さえどころ(カード化候補)

関連

言語理論・形式の基盤

型・論理

パラダイム

パーサ・構文処理

Graph