Java Modeling Language ( JML ) は、 Javaプログラム用の仕様記述言語であり、 Hoare スタイルの事前条件、事後条件、および不変条件を使用し、契約による設計パラダイムに従います。仕様は、ソースファイルへのJava アノテーションコメントとして記述されるため、任意の Javaコンパイラでコンパイルできます。
ランタイムアサーションチェッカーや拡張静的チェッカー(ESC/Java)などのさまざまな検証ツールは、開発を支援します。
JMLは、Javaモジュールの振る舞いインターフェース仕様言語です。JMLは、Javaモジュールの振る舞いを形式的に記述するためのセマンティクスを提供し、モジュール設計者の意図に関する曖昧さを解消します。JMLは、 Eiffel、Larch、およびRefinement Calculusの理念を受け継ぎ、厳密な形式的セマンティクスを提供しつつ、あらゆるJavaプログラマが利用できるように設計されています。JMLの振る舞い仕様を利用する様々なツールが利用可能です。仕様はJavaプログラムファイル内の注釈として記述することも、別の仕様ファイルに保存することもできるため、JML仕様を持つJavaモジュールは、どのJavaコンパイラでも変更せずにコンパイルできます。
JML仕様は、コメント内の注釈の形でJavaコードに追加されます。Javaコメントは、@記号で始まる場合、JML注釈として解釈されます。つまり、次の形式のコメントはJML注釈として解釈されます。
//@ <JML仕様>または
/*@ <JML仕様> @*/基本的なJML構文では、以下のキーワードが提供されます。
requiresensuressignalssignals_onlyassignablepureassignable \nothing例外をスローする可能性もあります)。さらに、純粋メソッドは常に正常に終了するか、例外をスローするかのいずれかであるべきです。invariantloop_invariantalsoassertspec_public基本的なJMLでは、以下の式も提供されています。
\result\old(<expression>)<expression>メソッドに入る時点での値を参照するための修飾子。(\forall <decl>; <range-exp>; <body-exp>)(\exists <decl>; <range-exp>; <body-exp>)a ==> ba暗示するba <== ba暗示されているのはba <==> baかつその場合に限り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; //@ 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ツールは、JMLアノテーションをランタイムアサーションに変換するアサーションチェックコンパイラ、JMLアノテーションからの追加情報で拡張されたJavadocドキュメントを生成するドキュメントジェネレータ、そしてJMLアノテーションからJUnitテストコードを生成する単体テストジェネレータを提供している。jmlcjmldocjmlunit
独立したグループが、JMLアノテーションを利用するツールの開発に取り組んでいます。これには以下が含まれます。