Язык моделирования Java

редактировать

Язык моделирования Java (JML ) является спецификацией язык для программ Java, использующий стиль Хоара предварительные и постусловия и инварианты, которые следует парадигме дизайн по контракту. Спецификации записываются как комментарии Java к исходным файлам, которые, следовательно, могут быть скомпилированы любым компилятором Java .

различными инструментами проверки, такими как средство проверки утверждений во время выполнения и расширенное средство проверки статических данных (ESC / Java ) помощь в разработке.

Содержание

  • 1 Обзор
  • 2 Синтаксис
  • 3 Поддержка инструментов
  • 4 Ссылки
  • 5 Внешние ссылки

Обзор

JML - это язык спецификации интерфейса поведения для Java модули. JML предоставляет семантику для формального описания поведения модуля Java, предотвращая двусмысленность в отношении намерений разработчиков модуля. JML унаследовал идеи от Eiffel, Larch и Refinement Calculus с целью обеспечения строгой формальной семантики, оставаясь при этом доступным любому Java-программисту. Доступны различные инструменты, использующие поведенческие спецификации JML. Поскольку спецификации могут быть записаны как аннотации в программных файлах Java или сохранены в отдельных файлах спецификаций, модули Java со спецификациями JML могут быть скомпилированы без изменений с любым компилятором Java.

Синтаксис

Спецификации JML добавляются в код Java в виде аннотаций в комментариях. Комментарии Java интерпретируются как аннотации JML, если они начинаются со знака @. То есть комментарии в форме

// @ 

или

/ * @ @ * /

Базовый синтаксис JML предоставляет следующие ключевые слова

требует
Определяет предварительное условие для последующего метода.
гарантирует, что
Определяет постусловие для следующего метода.
signal
Определяет постусловие, когда заданное Exception генерируется следующим методом.
signal_only
Определяет, какие исключения могут быть выброшены при выполнении данного предусловия.
назначаемый
Определяет, какие поля могут быть присвоены с помощью следующего метода.
pure
Объявляет метод без побочных эффектов (например, assignable \ nothing, но может также вызывать исключения). Кроме того, чистый метод должен всегда либо завершаться нормально, либо вызывать исключение.
invariant
Определяет инвариантное свойство класса.
loop_invariant
Определяет инвариант цикла для цикла.
также
Объединяет варианты спецификации и может также объявлять, что метод наследует спецификации от своих супертипов.
assert
Определяет утверждение JML .
spec_public
Объявляет защищенную или частную переменную общедоступной для целей спецификации.

Базовый JML также предоставляет следующие выражения

\ result
Идентификатор для возвращаемого значения следующего метода.
\ old ()
Модификатор для ссылки на значение во время входа в метод.
(\ forall ; ; )
Универсальный квантификатор .
(\ exists ; ; )
экзистенциальный квантификатор.
a ==>b
aподразумевает, что b
a <== b
aподразумевается b
a <==>b
aтогда и только тогда, когда b

, а также стандартный синтаксис Java для логического and, or и not. Аннотации JML также имеют доступ к Java o Объекты, методы и операторы объектов, которые находятся в рамках аннотируемого метода и имеют соответствующую видимость. Они объединены, чтобы предоставить формальные спецификации свойств классов, полей и методов. Например, аннотированный пример простого банковского класса может выглядеть как

public class BankingExample {public static final int MAX_BALANCE = 1000; private / * @ spec_public @ * / int balance; private / * @ spec_public @ * / логическое isLocked = false; // @ public invariant balance>= 0 balance <= MAX_BALANCE; //@ assignable balance; //@ ensures balance == 0; public BankingExample() { this.balance = 0; } //@ requires 0 < amount amount + balance < MAX_BALANCE; //@ assignable balance; //@ ensures balance == \old(balance) + amount; public void credit(final int amount) { this.balance += amount; } //@ requires 0 < amount amount <= balance; //@ assignable balance; //@ ensures balance == \old(balance) - amount; public void debit(final int amount) { this.balance -= amount; } //@ ensures isLocked == true; public void lockAccount() { this.isLocked = true; } //@ requires !isLocked; //@ ensures \result == balance; //@ also //@ requires isLocked; //@ signals_only BankingException; public /*@ pure @*/ int getBalance() throws BankingException { if (!this.isLocked) { return this.balance; } else { throw new BankingException(); } } }

Полная документация по синтаксису JML доступна в Справочном руководстве JML.

Поддержка инструментов

Различные инструменты обеспечивают функциональность на основе аннотаций JML. Инструменты JML штата Айова обеспечивают проверку утверждений compiler jmlc, который преобразует аннотации JML в утверждения среды выполнения, генератор документации jmldoc, который создает Javadoc документация дополнена дополнительной информацией из аннотаций JML и генератором модульных тестов jmlunit, который генерирует тестовый код JUnit из аннотаций JML.

Независимые группы работают над инструментами, использующими аннотации JML. К ним относятся:

  • ESC/Java2 [1], расширенная статическая проверка, которая использует аннотации JML для выполнения более строгой статической проверки, чем это возможно в противном случае.
  • OpenJML заявляет о себе преемник ESC / Java2.
  • Daikon, динамический генератор инвариантов.
  • KeY, который предоставляет средство доказательства теорем с открытым исходным кодом с интерфейсом JML и Eclipse плагин (JML Editing ) с поддержкой подсветки синтаксиса JML.
  • Krakatoa, инструмент статической проверки, основанный на проверке Why платформа и с помощью Coq proof assistant.
  • JMLEclipse, плагин для интегрированной среды разработки Eclipse с поддержкой синтаксиса JML и интерфейсом для различных инструментов, использующих аннотации JML.
  • Sireum / Kiasan, статический анализатор на основе символьного исполнения, который поддерживает JML в качестве языка контрактов.
  • JMLUnit, инструмент для создания файлов для запуска тестов JUnit на файлах Java с аннотациями JML.
  • TACO, открытый исходный код инструмент анализа программ, который статически проверяет соответствие программы Java ее спецификации языка моделирования Java.
  • VerCors Verifier

Ссылки

  • Гэри Т. Ливенс и Ёнсик Чеон. Дизайн по контракту с JML; Черновик учебника.
  • Гэри Т. Ливенс, Альберт Л. Бейкер и Клайд Руби. JML: обозначение для детального проектирования; в Хаим Килов, Бернхард Румпе и Ян Симмондс (редакторы), Поведенческие спецификации предприятий и систем, Kluwer, 1999, глава 12, страницы 175-188.
  • Гэри Т. Ливенс, Эрик Полл, Кертис Клифтон, Юнсик Чеон, Клайд Руби, Дэвид Кок, Питер Мюллер, Джозеф Кинири, Патрис Чалин и Дэниел М. Циммерман. Справочное руководство JML (DRAFT), сентябрь 2009 г. HTML
  • Марике Хейсман, Вольфганг Арендт, Даниэль Брунс и Мартин Хентшель. Формальная спецификация с JML. 2014. скачать (CC-BY-NC-ND)

Внешние ссылки

Последняя правка сделана 2021-05-24 03:57:17
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте