コンパイラを使用してブートストラップしようとする関数型言語用のインタープリタを作成しました。言語は動的型システムを持ち、リスト、数字、文字列を使用します。関数でもあり、関数はその引数をリスト(perls @ _やjs引数のように)として取ります。関数はファーストクラスであり、ネストすることができます。コンパイラでどの言語をターゲットにすべきか、btw。私は静的な型付けされた命令型言語を対象としていると思います.Cのように難しいでしょう。言語は動的な型定義と関数型プログラミングをサポートすべきです(普通のlispのように、言語にはコンパイラ自体が必要です)関数言語のコンパイラバックエンド
答えて
ターゲット言語から特別なサポートは必要ありません。動的ディスパッチは、汎用のバージョンの関数を使用することで解決できます(ただし、タイプが安全に推論できるときに最適化することを検討してください)。たとえばa + b
の場合、generic_add(a, b)
のようなコードを生成できます。generic_add
は、実行時の型情報。
機能的な部分については、ラムダリフティングを使用して機能部品を除去するのは簡単です。後者の場合、各ASTノードの空き変数とバインドされた変数のリストを作成するだけで済みます。空き変数のリストは葉からルートまで構築され、境界リストは反対方向に作成されます。各ラムダノードについて、boundから自由度を減算し、明示的ラムダ引数とこの差(すなわち、キャプチャされた変数)の両方をとる新しいトップレベル関数を構築します。
また、最適化を行う場合や、言語が継続をサポートすると思われる場合は、CPS変換の使用を検討してください。
Excelent答え!どうもありがとう、私は使用すると考えるべき特定の言語を呼び出すことができますか?それは非常に素晴らしいでしょう –
あなたが望むランタイム機能を提供できる任意の言語を使用してください(あなたがGCを望むかもしれませんし、いくつかの特定のライブラリなど)。疑いがある場合や具体的なニーズがない場合は、Cを自由に使用してください。これは一般的な選択であり、この方法は複数の書籍やチュートリアルで十分にカバーされています。 LLVM IRを直接ターゲットにすることもできます。 –
stackoverflowのようなボタンがありますか、私は本当にそれを押したいです:) –
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
- 1. C言語のstrcat関数
- 2. C言語の関数ポインタ
- 3. 関数デコレータ(C言語)#
- 4. アセンブリ言語関数2ループ
- 5. 関数は、Cプログラミング言語
- 6. cプログラミング言語 - declare()関数
- 7. C言語の変数と関数
- 8. 関数言語をC言語にコンパイルする
- 9. 他の言語のgetDate関数?
- 10. HQL言語の関数の合計
- 11. C言語での関数のモック?
- 12. 用語:フォワード宣言と関数のプロトタイプ
- 13. jsf式言語(el)クラス関数のライフスコープ
- 14. go言語での再帰関数
- 15. C言語の基本関数
- 16. 変数に関する概念言語
- 17. C言語で関数をシリアライズ
- 18. パワークエリM言語とExcel関数
- 19. R言語の関数の引数は、線形モデル関数では、データファイル
- 20. C言語の動的関数の引数を扱う
- 21. ElfinderClientサーバーAPIアラビア語関連リンク言語
- 22. 数学関数がC言語の "make"で動作しない
- 23. なぜC言語のgetchar()関数が整数ですか?
- 24. デバイス関連リンク言語(ロケール)
- 25. 複数言語IDE
- 26. 数理プログラミング言語
- 27. エラーメッセージC言語での変数宣言
- 28. 複数のJava言語レベル
- 29. i18nextの言語変数
- 30. メタルシェーディング言語のグローバル変数
チェックアウト[QBE]を(のhttp:/ /c9x.me/compile/)。 – Agis