Clozure CLの最適化について
書きかけ:多分、加筆・訂正します。
Clozure CLは、生成するコードの最適化を、ポリシーオブジェクトというものを使って管理している。対話的なコンパイルに使われるものや、compile-fileに使われるものなど、複数のポリシーオブジェクトが存在するが、デフォルトでは全てのポリシーオブジェクトは同じ設定になっている。
ポリシーオブジェクトは構造体のようなもので、それぞれのスロットには関数が収納されている。関数は、一部の例外を除き、レキシカルな環境を引数として受け取る。イメージとしては、
#'(lambda (env)
(< (debug-optimize-quantity env) 2))
こんな感じ。コンパイラは、これらの関数が返す真偽値を元にして、最適化を行う。つまり、ポリシーオブジェクトのスロットの数の分だけ、最適化のオプションがある。
具体的な内容は以下の通り。1.6の時点での情報。項目の名前は、ポリシーオブジェクトのスロットにアクセスするマクロの名前で、動作はデフォルトのもの。
- policy.allow-tail-recursion-elimination
- 末尾再帰の最適化をするかどうか。debugが2未満のときに真。
- policy.inhibit-register-allocation
- 詳細不明。debugが3のときに真。
- policy.inhibit-event-checking
- 現状では何にも影響しない。このオプションが存在しないブランチもある。
- policy.inline-self-calls
- 詳細不明。debugが3未満のときに真。
- policy.allow-transforms
- コンパイラマクロを展開するかどうか。safety、compilation-speed、debugが3未満で、speedが1以上のときに真。
- policy.force-boundp-checks
- 詳細不明。safetyが3のときに真。
- policy.allow-constant-substitution
- 詳細不明。つねに真。
- policy.open-code-inline
- 極端に長いインストラクションをインライン展開するかどうか。speedがspaceより大きいとき真。コストの高いスペシャル変数の参照などがインライン展開される。
- policy.inhibit-safety-checking
- 引数の数、型、束縛の有無などのチェックを省くかどうか。speedが3で、safetyが0のとき真。型のミスマッチがクラッシュを引き起こす可能性がある。
- policy.trust-declarations
- 型宣言が利用されるかどうか。safetyが3未満で、speedがsafety以上のとき真。固定長整数同士の演算では型チェックが省かれ、リストへの操作は安全でないコードが生成される。それ以外の型では型特有のコードが生成されるが、policy.inhibit-safety-checkingが真でなければ、安全なコードが生成される。
- policy.declarations-typecheck
- 型宣言が実行時に行われるかどうか。safetyが3か、speedがsafety未満のとき真。theを実行時の型チェックのコードにコンパイルし、束縛や破壊的変更の際に型チェックを行うコードが挿入される。
以下参考文献。
0 件のコメント:
コメントを投稿