実行モデル
プログラムが「どう動くか」の抽象的な規定。
同じ構文でも、実行モデルが違えば結果が変わる。
評価戦略#
| 戦略 | 内容 | 採用言語 |
|---|---|---|
| 正格評価 | 引数を先に評価する | ほとんどの言語 |
| 遅延評価 | 必要になるまで評価しない | Haskell |
| 名前呼び | 使うたびに評価する | マクロ |
遅延評価だと無限リストが扱えるが、 いつ計算されるかが分かりにくく、 メモリ使用量が予測しにくい。
メモリモデル#
| 方式 | 内容 |
|---|---|
| 手動管理 | malloc / free。C |
| GC | 到達不能なオブジェクトを自動回収。Java、Go、JS |
| 参照カウント | 参照数が 0 で解放。Swift、Python |
| 所有権 | コンパイル時に寿命を決定。Rust |
Swift の ARC は参照カウントをコンパイラが挿入する方式で、
GC の停止時間が無い代わりに循環参照が漏れる。
weak / unowned が必要になるのはこのため。
Rust は所有権と借用検査により、 実行時コストなしでメモリ安全を達成する。 代わりにコンパイラを納得させる必要がある。
並行モデル#
| モデル | 内容 |
|---|---|
| スレッド + 共有メモリ | 素朴だが競合しやすい |
| イベントループ | 単一スレッドで非同期。JS |
| async/await | 継続を言語機能にする |
| CSP | チャネルで通信。Go |
| アクター | メッセージのみで状態を持つ。Erlang、Swift |
並行・並列処理を参照。
実行モデルと性能#
実行モデルは意味の規定だが、性能に直結する。 遅延評価はサンクの生成コスト、 GC は停止時間、 参照カウントはカウンタ更新のコストを伴う。 ただ乗りできる抽象は無い。
参考文献#
- Daniel P. Friedman, Mitchell Wand. Essentials of Programming Languages, 3rd ed. MIT Press, 2008.
- Richard Jones, Antony Hosking, Eliot Moss. The Garbage Collection Handbook, 2nd ed. CRC Press, 2023.
- Ralf Jung et al. RustBelt: Securing the Foundations of the Rust Programming Language. POPL, 2018. https://doi.org/10.1145/3158154