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

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

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

Обзор

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

Синтаксис

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

// @ <спецификация JML>

или же

/ * @ <Спецификация JML> @ * /

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

требует
Определяет предварительное условие на метод что следует.
обеспечивает
Определяет постусловие по следующему методу.
сигналы
Определяет постусловие, когда задано Исключение выбрасывается следующим методом.
signal_only
Определяет, какие исключения могут возникать при выполнении данного предусловия.
назначаемый
Определяет, каким полям разрешено назначать следующий метод.
чистый
Объявляет метод без побочных эффектов (например, назначаемый ничего но также может вызывать исключения). Более того, чистый метод должен всегда либо завершаться нормально, либо вызывать исключение.
инвариантный
Определяет инвариантное свойство класса.
loop_invariant
Определяет инвариант цикла для петли.
также
Объединяет случаи спецификации, а также может объявить, что метод наследует спецификации от своих супертипов.
утверждать
Определяет JML утверждение.
spec_public
Объявляет защищенную или частную переменную общедоступной для целей спецификации.

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

результат
Идентификатор возвращаемого значения следующего метода.
старый (<выражение>)
Модификатор для ссылки на значение <expression> во время входа в метод.
( forall ; ; )
В универсальный квантор.
( существует ; ; )
В экзистенциальный квантификатор.
а ==> б
а подразумевает б
а <== б
а подразумевается б
а <==> б
а если и только если б

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

общественный учебный класс Банковское делоПример{     общественный статический окончательный int MAX_BALANCE = 1000;     частный / * @ spec_public @ * / int баланс;    частный / * @ spec_public @ * / логический isLocked = ложный;      // @ публичный инвариантный баланс> = 0 && balance <= MAX_BALANCE;     // @ назначаемый баланс;    // @ обеспечивает баланс == 0;    общественный Банковское делоПример()    {        это.баланс = 0;    }     // @ требуется 0 <сумма && сумма + баланс     // @ назначаемый баланс;    // @ обеспечивает баланс ==  old (balance) + amount;    общественный пустота кредит(окончательный int количество)    {        это.баланс += количество;    }     // @ требуется 0 <сумма && сумма <= баланс;    // @ назначаемый баланс;    // @ обеспечивает баланс ==  old (balance) - amount;    общественный пустота списание средств(окончательный int количество)    {        это.баланс -= количество;    }     // @ гарантирует isLocked == true;    общественный пустота lockAccount()    {        это.isLocked = истинный;    }     // @ требуется! isLocked;    // @ обеспечивает  result == баланс;    //@ также    // @ требует isLocked;    // @ signal_only BankingException;    общественный /*@ чистый @*/ int getBalance() бросает BankingException    {        если (!это.isLocked)        {                возвращаться это.баланс;        }        еще        {                бросать новый BankingException();        }    }}

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

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

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

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

  • ESC / Java2 [1], расширенная статическая проверка, которая использует аннотации JML для выполнения более строгой статической проверки, чем это возможно в противном случае.
  • OpenJML объявляет себя преемником ESC / Java2.
  • Дайкон, динамический инвариантный генератор.
  • Ключ, который предоставляет средство доказательства теорем с открытым исходным кодом, интерфейс JML и Затмение плагин (Редактирование JML ) с поддержкой подсветка синтаксиса JML.
  • Кракатау, инструмент статической проверки, основанный на Почему платформа проверки и использование Coq помощник доказательства.
  • JMLEclipse, плагин для интегрированной среды разработки Eclipse с поддержкой синтаксиса JML и интерфейсом для различных инструментов, использующих аннотации JML.
  • Сиреум / Киасан, статический анализатор на основе символьного исполнения, который поддерживает JML в качестве языка контрактов.
  • JMLUnit, инструмент для создания файлов для запуска тестов JUnit на файлах Java с аннотациями JML.
  • ТАКО, инструмент анализа программ с открытым исходным кодом, который статически проверяет соответствие программы Java ее спецификации языка моделирования Java.
  • Верификатор VerCors

Рекомендации

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

внешняя ссылка