7

コードのリファクタリング、特にファイル間の「インクルード」のような関係を実行したいと思います。それらはかなりの数ありますが、最初に、リスト、図、さらには縦棒グラフを用意しておくと、どこから何が含まれているのかが一目でわかります。

(多くの場合、特定のファイルは他の複数のファイルに含まれているため、グラフはツリーではなくDAGになります。サイクルはありません。)

私はTeX(実際にはConTeXt)を使用していますが、この質問は#include、Cのような機能を備えたすべてのプログラミング言語に当てはまるようです。

明白で簡単な答えは、関連するキーワード( 、、および定義した他のいくつかのマクロ)のgrepすべての.texファイルに対してまたは「ファイル内検索」を実行することです。これは何もないよりはましですが、出力は長く、何を含むもののパターンを確認することは依然として困難です。たとえば、ファイルAは通常ファイルBの前に含まれていますか?ファイルCが同じファイルに複数回含まれていることはありますか?\usemodule\input

それは追加の、しかしオプションの機能をもたらすと思います:そのようなツールは特定のファイルからのインクルードのシーケンスを表示することができるでしょう。したがって、その場合、DAGはマルチグラフである可能性があります。つまり、あるファイルから別のファイルに複数のアークが存在する可能性があります。

理想的には、各ファイルに注釈を付けて、その内容の非常に簡単な要約を提供できると便利です。これは、そのファイルのグラフノードのテキストの一部を形成します。

おそらく、この種のことは、graphvizドット言語を生成するスクリプトで実行できます。しかし、私は車輪の再発明ではなく、それがすでに行われたかどうかを知りたかったのです。

4

2 に答える 2

3

私の国では今金曜日で、同僚がビールを飲みに行くのを待っているので、少しプログラミングをしようと思いました。

ここhttp://www.luki.webzdarma.cz/up/IncludeGraph.zipから、1 つのフォルダー内のすべてのファイルを検索し、#includes を解析して .dot ファイルを生成する非常に単純なユーティリティのソースをダウンロードできます。

相対パスをサポートし、正しく処理し、Windows で動作し、Linux でも動作するはずです。とても質素に書かれています。私のバージョンのドットは、生成されたファイルを解析していません。いくつかのバグがありますが、今すぐ飲みに行く必要があります。修正できるかどうかを確認してください。私は通常のドット ユーザーではありません。

楽しみ ...

PS - コンパイルや実行で問題が発生した場合は、お知らせください。ありがとう。

編集

残念ながら、Linux にはいくつかの不具合がありました。ドットの問題は、「digraph」ではなく「graph」を使用していたことです。しかし、今では魅力のように機能しています。ここにリンクがあります。make と入力するだけで、make test は次のプログラム自体の図を生成します。

包含グラフ

C++ ファイルのプリプロセッサ ディレクティブを無視するため、直接的にはあまり役に立ちません (プリプロセッサ出力フラグを指定して g++ を呼び出し、実際のファイルの代わりにそれを処理するだけで修正できます)。今日は正規表現には触れませんでしたが、プログラミングの経験があれば、DotGraph.cpp を変更して、包含トークンをハードコーディングしたり、ファイル拡張子のリストを変更したりするのはそれほど難しくないはずです。明日か何かで正規表現になるかもしれません。

于 2012-11-02T18:22:29.203 に答える
2

巧妙で一般的な解決策は、ビルド システムをトレースすることです (strace、LD_PRELOAD、バイナリのパッチ、またはその他のデバッグ機能などを使用)。

ファイルのオープン/クローズ操作のシーケンスを収集したら、興味のないものを除外するだけで済みます。次の前提が当てはまる限り、任意の言語の依存関係ツリーを簡単に構築できます。

  1. ビルド システムは、インクルード時に各ファイルを開きます。
  2. ビルド システムは、最後に到達すると各ファイルを閉じます。

残念なことに、適切に作成されたコンパイラまたは不十分に作成されたコンパイラは、たとえば、ファイルが最初に含まれたときにのみファイルを開くか、ファイルをまったく閉じないなど、これらの仮定に違反する可能性があります。

おそらくこれらの制限のために、私はこのアイデアの実装を知りません。

一方、巧妙なビルド システムには、依存関係自体を計算または抽出する機能が含まれている場合があります。gcc には-M依存関係を出力するオプションがあり、javac は独自に依存関係を把握します (ただし、依存関係を出力する方法はわかりません)。

TeXに関する限り、これを実際に実装するのに十分なTeXを知りませんが、概念的には、低レベルのインクルードをコマンドに再定義することが可能であるように思われます:

  1. 含まれようとしているもののログを書く
  2. 元の include コマンドを呼び出してそれを含めます
  3. 含まれていたもののログを書く

その後、ログ出力からツリーを構築できます。

于 2012-11-04T17:02:12.560 に答える