実行モデル

実行モデル

執筆済 コンピュータ言語

プログラムが「どう動くか」の抽象的な規定。

同じ構文でも、実行モデルが違えば結果が変わる。

評価戦略#

戦略 内容 採用言語
正格評価 引数を先に評価する ほとんどの言語
遅延評価 必要になるまで評価しない 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
ノート一覧を閉じる