JP3524024B2 - バイトコード実行装置およびその方法 - Google Patents

バイトコード実行装置およびその方法

Info

Publication number
JP3524024B2
JP3524024B2 JP24317699A JP24317699A JP3524024B2 JP 3524024 B2 JP3524024 B2 JP 3524024B2 JP 24317699 A JP24317699 A JP 24317699A JP 24317699 A JP24317699 A JP 24317699A JP 3524024 B2 JP3524024 B2 JP 3524024B2
Authority
JP
Japan
Prior art keywords
bytecode
instruction
executed
interpreter
execution
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.)
Expired - Fee Related
Application number
JP24317699A
Other languages
English (en)
Other versions
JP2001084146A (ja
Inventor
一則 緒方
秀昭 小松
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.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
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 International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP24317699A priority Critical patent/JP3524024B2/ja
Publication of JP2001084146A publication Critical patent/JP2001084146A/ja
Application granted granted Critical
Publication of JP3524024B2 publication Critical patent/JP3524024B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Landscapes

  • Advance Control (AREA)
  • Devices For Executing Special Programs (AREA)

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、Javaバイトコード
を逐次、解釈して実行するJavaインタプリタなどの
バイトコード実行装置およびその方法に関する。
【0002】
【従来の技術】仮想マシンのバイトコードで記述された
プログラムを実行する環境、例えばJava−VM(Jav
a Virtual Machine)等において、プログラムのバイトコ
ードを逐次解釈し、実行するインタプリタが広く用いら
れている。このようなインタプリタでは、次に実行する
バイトコードに応じた処理を行うバイトコード処理ルー
チンを決定するために、バイトコードをフェッチ・デコ
ード処理する必要がある。
【0003】[インタプリタ実行速度制限要因]これらの
処理は、例えば、コンパイラ等により予めソースプログ
ラムから特定の汎用CPU(インテル社x86系プロセ
ッサ、モトローラ社およびIBM社などが製造している
PowerPC系プロセッサなど)用に作成されたオブ
ジェクトプログラムを実行する場合には必要とされない
インタプリタに固有の処理であって、これらの処理に起
因する下記の要因が、インタプリタの実行速度を制限し
てしまう。
【0004】[同一ワードの複数回ロード]インタプリタ
実行においては、計算に使うデータに加えて、バイトコ
ードをメモリからロードするために、ロード・ストア処
理の割合が高い。特に最近の汎用CPUは、ほとんどの
場合、データサイズに関わらずワード単位のメモリアク
セスを行うように構成されている。したがって、例え
ば、汎用CPUが、2つのバイトコードをフェッチする
場合には、これら2つのバイトコードが同じワードに含
まれていても、必ず同じワードを2回ロードしてしま
う。
【0005】つまり、プログラムのバイトコードは、通
常、汎用CPUのワードより短いので、同一のワードに
複数(n個)のバイトコードが含まれる可能性が高い。
このような場合であっても、汎用CPUは、同じワード
に含まれる複数(n個)のバイトコードのフェッチのた
めに、同一のワードを複数(n)回、ロードする必要か
ら、無駄なロード命令を実行しなければならないという
ことが、インタプリタの実行速度を大きく制限する。し
かも、このようなロード命令の実行は、汎用CPUに含
まれるロード・ストアパイプラインの負荷を不要に高く
するという点からも、インタプリタ実行速度の制限要因
となる。
【0006】[異なるワードに存在するオペランドとオ
ペコード]また、バイト単位のロードとワード単位のロ
ードはどちらも1命令であることと、バイトコードの命
令長が通常1ワードより短いこととに着目して、フェッ
チに必要なロード命令数を減らすために、ワード単位の
ロード命令により、オペランドとオペコードとを同時に
フェッチする最適化手法がある。このようにバイトコー
ドを最適化すると、異なるワードにまたがって存在する
オペランドとオペコードとをロードしようとする場合に
は、汎用CPUは、2つのワードをロードする必要があ
るので、このことが、ロード・ストアパイプラインの負
荷をさらに高め、インタプリタ実行速度を制限してしま
う。
【0007】[デコード処理のオーバーヘッド]また、各
バイトコードの処理において、バイトコードのデコード
処理が終わらないうちは、プログラム実行のためのジャ
ンプ先が決まらない。このようなデコード処理が終わる
までジャンプ先を決定できないという依存関係は、デコ
ード処理にオーバーヘッドを生じさせ、インタプリタ実
行速度素制限してしまう。
【0008】
【発明が解決しようとする課題】本発明は、上述した従
来技術の問題点に鑑みてなされたものであり、インター
プリタの実行速度を制限する要因を解決し、バイトコー
ドを高速に実行することができるバイトコード実行装置
およびその方法を提供することを目的とする。また、本
発明は、特に、仮想マシンのバイトコードの高速実行に
適したバイトコード実行装置およびその方法を提供する
ことを目的とする。
【0009】
【課題を達成するための手段】[バイトコード実行装
置]上記目的を達成するために、バイト単位で命令長が
変化しうる複数の種類の命令を、それぞれ複数のバイト
を含むワードを処理単位とするCPUで順次、実行する
バイトコード実行装置であって、前記バイトコードを前
記ワード単位で読み出し、任意の時点で実行されている
前記命令の2つ以上後のバイトを、前記命令のオペコー
ドとして先行してデコードし、先行デコード結果とする
先行デコード手段と、前記任意の時点で実行されている
前記命令の種類に基づいて、前記任意の時点で実行され
ている前記命令の2つ以上後のバイトが、前記命令のオ
ペコードである場合には、次に、前記先行デコード結果
を実行し、これ以外の場合には、前記任意の時点で実行
されている前記命令の次のバイトをデコードして実行す
るバイトコード実行手段とを有する。
【0010】[バイトコード実行方法]また、本発明に
かかるバイトコード実行方法は、バイト単位で命令長が
変化しうる複数の種類の命令を、それぞれ複数のバイト
を含むワードを処理単位とするCPUで順次、実行する
バイトコード実行方法であって、前記バイトコードを前
記ワード単位で読み出し、任意の時点で実行されている
前記命令の2つ以上後のバイトを、前記命令のオペコー
ドとして先行してデコードし、先行デコード結果とし、
前記任意の時点で実行されている前記命令の種類に基づ
いて、前記任意の時点で実行されている前記命令の2つ
以上後のバイトが、前記命令のオペコードである場合に
は、次に、前記先行デコード結果を実行し、これ以外の
場合には、前記任意の時点で実行されている前記命令の
次のバイトをデコードして実行する。
【0011】[媒体]また、本発明にかかる媒体は、バ
イト単位で命令長が変化しうる複数の種類の命令を、そ
れぞれ複数のバイトを含むワードを処理単位とするCP
Uで順次、実行するバイトコード実行を行うプログラム
であって、前記バイトコードを前記ワード単位で読み出
し、任意の時点で実行されている前記命令の2つ以上後
のバイトを、前記命令のオペコードとして先行してデコ
ードし、先行デコード結果するステップと、前記任意の
時点で実行されている前記命令の種類に基づいて、前記
任意の時点で実行されている前記命令の2つ以上後のバ
イトが、前記命令のオペコードである場合には、次に、
前記先行デコード結果を実行し、これ以外の場合には、
前記任意の時点で実行されている前記命令の次のバイト
をデコードして実行するステップとをコンピュータに実
行させるプログラムを媒介する。
【0012】
【発明の実施の形態】以下、本発明の実施形態を説明す
る。
【0013】[ロードの最適化・バイトコードの再利用]
本発明にかかるバイトコード実行方法を実現するインタ
プリタにおいては、CPUが処理単位とする1ワードに
含まれる複数(n個)のバイトそれぞれに対応して1つ
ずつ、複数(n個)のバイトコード処理ルーチンが用意
される。つまり、例えば、本発明に係るインタプリタを
実行するCPUが、32ビット(4バイト)分のデータ
を1ワードとして処理単位とする場合には、インタプリ
タに4つのバイトコード処理ルーチンが備えられ、CP
Uが64ビット(8バイト)を1ワードとして処理する
場合には、インタプリタに8つのバイトコード処理ルー
チンが備えられる。
【0014】デコードテーブルは、ワードそれぞれに含
まれるn個のバイトそれぞれに対応して1つずつ、n種
類、設けられ、バイトコード(1つの命令分の全体で、
「オペランド」と「オペコード」とを含む)が示すオペ
コード(「バイトコード」の「機能コード」に相当)
は、このオペコードのワード内の位置(バイト)に対応
するデコードテーブル(各バイトコードごとに、オペコ
ードをそれに対応する処理ルーチンのアドレスへ変換す
る変換テーブル)の参照により、デコード(オペコード
を取り出し、デコードテーブルを参照して処理ルーチン
のアドレスを求めること)され、オペコードの処理ルー
チンのアドレスが求められる。なお、デコードテーブル
を参照せずにデコードすることも可能であるが、このよ
うな場合には、オペコードの種類と、ワードにおけるオ
ペコードの位置とに基づいて、処理ルーチンのアドレス
が求められるようにすればよい。
【0015】さらに、CPUがバイトコードをロードす
る回数を最小限にするために、インタプリタは、ある処
理ルーチン(一連のバイトコードに含まれる処理ルーチ
ン)を処理するためにロードしたバイトコードを、それ
に続く処理ルーチンを処理するために再利用する。この
再利用のために、インタプリタは、CPUのレジスタか
ら、バッファレジスタを、出現頻度の高いバイトコード
のオペランドのワード数より1つ多い数(ワード数+
1)だけ選択し、ロードしたバイトコードを、選択した
バッファレジスタに格納する。
【0016】このように、インタープリタがロード済み
のバイトコードを格納することにより、インタプリタが
ワードの最後に位置するオペコードを実行する場合であ
っても、オペランド全体がすでにバッファレジスタにロ
ードされていることになる。したがって、インタプリタ
は、処理ルーチンの先頭からオペランドの生成を開始す
ることができ、効率よくバイトコードが再利用される。
バッファレジスタにロードしたバイトコードの最後の1
ワードを使いきると、インタプリタは、次の処理ルーチ
ンの1ワード目を読み込む。このようにインタプリタが
バイトコードのロードを行うことにより、バイトコード
のフェッチのために、インタプリタにロードするワード
数を必要最小限にすることができる。
【0017】上述の通り、上で書いたように、最適な実
装のためには、バイトコード読み込みのためのコード
を、各処理ルーチンにインラインする必要がある。好適
な実装では、バイトコードをバッファレジスタに読み込
む処理を、各処理ルーチンにコピーし、その処理ルーチ
ン本来の処理と併せてマシンコードを配置することによ
り、その処理ルーチンとバイトコード読み込み処理を順
次実行した場合に比べて、CPUパイプラインのストール
を減らし、実行速度を向上することができる。
【0018】バイトコードをバッファレジスタに読み込
む必要があるか否かは、バイトコードのオペコードのワ
ードにおける位置とバイトコードの長さとに基づいて判
断でき、また、バイトコード処理ルーチンを、オペコー
ドのワードそれぞれに対して用意することとを考慮する
と、このような最適な実装においては、バイトコードを
バッファレジスタに読み込む処理を処理ルーチンにコピ
ーする必要があるかを、処理ルーチン作成時に判断でき
る。したがって、バイトコードを読み込む必要のある処
理ルーチンのみが、バイトコード読み込み処理のための
オーバーヘッドをインタープリタの実行時に負担するよ
うに最適化できる。
【0019】また、処理ルーチンは必要に応じてオペラ
ンドをバッファレジスタから取り出すが、オペランドの
バッファレジスタ内の位置はオペコードのワード中の位
置に応じて変わるので、処理ルーチンごとにオペランド
の位置を判断する必要がある。本発明にかかる方法で
は、処理ルーチンをオペコードのワード中の位置ごとに
用意し、処理ルーチン作成時にオペランドの位置を決定
できるので、インタープリタ実行時にオペランドの位置
を判断するオーバーヘッドがなくなるように実装でき
る。
【0020】なお、ワードに含まれる複数(n個)のバ
イトそれぞれに対応して設けられたバイトコード処理ル
ーチンそれぞれは、対応するバイト位置に応じて最適化
を行う。したがって、各処理ルーチンは、オペランドを
取り出すためのビット操作や、次のバイトコードの読み
込みを必要とするかを、インタープリタの実行時に判断
する必要はない。
【0021】ここの説明においては、4バイトを1ワー
ドとして処理の単位とするCPU上で、ワード境界から
始まる4個の1バイト命令A,B,C,Dを実行する場
合を具体例とする。従来のインタプリタは、これら4つ
の命令を実行するために、合計7ワード分のデータをロ
ードする必要がある。この理由は、従来のインタプリタ
は、ワードの先頭(第1バイト)に位置する命令Aを実
行する場合には、当該ワード(命令A,B,C,Dを含
むワード)をロードすればよいのに対し、命令B,C,
Dそれぞれを実行する場合には、当該ワードの第2,第
3,第4バイトから、その次のワードの第1,第2,第
3バイトまでのそれぞれ1ワード分のデータをロードす
る必要があるので、結局、2ワードずつのロードが必要
になるためである。一方、以上のようにバイトコードの
ロードを最適化し、バイトコードの再利用を図る本発明
にかかるインタプリタは、これら4個の命令を含む1ワ
ードを1回、ロードするだけでよいので、本発明にかか
るインタプリタによると、ロードの回数を7回(7ワー
ド)から1回(1ワード)に大きく減らすことができ、
さらに、CPUのロード・ストアパイプラインの負荷が
大きく軽減される。
【0022】さらに、64ビット(8バイト)を処理単
位とするCPU上で8個の連続した命令A,B,C,
D,E,F,G,Hを実行する場合を具体例にする。こ
の場合、上述したのと同様な理由により、本発明にかか
るインタプリタを用いた場合には、これら8つの命令の
ために1ワードをロードすればよいのに対し、従来から
のインタプリタでは15ワードのロードが必要になるの
で、ロードしなければならないワード数を1/15に大
きく減らすことができる。
【0023】[デコードオーバーヘッドの隠蔽]本発明
にかかるインタプリタにおいて、さらに、各ワードに含
まれるバイトそれぞれに対応して設けられたバイトコー
ド処理ルーチンは、次の次(2つ後の)バイトコードの
候補を、CPUのパイプラインの空きを利用して投機的
にデコードすることにより、バイトコードのデコードの
際に生じるオーバーヘッドを隠蔽する。ここで、2つ後
のバイトコードのオペコードの候補とは、次(1つ後)
のバイトコードが、出現頻度の高い命令フォーマットで
ある場合に、その次(2つ後)のバイトコードのオペコ
ードとなるバイトとして定義される。
【0024】例えば、一般に、バイトコードには1バイ
ト命令が最も多く含まれるので、バイトコードに含まれ
る各処理ルーチンにおいて、各時点で実行されているバ
イトコードの終りから2バイト先(2つ後のバイト)
が、2つ後のバイトコードのオペコードである可能性が
最も高いと予測することができる。従って、各時点で実
行されているバイトの2つ先のバイトを、投機的にデコ
ードすることにより、CPUのパイプラインの空きを有
効利用できる。
【0025】デコードする候補の数は、例えば、バイト
コード命令セットの設計で決まる特性である、出現頻度
の高い命令フォーマットの数とその出現頻度、および、
実行するCPUの実行ユニット構成により決まる、各処
理ルーチンでの整数パイプラインの空きサイクル数によ
り、実測あるいは実験などにより決定される。各バイト
コード処理ルーチンは、そのバイトコードのフォーマッ
トに応じて、次のバイトコードのデコードが必要である
かを判断し、デコードが必要と判断した場合には、確定
したオペコードをデコードする。この場合、2つ後のバ
イトコードに対する投機的デコードは無駄になるが、出
現頻度の高いフォーマットについて投機的デコードを行
なうので、無駄になる確率は低い。
【0026】さらに、各バイトコード処理ルーチンは、
投機的デコード処理のオーバーヘッドを最小限にするた
めに、投機的デコード結果を再利用する。このデコード
結果の再利用のためには、デコード結果を保持するレジ
スタ(以下、アドレスプールレジスタと記す)が、各ワ
ードに含まれるバイトそれぞれに対応づけて設けられ、
これらのアドレスプールレジスタには、対応するバイト
に対してオペコードの候補をデコードした結果が格納さ
れる。各処理ルーチンでは、新たにオペコードの候補と
なったバイトのみをデコードする。
【0027】各バイトコード処理ルーチンは、各時点で
実行されているバイトコードの、次のバイトコードのオ
ペコードの位置に対応するアドレスプールレジスタか
ら、1つ後のバイトコードのデコード結果を取得する。
オペコードのバイト位置ごとに、バイトコード処理ルー
チンが別々に設けられているので、どのアドレスプール
レジスタから取得するかを実行時に判断する必要はな
い。
【0028】[コンピュータネットワーク1]以下、本
発明にかかるバイトコード実行方法を応用したコンピュ
ータネットワーク1を説明する。図1は、本発明にかか
るバイトコード実行方法を応用したコンピュータネット
ワーク1の構成を示す図である。図1に示すように、コ
ンピュータネットワーク1は、サーバコンピュータ1
0、ISDN網等のデータ通信が可能な通信網20およ
びクライアントコンピュータ30から構成される。
【0029】クライアントコンピュータ30は、x86
系あるいはPowerPC系のCPU、メモリおよびこ
れらの周辺回路および等(図示せず)を含む一般的なコ
ンピュータのハードウェア300、マイクロソフト社の
WindowsあるいはIBM社のOS2といったオペ
レーティングシステム(OS)302、Java仮想マ
シン32、ハードディスク装置(HDD)、DVD装置
等の記憶装置34を含む。
【0030】Java仮想マシン32は、JITコンパ
イラ322、本発明にかかるバイトコード実行方法を適
用したバイトコードインタプリタ324、および、Ja
va仮想マシンランタイム関数320を含む。サーバコ
ンピュータ10は、クライアントコンピュータ30と同
様な構成部分(図示を省略)を含む一般的なコンピュー
タであって、記憶装置34と同様な記憶装置106およ
びJavaコンパイラ102を含む。
【0031】[Javaコンパイラ102]サーバコン
ピュータ10において、Javaコンパイラ102は、
ユーザが作成し、記憶装置106に記憶されたJava
プログラム100を読み出してコンパイルし、クライア
ントコンピュータ30側のJava仮想マシン32によ
り実行可能なJavaバイトコード104を生成し、記
憶装置106に対して出力する。
【0032】[記憶装置106]記憶装置106は、ユ
ーザによる操作に応じて、作成されたJavaプログラ
ム100を記憶・管理し、Javaコンパイラ102に
対して出力する。また、106は、同様に、Javaコ
ンパイラ102から入力されたバイトコード104を記
憶・管理し、外部からの要求に応じて、記憶・管理した
バイトコード104を、通信網20を介してクライアン
トコンピュータ30に対して送信する。
【0033】[Java仮想マシン32]Java仮想
マシン32は、通信網20および記録媒体40等を介し
てクライアントコンピュータ30に供給され、ハードウ
ェア300のメモリにロードされて、OS302上で動
作する。Java仮想マシン32は、サーバコンピュー
タ10から通信網20を介して送られてきたバイトコー
ド104、または、記録媒体40を介してえ34に供給
されたバイトコード104を実行する。
【0034】[Javaランタイム関数320]Jav
a仮想マシンランタイム関数は、Javaの言語仕様の
うち、バイトコードの仕様以外の部分を処理する関数群
であって、例えば、まだメモリにロードされていないバ
イトコードを、記憶装置等からメモリにロードしたり、
オブジェクトを作成するために、メモリ内の領域を確保
したりする。
【0035】[JITコンパイラ322]Java仮想
マシン32において、JITコンパイラ322は、バイ
トコード104をコンパイルし、ハードウェア300の
CPUが実行可能なマシンコードの形式のバイトコード
324を生成する。生成されたマシンコード形式バイト
コード324は、ハードウェア300のCPU(図示せ
ず)により実行される。
【0036】[バイトコードインタプリタ326]バイ
トコードインタープリタ326は、ここまでに述べた本
発明にかかるバイトコード実行方法を実現するために必
要な構成部分を含み、バイトコード104を1命令ずつ
処理し、バイトコードごとに定義された操作を行う。ま
た、バイトコードインタープリタ326は、バイトコー
ドをHDD等の記憶装置や、通信網から読み込む、およ
び、OS302への要求など、バイトコード操作以外の
処理を、Javaランタイム関数320を介して処理す
る。
【0037】具体的には、下記(1)〜(4)の処理が
実行される。 (1)Java仮想マシンランタイム関数は、Javク
ラスが持っているクラス定数表を参照して、そのバイト
コードを含むクラスの名前(「クラス名」)を取得する。 (2)クラス名を、Java実行時環境の仕様にしたが
って変換し、Javaクラスのすべての情報を含んだ
「クラスファイル」の、OS上のファイル名を取得す
る。 (3)「クラスファイル」から、バイトコード、およ
び、クラス定数表など、Javaクラスのすべての情報をメ
モリ上に読み込む。 (4)メモリ上に読み込まれた、そのクラスで実装され
ているすべてのメソッドのバイトコードの中から必要な
バイトコードのアドレスを検索し、取得する。
【0038】[バイトコードインタプリタ326の動
作]以下、図2〜図8を参照して、バイトコードインタ
プリタ326による本発明にかかるバイトコード実行処
理を中心に、コンピュータネットワーク1の動作を説明
する。図2は、図1に示したJava仮想マシン32の
バイトコードインタプリタ326の全体処理(S1)を
示すフローチャートである。図3は、図2に示したイン
タプリタ実行準備処理(S10)を示すフローチャート
である。図4は、図2に示した投機的デコードの確認処
理(S14)を示すフローチャートである。図5は、図
2に示したバイトコードの読み込み処理(S16)を示
すフローチャートである。図6は、図2に示した投機的
デコード処理(S18)を示すフローチャートである。
図7は、図2に示したメソッド呼び出し処理(S20)
を示すフローチャートである。図8は、図7に示したメ
ソッドの実行処理(S22)を示すフローチャートであ
る。
【0039】なお、これらのこのフローチャートにおい
て、ハードウェア300のCPU(PowerPC60
4)の1ワードは4バイト構成で、アドレスプールレジ
スタは4個用意され、3個のオペコードの候補が投機的
にデコードされる。また、バッファレジスタは、2個用
意され、間接ジャンプについてはCPUアーキテクチャ
での方法を用いる。
【0040】図2に示すように、バイトコードインタプ
リタ326は、図3を参照して後述するインタプリタ実
行準備処理(S10)を行い、次に、ハードウェア30
0のCPUが処理単位とするワードに含まれる複数(k
個)のバイトそれぞれに対して、バイトコード処理ルー
チン(S12)を実行する。
【0041】図3に示すように、インタプリタ実行準備
処理(S10)のステップ100(S100)におい
て、バイトコードインタプリタ326は、バイトコード
104から、最初に実行するバイトコードを含む1ワー
ドを読み込み、ハードウェア300のCPU内のレジス
タから選択したバッファレジスタに読み込む。
【0042】本発明を適用したバイトコードインタープ
リタでは、すべての処理ルーチン(A)は、その直前に
実行した処理ルーチン(Z)が、処理ルーチンAの処理
終了後にジャンプする飛び先アドレス(の候補)を、投機
的にデコードしていることを仮定している。しかし、最
初に実行する処理ルーチン(A0)には、Zに相当する
処理ルーチン(Z0)が存在しないので、「インタープリタ
実行準備処理」では、Zが行うべき投機的デコードを
(Z0が存在するかのように)行う。
【0043】ステップ102(S102)において、バ
イトコードインタプリタ326がS100の処理におい
て読み込んだワードに含まれるバイト(バイトコード)
の内、それぞれに対応するいずれかをデコードする。こ
こでは、最初に実行するバイトコード(あるいは、メソ
ッドの最初のバイトコード)を、確定的にデコードす
る。本発明における「バイトコードのデコード」は、そ
のバイトコードを処理する処理ルーチンのアドレスを求
めている。
【0044】ステップ104(S104)において、バ
イトコードインタプリタ326は、最初に実行するバイ
トコードの処理ルーチンへのジャンプアドレスを設定す
る。PowerPC604で間接ジャンプを行うには、
飛び先アドレスを、飛び先アドレス格納用の特定用途レ
ジスタに格納した後、間接ジャンプ命令を実行する。こ
こでは、特定用途レジスタに、飛び先アドレスを格納し
ている。
【0045】Javaバイトコードでは、実行頻度の高い命
令の命令長は1バイト、2バイト、および3バイトなの
で、バイトコードインタープリタは、次のバイトコード
の命令長が前記命令長のいずれかである場合の、2つ後
のバイトコードのオペコードの候補として、PC+1、PC+
2、およびPC+3の3バイトを先行デコードする。ステップ
106(S106)において、バイトコードインタプリ
タ326は、バイト単位のアドレスPC+1(最初に実
行するバイトコードのアドレスPCの次のアドレス)の
1バイトが、オペコードであると仮定してデコードし、
デコード結果を、ハードウェア300のCPU内に選択
されたアドレスプールレジスタ#(PC+1MOD
4)に格納する。
【0046】ステップ108(S108)において、バ
イトコードインタプリタ326は、アドレスPC+2
(最初に実行するバイトコードのアドレスPCの次のア
ドレス)の1バイトが、オペコードであると仮定してデ
コードし、デコード結果を、ハードウェア300のCP
U内に選択されたアドレスプールレジスタ#(PC+2
MOD 4)に格納する。
【0047】ステップ110(S110)において、バ
イトコードインタプリタ326は、アドレスPC+3
(最初に実行するバイトコードのアドレスPCの次のア
ドレス)の1バイトが、オペコードであると仮定してデ
コードし、デコード結果を、ハードウェア300のCP
U内に選択されたアドレスプールレジスタ#(PC+3
MOD 4)に格納する。
【0048】ステップ112(S112)において、バ
イトコードインタプリタ326は、最初のバイトコード
処理ルーチンにジャンプし、S14(図2,4)に進
む。つまり、S110までの処理において、上記A0の
仮定を満たすことができたので、ここでA0へジャンプ
し、バイトコードの実行を開始する。
【0049】図2,4に示すように、ステップ14(S
14)の投機的デコードの確認処理のステップ140
(S140)において、バイトコードインタプリタ32
6は、次のバイトコードのオペコードが先行してデコー
ドされているか否かを判断するために、その時点で実行
されているバイトコードの命令長が4バイト以上である
か否かを判断し、4バイト未満である場合には処理を終
了してS122(図2)の処理に進み、これ以外の場合
にはS142の処理に進む。
【0050】ステップ142(S142)において、バ
イトコードインタプリタ326は、次のバイトコードを
デコードし、S120(図2)の処理に進む。つまり、
投機的デコードが間違っていた場合に、次のバイトコー
ド(b)が確定的にデコードされ、Bのアドレスが求め
られる。
【0051】また図2を参照する。ステップ120(S
120)において、バイトコードインタプリタ326
は、次のバイトコード処理ルーチンのアドレスを設定す
る。つまり、S104においてと同様に、特定用途レジ
スタに、飛び先アドレスが格納される。
【0052】ステップ16(S16)のバイトコード読
み込み処理のステップ160(S160)において、図
5に示すように、バイトコードインタプリタ326は、
その時点で実行されているバイトコードが、バッファレ
ジスタにロードされている1ワード分を使い切ったか否
かを判断し、使い切った場合にはS162の処理に進
み、これ以外の場合には、S122(図2)の処理に進
む。
【0053】ステップ162(S162)において、バ
イトコードインタプリタ326は、次の1ワードを、バ
ッファレジスタに読み込み、S122(図2)の処理に
進む。
【0054】また図2を参照する。ステップ122(S
122)において、バイトコードインタプリタ326
は、バイトコードの仕様に応じた処理を行い、また、バ
イトコード実行位置を示すプログラムカウンタを、次の
バイトコードのアドレスに設定する。
【0055】ステップ18(S18)の投機的デコード
処理のステップ180(S180)において、図6に示
すように、バイトコードインタプリタ326は、その時
点で実行されているバイトコードの命令長が3バイト以
上であるか否かを判断し、3バイト以上である場合には
S182の処理に進み、これ以外の場合にはS184の
処理に進む。なお、S18の処理は、実際には、S12
4の処理とS126の処理との間で行うのがもっとも効
率的である。このようにすると、分岐のときに無駄な投
機的デコードをしなくても済む。
【0056】ステップ182(S182)において、バ
イトコードインタプリタ362は、次のバイトコードの
アドレスnPCの次のアドレスnPC+1の1バイトが
オペコードであると仮定してデコードし、デコード結果
を、ハードウェア300内のレジスタから選択されたア
ドレスプールレジスタ#(nPC+1 MOD 4)に
格納する。
【0057】ステップ184(S184)において、バ
イトコードインタプリタ362は、その時点で実行され
ているバイトコードの命令長が2バイト以上か否かを判
断し、2バイト以上の場合にはS186の処理に進み、
これ以外の場合にはS188の処理に進む。
【0058】ステップ186(S186)において、バ
イトコードインタプリタ326は、アドレスnPC+2
の1バイトをデコードし、デコード結果をアドレスプー
ルレジスタ#(nPC+2 MOD 4)に格納する。
【0059】ステップ188(S188)において、バ
イトコードインタプリタ326は、アドレスnPC+3
の1バイトをデコードし、デコード結果をアドレスプー
ルレジスタ#(nPC+3 MOD 4)に格納し、S
124(図2)の処理に進む。
【0060】また図2を参照する。ステップ124(S
124)において、バイトコードインタプリタ326
は、その時点で実行しているバイトコードが、分岐しな
い命令であるか、あるいは、メソッド内への分岐命令で
あるか、メソッド呼び出し命令であるかを判断し、これ
らのいずれであるかに応じて、S126、S128ある
いはS20の処理に進む。
【0061】ステップ126(S126)において、バ
イトコードインタプリタ326は、バイトコード実行位
置を示すバイトコードインタープリタのプログラムカウ
ンタを、実行中のバイトコード次のアドレスに設定し、
次のバイトコード処理ルーチンに間接ジャンプし、S1
4の処理に戻る。
【0062】ステップ128(S128)において、バ
イトコードインタプリタ326は、バイトコード実行位
置を示すプログラムカウンタを、分岐先に設定し、分岐
先の命令を実行し、S10の処理に戻る。
【0063】ステップ20(S20)のメソッド呼び出
し処理のS200において、図7に示すように、バイト
コードインタプリタ326は、インタプリタに実行再開
に必要なデータ(実行中のバイトコードのアドレス、ス
タックポインタ、スタックフレームのベースアドレス
等)を保持する。
【0064】ステップ22(S22)のメソッド実行処
理のS220において、図8に示すように、バイトコー
ドインタプリタ326は、その時点で実行しているバイ
トコードが分岐命令であるか否かを判断し、分岐命令で
ない場合には、分岐命令でないとして処理を終了してS
202(図7)の処理に進み(S222)、これ以外の
場合にはS224の処理に進む。なお、この判断は、す
べての処理ルーチンで行うが、S226以外の判断は、
処理ルーチン作成時にできるので、実行時に判断するオ
ーバーヘッドは生じない。S226の判断も、処理ルー
チン本来の処理の一部なので、追加の判断を行っている
わけではない。
【0065】ステップ224(S224)において、バ
イトコードインタプリタ326は、その時点で実行して
いるバイトコードが、条件分岐命令であるか否かを判断
し、条件分岐命令である場合にはS226の処理に進
み、これ以外の場合にはS230の処理に進む。
【0066】ステップ226(S226)において、バ
イトコードインタプリタ326は、S224において判
断された条件分岐命令の分岐条件が満たされているか否
かを判断し、満たされている場合にはS222の処理に
進み、これ以外の場合には、結果がメソッド内への分岐
であると判断して処理を終了し、S202(図7)の処
理に進む(S228)。
【0067】ステップ230(S230)において、バ
イトコードインタプリタ326は、S224の処理にお
いて判断されたその時点で実行しているバイトコード
が、メソッド内への無条件分岐命令であるか否かを判断
し、無条件分岐命令である場合にはS228の処理に進
み、これ以外の場合にはS232の処理に進む。
【0068】ステップ232(S232)において、バ
イトコードインタプリタ326は、S230の処理にお
いて判断されたその時点で実行しているバイトコード
が、call命令であるか否かを判断し、call命令
である場合には、結果がメソッド呼び出し命令であると
判断し、処理を収容してS202(図7)の処理に戻り
(S234)、これ以外の場合には、結果がリターン命
令であると判断し、処理を終了してS202(図7)の
処理に戻る(S236)。
【0069】ステップ202(S202)において、バ
イトコードインタプリタ326は、S200の処理にお
いて保存したデータをCPUのレジスタあるいはバイト
コードインタープリタ326が、その実行に必要なデー
タを格納するために確保した、メモリの領域にロード
し、インタプリタの実行を再開し、S10(図2)の処
理に戻る。
【0070】[効果]以下、本発明をPowerPC6
04プロセッサ用Javaバイトコードインタプリタに
適用した場合を具体例として、本発明にかかるインタプ
リタの効果を示す。Javaのバイトコードは、ほぼ全
ての命令のオペランドは4バイト以下なので、バッファ
レジスタを2個用意すれば、ほぼすべてのバイトコード
のオペランドをレジスタに格納しておくことができ、各
バイトコード処理ルーチンの先頭ですぐにオペランド生
成を始められる。つまり、従来、オペコードとオペラン
ドを同時にロードする最適化をした場合と同じ効果が得
られ、しかも、ロードの回数を減らせるので、本発明は
この点で優れている。
【0071】また、Javaのバイトコードの命令長
は、実行頻度の高い方から1バイト、2バイト、3バイ
トの順になっている。PowerPC604プロセッサ
は、3個のオペコードの候補をパイプラインの空きを利
用してデコードでき、また、Javaバイトコードの場
合、実行頻度で90%以上のバイトコードが3バイト以
内なので、3個の投機的デコードできれば、90%以上
の確率で、投機的デコードの効果が得られることが分か
る。
【0072】投機的デコードの効果を検証するために、
まず、PowerPC604におけるバイトコード処理
ルーチンの最小実行マシンサイクル数について考える。
インタプリタでは、処理ルーチンの最後で行う間接ジャ
ンプによるパイプラインのストールサイクル数と、間接
ジャンプの飛び先を決定するためのデコードのサイクル
数から、その処理ルーチンの最小実行サイクル数が決ま
り、どんなに処理 の簡単な処理ルーチンでも、実行サ
イクル数をこれより少なくすることはできない。
【0073】Javaバイトコードでは、実行頻度の高
いバイトコードの多くは処理の簡単なものなので、最小
実行サイクル数を減らすことにより、実行速度の高速化
が期待できる。つまり、従来のインタプリタを用いた場
合、最小実行サイクルは5サイクルであるのに対し、本
発明をJavaバイトコードインタプリタに適用した場
合、最小実行サイクル数を4サイクルに減らすことがで
きる。ここに示した1サイクルの差は、投機的デコード
によりデコードオーバーヘッドが隠蔽された結果であ
る。つまり、投機的デコードにより、バイトコードに含
まれる簡単な処理ルーチンは、最大20%高速化され
る。
【0074】次に、CPUのロードストアパイプライン
の負荷について考える。実行頻度の高いバイトコードの
処理ルーチンについて、処理ルーチンあたりのロード・
ストア命令の平均実行サイクル数は、従来のインタプリ
タを用いた場合には、3.82サイクルであるのに対
し、本発明にかかるインタプリタを用いた場合には、
2.43サイクルと大幅に減少する。
【0075】なお、この平均実行サイクル数は、eSu
it(ロータス社の100%ピュアJavaの統合オフ
ィスアプリケーションで、デスクトップ環境、表計算、
ワープロ、予定表などを備えている)の実行プロファイ
ルから求めた実行頻度の高いバイトコードについて、必
要なロード・ストア命令数と、ワード境界にアラインさ
れないメモリアクセスによる平均ストールサイクルの和
に、バイトコードごとの出現確率をかけたものを積算し
て求められ、PowerPC604のロード・ストアユ
ニットの使用率が100%の場合に、各処理ルーチンで
メモリアクセスに必要なサイクル数の平均を表す。
【0076】実際のプログラムでは、アウトオブオーダ
ー実行(CPUが命令を実行する際に、実行時に命令間
の依存関係を解析し、可能ならば、CPU内の実行ユニ
ットで命令を実行する順序を、プログラム中の機械語命
令の順番とは変えて実行することで、パイプラインのス
トールを防ぎ、実行速度を向上するCPUの設計手法の
一つ)を行っても、一般に、CPUのロード・ストア
ユニットの使用率が100%になることはない。したが
って、従来のインタプリタによると、実際の処理ルーチ
ンあたりのロード・ストア命令の平均実行サイクル数は
4サイクルを越えると考えられ、投機的デコードによる
最適化を行って最小実行サイクル数が4サイクルになっ
ても、ロード・ストアユニットがボトルネックとなり投
機的デコードで期待できる効果はほとんど得られない。
【0077】一方、本発明にかかるインタプリタを用い
た場合には、投機的デコードを行った場合の最小実行サ
イクルである4サイクルまで、1.577サイクル(=
4−2.43)分の余裕があるので、PowerPC6
04のロード・ストアユニットがボトルネックとなるこ
とはない。したがって、本発明にかかるインタプリタを
用いて、デコードオーバーヘッドの隠蔽と、ロード・ス
トアユニットの平均使用率の改善を同時に行うことによ
り、Javaバイトコードの実行速度を向上することが
できる。さらに具体的には、CaffeineMark
3.0ベンチマークのグラフィックを使わないベンチマ
ークにより、本発明を適用したAIX用Javaバイト
コードインタプリタは、本発明を適用しない従来のJa
vaバイトコードインタプリタよりも、平均40%、J
avaバイトコードを高速に実行することが確認され
た。
【0078】
【発明の効果】以上述べたように、本発明に係るバイト
コード実行装置およびその方法によれば、インタープリ
タの実行速度を制限する要因を解決し、バイトコードを
高速に実行することができる。また、本発明に係るバイ
トコード実行装置およびその方法は、特に、仮想マシン
のバイトコードの高速実行に適している。
【図面の簡単な説明】
【図1】本発明にかかるバイトコード実行方法を応用し
たコンピュータネットワークの構成を示す図である。
【図2】図1に示したJava仮想マシンのバイトコー
ドインタプリタの全体処理(S1)を示すフローチャー
トである。
【図3】図2に示したインタプリタ実行準備処理(S1
0)を示すフローチャートである。
【図4】図2に示した投機的デコードの確認処理(S1
4)を示すフローチャートである。
【図5】図2に示したバイトコードの読み込み処理(S
16)を示すフローチャートである。
【図6】図2に示した投機的デコード処理(S18)を
示すフローチャートである。
【図7】図2に示したメソッド呼び出し処理(S20)
を示すフローチャートである。
【図8】図7に示したメソッドの実行処理(S22)を
示すフローチャートである。
【符号の説明】
1・・・コンピュータネットワーク 10・・・サーバコンピュータ 106・・・記憶装置 102・・・Javaコンパイラ 20・・・通信網 30・・・クライアントコンピュータ 300・・・ハードウェア 302・・・OS 32・・・Java仮想マシン 322・・・JITコンパイラ 324・・・バイトコードインタプリタ 320・・・Java仮想マシンランタイム関数 34・・・記憶装置
───────────────────────────────────────────────────── フロントページの続き (72)発明者 小松 秀昭 神奈川県大和市下鶴間1623番地14 日本 アイ・ビー・エム株式会社 東京基礎研 究所内 (56)参考文献 特開 平4−77925(JP,A) 特開 平10−207707(JP,A) 特開 平2−206836(JP,A) 特表2000−506635(JP,A) 神保進一・他,「AMD−K7登場 1GHz時代へ」,日経バイト,日本, 日経BP社,1999年 7月22日,No. 193,pp.110−122,ISSN:0289 −6508 (58)調査した分野(Int.Cl.7,DB名) G06F 9/22 - 9/42 G06F 9/45 CSDB(日本国特許庁) JSTファイル(JOIS) INSPEC(DIALOG) WPI/L(DIALOG)

Claims (3)

    (57)【特許請求の範囲】
  1. 【請求項1】バイト単位で命令長が変化しうる複数の種
    類の命令を、それぞれ複数のバイトを含むワードを処理
    単位とするCPUで順次、実行するバイトコード実行装
    置であって、 バイトコードに対応したバイトコード処理ルーチンが、 前記バイトコードを前記ワード単位で読み出し、任意の
    時点で実行されている前記命令の、そのバイトコード命
    令セットの特性で決まる2つ以上後のバイトを、前記命
    令のオペコードとして先行してデコードし、先行デコー
    ド結果とする先行デコード手段と、 前記任意の時点で実行されている前記命令の種類に基づ
    いて、前記任意の時点で実行されている命令の次の命令
    のオペコードが、先行してデコードされている場合に
    は、次に、前記先行デコード結果を実行し、これ以外の
    場合には、前記任意の時点で実行されている前記命令の
    次のバイトをデコードして実行するバイトコード実行手
    段とを有するバイトコード実行装置。
  2. 【請求項2】バイト単位で命令長が変化しうる複数の種
    類の命令を、それぞれ複数のバイトを含むワードを処理
    単位とするCPUで順次、実行するバイトコード実行方
    法であって、 バイトコードに対応したバイトコード処理ルーチンが、 前記バイトコードを前記ワード単位で読み出し、任意の
    時点で実行されている前記命令の、そのバイトコード命
    令セットの特性で決まる2つ以上後のバイトを、前記命
    令のオペコードとして先行してデコードし、先行デコー
    ド結果とし、 前記任意の時点で実行されている前記命令の種類に基づ
    いて、前記任意の時点で実行されている命令の次の命令
    のオペコードが、先行してデコードされている場合に
    は、次に、前記先行デコード結果を実行し、これ以外の
    場合には、前記任意の時点で実行されている前記命令の
    次のバイトをデコードして実行するバイトコード実行方
    法。
  3. 【請求項3】バイト単位で命令長が変化しうる複数の種
    類の命令を、それぞれ複数のバイトを含むワードを処理
    単位とするCPUで順次、実行するバイトコード実行を
    行うプログラムを記録した、コンピュータ読取り可能な
    記録媒体であって、 前記プログラムがバイトコードに対応したバイトコード
    処理ルーチンを有しており、当該バイトコード処理ルー
    チンが、前記バイトコードを前記ワード単位で読み出
    し、任意の時点で実行されている前記命令の、そのバイ
    トコード命令セットの特性で決まる2つ以上後のバイト
    を、前記命令のオペコードとして先行してデコードし、
    先行デコード結果するステップと、 前記任意の時点で実行されている前記命令の種類に基づ
    いて、前記任意の時点で実行されている命令の次の命令
    のオペコードが、先行してデコードされている場合に
    は、次に、前記先行デコード結果を実行し、これ以外の
    場合には、前記任意の時点で実行されている前記命令の
    次のバイトをデコードして実行するステップとをコンピ
    ュータに実行させる、コンピュータ読取り可能な記録媒
    体。
JP24317699A 1999-08-30 1999-08-30 バイトコード実行装置およびその方法 Expired - Fee Related JP3524024B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP24317699A JP3524024B2 (ja) 1999-08-30 1999-08-30 バイトコード実行装置およびその方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP24317699A JP3524024B2 (ja) 1999-08-30 1999-08-30 バイトコード実行装置およびその方法

Publications (2)

Publication Number Publication Date
JP2001084146A JP2001084146A (ja) 2001-03-30
JP3524024B2 true JP3524024B2 (ja) 2004-04-26

Family

ID=17099956

Family Applications (1)

Application Number Title Priority Date Filing Date
JP24317699A Expired - Fee Related JP3524024B2 (ja) 1999-08-30 1999-08-30 バイトコード実行装置およびその方法

Country Status (1)

Country Link
JP (1) JP3524024B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100725386B1 (ko) 2004-09-25 2007-06-07 삼성전자주식회사 가상 머신 어플리케이션을 실행하는 방법 및 그 방법을이용한 디지털 방송 수신기
KR100818919B1 (ko) * 2006-02-24 2008-04-03 삼성전자주식회사 메소드 호출 방법 및 이를 이용한 자바 가상 머신

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
神保進一・他,「AMD−K7登場 1GHz時代へ」,日経バイト,日本,日経BP社,1999年 7月22日,No.193,pp.110−122,ISSN:0289−6508

Also Published As

Publication number Publication date
JP2001084146A (ja) 2001-03-30

Similar Documents

Publication Publication Date Title
US6324686B1 (en) Just in time compiler technique
US5778219A (en) Method and system for propagating exception status in data registers and for detecting exceptions from speculative operations with non-speculative operations
US5448746A (en) System for comounding instructions in a byte stream prior to fetching and identifying the instructions for execution
US9311095B2 (en) Using register last use information to perform decode time computer instruction optimization
US8893079B2 (en) Methods for generating code for an architecture encoding an extended register specification
US5701442A (en) Method of modifying an instruction set architecture of a computer processor to maintain backward compatibility
US7730463B2 (en) Efficient generation of SIMD code in presence of multi-threading and other false sharing conditions and in machines having memory protection support
US8200987B2 (en) Dynamic object-level code translation for improved performance of a computer processor
TWI279715B (en) Method, system and machine-readable medium of translating and executing binary of program code, and apparatus to process binaries
US7574588B2 (en) Time-multiplexed speculative multi-threading to support single-threaded applications
US6301705B1 (en) System and method for deferring exceptions generated during speculative execution
US20060200801A1 (en) Java Virtual Machine hardware for RISC and CISC processors
JP4841861B2 (ja) 演算処理装置及びデータ転送処理の実行方法
US20120198427A1 (en) Ensuring Register Availability for Dynamic Binary Optimization
JPH11296381A (ja) 仮想マシン及びコンパイラ
US20120198428A1 (en) Using Aliasing Information for Dynamic Binary Optimization
US20020194458A1 (en) Virtual condition codes
US8499293B1 (en) Symbolic renaming optimization of a trace
US7849292B1 (en) Flag optimization of a trace
Cocke et al. The evolution of RISC technology at IBM
WO2002008893A1 (en) A microprocessor having an instruction format containing explicit timing information
US8095775B1 (en) Instruction pointers in very long instruction words
JP2003510681A (ja) 仮想マシン命令の最適化されたバイトコードインタープリタ
US6871343B1 (en) Central processing apparatus and a compile method
US6467037B1 (en) Utilizing a program counter with one or more data counters for executing instructions

Legal Events

Date Code Title Description
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20040203

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20040210

LAPS Cancellation because of no payment of annual fees