高レベルのオブジェクト指向のガベージ コレクション プログラミング言語を設計していますが、テンプレートの作成方法に問題があります。.NET や JVM に似た VM タイプのシステムを作成する予定です (ただし、内部では LLVM を使用します)。問題は、強力な C++ ライクなテンプレートが必要であるが、動的リンクが必要なことです (そのため、テンプレート ライブラリを使用するすべてを再コンパイルせずにテンプレート ライブラリを置き換えることができます)。テンプレートの定義がなくてもソース ファイルをコンパイルできるようにしたいと考えています。JIT 時のコード生成は最小限に抑える必要があります。
私が考えているオプションは次のとおりです。
- 各コンパイル単位に静的にリンクされたテンプレート ライブラリの概念を持っています。テンプレート ライブラリは基本的に、テンプレートがインスタンス化されるときに空白が埋められる AST のようなものです。これに関する問題は、2 つのファイルが異なるバージョンのテンプレート ライブラリでコンパイルされた場合、互換性がないか、テンプレート ライブラリにバグがある場合、すべてを再コンパイルする必要があることです。これが C++ のやり方です。
- JIT 時にリンクされるテンプレート ライブラリを用意します。これはほとんどの問題を解決しますが、IR が基本的に AST である必要があります。IRのレベルをもっと低くしてほしい。これには、JIT を行うためにより多くの作業が必要です。
- 型のみを引数として持つ弱い C# のようなジェネリックを使用します。これは非常に制限的ですが、単純なコード生成と動的リンクを可能にします。
私が考えていない他の良い方法はありますか?私は最初のオプションに傾いていますが、どのオプションもあまり好きではありません。最良の選択肢は何だと思いますか?