SPARK (limbaj de programare)

SCÂNTEIE
Clasa de limba multi-paradigma
Aparut in 1988
Dezvoltator Altran , AdaCore
Eliberare 22 (2021 ) ( 2021 )
Tip sistem static , strict , sigur , nominativ
Implementări majore SPARK Pro, SPARK GPL Edition
A fost influențat La naiba , Eiffel
Licență GPLv3
Site-ul web adaic.org/advantages/spa…
OS Linux , Microsoft Windows , macOS

SPARK ( SPADE Ada Kernel [1] ) este un limbaj de programare definit formal , care este un subset al Ada [2] , conceput pentru a dezvolta software verificat cu un nivel ridicat de integritate de securitate . SPARK vă permite să creați aplicații care au un comportament previzibil și oferă o fiabilitate ridicată.

Versiunile lingvistice SPARK sunt legate de versiunile Ada și sunt împărțite în două generații: SPARK 83, SPARK 95 și SPARK 2005 (Ada 83, Ada 95 și respectiv Ada 2005) aparțin primei generații, iar SPARK 2014 (Ada 2012) celei de-a doua. . Acest lucru se datorează faptului că inițial au fost folosite comentarii pentru a indica caietul de sarcini și contracte , dar începând cu Ada 2012, a început să fie folosit pentru aceasta mecanismul de aspect apărut în limbaj. Acest lucru a condus la o reproiectare completă a întregului set de instrumente lingvistice și la apariția unui nou verificator GNATprove.

SPARK este utilizat în aviație (motoare cu reacție Rolls-Royce Trent [3] , aeronave Eurofighter Typhoon [4] și Be-200 [5] , sistemul UK NATS iFACTS [6] ) și pentru dezvoltarea sistemelor spațiale ( vehicul de lansare Vega , mulți sateliți [7 ] ). De asemenea, este folosit pentru dezvoltarea sistemelor de criptare [8] și securitate cibernetică [9] [10] [11] .

Concepte

Scopul dezvoltării SPARK a fost de a păstra punctele forte ale Ada (cum ar fi sistemul de pachete și tipurile restricționate) și de a elimina toate constructele potențial nesigure sau ambigue din acesta [1] , deoarece Ada, în ciuda obiectivelor de dezvoltare declarate, s-a dovedit a fi un limbaj destul de complex și nu a avut o definiție formală completă [1] , iar unele dintre părțile sale au provocat critici serioase [12] . Programele SPARK ar trebui să fie lipsite de ambiguitate, comportamentul lor nu ar trebui să depindă de alegerea compilatorului [K 1] , de opțiunile de compilare și de starea mediului. Pentru a face acest lucru, în limbaj au fost introduse unele restricții, printre care: utilizarea sarcinilor este posibilă numai în profilul Ravenscar; expresiile nu permit efecte secundare ; este interzisă utilizarea tipurilor controlate, pentru care este posibilă redefinirea procedurilor de inițializare și a operatorului de atribuire; combinarea de nume este interzisă; utilizarea limitată a unor operatori precum goto ; alocarea memoriei dinamice este interzisă (dar sunt permise tipuri cu limite dinamice și tipuri cu discriminanți) [2] .

Cu toate acestea, orice program SPARK poate fi încă compilat de compilatorul Ada, ceea ce vă permite să amestecați aceste limbi într-un singur proiect.

Dezvoltatorii SPARK au reușit să obțină un limbaj convenabil pentru verificarea automată, care are o semantică simplă, o definiție formală strictă, corectitudine logică și o bună expresivitate [1] .

Contracte și dependențe

Pentru o procedură care crește valoarea unei variabile globale cu argumentul său dacă este pozitivă și cu una în caz contrar, puteți scrie următoarea specificație:

procedura Add_to_Total ( Value : in Integer ) cu Global => ( In_Out => Total ), Depends => ( Total => ( Total , Value )), Pre => ( Total < Integer ' Last - ( daca Value > 0 then Value ) else 1 )), Post => ( Total = Total ' Old + ( dacă Valoare > 0 atunci Valoare altfel 1 ));

Aspectul Global arată la ce variabile globale are acces procedura. În acest caz, folosește variabila Total doar pentru citire și scriere. Depende arată relația dintre variabile: noua valoare a Total depinde de valoarea sa veche și de valoarea Value . Pre  -o condiție prealabilă, arată ce stare a programului ar trebui să fie înainte de executarea procedurii; în acest caz, precondiția verifică pentru a vedea dacă are loc o depășire. Post  este o postcondiție, arată starea programului după executarea procedurii.

Pe lângă aspectele rutinelor, există și alte modalități de a specifica constrângerile privind starea unui program, cum ar fi instrucțiunile de verificare:

pragma Assert ( Condiție );

sau invarianți de buclă:

pragma Loop_Invariant ( Condiție );

În același timp, există diferențe semnificative în sintaxa de descriere a contractelor pentru versiunile SPARK din prima și a doua generație.

Prima generație a limbajului a folosit comentarii speciale:

-- Dublarea unui număr natural. procedura Double ( X : in out Natural ); --# pre X < Natural'Last / 2; --# post X = 2 * X~;

Cod echivalent pentru a doua generație:

-- Dublarea unui număr natural. procedura Double ( X : in out Natural ) cu Pre => X < Natural ' Last / 2 , Post => X = 2 * X ' Old ;

Verificare

La verificarea programelor se folosesc următoarele metode:

  • verificarea îndeplinirii pre- și post-condiții ale funcțiilor;
  • verificarea absenței unui cod capabil să arunce o excepție ;
  • analiza dependenței de streaming, care verifică inițializarea variabilelor și relația dintre parametri și rezultatul funcțiilor.

Pentru a demonstra corectitudinea programului, pentru toate constructele utilizate de programator, cum ar fi pre- și postcondiții, sunt create seturi de instrucțiuni de verificare. Verificatorul GNATprove poate, de asemenea, în unele cazuri, să genereze afirmații de verificare pe cont propriu. Deci, se vor efectua verificări pentru depășirea limitelor de matrice sau tipuri, depășire și împărțire la zero.

În plus, un set de declarații de verificare și date privind starea inițială a programului, precum și declarații neverificabile primite de la dezvoltator, sunt transferate în programul de verificare automată. GNATprove folosește platforma Why3 [13] și sistemele de testare CVC4, Z3 și Alt-Ergo [14] . Sistemele de la terți, cum ar fi Coq [14] , pot fi, de asemenea, utilizate pentru dovezi .

Istorie

Prima versiune a SPARK (bazată pe Ada 83) a fost creată la Universitatea din Southampton cu sprijinul Ministerului Britanic al Apărării de Bernard Carré și Trevor Jennings , autori ai sistemului de programare Pascal fiabil SPADE-Pascal [15] . În plus, următoarele companii au lucrat la îmbunătățirea limbajului: Program Validation Limited, Praxis Critical Systems Limited (denumită în continuare Altran-Praxis, Altran) și AdaCore.

La începutul lui 2009, Praxis a încheiat un acord cu AdaCore și a lansat SPARK Pro în condițiile GPL [16] . Apoi, în iunie 2009, a fost lansată Ediția SPARK GPL, care vizează dezvoltarea de software gratuit și academic.

Lansarea versiunii lingvistice de a doua generație SPARK 2014 a fost anunțată pe 30 aprilie 2014 [17] .

Vezi și

Note

Comentarii

  1. Începând cu 2020, un singur compilator (GNAT) acceptă pe deplin Ada 2012, iar SPARK 2014 poate fi folosit doar cu acesta.

Surse

  1. ↑ 1 2 3 4 SPARK - Kernel-ul SPADE Ada (inclusiv RavenSPARK) . docs.adacore.com . Preluat la 10 octombrie 2020. Arhivat din original la 7 septembrie 2021.
  2. ↑ 1 2 Certificare cu SPARK . www.ada-ru.org . Preluat la 10 octombrie 2020. Arhivat din original la 13 mai 2021.
  3. Johannes Kliemann. Verificarea programului cu SPARK - Când codul dvs. nu trebuie să eșueze (2018). Preluat la 10 octombrie 2020. Arhivat din original la 16 mai 2021.
  4. Eurofighter Typhoon - Proiecte clienți - AdaCore . www.adacore.com . Preluat la 10 octombrie 2020. Arhivat din original la 21 septembrie 2020.
  5. Aeronava Be-200 . www.ada-ru.org . Preluat la 10 octombrie 2020. Arhivat din original la 13 mai 2021.
  6. ↑ GNAT Pro ales pentru sistemul ATC  de următoarea generație  din Marea Britanie ? . AdaCore . Preluat la 10 octombrie 2020. Arhivat din original la 21 septembrie 2020.
  7. Space - AdaCore . www.adacore.com . Preluat la 10 octombrie 2020. Arhivat din original la 21 octombrie 2020.
  8. La îndemână . Criptograma Skein derivată din Ada arată SPARK , SD Times , BZ Media LLC (24 august 2010). Arhivat din original pe 25 august 2010. Preluat la 31 august 2010.
  9. David Hardin, Konrad Slind, Mark Bortz, James Potts, Scott Owens. Un sistem multi-domeniu bazat pe hardware de înaltă performanță, de înaltă asigurare  //  Siguranța computerului, fiabilitatea și securitatea / Amund Skavhaug, Jérémie Guiochet, Friedemann Bitsch. - Cham: Springer International Publishing, 2016. - P. 102–113 . - ISBN 978-3-319-45477-1 . - doi : 10.1007/978-3-319-45477-1_9 . Arhivat din original pe 20 ianuarie 2022.
  10. Genode - Cadrul sistemului de operare Genode . genode.org . Preluat la 10 octombrie 2020. Arhivat din original la 28 octombrie 2020.
  11. Muen | SK pentru x86/64 . muen.sk. _ Preluat la 10 octombrie 2020. Arhivat din original la 25 octombrie 2020.
  12. Henry F. Ledgard, Andrew Singer. Reducerea Ada (sau către un subset standard Ada)  // Comunicațiile ACM. - 1982-02-01. - T. 25 , nr. 2 . — S. 121–125 . — ISSN 0001-0782 . - doi : 10.1145/358396.358402 .
  13. De ce3 . de ce3.lri.fr. _ Preluat la 10 octombrie 2020. Arhivat din original la 12 octombrie 2020.
  14. ↑ 1 2 Alternative Provers - Ghidul utilizatorului SPARK 22.0w . docs.adacore.com . Preluat la 10 octombrie 2020. Arhivat din original la 12 octombrie 2020.
  15. Bernard Carre. Programare fiabilă în limbi standard  (engleză)  // Software de înaltă integritate / CT Sennett. — Boston, MA: Springer US, 1989. — P. 102–121 . - ISBN 978-1-4684-5775-9 . - doi : 10.1007/978-1-4684-5775-9_5 .
  16. Praxis și AdaCore anunță SPARK  Pro . AdaCore . Preluat la 10 octombrie 2020. Arhivat din original la 21 septembrie 2020.
  17. ↑ Utilizarea SPARK într-un context de certificare  . Blogul AdaCore . Preluat la 10 octombrie 2020. Arhivat din original la 12 octombrie 2020.

Literatură

Link -uri