SCÂNTEIE | |
---|---|
Clasa de limba | multi-paradigma |
Aparut in | 1988 |
Dezvoltator | Altran , AdaCore |
Eliberare | 22 (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] .
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] .
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 ;La verificarea programelor se folosesc următoarele metode:
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 .
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] .
Comentarii
Surse