3imp を読み直す - Scheme VM を書く
4.7.2 の Direct Function Invocations が微妙に言い回しが難しかかった*1ので全訳(学生nさんと学生mさんに助言を頂きました)。
It is possible to optimize direct function invocations, which usually result from let expressions, to avoid creating a closure and performing the function call.
let 式に由来する場合が多い、関数の直接呼び出し(※)は Closure の作成、関数の実行をカットすることによる最適化が可能である。
The variables of a direct lambda invocation
correspond to the local declared variables of a block in Algol 60 or C.
lambda 式を直接実行する場合の変数は Algol 60 や C言語でいうところのブロックで宣言されたローカル変数にあたる。
Rather than forcing the creation of a closure and call frame, the compiler can generate code to place these local variables into stack locations within the call frame.
closure と call frame 作るかわりに、コンパイラはスタックの call frame にこれらのローカル変数を配置するようなコードを吐くことが可能である。
The compiler save
does this either by saving space in the call frame or by extending the call frame
as needed.
call frame にあらかじめスペースを確保しておくか、必要に応じて call frame を拡張することでコンパイラはローカル変数を保存する。
In Algol 60 or C this saves the allocation of a call frame on the stack. In
Scheme, this saves collecting the values of the free variables of the directly-applied
lambda expression and the allocation required to create the closure object.
Algol 60 や C言語ではこの手法により、スタック上にある call frame のメモリ割り当てを抑える。
またこの手法を使えば、Schemeでは、直接実行された lambda 式から見た free 変数の値を集めることや、closure オブジェクトを作るために必要なメモリ割り当てを抑えることが出来る。
訳注
※直接呼び出し
(let ([a 3]) (+ a 4))
このような let は
((lambda (a) (+ a 4)) 3)
のように lambda 式の直接実行に変換できるという文脈です。
*1:他動詞としてのsaveは意味が多すぎる、保存する、節約する、残す、確保しておくなど