12

C または C++ ソース ファイルから定義または宣言 (typedef、構造、列挙、変数、または関数)を抽出するコマンド ライン ツールが必要です。また、既存の定義/宣言を置き換える方法も便利です (抽出された定義をユーザーが送信したスクリプトで変換した後)。そのような一般的なツールはありますか、またはそのようなツールに非常に近いものはありますか?

ここでは、スクリプタビリティと、ユーザーが作成したスクリプトまたはプログラムと接続する機能が重要ですが、学術的には GUI プログラムにも興味があります。Unix/Linux 陣営向けのオープン ソース ソリューションが好まれます (ただし、Windows および OS X ツールにも興味があります)。主な言語の関心は C と C++ ですが、より一般的なソリューションの方が優れています (プログラム ソース ファイル内の定義を検索、抽出、置換するための非常に正確な解析機能は必要ないと思います)。

サンプル ユース ケース(追加 - 好奇心旺盛な方向け):

  1. これらの型の s と変数 (配列) の初期化が深くネストされstructている場合、フィールドを追加または並べ替えたり、変数/配列の定義をより読みやすい形式に書き換えたりして、手作業によるエラーを導入することなく、構造体の定義を変更する必要があるとします。これは、古い初期化を抽出し、スクリプト/プログラムを使用して新しい初期化を記述して古いものを置き換えることで機能します。
  2. コード閲覧ツールを実装する場合 - 定義を抽出します。
  3. 装飾的なコードの生成 (例: 関数エントリ/リターンのロギング)。
  4. スクリプト化されたコードの構造化 (たとえば、これとあれを抽出し、変更せずに別の場所に置く - バージョン管理のコミット コメントは、この操作を実行するコマンドを文書化して、何も変更されていないことを明らかにし、検証可能にすることができます)。

代替問題:定義の場所を伝えるツールがある場合 (最初と最後の行で十分です。関心のあるすべての定義/宣言が独自の行にあると仮定することもできます)、それは単純に次のようになります。プログラムを書くための指先の器用さ

  1. 定義を抽出し、
  2. 定義を置き換えるか、さらには
  3. 定義を抽出し、コマンド ライン オプション (またはエディター) で指定されたプログラムを実行して、

    • stdin目的の抽出された定義を(または一時ファイルから)受け取り、
    • 変換 (編集) を実行し、
    • 新しい定義を出力しますstdout(または指定された一時ファイルに保存します)。

    実行中のプログラムに置き換えられます。

したがって、主要でより困難な問題は、定義の開始行と終了行を見つけることです。

タグについての注意:より正確なタグですcode-generationcode-transformation、存在しません。

4

3 に答える 3

4

私たちのDMS ソフトウェア リエンジニアリング ツールキットは、あなたが望むツールになろうとしています。しかし、これは最先端のツールであり、涅槃スタイルのツールではありません。本物の面白い仕事をするのに十分です。

DMS は、ソース コードを解析、分析、および変換するための一般的な機能を提供します。

明示的な文法を使用して言語 (C や C++ など) を定義します。文法は、抽象構文木 (AST) を構築するパーサーを駆動します。さまざまな分析プリミティブは、a) AST の形状にうまく一致するツリー状の情報フロー パスに沿って情報を収集するための機能 [「属性文法」ATG]、b) シンボル定義マップへのシンボル使用の構築 [「シンボル テーブル」] を提供します。 、c) ATG によって抽出された事実を使用した制御およびデータ フロー分析、d) 範囲分析、e) ローカルおよびグローバル両方のポイント ツー分析。これらのプリミティブ アナライザーを使用して、AST からファクトを構成し、AST によって表されるコードに関する結論を導き出すことができます (たとえば、「このステートメントはこれらの変数を変更します」)。言語フロントエンド文法と言語固有のアナライザーを再利用可能なバンドルにまとめてパッケージ化します。DMS には、さまざまなレベルの深さと成熟度を備えた言語フロント エンドがあり、さまざまな言語に対応しています。

[6/27 編集: C および C++ フロント エンドは、C および C++ の特定の方言をサポートしています: ANSIC、C99、GCC3/4 C、MS Visual C、ANSI C++98、ANSI C++11、GCC3/4 C++、MS Visual C++ 2005/2008/2010。コードの正確な分析が必要な場合は、「正しい」方言を使用してコードを処理する必要があります。]

しかし、「分析」は重要ではありません。分析の目的は、変化を促進することです。DMS は、手続き的に AST を変更する、言語の表面構文で記述されたソースからソースへの書き換え規則によって AST を変更する (どちらも選択された分析結果によって条件付けられる)、または手続き型とソースからソースへのセットをグループ化する追加のサポートを提供します。 -ソースを一緒に書き換えて、再構築などの大規模なコード変更を実行できる複合的で複雑な書き換えを行います。AST が変換された後、AST を使用して、対応するフロントで構文的に正しいコードを再生成 (「prettyprint」) できます-言語/方言を終了します。[ある言語の AST を断片的に変更して別の言語の AST を作成することで、翻訳者を作成できますが、これはこの文が示すほど簡単ではありません]。

これはすべてかなりの程度機能しますが、特定の言語の複雑さによってまだいくらか妨げられています。C および C++ の場合、有名な問題はプリプロセッサです。プログラム テキストを任意に編集することにより、プリプロセッサの条件は、標準的な解析テクノロジに似たものによってソース コードを解析できないようにすることができます。DMS の C および C++ フロント エンドは、これをいくらか改善し、ほとんどの人が構造化とは呼ばないが一般的に発生するいくつかの奇妙なケースを含む、適切に構造化されたプリプロセッサ ディレクティブを使用してコードを解析できます。

   #IF  cond
        if (abc)  {
   #ELSE
        if (def)  {
   #ENDIF

プリプロセッサの条件文を任意に配置して、コードの解析に関して興味深い進歩を遂げています。しかし、一度それを行うと、すべてのアナライザーが突然プリプロセッサーの条件を考慮に入れる必要があり、私たちは突然、コンパイラーの人々が実際に訪れたことのない芝の上にいることになります。

DMS は、膨大な量のコード シャッフルを伴う非 CORBA スタイルから CORBA スタイルへの変換、既存の C コード用の SOW スタイル API の生成のための任意の制御フロー パスに沿ったコードの抽出、大規模な C++ プログラムの主要なアーキテクチャの変更に使用されてきました。大きな C プログラムにインストルメンテーションを挿入して、ポインタ エラーなどを検出する [これは、他の多くの言語の他のタスクに適用されています]。

私たち自身の経験では、まだかなり使いにくいです。私たちの意見では、これは、民主主義が他のすべてを除いてすべての政府システムの中で最悪であるというのと同じ意味です。YMMV。Web サイトには、DMS から派生したツールとディスカッションが多数あります。

実際、関数の抽出 (SOW 演習はそれよりもはるかに一般的です) や関数の挿入 (これはインストルメンテーションの一般化されたケースです) に使用されています。

GCC-XML のようなツールは、DMS の機能の影です。GCC-XML は、シンボル テーブルを解析、構築し、データ宣言 (コードではない) をダンプしますが、コードを変更することはできません。Clangの方が優れています。C および C++ を解析して AST に変換し、LLVM 中間表現を解析できます。また、必要なツリーの変更に触発されたソース テキストに後で適用されるパッチを吐き出すための何らかのメカニズムを備えています。Clang が大規模なコード変換、特に 1 つの変換の結果が再度変換される場合 (遅延テキスト パッチのツリーをどのように変更しますか?) を実行できるかどうかはわかりません。DMS はこれを終日行うことができ、C および C++ 以外の多くの言語に対して行うことができ、認識している言語の任意の混合に対して行うことができます。

条件付きのプリプロセッサの問題が解決されるまで、C および C++ コードの分析/変換は容易ではありません。これらの言語でこれらのタスクを成功させるには、純粋な意志の力と、構築できる最強のツールを使用する必要があります。(Java にはこれらの問題はなく、DMS はそれに応じて分析/変換に優れています)。

傲慢の重大なリスクがありますが、DMS は汎用目的の分析と変換のための最高のツールであると私は信じています。そのアーキテクトとして、私はこの仕事のためにそれをより強くすることが私の長期的な仕事だと考えています.

于 2012-06-27T03:42:53.213 に答える
3

あなたはGCC-XMLをあなたが話しているようなツールを開発するための基礎として考えるかもしれません。これをpygccxmlと組み合わせて使用​​して、深くネストされた構造体メンバーの自動抽出を実行しました。それはあなたの仕事を簡単にすることはありませんが、そうでない場合よりも確かに良いでしょう。

また、他の人がそのようなツールを書くための基礎としてclangについて言及しているのを聞いたことがありますが、自分でそれを詳しく調べる機会はありませんでした。

于 2012-06-27T02:49:50.483 に答える
2

Clangを確認できます。それらには、重要なソース コード処理ライブラリがあります。

于 2012-06-27T04:26:53.503 に答える