(57)【特許請求の範囲】
【請求項１】
複数のクラスおよびこれらのクラス間の階層関係が定義されたオブジェクト指向のプログラムが格納されたプログラムデータ領域と、前記プログラムに記述されているメソッドについて、前記プログラムデータ領域内の格納場所を検索するためのメソッドテーブルと、前記プログラムに記述された各クラスおよびメソッドの識別情報が格納された参照テーブルとが設定されたメモリと、
前記プログラムデータ領域に格納されたプログラムを実行するプログラム実行手段と、
前記プログラム実行手段がメソッド呼出しを示すプログラムを実行するとき、プログラム実行手段から呼出し対象のメソッドのメソッド名およびそのメソッドの実行クラスのクラス名の提供を受けて、これらの提供情報に基づき前記メソッドテーブルを検索して前記メソッドの格納場所を特定し、その格納場所を示すデータを前記プログラム実行手段に出力する検索手段とを具備し、
前記メソッドテーブルには、前記プログラムデータ領域に格納されている全てのメソッドについて、それぞれそのメソッドの識別情報に対応するエントリ位置に個別のエントリが割り当てられ、
前記メソッドテーブルの各エントリには、そのエントリが割り当てられたメソッドの所属クラスの識別情報と、前記プログラムデータ領域における当該メソッドの格納場所と、当該メソッドと同じメソッド名を持つ１メソッドのエントリ位置を示すポインタとがそれぞれ書き込まれるともに、階層関係を有する複数のクラスにそれぞれ所属するメソッド名が同一の複数のメソッドについて、これらのメソッドに割り当てられた複数のエントリが、最上位のクラスに対応するエントリを先頭にそれぞれ上位のクラスに対応するエントリより先に配置されないような順序をもって一連に連結するように、前記各エントリ内のポインタの値が設定されており、
前記検索手段は、前記プログラム実行手段から提供されたメソッド名およびクラス名により前記参照テーブルを参照して、前記呼出し対象のメソッドの識別情報と前記実行クラスの識別情報とを取得した後に、取得したメソッドの識別情報に対応するメソッドテーブルのエントリを起点に、そのエントリに連結されている各エントリを前記ポインタに基づき連結順に検索して、前記取得した実行クラスの識別情報が前記メソッドの所属クラスの識別情報として書き込まれているエントリを抽出し、そのエントリに書き込まれているメソッドの格納場所を前記プログラム実行手段に送信し、
前記プログラム実行手段は、前記プログラムデータ領域の前記検索手段から送信された格納場所にアクセスして、前記呼出し対象のメソッドに対応するプログラムを読み出して実行する演算処理装置。
【請求項２】
前記メモリには、前記プログラムに定義されているクラスのうち最上位のクラスを除く各クラスにそれぞれ１つ上位のクラスの識別情報を対応づけたクラステーブルがさらに設定され、
前記メソッドテーブルにおいて一連に連結されたエントリの末尾のポインタには、いずれのメソッドのエントリ位置にも対応しない値が設定されており、
前記検索手段は、前記検索処理において、前記いずれのメソッドのエントリ位置にも対応しない値がポインタに設定されたエントリまで検索しても、前記実行クラスの識別情報が書き込まれたエントリを抽出できなかったとき、前記クラステーブルに基づき前記実行クラスの識別情報を１つ上位のクラスの識別情報に変更して、前記検索を再実行する請求項１に記載された演算処理装置。
【請求項３】
前記検索手段は、前記実行クラスの識別情報を最上位クラスの識別情報に変更して実行した検索において、前記いずれのメソッドのエントリ位置にも対応しない値がポインタに設定されたエントリまで検索しても、前記呼出し対象のメソッドの実行クラスの識別情報が書き込まれたエントリを抽出できなかったとき、異常処理の後に前記検索を終了する請求項２に記載された演算処理装置。
【請求項４】
複数のクラスおよびこれらのクラス間の階層関係が定義されたオブジェクト指向のプログラムが格納されたプログラムデータ領域と、前記プログラムに記述された各クラスおよびメソッドの識別情報が格納された参照テーブルとが設定されたメモリを有する演算処理装置において、当該演算処理装置に設定されたプログラム実行手段がメソッド呼出しを示すプログラムを実行する際に、その呼出し対象のメソッドの前記プログラムデータ領域内の格納場所を検索するために前記演算処理装置が実行する方法であって、
前記プログラムデータ領域に格納されている全てのメソッドについて、それぞれ当該メソッドの識別情報に対応するエントリ位置に個別のエントリが割り当てられ、各エントリに、そのエントリが割り当てられたメソッドの所属クラスの識別情報と、前記プログラムデータ領域における当該メソッドの格納場所と、当該メソッドと同じメソッド名を持つ１メソッドのエントリ位置を示すポインタとがそれぞれ書き込まれるとともに、階層関係を有する複数のクラスにそれぞれ所属するメソッド名が同一の複数のメソッドについて、これらのメソッドに割り当てられた複数のエントリが、最上位のクラスに対応するエントリを先頭にそれぞれ上位のクラスに対応するエントリより先に配置されないような順序をもって一連に連結するように、前記各エントリ内のポインタの値が設定された構成のメソッドテーブルを、前記メモリに保存するステップＡと、
前記プログラム実行手段から呼出し対象のメソッドのメソッド名およびそのメソッドの実行クラスのクラス名の提供を受け付けるステップＢと、
前記ステップＢで提供されたメソッド名およびクラス名により前記参照テーブルを参照して、前記呼出し対象のメソッドの識別情報と実行クラスの識別情報とを取得するステップＣと、
前記メソッドテーブルに対し、ステップＣで取得したメソッドの識別情報に対応するエントリを起点に、そのエントリに連結されている各エントリを前記ポインタに基づき連結順に検索して、前記ステップＣで取得した実行クラスの識別情報が前記メソッドの所属クラスの識別情報として書き込まれているエントリを抽出するステップＤと、
前記ステップＤで抽出したエントリに書き込まれているメソッドの格納場所を前記プログラム実行手段に送信するステップＥとを、実行するメソッド検索方法。
【請求項５】
前記ステップＡでは、前記メソッドテーブルに加えて、前記プログラムに定義されているクラスのうち最上位のクラスを除く各クラスにそれぞれ１つ上位のクラスの識別情報を対応づけたクラステーブルを前記メモリに保存するとともに、前記メソッドテーブルの前記一連に連結されたエントリの末尾のポインタに、いずれのメソッドのエントリ位置にも対応しない値を格納し、
前記ステップＤでは、前記検索処理において、前記いずれのメソッドのエントリ位置にも対応しない値がポインタに設定されたエントリまで検索しても、前記実行クラスの識別情報が書き込まれたエントリを抽出できなかったとき、前記クラステーブルに基づき前記実行クラスの識別情報を１つ上位のクラスの識別情報に変更して、前記検索を再実行する請求項４に記載されたメソッド検索方法。
【請求項６】
前記ステップＤでは、前記実行クラスの識別情報を最上位クラスの識別情報に変更して実行した検索において、前記いずれのメソッドのエントリ位置にも対応しない値がポインタに設定されたエントリまで検索しても、前記呼出し対象のメソッドの実行クラスの識別情報が書き込まれたエントリを抽出できなかったとき、異常処理の後に前記検索を終了する請求項５に記載されたメソッド検索方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
この発明は、オブジェクト指向のプログラムを実行する演算処理装置において、メソッド呼出しに応じてその呼出し対象のメソッドの格納場所を特定するための検索処理（以下、「メソッド検索」という）を行う方法、およびその方法によるメソッド検索を行って、そのメソッドを実行する演算処理装置に関する。
【０００２】
【従来の技術】
オブジェクト指向のプログラミングによる情報処理システムでは、上位のクラス（スーパークラス）に含まれるプロパティやメソッドを下位のクラス（サブクラス）に自動的に継承させるとともに、必要に応じてサブクラス側でメソッドの上書き（オーバーライド）を行うようにしている。各メソッドのプログラムは、メモリ内の所定領域に格納されており、実行中のクラスにおいて所定のメソッドが呼び出されることに応じて、そのメソッドの格納場所を検索するようにしている。
【０００３】
たとえばＣ＋＋によるプログラミングでは、コンパイル時に、メソッド呼出し用のプログラムに仮想関数によるリンク情報を埋め込むことにより、メソッド呼出しに応じてそのメソッドの格納場所を特定するようにしている。またJavaによるプログラミングでは、ハッシュテーブルを用いた検索（以下、この検索方法を「ハッシュ法」という。）を行うことが提案されている（特開平５−１２００２２号，特開平８−２７８８９４号公報）。
【０００４】
【発明が解決しようとする課題】
コンパイル時にリンク情報を設定する方法では、メソッドをオーバーライドするクラスを変更するなどの設計変更を行うと、リンクの再設定を行ってコンパイルをやり直さなければならず、システム開発の効率が著しく悪くなる、という問題が生じる。
【０００５】
一方、ハッシュ法によれば、メソッド名やメソッド呼出し用のメッセージなどを構成する文字列をハッシュ値に変換し、そのハッシュ値とメソッドの格納場所とを対応づけたハッシュテーブルを作成するので、メソッドのオーバーライドの設定を変更する場合にも、変更するクラスについてのみコンパイルをやり直し、そのクラスについてのハッシュテーブルの設定を変更するだけで良く、プログラムの設計変更に比較的容易に対応することができる。しかしながらハッシュ法では、あらかじめ所定数のハッシュ値に対応するメモリ領域を確保する必要があるため、使用されないハッシュ値に対してもメモリ領域が確保され、メモリ資源が無駄に消費されるという問題が生じる。
【０００６】
またハッシュ法によれば、異なるメソッドに同一のハッシュ値が割り当てられてしまう「衝突」（collision）が起こる場合がある。このような衝突の発生に対しては、分離連鎖法や開アドレス法などの方法により、衝突した各メソッドにそれぞれ個別の検索キーを前記ハッシュ値に連結させて設定するが、このような設定はデータ構成の複雑化を招き、メモリ容量を増大させてしまう。しかも検索実行時には、ハッシュ値に変換される前の文字列をハッシュテーブルのエントリ内容と比較するなどして、前記文字列に該当する正しい検索キーが選択されたか否かをチェックする必要があるから、検索に時間がかかり、装置の処理能力が著しく低下する、という問題も発生する。
【０００７】
この発明は上記問題点に着目してなされたもので、クラス間の階層関係に基づいて連結構造の検索用情報を設定することにより、メソッド検索に必要な検索用情報の容量を大幅に削減して、メモリ資源を有効活用するとともに、メソッド検索を高速化することを目的とする。
さらにこの発明は、前記検索情報の連結リストによりメソッドをオーバーライドするクラスを変更するなどの設計変更に容易に対応して、システム開発にかかる効率を大幅に向上させることも目的とする。
【０００８】
【課題を解決するための手段】
請求項１の発明にかかる演算処理装置は、複数のクラスおよびこれらのクラス間の階層関係が定義されたオブジェクト指向のプログラムが格納されたプログラムデータ領域と、前記プログラムに記述されているメソッドについて、前記プログラムデータ領域内の格納場所を検索するためのメソッドテーブルと、前記プログラムに記述された各クラスおよびメソッドの識別情報が格納された参照テーブルとが設定されたメモリ；前記プログラムデータ領域に格納されたプログラムを実行するプログラム実行手段；前記プログラム実行手段がメソッド呼出しを示すプログラムを実行するとき、プログラム実行手段から呼出し対象のメソッドのメソッド名およびそのメソッドの実行クラスのクラス名の提供を受けて、これらの提供情報に基づき前記メソッドテーブルを検索して前記メソッドの格納場所を特定し、その格納場所を示すデータを前記プログラム実行手段に出力する検索手段を具備する。
前記メソッドテーブルには、前記プログラムデータ領域に格納されている全てのメソッドについて、それぞれそのメソッドの識別情報に対応するエントリ位置に個別のエントリが割り当てられる。またこのメソッドテーブルの各エントリには、そのエントリが割り当てられたメソッドの所属クラスの識別情報と、前記プログラムデータ領域における当該メソッドの格納場所と、当該メソッドと同じメソッド名を持つ１メソッドのエントリ位置を示すポインタとがそれぞれ書き込まれる。さらに、階層関係を有する複数のクラスにそれぞれ所属するメソッド名が同一の複数のメソッドについて、これらのメソッドに割り当てられた複数のエントリが、最上位のクラスに対応するエントリを先頭にそれぞれ上位のクラスに対応するエントリより先に配置されないような順序をもって一連に連結するように、前記各エントリ内のポインタの値が設定される。
前記検索手段は、前記プログラム実行手段から提供されたメソッド名およびクラス名により前記参照テーブルを参照して、前記呼出し対象のメソッドの識別情報と前記実行クラスの識別情報とを取得した後に、取得したメソッドの識別情報に対応するメソッドテーブルのエントリを起点に、そのエントリに連結されている各エントリを前記ポインタに基づき連結順に検索して、前記取得した実行クラスの識別情報が前記メソッドの所属クラスの識別情報として書き込まれているエントリを抽出し、そのエントリに書き込まれているメソッドの格納場所を前記プログラム実行手段に送信する。
前記プログラム実行手段は、前記プログラムデータ領域の前記検索手段から送信された格納場所にアクセスして、前記呼出し対象のメソッドに対応するプログラムを読み出して実行する。
請求項２の発明にかかる演算処理装置では、前記メモリには、前記プログラムに定義されているクラスのうち最上位のクラスを除く各クラスにそれぞれ１つ上位のクラスの識別情報を対応づけたクラステーブルがさらに設定される。
また前記メソッドテーブルにおいて一連に連結されたエントリの末尾のポインタには、いずれのメソッドのエントリ位置にも対応しない値が設定され、前記検索手段は、前記検索処理において、前記いずれのメソッドのエントリ位置にも対応しない値がポインタに設定されたエントリまで検索しても、前記実行クラスの識別情報が書き込まれたエントリを抽出できなかったとき、前記クラステーブルに基づき前記実行クラスの識別情報を１つ上位のクラスの識別情報に変更して、前記検索を再実行する。
請求項３の発明にかかる演算処理装置では、前記検索手段は、前記実行クラスの識別情報を最上位クラスの識別情報に変更して実行した検索において、前記いずれのメソッドのエントリ位置にも対応しない値がポインタに設定されたエントリまで検索しても、前記呼出し対象のメソッドの実行クラスの識別情報が書き込まれたエントリを抽出できなかったとき、異常処理の後に前記検索を終了する。
【０００９】
上記構成の演算処理装置において、前記プログラムデータ領域には、例えば、サン・マイクロシステムズ社が開発したオブジェクト指向プログラム言語「Java（登録商標）」のソースプログラムからコンパイルされたバイトコードのプログラムが格納される。
プログラムデータ領域におけるメソッドの格納場所とは、たとえばプログラムデータ領域におけるメソッドの格納領域のアドレスまたはそのアドレスを指すポインタであって、領域内の先頭アドレスなどの代表アドレスを示す値が設定される。
【００１０】
請求項４の発明は、複数のクラスおよびこれらのクラス間の階層関係が定義されたオブジェクト指向のプログラムが格納されたプログラムデータ領域と、前記プログラムに記述された各クラスおよびメソッドの識別情報が格納された参照テーブルとが設定されたメモリを有する演算処理装置において、当該演算処理装置に設定されたプログラム実行手段が前記プログラムがメソッド呼出しを示すプログラムを実行する際に、その呼出し対象のメソッドの前記プログラムデータ領域内の格納場所を検索するために前記演算処理装置が実行する方法に関するもので、前記した構成のメソッドテーブルを前記メモリに保存するステップＡ；前記プログラム実行手段から呼出し対象のメソッドのメソッド名およびそのメソッドの実行クラスのクラス名の提供を受け付けるステップＢ；ステップＢで提供されたメソッド名およびクラス名により前記参照テーブルを参照して、前記呼出し対象のメソッドの識別情報と実行クラスの識別情報とを取得するステップＣ；前記メソッドテーブルに対し、ステップＣで取得したメソッドの識別情報に対応するエントリを起点に、そのエントリに連結されている各エントリを前記ポインタに基づき連結順に検索して、前記ステップＣで取得した実行クラスの識別情報が前記メソッドの所属クラスの識別情報として書き込まれているエントリを抽出するステップＤ；前記ステップＤで抽出したエントリに書き込まれているメソッドの格納場所を前記プログラム実行手段に送信するステップＥ；の各ステップを実行する。
【００１１】
請求項５の発明では、前記ステップＡにおいて、前記メソッドテーブルに加えて、前記プログラムに定義されているクラスのうち最上位のクラスを除く各クラスにそれぞれ１つ上位のクラスの識別情報を対応づけたクラステーブルを前記メモリに保存するとともに、前記メソッドテーブルの前記一連に連結されたエントリの末尾のポインタに、いずれのメソッドのエントリ位置にも対応しない値を格納する。またステップＤにおいて、前記検索処理において、前記いずれのメソッドのエントリ位置にも対応しない値がポインタに設定されたエントリまで検索しても、前記実行クラスの識別情報が書き込まれたエントリを抽出できなかったとき、前記クラステーブルに基づき前記実行クラスの識別情報を１つ上位のクラスの識別情報に変更して、前記検索を再実行する。
請求項６の発明では、前記ステップＤにおいて、前記実行クラスの識別情報を最上位クラスの識別情報に変更して実行した検索において、前記いずれのメソッドのエントリ位置にも対応しない値がポインタに設定されたエントリまで検索しても、前記呼出し対象のメソッドの実行クラスの識別情報が書き込まれたエントリを抽出できなかったとき、異常処理の後に前記検索を終了する。
【００１２】
【作用】
この発明によれば、所定のクラスでメソッドを呼び出す場合には、メソッドテーブルの呼出し対象のメソッドの識別情報に対応するエントリを起点に、そのエントリに連結されている各エントリを連結順に検索し、実行クラスの識別情報がメソッドの所属クラスの識別情報として書き込まれているエントリを抽出する。そして、そのエントリに書き込まれているメソッドの格納場所をプログラム実行手段に送信する。
たとえば呼出し対象のメソッドが実行クラスに所属するメソッドである場合には、最初のエントリで検索は終了し、そのエントリからメソッドの格納場所が読み出される。また上位クラスのメソッドをオーバーライドしているクラスが前記上位クラスのメソッドを呼び出す場合には、その上位クラスのメソッドのエントリを起点に検索が開始された後、実行クラスのメソッドに対応するエントリで検索が終了し、そのエントリからメソッドの格納場所が読み出される。
上記のように、この発明によれば、呼出し対象のメソッドと同一のメソッド名を有するメソッド間の連結情報を辿ることにより、呼出し対象のメソッドの格納場所を正しく取得することができる。
【００１３】
またこの発明のメソッドテーブルでは、階層関係を有する複数のクラスにそれぞれ所属するメソッド名が同一の複数のメソッド毎にエントリを連結させているので、前記したハッシュテーブルのように、複数のメソッドに同じキーが割り当てられて「衝突」が起こる虞がなく、また使用されないデータのためのメモリ領域を確保する必要もない。また、レジスタを一連に連結することにより検索経路が簡易化されるので、メソッド検索処理を高速化することができる。
またオーラーライドしたメソッドを削除する場合には、そのメソッドに対応するエントリの情報を削除するとともに、その前後のエントリのポインタを書き換えることにより対応することができる。また新たに所定のクラスでメソッドをオーバーライドする場合には、そのメソッドにメソッドテーブルの空いているエントリを割り当てて必要な情報を書き込むとともに、そのエントリの前後に連結すべきエントリのポインタを書き換えることにより、対応することができる。
【００１４】
さらに、請求項２，４の発明によれば、独自のメソッドを持たないクラスが上位のクラスから暗黙のうちに継承したメソッドを呼び出す場合に、その上位クラスのメソッドのエントリを起点に検索が開始されて末尾のエントリまで検索された後に、実行クラスの識別情報が１つ上位のクラスの識別情報に変更されて検索が再実行される。呼出し対象のメソッドがこの上位クラスに所属している場合には、再検索時の最初のエントリに格納された所属クラスの識別情報が前記変更後の実行クラスの識別情報と一致するので、そのエントリで検索が終了し、メソッドの格納場所が読み出される。
さらに、請求項３，６の発明によれば、実行クラスが階層関係にないクラス（以下、「無関係クラス」という。）のメソッドを呼び出した場合には、その無関係クラスのメソッドのエントリを起点に検索が開始されるが、無関係クラスのメソッドのエントリやそれに連結するエントリには、実行クラスの識別情報は格納されていないため、末尾のエントリまで検索しても、目的のエントリを抽出することはできない。さらに実行クラスの識別情報を上位クラスの識別情報に変更して再検索を行っても同様の結果になり、最終的に最上位クラスの識別情報が設定された検索が実行された後に、異常処理が行われて検索が終了する。よって、無関係クラスのメソッドの実行が指定されても、そのメソッドの実行は不可能となる。
【００１５】
【実施例】
図１は、この発明の一実施例にかかる演算処理装置の構成を示す。
この演算処理装置は、Javaで記述されたプログラムに基づく情報処理を実行するもので、プログラム実行装置１，メモリ２などを具備する。プログラム実行装置１は、Javaによるバイトコードを実行する回路が組み込まれたプロセッサであり、プログラム実行部３，メソッド検索部４，メモリコントローラ５などを具備する。メモリ２は、ＲＯＭまたはＲＡＭ、あるいは両者を包括した記憶領域を示しており、プログラムデータ領域６，検索用テーブル領域７などの記憶領域が設定される。
【００１６】
前記プログラムデータ領域６には、Javaのソースプログラムよりコンパイルされたバイトコードのプログラムが格納される。（以下、１アドレス分のプログラムを「プログラムデータ」という。）検索用テーブル領域７には、メソッドの呼出し時に、呼び出されたメソッドが格納されている場所を検索するために、後記するクラステーブル８やメソッドテーブル９などが格納される。
【００１７】
前記プログラム実行装置１におけるメモリアクセスは、メモリコントローラ５により制御される。プログラム実行部３は、メモリコントローラ５に、読み出すべきプログラムデータの格納先を示すプログラムアドレスを与えることにより、前記プログラムデータ領域６から該当するプログラムデータを得て実行する。特にそのプログラムデータがメソッド呼出しを示すメッセージであったとき、プログラム実行部３は、そのメッセージをメソッド検索部４に送信して、前記メソッドの格納先の検索を要請する。
【００１８】
前記メッセージには、メッセージの対象となるオブジェクトの所属するクラス名，実行すべきメソッドのメソッド名，引数，戻り値の有無やその型を示すデータが含まれる。メソッド検索部４は、このメッセージにより、前記メッセージの対象となるオブジェクトが所属するクラスや指定されたメソッドを認識した後、前記検索用テーブルを用いて前記メソッドの格納場所を検索する。この検索処理は、メモリコントローラ５に、検索用テーブル領域７内で必要な検索用情報の格納先のアドレス（図中、「テーブルアドレス」と示す）を指定して情報の読出しを行わせることにより実現する。
なおテーブルアドレスは、各検索用テーブルのエントリ位置を示すポインタ、またはメモリ２において前記エントリ位置に該当する領域のアドレスを示す値により与えられる。
【００１９】
前記メソッド検索部４は、検索結果として、指定されたメソッドの格納場所の先頭アドレス（以下「プログラム先頭アドレス」という。）を取得し、このプログラム先頭アドレスを、プログラムカウンタとしてプログラム実行部３に送信する。プログラム実行部３は、図示しないスタック用のメモリ領域に前記メソッドのための作業領域を設定するとともに、前記プログラムカウンタが示すアドレスを起点としてプログラムデータ領域６から前記メソッドを構成する各プログラムデータを順次読み出して、各プログラムデータに応じた処理を実行する。
【００２０】
図２は、前記プログラムによるクラスの作成例を示すクラス関係図であって、以下、この図２に示す階層関係に基づき、メソッド検索用の検索用テーブルの構成について説明する。なお図２では、１０個のクラスのクラス名をアルファベット文字のＡ〜ＧおよびＸ〜Ｚで表しており、以後、各クラスを個別に表す場合は、たとえば「クラスＡ」というように、「クラス」＋「クラス名」の形式でいうことにする。
【００２１】
図２において、各クラスのブロック内には、Javaによる記述に基づき、そのクラスのスーパークラス、およびクラス間で継承されるrun()メソッドについての設定が示されている。
クラスＡおよびクラスＸは、互いに独立した関係にあり、それぞれオーバーライド関係にない、異なる振る舞いをするrun()メソッドを具備する。クラスＡからは、Ｂ〜Ｇの６個のクラスが作成されており、このうちＥ，Ｃの各クラスでクラスＡのrun()メソッドがオーバーライドされ、さらにクラスＧにおいてクラスＣのrun()メソッドがオーバーライドされている。クラスＸからはＹ，Ｚの２個のクラスが作成され、クラスＺでクラスＸのrun()メソッドがオーバライドされている。なお独自のrun()メソッドを持たないクラスＢ，Ｄ，Ｆ，Ｙは、いずれもスーパークラスからrun()メソッドを暗黙のうちに継承する。
【００２２】
この実施例では、指定されたメソッドについて、前記プログラムデータ領域６内のメソッドの格納場所を検索するために、前記メソッド検索用テーブル内に、図３に示すような２種類のテーブルを設定している。
第１のテーブル８は、各クラスの階層関係を表すクラステーブルであって、前記した１０個のクラスに１エントリずつ割り当られ、各エントリに、そのクラスのスーパークラスを示す情報が格納されている。
【００２３】
この実施例では、各クラスに、０×１，０×２・・・，０×Ａというように、１６進表記の２つの番号を組み合せた識別番号を割り当てている。（以下、この識別番号を「オブジェクトクラスナンバー」という。）このオブジェクトクラスナンバーは、前記クラステーブル８において、各クラスのエントリ位置を表すポインタとしても使用され、各エントリには、そのエントリに割り当てられたクラスのスーパークラスを示すオブジェクトクラスナンバーが格納される。
なおスーパークラスを持たない最上位のクラスＡ，クラスＸのエントリには、空のデータ（null）が格納される。
【００２４】
第２のテーブル９は、各メソッドについての情報を格納したメソッドテーブルである。図示例のメソッドテーブル９では、前記クラスＡおよびクラスＸに所属するrun()メソッド（A.run(),X.run()）のほか、クラスＣ，Ｅ，Ｇ，Ｚにおいてオーバーライドにより作成された各run()メソッド（C.run(),E.run(),G.run(),Z.run()）の情報が登録されている。
なおこの実施例では、前記クラスと同様に、上記の各run()メソッドに固有の番号を付与している。（以下、この番号を「メソッドナンバー」という。）このメソッドナンバーも１６進表記の番号の組合せによるが、前記クラスオブジェクトナンバーと区別できるように、下位の番号が２桁に設定されている。各メソッドナンバーは、それぞれそのメソッドのエントリ位置を表すポインタとしても使用される。
【００２５】
前記メソッドテーブル９の各エントリには、それぞれそのエントリが割り当てられたメソッドについて、そのメソッドの所属クラスのオブジェクトクラスナンバー（たとえばA.run()であればクラスＡのオブジェクトクラスナンバーである［０×１］），そのメソッドの格納場所を示すプログラム先頭アドレス，およびメソッドがどのようにオーバーライドされているかを示す情報（以下「オーバーライド情報」という。）が格納される。前記オーバーライド情報は、対応するrun()メソッドをオーバーライドしたクラスのオブジェクトクラスナンバーと、オーバーライドにより作成されたメソッドのメソッドナンバーとから成る。
【００２６】
このオーバライド情報に示される関係は、実際のオーバライドの状態を必ずしも忠実に表していないが、このオーバーライド情報を介して、１つのクラス（クラスＡ，クラスＸ）から作成された複数のクラス間において、各メソッドの所属クラスや格納場所に関わる情報（以下、この情報を「メソッド情報」という。）が、階層に沿って一連に連結される。（以下このデータ構成を、「メソッド情報の連結リスト」という。）
【００２７】
前記図２によれば、クラスＡを元に作成された各クラスにおいては、クラスＣおよびクラスＥにおいてそれぞれA.run()をオーバーライドし、クラスＧにおいてC.run()をオーバーライドしている。しかしながら図３のメソッドテーブル９における各メソッド情報は、A.run()→C.run()→E.run()→G.run()の順に連結される。なお連結リストの末尾のG.run()については、オーバーライド情報のオブジェクトナンバー，メソッドナンバーには、いずれも空のデータ（null）が格納される。
【００２８】
なお、本来のオーバーライドの関係を忠実に辿れるように、A.run()→E.run()，A.run()→C.run()→G.run()という２本の連結リストを設定することも可能である。しかしながら上記のように、擬似的なオーバーライド情報により、クラスＡとの階層関係を有するクラス間でメソッド情報の連結リストを一本化することにより、メソッドテーブル９のサイズを最小化することができる。
なおメソッド情報の連結順序は、上記に限らず、A.run()→E.run()→C.run()→G.run()またはA.run()→C.run()→G.run()→E.run()の順にしてもよい。ただし、本来の階層関係に反してE.run()をA.run()の前に置くような設定は、許可されない。
【００２９】
図４は、前記図２に示したクラス関係図を、前記図３のクラステーブル８，メソッドテーブル９による検索処理の流れを表すように書き換えたものである。図中、実線で示す矢印はスーパークラスの検索経路を示し、点線で示す矢印は前記メソッド情報の連結リストに基づきrun()メソッドのオーバーライド関係を検索する経路を示す。また各クラスのブロック内には、そのクラスのクラス名およびオブジェクトクラスナンバーを示すとともに、スーパークラスのオブジェクトナンバー、および図３のメソッドテーブル９の設定に基づくオーバーライド情報が記されている。
【００３０】
図５は、前記クラステーブル８およびメソッドテーブル９を用いてのメソッド検索部４による処理手順を示す。なお図中、ObjectClass, MethodPointer, MethodClass, SearchPointer, SearchClassは、いずれも検索のために設定した変数の名前である。
【００３１】
まずメソッド検索部４は、プログラム実行部３から得たメソッド呼出しのメッセージに含まれるクラス名を図示しない参照用テーブルと照合することにより、前記メッセージの対象となるクラスのオブジェクトクラスナンバーを取得して、これを変数ObjectClassに設定する（ＳＴ１）。つぎにメッセージに含まれるメソッド名についても同様の参照を行って指定されたメソッドのメソッドナンバーを取得し、これを変数MethodPointerに設定する（ＳＴ２）。
【００３２】
つぎにメソッド検索部４は、前記メソッドテーブル９においてMethodPointerが示すエントリより指定されたメソッドが所属するクラスのオブジェクトクラスナンバーを取得し、これを変数MethodClassに設定する（ＳＴ３）。
つぎのＳＴ４では、前記ObjectClassとMethodClassとを比較する。ここで両者が一致していると、ＳＴ４からＳＴ５に進み、前記メソッドテーブル９においてMethodPointerが示すエントリに格納されたプログラム先頭アドレスを読み出す。この読み出されたアドレスは、前記メソッドの格納場所を示すプログラムカウンタとしてプログラム実行部３に送信されるもので、この送信をもって検索を終了する。
【００３３】
一方、ObjectClassとMethodClassとが一致しない場合は、ＳＴ４からＳＴ６へと移行し、前記メソッドテーブル９において、MethodPointerが示すエントリのオーバーライド情報を読み出す。そしてこのオーバーライド情報のメソッドナンバーを変数SearchPointerに、オブジェクトクラスナンバーを変数SearchClassに、それぞれ設定し、ＳＴ７へと進む。
【００３４】
ＳＴ７では、前記ObjectClassとSearchClassとを比較する。ここで両者が一致するとＳＴ８に進んで、前記メソッドテーブル９においてSearchPointerが示すエントリからプログラム先頭アドレスを読み出し、これを前記プログラムカウンタとしてプログラム実行部３に送信し、検索を終了する。
【００３５】
ＳＴ７において、ObjectClassとSearchClassとが一致しなかった場合は、ＳＴ９に進み、メソッド検索テーブルのSearchPointerが示すエントリからオーバーライド情報を読み出す。そしてそのオーバーライド情報のメソッドナンバーおよびオブジェクトナンバーにより前記SearchPointer, SearchClassを書き換え、ＳＴ１０を介してＳＴ７に戻る。以下、ObjectClassとSearchClassとが一致するまで同様の処理を繰り返し、ObjectClassとSearchClassとが一致すると、ＳＴ８に進んで、その時点のSearchPointerが示すプログラム先頭アドレスを読み出し、プログラムカウンタとしてプログラム実行部３に送信する。
【００３６】
ただし、ＳＴ９で読み出されたオーバーライド情報が連結リストの末尾に位置する場合は、変数の書換え処理によりSearchClass＝nullとなるので、ＳＴ１０の判定が「ＹＥＳ」となってＳＴ１１へと移行する。
このＳＴ１１では、前記ObjectClassによりクラステーブル８を検索することにより、前記メッセージの対象となるクラスのスーパークラスに割り当てたオブジェクトクラスナンバーを読み出し、この番号によりObjectClassを書き換えてＳＴ４に戻る。以下、上記と同様の処理が実行されてＳＴ５またはＳＴ８で前記メソッドのプログラム先頭アドレスが読み出されると、検索処理を終了する。
【００３７】
なお最上位のクラスまで遡って検索しても、前記プログラム先頭アドレスを特定できなかった場合は、ＳＴ１１で書き換えられたオブジェクトクラスナンバーがnullとなるので、つぎのＳＴ１２が「ＹＥＳ」となり、所定の異常処理を行った後に検索を終了する。
【００３８】
つぎに前記図２〜４に示したクラスの関係およびオーバーライド情報のリスト構造に基づき、図５の手順による検索処理の具体例を示す。
【００３９】
(1) クラスＣのオブジェクトがC.run()メソッドを実行する場合
まずＳＴ１，２の処理により、ObjectClassとしてクラスＣのオブジェクトクラスナンバー［０×３］が、MethodPointerとしてC.run()のメソッドナンバー［０×０２］がそれぞれ設定される。さらにＳＴ３で前記メソッドテーブル９のMethodPointerが示すエントリから前記メソッドの所属クラスのオブジェクトナンバー［０×３］が読み出され、この値がMethodClassに設定される。
【００４０】
つぎのＳＴ４の比較処理では、ObjectClassとMethodClassとの一致が確認されてＳＴ５へと移行する。そしてＳＴ５で前記メソッドテーブル９のMethodPointerが示すエントリ、すなわち［０×０２］のエントリからプログラム先頭アドレスが読み出され、プログラム実行部３にプログラムカウンタとして送信され、検索終了となる。これにより指定されたC.run()メソッドが呼び出され、実行されることになる。
なお、run()メソッドを具備する他のクラスについても、そのクラスのオブジェクトが自クラスのメソッドを実行する場合は、上記と同様の手順でプログラム先頭アドレスが読み出される。
【００４１】
(2) クラスＣのオブジェクトがクラスＡにキャストして（クラスＡとして振る舞うことをいう。）、A.run()メソッドを実行する場合
この場合も、(1)と同様に、メソッドを実行する主体はクラスＣのオブジェクトであるので、ＳＴ１において、クラスＣのオブジェクトクラスナンバー［０×３］がObjectClassに設定される。
【００４２】
つぎにＳＴ２において、指定されたA.run()メソッドのメソッドナンバー［０×０１］がMethodPointerに設定される。さらにつぎのＳＴ３では、前記メソッドテーブル９のMethodPointerが示すエントリから前記A.run()メソッドの所属クラスのオブジェクトクラスナンバー［０×１］が読み出され、この値がMethodClassとして設定される。
【００４３】
ここでObjectClass≠MethodClassとなるため、ＳＴ４からＳＴ６に進み、前記メソッドテーブル９においてMethodPointerが示すエントリ、すなわち［０×０１］のエントリのオーバーライド情報が読み出される。そしてそのオーバーライド情報のメソッドナンバー［０×０２］がSearchPointerとして、オブジェクトクラスナンバー［０×３］がSearchClassとして、それぞれ設定され、ＳＴ７に進む。
【００４４】
ＳＴ７では、ObjectClass＝SearchClassと判断されてＳＴ８に進み、メソッドテーブル９において前記ＳＴ６で設定されたSearchPointer［０×０２］の示すエントリ、すなわち前記Ｃクラスに所属するC.run()メソッドのエントリからプログラム先頭アドレスが読み出され、プログラムカウンタとして送信される。よって(1)の例と同様に、C.run()メソッドが呼び出されて実行されることになる。
【００４５】
なお、他のrun()メソッドを具備するクラスＧ，クラスＥ，クラスＺについても、そのクラスのオブジェクトをスーパークラスにキャストさせてそのスーパークラスのrun()メソッドの実行を指定すると、上記と同様の手順により自クラスのrun()メソッドが呼び出される。よってオーバーライドしたメソッドを具備するクラスでは、スーパークラスへのキャスト中も自クラスのメソッドを実行する、というJavaの規則を守ることができる。
【００４６】
▲３▼  クラスＢのオブジェクトがB.run()メソッドを実行する場合
まずＳＴ１で、クラスＢのオブジェクトクラスナンバーである［０×２］がObjectClassとして設定された後、ＳＴ２のMethodPointerの設定に移行する。この場合、Ｂクラスはrun()メソッドをオーバーライドしていないから、スーパークラスであるＡクラスのA.run()メソッドのメソッドナンバー［０×０１］がMethodPointerとして設定される。さらにＳＴ３では、前記メソッドテーブル９においてMethodPointerが示すエントリより前記A.run()メソッドの所属クラスのオブジェクトクラスナンバー［０×１］が読み出され、この値がMethodClassとして設定される。
【００４７】
つぎのＳＴ４では、ObjectClass≠MethodClassと判断されてＳＴ６に移行し、前記メソッドテーブル９においてMethodPointerが示すエントリのオーバーライド情報に基づき、SearchPointerとして［０×０２］が、SearchClassとして［０×３］がそれぞれ設定される。そしてＳＴ７の比較処理に移行するが、ここでもSearchClass≠ObjectClassとなるため、ＳＴ７の判定は「ＮＯ」となる。
メソッド検索部４は、この「ＮＯ」判定に応じてＳＴ９に進み、前記SearchPointerの示す［０×０２］のエントリのオーバーライド情報に基づき、SearchPointerを［０×０３］に、SearchClassを［０×５］にそれぞれ書き換える。この時点では、SearchClass≠nullであるから、ＳＴ１０の判定は「ＮＯ」となってＳＴ７に戻る。しかしながら書換え後のSearchClassでも、ＳＴ７の判定は「ＮＯ」となり、ＳＴ９において、前記SearchPointerの示す［０×０３］のエントリのオーバーライド情報に基づき、SearchPointerが「０×０４］に、SearchClassが［０×７］に、それぞれ書き換えられる。
【００４８】
この書き換え後のSearchClassでも、ＳＴ１０，ＳＴ７の判定が「ＮＯ」となった後、再度ＳＴ９に進み、SearchPointerが示す［０×０４］のエントリのオーバーライド情報により、SearchPointer,SearchClassが書き換えられる。この書き換えにより、両変数はいずれも”null”となる。これによりＳＴ１０が「ＹＥＳ」となってＳＴ１１に進み、前記クラスＢのスーパークラスであるクラスＡのオブジェクトクラスナンバー［０×１］が読み出され、この値によりObjectClassが書き換えられる。
つぎのＳＴ１２の判定は「ＮＯ」となるので、ＳＴ４に戻って、書換え後のObjectClassをMethodClassと比較すると、両者は一致する。この結果、ＳＴ５に進んで、前記MethodPointer［０×０１］の示すエントリのプログラム先頭アドレスを読み出して、プログラムカウンタとして送信し、検索を終了する。よってクラスＢが継承したA.run()メソッドが呼び出され、実行されることになる。
【００４９】
なおＢクラスのオブジェクトがＡクラスをキャストしてA.run()メソッドを実行する場合も、上記と同様の手順でA.run()メソッドが呼び出される。また自らのrun()メソッドを具備しない他のクラス（クラスＤ，クラスＦ，クラスＹ）においても、そのクラスでのrun()メソッドの実行が指定された場合は、同様の手順で検索が行われ、その結果、スーパークラスから継承したrun()メソッドが呼び出され、実行されることになる。
【００５０】
(4) クラスＣのオブジェクトが階層関係にないクラスＸのオブジェクトにキャストして、X.run()メソッドを実行する場合
この場合も、(1)(2)と同様に、ＳＴ１でクラスＣのオブジェクトクラスナンバー［０×３］がObjectClassとして設定される。つぎにＳＴ２では、指定されたX.run()メソッドのメソッドクラスナンバー［０×０５］が、MethodPointerとして設定される。さらにＳＴ３では、前記メソッドテーブル９においてMethodPointerが示すエントリより、前記メソッドの所属クラスのオブジェクトクラスナンバー［０×８］が読み出され、この値がMethodClassとして設定される。
【００５１】
つぎのＳＴ４では、ObjectClass≠MethodClassとなるため、ＳＴ４の判定は「ＮＯ」となりＳＴ６に進む。ＳＴ６では、前記メソッドテーブル９のMethodPointerが示す［０×０５］のエントリのオーバーライド情報が読み出されて前記SearchPointer，SearchClassを書き換えることにより、SearchPointerが［０×０６］，SearchClassが［０×Ａ］にそれぞれ書き換えられる。この時点でのＳＴ１０の判定は「ＮＯ」となるため、ＳＴ７に戻る。
【００５２】
しかしながらこのＳＴ７の判定も「ＮＯ」となるため、ＳＴ９に進んで、SearchPointerが示す［０×０６］のエントリのオーバーライド情報によりSearchPointer,SearchClassを書き換える。この時点で各変数が”null”となるので、ＳＴ１０が「ＹＥＳ」となってＳＴ１１へと移行し、前記クラステーブル８よりスーパークラスであるクラスＡのオブジェクトクラスナンバー［０×１］を読み出して、この値によりObjectClassを書き換える。この時点でのＳＴ１２の判定は「ＮＯ」であるので、ＳＴ４に戻り、書き換えられたObjectClassを用いた検索を実行する。しかし、この場合も、クラスＣのオブジェクトナンバー［０×３］がObjectClassに設定されていたときと同様の手順で処理が進んでSearchClass＝nullとなり、ＳＴ１１でObjectClassの書換えが行われる。
【００５３】
ＳＴ１１でクラステーブル８から読み出されるのは、［０×１］のエントリに格納された"null"であるから、つぎのＳＴ１２が「ＹＥＳ」となり、異常処理の後に検索を終了する。
このように階層関係が設定されていないクラスのメソッドの実行が指定されると、そのメソッドの実行は不可能となり、不正なプログラムの実行がなされたと判断されて処理が中止される。
【００５４】
上記の各事例をまとめると、run()メソッドをオーバーライドしているクラスのオブジェクトがrun()メソッドを実行するように指定された場合、仮に指定されたメソッドがスーパークラスのメソッドであっても、自クラスのオブジェクトクラスナンバーをキーとしてメソッド情報の連結リストを辿ることにより、自クラスに所属するメソッドを呼び出して実行するようになる。またスーパークラスから暗黙のうちにrun()メソッドを継承しているクラスのオブジェクトがrun()メソッドを実行するように指定された場合、自クラスのオブジェクトクラスナンバーをキーにしたメソッドテーブルの検索後に、スーパークラスのオブジェクトクラスナンバーをキーにした検索に移行するので、スーパークラスに所属するrun()メソッドの格納場所を簡単に取得することができる。
【００５５】
このようにメソッド呼出しのメッセージに示されたクラス名，メソッド名に基づき検索キーを設定して、メソッド情報の連結リストおよびスーパークラスの関係を辿ることにより、指定されたメソッドの格納場所を正しく取得できる。
またメソッド情報は一連に連結され、各メソッド情報からそのメソッドの格納場所を一意に特定できるので、メソッドテーブルのデータ構造が簡単になる。またクラステーブル８，メソッドテーブル９とも、作成されているクラスやメソッドにのみエントリを設定するので、従来のハッシュテーブルのように余分なメモリ領域を確保する必要がなく、メモリ資源を活用できる。しかも各テーブルへのエントリは、各クラスやメソッドに固有の番号によって行われるので、ハッシュテーブルを用いた場合のような衝突が起こる虞がない。
また検索経路の簡易化により高速の検索処理を行うことができる。
【００５６】
さらに上記の検索用テーブルによれば、メソッドをオーバーライドするクラスを変更したり、新たなクラスを追加する場合も、速やかに設定情報の書換えを行うことができる。
図６，８，１０は、プログラムの設計変更に伴う検索用テーブルの書換え事例を示し、図７，９，１１は、それぞれ各事例におけるクラス間の関係を、オーバーライド情報のリスト構造による検索経路とともに示す。以下、各図の示す検索用テーブルの書換え事例を順に説明する。
【００５７】
図６および図７は、前記図２および図４に示したクラス関係に、新たなクラスＨを追加した例を示す。このクラスＨは、クラスＧをスーパークラスとし、またこのクラスＧの具備するG.run()メソッドをオーバーライドしている。
このような変更に対し、新たなクラスＨには、クラステーブル８のつぎのエントリを示すポインタ［０×Ｂ］がオブジェクトクラスナンバーとして与えられる。また［０×Ｂ］のエントリには、クラスＨのスーパークラスであるクラスＧのオブジェクトクラスナンバー［０×７］が格納される。
【００５８】
またこのクラスＨに所属するH.run()メソッドには、メソッドテーブル９のつぎのエントリを示すポインタ［０×０７］がメソッドナンバーとして与えられる。そしてこのエントリには、H.run()メソッドの所属クラスであるＨクラスのオブジェクトクラスナンバー［０×Ｂ］およびH.run()メソッドの格納場所の先頭アドレスが格納される。
【００５９】
さらにこのH.run()メソッドは、これまで連結リストの末尾であったG.run()メソッドをオーバーライドするものであるから、G.run()メソッドのエントリにおけるオーバーライド情報がH.run()メソッドへの連結を示す情報に書き換えられるとともに、H.run()メソッドのオーバーライド情報が、オブジェクトクラスナンバー，メソッドナンバーともnullに設定される。
なお、このＨクラスがrun()メソッドをオーバーライドしない場合は、クラステーブル８に対するエントリのみが設定される。
【００６０】
図８および図９は、前記図７に示したクラス関係において、Ｃクラスを、run()メソッドをオーバーライドしないクラスに変更した例を示す。この場合、クラス間の階層関係は変化しないので、クラステーブル８は変更されていない。
一方、メソッドテーブル９では、C.run()メソッドの削除に伴い、このメソッドのエントリ（ポインタ［０×０２］で示すエントリ）のデータが、すべてnullに書き換えられる。また前記連結リストにおいてC.run()メソッドの上位のA.run()メソッドと、C.run()メソッドのつぎのE.run()メソッドとが連結するように、A.run()メソッドのオーバーライド情報が書き換えられる。
【００６１】
図１０および図１１は、前記図９に示したクラス関係において、run()メソッドを持たないＢクラスを、run()メソッドをオーバーライドするクラスに変更した例を示す。この場合も、クラス間の階層関係は変化しないので、クラステーブル８は変更されていない。
一方、メソッドテーブル９では、B.run()メソッドの作成に伴い、前記C.run()メソッドの削除で空き領域となったポインタ［０×０２］のエントリがB.run()メソッドのエントリに、前記ポインタ［０×０２］がB.run()メソッドのメソッドナンバーにそれぞれ設定される。そしてこのエントリに、B.run()メソッドの所属クラスであるクラスＢのオブジェクトクラスナンバー［０×２］およびB.run()メソッドの格納場所の先頭アドレスが格納される。
【００６２】
またクラスＢは、クラスＥのスーパークラスであるので、前記連結リストにおいて、新規のB.run()メソッドをA.run()メソッドとE.run()メソッドとの間に挿入する必要がある。そこでA.run()メソッドおよびB.run()メソッドの各オーバライド情報が書き換えられて、A.run()→B.run()→E.run()の順序が設定される。
【００６３】
前記クラステーブル８やメソッドテーブル９では、各クラスやメソッドのエントリ情報を、それぞれのエントリのポインタを兼ねるオブジェクトクラスナンバーやメソッドナンバーを介して連結しているので、上記の各例に示したように、各テーブルに新規の情報を登録する場合、その登録情報は、テーブル内の任意の領域に設定することができる。
またメソッドの新規登録や削除を行う場合も、メソッド情報の連結リストを繋ぎ替える部分でオーバライド情報を書き換えるだけであるので、プログラムの設計変更に、きわめて容易に対応することができる。
【００６４】
また検索用テーブル領域７に使用されるメモリ領域は、新規エントリに応じて動的に確保することができるので、メモリ資源を有効に活用し、プログラムの設計変更に柔軟に対応することができる。
【００６５】
なお上記の検索用テーブルの設定は、Javaによるシステムに限らず、スーパークラスが１つに限定されるような階層関係を持つシステム全般に適用できる。
またＣ＋＋のように、２つのスーパークラスからメソッドやプロパティを継承する多重継承方式を採用する方式のシステムにおいても、２つのスーパークラスのいずれか一方でのみメソッドをオーバライドする関係が成立する場合は、前記図３と同様のメソッドテーブルを設定することができる。ただしクラステーブルについては、従来のハッシュテーブルを使用する。
【００６６】
図１２は、多重継承の関係にあるクラス間で前記メソッドテーブルの設定が可能となる事例を示す。図中、クラスＳは、クラスＰ，クラスＱをスーパークラスとし、クラスＴは、クラスＱ，クラスＲをスーパークラスとする。またクラスＳ，クラスＴの下位には、これらクラスをスーパークラスとするクラスＵが作成されている。
【００６７】
上位３つのクラスＰ，Ｑ，Ｒにおいて、クラスＰのみがrun()メソッドを持ち、そのrun()メソッドは、階層関係に沿ってクラスＳ，クラスＵの順にオーバーライドされる。（図中、run()メソッドのオーバーライドの関係を太実線で示す。）同様にクラスＱに所属するstop()メソッドは、階層関係に沿ってクラスＴ，クラスＵの順にオーバーライドされる。（図中、stop()メソッドのオーバーライドの関係を点線で示す。）またクラスＲに所属するclear()メソッドは、階層関係に沿ってクラスＴ，クラスＵの順にオーバーライドされる。このようにrun(),stop(),clear()の各メソッドは、いずれもクラス間の階層関係に沿ってオーバーライドの方向が一方向に限定されるから、Javaによるシステムと同様に、各メソッドの格納場所を特定する情報をクラス間の階層関係に基づいて連結させることが可能である。
【００６８】
【発明の効果】
この発明によれば、メソッドテーブルの呼出し対象のメソッドのエントリを起点に、そのエントリに連結された各エントリを連結順に検索することによって、前記呼出し対象のメソッドの格納場所を高速かつ正しく特定することができる。またメソッドテーブルのデータ構造が簡単になるので、無駄なメモリ領域を確保する必要がなく、メモリ資源を有効に活用することができる。
またプログラムの設計変更によりメソッドをオーバーライドするクラスが変更されたり、追加されたりしても、エントリの削除または追加と、ポインタの書き換え処理とによって容易に対応することができるので、システム開発にかかる効率を大幅に向上することができる。
【図面の簡単な説明】
【図１】この発明の一実施例にかかる演算処理装置の構成を示すブロック図である。
【図２】クラスの作成例およびその階層関係を示すクラス関係図である。
【図３】検索用テーブルのデータ構成例を示す説明図である。
【図４】図３の検索用テーブルによる検索経路を示すクラス関係図である。
【図５】メソッド検索の手順を示すフローチャートである。
【図６】クラスおよびメソッドの追加に伴い検索用テーブルを変更した例を示す説明図である。
【図７】図６の検索用テーブルによる検索経路を示すクラス関係図である。
【図８】メソッドの削除に伴い検索用テーブルを変更した例を示す説明図である。
【図９】図８の検索用テーブルによる検索経路を示すクラス関係図である。
【図１０】メソッドの追加により検索用テーブルを変更した例を示す説明図である。
【図１１】図１０の検索用テーブルによる検索経路を示すクラス関係図である。
【図１２】この発明を適用可能な多重継承の関係にあるクラスを示すクラス関係図である。
【符号の説明】
３  プログラム実行部
４  メソッド検索部
７  検索用テーブル領域
８  クラステーブル
９  メソッドテーブル
【図１】
0003785895.tif 000002
【図２】
0003785895.tif 000003
【図３】
0003785895.tif 000004
【図４】
0003785895.tif 000005
【図５】
0003785895.tif 000006
【図６】
0003785895.tif 000007
【図７】
0003785895.tif 000008
【図８】
0003785895.tif 000009
【図９】
0003785895.tif 000010
【図１０】
0003785895.tif 000011
【図１１】
0003785895.tif 000012
【図１２】
0003785895.tif 000013