Java Modeling Language - Java Modeling Language
tento článek vyžaduje pozornost odborníka na toto téma.Červenec 2010) ( |
The Java Modeling Language (JML) je specifikační jazyk pro Jáva programy pomocí Hoare styl před a dodatečné podmínky a invarianty, který navazuje na design podle smlouvy paradigma. Specifikace jsou psány jako Anotace Java komentáře ke zdrojovým souborům, které lze tedy kompilovat s jakoukoli Javou překladač.
Různé ověřovací nástroje, jako je kontrola běhového modulu a rozšířená statická kontrola (ESC / Java ) rozvoj pomoci.
Přehled
JML je jazyk specifikací behaviorálního rozhraní pro moduly Java. JML poskytuje sémantika formálně popsat chování modulu Java a zabránit nejednoznačnosti ohledně záměrů návrhářů modulů. JML dědí nápady od Eiffelova, Modřín a Zušlechťovací počet, s cílem poskytovat přísnou formální sémantiku a přitom být stále přístupný jakémukoli programátoru Java. K dispozici jsou různé nástroje, které využívají specifikace chování JML. Protože specifikace lze zapsat jako poznámky do programových souborů Java nebo uložit do samostatných souborů specifikací, lze moduly Java se specifikacemi JML kompilovat beze změny s libovolným kompilátorem Java.
Syntax
Specifikace JML jsou přidávány do kódu Java ve formě poznámek v komentářích. Komentáře Java jsou interpretovány jako poznámky JML, když začínají znakem @. To znamená komentáře k formuláři
// @
nebo
/ * @@ * /
Základní syntaxe JML poskytuje následující klíčová slova
vyžaduje
- Definuje a předpoklad na metoda to následuje.
zajišťuje
- Definuje a podmínka o metodě, která následuje.
signály
- Definuje postkondicii pro daný okamžik Výjimka je vyvolána metodou, která následuje.
pouze signály
- Definuje, jaké výjimky mohou být vyvolány, když zadaná podmínka platí.
přiřaditelné
- Definuje, ke kterým polím je možné přiřadit následující metoda.
čistý
- Deklaruje metodu jako vedlejší účinek zdarma (jako
přiřaditelné nic
ale může také vyvolat výjimky). Kromě toho se předpokládá, že čistá metoda vždy končí normálně nebo vyvolá výjimku. neměnný
- Definuje invariantní vlastnost třídy.
loop_invariant
- Definuje a smyčka neměnná pro smyčku.
taky
- Kombinuje případy specifikace a může také deklarovat, že metoda dědí specifikace ze svých supertypů.
tvrdit
- Definuje JML tvrzení.
spec_public
- Deklaruje chráněnou nebo soukromou proměnnou jako veřejnou pro účely specifikace.
Základní JML také poskytuje následující výrazy
výsledek
- Identifikátor pro návratovou hodnotu metody, která následuje.
old (
) - Modifikátor odkazující na hodnotu
<expression>
v době vstupu do metody. ( forall
; ; ) - The univerzální kvantifikátor.
( existuje
; ; ) - The existenční kvantifikátor.
a ==> b
A
naznačujeb
a <== b
A
je naznačenob
a <==> b
A
kdyby a jen kdybyb
stejně jako standard Syntaxe Java pro logické a, nebo, a ne. Anotace JML mají také přístup k objektům Java, objektovým metodám a operátorům, které jsou v rozsahu anotované metody a které mají odpovídající viditelnost. Ty jsou kombinovány, aby poskytly formální specifikace vlastností tříd, oborů a metod. Například může vypadat anotovaný příklad jednoduché bankovní třídy
veřejnost třída Příklad bankovnictví{ veřejnost statický finále int MAX_BALANCE = 1000; soukromé / * @ spec_public @ * / int Zůstatek; soukromé / * @ spec_public @ * / booleovský je zamčeno = Nepravdivé; // @ veřejný invariantní zůstatek> = 0 && zůstatek <= MAX_BALANCE; // @ přiřaditelný zůstatek; // @ zajišťuje zůstatek == 0; veřejnost Příklad bankovnictví() { tento.Zůstatek = 0; } // @ vyžaduje 0 <částka && částka + zůstatek // @ přiřaditelný zůstatek; // @ zajišťuje zůstatek == starý (zůstatek) + částka; veřejnost prázdnota kredit(finále int množství) { tento.Zůstatek += množství; } // @ vyžaduje 0 <částka && částka <= zůstatek; // @ přiřaditelný zůstatek; // @ zajišťuje zůstatek == starý (zůstatek) - částka; veřejnost prázdnota debet(finále int množství) { tento.Zůstatek -= množství; } // @ zajišťuje isLocked == true; veřejnost prázdnota lockAccount() { tento.je zamčeno = skutečný; } // @ vyžaduje! isLocked; // @ zajišťuje výsledek == zůstatek; //@ taky // @ vyžaduje isLocked; // @ signal_only BankingException; veřejnost / * @ pure @ * / int getBalance() hodí BankingException { -li (!tento.je zamčeno) { vrátit se tento.Zůstatek; } jiný { házet Nový BankingException(); } }}
K dispozici je úplná dokumentace syntaxe JML v referenční příručce JML.
Podpora nástrojů
Řada nástrojů poskytuje funkce založené na anotacích JML. Nástroje JML státu Iowa poskytují kontrolu tvrzení překladač jmlc
který převádí anotace JML na runtime tvrzení, generátor dokumentace jmldoc
který vyrábí Javadoc dokumentace rozšířená o další informace z anotací JML a generátor testů jednotek jmlunit
který generuje JUnit testovací kód z anotací JML.
Nezávislé skupiny pracují na nástrojích, které využívají anotace JML. Tyto zahrnují:
- ESC / Java2 [1], rozšířená statická kontrola, která používá anotace JML k provádění přísnější statické kontroly, než je jinak možné.
- OpenJML se prohlašuje za nástupce ESC / Java2.
- Daikon, dynamický invariantní generátor.
- Klíč, který poskytuje testovací teorém otevřeného zdroje s front-endem JML a Zatmění zapojit (Úpravy JML ) s podporou pro zvýraznění syntaxe JML.
- Krakatoa, statický ověřovací nástroj založený na Proč ověřovací platformu a pomocí Coq důkaz asistent.
- JMLEclipse, plugin pro integrované vývojové prostředí Eclipse s podporou syntaxe JML a rozhraní k různým nástrojům, které využívají anotace JML.
- Sireum / Kiasan, symbolický statický analyzátor založený na provádění, který podporuje JML jako smluvní jazyk.
- JMLUnit, nástroj pro generování souborů pro spouštění testů JUnit na JML anotovaných souborech Java.
- TACO, nástroj pro analýzu programů s otevřeným zdrojovým kódem, který staticky kontroluje soulad programu Java s jeho specifikací Java Modeling Language.
- VerCors ověřovatel
Reference
- Gary T. Leavens a Yoonsik Cheon. Návrh na základě smlouvy s JML; Návrh tutoriálu.
- Gary T. Leavens, Albert L. Baker a Clyde Ruby. JML: Zápis pro podrobný design; v Haim Kilov, Bernhard Rumpe a Ian Simmonds (redaktoři), Specifikace chování podniků a systémů, Kluwer, 1999, kapitola 12, strany 175-188.
- Gary T. Leavens, Erik Poll, Curtis Clifton, Yoonsik Cheon, Clyde Ruby, David Cok, Peter Müller, Joseph Kiniry, Patrice Chalin a Daniel M. Zimmerman. Referenční příručka JML (NÁVRH), září 2009. HTML
- Marieke Huisman, Wolfgang Ahrendt, Daniel Bruns a Martin Hentschel. Formální specifikace s JML. 2014. ke stažení (CC-BY-NC-ND)