2

非型パラメータを持ついくつかのテンプレート クラスがあるとします。

template <int hi, int wid>
class SomeThing {
...
}

と の値を指定して、このソースを削減するツールを作成する必要がhiありwidますhi=2; wid=3。順次、一部のコードがデッド コードになる可能性があり、ツールはそれらを切り捨てる必要もあります。したがって、最終的には、縮小されたソース コードがツールの出力として表示されることを期待しています。これを行う既知の方法はありますか?より難しい方法は、独自の C++ パーサーを作成することかもしれません...単純化されたものでさえひどいように聞こえます。

gcc-xml や clang など、解析して解析しやすい中間ファイルを生成できるツールがあることは知っています。ただし、そこから c++ ソース ファイルを再生成するだけでは十分ではないようです。

[編集] 全体像は、変数の置換とデッド コードの切り捨てを使用して、ソース コードからソース コードを生成するツールを作成することです。

4

2 に答える 2

5

あなたの質問を完全に理解できたかどうかはわかりませんが、テンプレートの専門化はあなたのニーズに答えますか?

template<>
class SomeThing<2, 3> {
    //trimmed content
};

値 2 と 3 でインスタンス化SomeThingすると、特殊化がコンパイラによって選択され、生成された実行可能ファイルには「切り捨てられた」コンテンツのみが含まれます。


編集

あなたの編集に基づいて、C++ 用の部分的なエバリュエーター、つまり、プログラムとその入力の一部を受け取り、評価できるすべてのものが評価されたプログラムの特殊なバージョンを生成するプログラムが必要だと思います。 .

ネイティブ C++ の既存の実装については知りません。ただし、多くの関数型言語だけでなく、Pascal と C の部分エバリュエーターも見つけることができます。C++/CLI を部分的に評価するために使用できる .Net バイトコード (MSIL) の部分エバリュエーターを作成する作業がいくつか行われています。[チェポフスキーら。2003 ]

C++ テンプレート メカニズムは、限定された種類の部分評価と見なすことができます。これは、コンパイラがテンプレート パラメーターで特殊化された (部分的に評価される可能性がある) コードを生成するためです。ただし、これはすべてコンパイラによって内部的に実行されるため、視覚化できる中間の C++ ソース コードはありません。ただし、生成されたアセンブリ コードを確認することはできます。これにより、テンプレートのインスタンス化中にコンパイラによって実行される操作/評価/最適化の良いアイデアが得られます。

于 2012-04-27T09:00:04.613 に答える
1

テンプレートコードは一般的にチューリング完全であるため、これを行うためのクリーンな方法はありません。

非常に簡単な例として、

template<int I>
class X : public X<I/2>
{
};

ここで、これを減らしたいとしましょうI==351。基本クラスは正確に何である必要がありますか?実際のコードの場合、完全なC++コンパイラが必要になります。さらに悪いことに、一致する標準ライブラリの実装と、準拠しているすべての標準ライブラリの実装を完全に表すものも必要になります(!!)

次のコードを検討してください。

template <int I>
class X : public std::vector<X<I/2> >
{
  // Methods
};

デッドコードの除去は、の実装に依存しますstd::vector。実装が異なる場合、実際に必要なコードを誤って削除してしまう可能性があります。

于 2012-04-27T09:45:30.487 に答える