私たちの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 は汎用目的の分析と変換のための最高のツールであると私は信じています。そのアーキテクトとして、私はこの仕事のためにそれをより強くすることが私の長期的な仕事だと考えています.