他の誰かがオープンソースコードを変更したり、独自のアプリケーション用に特定のものを開発する方法を見つけたりすると、私の仕事で役立つことがあります。ただし、すべてのソフトウェアに適切なドキュメントがあるわけではありません。
コードベースの全体的な構造を理解する良い方法は何ですか?
たとえば、どのルーチンがどのルーチンを呼び出すかなどです。この目的のためにDoxygenなどのドキュメントツールを自分で使用する可能性がありますが、もっと良い戦略があるかどうか疑問に思っていましたか?
他の誰かがオープンソースコードを変更したり、独自のアプリケーション用に特定のものを開発する方法を見つけたりすると、私の仕事で役立つことがあります。ただし、すべてのソフトウェアに適切なドキュメントがあるわけではありません。
コードベースの全体的な構造を理解する良い方法は何ですか?
たとえば、どのルーチンがどのルーチンを呼び出すかなどです。この目的のためにDoxygenなどのドキュメントツールを自分で使用する可能性がありますが、もっと良い戦略があるかどうか疑問に思っていましたか?
回答:
次のスレッドは接線方向に関連しています。
論文の最初の部分では、18か月かけて文書化されていないFortranコードを変更しました。最初のタスクの1つは、コードベースの全体的な構造を理解することでした。私が提案する最も重要なことは、何かを理解するときはいつでもテキストファイルにメモをとることです。この時間のかかるイライラするプロセスの間に、物事を再学習したり再発見したりする必要はありません。
私の場合、前のプログラマーがFortran 77のようなスタイルを使用していたため、関数の引数が自己文書化されていなかったため、言うべき「API」はありませんでした。彼らは意味した。テストはなく、Fortranなのでヘッダーもありませんでした。ミックスにさらに楽しみを加えると、CまたはC ++で書かれた関数がいくつかあちこちにありました。
私にとってうまくいったこと(あなたがLinuxで働いていると仮定して):
grep
。愛することを学ぶgrep
。シェルでこれを使用して、関数が宣言されて呼び出されている場所を見つけます。出力から、どのファイルを調べるかがわかります。nm
。ライブラリのソースコードがない場合にライブラリで役立ちますが、発生した関数がそのライブラリにあるかどうかを知りたい場合に使用します。ただし、ライブラリのシンボルが削除されていない場合にのみ機能します。print
ステートメントを使用するよりもはるかに効率的です。ddd
そしてgdb
偉大であり、そこに事実上すべてのLinuxシステム上で。お好きなデバッガをご利用ください。私が以前に考えたかったこと、または私にとっての選択肢ではなかったこと:
gcov
およびlcov
を使用して、コードの一般的な実行のカバレッジ分析を行います。コードベースの大部分を実行することになっている例がある場合、これらの2つのツールを組み合わせると、コードの各行にアクセスした回数がわかります。デバッグフラグが有効になっている場合に最も役立ちます。コードの一部にまったくアクセスしない場合は、すぐに理解することはおそらくそれほど重要ではありません。コードの一部が頻繁にアクセスされる場合、それが何であるかを理解することはおそらく価値があります。多分それは重要でないループであるのでコードはたくさん実行されます、または他の多くの関数が依存する重要な関数であるかもしれません。カバレッジ分析だけではわかりませんが、カバレッジ分析は、時間をどこに集中するかについてのアイデアを提供します。splint
は、一部の変数が決して使用されないなど、コードで何か怪しいことが起こっているかどうかを教えてくれます。dot
およびでプロファイリング出力を使用して、graphviz
コールグラフを生成し、カバレッジ分析などの関数が呼び出された回数を確認することもできます。複雑なコードの場合、グラフィック分析がはるかに役立つ場合があります。私は常に生徒にコードを下から上に読むように言います。あなたはmain()から始めて、それが何を呼び出すかを確認します。通常、これは少数の関数です。次に、一般的にアルゴリズムの全体的なフローを定義するmain()から呼び出された関数(時間ステップループ、アセンブリ、ソルバー、出力など)を調べます。30,000フィートからアルゴリズムの概要を取得するには、2レベルほど深く行きます。残りはdoxygenのドキュメントなどから収集できます。
しかし、私が言ったように、メッセージは:ボトムアップでコードを読みます。