情報処理学会研究報告
IPSJ SIG Technical Report

1. は じ め に

OCL の JML への変換ツールの実装と評価

OCL(Object Constraint Language)1) は UML 記述に対し，さらに詳細に性質記述を行うために設計された言語で，OMG によって標準化されている．

宮 澤

清

介†1

岡

野

浩

三†1

楠 本 真

二†1

より実装に近い面での制約記述言語として，Java プログラムに対して JML (Java Mod-

eling Language)2) が提案されている．JML，OCL ともに DbC (Design by Contract)3) の概念に基づきクラスやメソッドの仕様を与えることができる．

近年 MDA 関連技術の発展により，UML からプログラム言語への変換技術が注
目をあびており，それに伴い OCL(Object Constraint Language) から JML(JavaModelling Language) への変換技術も研究されつつある．従来研究では OCL からの JML への変換についてコレクションに関するいくつかの重要な機能，とりわけ，
iterate に非対応であった．研究グループではこの問題に対し，生成される Java スケ
ルトンに対応するメソッドを記述するという方法で対応し，その手法に基づいた OCLからの JML への変換ツールの実装方法を示した．本稿では従来研究で対応していなかった演算の変換規則と入れ子になった iterate の変換方法を示し，ツールに実装した．1 メソッドに対して，ツールが出力した JML と手書きのものを用いて JML ラ
ンタイムアサーションチェッカの実行時間を比較した結果，両方とも 1ms で実行完了
した．また，変換速度を計測したところ，約 20ms で変換できた．

近年 MDA(Model Driven Architecture)4) 関連技術の発展により，UML からプログラ
ム言語への変換技術が注目をあびている．UML クラス記述から Java スケルトンコードを自動生成する方法についてはすでに既存研究で多くの方法が提案されており5),6) ，自動変換ツールも EMF フレームワークを用いた Eclipse プラグインなどの形で公開されている7) ．
一方 OCL から JML への変換については Hamie が文献8) において構文変換技法に基づいた OCL から JML への変換法を提案しており，Rodion と Alessandra らが文献9) において，Hamie の研究の拡張とツールの実装を示している．また，Avila らが文献10) にて型の扱いなどについて改善を示しているものの，いずれの方法も Collection の対応が不十分であり，iterate の対応が一部の演算に対応しているのみである．しかし，iterate は広く用い

On Implementation and Evaluation ofa Translater from OCL into JMLられる演算であるため，対応すべき問題だと考えられる．
著者の所属する研究グループは，OCL 記述が付加されたクラス図に対して，JML 記述への変換法を具体的に提示し11) ，簡単な実装を行った12) ．本稿では文献11),12) で議論が不十Kiyoyuki Miyazawa ,†1 Kozo Okano †1
and Shinji Kusumoto†1

分だった点を実装し，小規模な評価実験を行った．
以降，2. で背景について述べ，3. で文献11) で提案した手法と議論が不十分だった点について述べる．そして 4. で実装について述べ，5. で評価について述べ，6. でまとめる．

In recent years, MDA techniques have been strong developed, thus translation techniques such as translation from OCL (Object Constraint Language) to
JML (Java Modelling Language), as well as UML to some program languages,
have gained a lot of attention. Past researches on translation from OCL to
JML often pays little attention to collection features, especially iteration. Our
research group has proposed a method to overcome such the problem by using
Java method templates and implemented a tool. In this report, we present the
new translation rules, how to translate nested iterate, as well as implementationof the tool and its evaluation. In this evaluation, we compared execution timeof the JML runtime assertion checker using the JML automatically generated
and handwritten one. Both of them are 1ms. In addition, execution time of
OCL-JML translation is about 20ms.

2. 準

備

ここでは研究の背景となる諸技術と関連研究について簡単に触れる．

2.1 OCL
OCL(Object Constraint Language) は UML モデルに対し，さらに詳細に性質記述を行うために設計された言語であり，UML と同様に OMG によって標準化されている．UML†1 大阪大学 大学院情報科学研究科
Graduate School of Information Science and Technology, OsakaUniversity1

c 2010 Information Processing Society of Japan⃝

情報処理学会研究報告
IPSJ SIG Technical Report

では，実装時にモデルがどのように開発されるべきか，といった詳細な情報を表すことがでに繰り返し評価されない.
文献11) では個々のループ演算に対応する Java メソッドを用意することでこの問題を解きない．このような問題を解決するため，OCL が導入された．

2.2 JML

決することを提案した．iterate 演算はデータベースをモデル化する際など，広く用いられJML(Java Modeling Language) は，Java のメソッドやオブジェクトに対して制約を記る演算であるため，文献11) はこの演算の変換に対応するアルゴリズムを示したという点で述する言語である。記述においては Java の文法を踏襲し，初心者でも記述しやすい特徴を有用である．しかし，文献11) では具体的な実装方法までは示しておらず，生成される JML持つ．また，記述は Java コメント中に記述できるため，プログラムの実装，コンパイルやが実用的なものであるかといった評価がなされていない．
本研究では変換に際し型情報を用いた，より厳密な変換プロセスを提案し，そのプロセス

実行に影響がない．

JML には，コード実行時に JML 記述に違反しないかをチェックする JML ランタイムア

を用いて UML や OCL の入力部分から，JML を付加した Java コードを出力する部分まで

サーションチェッカ（以下 JMLrac）や，JUnit 用のテストケースのスケルトンやテストメ
13)

ソッドを自動で出力する JMLUnit

をツールとして実装することにより，利用者に利便性も与えることを目的としている．

，JML 記述に対する Java プログラムの実装の正しさ

3. iterate 演算の変換方法

をメソッド単位で静的検査できる ESC/Java2 など，コードの検証を効率化するための様々

この章では，まず文献11) で提案した iterate 演算の変換方法について述べる．次に，文なツールがサポートされている．

2.3 関 連 研 究

献11) では議論が不十分だったメソッドの引数の利用と iterate 演算の入れ子への対応につUML から JML への変換については，Engels らの文献5) や Harrison らの文献6) 等において述べる．最後に，Collection の一部の演算を，iterate 演算を用いた式で表現すること

いて言及されているが，変換する上で，UML 上での仕様の厳密な定義を行う OCL に関す
8)

る言及が不十分である．Hamie は文献

で，OCL-JML 変換の妥当性を向上させる方法について述べる．

において構文変換技法に基づいた OCL から JML

3.1 iterate 演算の変換への変換法を提案している．Rodion と Alessandra らは文献8) を基に，文献9) において未iterate 演算の変換は次の理由により，単純な構文変換では対応できない．

対応であった Tuple 型や Collection 型の演算の一部に関する変換法を提案し，ツールの実• iterate 演算の引数はほぼ任意の OCL 式であり，単純な構文変換をするためには，変装を示している．Avila らは文献

10)において，文献8)においてマッピングされた OCL と換先の言語 L において，L の任意式の動的な評価機構が必要となる．

JML の Collection 型の差異を吸収し，より完全な変換を行うライブラリを提案し，変換後• JML や Java1.6 はそのような機構を直接的にはサポートしていない．

の可読性について言及している．しかしながら，いずれの方法も Collection ループ演算の中

文献11) では，iterate 演算に引数として与えられる OCL 式を評価するメソッドを変換時で最も基本的な演算である iterate 演算への対応が不十分である．次に iterate 演算の具体に作成し，JML 式でそのメソッドの戻り値を参照することで，間接的にこの問題に対応す

例とその対応の難しさについて述べる．iterate 演算は，引数で与えられた式を Collection

る方法を示した．

のすべての要素に対して繰り返し実行するという演算である．具体例として，式（1）のよiterate 演算の一般形は，c1 −>iterate(e; init | body)) で表され，作成されるメソッドはうな演算が挙げられる．これはコレクション students から score が 70 以上の要素を抽出

図 1 のようになる．µ() は引数の式を Java 構文に変換する関数を表し，res と T1 はそれぞしたコレクションを返す演算を意味する．

れ，init 内で定義された変数名と型を表す．また，T2 は e の型を表す．

students−> select(score > 70)

具体例として，iterate 演算（2）からメソッドを生成することを考える．

(1)c−> iterate(e; acc: Integer = 0 |JML や Java において score > 70 といった式の動的な評価機構が用意されておらず直接

if e = ‘ocl′ then acc + 1 else acc endif)

対応することができないという問題点がある．例えば，式（1）に対し，対応する Java メ(2)

ソッド select(exp) を用意した場合，OCL 式で与えられる引数 score > 70 が exp として

acc: Integer = 0 が init に対応しており，µ(init) は int acc = 0 と定義する．同様に，if e =与えられることになり，select の評価時の 1 回しか評価されず，以降、ループのたびに動的‘ocl′ then acc + 1 else acc endif が body に対応しており，µ(body) は (e.equals(“ocl”)?

2

c 2010 Information Processing Society of Japan⃝

情報処理学会研究報告
IPSJ SIG Technical Reportprivate T1 mPrivateUseForJML01() {private boolean mPrivateUseForJML02() {µ(init);boolean acc2 = false;for (T2 e: µ(c1 )){for (String e2 : c2){
acc2=(e1.equals(e2) ? true : f alse) };res = µ(body)}
return res;return acc2;}}
図 1 iterate メソッド
Fig. 1 iterate method

図 3 入れ子の iterate 演算を変換した結果
Fig. 3 result of the translation of nesting iterate operation

3.3 Collection 演算の変換

private int mPrivateUseForJML01() {この節では，Collection 演算の一部を iterate 演算を用いた式に変換することについて述

int acc = 0;

べる．iterate 演算を用いて表現できる Collection 演算の一部を表 1 に示す．これらの表現

for (String e : c){

は OCL の定義書1) で定義されているため，OCL-JML 変換の妥当性を OCL 定義書に委

acc=(e.equals(“ocl”)? acc + 1: acc) };ねることができるという点が利点である．一方欠点としては，iterate に対応するためのメ

return acc;

ソッドが多く挿入されるため，出力された JML の可読性が低下することが挙げられる．こ}の問題の解決としては変換ツール実装時に，Collection 演算を iterate を用いて表現する場
図 2 Java 変換後の iterate メソッド
Fig. 2 iterate method after Java translation

合としない場合の両方の変換に対応できるようにすることが考えられる．

acc + 1: acc) と定義する．図 1 の res は acc に置き換えられる．
すなわち，iterate 演算（2）から生成されるメソッドは，図 2 になる．

表 1 Collection-Iterate 対応表
Table 1 correspondence table of the collection and iteration

3.2 iterate 演算の入れ子
3.1 節で述べた文献11) の方法では，iterate 演算が入れ子になったときに正しく変換できない．例えば iterate 演算（3）の，c2−>iterate ∼ から変換されるメソッドは図 3 のよう

c1 −>exists(a1 | a2 )=c1 −>forAll(a1 | a2 )=c1 −>count(a1 )=c1 −>isUnique(a1 | a2 )=c1 −>any(a1 | a2 )c1 −>one(a1 | a2 )c1 −>collect(a1 | a2 )===に表される．このメソッド内で e1 は宣言されていないので，参照できない．

c1 −> iterate( e1 : String ; acc1 Integer = 0 |c2 −> iterate(e2 : String ; acc2 : Boolean = f alse |if e1 = e2 then true else
11)

また，文献

f alse endif))(3)の方法ではメソッド内で使用される変数にはフィールド変数のみしか想定しておらず，JML 挿入先のメソッドの引数の情報を利用することができない．この問題を解決するため，JML 挿入先のメソッドの引数と，変換する iterate 演算よりも上層で定義された変数の名前と型を mPrivateUseForJML() メソッドの引数として利用した．

3

c1 −>iterate(
a1 ; res : Boolean = false | res or a2 )c1 −>iterate(
a1 ; res : Boolean = true | res and a2 )c1 −>iterate(e; acc : Integer = 0 |if e = a1 then acc + 1 else acc endif)
c1 −>collect(a1 |Tuple {iter=Tuple{a1 }, value=a2 } ) −>forAll(x, y | (x.iter <> y.iter)
implies x.value <> y.value)c1 −>select( a1 | a2 )−>asSequence()−>first()
c1 −>select( a1 | a2 )−>size()= 1
c1 −>collectNested( a1 | a2 )−>flatten()c 2010 Information Processing Society of Japan⃝

情報処理学会研究報告
IPSJ SIG Technical Report

4. 実

詳細に述べる．また，OCL から JML への変換規則の一部を掲載する．最後に，iterate の装入れ子などに対応するために，どのように iterate 情報を扱う JML の構文木を拡張したかについて述べる．それ以外の実装については，文献12) と同様の内容であるため，省略する．

ここでは実装に関して詳細に述べる．図 4 にツールの概要を示す．このツールは最終的に4.1 OCL 構文解析器の実装

Eclipse のプラグインとして開発することを考えている．
本ツールは OCL の構文解析時に，詳細な型情報を付加することにより，JML への変換

OCL 構文解析器の実装には，ANTLR を利用する．ANTLR は LL(k) 構文解析を用いを容易にした．ここでは OCL 構文解析器の実装と，それに型情報を付加することについてた構文解析器自動生成ツールである．構文解析器の出力言語として Java をサポートしており，構文解析器と同時に字句解析器も出力することから，ツール開発の速度を向上させることができる．
文献1) に掲載されている OCL の EBNF は，重複した文法や左再帰を用いたものが多数含まれており，また四則演算や論理演算などの文法，演算の優先順位の情報が欠落していたため，その EBNF を ANTLR に入力しても，構文解析器は出力されなかった．そこでまず，重複文法を除去し，左再帰除去アルゴリズムに従って左再帰を除去した．さらに文献14) を参考に，欠落していた演算や優先順位の情報を EBNF に付加することで構文解析器を出力することができた．

4.2 型 推 論
この節では，構文解析器に型情報を付加することについて述べる．二つのオブジェクトが同値であることを評価する演算に関して，OCL では任意の型において ‘=’ が用いられるが，JML では基本データ型の比較には ‘==’ が用いられ，参照型には equals() メソッドが用いられる．変換を正しく実行するためには，構文木のノードが変数や演算の型を保持しなければならない．

ANTLR パーサが出力する OCL 抽象構文木のノードは型情報を持たないので，ノードクラスを拡張することで対応した．拡張したノードは，以下の 3 つの情報を持つこととする．

• token: 演算子，feature 名，終端 token 値など• type: 該当ノードの部分木に対する型• children: 子ノードリスト• flag: 部分木が Undefined を取り得る演算であることを示すフラグ
また，UML のコンテキスト情報を得るために，ANTLR パーサを拡張して UML 情報が記述された XMI ファイルを入力できるようにした．この XMI ファイルは，Eclispe UML から出力されたものを使用する．XMI ファイルから，属性・操作名をキーとしてその型名を返す Map を作成し，OCL 構文内に属性・操作名が現れたとき，Map から型を取得する．

図 4 ツール全体図
Fig. 4 Tool Overview

同様に OCL の標準演算も，操作名をキーとして演算の型名を返す Map を作成すること

4

c 2010 Information Processing Society of Japan⃝

情報処理学会研究報告
IPSJ SIG Technical Report
表 3 Collection 型の µ 変換表
Table 3 µ translation table of the collection type

で型推論を可能にした．
また，UML や JML では数値を表す型として byte, short, char, int, long, float, doubleµ(c1 = c2 )µ(c1 > c2 )µ(c1 < c2 )µ(c1 >= c2 )µ(c1 <= c2 )µ(c1 <> c2 )といった型が定義されているが，OCL では Integer 型と Real 型の 2 種類のみしか定義されていない．Integer, Real の両型とも，上限は定義されていないため，本稿では Integer 型
は int 型に，Real 型は double 型に対応させた．設計の自由度に制限を与えないため，OCL
では対応していない long や float などの型推論も評価可能にした．演算による型の評価は，

=
=
=
=
=
=

µ(c1 ).equals(µ(c2 ))µ(c1 ).containsAll(µ(c2 ))&&!µ(c1 ).equals(µ(c2 ))µ(c2 ).containsAll(µ(c1 ))&&!µ(c1 ).equals(µ(c2 ))µ(c1 ).containsAll(µ(c2 ))µ(c2 ).containsAll(µ(c1 ))!µ(c1 ).equals(µ(c2 ))JML のものと統一した．例えば，byte + short の評価型は int，long ∗ f loat の評価型は
表 4 Collection 演算の µ 変換表
Table 4 µ translation table of the operation of the collection typefloat などである．
ユーザ定義型の型推論に関しては，OCL の定義書に従い，‘=’,‘<>’, oclIsUndefined(),µ(c1 −>size())µ(c1 −>isEmpty())µ(c1 −>notEmpty())µ(c1 −>excludes(a1 ))µ(c1 −>count(a1 ))oclIsKindOf(), oclIsTypeOf(), oclIsNew(), oslAsType(), oclInState() に対応する．
OCL 定義書で定義されている OCL 構文からは型的に不整合な表現式が導出され得るが，そのような型不整合な式は Java や JML で直接扱えないため，例外を出力し，コンパイル

=
=
=
=
=

エラーになるようにした．

µ(c1 ).size()µ(c1 ).isEmpty()!µ(c1 ).isEmpty()µ(c1 −>count(a1 ) = 0)µ(c1 −>iterate( e; acc : Integer = 0 |if e = a1 then acc + 1 else acc endif))

4.3 OCL-JML 変換規則
表 5 新たに定義した µ 変換
Table 5 new µ translation

文献11) で定義された OCL-JML の変換規則の一部を表 2，3，4 で示す．文献8) の記法
に従い，OCL 式から JML 式への変換関数の表記を µ で与えている．ai は Integer, Real,a1 .oclIsKindOf(a2 )a1 .oclIsTypeOf(a2 )a.oclIsUndefined()

Boolean の任意の型，ci は Collection 型の任意の型を表している．
また，文献11) では対応が不十分だった変換規則を新たに定義した．その変換規則を表 5===µ(a2 ).class.isAssignableFrom(µ(a1 ).getClass())µ(a1 ).getClass().equals(µ(a2 ))µ(a) == nullに示す．

µ(init)，4. イテレータ変数 e の型，5. イテレータ変数 e の変数名，6. コレクション変数の4.4 iterate の JML 抽象構文木
12)

iterate の入れ子や挿入先メソッドの引数の参照に対応するため，文献で示した構文木名前，7. 戻り値となる変数名，8. µ(body)を拡張し，より多くの情報を扱えるようにした．具体的には，挿入するメソッド名をルー

例えば，iterate 演算（3）の，c2−>iterate ∼ を JML に変換すると，mPrivateUseFor-

トノードとし，そのノードは次の 8 つの情報を子ノードリストとして保持する．1. 引数情JML02 をルートノードとし，次の 8 つの情報を含んだ JML 抽象構文木が出力される．1.

報（挿入先メソッドの引数リストと上層の iterate で定義された変数），2. 戻り値の型，3.

int acc, String e1，2. boolean，3. acc2 = false，4. String，5. e2，6. c2，7. acc2，8.
(e1.equals(e2 ? true : false))

Table 2

表 2 数値型の µ 変換表µ translation table of the numeric typeµ(a1 = a2 )µ(a1 > a2 )µ(a1 < a2 )µ(a1 >= a2 )µ(a1 <= a2 )µ(a1 <> a2 )

=
=
=
=
=
=

µ(a1 ) == µ(a2 )µ(a1 ) > µ(a2 )µ(a1 ) < µ(a2 )µ(a1 ) >= µ(a2 )µ(a1 ) <= µ(a2 )µ(a1 )! = µ(a2 )

5. 評

価

5.1 方

法

図 5 で示す在庫管理システムの UML クラス図に対して OCL を付加し，評価を行った．
今回の評価では，Storage クラスの checkStockSatisfied() メソッド（図 6）に対して，図7 の OCL を付加した．図 5 は，我々の研究グループの過去の研究15) で作成した UML で

5

c 2010 Information Processing Society of Japan⃝

情報処理学会研究報告
IPSJ SIG Technical Reportpublic boolean checkStockSatisfied(Request r){
Iterator i = allItemList.iterator();
while(i.hasNext()){
Item item = (Item)i.next();
if(r.getItemName().equals(item.getName())&& r.getAmount() <= item.getTotalAmount()){
return true;}}
return false;}
図 6 checkStockSatisfied() メソッドの実装
Fig. 6 implementation of the checkStockSatisfied() method
図 5 在庫管理システムの UML クラス図
Fig. 5 UML class diagram of a Stock Management Systemcontext Storage::checkStockSatisfied(r : Request)
pre : not r.oclIsUndefined()

あり，JML を用いて設計されている．

post: result = allItemList−>exists(i : Item | r.getItemName() = i.getName()

本稿の評価では，文献15) で付加した手書きの JML と，本稿のツールを用いて OCL かand r.getAmount() <= i.getTotalAmount())

ら自動変換した JML の品質について評価する．品質は以下の観点から評価する．

(1)

手書きの JML 表現に対し，どの程度近づけられるか(2)

JMLrac の実行速度が遅くならないか

図 7 入力 OCL 文
Fig. 7 input OCL expression

本評価で JMLrac を用いる理由は，次の 3 点である．1. iterate を変換したメソッドにはなければ無ければ false を返す．

必ず for 文が挿入される． 2. for 文のループ回数も考慮してチェックできるツールはこれ以挿入する OCL（図 7）は，checkStockSatisfied() メソッドが実行される前提として，注外に存在しない．3. JML 記述の品質の評価方法として，間接的だが客観的な比較を期待で文が null でないことをチェックし，メソッドが終了したときには，「倉庫内に注文と同じ商きる．

品がありかつその商品の発注量が倉庫内の在庫よりも少ないという条件を満たす商品が存

なお，checkStockSatisfied() メソッドは，顧客が注文した商品の発注量は倉庫にある商品在するか否か」が，リターンされることを示している．

の在庫よりも少ないかどうかをチェックするメソッドである．具体的には，倉庫（Storage

5.2 実 験 環 境クラス）が注文（Request クラス）を受けたら，注文に含まれている商品（Item クラス）と本稿の評価では，JMLrac に JML4c を用いる．JML4c は，本稿の iterate メソッドで利同じ名前の商品を，倉庫が持つ商品リストから探す．倉庫に注文と同じ商品名を持つ商品が用している Java1.5 の拡張 for 文やジェネリクスに対応した JMLrac であり，JML を付加

あれば，商品の発注量 (r.getAmount()) と在庫量 (item.getTotalAmount()) を比較し，発した Java ソースコードを入力すると，JML と実装の違いをチェックする機能が付加された

注量の方が少なければ true，多ければ false を返す．また，倉庫に注文と同じ商品が存在し実行ファイルを出力する．この実行ファイルの実行時に，JML で記述した仕様と異なる動6c 2010 Information Processing Society of Japan⃝

情報処理学会研究報告
IPSJ SIG Technical Report

作をした場合，違反した行数やそのときの変数の値などが出力される．

public behavior

実験環境として，CPU は Intel(R) Core(TM)2 Duo E7300 2.66GHz 2.67GHz，メモリ

requires r != null;

は 4.00GB，OS は Windows Vista 64bit を用いた．

5.3 結

assignable \nothing;果

ensures \result == (\exists Item i;allItemList.contains(i);5.3.1 出力された JML

r.getItemName().equals(i.getName()) &&図 7 をツールを利用して JML に変換した結果，図 8 の JML 文が出力された．表 1 で示

r.getAmount() <= i.getTotalAmount());

したように，exists 演算は iterate 演算に置換して変換するため，mPrivateUseForJML01()のようにメソッドとして出力されている．mPrivateUseForJML01() の内容は，図 9 に示

図 10 手書きの JML 記述
Fig. 10 handwritten JML expression

す．一方，文献15) で使用されている JML 記述を図 10 に示す．
本ツールには，図 10 の 1 行目と 3 行目の文を出力する機能はないが，JMLrac を利用するにあたって，これらの文は不要である．また，変換の正しさの確認においては，図 8 の 1

読性を向上させたいケースがあると考えられるので，変換のオプション機能で優先順位を設

行目と図 10 の 2 行目の対応と，図 8 の 2 行目と図 10 の 3,4,5 行目の対応をそれぞれ見比

定できるような機能を設けることも考えている．

べると，容易に意味の正しさが理解できる．OCL の構文，not r.oclIsUndefined() を忠

5.3.2 JMLrac の実行時間

実に JML に変換すると，!(r == null) になってしまうが，r != null という記述の方が図 6 のメソッドに対し，手書きの JML と本ツールで生成した JML をそれぞれ付加して，一般的で可読性が高いと思われる．ユーザにとって，変換の忠実性を多少犠牲にしてでも可図 11 を用いて JMLrac を実行したところ，両方とも 1ms でチェックが完了した．この結果
から，JML のネイティブな演算と，本ツールで生成したメソッドの実行時間に大差がない
ことが推測できる．

requires !(r == null);ensures \result == mPrivateUseForJML1(r);5.3.3 OCL-JML 変換の実行時間
図 7 の OCL 文を構文解析する時間は約 20ms，OCL 抽象構文木を JML 抽象構文木に変図 8 OCL を JML に変換した結果
Fig. 8 the result of OCL2JML translation

換する時間は約 1ms だった．図 5 の在庫管理システムの属性と操作すべてに OCL を付加しても，約 600ms 程度で変換できる計算である．属性と操作を合計して 100 個持つような大規模なシステムでも，約 2 秒で変換できる計算であるため，十分に実用的であると推測で

private boolean mPrivateUseForJML1(Request r){

きる．今後，より大規模な評価実験を行い，この仮説の正しさを検証したい．

res = false;for(Item i : allItemList){

6. あ と が き

res = res || r.getItemName().equals(i.getName())

本稿では著者の所属する研究グループが提案する，OCL 記述を JML 記述へと変換する&& r.getAmount() <= i.getTotalAmount();}

手法を紹介し，とりわけ iterate 演算の変換に対する手法を紹介することで，従来手法で提return res;

案されていたクラスより広いクラスに対して適用できることを示した．本研究ではその手法}

に対し，未対応であった iterate の入れ子などに対応し，型推論や OCL-JML 変換表など具体的な実装方法を示して，簡単な評価実験を行った．

図 9 mPrivateUseForJML01() の内容
Fig. 9 the content of the mPrivateUseForJML01()

今後の課題として，より大規模な評価実験を行うことを考えている．今回の実験では一つ7c 2010 Information Processing Society of Japan⃝

情報処理学会研究報告
IPSJ SIG Technical Reportpublic static void main(String args[]){参

Item item1 = new Item(”Item1”, 50); Item item2 = new Item(”Item2”, 100);文

献1) Group, O.M.: OCL 2.0 Specification (2006). http://www.omg.org/cgi-bin/apps/
doc?formal/06-05-01.pdf.
2) Leavens, G., Baker, A. and Ruby, C.: JML: A Notation for Detailed Design, Behavioral Speciﬁcations of Businesses and Systems, pp.175–188 (1999).
3) Meyer, B.: Eiﬀel: the language, Prentice-Hall, Inc., Upper Saddle River, NJ (1992).
4) Kleppe, A., Warmer, J. and Bast, W.: MDA explained: the model driven architecture: practice and promise, Addison-Wesley Longman Publishing Co., Inc. Boston,
MA, USA (2003).
5) Engels, G., Hücking, R., Sauer, S. and Wagner, A.: UML collaboration diagramsand their transformation to Java, UML1999 -Beyond the Standard, Second International Conference, pp.473–488 (1999).
6) Harrison, W., Barton, C. and Raghavachari, M.: Mapping UML designs to Java,
Proc. of the 15th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications, pp.178–187 (2000).
7) Eclipse Foundation: Eclipse Modeling Framework. http://www.eclipse.org/
modeling/emf/.
8) Hamie, A.: Translating the Object Constraint Language into the Java Modelling
Language, In Proc. of the 2004 ACM symposium on Applied computing, pp.1531–
1535 (2004).
9) Rodion, M. and Alessandra, R.: Implementing an OCL to JML translation tool,
電子情報通信学会技術研究報告，Vol.106, pp.13–17 (2006).
10) Avila, C., Flores, Jr., G. and Cheon, Y.: A library-based approach to translating
OCL constraints to JML Assersions for Runtime Checking, International Conference on Softw. Eng. Research and Practice, pp.403–408 (2008).
11) 尾鷲方志，岡野浩三，楠本真二：メソッドの自動生成を用いた OCL の JML への変換，コンピュータ ソフトウェア， Vol.27, No.2, pp.106–111 (2010).
12) 宮澤清介，岡野浩三，楠本真二：OCL の JML への変換ツールの実装について，IEICE
technical report, Vol.110, No.169, pp.53–58 (2010).
13) Cheon, Y. and Leavens, G.: A simple and practical approach to unit testing: The
JML and JUnit way, ECOOP 2002 Object-Oriented Programming, pp.1789–1901(2006).
14) Warmer, J. and Kleppe, A.: UML/MDA のためのオブジェクト制約言語 OCL，エスアイビーアクセス，2 edition.
15) 尾鷲方志，岡野浩三，楠本真二：JML を用いた在庫管理プログラムの設計と ESC/Java2を用いた検証，電子情報通信学会技術報告， Vol.107, No.176, pp.37–42 (2007).

Item item3 = new Item(”Item3”, 30); Item item4 = new Item(”Item4”, 200);
LinkedList<Item> list = new LinkedList<Item>();list.add(item1); list.add(item2); list.add(item3); list.add(item4);
Storage st = new Storage(); st.setAllItemList(list);
Customer c = new Customer(); Request r = new Request(”item4”, 400, c);long start,stop;
start = System.currentTimeMillis();st.checkStockSatisfied(r);stop = System.currentTimeMillis();System.out.println(”Running Time is :” + (stop - start) + ”ms”);}
図 11 テストケース
Fig. 11 test caseのメソッドに OCL を記述して，変換速度を計測し，JMLrac の実行速度の比較を行った．
手書きの JML とツールで出力した JML の品質に大きな差が観測されなかったが，この結果は実験規模が小さいことが影響の一つとして考えられる．大規模な評価実験では，すべてのメソッドに対して OCL を付加し，手書きの場合と比較した品質を調査したい．また，サポートできていない演算などの対応や GUI の構築，出力される JML の可読性向上などに取り組みたい．
謝辞

考

本研究の一部は科学研究費補助金基盤 C（21500036）と文部科学省「次世代 IT 基

盤構築のための研究開発」（研究開発領域名：ソフトウェア構築状況の可視化技術の普及）の助成による．

8c 2010 Information Processing Society of Japan⃝