mokeheheのScheme日記

ツッコミ、添削大歓迎です。いろいろ教えてください。

2008-01-27

Lispでいうところのコンパイルって、マシン語になるの?

Lispでいうところのコンパイルって、ネイティブマシン語に落ちるんじゃなくてバイトコードになるだけだよね?Lispのコードがマシン語に落ちるところを想像できないんだけど…。xyzzyもそうだし503 Service Unavailable gauche仮想マシンで実行してるし。

と思ってたらGCLというGNUのCommonLispは、コンパイルするとCのソースを吐き出すらしい。マジで?単にバイトコードを実行するCソースが出るとかじゃなくて、例えば if がちゃんと分岐になったりするのかな?

たけおかたけおか2008/07/27 20:18通りすがりの者です(もう、ここはチェックしないかも)
&& Optimization of GCL/KCL を書いている者です。

> コンパイラどうなってんだ?
CommonLispならコンパイルそのものは、あんまり難しくありませんよ。直感どおりにコードを生成すればよし。インタープリタからの呼び出しも、難しくはないはず。
問題は、実行中のLispインタープリタに、コンパイルした機械語コードをリンクする、いわゆる「インクリメンタル・リンク」を実現するテクニックです。それは、OSや、リンカを十分に理解していないと、うまく実装できないでしょう。
また、もっと本質的に難しいのは、ガーベジ・コレクタが動いたときに、コンパイルド・コードとうまく共存するかです。すごく単純に言うと、コンパイルド・コードが一時的に、リスト(など)のポインタを機械語レジスタの置いたときに、ガーベジ・コレクタが、そのレジスタをチェックしないと、矛盾が生じる、というような問題が出るので。

トラックバック - http://sicp.g.hatena.ne.jp/mokehehe/20080127