M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

ミランダ・メソッドってなに?

ProGuardについて調べていて、ミランダ・メソッド(miranda method)ということばを知りました。Googleなどで調べてみても、キーワードとして散見こそすれ、どうも要領を得ません。

とりあえず見つけた中では(Googleの検索結果のトップにあるのですが)、一番まとまった記述と思われるものを読んでみました。

ただ、文脈がわからないこともあり、結局のところ1パラで述べられていることが、具体的にどういう問題であるのか、わかりません。とりあえず訳出のみしておきます。

******************************

miranda methods

JavaVMの初期のバージョンにはあるバグがありました。VMは、あるメソッドを探索するために、そのクラスが実装する関係にあるインターフェースの中を調べなかったのです。VMは親クラス・チェーンのみ辿って調べていたのです。このことは次のことを意味します。インターフェース内でのみ定義されている抽象メソッドは、VMには見つけられないのです。

このバグに対処するため、コンパイラにはカウンターバグが導入されました。これがミランダ・メソッドと呼ばれるものです。もしクラスがそのインターフェースのメンバーである抽象メソッドの定義を提供しなかった場合、コンパイラがかわりにそれを挿入するのです。これによりVMは、インターフェースを調査する面倒をせずに済むことになりました。

これは問題です。ミランダ・メソッドは仕様の一部ではないのです。歴代のコンパイラは、古いVMが新しいコードを実行できるよう、ミランダ・メソッドを挿入し続けたのです。いつの日か、旧来のVMが姿を消したときには、ミランダ・メソッドなしにクラスをコンパイルできるようになるかもしれません。問題に終止符を打つため、コンパイラには-nomirandaフラグが追加されました。このフラグにより、ミランダ・メソッドの生成が行われなくなるのです。いずれはこの動作がデフォルトとなるはずです。

なぜミランダ・メソッドと呼ばれるのでしょうか? それは、“もしクラスがメソッドを提供できなければ、コンパイラが提供するだろう”という文が、“もしあなた〔容疑者・被告〕が弁護士を立てることができないならば、法廷が立てるだろう”というそれ──米国でミランダ権と呼ばれるもの──に非常に似ているからです。

******************************

原文は、“miranda methods”(kkonaka@mac.com、2001年9月24日)です。