JP2001134443A - インタフェース呼出し高速化方法 - Google Patents

インタフェース呼出し高速化方法

Info

Publication number
JP2001134443A
JP2001134443A JP31776399A JP31776399A JP2001134443A JP 2001134443 A JP2001134443 A JP 2001134443A JP 31776399 A JP31776399 A JP 31776399A JP 31776399 A JP31776399 A JP 31776399A JP 2001134443 A JP2001134443 A JP 2001134443A
Authority
JP
Japan
Prior art keywords
class
interface
dispatch table
registered
declared
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP31776399A
Other languages
English (en)
Inventor
Yuji Chiba
雄司 千葉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP31776399A priority Critical patent/JP2001134443A/ja
Publication of JP2001134443A publication Critical patent/JP2001134443A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

(57)【要約】 【課題】従来の言語処理系は、クラスがどのインタフェ
ースを実装するかを考慮せずにメソッドディスパッチテ
ーブルを構築する。このため、同じインタフェースiを
実現する複数のクラスについて、インタフェースiが宣
言するメソッドmがそれぞれのクラスのメソッドディス
パッチテーブルに登録される位置が互いに異なることが
多く、インタフェース呼出しを高速化しにくい。 【解決手段】インタフェースiを実現する複数のクラス
のメソッドディスパッチテーブルを作成する際、インタ
フェースiが宣言するメソッドmをメソッドディスパッチ
テーブル上の互いに同じ位置に登録する。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、インタフェースと
いう機能を提供するプログラミング言語の処理系に関す
る。
【0002】
【従来の技術】オブジェクト指向プログラミング言語
に、インタフェースという機能を提供するものがある。
インタフェースは、あるクラスのインスタンスが実行で
きるメソッド(関数)を宣言する。クラスとはオブジェ
クト指向言語におけるプログラム単位であり、その中で
フィールドを宣言し、メソッドを定義する。クラスは別
のクラスの定義を拡張する形で定義することもできる。
このとき、拡張する元になるクラスを親クラスといい、
拡張する先のクラスを子クラスという。クラスcのイン
スタンスとは、クラスcがもつ全てのフィールドをもつ
データ構造で、クラスcがもつ全てのメソッドを実行で
きる。クラスcがインタフェースiを「実装する」と宣言
するとき、クラスcはインタフェースiが宣言するメソッ
ドを全てもち、従ってクラスcのインスタンスはインタ
フェースiが宣言する全てのメソッドを実行できる。
【0003】インタフェースが宣言するメソッドを呼び
出す(実行する)ことを、インタフェース呼出しとい
う。インタフェース呼出しの実行手順の例として、イン
タフェースiが宣言するメソッドm(名前がM)を、イン
タフェースiを実装するクラスcのインスタンスoに実行
させる手順を示す。まず、インスタンスoを通じてクラ
スcのメソッドディスパッチテーブルtを取得する。メソ
ッドディスパッチテーブルtとは、クラスcのインスタン
スが実行できるメソッドを登録してある表である。つぎ
に、メソッドディスパッチテーブルtを走査して、メソ
ッドmに対応するエントリ(名前がMのメソッドのエント
リ)を求め、求めたエントリからメソッドmのアドレスa
を読み取る。最後に、アドレスaにジャンプし、メソッ
ドmを実行する。このように、インタフェース呼出しを
実行するには、まず、呼び出すメソッドをメソッドディ
スパッチテーブルを検索して取得する必要がある。この
ため、検索の作業を必要としない手続き型言語における
手続き呼出しに比べ、インタフェース呼出しには実行に
時間がかかるという問題がある。
【0004】インタフェース呼出しを高速化する技術
に、呼出し対象のメソッドに対応するエントリがメソッ
ドディスパッチテーブルのどこに登録されているか予測
する方法がある(Tim Lindholm, Frank Yellin: “The
Java Virtual Machine Specification,” Addson-Wesle
y, September 1996, pp.403-405)。この方法では、イ
ンタフェース呼出しをおこなったとき、呼出し対象のメ
ソッドがメソッドディスパッチテーブルのどの位置(何
番目のエントリ)に登録されていたかをインタフェース
呼出しの呼出し元に記録しておく。そして、同じ呼出し
元から次にインタフェース呼出しをおこなうとき、呼出
し対象のメソッドを探すためにメソッドディスパッチテ
ーブルを走査するにあたり、まず、前回のインタフェー
ス呼出しの際に記録しておいた、メソッドが登録されて
いた位置を読み出し、そこに目的のメソッドがあるか調
べる。こうすると、メソッドディスパッチテーブルを検
索する時間を短縮し、メソッド呼出しを高速化できる。
なぜなら、インタフェース呼出しは続けて同じクラスの
インスタンスについて実行されることが多く、同じクラ
スのインスタンスについてインタフェース呼出しを実行
する場合、呼び出すメソッドは同一で、メソッドディス
パッチテーブル上の位置も変らないので、二回目のイン
タフェース呼出しのとき、前回メソッドを見つけたのと
同じ場所からメソッドの検索を始めれば、最初の検索で
目的のメソッドを見つけられるからである。一回目と二
回目のインタフェース呼出しで、呼出し対象のインスタ
ンスのクラスが異なる場合、この方法でインタフェース
呼出しを高速化できるのは、それぞれのクラスのメソッ
ドディスパッチテーブル上の呼出し対象のメソッドの位
置が同じである場合に限られる。
【0005】従来の技術では、メソッドディスパッチテ
ーブルにメソッドを登録する位置を、次の手順によって
決める(Reinhard Wilhelm and Dieter Maurer, “Comp
ilerDesign,” Addison-Wesley 1995, pp.185)。ま
ず、クラスCのメソッドディスパッチテーブルTを作成す
るにあたり、クラスCの親クラスPを求め、親クラスPの
メソッドディスパッチテーブルの内容をメソッドディス
パッチテーブルTにコピーする。コピーするのは、親ク
ラスが定義するメソッドを登録する位置を、親クラスと
子クラスのメソッドディスパッチテーブルについて一致
させると、メソッド呼出しを高速に実行できるためであ
る。次に、クラスCがオーバライド(再定義)するメソ
ッドのエントリには、クラスCが再定義するメソッドを
登録する。
【0006】最後に、クラスCが定義するメソッドのう
ち、まだ登録されていないメソッドをメソッドディスパ
ッチテーブルTの空いている欄に順次登録する。
【0007】
【発明が解決しようとする課題】従来のメソッドディス
パッチテーブルの構築方法では、クラスがどのインタフ
ェースを実装するか考慮しない。このため、インタフェ
ースiを実装する複数のクラスのメソッドディスパッチ
テーブルにおいて、インタフェースiが宣言するメソッ
ドmが登録される位置が互いに同じになる確率が低い。
したがって、異なるクラスのインスタンスに対しインタ
フェース呼出しを行う場合、前記のインタフェース呼出
しの高速化方法が効きにくいという問題がおきる。
【0008】
【課題を解決するための手段】インタフェースiが宣言
するメソッドmを、インタフェースiを実現する複数のク
ラスのメソッドディスパッチテーブルについて互いに同
じ位置に登録する。
【0009】
【発明の実施の形態】以下、本発明の実施例を図面を参
照しつつ説明する。なお、これにより本発明が限定され
るものではない。
【0010】本発明を利用する言語処理系のプログラム
は図1に示すような計算機上で動作する。図1の計算機
はプロセッサ101と主記憶102、バス103、ディ
スク装置104を有し、ディスク装置104から言語処
理系のプログラムなどをバス103を介して主記憶10
2にとりこみ、プロセッサ101で実行する。
【0011】言語処理系のプログラムの実施例を図2に
示す。図2の処理系(実行時システム201)は、イン
タプリタ202とクラスローダ203から成る。インタ
プリタ202はユーザからプログラム(クラス)を実行
するよう指示を受けると、クラスローダ202に命じ
て、プログラム(クラス)を収めるクラスファイル20
4を読み取らせる。クラスローダ203はクラスファイ
ル204を読みこみ、メソッドディスパッチテーブル2
06などの、読みこんだクラスに係るデータ構造一式を
納めたデータ構造であるクラス節205を作成し、これ
をインタプリタ202に渡す。インタプリタ202は、
クラス節205を解釈、実行することでプログラムの実
行を進める。
【0012】クラスローダ203の実施例を図3に示
す。クラスローダ203は、まず、処理301でクラス
ファイル204を読み込み、処理302でクラスファイ
ル204をクラス節205に変換する。処理302のな
かにメソッドディスパッチテーブルを作成する処理30
3があり、本発明は処理303に適用する。
【0013】本発明のメソッドディスパッチテーブルを
作成する処理303の実施例を図4に示す。図4の処理
では、まず、処理401で読込み対象のクラスを定め
る。ここでは、図5のプログラムのクラスC3を読み込
むことを考える。図5のプログラムは、インタフェース
I1とクラスC1、C2、C3を定義する。インタフェース
I1はメソッドx()、y()を宣言する。クラスC1、
C3はインタフェースI1を実装し、メソッドx()、y
()を定義する。クラスC2はクラスC3の親クラスであ
り、メソッドz()を定義する。クラスC3はメソッド
z()をオーバライド(再定義)する。図5のクラスC
1、C2はすでに実行時システム201に取り込まれ
て、クラス節205になっており、クラスC1のメソッ
ドディスパッチテーブルが図6、クラスC2のメソッド
ディスパッチテーブルが図7のかたちに出来上がってい
るとする。メソッドディスパッチテーブルには、メソッ
ド名601とメソッドのアドレス602が登録されてい
る。
【0014】図4に戻り、処理401に続いて処理40
2に進む。処理402では、クラスC3のメソッドディ
スパッチテーブルとして空のテーブルTを作成し、処理
403に進む。処理403ではクラスC3が定義する全
メソッドからなる集合Mを作成する。クラスC3はメソッ
ドx()、y()、z()を定義するので、集合M=
{x()、y()、z()}になる。次に、判断404
でクラスC3が親クラスをもつか調べ、もつならば処理
405に進み、もたないならば処理407に進む。ここ
でクラスC3は親クラスC2をもつので、処理405に進
む。処理405では親クラスC2のメソッドディスパッチ
テーブルの内容をクラスC3のメソッドディスパッチテ
ーブルにコピーする。コピーした結果を図8に示す。続
いて処理406で集合Mから親クラスC2のメソッドをオ
ーバライドする全てのメソッドをテーブルTのオーバラ
イド先のエントリに登録し、集合Mから除外する。集合M
={x()、y()、z()}のうち、メソッドz()
は親クラスC2のメソッドz()をオーバライドするの
で、C3のメソッドディスパッチテーブルのメソッドz
()の欄を、C3が定義するメソッドz()の内容で上
書きする。上書きした結果を図9に示す。そして、メソ
ッドz()を集合Mから除外する。この結果、集合M=
{x()、y()}となる。処理406が終わったら処
理407に進み、集合M’=φ(空集合)とする。次に
判断408に進み、集合Mが空集合か調べ、そうならば
処理418に進み、そうでないならば処理409に進
む。ここでは集合Mが空集合でないので処理409に進
む。処理409では集合Mからメソッドを一つ取り出
す。ここでは、メソッドx()を取り出すものとする。
その結果、 集合M={y()}となる。
【0015】次に、処理410でクラスC3が実装する
全インタフェースからなる集合を集合Iとする。ここで
は、集合I={I1}になる。続く判断411で、メソッ
ドx()を宣言するインタフェースが集合Iに含まれる
か調べ、含まれるなら処理412に、含まれないなら処
理417に進む。ここでは、メソッドx()を宣言する
インタフェースI1が集合Iに含まれるので、処理412
に進む。処理412では、実行時システム201に読込
み済みの全クラス節205からなる集合を集合Sとす
る。ここでは、S={C1、C2}になる。続く判断41
3では、集合SがインタフェースI1を実装するクラスを
含むか調べ、含むならば処理414に進み、含まないな
らば処理417に進む。ここでは、クラスC1がインタ
フェースI1を実装するので処理414に進む。インタ
フェースI1を実装するクラスが複数存在する場合には、
そのうち一つを選んで処理414に進む。複数存在する
場合のクラスの選び方には、一番最初に見つけたクラス
を選ぶ方法などがある。処理414では、クラスC1の
メソッドディスパッチテーブルにおいてメソッドx()
が登録されている位置Lを取得する。図6から、メソッ
ドx()の登録されている位置は0番目のエントリ名の
で、L=0となる。続く判断415でテーブルTの位置L
のエントリが空か調べ、空ならば処理416に進み、空
でないならば処理417に進む。
【0016】図9をみると、テーブルTの0番目のエン
トリが空でないので、処理417に進む。処理417で
は集合M’にメソッドx()を加える。この結果、M’=
{x()}となる。処理417が終わったら判断408
に戻る。判断408以下、メソッドy()について同様
の処理をおこなうと、処理409、処理410、判断4
11、処理412、判断413を経由して処理414に
たどり着く。
【0017】処理414でクラスC1におけるメソッド
y()の登録されている位置L=1を取得し、判断41
5に進むと、テーブルTの1番目のエントリは空いてい
るので、処理416に進む。処理416では、テーブル
Tの位置Lのエントリにメソッドy()を登録する。これ
により、同一のインタフェースI1を実現するクラスC3
とクラスC1のメソッドディスパッチテーブルにおい
て、インタフェースI1が宣言するメソッドy()が、
互いに同じ位置のエントリに登録され、インタフェース
呼出しの高速実行が可能になる。メソッドy()をクラ
スC3のメソッドディスパッチテーブルに登録した結果
を図10に示す。処理416が終わったら、判断408
に戻る。この時点で、集合M=φであるので、判断40
8から処理418に進む。処理418では集合M’中の
メソッドをテーブルTの空エントリに登録する。ここで
集合M’={x()}なので、メソッドx()をテーブ
ルTに登録する。
【0018】登録が終わった時点でのクラスC3のメソ
ッドディスパッチテーブルの内容を図11に示す。処理
418が終わったら、メソッドディスパッチテーブルは
完成である。
【0019】完成したクラスC3のメソッドディスパッ
チテーブル(図11)と、クラスC3と同じくインタフ
ェースIを実装するクラスC1のメソッドディスパッチテ
ーブルを比較すると、インタフェースが宣言するメソッ
ドx()、y()のうち、メソッドy()については互
いに同じ位置に登録されているが、メソッドx()につ
いては互いに同じ位置に登録されていないことがわか
る。このように、インタフェースが宣言するメソッドの
一部についてのみ、登録される位置を同一にしてインタ
フェース呼出しの高速化をはかるケースもある。
【0020】
【発明の効果】インタフェース呼出しを高速化し、プロ
グラムの実行を高速化する。
【図面の簡単な説明】
【図1】実行機械の例を示す図。
【図2】言語処理系の構成例を示す図。
【図3】クラスローダの例を示す図。
【図4】メソッドディスパッチテーブルの構築手順の実
施例を示す図。
【図5】プログラムの例を示す図。
【図6】メソッドディスパッチテーブルの実施例(その
1)を示す図。
【図7】メソッドディスパッチテーブルの実施例(その
2)を示す図。
【図8】メソッドディスパッチテーブルの実施例(その
3)を示す図。
【図9】メソッドディスパッチテーブルの実施例(その
4)を示す図。
【図10】メソッドディスパッチテーブルの実施例(そ
の5)を示す図。
【図11】メソッドディスパッチテーブルの実施例(そ
の6)を示す図。
【符号の説明】
416…同じインタフェースを実装するクラスのメソッド
ディスパッチテーブルの同じ位置のエントリに、インタ
フェースが宣言するメソッドを登録する処理。

Claims (3)

    【特許請求の範囲】
  1. 【請求項1】 インタフェースiが宣言するメソッドm
    を、インタフェースiを実装する複数のクラスのメソッ
    ドディスパッチテーブルについて互いに同じ位置に登録
    することを特徴とするメソッドディスパッチテーブルの
    構築方法。
  2. 【請求項2】 請求項1記載のメソッドディスパッチテ
    ーブルの構築方法を用いるプログラミング言語の処理
    系。
  3. 【請求項3】 請求項2記載のソフトウエアを収める記
    録媒体。
JP31776399A 1999-11-09 1999-11-09 インタフェース呼出し高速化方法 Pending JP2001134443A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP31776399A JP2001134443A (ja) 1999-11-09 1999-11-09 インタフェース呼出し高速化方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP31776399A JP2001134443A (ja) 1999-11-09 1999-11-09 インタフェース呼出し高速化方法

Publications (1)

Publication Number Publication Date
JP2001134443A true JP2001134443A (ja) 2001-05-18

Family

ID=18091782

Family Applications (1)

Application Number Title Priority Date Filing Date
JP31776399A Pending JP2001134443A (ja) 1999-11-09 1999-11-09 インタフェース呼出し高速化方法

Country Status (1)

Country Link
JP (1) JP2001134443A (ja)

Similar Documents

Publication Publication Date Title
US6363522B1 (en) Method and apparatus for handling exceptions as normal control flow
US5586328A (en) Module dependency based incremental compiler and method
US5237654A (en) Hierarchical inter-panel process flow control
US6192516B1 (en) Interpreter generation and implementation utilizing interpreter states and register caching
US6601235B1 (en) Method and apparatus for dynamically deoptimizing compiled activations
US5632034A (en) Controlling method invocation sequence through virtual functions in an object-oriented class library
US5535389A (en) Business process objects with associated attributes such as version identifier
US7802249B2 (en) Techniques for implementing pluggable virtual machines
US9690604B2 (en) Language-based model for asynchronous operations
US5896532A (en) Objects with run-time classes and methods of making them
JPH11237990A (ja) 混合実行スタックおよび例外処理
JP2000222212A (ja) 実行時におけるオブジェクトの実クラス決定
KR100577366B1 (ko) 이종의 자바 메소드를 실행하는 방법 및 장치
US7035977B2 (en) Method and system for stack-caching method frames
US20030149967A1 (en) Information processing method and system
US6865738B2 (en) Method and apparatus for managing independent asynchronous I/O operations within a virtual machine
EP0708940B1 (en) Multiple entry point method dispatch
KR100818919B1 (ko) 메소드 호출 방법 및 이를 이용한 자바 가상 머신
US20040230962A1 (en) Exception handling compiler apparatus, program, recording medium, and compiling method
US6978448B1 (en) Method and apparatus for rewriting bytecodes to minimize runtime checks
JP2001134443A (ja) インタフェース呼出し高速化方法
JP2005215830A (ja) コンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体
US7055133B2 (en) Method and apparatus for eliminating C recursion from a Java programming language bytecode interpreter
JPH03184123A (ja) デジタルデータプロセッサのための手続き状態記述子システム
JP3767666B2 (ja) ワークフロー管理システム