2


0

私は、高水準の、オブジェクト指向の、ガベージコレクションのプログラミング言語を設計しています。そして、テンプレートの作成方法に問題があります。 私は.NETやJVMに似たVMタイプのシステムを作成することを計画しています(ただし、内部ではLLVMを使用します)。 問題は、私は強力な、Cのようなテンプレートが欲しいのですが、動的リンクを使うことです(それで、それを使うものすべてを再コンパイルせずにテンプレートライブラリを置き換えることができます)。 テンプレートを定義せずにソースファイルをコンパイルできるようにしたいです。 JIT時のコード生成は最小限に抑えるべきです。

私が考えているオプションは次のとおりです。

  • 各コンパイル単位に静的にリンクされているテンプレートライブラリの概念があります。 テンプレートライブラリは基本的に、テンプレートがインスタンス化されたときに空欄が埋められるASTのようなものです。 これに関する問題は、2つのファイルが異なるバージョンのテンプレートライブラリでコンパイルされている場合、それらは互換性がないか、またはテンプレートライブラリにバグがある場合、すべてを再コンパイルする必要があることです。 これがCのやり方です。

  • JIT時にリンクされているテンプレートライブラリを用意してください。 これはほとんどの問題を解決しますが、IRが本質的にASTであることを必要とします。 IRをもっと低いレベルにしたいのですが。 これにはJIT作業にもっと多くの作業が必要です。

  • 引数として型のみを持つ、弱虫のC#のような総称を持ってください。 これは非常に制限的ですが、簡単なコード生成と動的リンクを可能にします。

私が考えていない他の良い方法はありますか? 私は最初の選択肢に傾いていますが、私は選択肢のどれも本当に好きではありません。 あなたは何が最良の選択肢だと思いますか?

4 回答


1


私はそれがあなたが望む専門化の量に依存すると思います。 テンプレートのコンパイラがいかに強力でなければならないか。

cを見ると、コンパイラーはあらゆる種類の空想的なことを実行できます(再帰によるサブクラスの生成、おそらくフラクタル継承グラフの計算、およびPiの数の計算など)。

あなたがその力が欲しいなら、あなたはおそらく強力なハイレベルのJITが必要です。 FWIW、それはクールだと思います。 (完全なコンパイラをランタイムに含めるだけです。)


0


言語の残りの部分に少し依存します…​ もしあなたが演算子のオーバーロード、値の型などを持っているなら、Cルートをたどらないことで問題を本当に複雑にしています(そしておそらく大きな最適化の機会を見逃しています)。最大の専門化を許可する時間。

Cテンプレートは基本的にはマクロの一種なので、コードを生成する前に、複製によって生じる膨大な量の大部分を減らすことができます。

テンプレートタイプ(少なくともC言語で)は、他のすべてのコードの根底にある最もコアなタイプになる傾向があります。他のコードと互換性があると仮定すると、それ以外のコードは変更できません。


0


あなたが達成しようとしていることはほとんど不可能です。 テンプレート定義とそれらのテンプレートを使用するコードの両方のためにあなたの言語の高水準表現のほとんどすべてを残して、そしてほとんど処理されたレベルのわずかに処理されたソースコードからJITコンパイルを実行しなければなりません。 それで問題なければ、残りのコンパイラを本当に簡単なものにしておく必要があります。そうすると、ヘビー級のLLVM最適化を使用することはできなくなります。 他の方法はありません、テンプレートメタプログラミングは高レベルの情報の可用性に依存します。


0


これらのテンプレートがどれほど強力になるかについて考えてください。 ジャストインタイムでコンパイルされる言語を持つということは、ロード時と実行時に多くの重い作業が必要になることを意味します。 したがって、テンプレートを強力にするほど、テンプレートから得られるパフォーマンスは低下します。

'' '' '

あなたが本当にそのパスに行くつもりなら、 Macke Suggestedのようにランタイムにコンパイラを含めることもできます。 実際にこれを行う言語はたくさんあります。

こうすることによって、あなたはあなたの言語の実装を「解釈された」あるいは部分的に「解釈された」ものにしています。 これらの用語では、テンプレートはmatch-replace-evalの単なる派手なドレスであり、それには問題があります。テンプレートは動的言語でそのように動作することがよくあります。 最後にそれが電力対パフォーマンスになることを覚えておいてください。

'' '' '

注:この種の決定に直面したとき、少し後退する価値があるかもしれません。 ユースケースを識別し、それらに優先順位を付け、設計から実装方法を切り離して、実装が麻痺の原因になることなく設計を繰り返すことができるようにします。

何度もデザインを拡張して、より多くのユースケースをカバーしながら、最適なデザインを決定します。 あなたが好きなデザインにたどり着いたならば、あなたはそれを繰り返すことができ、それからあなたはその実装についても繰り返すことができます。 この方法論では、より重要なケースを最初にカバーすることができます。

はい、私は反復増分方法論を提案しています。 この質問は言語の設計に関するものですが、実装については非常に懸念されるようです。 アイデアを根拠にしておくことが必要です。さもなければあなたは極端のうちの1つ(高性能の解決策のために残念なパフォーマンスまたはテンプレートなしではあまりにも強力すぎる)に陥るでしょう。