2008-01-27
■ Lispでいうところのコンパイルって、マシン語になるの?
Lispでいうところのコンパイルって、ネイティブのマシン語に落ちるんじゃなくてバイトコードになるだけだよね?Lispのコードがマシン語に落ちるところを想像できないんだけど…。xyzzyもそうだしコンパイラ - karetta.jp gaucheも仮想マシンで実行してるし。
と思ってたらGCLというGNUのCommonLispは、コンパイルするとCのソースを吐き出すらしい。マジで?単にバイトコードを実行するCソースが出るとかじゃなくて、例えば if がちゃんと分岐になったりするのかな?
- Optimization of GCL/KCL おぉ、完全にネイティブになってる、すごい。コンパイラどうなってんだ?
トラックバック - http://sicp.g.hatena.ne.jp/mokehehe/20080127
&& Optimization of GCL/KCL を書いている者です。
> コンパイラどうなってんだ?
CommonLispならコンパイルそのものは、あんまり難しくありませんよ。直感どおりにコードを生成すればよし。インタープリタからの呼び出しも、難しくはないはず。
問題は、実行中のLispインタープリタに、コンパイルした機械語コードをリンクする、いわゆる「インクリメンタル・リンク」を実現するテクニックです。それは、OSや、リンカを十分に理解していないと、うまく実装できないでしょう。
また、もっと本質的に難しいのは、ガーベジ・コレクタが動いたときに、コンパイルド・コードとうまく共存するかです。すごく単純に言うと、コンパイルド・コードが一時的に、リスト(など)のポインタを機械語レジスタの置いたときに、ガーベジ・コレクタが、そのレジスタをチェックしないと、矛盾が生じる、というような問題が出るので。