コンピュータ科学において、抽象解釈とは、順序集合、特に格子上の単調関数に基づいて、コンピュータプログラムの意味論を的確に近似する理論である。これは、すべての計算を実行することなく、その意味論(例えば、制御フロー、データフロー)に関する情報を得る、コンピュータプログラムの部分的な実行と見なすことができる。
その主な具体的な応用例は形式静的解析であり、コンピュータプログラムの可能な実行に関する情報を自動的に抽出するものである。このような解析には主に2つの用途がある。
抽象解釈は、 1970年代後半にフランスのコンピュータ科学者夫婦であるパトリック・クーゾーとラディア・クーゾーによって形式化された。 [ 1 ] [ 2 ]
このセクションでは、現実世界の非コンピュータ的な例を用いて、抽象的解釈を解説します。
会議室にいる人たちを考えてみましょう。部屋にいる一人ひとりに、アメリカの社会保障番号のような固有の識別子が割り当てられているとします。誰かが出席していないことを証明するには、その人の社会保障番号がリストに載っていないかどうかを確認するだけで済みます。二人の異なる人が同じ番号を持つことはあり得ないので、番号を調べるだけで参加者の出席の有無を証明または否定することが可能です。
しかし、出席者の名前だけが登録されている可能性もあります。リストに名前が見つからない場合は、その人は出席していなかったと安全に結論付けることができますが、名前が見つかった場合は、同音異義語の可能性(例えば、ジョン・スミスという名前の人が2人いる場合)があるため、さらなる調査なしには断定できません。同音異義語は実際にはまれであるため、この不正確な情報でもほとんどの目的には十分であることに注意してください。ただし、厳密に言えば、誰かが部屋にいたと断言することはできません。言えるのは、その人がそこにいた可能性があるということだけです。調べている人物が犯罪者であれば、警報を発令しますが、もちろん誤報を発令する可能性もあります。同様の現象は、プログラムの分析でも発生します。
もし私たちが特定の情報、例えば「成人がいたかどうか」だけに興味がある場合部屋にいる全員の名前と生年月日のリストを作成する必要はありません。参加者の年齢のリストを作成するだけで十分であり、正確さを損なうことはありません。それでもまだ扱いきれない場合は、最年少の年齢だけを記録しておけばよいでしょう。そして最年長者、質問が厳密に以下の年齢に関するものである場合または厳密にはそうすれば、そのような参加者はいなかったと安全に答えることができるでしょう。そうでなければ、分からないとしか言えないかもしれません。
計算においては、一般的に、具体的で正確な情報は有限の時間とメモリ内では計算できません(ライスの定理と停止問題を参照)。抽象化は、質問に対する一般的な回答を可能にするために用いられます(例えば、抽象解釈アルゴリズムが正確な回答を確実に計算できない場合に、「はい」または「いいえ」を意味するはい/いいえの質問に対して「たぶん」と答えるなど)。これにより問題が単純化され、自動的な解決が可能になります。重要な要件の一つは、問題が扱いやすくなるように十分な曖昧さを加えつつ、重要な質問(例えば、「プログラムがクラッシュする可能性はあるか?」)に答えるのに十分な精度を維持することです。
プログラミング言語または仕様記述言語が与えられた場合、抽象解釈とは、抽象化関係によって結び付けられた複数の意味論を与えることである。意味論とは、プログラムの可能な動作を数学的に特徴づけたものである。プログラムの実際の実行を非常に正確に記述する最も精密な意味論は、具体意味論と呼ばれる。例えば、命令型プログラミング言語の具体意味論は、各プログラムに対して、そのプログラムが生成する実行トレースの集合を関連付けることができる。実行トレースとは、プログラムの実行における連続する状態のシーケンスであり、状態は通常、プログラムカウンタの値とメモリ位置(グローバル変数、スタック、ヒープ)で構成される。さらに抽象的な意味論が導き出される。例えば、実行において到達可能な状態の集合のみを考慮することができる(これは、有限トレースにおける最後の状態を考慮することに相当する)。
静的解析の目的は、ある時点で計算可能な意味解釈を導き出すことです。例えば、整数変数を操作するプログラムの状態を、変数の実際の値を忘れて符号(+、−、または0)だけを保持することで表現することができます。乗算などの基本的な演算では、このような抽象化によって精度が失われることはありません。積の符号を得るには、被演算の符号を知っていれば十分です。しかし、他の演算では、抽象化によって精度が失われる場合があります。例えば、被演算がそれぞれ正と負である和の符号を知ることは不可能です。
意味論を決定可能にするためには、精度を多少犠牲にする必要がある場合がある(ライスの定理や停止問題を参照)。一般に、解析の精度と決定可能性(計算可能性)、あるいは扱いやすさ(計算コスト)の間には妥協点が存在する。
実際には、定義される抽象化は、分析したいプログラムの特性と、対象となるプログラムのセットの両方に合わせて調整されます。抽象解釈によるコンピュータプログラムの最初の大規模な自動分析は、 1996年のアリアン5ロケットの初飛行の失敗につながった事故がきっかけとなりました。 [ 3 ]

させてを順序集合(具体集合と呼ばれる)とし、は、抽象集合と呼ばれる別の順序集合である。これら2つの集合は、一方の集合の要素を他方の集合に写像する全関数を定義することによって互いに関連付けられている。
関数要素をマッピングする場合、それは抽象化関数と呼ばれます。コンクリートセット要素へ抽象セットにおいてつまり、要素 では抽象化であるで。
関数要素をマッピングする場合、それは具体化関数と呼ばれます。抽象セットにおいて要素へコンクリートセットつまり、要素では具体化であるで。
させて、、、 そして順序付けられた集合である。具体的な意味論は単調関数であるに関数からには有効な抽象化であると言われているもし、すべてので、 我々は持っています。
プログラムの意味論は、ループや再帰手続きが存在する場合、一般的に固定点を使用して記述されます。は完全な格子であり、単調関数であるの中へそれで、そのためは最小不動点の抽象化であるこれは、クナスター・タルスキの定理によれば存在する。
問題は、。 もし有限の高さを持つか、少なくとも上昇連鎖条件(すべての上昇数列は最終的に定常状態になる)を満たすならば、そのような上昇数列の定常極限として得られる可能性がある帰納法によって以下のように定義される。(最小要素) そして。
他のケースでは、そのような(ペア)拡大演算子を介して、[ 4 ]二項演算子として定義される以下の条件を満たすもの:
場合によっては、ガロア接続を用いて抽象化を定義することが可能です。どこからにそしてからにこれは最良の抽象化の存在を前提としているが、必ずしもそうとは限らない。例えば、カップルの集合を抽象化すると、凸多面体を囲むことによって実数を表す場合、円盤への最適な抽象化は存在しない。。
各変数に値を割り当てることができます特定のプログラムポイントで利用可能な間隔値を割り当てる状態変数へすべての場合において、これらの区間の具体化となる。、 我々は持っています間隔からそして変数についてそしてそれぞれ、以下の区間を容易に得ることができる。(すなわち、)そして(すなわち、); これらは厳密な抽象化であることに注意してください。たとえば、、はまさにその区間です乗算、除算などについては、より複雑な公式を導き出すことができ、いわゆる区間演算が得られます。[ 5 ]
それでは、次の非常にシンプルなプログラムについて考えてみましょう。
y = x; z = x - y;
適切な算術型の場合、結果はzゼロになるはずです。しかし、から始まる区間演算を行うとx[0, 1]では、z[−1, +1]の範囲内。個々の演算はそれぞれ完全に抽象化されているが、それらの合成はそうではない。
問題は明らかです。私たちは、xそしてy実際、この区間領域は変数間の関係を一切考慮しないため、非関係領域となります。非関係領域は実装が高速かつ容易である傾向がありますが、精度は低くなります。
関係数値抽象ドメインの例としては、以下のようなものがあります。
およびそれらの組み合わせ(例えば、還元生成物、[ 2 ]右図参照)。
抽象的な領域を選択する場合、通常は、きめ細かな関係性を維持することと、高い計算コストとの間でバランスを取る必要がある。
PythonやHaskellのような高水準言語はデフォルトで無制限の整数を使用するが、 Cやアセンブリ言語のような低水準プログラミング言語は通常、有限サイズの機械語で動作し、これは整数法を使用してモデル化する方がより適切である。(ここでnはマシンワードのビット幅である)。このような変数の様々な分析に適した抽象領域がいくつか存在する。
ビットフィールド領域では、マシンワード内の各ビットを個別に扱います。つまり、幅nのワードは、n 個の抽象値の配列として扱われます。抽象値は、集合から取得されます。、抽象化関数と具体化関数は次のように与えられます。[ 14 ] [ 15 ]、、、、、、これらの抽象値に対するビット演算は、いくつかの3値論理における対応する論理演算と同一である。[ 16 ]
さらに、符号付き区間領域と符号なし区間領域というドメインもあります。これら 3 つのドメインはすべて、加算、シフト、XOR、乗算などの一般的な演算のための前方および後方抽象演算子をサポートしています。これらのドメインは、縮約積を使用して組み合わせることができます。[ 17 ]