2011-07-29 15 views
7

私は、HaskellのバックエンドとしてLLVMを使った単純な遅延関数言語を実装しています。私はSimon Peyton Jones( "関数型プログラミング言語の実装"と "関数型言語の実装:チュートリアル")によって書かれた2つの本を読んで、それに基づいてG-Machine compiler and interpreterを実装しました。GマシンのソースをLLVMに変換するIR

私は現在、G-Machine命令からLLVM IRコードを生成する問題に取り組んでいます。主な問題は、G-Machineがスタックマシンであるのに対し、LLVM IRは登録マシンであるということです。したがって、G-MachineをLLVM IRに変換するには、LLVM IRに何らかの実行時スタックを維持する必要があります(私が間違っていれば修正してください)。私は、IR命令を使って後続のスタックノードをLLVMスタックに割り当てることを考えていましたが、そのスタックをリンクリスト形式で作成する必要がありました。各スタック要素に前のものへのポインタがあり、ヌルポインタ。しかし、このアプローチはあまり最適ではなく、G-Machineからの「プッシュn」操作の場合、優先O(1)の代わりにO(n)の複雑さを持ちます。他のアイデアは、単一のセルの代わりにメモリのブロック全体を割り当てることです。

私の質問は、私の問題を解決するためのより良い/異なる方法があるかどうかです。

+1

代わりSTGマシンを実装していないため、任意の理由があるのでしょうか?言うまでもなく、あなたが参照できるSTGからLLVMへのコンパイラは既にあります。 –

+1

さて、Gマシンは素敵でシンプルです。そしてクラシック。 – augustss

答えて

9

リンクリストスタックを実行しないでください。狂っています。使用された固定メモリブロック。あなたはポインタスタックと非ポインタスタックを使うことができ、ポインタではヒープを指すことを意味します。 GCのルートはすべてポインタスタック上にあるので、ガベージコレクションはかなり簡単です。

LLVMレジスタには、ヒープポインタ、ヒープリミットポインタ、2つのスタックポインタがあります。

あなたが運が良ければ、LLVMオプティマイザは非効率なスタック操作を効率的なレジスタ操作に変えます。

関連する問題