SPARK (programmeringsspråk)

GNISTA
Språkklass multiparadigm
Framträdde i 1988
Utvecklaren Altran , AdaCore
Släpp 22 (2021 ) ( 2021 )
Typ system statisk , strikt , säker , nominativ
Stora implementeringar SPARK Pro, SPARK GPL Edition
Blivit påverkad Helvete , Eiffel
Licens GPLv3
Hemsida adaic.org/advantages/spa...
OS Linux , Microsoft Windows , macOS

SPARK ( SPADE Ada Kernel [1] ) är ett formellt definierat programmeringsspråk , som är en delmängd av Ada [2] , designat för att utveckla verifierad programvara med hög säkerhetsintegritet . SPARK låter dig skapa applikationer som har förutsägbart beteende och ger hög tillförlitlighet.

SPARK språkversioner är relaterade till Ada-versioner och är uppdelade i två generationer: SPARK 83, SPARK 95 och SPARK 2005 (Ada 83, Ada 95 respektive Ada 2005) tillhör den första generationen och SPARK 2014 (Ada 2012) till den andra . Detta beror på det faktum att kommentarer från början användes för att ange specifikationer och kontrakt , men från och med Ada 2012 började aspektmekanismen som dök upp i språket att användas för detta. Detta ledde till en fullständig omdesign av hela språkverktygslådan och uppkomsten av en ny GNATprove-verifierare.

SPARK används inom flyg ( Rolls-Royce Trent jetmotorer [3] , Eurofighter Typhoon [4] och Be-200 [5] flygplan , UK NATS iFACTS system [6] ) och för utveckling av rymdsystem ( Vega launch vehicle , många satelliter [7 ] ). Det används också för att utveckla krypteringssystem [8] och cybersäkerhet [9] [10] [11] .

Begrepp

Målet med SPARK-utvecklingen var att bevara styrkorna hos Ada (som paketsystemet och begränsade typer) och ta bort alla potentiellt osäkra eller tvetydiga konstruktioner från det [1] , eftersom Ada, trots de angivna utvecklingsmålen, visade sig vara en ganska komplext språk och hade inte en fullständig formell definition [1] , och några av dess delar har orsakat allvarlig kritik [12] . SPARK-program bör vara entydiga, deras beteende bör inte bero på valet av kompilator [K 1] , kompileringsalternativ och miljöns tillstånd. För att göra detta har vissa begränsningar införts i språket, inklusive: användningen av uppgifter är endast möjlig i Ravenscar-profilen; uttryck tillåter inte biverkningar ; det är förbjudet att använda kontrollerade typer, för vilka det är möjligt att omdefiniera initieringsprocedurer och tilldelningsoperatör; kombination av namn är förbjuden; begränsad användning av vissa operatörer som goto ; dynamisk minnesallokering är förbjuden (men typer med dynamiska gränser och typer med diskriminanter är tillåtna) [2] .

Alla SPARK-program kan dock fortfarande kompileras av Ada-kompilatorn, som låter dig blanda dessa språk i ett projekt.

SPARK-utvecklarna lyckades få ett språk som är bekvämt för automatisk verifiering, som har enkel semantik, en strikt formell definition, logisk korrekthet och bra uttrycksförmåga [1] .

Kontrakt och beroenden

För en procedur som ökar värdet på en global variabel med dess argument om den är positiv, och med en annars, kan du skriva följande specifikation:

procedur Add_to_Total ( Value : in Heltal ) med Global => ( In_Out => Total ), Depends => ( Total => ( Total , Value )), Pre => ( Totalt < Integer ' Last - ( om Värde > 0 värde else 1 )), Post => ( Totalt = Totalt ' Old + ( om Värde > 0 Värde annat 1 ));

Global aspekten visar vilka globala variabler proceduren har tillgång till. I det här fallet använder den bara variabeln Total för att läsa och skriva. Depends visar förhållandet mellan variabler: det nya värdet på Total beror på dess gamla värde och värdet på Value . Förutsättning  - en förutsättning, det visar vilket tillstånd av programmet bör vara innan förfarandet utförs; i detta fall kontrollerar förutsättningen om ett spill inträffar. Post  är ett eftervillkor, det visar programmets tillstånd efter att proceduren har utförts.

Utöver aspekter av rutiner finns det andra sätt att specificera begränsningar för ett programs tillstånd, till exempel kontrollera uttalanden:

pragma hävda ( tillstånd );

eller loopinvarianter:

pragma Loop_Invariant ( villkor );

Samtidigt finns det betydande skillnader i syntaxen för att beskriva kontrakt för SPARK-versionerna av första och andra generationen.

Den första generationen av språket använde speciella kommentarer:

-- Dubbla ett naturligt tal. procedur Dubbel ( X : in ut Naturlig ); --# pre X < Natural'Last / 2; --# post X = 2 * X~;

Motsvarande kod för andra generationen:

-- Dubbla ett naturligt tal. procedur Dubbel ( X : in ut Naturlig ) med Pre => X < Natural ' Last / 2 , Post => X = 2 * X ' Old ;

Verifiering

Vid verifiering av program används följande metoder:

  • kontrollera uppfyllandet av för- och eftervillkor för funktioner;
  • kontrollera frånvaron av kod som kan skapa ett undantag ;
  • strömningsberoendeanalys, som kontrollerar initieringen av variabler och förhållandet mellan parametrar och resultatet av funktioner.

För att bevisa programmets riktighet skapas uppsättningar av verifieringssatser för alla konstruktioner som används av programmeraren, såsom pre- och postconditions. GNATprove-verifieraren kan också, i vissa fall, generera verifieringspåståenden på egen hand. Så, kontroller för out of bounds of arrays eller typer, overflow och division med noll kommer att utföras.

Vidare överförs en uppsättning verifieringsutlåtanden och data om programmets initiala tillstånd, såväl som icke verifierbara uttalanden som tagits emot från utvecklaren, till det automatiska bevisprogrammet. GNATprove använder Why3-plattformen [13] och CVC4, Z3 och Alt-Ergo [14] testsäkra system . Tredjepartssystem som Coq [14] kan också användas för bevis .

Historik

Den första versionen av SPARK (baserad på Ada 83) skapades vid University of Southampton med stöd av det brittiska försvarsministeriet av Bernard Carré och Trevor Jennings , författare till det pålitliga programmeringssystemet SPADE-Pascal [15] Pascal . Vidare arbetade följande företag med att förbättra språket: Program Validation Limited, Praxis Critical Systems Limited (nedan kallat Altran-Praxis, Altran) och AdaCore.

I början av 2009 ingick Praxis ett avtal med AdaCore och släppte SPARK Pro under villkoren i GPL [16] . Sedan i juni 2009 släpptes SPARK GPL Edition, som syftar till gratis och akademisk mjukvaruutveckling.

Utgivningen av den andra generationens språkversion SPARK 2014 tillkännagavs den 30 april 2014 [17] .

Se även

Anteckningar

Kommentarer

  1. Från och med 2020 stöder endast en kompilator (GNAT) Ada 2012 fullt ut, och SPARK 2014 kan endast användas med den.

Källor

  1. ↑ 1 2 3 4 SPARK - SPADEN Ada-kärnan (inklusive RavenSPARK) . docs.adacore.com . Hämtad 10 oktober 2020. Arkiverad från originalet 7 september 2021.
  2. ↑ 1 2 Certifiering med SPARK . www.ada-ru.org . Hämtad 10 oktober 2020. Arkiverad från originalet 13 maj 2021.
  3. Johannes Kliemann. Programverifiering med SPARK - När din kod inte får misslyckas (2018). Hämtad 10 oktober 2020. Arkiverad från originalet 16 maj 2021.
  4. Eurofighter Typhoon - Kundprojekt - AdaCore . www.adacore.com . Hämtad 10 oktober 2020. Arkiverad från originalet 21 september 2020.
  5. Be-200 flygplan . www.ada-ru.org . Hämtad 10 oktober 2020. Arkiverad från originalet 13 maj 2021.
  6. ↑ GNAT Pro vald för Storbritanniens  nästa generations ATC-system  ? . AdaCore . Hämtad 10 oktober 2020. Arkiverad från originalet 21 september 2020.
  7. Space - AdaCore . www.adacore.com . Hämtad 10 oktober 2020. Arkiverad från originalet 21 oktober 2020.
  8. Praktiskt . Ada-derived Skein krypto visar SPARK , SD Times , BZ Media LLC (24 augusti 2010). Arkiverad från originalet den 25 augusti 2010. Hämtad 31 augusti 2010.
  9. David Hardin, Konrad Slind, Mark Bortz, James Potts, Scott Owens. Ett högsäkerhets-, högpresterande hårdvarubaserat system över flera domäner  //  Datorsäkerhet, tillförlitlighet och säkerhet / Amund Skavhaug, Jérémie Guiochet, Friedemann Bitsch. - Cham: Springer International Publishing, 2016. - S. 102–113 . - ISBN 978-3-319-45477-1 . - doi : 10.1007/978-3-319-45477-1_9 . Arkiverad från originalet den 20 januari 2022.
  10. Genode - Genodoperativsystemramverk . genode.org . Hämtad 10 oktober 2020. Arkiverad från originalet 28 oktober 2020.
  11. Muen | SK för x86/64 . muen.sk. _ Hämtad 10 oktober 2020. Arkiverad från originalet 25 oktober 2020.
  12. Henry F. Ledgard, Andrew Singer. Skala ner Ada (eller mot en standard Ada-delmängd)  // Kommunikation av ACM. - 1982-02-01. - T. 25 , nej. 2 . — S. 121–125 . — ISSN 0001-0782 . - doi : 10.1145/358396.358402 .
  13. Varför3 . why3.lri.fr. _ Hämtad 10 oktober 2020. Arkiverad från originalet 12 oktober 2020.
  14. ↑ 1 2 Alternativa Provers - SPARK Användarhandbok 22.0w . docs.adacore.com . Hämtad 10 oktober 2020. Arkiverad från originalet 12 oktober 2020.
  15. Bernard Carre. Tillförlitlig programmering på standardspråk  (engelska)  // High-Integrity Software / CT Sennett. — Boston, MA: Springer US, 1989. — S. 102–121 . - ISBN 978-1-4684-5775-9 . - doi : 10.1007/978-1-4684-5775-9_5 .
  16. Praxis och AdaCore tillkännager SPARK  Pro . AdaCore . Hämtad 10 oktober 2020. Arkiverad från originalet 21 september 2020.
  17. Användning av SPARK i ett  certifieringssammanhang . AdaCore-bloggen . Hämtad 10 oktober 2020. Arkiverad från originalet 12 oktober 2020.

Litteratur

Länkar