8

以前は、OpenC ++(http://opencxx.sourceforge.net/opencxx/html/overview.html)を使用して次のようなコード生成を実行していました。

ソース:

class MyKeyword A {
  public:
    void myMethod(inarg double x, inarg const std::vector<int>& y, outarg double& z);
};

生成:

class A {
  public:
    void myMethod(const string& x, double& y);
    // generated method below:
    void _myMehtod(const string& serializedInput, string& serializedOutput) {
      double x;
      std::vector<int> y;
      // deserialized x and y from serializedInput
      double z;
      myMethod(x, y, z);
    }
};

この種のコード生成は、処理用のメタレベルプログラムを作成することにより、OpenC ++のチュートリアル( http://www.csg.is.titech.ac.jp/~chiba/opencxx/tutorial.pdf )のユースケースと直接一致します。 「MyKeyword」、「inarg」、「outarg」とコード生成を実行します。ただし、OpenC ++は古く、現在は非アクティブであり、私のコードジェネレーターはg ++ 3.2でのみ動作し、より高いバージョンのg++のヘッダーファイルの解析でエラーをトリガーします。

VivaCoreを見てきましたが、メタレベルのプログラムをコンパイルするためのインフラストラクチャを提供していません。LLVMも調べていますが、ソースからソースへのコンパイルの使用法を理解するための指導を行うドキュメントが見つかりません。ROSEコンパイラフレームワークも知っていますが、それが自分の使用法に適しているかどうか、独自のC ++フロントエンドバイナリを商用製品で使用できるかどうか、Windowsバージョンが利用可能かどうかはわかりません。

特定のチュートリアル/論文/ドキュメントへのコメントやポインタは大歓迎です。

4

3 に答える 3

3

すぐに使用できるソリューションはわかりませんが、比較的少ない労力で独自のソリューションを構築できます。考えられるオプションの1つは、Elsa C ++パーサーです。これは少し古くなっていますが、使いやすく、非常に拡張可能です。もう1つのオプションは、Clang++によって生成されたXMLASTを改ざんすることです。私はさまざまなシナリオで両方のアプローチを使用しました。

于 2010-05-24T15:35:30.447 に答える
0

テンプレートメタプログラミングの実践を知っていますか?これまで使用したことがない場合は、C++プリプロセッサを適用してC++よりもLISPのように感じる奇妙なメタプログラムを作成します。考え方は上記と同じです。特定の入力に基づいて繰り返しコードを生成するプリコンパイルステップがあります。ただし、すべてコンパイル時に実行されます(OpenC ++は実行時にいくつかのことを実行するように見えます)。

とにかく新しいものを学ぼうとしているように見えることを考えると、それを代わりの「言語」として使用しても構わないと思いますか?

Boostは、上記のように、この手法を使用して簡単にシリアル化できるライブラリを提供します。 そのマニュアルのチュートリアルから

/////////////////////////////////////////////////////////////
// gps coordinate
//
// illustrates serialization for a simple type
//
class gps_position
{
private:
    friend class boost::serialization::access;
    // When the class Archive corresponds to an output archive, the
    // & operator is defined similar to <<.  Likewise, when the class Archive
    // is a type of input archive the & operator is defined similar to >>.
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & degrees;
        ar & minutes;
        ar & seconds;
    }
    int degrees;
    int minutes;
    float seconds;
public:
    gps_position(){};
    gps_position(int d, int m, float s) :
        degrees(d), minutes(m), seconds(s)
    {}
};

int main() {
    // create and open a character archive for output
    std::ofstream ofs("filename");

    // create class instance
    const gps_position g(35, 59, 24.567f);

    // save data to archive
    {
        boost::archive::text_oarchive oa(ofs);
        // write class instance to archive
        oa << g;
        // archive and stream closed when destructors are called
    }

    // ... some time later restore the class instance to its orginal state
    gps_position newg;
    {
        // create and open an archive for input
        std::ifstream ifs("filename");
        boost::archive::text_iarchive ia(ifs);
        // read class state from archive
        ia >> newg;
        // archive and stream closed when destructors are called
    }
    return 0;
}
于 2010-05-24T07:07:55.690 に答える
0

あなたは私たちのDMSソフトウェアリエンジニアリングツールキットを検討するかもしれません。DMSは、任意の言語のソーステキストをコンパイラデータ構造(AST、シンボルテーブル、制御フローグラフ、データフローグラフ)に解析するための一般的な基盤です。

DMSは、汎用のソースからソースへのプログラム変換システムです。ソースからソースへのパターン指向変換を適用するか、手続き型変換(OpenC ++によく似ています)を記述してから、変換されたプログラムに対応するコンパイル可能なソーステキストを再生成できます。

DMSは、明示的な言語定義によってパラメーター化され、C、C#、COBOL、Java、Python、javascript、Fortranを処理します。

完全なC++フロントエンドがあり、C ++の多くの実際の方言(ANSI、GNU、MS)を、完全な名前と型の解決で処理します。C ++フロントエンドを備えたDMSは、複数のコンパイルユニット内および複数のコンパイルユニット間で「メタプログラム」によって制御される変換を実行できます。これは、最終的にUAVで使用されるミッションアビオニクスソフトウェア(Webサイトの論文を参照)の大規模な再設計を含む、C++ソフトウェアシステムの根本的な再編成を行うために怒りで使用されてきました。

DMSはWindowsで実行され、Linuxではshスクリプトを使用してWineで透過的に実行されます。

2011年2月3日編集:DMSは、LinuxおよびSolarisのWineでも正常に動作するようです。OSXでのWineでのDMSのテストが進行中です。

2011年3月1日編集:DMSはWineforOSXでも動作するようです。

2013年2月21日編集:C ++フロントエンドは、ANSI C ++ 11と、MSおよびGNUバージョンのC++11を処理するようになりました。

2015年2月24日編集:ANSI、MS、GNUフレーバーでC++14を処理するようになりました。

2019年1月16日編集:ANSI、MS、GNUフレーバーでC++17を処理するようになりました。

于 2010-05-26T02:25:17.423 に答える