Язык моделирования Java ( JML ) — это язык спецификаций для программ Java , использующий предварительные и постусловия и инварианты в стиле Хоара , который следует парадигме проектирования по контракту . Спецификации записываются как комментарии -аннотации Java к исходным файлам, которые, следовательно, могут быть скомпилированы любым компилятором Java .
Различные инструменты проверки, такие как средство проверки утверждений во время выполнения и средство расширенной статической проверки ( ESC/Java ), помогают в разработке.
JML — это язык спецификации поведенческого интерфейса для модулей Java. JML предоставляет семантику для формального описания поведения модуля Java, предотвращая неоднозначность в отношении намерений разработчиков модуля. JML наследует идеи от Eiffel , Larch и Refinement Calculus с целью предоставления строгой формальной семантики, оставаясь при этом доступным для любого программиста Java. Доступны различные инструменты, которые используют поведенческие спецификации JML. Поскольку спецификации могут быть записаны как аннотации в файлах программ Java или сохранены в отдельных файлах спецификаций, модули Java со спецификациями JML могут быть скомпилированы без изменений любым компилятором Java.
Спецификации JML добавляются в код Java в виде аннотаций в комментариях. Комментарии Java интерпретируются как аннотации JML, когда они начинаются со знака @. То есть комментарии вида
//@ <спецификация JML>
или
/*@ <спецификация JML> @*/
Базовый синтаксис JML предоставляет следующие ключевые слова
requires
ensures
signals
signals_only
assignable
pure
assignable \nothing
, но также может выдавать исключения). Кроме того, чистый метод должен всегда либо нормально завершаться, либо выдавать исключение.invariant
loop_invariant
also
assert
spec_public
Базовый JML также предоставляет следующие выражения
\result
\old(<expression>)
<expression>
на момент входа в метод.(\forall <decl>; <range-exp>; <body-exp>)
(\exists <decl>; <range-exp>; <body-exp>)
a ==> b
a
подразумеваетb
a <== b
a
подразумеваетсяb
a <==> b
a
если и только еслиb
а также стандартный синтаксис Java для логических и, или, и не. Аннотации JML также имеют доступ к объектам Java, методам объектов и операторам, которые находятся в области действия аннотируемого метода и имеют соответствующую видимость. Они объединяются для предоставления формальных спецификаций свойств классов, полей и методов. Например, аннотированный пример простого банковского класса может выглядеть как
public class BankingExample { public static final int MAX_BALANCE = 1000 ; private /*@ spec_public @*/ int balance ; private /*@ spec_public @*/ boolean isLocked = false ; //@ public invariant balance >= 0 && balance <= MAX_BALANCE; //@ назначаемый balance; //@ гарантирует balance == 0; public BankingExample () { this . balance = 0 ; } //@ требует 0 < amount && amount + balance < MAX_BALANCE; //@ назначаемый balance; //@ гарантирует balance == \old(balance) + amount; public void credit ( final int amount ) { this . balance += amount ; } //@ требует 0 < amount && amount <= balance; //@ назначаемый balance; //@ гарантирует balance == \old(balance) - amount; public void debit ( final int amount ) { this . balance -= amount ; } //@ гарантирует isLocked == true; public void lockAccount () { this.isLocked = true ; } //@ требует !isLocked; // @ гарантирует \result == balance; //@ также //@ требует isLocked; // @ signals_only BankingException; public / *@ pure @ */ int getBalance () выдает BankingException { if ( ! this.isLocked ) { return this.balance ; } else { throw new BankingException () ; } } }
Полная документация по синтаксису JML доступна в Справочном руководстве JML.
Различные инструменты предоставляют функциональность на основе аннотаций JML. Инструменты JML Iowa State предоставляют компилятор jmlc
проверки утверждений , который преобразует аннотации JML в утверждения времени выполнения, генератор документации jmldoc
, который создает документацию Javadoc, дополненную дополнительной информацией из аннотаций JML, и генератор модульных тестов jmlunit
, который генерирует тестовый код JUnit из аннотаций JML.
Независимые группы работают над инструментами, которые используют аннотации JML. Они включают: