JavaとJML

檜山 正幸
2005-07 執筆
2006-04 公開

この記事は「JavaWorld」誌の「私が感動したJavaソースコード」というコー ナーに掲載されたエッセイの原稿です。雑誌掲載後かなり時間がたったので公 開します(掲載記事とは若干の違いがあります)。記事内のURLのなかには、 現在ではアクセス不可能であったり、移転したものがあるかもしれません。

キレイに書かれたコードを見ると“感心”します。ですが、それはどうも “感動”とは違うような気がします。例えば、Perlの作者であるラリー・ウォー ルが(Perlより前に)書いたニュースリーダー「rn」のC言語ソースコードは かなりトンデモナイものです。感心しません。が、そのえぐさは感動ものでし た。

CやC++では、言語処理系やOSに関する知識に基づきトリッキーなワザを使っ たヤバいコードをよく見かけました。一方、Javaはというと、プラットフォー ムに依存しない行儀がよいコードを書きやすいプログラミング言語です。言い 換えれば、邪悪なコードが書きにくいように工夫されています。ですから、ギョッ とするようなすさまじいコードにお目にかかることは少なくなってしまったよ うです。もちろん、これは良い傾向なのでして、アクロバティックなプログラ ミングを推奨する気はありません。

そうです、Javaは、計算科学やソフトウェア工学から見ても優等生プログラ ミング言語なのです。腕力や悪戯でいきがっている不良言語とは違います(まー、 不良のほうがステキってのもあったりしますけど…)。であるなら、ギョッと するほどに正統派、すさまじくも品行方正なJavaコードはないものでしょうか?

それがあるんですよ、実は。だいぶ古い話になりますが、1999年から2000年 ごろ、Vector_annotated.javaというソースコードがインターネット上に公開 されていました(残念ながら今は見あたりません)。これは、究極の品行方正 コードで、お行儀のよさもここまでくれば感動ものです。いったいどういうも のかって? このソースコードは、Sunが提供しているVectorクラスのコードそ のものです。「なるほど、標準ライブラリのコードならお手本になるくらいに キレイだろう」って、いやっ、そうじゃありません。

問題は、オリジナルのライブラリコードに追加されたコメントです。そのコ メントは、オランダのバート・ジャコブス( http://www.cs.ru.nl/~bart/)を中心 とするグループにより付加されたもので、単なるコメントではなくて、JML (Java Modeling Language; http://www.jmlspecs.org/)という仕様記 述言語による制約条件なのです(LIST1)。

LIST1: JMLコメント付きのJavaソースコード
/*@
  @ normal_behavior
  @  requires: (\forall (int i) 0 <= i && i < elementCount
  @                             ==> elementData[i] != null);
  @  ensures: true;
  @ also
  @ exceptional_behavior
  @  requires: elementCount > 0 &&
  @            !(\forall (int i) 0 <= i && i < elementCount
  @                              ==> elementData[i] != null);
  @  signals: (NullPointerException) true;
  @*/
public final synchronized String toString() {
 // ...
}

ジャコブスのグループは、JMLコメント付きのJavaソースコードを、ある種の コンパイラ(JMLコンパイラとは別物)と手作業で一群の論理式に変換して、 定理証明系PVS(http://pvs.csl.sri.com/) を使った検証までしています。このような仕様記述と検証が現に可能であると いう点がJavaの優れた特性を示しているといえるでしょう。

詳細は、 http://www.cs.ru.nl/research/reports/info/CSI-R0007.htmlから入手で きる、"A Case Study in Class Library Verification: Java's Vector Class"という論文に記述されています。また、JMLについては、 "Disign by Contract with JML" ftp://ftp.cs.iastate.edu/pub/leavens/JML/jmldbc.pdfという、DBC(契 約による設計)の観点から書かれた新しい(2005年の)解説があります。

ジャコブス達のように、定理証明系による静的検証はJMLやPVSの極端にヘビー な使い方で、それゆえに感動をおぼえるのですが、仕様記述/検証ツールが一 般化すれば、当たり前のことになるのしょうか。そうなることを私は期待して ますが、道は遠いかもしれません。