Hobbit

-> 英語

-> フランス語

2003年 8月11日 月曜日 15:43:32 JST

目次

hobbitの概要

hobbitはSchemeコードをSCMのネイティブコードであるCコードに変換 してSCMに組み込むためのトランスレータで、SCMディストリ ビューションに含まれています。
Lambda-lifting as an optimization for compiling Scheme to C (SchemeをCに コンパイルする場合の最適化の一方法としてのラムダ持ち上げ)とし て開発され、もともとは



	  (hobbit "Schemeソースファイル" ...)

        
のように使用して、6回のパスででSchemeソースコードをCソースコー ドに変換したテキストファイルを出力するものでした。現在はSCMの'compile' 環境に統合されて、コンパイル済みオブジェクトファイルを出力でき るようになっています。

手続きが参照し、手続き内部で定義されていない変数は自由変数 (free variable) と呼ばれます。自由変数を消去して変数の値をロー カルに決定できるようにするために、hobbitは再帰的にラムダ持ち上 げ(lambda-lifting)を使用してローカルな手続きをトップレベルの定 義まで持ち上げます。その際ラムダ持ち上げできない変数が手続き内 にある場合は最適化の程度が制限されます。

SCMのSchemeプリミティブはC関数で実現されていますが、Schemeで作 成される手続きは、手続き本体と手続きが作成された環境を合わせ持 つクロージャとして実現されます。Scheme手続きが評価されるときに は、プログラム内で手続きが評価される環境(コンティニュエーショ ン)が参照されます。Schemeで書かれた手続きをCコードとして実行す る場合は、手続きと環境を渡してapply関数を呼び出す必要があり、 これは計算を伴う作業ですので、Scheme手続きを単純にCコードに移 し変えただけではオーバヘッドが大きくなります。hobbitはSchemeで 作成された手続きをC関数に写像するにあたって環境渡しを避け、 Scheme手続きの構造を保ったままで可能な限り裸のC関数呼び出しに 変換します。hobbitはその他にも、Schemeプログラムを可能な限り計 算量が少ないCプログラムに近づけるような最適化を行ないます。詳 細はhobbit.info参照。

hobbitは、r4rsのキーワードとSCMの拡張キーワードの一部を認識し ます。hobbitが認識するSchemeキーワードは、hobbit.scmの *standard-s->c-fun-table*などで確認できます。