3

コンパイラを使用してブートストラップしようとする関数型言語用のインタープリタを作成しました。言語は動的型システムを持ち、リスト、数字、文字列を使用します。関数でもあり、関数はその引数をリスト(perls @ _やjs引数のように)として取ります。関数はファーストクラスであり、ネストすることができます。コンパイラでどの言語をターゲットにすべきか、btw。私は静的な型付けされた命令型言語を対象としていると思います.Cのように難しいでしょう。言語は動的な型定義と関数型プログラミングをサポートすべきです(普通のlispのように、言語にはコンパイラ自体が必要です)関数言語のコンパイラバックエンド

+1

チェックアウト[QBE]を(のhttp:/ /c9x.me/compile/)。 – Agis

答えて

2

ターゲット言語から特別なサポートは必要ありません。動的ディスパッチは、汎用のバージョンの関数を使用することで解決できます(ただし、タイプが安全に推論できるときに最適化することを検討してください)。たとえばa + bの場合、generic_add(a, b)のようなコードを生成できます。generic_addは、実行時の型情報。

機能的な部分については、ラムダリフティングを使用して機能部品を除去するのは簡単です。後者の場合、各ASTノードの空き変数とバインドされた変数のリストを作成するだけで済みます。空き変数のリストは葉からルートまで構築され、境界リストは反対方向に作成されます。各ラムダノードについて、boundから自由度を減算し、明示的ラムダ引数とこの差(すなわち、キャプチャされた変数)の両方をとる新しいトップレベル関数を構築します。

また、最適化を行う場合や、言語が継続をサポートすると思われる場合は、CPS変換の使用を検討してください。

+0

Excelent答え!どうもありがとう、私は使用すると考えるべき特定の言語を呼び出すことができますか?それは非常に素晴らしいでしょう –

+0

あなたが望むランタイム機能を提供できる任意の言語を使用してください(あなたがGCを望むかもしれませんし、いくつかの特定のライブラリなど)。疑いがある場合や具体的なニーズがない場合は、Cを自由に使用してください。これは一般的な選択であり、この方法は複数の書籍やチュートリアルで十分にカバーされています。 LLVM IRを直接ターゲットにすることもできます。 –

+0

stackoverflowのようなボタンがありますか、私は本当にそれを押したいです:) –

0

LLVMやCのような低レベル言語をターゲットにしているのは、動的ディスパッチやクロージャなどを自分で実装したい限りです。しかし、あなたはJavaScriptを可能なターゲットとして言及しているので(コンパイラの不足を除いて、JSも今日の主要なブラウザではJITコンパイルされています)、Schemeについてはどうでしょうか?これは動的に型付けされた高次関数言語であり、既にネイティブコードコンパイラを持っています:http://community.schemewiki.org/?scheme-faq-standards#implementations唯一の問題は、あなたのソース言語に近すぎてコンパイラ(または "翻訳者"、私が言うかもしれない)簡単おそらく:-)

あなたがCをターゲットに喜んでいる場合は、マーク・フィーリーのチュートリアル「Cコンパイラへの90分のスキーム」であってもよいの良い出発点:。http://churchturing.org/y/90-min-scc.pdf