0502デフォルトの名無しさん
2017/09/18(月) 01:25:42.89ID:+b1AQYPX関数型言語の計算モデルであるラムダ計算モデルを単純に実装すると、
常に(「関数」ではなく)クロージャがヒープ上へ動的に生成され、
最終的にガーベジコレクションによって回収される
これはSICP本にあるような初歩的な関数型言語インタプリタ実装や
初期のLISP処理系実装で見ることができる
で、現在の最適化技術が反映された関数型言語処理系では
「クロージャ変換」と呼ばれる技術が使われていて、
単に束縛変数(いわゆる関数の仮引数)だけを参照する関数は
手続き型言語と同様にスタック上へ引数が割り当てられ、
本当に必要な時しかヒープを消費しないよう設計されている
その概略はTiger本に解説がある
なお、Haskellのような純粋関数型言語では「ラムダリフティング」と
呼ばれる技術によってクロージャ変換と同様な最適化が実現されているらしいけど、
自分は知らない