**Abstraktne interpretatsioon** (inglise keeles *abstract interpretation*) on informaatika teooria arvutiprogrammide semantika korrektseks lähendamiseks, põhinedes monotoonsetel funktsioonidel üle osaliselt järjestatud hulkade, eelkõige võrede. Seda võib vaadelda kui arvutiprogrammi osalist täitmist, millega kogutakse informatsiooni selle semantika (nt juhtimisvoo, andmevoo) kohta, tegemata kõiki arvutusi.

Selle teooria põhiline rakendus on formaalne staatiline analüüs, mis hangib informatsiooni programmide võimalike täitmiste kohta. Sellistel analüüsidel on kaks põhilist kasutusvaldkonda:

* kompilaatorites, et analüüsida programme, otsustamaks, kas mingid automaatsed optimeerimised on võimalikud;
* silumisel, et leida programmidest vigu neid käivitamata.

Abstraktse interpretatsiooni teooria formaliseerisid prantsuse informaatikud Patrick Cousot ja Radhia Cousot 1970. aastate lõpus. Esimene suuremahuline automaatne programmianalüüs abstraktse interpretatsiooni abil teostati Ariane 5 raketi koodil pärast selle esmalennu ebaõnnestumist 1996. aastal.

Abstraktsed domeenid
--------------------

Abstraktseks interpretatsiooniks kasutatavaid võresid nimetatakse **abstraktseteks domeenideks** (inglise keeles *abstract domain*). Domeeni elemendid on programmi konkreetsete seisundite lähendused, millel sooritatakse konkreetsetele operatsioonidele vastavaid abstraktseid operatsioone. Lähendamine ja sellega kaasnev täpsuse kaotus võib olla vajalik, et semantika oleks lahenduv (vt Rice'i teoreem, peatumisprobleem).

Domeeni valik sõltub sellest, milliste programmi omaduste kohta informatsiooni otsitakse. Lisaks tuleb teha kompromiss selle täpsuse ja keerukuse vahel.

### Täisarvude domeenid

Täisarvuliste muutujate ja nende tehete lähendamiseks on abstraktsel interpreteerimisel mitmeid võimalusi.

Kombinatsioon intervallaritmeetikast (roheline) ja kongurentsist mod 2 (sinine) abstraktsete domeenidena, et analüüsida C programmi (punane: konkreetsed võimalike väärtuste hulgad täitmisel). Kasutades jääke (0=paaris, 1=paaritu), saab nulliga jagamise välistada
#### Märkide domeen

Selliste muutujate puhul võib unustada täpsed väärtused, jättes alles ainult nende väärtuste märgid (+, - või 0). Mõningate aritmeetiliste tehete, näiteks korrutamise puhul selline lähendus täpsust ei kaota: kahe täisarvu korrutise märk on üheselt määratud korrutatud arvude märkidega. Teiste tehete, näiteks liitmise puhul lähendus võib kaotada täpsust: positiivse ja negatiivse arvu summa märki pole võimalik ainult liidetavate märke teades määrata.

#### Intervallide domeen

Täpsemaks analüüsiks võib kasutada näiteks arvtelje lõike, kirjeldades iga muutuja {\displaystyle x} võimalikke väärtusi täisarvude intervalliga {\displaystyle [l\_{x},u\_{x}]}. Sellistel lähendustel on võimalik defineerida aritmeetilised tehted, moodustades intervallaritmeetika. Näiteks muutujate {\displaystyle x} ja {\displaystyle y}, mille intervallid on vastavalt {\displaystyle [l\_{x},u\_{x}]} ja {\displaystyle [l\_{y},u\_{y}]}, korral on

* summa {\displaystyle x+y} intervall {\displaystyle [l\_{x}+l\_{y},u\_{x}+u\_{y}]},
* vahe {\displaystyle x-y} intervall {\displaystyle [l\_{x}-u\_{y},u\_{x}-l\_{y}]}.

#### Relatsioonilised domeenid

Kolmemõõtmeline kumer hulktahukas kirjeldamaks kolme muutuja võimalike väärtusi. Iga muutuja võib olla null, kuid kõik kolm ei saa korraga olla nullid. Seda omadust ei saa intervallide domeenis kirjeldada
Järgnevas programmis on muutuja `z` väärtus alati null:

```
y = x;
z = x - y;

```

Kasutades intervallide domeeni ja eeldades, et muutuja `x` väärtus on algul lõigus {\displaystyle [0,1]}, leitakse, et muutuja `z` väärtus on lõigus {\displaystyle [-1,+1]}. Tulemus pole vale, kuid mitte nii täpne, kui võiks tahta, sest see domeen ei arvesta lahutamisel muutujate omavahelist seost, mistõttu nimetatakse domeeni **mitterelatsiooniliseks**.

**Relatsionaalsed** domeenid, mis muutujatevahelisi seoseid arvestavad, on näiteks:

* kongurentsiseosed täisarvudel,
* kumerad hulktahukad,
* kaheksanurgad.

### Muud domeenid

Lisaks täisarvuliste väärtustele võib analüüsida ka muud tüüpi andmeid ja muid programmi omadusi, näiteks:

* korduvaid või üleliigseid arvutusi,
* mitmelõimeliste programmides lukke ja andmejookse.

Viited
------

1. 1 2  Helmut Seidl, Reinhard Wilhelm, Sebastian Hack (2012). "Foundations and Intraprocedural Optimization". *Compiler Design: Analysis and Transformation*. Berlin, Heidelberg: Springer Berlin Heidelberg. Lk 1-114. ISBN 978-3-642-17548-0.`{{raamatuviide}}`: CS1 hooldus: mitu nime: autorite loend (link)Kasutatud 06.04.2018.
2. ↑  Patrick Cousot, Radhia Cousot (1977). "Abstract Interpretation: A Unified Lattice Model for Static Analysis of Programs by Construction or Approximation of Fixpoints". *Conference Record of the Fourth ACM Symposium on Principles of Programming Languages* (PDF). Los Angeles, California, USA: ACM. Lk 238-252.Kasutatud 06.04.2018.
3. ↑  Patrick Cousot, Radhia Cousot (1979). "Systematic Design of Program Analysis Frameworks". *Conference Record of the Sixth Annual ACM Symposium on Principles of Programming Languages* (PDF). San Antonio, Texas, USA: ACM. Lk 269-282.Kasutatud 06.04.2018.
4. ↑  Christèle Faure. "PolySpace Technologies History". Vaadatud 17.03.2018.
5. 1 2  Matt Might. "What is static program analysis?" (inglise). Vaadatud 06.04.2018.
6. ↑  Patrick Cousot, Radhia Cousot (1976). "Static determination of dynamic properties of programs". *Proceedings of the Second International Symposium on Programming* (PDF). Dunod, Paris, France. Lk 106-130.Kasutatud 06.04.2018.
7. ↑  Philippe Granger (1989). "Static Analysis of Arithmetical Congruences". *International Journal of Computer Mathematics*. Kd 30. Lk 165-190.
8. ↑  Philippe Granger (1991). "Static Analysis of Linear Congruence Equalities Among Variables of a Program". S. Abramsky, T.S.E. Maibaum (toim). *Proc. Int. J. Conf. on Theory and Practice of Software Development (TAPSOFT)*. Kd 493. Springer. Lk 169-192.
9. ↑  Patrick Cousot, Nicolas Halbwachs (1978). "Automatic Discovery of Linear Restraints Among Variables of a Program". *Conf. Rec. 5th ACM Symp. on Principles of Programming Languages (POPL)* (PDF). ACM. Lk 84-97.Kasutatud 06.04.2018.
10. ↑  Antoine Miné (2006). "The Octagon Abstract Domain". *Higher Order Symbol. Comput*. Kd 19 (1). Lk 31-100.Kasutatud 06.04.2018.
11. ↑  Vesal Vojdani; et al. (2016). "Static race detection for device drivers: the Goblint approach". *Proceedings of the 31st IEEE/ACM International Conference on Automated Software Engineering, ASE 2016*. ACM. Lk 391-402. `{{raamatuviide}}`: et al.-i üleliigne kasutus kohas: `|autor=` (juhend)Kasutatud 06.04.2018.

Välislingid
-----------

* Patrick Cousot' veebileht abstraktse interpretatsiooni kohta