4

ブール代数を使用して単純化できるブール式を探す C++ コード パーサーはありますか?

コンパイラがすでにこれを行っていることは知っていますが、コードの可読性を実際に改善できるように、そのようなものを提供するツールがあると便利です。

4

6 に答える 6

3

人間。

あなたは読みやすさを向上させたいと思っています。読みやすさはほとんど人間のものであるため、人間によって教えられるべきです。

より経験豊富な開発者に式をレビューしてもらい、ヒントを提供してもらいます。

たとえば、ここで私の答えを参照してください:値がしきい値内にあるかどうかをテストするための (パフォーマンスに関して) 最良の方法は何ですか?

于 2011-09-11T14:54:02.863 に答える
0

これはとても悪い考えです!プログラマーは、思考プロセスを反映したコードを記述します。したがって、人間によって書かれたブール式は、人間の理解のためにすでに自動的に最適化されています。これをプログラムで改善しようとすると、失敗する運命にあります。それが理にかなっているかもしれない唯一の文脈は、ツールで生成されたソースコードの後処理です。

于 2011-09-11T15:24:51.393 に答える
0

C/C++ ブール式では直接動作しませんが、複雑なブール論理を単純化するのに非常に役立つツールの 1 つがLogic Fridayです。残念ながら Windows 専用ですが、幸いなことに無料です。

于 2011-09-11T14:57:24.170 に答える
0

チェックする必要がある「if」の数を減らすことで、コードをより効率的にすることができます。しかし、より単純化して読みやすくすることは、自動的にはできません。

于 2011-09-11T14:57:51.230 に答える
0

http://www.freewarepalm.com/educational/booleanfunctionsimplificationtool.shtml

試してみる価値があるかもしれません。

ただし、読みやすさと理解しやすさがより重要であるため、通常は自分で行う方が適切であり、コンパイラーに単純化を任せます。

于 2011-09-11T14:58:26.207 に答える
0

必要なのは、C++ を解析し、その記号の意味を判断し、ブール方程式を選び出し、セマンティクスに違反しないブール単純化規則をそれらに適用できるツールです。

これを実行できるツールは、 C++ フロント エンドを備えたDMS Software Reengineering Toolkitです。DMS は、コードのプログラム分析とソースからソースへの変換を実行するように設計されています。C++ フロント エンドを使用して、C++ を AST に解析し、シンボル テーブルを構築し、式の型を推測し、書き換え規則を適用できます。

次のような書き換えルールをコーディングできます。

domain Cpp.  -- tell DMS to use the C++ front end

rule factor_common_and_term(e1: condition, e2:condition, e3: condition):
        disjunctive_expression -> disjunctive_expression =
 " \e1 && \e2 ||  \e1 && \e3 " ->  " \e1 && ( \e2 || \e3 ) "
 if no_side_effects(e1) /\ no_side_effects(e2);

共通の条件を因数分解します。ルールには「factor_common_and_term」という名前が付いており、多くの場合、何百もの他のルール (「distribute_term」など) と区別されます。e1、e2、e3 は、任意の部分式 (文法規則による「条件」型) を表すメタ変数です。書き換えは、disjunction_expressions でのみ機能します。これを「単なる式」にすることはできますが、そうすると、他の条件式内にネストされた選言を取得できなくなります。書き換えにはパターン (左) と置換 (右) があり、どちらもメタ引用符囲まれていますは C++ 構文からのエスケープであり、メタ変数が一致する場所を示します。メタ変数は、対応するカテゴリの任意の構文に一致するため、\e1が表示される場所は、任意に複雑な「条件」になる可能性があります。e1 がパターン内で 2 回言及されているという事実により、発生が同一になります。

任意に複雑なブール方程式を単純化することに関する知識をエンコードする一連の書き換え規則を作成できます。数十のルールでそれができます。これらを、数十万の項を持つ非 C++ ブール方程式のシステムと、C および C++ プリプリプロセッサの条件に適用しました。

C++ の場合、e1 に副作用がある場合や e2 に副作用がある場合は、書き換えが安全であることを確認する必要があります。このチェックは、保守的な方法でこの答えを決定する必要がある補助関数呼び出しで行われます。副作用がないという決定は、実際には C++ にとってかなり複雑です。式のすべての要素が何であるか、およびそれらのどれにも副作用がないことを知る必要があります。

このチェックは、すべての表現要素を検査する DMS の属性文法 (組織化されたツリー クロール) で行うことができます。単純な定数と変数 (これにはシンボル テーブルが必要です) はそうではありません。関数呼び出し (コンストラクターなどを含む) は次の可能性があります。それらの定義を見つけて (ここでもシンボル テーブルが必要です)、同様に処理する必要があります。式要素が個別にコンパイルされた関数を呼び出す可能性があります。この場合の保守的な答えは「わからない」、つまり「副作用があると仮定する」です。DMS は実際には複数のコンパイル ユニットを同時に読み取ることができるため、必要に応じて個別にコンパイルされた関数を見つけ、解析/シンボル解決し、クロールすることができます。

したがって、ブール値の書き換え部分は非常に簡単です。副作用分析はそうではありません。

DMS を使用して、C++ コードに大幅な変更を加えました。このような複雑な分析について仮定を立てることで、私たちはよくごまかします。通常、私たちはプログラマーが驚くのと同じように驚きます (「どういう意味ですか、それには副作用があるのですか?」)。ほとんどの場合、それはかなりうまく機能します。2,500 万行の C システムで詳細な副作用分析を行いました。C++ についてはまだ十分ではありません。

副作用分析は、一部の部分式が複数回評価される可能性がある場合にのみ重要です。コメントで与えられたOPの例はそれらを必要とせず、次のルールで処理できます:

rule not_on_disjunction(e1:condition, e2:condition):
    condition -> condition =
  " ! (\e1 || \e2) " ->  " !\e1 && !\e2";

rule double_not(e:condition):
    condition -> condition =
  " ! ! \e " -->  " \e ";

より詳細な説明を含む完全で単純な作業例は、従来の代数といくつかの微積分の代数的単純化のこの例です

特定のコード変換によってコードが読みやすくなるかどうかについては、明らかに論争があります。私見ですが、それはコードの形が芸術的な判断であることが多く、私たち全員が芸術について意見を異にしているように見えるからです。これは、他の誰かがあなたのコードを変更できるようにすることと何ら変わりはありません。

于 2011-09-11T16:07:11.250 に答える