JPH11175349A - データ列生成方法及び装置、変換方法、及びコンピュータ - Google Patents
データ列生成方法及び装置、変換方法、及びコンピュータInfo
- Publication number
- JPH11175349A JPH11175349A JP9308212A JP30821297A JPH11175349A JP H11175349 A JPH11175349 A JP H11175349A JP 9308212 A JP9308212 A JP 9308212A JP 30821297 A JP30821297 A JP 30821297A JP H11175349 A JPH11175349 A JP H11175349A
- Authority
- JP
- Japan
- Prior art keywords
- data
- code
- processing routine
- type
- instruction
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
(57)【要約】 (修正有)
【課題】限られたリソースにおいて高速にJavaのバ
イトコードを実行可能とするコンパイラ。 【解決手段】バイトコード14を、各バイトコードに対
応する処理ルーチンのアドレスをオペコードとする中間
コード102に変換し、中間コードの順番に処理ルーチ
ンを実行する、この時中間コードを固定長にし、その中
でオペコードのビット位置も固定する。また処理ルーチ
ンを、メモリ上の連続領域に配置し、オペコードには処
理ルーチン群104の先頭アドレスからのオフセットを
用いる。さらに、CPUのパイプラインの空きを利用し
て、中間コードのための本来の処理に並行して、次の中
間コードの処理ルーチンにジャンプするための命令群の
一部(オペランドの生成及びジャンプ)、及び次の次の
中間コードの処理ルーチンにジャンプするための命令群
の一部(中間コードのプリフェッチと処理ルーチンのア
ドレス計算)を実行する。
イトコードを実行可能とするコンパイラ。 【解決手段】バイトコード14を、各バイトコードに対
応する処理ルーチンのアドレスをオペコードとする中間
コード102に変換し、中間コードの順番に処理ルーチ
ンを実行する、この時中間コードを固定長にし、その中
でオペコードのビット位置も固定する。また処理ルーチ
ンを、メモリ上の連続領域に配置し、オペコードには処
理ルーチン群104の先頭アドレスからのオフセットを
用いる。さらに、CPUのパイプラインの空きを利用し
て、中間コードのための本来の処理に並行して、次の中
間コードの処理ルーチンにジャンプするための命令群の
一部(オペランドの生成及びジャンプ)、及び次の次の
中間コードの処理ルーチンにジャンプするための命令群
の一部(中間コードのプリフェッチと処理ルーチンのア
ドレス計算)を実行する。
Description
【0001】
【発明の属する技術分野】本発明は、コンパイラに関
し、より詳しくは、Javaのジャスト・イン・タイム
・コンパイラ(Just In Time (JIT) Compiler)に関す
る(Javaは、SunMicrosystemsの商標)。
し、より詳しくは、Javaのジャスト・イン・タイム
・コンパイラ(Just In Time (JIT) Compiler)に関す
る(Javaは、SunMicrosystemsの商標)。
【0002】
【従来の技術】Javaは、インターネットの普及によ
り、広く用いられている。これは、主に、図1に示した
ように、サーバ・コンピュータ1内のJavaコンパイ
ラ12によってコンパイルされたJavaソースコード
10のコンパイル結果であるバイトコード14の性質に
よる。このバイトコード14は、クライアント・コンピ
ュータ5内のOS(Operating System)53やCPU等
のハードウエア55に依存せず、これによりネットワー
ク3に接続された様々なクライアント・コンピュータ5
で実行することが可能となっている。反面、クライアン
ト・コンピュータ5内で再度バイトコードを解釈しなけ
ればならないので、実行速度が遅くなるという欠点もあ
る。なお、クライアント・コンピュータ5は、通常のコ
ンピュータの他、メモリの大きさが小さかったり、ハー
ドディスク等の補助記憶装置を含まないような、いわゆ
るネットワーク・コンピュータや情報家電の場合もあ
る。
り、広く用いられている。これは、主に、図1に示した
ように、サーバ・コンピュータ1内のJavaコンパイ
ラ12によってコンパイルされたJavaソースコード
10のコンパイル結果であるバイトコード14の性質に
よる。このバイトコード14は、クライアント・コンピ
ュータ5内のOS(Operating System)53やCPU等
のハードウエア55に依存せず、これによりネットワー
ク3に接続された様々なクライアント・コンピュータ5
で実行することが可能となっている。反面、クライアン
ト・コンピュータ5内で再度バイトコードを解釈しなけ
ればならないので、実行速度が遅くなるという欠点もあ
る。なお、クライアント・コンピュータ5は、通常のコ
ンピュータの他、メモリの大きさが小さかったり、ハー
ドディスク等の補助記憶装置を含まないような、いわゆ
るネットワーク・コンピュータや情報家電の場合もあ
る。
【0003】バイトコード14は、クライアント・コン
ピュータ5内のWWWブラウザ(World Wide Web Brows
er)などに設けられたJava仮想マシン(Java VM)
52にとってネイティブ・コードであり、実際ハードウ
エア55のCPUにて実行する場合には、Javaイン
タープリタ54や、Java JITコンパイラ56を
用いる。
ピュータ5内のWWWブラウザ(World Wide Web Brows
er)などに設けられたJava仮想マシン(Java VM)
52にとってネイティブ・コードであり、実際ハードウ
エア55のCPUにて実行する場合には、Javaイン
タープリタ54や、Java JITコンパイラ56を
用いる。
【0004】インタープリタ54は、実行時にバイトコ
ード14をデコードし、命令ごとに用意される処理ルー
チンを呼び出して実行する。インタープリタ方式の利点
は、バイトコードを読み込むとすぐに実行を開始できる
こと、及び一般にバイトコードはサイズが小さいので実
行に必要なメモリ量が少ないことである。欠点は、実行
速度が遅いことであり、その原因は、実行時にバイトコ
ードのデコードをするために以下の問題を生ずるからで
ある。 (a)Javaバイトコードは可変長フォーマットなの
で、CPUで多段プリフェッチによる最適化が困難であ
る。 (b)頻出するバイトコードにルールを適用する等の最
適化が困難である。複雑なルールや多くのルールを適用
しようとすると、ルールが適用できるバイトコード列の
検出に時間がかかり実用的でなくなってしまう。 (c)パラメータの読み出しが処理ルーチンの先頭でし
かできず、直ぐに処理を開始できない。 (d)デコード・ループが存在するので、全てのバイト
コードの処理時間にデコード・ループの処理時間が加算
される。そのため、デコード・ループの速度以上には速
くできない。
ード14をデコードし、命令ごとに用意される処理ルー
チンを呼び出して実行する。インタープリタ方式の利点
は、バイトコードを読み込むとすぐに実行を開始できる
こと、及び一般にバイトコードはサイズが小さいので実
行に必要なメモリ量が少ないことである。欠点は、実行
速度が遅いことであり、その原因は、実行時にバイトコ
ードのデコードをするために以下の問題を生ずるからで
ある。 (a)Javaバイトコードは可変長フォーマットなの
で、CPUで多段プリフェッチによる最適化が困難であ
る。 (b)頻出するバイトコードにルールを適用する等の最
適化が困難である。複雑なルールや多くのルールを適用
しようとすると、ルールが適用できるバイトコード列の
検出に時間がかかり実用的でなくなってしまう。 (c)パラメータの読み出しが処理ルーチンの先頭でし
かできず、直ぐに処理を開始できない。 (d)デコード・ループが存在するので、全てのバイト
コードの処理時間にデコード・ループの処理時間が加算
される。そのため、デコード・ループの速度以上には速
くできない。
【0005】一方、JITコンパイラ56は、バイトコ
ードを事前にあるいは実行する直前にコンパイラを用い
てマシン・コードに変換してそれを実行する。この方式
の利点は、コンパイラの技術を用いて、変換するマシン
・コードの最適化を行うことにより、変換されたコード
の実行速度が速いことである。しかし、従来ある最適化
コンパイラでは、インタープリタより多くのメモリやC
PUパワーを必要とするという欠点がある。
ードを事前にあるいは実行する直前にコンパイラを用い
てマシン・コードに変換してそれを実行する。この方式
の利点は、コンパイラの技術を用いて、変換するマシン
・コードの最適化を行うことにより、変換されたコード
の実行速度が速いことである。しかし、従来ある最適化
コンパイラでは、インタープリタより多くのメモリやC
PUパワーを必要とするという欠点がある。
【0006】また、スレディッド・コード(Threaded C
ode)を用いてバイトコードをサブルーチン・コールに
変換して実行するという技術もある。スレディッド・コ
ードとは、バイトコードごとに用意された、対応するバ
イトコードの処理を行うサブルーチンと、バイトコード
に従ってパラメータ・セットとサブルーチン・コールを
行うマシン・コードの組を指す。これは、最小のマシン
・コード・サイズで、バイトコードをマシン・コードに
コンパイルしたものである。バイトコードをスレディッ
ド・コードに変換して実行する場合、従来の最適化を実
施するコンパイラよりは少ないリソースで、インタープ
リタよりも高速に実行できるという効果がある。しか
し、以下の問題点もある。 (a)例えば、32ビットのRISC型CPUでJav
aバイトコードを実行する場合、変換したパラメータセ
ットとコール命令が占めるメモリのサイズが、平均でバ
イトコードの4倍程度になる。 (b)頻出するバイトコード列にルールベースの最適化
を適用する場合、バイトコード列が複数の基本ブロック
(Basic Block)にまたがっていないことを確認するた
めに、プログラム構造を解析する必要があり、そのオー
バーヘッドが最適化の効果を相殺する。 (c)中間コードもマシン・コードであるため、中間コ
ードを読み込むために、以前実行した処理ルーチンが命
令キャッシュから追い出されることがある。
ode)を用いてバイトコードをサブルーチン・コールに
変換して実行するという技術もある。スレディッド・コ
ードとは、バイトコードごとに用意された、対応するバ
イトコードの処理を行うサブルーチンと、バイトコード
に従ってパラメータ・セットとサブルーチン・コールを
行うマシン・コードの組を指す。これは、最小のマシン
・コード・サイズで、バイトコードをマシン・コードに
コンパイルしたものである。バイトコードをスレディッ
ド・コードに変換して実行する場合、従来の最適化を実
施するコンパイラよりは少ないリソースで、インタープ
リタよりも高速に実行できるという効果がある。しか
し、以下の問題点もある。 (a)例えば、32ビットのRISC型CPUでJav
aバイトコードを実行する場合、変換したパラメータセ
ットとコール命令が占めるメモリのサイズが、平均でバ
イトコードの4倍程度になる。 (b)頻出するバイトコード列にルールベースの最適化
を適用する場合、バイトコード列が複数の基本ブロック
(Basic Block)にまたがっていないことを確認するた
めに、プログラム構造を解析する必要があり、そのオー
バーヘッドが最適化の効果を相殺する。 (c)中間コードもマシン・コードであるため、中間コ
ードを読み込むために、以前実行した処理ルーチンが命
令キャッシュから追い出されることがある。
【0007】
【発明が解決しようとする課題】従来技術では、ネット
ワーク・コンピュータや、情報家電などに組み込まれ
る、Javaバイトコードのコンパイラとして、少ない
リソースで高速実行を可能にするものはない。
ワーク・コンピュータや、情報家電などに組み込まれ
る、Javaバイトコードのコンパイラとして、少ない
リソースで高速実行を可能にするものはない。
【0008】よって、本願発明の目的は、限られたリソ
ースにおいて高速にJavaのバイトコードを実行可能
とするコンパイラを提供することである。
ースにおいて高速にJavaのバイトコードを実行可能
とするコンパイラを提供することである。
【0009】さらに、プログラム構造解析を実施せずに
ルールベースの最適化を実施可能とするコンパイラを提
供することも目的である。
ルールベースの最適化を実施可能とするコンパイラを提
供することも目的である。
【0010】プログラムの基本ブロックの切れ目に関係
なくルールを適用できるようにして、プログラムの実行
を最適化することも目的である。
なくルールを適用できるようにして、プログラムの実行
を最適化することも目的である。
【0011】さらに、CPUの能力を最大限に活用す
る、バイトコードに対応する処理ルーチンの命令構成を
提供することも目的である。
る、バイトコードに対応する処理ルーチンの命令構成を
提供することも目的である。
【0012】
【課題を解決するための手段】本発明では、バイトコー
ドを、各バイトコードに対応する処理ルーチンのアドレ
スをオペコードとする中間コードに変換し、中間コード
の順番に処理ルーチンを実行する手法を採用する。この
時、中間コードを固定長にし、その中でオペコードのビ
ット位置も固定する。また、処理ルーチンを、メモリ上
の連続領域に配置し、オペコードには処理ルーチン群の
先頭アドレスからのオフセットを用いる。これにより、
中間コードに対応する処理ルーチンのアドレス生成及び
オペランドの生成も高速に実施できるようになる。さら
に、CPUのパイプラインの空きを利用して、中間コー
ドのための本来の処理に並行して、次の中間コードの処
理ルーチンにジャンプするための命令群の一部(オペラ
ンドの生成及びジャンプ)、及び次の次の中間コードの
処理ルーチンにジャンプするための命令群の一部(中間
コードのプリフェッチと処理ルーチンのアドレス計算)
を実行することができる。これは、デコードとジャンプ
の処理に必要な時間を節約することになり、実行速度を
上げることができる。また、中間コードは命令ではなく
データであるから、命令キャッシュを処理ルーチン群を
キャッシュするためだけに用いることができる。そのた
め、中間コードをパラメータセットと処理ルーチンへの
サブルーチンコールで実現する従来技術よりも、命令キ
ャッシュの使用効率がよくなる。
ドを、各バイトコードに対応する処理ルーチンのアドレ
スをオペコードとする中間コードに変換し、中間コード
の順番に処理ルーチンを実行する手法を採用する。この
時、中間コードを固定長にし、その中でオペコードのビ
ット位置も固定する。また、処理ルーチンを、メモリ上
の連続領域に配置し、オペコードには処理ルーチン群の
先頭アドレスからのオフセットを用いる。これにより、
中間コードに対応する処理ルーチンのアドレス生成及び
オペランドの生成も高速に実施できるようになる。さら
に、CPUのパイプラインの空きを利用して、中間コー
ドのための本来の処理に並行して、次の中間コードの処
理ルーチンにジャンプするための命令群の一部(オペラ
ンドの生成及びジャンプ)、及び次の次の中間コードの
処理ルーチンにジャンプするための命令群の一部(中間
コードのプリフェッチと処理ルーチンのアドレス計算)
を実行することができる。これは、デコードとジャンプ
の処理に必要な時間を節約することになり、実行速度を
上げることができる。また、中間コードは命令ではなく
データであるから、命令キャッシュを処理ルーチン群を
キャッシュするためだけに用いることができる。そのた
め、中間コードをパラメータセットと処理ルーチンへの
サブルーチンコールで実現する従来技術よりも、命令キ
ャッシュの使用効率がよくなる。
【0013】また、本願発明の第2の特徴ではプログラ
ムの構造解析を実施せずに、イディオムによるルールベ
ースの最適化を実施する。具体的には、A,B,C,D
というバイトコード列があり且つイディオムとしてAB
CDが定義されている場合、AというバイトコードをA
BCDの処理ルーチンのアドレスをオペコードとする中
間コードabcdに変換し、B,C,Dについては、そ
れぞれに対応する処理ルーチンのアドレスをオペコード
とする中間コードb,c,dに変換する。すなわち、a
bcd,b,c,dという順番で中間コードが生成され
る。abcdの処理終了後にdの後ろにジャンプするよ
うになっていれば、b,c,dに飛び込みがある場合で
も対処することができ、同一処理を保証しつつ処理の高
速化が図れる。中間コードを減少させることはできない
が、プログラムの構造解析をせずにイディオムによるル
ールベースの最適化ができる。逆に、従来では飛び込み
がある場合にはルールの適用ができないので、ルールの
適用範囲を拡大したとも言える。
ムの構造解析を実施せずに、イディオムによるルールベ
ースの最適化を実施する。具体的には、A,B,C,D
というバイトコード列があり且つイディオムとしてAB
CDが定義されている場合、AというバイトコードをA
BCDの処理ルーチンのアドレスをオペコードとする中
間コードabcdに変換し、B,C,Dについては、そ
れぞれに対応する処理ルーチンのアドレスをオペコード
とする中間コードb,c,dに変換する。すなわち、a
bcd,b,c,dという順番で中間コードが生成され
る。abcdの処理終了後にdの後ろにジャンプするよ
うになっていれば、b,c,dに飛び込みがある場合で
も対処することができ、同一処理を保証しつつ処理の高
速化が図れる。中間コードを減少させることはできない
が、プログラムの構造解析をせずにイディオムによるル
ールベースの最適化ができる。逆に、従来では飛び込み
がある場合にはルールの適用ができないので、ルールの
適用範囲を拡大したとも言える。
【0014】以上をまとめると以下のようになる。すな
わち、一期間に2命令以上実行できるプロセッサによっ
て実行される複数の処理ルーチンの各々は、処理ルーチ
ン本来の処理命令に加えて、当該処理ルーチンの次に実
行される第2処理ルーチンへジャンプするための命令群
の一部と、当該処理ルーチンの次の次に実行される第3
処理ルーチンへジャンプするための命令群の一部とを含
む。2つの処理ルーチンにおいて、1つの処理ルーチン
を実行するために必要な前処理を分割して処理すること
により、ジャンプ及びデコードのペナルティーなしで且
つ1つの処理ルーチン内の命令を無理なく最適化するこ
とができる。この処理ルーチンは、コンパイラの他の要
素と同様に、実行される場合にはメインメモリ上に記憶
される。
わち、一期間に2命令以上実行できるプロセッサによっ
て実行される複数の処理ルーチンの各々は、処理ルーチ
ン本来の処理命令に加えて、当該処理ルーチンの次に実
行される第2処理ルーチンへジャンプするための命令群
の一部と、当該処理ルーチンの次の次に実行される第3
処理ルーチンへジャンプするための命令群の一部とを含
む。2つの処理ルーチンにおいて、1つの処理ルーチン
を実行するために必要な前処理を分割して処理すること
により、ジャンプ及びデコードのペナルティーなしで且
つ1つの処理ルーチン内の命令を無理なく最適化するこ
とができる。この処理ルーチンは、コンパイラの他の要
素と同様に、実行される場合にはメインメモリ上に記憶
される。
【0015】また、各処理ルーチンは、処理の流れを規
定するコード列の各コードに対応するものであって、第
2処理ルーチンへジャンプするための命令群の一部を、
第2処理ルーチンのためのオペランド生成命令及び第2
処理ルーチンへのジャンプ命令を含み、第3処理ルーチ
ンへジャンプするための命令群の一部を、コード列にお
ける、第3処理ルーチンに対応するコードをフェッチす
る命令、及び第3処理ルーチンのアドレスを計算する命
令を含むようにすることも考えられる。
定するコード列の各コードに対応するものであって、第
2処理ルーチンへジャンプするための命令群の一部を、
第2処理ルーチンのためのオペランド生成命令及び第2
処理ルーチンへのジャンプ命令を含み、第3処理ルーチ
ンへジャンプするための命令群の一部を、コード列にお
ける、第3処理ルーチンに対応するコードをフェッチす
る命令、及び第3処理ルーチンのアドレスを計算する命
令を含むようにすることも考えられる。
【0016】さらに、各処理ルーチンは、処理の流れを
規定するコード列の各コードに対応するものであって、
複数の処理ルーチンをまとめたイディオム処理ルーチン
が、コード列における、第2処理ルーチンに対応するコ
ードをフェッチする命令、第2処理ルーチンのアドレス
を計算する命令、第2処理ルーチンのためのオペランド
生成命令、及び第2処理ルーチンへのジャンプ命令と、
コード列における、第3処理ルーチンに対応するコード
をフェッチする命令、及び第3処理ルーチンのアドレス
を計算する命令とを含むようにすることも考えられる。
プログラム解析を実施せずにイディオムによる最適化を
実施すると、先に述べた例ではabcd,b,c,dと
いう順番で中間コードが生成される。abcdの前の中
間コードについての処理ルーチンでは、bのプリフェッ
チ及びbの処理ルーチンのアドレス計算が実施されてし
まう。しかし、abcdの次に処理される中間コードは
dの後の中間コードであり、bではないので、プリフェ
ッチ及びアドレス計算をやり直す必要がある。よって、
イディオム処理ルーチンでは上で述べた命令を必要とす
る。
規定するコード列の各コードに対応するものであって、
複数の処理ルーチンをまとめたイディオム処理ルーチン
が、コード列における、第2処理ルーチンに対応するコ
ードをフェッチする命令、第2処理ルーチンのアドレス
を計算する命令、第2処理ルーチンのためのオペランド
生成命令、及び第2処理ルーチンへのジャンプ命令と、
コード列における、第3処理ルーチンに対応するコード
をフェッチする命令、及び第3処理ルーチンのアドレス
を計算する命令とを含むようにすることも考えられる。
プログラム解析を実施せずにイディオムによる最適化を
実施すると、先に述べた例ではabcd,b,c,dと
いう順番で中間コードが生成される。abcdの前の中
間コードについての処理ルーチンでは、bのプリフェッ
チ及びbの処理ルーチンのアドレス計算が実施されてし
まう。しかし、abcdの次に処理される中間コードは
dの後の中間コードであり、bではないので、プリフェ
ッチ及びアドレス計算をやり直す必要がある。よって、
イディオム処理ルーチンでは上で述べた命令を必要とす
る。
【0017】また、第1種類のデータ列(バイトコード
列)から第2種類のデータ列(中間コード列)を生成す
る際には、第1種類のデータを読み出すステップと、読
み出された第1種類のデータ列が、複数の第1種類のデ
ータを1つにまとめた、所定のイディオム・データに該
当するか判断するステップと、読み出された第1種類の
データ列がイディオム・データに該当する場合には、読
み出された第1種類のデータ列の先頭データを、イディ
オム・データに対応する第2種類のデータに変換するス
テップとを含む。先に述べた例では、バイトコードAが
中間コードabcdに変換されたことに対応する。
列)から第2種類のデータ列(中間コード列)を生成す
る際には、第1種類のデータを読み出すステップと、読
み出された第1種類のデータ列が、複数の第1種類のデ
ータを1つにまとめた、所定のイディオム・データに該
当するか判断するステップと、読み出された第1種類の
データ列がイディオム・データに該当する場合には、読
み出された第1種類のデータ列の先頭データを、イディ
オム・データに対応する第2種類のデータに変換するス
テップとを含む。先に述べた例では、バイトコードAが
中間コードabcdに変換されたことに対応する。
【0018】読み出された第1種類のデータ列のうち先
頭データ以外の各データを、それぞれ対応する第2種類
のデータに変換するステップとをさらに含むようにする
ことも考えられる。先に述べた例では、バイトコード
B,C,及びDがそれぞれ中間コードb,c,dに変換
されたことに対応する。
頭データ以外の各データを、それぞれ対応する第2種類
のデータに変換するステップとをさらに含むようにする
ことも考えられる。先に述べた例では、バイトコード
B,C,及びDがそれぞれ中間コードb,c,dに変換
されたことに対応する。
【0019】読み出された第1種類のデータ列のうち先
頭データ以外のデータ列が、所定のイディオム・データ
を構成するデータ列に該当する可能性があるか判断する
第2判断ステップと、可能性がないと判断された場合、
先頭データの次のデータを、対応する第2種類のデータ
に変換するステップとをさらに含むようにすることも考
えられる。先に述べた例では、BCD又はBCDX(X
は1以上のバイトコード)というイディオムが存在しな
い例であったが、一般的には、BCD又はBCDXとい
うイディオムが定義されている場合もある。よって、こ
の可能性を判断して、可能性がない場合に、次のバイト
コードを対応する中間コードに変換する。
頭データ以外のデータ列が、所定のイディオム・データ
を構成するデータ列に該当する可能性があるか判断する
第2判断ステップと、可能性がないと判断された場合、
先頭データの次のデータを、対応する第2種類のデータ
に変換するステップとをさらに含むようにすることも考
えられる。先に述べた例では、BCD又はBCDX(X
は1以上のバイトコード)というイディオムが存在しな
い例であったが、一般的には、BCD又はBCDXとい
うイディオムが定義されている場合もある。よって、こ
の可能性を判断して、可能性がない場合に、次のバイト
コードを対応する中間コードに変換する。
【0020】よって、第2判断ステップを、読み出され
た第1種類のデータ列のうち第2種類のデータに変換し
ていないデータ列について実施するステップとをさらに
含むようにすることも考えられる。先に述べた例では、
CやDからイディオムが定義されている場合も考えられ
るからである。
た第1種類のデータ列のうち第2種類のデータに変換し
ていないデータ列について実施するステップとをさらに
含むようにすることも考えられる。先に述べた例では、
CやDからイディオムが定義されている場合も考えられ
るからである。
【0021】なお以上の処理は、判断ステップの前に、
第1種類のデータ列の構造を解析しないで実施できる。
第1種類のデータ列の構造を解析しないで実施できる。
【0022】第2判断ステップで可能性があると判断さ
れた場合、読み出された第1種類のデータ列のうち第2
種類のデータに変換されていないデータ列自身が所定の
イディオム・データに該当するか判断するステップと、
読み出された第1種類のデータ列のうち第2種類のデー
タに変換されていないデータ列自身が所定のイディオム
・データに該当する場合、第2種類のデータに変換され
ていないデータの先頭データを、当該該当するイディオ
ム・データに対応する第2種類のデータに変換するステ
ップとをさらに含むようにすることも可能である。これ
は、BCDというイディオムが定義されていた場合の処
理の一例である。
れた場合、読み出された第1種類のデータ列のうち第2
種類のデータに変換されていないデータ列自身が所定の
イディオム・データに該当するか判断するステップと、
読み出された第1種類のデータ列のうち第2種類のデー
タに変換されていないデータ列自身が所定のイディオム
・データに該当する場合、第2種類のデータに変換され
ていないデータの先頭データを、当該該当するイディオ
ム・データに対応する第2種類のデータに変換するステ
ップとをさらに含むようにすることも可能である。これ
は、BCDというイディオムが定義されていた場合の処
理の一例である。
【0023】これまでに述べた、第2種類のデータに変
換するステップは、第1種類のデータに対応する処理ル
ーチンのアドレスを計算するステップを含むようにする
ことも考えられる。中間コードでオペコードを処理ルー
チンのアドレスとする場合には、この計算を必要とす
る。
換するステップは、第1種類のデータに対応する処理ル
ーチンのアドレスを計算するステップを含むようにする
ことも考えられる。中間コードでオペコードを処理ルー
チンのアドレスとする場合には、この計算を必要とす
る。
【0024】以上の処理は、専用の装置によって実施す
ることも、コンピュータのプログラムとして実施するこ
とも可能である。さらに、処理ルーチンやこのプログラ
ムは、フロッピー・ディスクやCD−ROM等の記憶媒
体や、メインメモリやハードディスク等の記憶装置に記
憶される。
ることも、コンピュータのプログラムとして実施するこ
とも可能である。さらに、処理ルーチンやこのプログラ
ムは、フロッピー・ディスクやCD−ROM等の記憶媒
体や、メインメモリやハードディスク等の記憶装置に記
憶される。
【0025】
【発明の実施の形態】本発明におけるシステム全体の装
置構成は図1と同様である。クライアント・コンピュー
タのメインメモリにロードされたJITコンパイラ56
をブロック図で表すと図2のようになる。バイトコード
14は、例えばネットワーク3を介してクライアント・
コンピュータ5に受信され、メインメモリにロードされ
る。また、各バイトコードに対応する処理ルーチン群1
04は、メインメモリ上に連続して配置され、ここでは
処理ルーチン1(104a)、処理ルーチン2(104
b)、処理ルーチン3(104c)が示されている。そ
して、バイトコード14を読み込み、処理ルーチン群1
04を参照して、中間コード102を生成し、併せて実
行を行う変換/実行モジュール100が用意されてい
る。
置構成は図1と同様である。クライアント・コンピュー
タのメインメモリにロードされたJITコンパイラ56
をブロック図で表すと図2のようになる。バイトコード
14は、例えばネットワーク3を介してクライアント・
コンピュータ5に受信され、メインメモリにロードされ
る。また、各バイトコードに対応する処理ルーチン群1
04は、メインメモリ上に連続して配置され、ここでは
処理ルーチン1(104a)、処理ルーチン2(104
b)、処理ルーチン3(104c)が示されている。そ
して、バイトコード14を読み込み、処理ルーチン群1
04を参照して、中間コード102を生成し、併せて実
行を行う変換/実行モジュール100が用意されてい
る。
【0026】では、この変換/実行モジュール100の
動作を図3を用いて説明する。この変換/実行モジュー
ル100は、呼び出されると最初に、バイトコード14
がロードされているか確かめる(ステップ1010)。
もし、既にロードされている場合には、バイトコードの
変換処理が終了していることになるので、ステップ10
40にジャンプする。一方、まだロードされていない場
合には、バイトコードをロードし(ステップ102
0)、中間コードに変換する。この時、一度変換してし
まえば、バイトコードは必要なくなるので、バイトコー
ドを格納している領域を解放する。これにより、メモリ
を有効利用することができる。この変換処理は、各バイ
トコードに対応する処理ルーチンのアドレスを中間コー
ドのオペコードとして計算する処理を含む。
動作を図3を用いて説明する。この変換/実行モジュー
ル100は、呼び出されると最初に、バイトコード14
がロードされているか確かめる(ステップ1010)。
もし、既にロードされている場合には、バイトコードの
変換処理が終了していることになるので、ステップ10
40にジャンプする。一方、まだロードされていない場
合には、バイトコードをロードし(ステップ102
0)、中間コードに変換する。この時、一度変換してし
まえば、バイトコードは必要なくなるので、バイトコー
ドを格納している領域を解放する。これにより、メモリ
を有効利用することができる。この変換処理は、各バイ
トコードに対応する処理ルーチンのアドレスを中間コー
ドのオペコードとして計算する処理を含む。
【0027】中間コードへの変換が終了すると、CPU
のレジスタの初期化を行い、最初の中間コードの処理ル
ーチンへジャンプする(ステップ1040)。そして、
中間コードの処理を実施する(ステップ1050)。こ
の中間コードの処理がリターン(return等)命令でない
限り中間コードの処理を続け(ステップ1060)、リ
ターン命令である場合には、元の処理にリターンする
(ステップ1070)。
のレジスタの初期化を行い、最初の中間コードの処理ル
ーチンへジャンプする(ステップ1040)。そして、
中間コードの処理を実施する(ステップ1050)。こ
の中間コードの処理がリターン(return等)命令でない
限り中間コードの処理を続け(ステップ1060)、リ
ターン命令である場合には、元の処理にリターンする
(ステップ1070)。
【0028】中間コードへの変換の処理を図4に示す。
最初に1つのバイトコードを読み込み(ステップ111
0)、バイトコードに対応する処理ルーチンのアドレス
をオペコードとする中間コードを生成する(ステップ1
120)。ここで、処理ルーチン群104は、メモリの
連続領域に配置されるので、先頭アドレスからのオフセ
ットを、対応する処理ルーチンのアドレスとする。図5
の例の場合、バイトコードiaddに対応する処理ルー
チンは、処理ルーチン群104の先頭(Top)から、
オフセットxxxxの所に存在するので、中間コードの
最初のオペコードはxxxxとなる。また、バイトコー
ドiloadに対応する処理ルーチンは、処理ルーチン
群104の先頭からオフセットyyyyの所に存在する
ので、中間コードの次のオペコードはyyyyとなる。
さらに、バイトコードif_cmpltに対応する処理
ルーチンは、処理ルーチン群104の先頭からオフセッ
トzzzzの所に存在するので、中間コードの次のオペ
コードはzzzzとなる。なお、処理ルーチンは完全に
連続して配置される必要はなく、ある程度まとめて配置
されれば速度的な不利益はない。
最初に1つのバイトコードを読み込み(ステップ111
0)、バイトコードに対応する処理ルーチンのアドレス
をオペコードとする中間コードを生成する(ステップ1
120)。ここで、処理ルーチン群104は、メモリの
連続領域に配置されるので、先頭アドレスからのオフセ
ットを、対応する処理ルーチンのアドレスとする。図5
の例の場合、バイトコードiaddに対応する処理ルー
チンは、処理ルーチン群104の先頭(Top)から、
オフセットxxxxの所に存在するので、中間コードの
最初のオペコードはxxxxとなる。また、バイトコー
ドiloadに対応する処理ルーチンは、処理ルーチン
群104の先頭からオフセットyyyyの所に存在する
ので、中間コードの次のオペコードはyyyyとなる。
さらに、バイトコードif_cmpltに対応する処理
ルーチンは、処理ルーチン群104の先頭からオフセッ
トzzzzの所に存在するので、中間コードの次のオペ
コードはzzzzとなる。なお、処理ルーチンは完全に
連続して配置される必要はなく、ある程度まとめて配置
されれば速度的な不利益はない。
【0029】また、バイトコードは可変長でCPUによ
る多段プリフェッチがしにくかったので、中間コードは
固定長にする。ワード(例えば32ビット)単位のバイ
ナリコードとし、第1ワードはオペコードとオペランド
で構成する。そして、ワード内のオペコードとオペラン
ドの位置及び長さも固定するとよい。そして、多数のオ
ペランドが必要な場合を除き、1ワードに収まるように
する。第2ワード以降が必要ならば、それは各オペコー
ドごとに決めておく。2オペランド命令であれば、第1
ワードは、通常のオペコード及び第1オペランドとし、
第2ワードは、第2オペランドとNOP(No Operatio
n)とすることも考えられる。また、可変長オペランド
の場合には、第2ワード以降は必要な長さのオペランド
とすればよい。
る多段プリフェッチがしにくかったので、中間コードは
固定長にする。ワード(例えば32ビット)単位のバイ
ナリコードとし、第1ワードはオペコードとオペランド
で構成する。そして、ワード内のオペコードとオペラン
ドの位置及び長さも固定するとよい。そして、多数のオ
ペランドが必要な場合を除き、1ワードに収まるように
する。第2ワード以降が必要ならば、それは各オペコー
ドごとに決めておく。2オペランド命令であれば、第1
ワードは、通常のオペコード及び第1オペランドとし、
第2ワードは、第2オペランドとNOP(No Operatio
n)とすることも考えられる。また、可変長オペランド
の場合には、第2ワード以降は必要な長さのオペランド
とすればよい。
【0030】一方、バイトコードのオペランドは、スタ
ックに置かれるものとバイトコードの中に含まれるもの
がある。処理ルーチンでは、スタックにおかれるオペラ
ンドは実行時にスタックからロードし、バイトコードの
中に含まれるオペランドは中間コードのオペランドフィ
ールドから取ってくる。中間コードに含まれるオペラン
ドは大きく分けると、 1. ローカル変数のインデックス 2. コンスタント・プール(Constant Pool(定数表))の
インデックス 3. 定数値 4. オペランドがない(オペランドはスタックにあるもの
のみ) 5. その他、命令に依存したオペランド となる。以下、上のそれぞれについて説明する。
ックに置かれるものとバイトコードの中に含まれるもの
がある。処理ルーチンでは、スタックにおかれるオペラ
ンドは実行時にスタックからロードし、バイトコードの
中に含まれるオペランドは中間コードのオペランドフィ
ールドから取ってくる。中間コードに含まれるオペラン
ドは大きく分けると、 1. ローカル変数のインデックス 2. コンスタント・プール(Constant Pool(定数表))の
インデックス 3. 定数値 4. オペランドがない(オペランドはスタックにあるもの
のみ) 5. その他、命令に依存したオペランド となる。以下、上のそれぞれについて説明する。
【0031】1. ローカル変数のインデックス Javaのバイトコードでは、ローカル変数は0から順
番にふられた番号を持ち、オペランドのローカル変数の
指定にはその番号を使う。すべてのローカル変数は、同
じサイズ(1ワード=32ビット)である(64ビット
・データでは、ローカル変数を2個使う)。中間コード
では、ローカル変数番号の代わりに、そのメソッドのス
タックフレームの先頭からローカル変数のアドレスまで
のオフセット(ワード単位)をオペランドにする。JI
Tコンパイラで実行する場合、あるメソッドのローカル
変数の領域をそのメソッドのスタックフレームの近辺に
取る。また、実行中のメソッドのスタックフレームの先
頭のアドレスはレジスタ(以下で述べるPowerPC
の場合BPレジスタ)に保持しておくので、オペランドを
上のように決めると、BPレジスタと、前の処理ルーチン
で4倍してバイト単位に変換されたオフセットを使っ
て、すぐにローカル変数にアクセスできる。(前の処理
ルーチンでオペランドを4倍するかどうかは、CPUに
依存する)。
番にふられた番号を持ち、オペランドのローカル変数の
指定にはその番号を使う。すべてのローカル変数は、同
じサイズ(1ワード=32ビット)である(64ビット
・データでは、ローカル変数を2個使う)。中間コード
では、ローカル変数番号の代わりに、そのメソッドのス
タックフレームの先頭からローカル変数のアドレスまで
のオフセット(ワード単位)をオペランドにする。JI
Tコンパイラで実行する場合、あるメソッドのローカル
変数の領域をそのメソッドのスタックフレームの近辺に
取る。また、実行中のメソッドのスタックフレームの先
頭のアドレスはレジスタ(以下で述べるPowerPC
の場合BPレジスタ)に保持しておくので、オペランドを
上のように決めると、BPレジスタと、前の処理ルーチン
で4倍してバイト単位に変換されたオフセットを使っ
て、すぐにローカル変数にアクセスできる。(前の処理
ルーチンでオペランドを4倍するかどうかは、CPUに
依存する)。
【0032】2. Constant Poolのインデックス Javaでは、定数値のオペランドがバイトコードの中
に含まれる場合と、コンスタント・プール(定数表、各
要素のサイズは1ワード=32ビット)に格納しておい
て、そのインデックスをオペランドとする場合がある。
オペランドがコンスタント・プールに格納された定数値
の場合、コンスタント・プールのベースアドレスから
の、ワード単位のオフセットをオペランドとする。処理
ルーチンでは、コンスタント・プールのベースアドレス
を指すレジスタ(以下の例ではCPレジスタ)と、前の処
理ルーチンで4倍してバイト単位に変換したオフセット
を使って、コンスタント・プールの内容をすぐにロード
できる。実際のインプリメンテーションでは、コンスタ
ント・プールのベースアドレスは、コンスタント・プー
ルの先頭+32Kワードのアドレスを指す。これは、符
号付16ビットの値として扱われるオペランドをインデ
ックスとして使う場合に、最大64Kエントリのすべて
をアクセスできるようにするための工夫である。
に含まれる場合と、コンスタント・プール(定数表、各
要素のサイズは1ワード=32ビット)に格納しておい
て、そのインデックスをオペランドとする場合がある。
オペランドがコンスタント・プールに格納された定数値
の場合、コンスタント・プールのベースアドレスから
の、ワード単位のオフセットをオペランドとする。処理
ルーチンでは、コンスタント・プールのベースアドレス
を指すレジスタ(以下の例ではCPレジスタ)と、前の処
理ルーチンで4倍してバイト単位に変換したオフセット
を使って、コンスタント・プールの内容をすぐにロード
できる。実際のインプリメンテーションでは、コンスタ
ント・プールのベースアドレスは、コンスタント・プー
ルの先頭+32Kワードのアドレスを指す。これは、符
号付16ビットの値として扱われるオペランドをインデ
ックスとして使う場合に、最大64Kエントリのすべて
をアクセスできるようにするための工夫である。
【0033】3. 定数値 バイトコードの中に定数値が含まれている場合、整数を
扱う命令の場合、その定数値 は符号付16ビット整数の範囲に収まる値である。この
場合、その整数値をそのままオペランドとする。浮動小
数点数を扱う命令の場合、その定数値は0,1,2のい
ずれかである。これらの値は、単精度浮動小数点数でも
倍精度浮動小数点数でも、上位16ビット以外のビット
はすべて0である。そこで、定数値をその命令にあった
フォーマットで表したときの上位16ビットをオペラン
ドとする。整数値を扱う命令がオペランドを使う場合、
前の処理ルーチンがオペランドを4倍しているので、オ
ペランドを1/4倍して元の値に戻す必要がある。これ
らの処理は無駄だが、実際のプログラムのバイトコード
では、定数値を扱う命令よりもローカル変数やコンスタ
ント・プールをアクセスする命令の方が多いので、数の
多い方が速くなるように設計している。また、定数を扱
う命令は、定数値をスタックにプッシュするだけの簡単
な命令なので、命令の依存関係により1/4倍する操作
は実行速度に影響しない。浮動小数点数を扱う命令で
は、必要な0を補って使用する。
扱う命令の場合、その定数値 は符号付16ビット整数の範囲に収まる値である。この
場合、その整数値をそのままオペランドとする。浮動小
数点数を扱う命令の場合、その定数値は0,1,2のい
ずれかである。これらの値は、単精度浮動小数点数でも
倍精度浮動小数点数でも、上位16ビット以外のビット
はすべて0である。そこで、定数値をその命令にあった
フォーマットで表したときの上位16ビットをオペラン
ドとする。整数値を扱う命令がオペランドを使う場合、
前の処理ルーチンがオペランドを4倍しているので、オ
ペランドを1/4倍して元の値に戻す必要がある。これ
らの処理は無駄だが、実際のプログラムのバイトコード
では、定数値を扱う命令よりもローカル変数やコンスタ
ント・プールをアクセスする命令の方が多いので、数の
多い方が速くなるように設計している。また、定数を扱
う命令は、定数値をスタックにプッシュするだけの簡単
な命令なので、命令の依存関係により1/4倍する操作
は実行速度に影響しない。浮動小数点数を扱う命令で
は、必要な0を補って使用する。
【0034】4. オペランドがない場合 iadd(スタック上の2つの整数値の和を計算し、スタッ
クにプッシュする)命令のようにバイトコードの中のオ
ペランドがない場合は、適当な値(実際のインプリメン
テーションでは0)を入れておく。
クにプッシュする)命令のようにバイトコードの中のオ
ペランドがない場合は、適当な値(実際のインプリメン
テーションでは0)を入れておく。
【0035】5. その他、命令に依存したオペランド この他の命令の場合、それぞれの命令のオペランドの意
味を表し、実行が速くなるような、16ビット以内に納
まる値を生成します。どうしても16ビットに収まらな
いものは、中間コードに2ワード以上使う。
味を表し、実行が速くなるような、16ビット以内に納
まる値を生成します。どうしても16ビットに収まらな
いものは、中間コードに2ワード以上使う。
【0036】図4におけるステップ1120のために、
バイトコードとオフセットの対応テーブルを設けておけ
ば、処理が高速化される。そして、未変換のバイトコー
ドが無くなるまでステップ1110及び1120を繰り
返す(ステップ1130)。
バイトコードとオフセットの対応テーブルを設けておけ
ば、処理が高速化される。そして、未変換のバイトコー
ドが無くなるまでステップ1110及び1120を繰り
返す(ステップ1130)。
【0037】ここでは処理ルーチンは、1サイクル(1
クロック)の間に2マシンコード以上実行できるCPU
にて実行される。各処理ルーチンは、バイトコード自身
の処理、次のバイトコードの処理ルーチンのアドレス計
算及びオペランド生成、次の次の中間コードのロード及
び処理ルーチンのアドレス計算、及び次のバイトコード
の処理ルーチンへのジャンプを行うためのマシンコード
を含む。以下、CPUがPowerPC 603eの場
合の例を示す(PowerPCはインターナショナル・
ビジネス・マシーンズ・コーポレーションの商標)。
クロック)の間に2マシンコード以上実行できるCPU
にて実行される。各処理ルーチンは、バイトコード自身
の処理、次のバイトコードの処理ルーチンのアドレス計
算及びオペランド生成、次の次の中間コードのロード及
び処理ルーチンのアドレス計算、及び次のバイトコード
の処理ルーチンへのジャンプを行うためのマシンコード
を含む。以下、CPUがPowerPC 603eの場
合の例を示す(PowerPCはインターナショナル・
ビジネス・マシーンズ・コーポレーションの商標)。
【0038】PowerPC 603eの場合、1サイ
クルに最大5命令を実行することができる。(但し、メ
モリからの読み出しは1サイクルに2命令。読み出しが
完了していれば5命令実行できる。)この能力を用い
て、中間コードを実行するための前処理によるオーバヘ
ッドを見えなくすることができる。図6乃至図8では、
一行が1サイクルで実行できる命令を示す。例えば、ロ
ーカル変数の値をオペランド・スタックにプッシュする
命令である"iload"というバイトコード用の処理ル
ーチンの場合、図6に示すように、iloadの本来の
処理(左側の列)を実施している間、次の中間コードの
ための処理(斜線)及び次の次の中間コードのための処
理(ハッチング)(真ん中の列及び右側の列)を実行す
る。なお、点線で囲まれた空白は、CPUパイプライン
のストール、又は中間コード本来の処理で命令間の依存
関係により実行できる命令がない場合を示す。
クルに最大5命令を実行することができる。(但し、メ
モリからの読み出しは1サイクルに2命令。読み出しが
完了していれば5命令実行できる。)この能力を用い
て、中間コードを実行するための前処理によるオーバヘ
ッドを見えなくすることができる。図6乃至図8では、
一行が1サイクルで実行できる命令を示す。例えば、ロ
ーカル変数の値をオペランド・スタックにプッシュする
命令である"iload"というバイトコード用の処理ル
ーチンの場合、図6に示すように、iloadの本来の
処理(左側の列)を実施している間、次の中間コードの
ための処理(斜線)及び次の次の中間コードのための処
理(ハッチング)(真ん中の列及び右側の列)を実行す
る。なお、点線で囲まれた空白は、CPUパイプライン
のストール、又は中間コード本来の処理で命令間の依存
関係により実行できる命令がない場合を示す。
【0039】lwzxは、ローカル変数から値をロード
するための命令であり、stwuは、オペランド・スタ
ックにプッシュする命令である。これらが、バイトコー
ドiload処理のために必要な命令である。一方、m
tctrは、次の処理ルーチンのアドレスをカウンタに
設定する命令であり、srawiは、オペランド×4の
計算のための命令であり、bctrは次の処理ルーチン
へのジャンプ命令である。これらが次の処理ルーチンに
ジャンプするために必要な命令群の一部である。さら
に、lwzuは次の次の中間コードのプリフェッチのた
めの命令であり、rlwimiは次の次の処理ルーチン
のアドレスを計算する命令である。これらが、次の次の
処理ルーチンにジャンプするために必要は命令群の一部
である。
するための命令であり、stwuは、オペランド・スタ
ックにプッシュする命令である。これらが、バイトコー
ドiload処理のために必要な命令である。一方、m
tctrは、次の処理ルーチンのアドレスをカウンタに
設定する命令であり、srawiは、オペランド×4の
計算のための命令であり、bctrは次の処理ルーチン
へのジャンプ命令である。これらが次の処理ルーチンに
ジャンプするために必要な命令群の一部である。さら
に、lwzuは次の次の中間コードのプリフェッチのた
めの命令であり、rlwimiは次の次の処理ルーチン
のアドレスを計算する命令である。これらが、次の次の
処理ルーチンにジャンプするために必要は命令群の一部
である。
【0040】図7に、オペランド・スタックから2つの
データをポップし、その和をオペランド・スタックへプ
ッシュする命令である"iadd"に必要な命令群を示
す。次の処理ルーチンにジャンプするために必要な命令
群の一部及び次の次の処理ルーチンにジャンプするため
の命令群の一部は、"iload"と同じであることが分
かる。また、"iadds"に必要な命令として、lwz
(データ1のロード)、lwz(データ2のロード)、
add(データ1+データ2の計算)、及びstwu
(オペランド・スタックへのプッシュ)がある。
データをポップし、その和をオペランド・スタックへプ
ッシュする命令である"iadd"に必要な命令群を示
す。次の処理ルーチンにジャンプするために必要な命令
群の一部及び次の次の処理ルーチンにジャンプするため
の命令群の一部は、"iload"と同じであることが分
かる。また、"iadds"に必要な命令として、lwz
(データ1のロード)、lwz(データ2のロード)、
add(データ1+データ2の計算)、及びstwu
(オペランド・スタックへのプッシュ)がある。
【0041】図8に、オペランドで与えられた定数値を
オペランド・スタックへプッシュする命令であるバイト
コード"iconst"に必要な命令群を示す。次の処理
ルーチンにジャンプするために必要な命令群の一部及び
次の次の処理オルーチンにジャンプするための命令群の
一部は、"iload"と同じであることが分かる。ま
た、定数値の計算(符号拡張あり)の命令srawi
と、オペランド・スタックへのプッシュ命令stwuが
含まれる。
オペランド・スタックへプッシュする命令であるバイト
コード"iconst"に必要な命令群を示す。次の処理
ルーチンにジャンプするために必要な命令群の一部及び
次の次の処理オルーチンにジャンプするための命令群の
一部は、"iload"と同じであることが分かる。ま
た、定数値の計算(符号拡張あり)の命令srawi
と、オペランド・スタックへのプッシュ命令stwuが
含まれる。
【0042】リザーブされているレジスタを以下のよう
な名前とした際の、"iload 4"、"iadd"、"iconst 4"に
対応する処理ルーチンの詳細を以下に示す。 pc : 中間コードのアドレス ea : 次の中間コードを処理するルーチンのアドレス op : 次の中間コードのオペランド×4 now: 次の次の中間コード bp : スタックフレームのオペランド×4 sp : オペランド・スタックの先頭 cp : コンスタント・プール(constant pool)のベース
・アドレス
な名前とした際の、"iload 4"、"iadd"、"iconst 4"に
対応する処理ルーチンの詳細を以下に示す。 pc : 中間コードのアドレス ea : 次の中間コードを処理するルーチンのアドレス op : 次の中間コードのオペランド×4 now: 次の次の中間コード bp : スタックフレームのオペランド×4 sp : オペランド・スタックの先頭 cp : コンスタント・プール(constant pool)のベース
・アドレス
【0043】"iload 4" # サイクル1 mtctr ea lwzx r3,bp,op # サイクル2 srawi op,now,14 lwzu now,4(pc) # サイクル3 stwu r3,-4(sp) # サイクル4 rlwimi ea,now,2,16,29 bctr # サイクル5 ストール
【0044】"iadd" # サイクル1 mtctr ea lwz r3,4(sp) # サイクル2 lwz r4,0(sp) sraw op,now,14 # サイクル3 lwzu now,4(pc) # サイクル4 add r3,r3,r4 # サイクル5 stwu r3,4(sp) rlwimi ea,now,2,16,29 bctr # サイクル6 ストール
【0045】"iconst 4" # サイクル1 mtctr ea srawi r3,op,2 # サイクル2 srawi op,now,14 lwzu now,4(pc) # サイクル3 stwu r3,-4(sp) # サイクル4 rlwimi ea,now,2,16,29 bctr # サイクル5 ストール
【0046】なお、各命令の詳細な意味を以下に記して
おく。 lwz メモリからレジスタに1ワード(4バイト)読み込む。 lwzu メモリからレジスタに1ワード読み込み、アドレスの指
定に使用したレジスタにデータのアドレスを格納する。 lwzx メモリからレジスタに1ワード読み込む。アドレスを2
つのレジスタの和で指定する。 lbz メモリからレジスタに1バイト読み込む。 stwu レジスタからメモリに1ワード書き込み、アドレスの指
定に使用したレジスタにデータのアドレスを格納する。 stwx レジスタからメモリに1ワード書き込む。アドレスを2
つのレジスタの和で指定する。 li レジスタに定数値をセットする。 add 2つのレジスタの値を加算する。 addi レジスタに定数値を加算する。 srawi レジスタの内容を符号拡張しながら右にシフトする。 slwi レジスタの内容を左にシフトする。 rlwimi レジスタAの内容をローテートし、結果のビット列の一
部でレジスタBの対応するビット列を置き換える。 mtctr カウンタ・レジスタ(間接ジャンプのアドレスを格納す
るレジスタ)に値をセットする。 bctr カウンタ・レジスタに格納されたアドレスへジャンプす
る。 blr リンク・レジスタ(link Register)(戻りアドレスを
保存するレジスタ)に保存されたアドレスへジャンプす
る。 bctrl リンク・レジスタに戻りアドレスを保存し、カウンタ・
レジスタに格納されたアドレスへジャンプする。
おく。 lwz メモリからレジスタに1ワード(4バイト)読み込む。 lwzu メモリからレジスタに1ワード読み込み、アドレスの指
定に使用したレジスタにデータのアドレスを格納する。 lwzx メモリからレジスタに1ワード読み込む。アドレスを2
つのレジスタの和で指定する。 lbz メモリからレジスタに1バイト読み込む。 stwu レジスタからメモリに1ワード書き込み、アドレスの指
定に使用したレジスタにデータのアドレスを格納する。 stwx レジスタからメモリに1ワード書き込む。アドレスを2
つのレジスタの和で指定する。 li レジスタに定数値をセットする。 add 2つのレジスタの値を加算する。 addi レジスタに定数値を加算する。 srawi レジスタの内容を符号拡張しながら右にシフトする。 slwi レジスタの内容を左にシフトする。 rlwimi レジスタAの内容をローテートし、結果のビット列の一
部でレジスタBの対応するビット列を置き換える。 mtctr カウンタ・レジスタ(間接ジャンプのアドレスを格納す
るレジスタ)に値をセットする。 bctr カウンタ・レジスタに格納されたアドレスへジャンプす
る。 blr リンク・レジスタ(link Register)(戻りアドレスを
保存するレジスタ)に保存されたアドレスへジャンプす
る。 bctrl リンク・レジスタに戻りアドレスを保存し、カウンタ・
レジスタに格納されたアドレスへジャンプする。
【0047】なお、次の処理ルーチンのアドレスを計算
するのに用いられるrlwimi命令を図9を用いて説
明しておく。"rlwimi B,A,8,12,23"であって、レジスタ
A及びBが図9のような場合、最初にレジスタAを左に
8ビットローテートする。次に、レジスタAのビット1
2からビット23までの12ビット(ここでは567)
を、レジスタBの同じ位置のビットを置き換える。そう
すると、レジスタBの内容がステップ2に示されるよう
な結果になる。なお、レジスタA及びBの最初の0x
は、16進数であることを示す。
するのに用いられるrlwimi命令を図9を用いて説
明しておく。"rlwimi B,A,8,12,23"であって、レジスタ
A及びBが図9のような場合、最初にレジスタAを左に
8ビットローテートする。次に、レジスタAのビット1
2からビット23までの12ビット(ここでは567)
を、レジスタBの同じ位置のビットを置き換える。そう
すると、レジスタBの内容がステップ2に示されるよう
な結果になる。なお、レジスタA及びBの最初の0x
は、16進数であることを示す。
【0048】以上のような構成を実施することにより、
レジスタ割り付けやコードスケジューリングなどの高度
な最適化をしない従来のコンパイラでコンパイルした場
合と同等以上の高速化がなされる。さらに、中間コード
はオペコードを処理ルーチン群の先頭アドレスにする等
の結果、バイトコードの2倍程度に抑えられる。なお、
バイトコードは中間コードへ変換される際に破棄される
ので、よりメモリ消費量が減少する。
レジスタ割り付けやコードスケジューリングなどの高度
な最適化をしない従来のコンパイラでコンパイルした場
合と同等以上の高速化がなされる。さらに、中間コード
はオペコードを処理ルーチン群の先頭アドレスにする等
の結果、バイトコードの2倍程度に抑えられる。なお、
バイトコードは中間コードへ変換される際に破棄される
ので、よりメモリ消費量が減少する。
【0049】次に本発明の第2の特徴について説明す
る。この第2の特徴それ自身は、CPUに何等の制限は
ない。すなわち、これまでに述べた部分では、CPUは
1サイクルに複数命令実行できるCPUという制限があ
ったが、本発明の第2の特徴それ自身は、CPUに依存
しない。但し、より高速な実行を必要とするならば、こ
れまで述べた部分について組み合わせることが可能であ
る。
る。この第2の特徴それ自身は、CPUに何等の制限は
ない。すなわち、これまでに述べた部分では、CPUは
1サイクルに複数命令実行できるCPUという制限があ
ったが、本発明の第2の特徴それ自身は、CPUに依存
しない。但し、より高速な実行を必要とするならば、こ
れまで述べた部分について組み合わせることが可能であ
る。
【0050】図10に第2の特徴の概要を示す。図10
の「元のバイトコード」列は、左側がオペコードで右側
がオペランドを表す。「ルールLLASを適用」「さら
にルールLASを適用」の各行は中間コードであって、
左側はオペコード、右側はオペランドを表す。なお、オ
ペコードはアドレスであるが、ここではバイトコードと
同じ又はルール名称をそのまま記している。
の「元のバイトコード」列は、左側がオペコードで右側
がオペランドを表す。「ルールLLASを適用」「さら
にルールLASを適用」の各行は中間コードであって、
左側はオペコード、右側はオペランドを表す。なお、オ
ペコードはアドレスであるが、ここではバイトコードと
同じ又はルール名称をそのまま記している。
【0051】"iload""iload""iadd""istore"というバイ
トコード列をまとめた1つのイディオムLLASという
ものが予め定義されているとする。図10の左側の例で
は、LLASの定義通り並んでいるので、このルールL
LASを適用して中間コードを生成すると、「ルールL
LASを適用」の列になる。ここで注意すべき点は、従
来技術でイディオムによるルールの適用があると、ルー
ルの定義に含まれるコードは全てルールそのものと置換
される。図10の例では、"iload""iload""iadd""istor
e"が"LLAS"となって、ルールの適用がない"iload"の中
間コードがそれに続くことになる。しかし、本発明で
は、イディオムに含まれるコードの先頭コードのみが"L
LAS"に変換され、残りの"iload""iadd""istore"はその
まま中間コードに変換される。このようにすると、プロ
グラム構造解析を実施せずに、イディオムによるルール
の適用が可能となる。すなわち、「元のバイトコード」
の中の2番目の"iload"に飛び込みがあった場合(矢
印)でも、中間コードに"iload""iadd""istore"が残っ
ているので、論理的に正しい処理が可能となる(LLA
Sの処理ルーチンにおいて、"iload"及び"istore"のオ
ペランドを読み出す処理及び最後の"iload"にジャンプ
するための処理が必要)。一方、従来技術ではこの部分
にイディオムによるルールの適用が不可能である。逆に
言うと、このような部分ではイディオムによるルールの
適用が不可能であるということをプログラム構造解析に
て確かめていた。
トコード列をまとめた1つのイディオムLLASという
ものが予め定義されているとする。図10の左側の例で
は、LLASの定義通り並んでいるので、このルールL
LASを適用して中間コードを生成すると、「ルールL
LASを適用」の列になる。ここで注意すべき点は、従
来技術でイディオムによるルールの適用があると、ルー
ルの定義に含まれるコードは全てルールそのものと置換
される。図10の例では、"iload""iload""iadd""istor
e"が"LLAS"となって、ルールの適用がない"iload"の中
間コードがそれに続くことになる。しかし、本発明で
は、イディオムに含まれるコードの先頭コードのみが"L
LAS"に変換され、残りの"iload""iadd""istore"はその
まま中間コードに変換される。このようにすると、プロ
グラム構造解析を実施せずに、イディオムによるルール
の適用が可能となる。すなわち、「元のバイトコード」
の中の2番目の"iload"に飛び込みがあった場合(矢
印)でも、中間コードに"iload""iadd""istore"が残っ
ているので、論理的に正しい処理が可能となる(LLA
Sの処理ルーチンにおいて、"iload"及び"istore"のオ
ペランドを読み出す処理及び最後の"iload"にジャンプ
するための処理が必要)。一方、従来技術ではこの部分
にイディオムによるルールの適用が不可能である。逆に
言うと、このような部分ではイディオムによるルールの
適用が不可能であるということをプログラム構造解析に
て確かめていた。
【0052】本発明では、さらに"iload""iadd""istor
e"というバイトコード列をまとめた1つのイディオムL
ASというものが定義されていると、図10右側の「さ
らにルールLASを適用」の列のようになる。この場合
でも、LASを構成するバイトコード列"iload""iadd""
istore"の先頭の"iload"のみが"LAS"という中間コード
に変換され、残りの"iadd""istore"はそのまま中間コー
ドに変換される。この場合にも、"LAS"の処理ルーチン
は、"istore"のオペランドを読み出し、最後の"iload"
にジャンプするための処理が必要である。図10の例で
は、LLASとLASというルールが定義されており且
つ適用可能な場合を示しているが、例えば、LLASと
AS("iadd""isore")、LLASとSL("istore""il
oad")といったルールが定義されていても、適用可能で
ある。
e"というバイトコード列をまとめた1つのイディオムL
ASというものが定義されていると、図10右側の「さ
らにルールLASを適用」の列のようになる。この場合
でも、LASを構成するバイトコード列"iload""iadd""
istore"の先頭の"iload"のみが"LAS"という中間コード
に変換され、残りの"iadd""istore"はそのまま中間コー
ドに変換される。この場合にも、"LAS"の処理ルーチン
は、"istore"のオペランドを読み出し、最後の"iload"
にジャンプするための処理が必要である。図10の例で
は、LLASとLASというルールが定義されており且
つ適用可能な場合を示しているが、例えば、LLASと
AS("iadd""isore")、LLASとSL("istore""il
oad")といったルールが定義されていても、適用可能で
ある。
【0053】これらのイディオムによるルールの適用
は、バイトコードを中間コードに変換する処理(図3の
ステップ1030)にて実施される。図11に処理フロ
ーを示す。まず、読み込んだバイトコードがルールにマ
ッチするか検査する(ステップ1210)。この処理
は、状態遷移を用いて実行する場合が多いが、後に簡単
に説明する。そして、読み込んだバイトコード列がルー
ルにマッチするか否か判断する(ステップ1220)。
もし、読み込んだバイトコード列がルールにマッチする
場合、マッチしたルールの処理ルーチンのアドレスから
中間コードを生成して出力する(ステップ1230)。
これは、アドレスとルールの対応表を用いればよい。な
お、読み込んだバイトコード列の最初のバイトコードの
みについて中間コードを生成し、それ以外のバイトコー
ドは残しておく。読み込んだバイトコード列がルールに
マッチしない場合、読み込んだが中間コードを生成して
いない最初のバイトコードについて、その処理ルーチン
のアドレスから中間コードを生成して出力する(ステッ
プ1240)。ルールにマッチしていない場合には、と
りあえず、読み込んだバイトコードのうち最初のバイト
コードを中間コードに変換し、その次のバイトコードを
先頭とするルールがないか探索するためである。
は、バイトコードを中間コードに変換する処理(図3の
ステップ1030)にて実施される。図11に処理フロ
ーを示す。まず、読み込んだバイトコードがルールにマ
ッチするか検査する(ステップ1210)。この処理
は、状態遷移を用いて実行する場合が多いが、後に簡単
に説明する。そして、読み込んだバイトコード列がルー
ルにマッチするか否か判断する(ステップ1220)。
もし、読み込んだバイトコード列がルールにマッチする
場合、マッチしたルールの処理ルーチンのアドレスから
中間コードを生成して出力する(ステップ1230)。
これは、アドレスとルールの対応表を用いればよい。な
お、読み込んだバイトコード列の最初のバイトコードの
みについて中間コードを生成し、それ以外のバイトコー
ドは残しておく。読み込んだバイトコード列がルールに
マッチしない場合、読み込んだが中間コードを生成して
いない最初のバイトコードについて、その処理ルーチン
のアドレスから中間コードを生成して出力する(ステッ
プ1240)。ルールにマッチしていない場合には、と
りあえず、読み込んだバイトコードのうち最初のバイト
コードを中間コードに変換し、その次のバイトコードを
先頭とするルールがないか探索するためである。
【0054】そして、読み込んだバイトコードで中間コ
ードを生成していないものがあるかどうか判断する(ス
テップ1250)。もし、生成していないものがある場
合及びステップ1220でルールにマッチするものがあ
る場合でステップ1230の後に、読み込んだが中間コ
ードを生成していないバイトコード列が、いずれかのル
ールの全体又は先頭部分にマッチするか判断する(ステ
ップ1260)。もし、どのルールにもマッチしないと
分かった場合には、ステップ1240に戻る。もし、ル
ールに合致する場合及びその可能性がある場合には、次
のルールの探索の準備を行う(ステップ1290)。一
方、読み込んだ全てのバイトコードに対して中間コード
を生成した場合、ルール探索部分をリセットする(ステ
ップ1270)。そして、以上の処理を未変換のバイト
コードが無くなるまで繰り返す(ステップ1280)。
なお、ステップ1220以降の各ステップは、1バイト
コードずつ行われる。
ードを生成していないものがあるかどうか判断する(ス
テップ1250)。もし、生成していないものがある場
合及びステップ1220でルールにマッチするものがあ
る場合でステップ1230の後に、読み込んだが中間コ
ードを生成していないバイトコード列が、いずれかのル
ールの全体又は先頭部分にマッチするか判断する(ステ
ップ1260)。もし、どのルールにもマッチしないと
分かった場合には、ステップ1240に戻る。もし、ル
ールに合致する場合及びその可能性がある場合には、次
のルールの探索の準備を行う(ステップ1290)。一
方、読み込んだ全てのバイトコードに対して中間コード
を生成した場合、ルール探索部分をリセットする(ステ
ップ1270)。そして、以上の処理を未変換のバイト
コードが無くなるまで繰り返す(ステップ1280)。
なお、ステップ1220以降の各ステップは、1バイト
コードずつ行われる。
【0055】次に、図11におけるステップ1210の
一例を図12で説明する。まず、未変換のバイトコード
があるか否か検査する(ステップ1410)。もし、ま
だ未変換のバイトコードがある場合には、バイトコード
を1つ先読みする(ステップ1420)。先読みしたバ
イトコードにより、遷移する状態を取得する(ステップ
1430)。そして、取得した状態が、どのルールにも
マッチしない場合の状態か否か判断する(ステップ14
40)。もし、そうであるならば、ルールにマッチしな
いということで終了する(ステップ1520)。一方、
ルールにマッチする可能性がある場合には、取得した状
態に遷移し(ステップ1450)、次に読み込むバイト
コードを指すポインタを1つ進める(ステップ146
0)。そして、ルールにマッチした場合の状態か否か判
断する(ステップ1470)。もし、そうでない場合に
は、ステップ1410に戻る。ルールにマッチした場合
の状態であるならば、ルールにマッチしたということで
終了する(ステップ1510)。
一例を図12で説明する。まず、未変換のバイトコード
があるか否か検査する(ステップ1410)。もし、ま
だ未変換のバイトコードがある場合には、バイトコード
を1つ先読みする(ステップ1420)。先読みしたバ
イトコードにより、遷移する状態を取得する(ステップ
1430)。そして、取得した状態が、どのルールにも
マッチしない場合の状態か否か判断する(ステップ14
40)。もし、そうであるならば、ルールにマッチしな
いということで終了する(ステップ1520)。一方、
ルールにマッチする可能性がある場合には、取得した状
態に遷移し(ステップ1450)、次に読み込むバイト
コードを指すポインタを1つ進める(ステップ146
0)。そして、ルールにマッチした場合の状態か否か判
断する(ステップ1470)。もし、そうでない場合に
は、ステップ1410に戻る。ルールにマッチした場合
の状態であるならば、ルールにマッチしたということで
終了する(ステップ1510)。
【0056】もし、ステップ1410で未変換のバイト
コードがないとされると、現在の状態で読み込むバイト
コードがなくなった場合に遷移し、その状態を取得する
(ステップ1480)。そして、取得した状態がルール
にマッチした場合の状態か判断する(ステップ149
0)。もし、ルールにマッチした状態であるならば、取
得した状態に遷移し、ルールにマッチしたということで
終了する(ステップ1510)。一方、ルールにマッチ
していないならば、ルールにマッチしないということで
終了する(ステップ1520)。なお、状態遷移を用い
てルールにマッチするか否か判断するアルゴリズムにつ
いては、状態遷移を用いて文字列を検索するアルゴリズ
ムと同じなので、例えば、"Introduction to Algorithm
s", The MIT Press, McGraw-Hill Book Company, 1991,
pp855-868を参照のこと。
コードがないとされると、現在の状態で読み込むバイト
コードがなくなった場合に遷移し、その状態を取得する
(ステップ1480)。そして、取得した状態がルール
にマッチした場合の状態か判断する(ステップ149
0)。もし、ルールにマッチした状態であるならば、取
得した状態に遷移し、ルールにマッチしたということで
終了する(ステップ1510)。一方、ルールにマッチ
していないならば、ルールにマッチしないということで
終了する(ステップ1520)。なお、状態遷移を用い
てルールにマッチするか否か判断するアルゴリズムにつ
いては、状態遷移を用いて文字列を検索するアルゴリズ
ムと同じなので、例えば、"Introduction to Algorithm
s", The MIT Press, McGraw-Hill Book Company, 1991,
pp855-868を参照のこと。
【0057】図13に図11のステップ1290の一例
を示しておく。最初に、読み込んだが中間コードを生成
していないバイトコード列が、あるルールの先頭から途
中までにマッチするか判断する(ステップ1560)。
言いかえると、読み込んだが中間コードを生成していな
いバイトコード列全体がルールにマッチしないかどうか
判断する。もし、全体がルールにマッチする場合(Noの
場合)、初期状態から、そのルールにマッチするバイト
コード列を末尾から二番目の命令まで読み込んだ場合の
状態に遷移する(ステップ1590)。すなわち、最後
に読み込んだバイトコードの一つ前に戻る。そして、次
に読み込むバイトコードを指すポインタを、そのルール
にマッチするバイトコード列の末尾に移動させる(ステ
ップ1600)。再度読み込んで、図12に示した処理
を行うためである。
を示しておく。最初に、読み込んだが中間コードを生成
していないバイトコード列が、あるルールの先頭から途
中までにマッチするか判断する(ステップ1560)。
言いかえると、読み込んだが中間コードを生成していな
いバイトコード列全体がルールにマッチしないかどうか
判断する。もし、全体がルールにマッチする場合(Noの
場合)、初期状態から、そのルールにマッチするバイト
コード列を末尾から二番目の命令まで読み込んだ場合の
状態に遷移する(ステップ1590)。すなわち、最後
に読み込んだバイトコードの一つ前に戻る。そして、次
に読み込むバイトコードを指すポインタを、そのルール
にマッチするバイトコード列の末尾に移動させる(ステ
ップ1600)。再度読み込んで、図12に示した処理
を行うためである。
【0058】一方、読み込んだが中間コードを生成して
いないバイトコード列がルールの先頭部分である場合、
初期状態から、マッチしたバイトコード列を読み込んだ
場合の状態に遷移する(ステップ1570)。そして、
次に読み込むバイトコードを指すポインタは移動させな
いままでおく(ステップ1580)。既に次に読み込む
バイトコードの準備はできているからである。
いないバイトコード列がルールの先頭部分である場合、
初期状態から、マッチしたバイトコード列を読み込んだ
場合の状態に遷移する(ステップ1570)。そして、
次に読み込むバイトコードを指すポインタは移動させな
いままでおく(ステップ1580)。既に次に読み込む
バイトコードの準備はできているからである。
【0059】図14に図11のステップ1270の一例
を示しておく。ルール検索部分をリセットするために
は、初期状態に遷移し(ステップ1660)、読み込ん
で中間コードに変換していないバイトコードがあるか判
断する(ステップ1670)。通常、この図11のステ
ップ1270にくる場合、読み込んで中間コードに変換
していないバイトコードはない。よって、ない場合には
そのまま終了する(ステップ1690)。ある場合に
は、読み込んだバイトコードを破棄する(ステップ16
80)。
を示しておく。ルール検索部分をリセットするために
は、初期状態に遷移し(ステップ1660)、読み込ん
で中間コードに変換していないバイトコードがあるか判
断する(ステップ1670)。通常、この図11のステ
ップ1270にくる場合、読み込んで中間コードに変換
していないバイトコードはない。よって、ない場合には
そのまま終了する(ステップ1690)。ある場合に
は、読み込んだバイトコードを破棄する(ステップ16
80)。
【0060】図15に比較のため従来技術の処理フロー
を示しておく。詳しく説明しないが、処理の最初にプロ
グラム構造解析(図16に処理フローを示す)を実施し
なければならない。そして、基本ブロックの切れ目を考
慮しつつルールにマッチするか否か判断される。そし
て、ルールにマッチするバイトコード列を読み込んだ時
にルールにマッチした処理ルーチンのアドレスから中間
コードを生成して出力する処理は同じであるが、ここで
は、ルールの定義に含まれるバイトコードの全てがルー
ルと置換され、且つその後ルール検索部分がリセットさ
れてしまう(図14と同じ)。よって、本発明と従来技
術の方法では、生成される中間コードの構造が異なって
くる。なお、図15中、ルール検索中に基本ブロックの
切れ目に到達した場合のルール検索処理については図1
7に示しておく。
を示しておく。詳しく説明しないが、処理の最初にプロ
グラム構造解析(図16に処理フローを示す)を実施し
なければならない。そして、基本ブロックの切れ目を考
慮しつつルールにマッチするか否か判断される。そし
て、ルールにマッチするバイトコード列を読み込んだ時
にルールにマッチした処理ルーチンのアドレスから中間
コードを生成して出力する処理は同じであるが、ここで
は、ルールの定義に含まれるバイトコードの全てがルー
ルと置換され、且つその後ルール検索部分がリセットさ
れてしまう(図14と同じ)。よって、本発明と従来技
術の方法では、生成される中間コードの構造が異なって
くる。なお、図15中、ルール検索中に基本ブロックの
切れ目に到達した場合のルール検索処理については図1
7に示しておく。
【0061】この本発明の第2の特徴を説明する最初の
部分で述べたが、この特徴を実施するためには、特にC
PUに制限はない。よって、1サイクルに1マシンコー
ドのみ実行するCPU用に処理ルーチンを用意すること
もできる。ここでは、より高速な処理を実現するため
に、上で述べたPowerPC 603e上で実行する
ための処理ルーチンの例を示しておく。
部分で述べたが、この特徴を実施するためには、特にC
PUに制限はない。よって、1サイクルに1マシンコー
ドのみ実行するCPU用に処理ルーチンを用意すること
もできる。ここでは、より高速な処理を実現するため
に、上で述べたPowerPC 603e上で実行する
ための処理ルーチンの例を示しておく。
【0062】図18に"iload""iload""iadd""istore"と
いうバイトコードをまとめたルール"ILLADDS"の処理ル
ーチンの例を示す。図18において、左側の列はルール
本来の処理であって、srawiはデータ2のオフセッ
トを計算するための命令である。そして、最初のlwz
はローカル変数からデータ1をロードするための命令
で、二番目のlwzはローカル変数からデータ2をロー
ドするための命令であり、三番目のlwzは"istore"の
オペランドをロードするための命令である。addはデ
ータ1+データ2の計算を行うための命令である。その
次のsrawiは結果をストアする先のオフセットを計
算するための命令であって、stwuは、結果をローカ
ル変数にストアするための命令である。
いうバイトコードをまとめたルール"ILLADDS"の処理ル
ーチンの例を示す。図18において、左側の列はルール
本来の処理であって、srawiはデータ2のオフセッ
トを計算するための命令である。そして、最初のlwz
はローカル変数からデータ1をロードするための命令
で、二番目のlwzはローカル変数からデータ2をロー
ドするための命令であり、三番目のlwzは"istore"の
オペランドをロードするための命令である。addはデ
ータ1+データ2の計算を行うための命令である。その
次のsrawiは結果をストアする先のオフセットを計
算するための命令であって、stwuは、結果をローカ
ル変数にストアするための命令である。
【0063】図18の真ん中及び右側の列は次の中間コ
ードにジャンプするための命令群の一部(斜線部分)及
び次の次の中間コードにジャンプするための命令群の一
部(ハッチング部分)である。ここで、次の中間コード
にジャンプするための命令群の一部が、図6乃至図8に
示したものとは異なっている。すなわち、次の中間コー
ドをフェッチするための命令lwzと、次の処理ルーチ
ンのアドレスを計算するための命令rlwimiが追加
されている。これは、"ILLADDS"の前の中間コードの処
理ルーチン中では、次の次の中間コードにジャンプする
ための命令群の一部、すなわち次の次の中間コードのプ
リフェッチ及びその処理ルーチンへのアドレス計算を行
っている。しかし、本願発明の第2の特徴では、"ILLAD
DS"の定義に含まれるバイトコードに対する中間コード
も生成される。よって、"ILLADDS"の前の中間コードか
ら見れば次の次の中間コードは、"ILLADDS"の定義に含
まれるバイトコード(ニ番目の)"iload"となる。これ
では、論理的におかしくなるので、"ILLADDS"の処理ル
ーチンで計算し直しているのである。残りの部分は同じ
である。
ードにジャンプするための命令群の一部(斜線部分)及
び次の次の中間コードにジャンプするための命令群の一
部(ハッチング部分)である。ここで、次の中間コード
にジャンプするための命令群の一部が、図6乃至図8に
示したものとは異なっている。すなわち、次の中間コー
ドをフェッチするための命令lwzと、次の処理ルーチ
ンのアドレスを計算するための命令rlwimiが追加
されている。これは、"ILLADDS"の前の中間コードの処
理ルーチン中では、次の次の中間コードにジャンプする
ための命令群の一部、すなわち次の次の中間コードのプ
リフェッチ及びその処理ルーチンへのアドレス計算を行
っている。しかし、本願発明の第2の特徴では、"ILLAD
DS"の定義に含まれるバイトコードに対する中間コード
も生成される。よって、"ILLADDS"の前の中間コードか
ら見れば次の次の中間コードは、"ILLADDS"の定義に含
まれるバイトコード(ニ番目の)"iload"となる。これ
では、論理的におかしくなるので、"ILLADDS"の処理ル
ーチンで計算し直しているのである。残りの部分は同じ
である。
【0064】"iload 4""iload 5""iadd""istore 6"をま
とめたルール"ILLADDS"の詳細を以下に示しておく。 # サイクル1 srawi r4,now,14 lwz now,12(pc) # サイクル2 lwz r3,bp,op # サイクル3 lwz r4,bp,r4 rlwimi ea,now,2,16,29 # サイクル4 mtctr ea lwz r5,8(pc) srawi op,now,14 # サイクル5 lwzu now,16(pc) add r3,r3,r4 # サイクル6 srawi r5,r5,14 # サイクル7 stwu r3,bp,r5 rlwimi ea,now,2,16,29 bctr # サイクル8 ストール
とめたルール"ILLADDS"の詳細を以下に示しておく。 # サイクル1 srawi r4,now,14 lwz now,12(pc) # サイクル2 lwz r3,bp,op # サイクル3 lwz r4,bp,r4 rlwimi ea,now,2,16,29 # サイクル4 mtctr ea lwz r5,8(pc) srawi op,now,14 # サイクル5 lwzu now,16(pc) add r3,r3,r4 # サイクル6 srawi r5,r5,14 # サイクル7 stwu r3,bp,r5 rlwimi ea,now,2,16,29 bctr # サイクル8 ストール
【0065】以上本発明をJITコンパイラの処理フロ
ーとして説明したが、以上述べた処理フローの各ステッ
プに対応する機能を有するモジュール/回路を作成し
て、それにより専用の装置を構成することも可能であ
る。
ーとして説明したが、以上述べた処理フローの各ステッ
プに対応する機能を有するモジュール/回路を作成し
て、それにより専用の装置を構成することも可能であ
る。
【0066】また、プログラムとしてJITコンパイラ
を実施する場合には、CD−ROMやMO、フロッピー
ディスクなどの記憶媒体に記憶されることも考えられ
る。また、バイトコードなどと同じようにネットワーク
を介してクライアント・コンピュータにロード又はスト
アされることも考えられる。
を実施する場合には、CD−ROMやMO、フロッピー
ディスクなどの記憶媒体に記憶されることも考えられ
る。また、バイトコードなどと同じようにネットワーク
を介してクライアント・コンピュータにロード又はスト
アされることも考えられる。
【0067】また、以上述べた実施例は一例であって、
特にPowerPC以外のCPU用に処理ルーチンは変
更可能である。さらに、本発明の第2の特徴にて説明し
た処理フローも、図10の真ん中の列及び右側の列のよ
うな中間コードを生成することが目的であって、図11
に示したような処理フローに限定されるものではない。
特に図12図13図14は、他のアルゴリズムに置換可
能である。
特にPowerPC以外のCPU用に処理ルーチンは変
更可能である。さらに、本発明の第2の特徴にて説明し
た処理フローも、図10の真ん中の列及び右側の列のよ
うな中間コードを生成することが目的であって、図11
に示したような処理フローに限定されるものではない。
特に図12図13図14は、他のアルゴリズムに置換可
能である。
【0068】
【効果】限られたリソースにおいて高速にJavaのバ
イトコードを実行可能とするコンパイラを提供すること
ができた。
イトコードを実行可能とするコンパイラを提供すること
ができた。
【0069】さらに、プログラム構造解析を実施せずに
ルールベースの最適化を実施可能とするコンパイラを提
供することもできた。
ルールベースの最適化を実施可能とするコンパイラを提
供することもできた。
【0070】プログラムの基本ブロックの切れ目に関係
なくルールを適用できるようにして、プログラムの実行
を最適化することもできた。
なくルールを適用できるようにして、プログラムの実行
を最適化することもできた。
【0071】さらに、CPUの能力を最大限に活用す
る、バイトコードに対応する処理ルーチンの命令構成を
提供することもできた。
る、バイトコードに対応する処理ルーチンの命令構成を
提供することもできた。
【0072】ここで、PowerPC上でインタプリタ
方式及びスレディッド・コード方式で実装した場合の処
理の例を示しておく。図19は、インタプリタ方式にお
ける処理を示している。(a)はデコード・ループを示
しており、(b)は"iload"の処理ルーチンを示してい
る。"iload"を実行するためには、(a)(b)を全て
実施しなければならず、全部で17サイクル必要である
ことが分かる。上で示した"ILLADDS"と同じ処理を実施
するためには、(a)(b)(a)(b)(a)(c)
(a)(d)の処理が必要である。(c)は"iadd"、
(d)は"istore"の処理ルーチンである。インタプリタ
では、ルールベースの最適化を行わないので、このよう
な多数のサイクルを必要とし、処理が遅い。
方式及びスレディッド・コード方式で実装した場合の処
理の例を示しておく。図19は、インタプリタ方式にお
ける処理を示している。(a)はデコード・ループを示
しており、(b)は"iload"の処理ルーチンを示してい
る。"iload"を実行するためには、(a)(b)を全て
実施しなければならず、全部で17サイクル必要である
ことが分かる。上で示した"ILLADDS"と同じ処理を実施
するためには、(a)(b)(a)(b)(a)(c)
(a)(d)の処理が必要である。(c)は"iadd"、
(d)は"istore"の処理ルーチンである。インタプリタ
では、ルールベースの最適化を行わないので、このよう
な多数のサイクルを必要とし、処理が遅い。
【0073】図20にスレディッド・コード方式の場合
を示す。この方式の場合、最初に中間コードの処理を実
施し、その後処理ルーチンの処理を実施する。図20
(a)は"iload"の処理を示しており、中間コードの処
理部分で、ローカル変数のインデックスをセットする処
理と、処理ルーチンのコールを行っている。(b)は"I
LLADDS"の処理を示しており、同じく、中間コードの処
理を実施し、その後処理ルーチンの処理を行う。図8及
び図18と比較すると、あまり必要サイクル数は変わら
ないが、スレディッド・コード方式でルールベースの最
適化を実施する場合には、最初にプログラム構造解析を
実施しなければならないので、その分本願発明の方が高
速である。さらに、スレディッド・コードでは中間コー
ドも命令であるから、命令キャッシュはこの中間コード
にも使われるが、本願発明では中間コードはデータであ
るから、命令キャッシュの使用効率の点からも高速に処
理できると考えられる。また、中間コードの大きさも、
スレディッド・コードより小さくなることが分かった。
を示す。この方式の場合、最初に中間コードの処理を実
施し、その後処理ルーチンの処理を実施する。図20
(a)は"iload"の処理を示しており、中間コードの処
理部分で、ローカル変数のインデックスをセットする処
理と、処理ルーチンのコールを行っている。(b)は"I
LLADDS"の処理を示しており、同じく、中間コードの処
理を実施し、その後処理ルーチンの処理を行う。図8及
び図18と比較すると、あまり必要サイクル数は変わら
ないが、スレディッド・コード方式でルールベースの最
適化を実施する場合には、最初にプログラム構造解析を
実施しなければならないので、その分本願発明の方が高
速である。さらに、スレディッド・コードでは中間コー
ドも命令であるから、命令キャッシュはこの中間コード
にも使われるが、本願発明では中間コードはデータであ
るから、命令キャッシュの使用効率の点からも高速に処
理できると考えられる。また、中間コードの大きさも、
スレディッド・コードより小さくなることが分かった。
【図1】システム全体のブロック図である。
【図2】JITコンパイラ56のブロック図である。
【図3】変換/実行モジュールの処理フローを表す図で
ある。
ある。
【図4】ルールベースの最適化を行わない場合の中間コ
ードへの変換の処理フローを表す図である。
ードへの変換の処理フローを表す図である。
【図5】中間コードのオペコードの説明である。
【図6】"iload"の処理ルーチンの例を示す図である。
【図7】"iadd"の処理ルーチンの例を示す図である。
【図8】"iconst"の処理ルーチンの例を示す図である。
【図9】rlwimi命令を説明するための図である。
【図10】本発明の第2の特徴を説明するための図であ
る。
る。
【図11】本発明のルールベースの最適化処理のフロー
を説明するための図である。
を説明するための図である。
【図12】読み込んだバイトコード列がルールにマッチ
するか否か検査するための処理フローの説明をするため
の図である。
するか否か検査するための処理フローの説明をするため
の図である。
【図13】次のルールの検索準備の処理フローを説明す
るための図である。
るための図である。
【図14】ルール検索部分をリセットするための処理フ
ローを説明するための図である。
ローを説明するための図である。
【図15】従来技術の中間コードへの変換の処理フロー
を説明するための図である。
を説明するための図である。
【図16】図15におけるプログラム構造解析処理のフ
ローを説明するための図である。
ローを説明するための図である。
【図17】図15におけるルール検索中に基本ブロック
の切れ目に到達した場合のルール検索処理のフローを説
明するための図である。
の切れ目に到達した場合のルール検索処理のフローを説
明するための図である。
【図18】ルール"ILLADDS"の処理ルーチンの例を表す
図である。
図である。
【図19】インタプリタ方式の処理の例を示す図であ
る。
る。
【図20】スレディッド・コード方式の処理の例を示す
図である。
図である。
1 サーバコンピュータ 3 ネットワーク 5 クライアント・コンピュータ 10 Javaソースコード 12 Javaコンパイラ 14 バイトコード 52 JavaVM 53 OS 54 Javaインタプリタ 55 ハードウエア(メモリ/CPU含む) 56 Java JITコンパイラ 58 マシン・コード 100 変換/実行モジュール 102 中間コード 104 処理ルーチン群
─────────────────────────────────────────────────────
【手続補正書】
【提出日】平成10年7月22日
【手続補正1】
【補正対象書類名】明細書
【補正対象項目名】0005
【補正方法】変更
【補正内容】
【0005】一方、JITコンパイラ56は、バイトコ
ードを事前にあるいは実行する直前にコンパイラを用い
てマシン・コードに変換してそれを実行する。この方式
の利点は、コンパイラの技術を用いて、マシン・コード
の最適化を行うことにより、変換されたコードの実行速
度が速いことである。しかし、従来ある最適化コンパイ
ラでは、インタープリタより多くのメモリやCPUパワ
ーを必要とするという欠点がある。
ードを事前にあるいは実行する直前にコンパイラを用い
てマシン・コードに変換してそれを実行する。この方式
の利点は、コンパイラの技術を用いて、マシン・コード
の最適化を行うことにより、変換されたコードの実行速
度が速いことである。しかし、従来ある最適化コンパイ
ラでは、インタープリタより多くのメモリやCPUパワ
ーを必要とするという欠点がある。
【手続補正2】
【補正対象書類名】明細書
【補正対象項目名】0035
【補正方法】変更
【補正内容】
【0035】5. その他、命令に依存したオペランド この他の命令の場合、それぞれの命令のオペランドの意
味を表し、実行が速くなるような、16ビット以内に納
まる値を生成する。どうしても16ビットに収まらない
ものは、中間コードに2ワード以上使う。
味を表し、実行が速くなるような、16ビット以内に納
まる値を生成する。どうしても16ビットに収まらない
ものは、中間コードに2ワード以上使う。
【手続補正3】
【補正対象書類名】明細書
【補正対象項目名】0040
【補正方法】変更
【補正内容】
【0040】図7に、オペランド・スタックから2つの
データをポップし、その和をオペランド・スタックへプ
ッシュする命令である"iadd"に必要な命令群を示
す。次の処理ルーチンにジャンプするために必要な命令
群の一部及び次の次の処理ルーチンにジャンプするため
の命令群の一部は、"iload"と同じであることが分
かる。また、"iadd"に必要な命令として、lwz
(データ1のロード)、lwz(データ2のロード)、
add(データ1+データ2の計算)、及びstwu
(オペランド・スタックへのプッシュ)がある。
データをポップし、その和をオペランド・スタックへプ
ッシュする命令である"iadd"に必要な命令群を示
す。次の処理ルーチンにジャンプするために必要な命令
群の一部及び次の次の処理ルーチンにジャンプするため
の命令群の一部は、"iload"と同じであることが分
かる。また、"iadd"に必要な命令として、lwz
(データ1のロード)、lwz(データ2のロード)、
add(データ1+データ2の計算)、及びstwu
(オペランド・スタックへのプッシュ)がある。
【手続補正4】
【補正対象書類名】明細書
【補正対象項目名】0042
【補正方法】変更
【補正内容】
【0042】リザーブされているレジスタを以下のよう
な名前とした際の、"iload 4"、"iadd"、"iconst 4"に
対応する処理ルーチンの詳細を以下に示す。 pc : 中間コードのアドレス ea : 次の中間コードを処理するルーチンのアドレス op : 次の中間コードのオペランド×4 now: 次の次の中間コード bp : スタックフレームの先頭 sp : オペランド・スタックの先頭 cp : コンスタント・プール(constant pool)のベース
・アドレス
な名前とした際の、"iload 4"、"iadd"、"iconst 4"に
対応する処理ルーチンの詳細を以下に示す。 pc : 中間コードのアドレス ea : 次の中間コードを処理するルーチンのアドレス op : 次の中間コードのオペランド×4 now: 次の次の中間コード bp : スタックフレームの先頭 sp : オペランド・スタックの先頭 cp : コンスタント・プール(constant pool)のベース
・アドレス
───────────────────────────────────────────────────── フロントページの続き (72)発明者 小松 秀昭 神奈川県大和市下鶴間1623番地14 日本ア イ・ビー・エム株式会社 東京基礎研究所 内 (72)発明者 百瀬 浩之 神奈川県大和市下鶴間1623番地14 日本ア イ・ビー・エム株式会社 東京基礎研究所 内
Claims (21)
- 【請求項1】第1種類のデータ列から第2種類のデータ
列を生成する方法であって、 第1種類のデータを読み出すステップと、 読み出された第1種類のデータ列が、複数の第1種類の
データを1つにまとめた、所定のイディオム・データに
該当するか判断するステップと、 前記読み出された第1種類のデータ列が前記イディオム
・データに該当する場合には、前記読み出された第1種
類のデータ列の先頭データを、前記イディオム・データ
に対応する第2種類のデータに変換するステップと、 を含むデータ列生成方法。 - 【請求項2】前記読み出された第1種類のデータ列のう
ち先頭データ以外の各データを、それぞれ対応する第2
種類のデータに変換するステップとをさらに含む請求項
1記載のデータ列生成方法。 - 【請求項3】前記読み出された第1種類のデータ列のう
ち先頭データ以外のデータ列が、前記所定のイディオム
・データを構成するデータ列に該当する可能性があるか
判断する第2判断ステップと、 可能性がないと判断された場合、前記先頭データの次の
データを、対応する第2種類のデータに変換するステッ
プと、 をさらに含む請求項1記載のデータ列生成方法。 - 【請求項4】前記第2判断ステップを、前記読み出され
た第1種類のデータ列のうち前記第2種類のデータに変
換していないデータ列について実施するステップと、 をさらに含む請求項3記載のデータ列生成方法。 - 【請求項5】前記判断ステップの前に、前記第1種類の
データ列の構造を解析しないことを特徴とする請求項1
記載のデータ列生成方法。 - 【請求項6】可能性があると判断された場合、前記読み
出された第1種類のデータ列のうち前記第2種類のデー
タに変換されていないデータ列自身が前記所定のイディ
オム・データに該当するか判断するステップと、 前記読み出された第1種類のデータ列のうち前記第2種
類のデータに変換されていないデータ列自身が前記所定
のイディオム・データに該当する場合、前記第2種類の
データに変換されていないデータ列の先頭データを、当
該該当するイディオム・データに対応する第2種類のデ
ータに変換するステップと、 をさらに含む請求項3記載のデータ列生成方法。 - 【請求項7】前記第2種類のデータに変換するステップ
が、 前記第1種類のデータに対応する処理ルーチンのアドレ
スを計算するステップを含む請求項1又は2又は6のい
ずれか記載のデータ列生成方法。 - 【請求項8】バイト・コード列を中間コード列に変換す
る方法であって、 バイト・コードを読み出すステップと、 読み出されたバイト・コード列が、複数のバイト・コー
ドを1つにまとめた、所定のイディオム・コードに該当
するか判断するステップと、 前記読み出されたバイト・コード列が前記イディオム・
コードに該当する場合には、前記読み出されたバイト・
コード列の先頭コードを、前記イディオム・コードに対
応する中間コードに変換するステップと、 を含む変換方法。 - 【請求項9】前記読み出されたバイト・コード列の先頭
コード以外のバイト・コード列が、前記所定のイディオ
ム・コードを構成するバイト・コード列に該当する可能
性があるか判断するステップと、 可能性がないと判断された場合、前記先頭コードの次の
コードを、対応する中間コードに変換するステップと、 をさらに含む請求項8記載の変換方法。 - 【請求項10】一期間に2命令以上実行できるプロセッ
サによって実行される複数の処理ルーチンを格納した記
憶媒体であって、 各前記処理ルーチンが、 前記処理ルーチン本来の処理命令に加えて、当該処理ル
ーチンの次に実行される第2処理ルーチンへジャンプす
るための命令群の一部と、当該処理ルーチンの次の次に
実行される第3処理ルーチンへジャンプするための命令
群の一部とを含む記憶媒体。 - 【請求項11】各前記処理ルーチンは、処理の流れを規
定するコード列の各コードに対応するものであって、 前記第2処理ルーチンへジャンプするための命令群の一
部が、前記第2処理ルーチンのためのオペランド生成命
令及び前記第2処理ルーチンへのジャンプ命令を含み、 前記第3処理ルーチンへジャンプするための命令群の一
部が、前記コード列における、前記第3処理ルーチンに
対応するコードをフェッチする命令、及び前記第3処理
ルーチンのアドレスを計算する命令を含むことを特徴と
する請求項10記載の記憶媒体。 - 【請求項12】各前記処理ルーチンは、処理の流れを規
定するコード列の各コードに対応するものであって、 複数の処理ルーチンをまとめたイディオム処理ルーチン
が、 前記コード列における、前記第2処理ルーチンに対応す
るコードをフェッチする命令、前記第2処理ルーチンの
アドレスを計算する命令、前記第2処理ルーチンのため
のオペランド生成命令、及び前記第2処理ルーチンへの
ジャンプ命令と、 前記コード列における、前記第3処理ルーチンに対応す
るコードをフェッチする命令、及び前記第3処理ルーチ
ンのアドレスを計算する命令とを含むことを特徴とする
請求項10記載の記憶媒体。 - 【請求項13】第1種類のデータ列から第2種類のデー
タ列を生成する装置であって、 第1種類のデータを読み出すモジュールと、 読み出された第1種類のデータ列が、複数の第1種類の
データを1つにまとめた、所定のイディオム・データに
該当するか判断するモジュールと、 前記読み出された第1種類のデータ列が前記イディオム
・データに該当する場合には、前記読み出された第1種
類のデータ列の先頭データを、前記イディオム・データ
に対応する第2種類のデータに変換する変換モジュール
と、 を含むデータ列生成装置。 - 【請求項14】前記読み出された第1種類のデータ列の
先頭データ以外のデータ列が、前記所定のイディオム・
データを構成するデータ列に該当する可能性があるか判
断する第2判断モジュールとをさらに含み、 前記変換モジュールは、 可能性がないと判断された場合、前記先頭データの次の
データを、対応する第2種類のデータに変換する、 ことを特徴とする請求項13記載のデータ列生成装置。 - 【請求項15】前記変換モジュールが、 前記第1種類のデータに対応する処理ルーチンのアドレ
スを計算するモジュールを含む請求項13又は14のい
ずれか記載のデータ列生成装置。 - 【請求項16】前記処理ルーチンは、一期間に2命令以
上実行できるプロセッサによって実行され、 前記処理ルーチンを格納する記憶装置をさらに含み、 各前記処理ルーチンは、 前記処理ルーチン本来の処理命令に加えて、当該処理ル
ーチンの次に実行される第2処理ルーチンへジャンプす
るための命令群の一部と、当該処理ルーチンの次の次に
実行される第3処理ルーチンへジャンプするための命令
群の一部とを含むことを特徴とする請求項15記載のデ
ータ列生成装置。 - 【請求項17】バイト・コード列を中間コード列に変換
するコンピュータであって、プロセッサと、 メモリと、 前記プロセッサで実行されるプログラムであって、 バイト・コードを読み出すモジュールと、 読み出されたバイト・コード列が、複数のバイト・コー
ドを1つにまとめた、所定のイディオム・コードに該当
するか判断するモジュールと、 前記読み出されたバイト・コード列が前記イディオム・
コードに該当する場合には、前記読み出されたバイト・
コード列の先頭コードを、前記イディオム・コードに対
応する中間コードに変換するモジュールと、 を含むプログラムと、 を有するコンピュータ。 - 【請求項18】前記メモリは、各バイト・コードに対応
する処理ルーチンを格納しており、 前記変換モジュールは、バイト・コードに対応する処理
ルーチンのアドレスを計算する処理を実施することを特
徴とする請求項17記載のコンピュータ。 - 【請求項19】前記プロセッサは、一期間に複数の命令
を実行することができ、 前記イディオム・コードに対応する処理ルーチンが、 当該イディオム・コードの次に実行される第2処理ルー
チンに対応する中間コードをフェッチする命令、前記第
2処理ルーチンのアドレスを計算する命令、前記第2処
理ルーチンのためのオペランド生成命令、及び前記第2
処理ルーチンへのジャンプ命令と、 前記イディオム・コードの次の次に実行される第3処理
ルーチンに対応する中間コードをフェッチする命令、及
び前記第3処理ルーチンのアドレスを計算する命令とを
含む請求項18記載のコンピュータ - 【請求項20】第1種類のデータ列から第2種類のデー
タ列をコンピュータに生成させるプログラムを格納した
記憶媒体であって、前記プログラムは、前記コンピュー
タに、 第1種類のデータを読み出すステップと、 読み出された第1種類のデータ列が、複数の第1種類の
データを1つにまとめた、所定のイディオム・データに
該当するか判断するステップと、 前記読み出された第1種類のデータ列が前記イディオム
・データに該当する場合には、前記読み出された第1種
類のデータ列の先頭データを、前記イディオム・データ
に対応する第2種類のデータに変換するステップと、 を実行させる、記憶媒体。 - 【請求項21】コンピュータに、バイト・コード列を中
間コード列に変換させるプログラムを格納した記憶媒体
であって、前記プログラムは、 バイト・コードを読み出すステップと、 読み出されたバイト・コード列が、複数のバイト・コー
ドを1つにまとめた、所定のイディオム・コードに該当
するか判断するステップと、 前記読み出されたバイト・コード列が前記イディオム・
コードに該当する場合には、前記読み出されたバイト・
コード列の先頭コードを、前記イディオム・コードに対
応する中間コードに変換するステップと、 を含む、記憶媒体。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP30821297A JP3377419B2 (ja) | 1997-11-11 | 1997-11-11 | 命令列生成方法及び装置、変換方法、及びコンピュータ |
CN98123834A CN1101019C (zh) | 1997-11-11 | 1998-11-04 | 数据序列产生方法及设备、转换方法及计算机 |
US09/188,943 US6324686B1 (en) | 1997-11-11 | 1998-11-10 | Just in time compiler technique |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP30821297A JP3377419B2 (ja) | 1997-11-11 | 1997-11-11 | 命令列生成方法及び装置、変換方法、及びコンピュータ |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH11175349A true JPH11175349A (ja) | 1999-07-02 |
JP3377419B2 JP3377419B2 (ja) | 2003-02-17 |
Family
ID=17978278
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP30821297A Expired - Fee Related JP3377419B2 (ja) | 1997-11-11 | 1997-11-11 | 命令列生成方法及び装置、変換方法、及びコンピュータ |
Country Status (3)
Country | Link |
---|---|
US (1) | US6324686B1 (ja) |
JP (1) | JP3377419B2 (ja) |
CN (1) | CN1101019C (ja) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2006302272A (ja) * | 2005-04-21 | 2006-11-02 | Samsung Electronics Co Ltd | ジャバ仮想マシンの命令語実行方法及びその装置 |
JP2007310546A (ja) * | 2006-05-17 | 2007-11-29 | Nec Computertechno Ltd | エミュレーション方法及びコンピュータシステム |
JP2008545179A (ja) * | 2005-05-12 | 2008-12-11 | マイクロソフト コーポレーション | 複数の経路最適化を備える関数レベルジャストインタイム変換エンジン |
Families Citing this family (77)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6298477B1 (en) * | 1998-10-30 | 2001-10-02 | Sun Microsystems, Inc. | Method and apparatus for selecting ways to compile at runtime |
GB9825102D0 (en) * | 1998-11-16 | 1999-01-13 | Insignia Solutions Plc | Computer system |
US6637025B1 (en) * | 1998-12-03 | 2003-10-21 | International Business Machines Corporation | Dynamic selection/definition of which class/methods should or should not be jit'ed using information stored in a jar file |
WO2000034854A2 (en) * | 1998-12-08 | 2000-06-15 | Koninklijke Philips Electronics N.V. | Method of executing an interpreter program |
US6332215B1 (en) * | 1998-12-08 | 2001-12-18 | Nazomi Communications, Inc. | Java virtual machine hardware for RISC and CISC processors |
US6748588B1 (en) * | 1999-03-31 | 2004-06-08 | Microsoft Corporation | One-pass greedy-pattern-matching finite-state-machine code generation |
JP3356742B2 (ja) * | 1999-11-17 | 2002-12-16 | インターナショナル・ビジネス・マシーンズ・コーポレーション | プログラム実行方法 |
GB2365553B (en) * | 2000-05-13 | 2004-07-14 | Ibm | Trace information in a virtual machine |
US6839712B1 (en) * | 2000-10-26 | 2005-01-04 | International Business Machines Corporation | Pre-processing code to identify and modify format of keys |
US7080120B2 (en) * | 2001-01-19 | 2006-07-18 | Digital Orchid, Inc. | System and method for collaborative processing of distributed applications |
JP3786644B2 (ja) * | 2001-04-23 | 2006-06-14 | アトメル・コーポレイション | バイトコンパイルされたJava(R)コードを実行するためのマイクロプロセッサ |
CA2346762A1 (en) * | 2001-05-07 | 2002-11-07 | Ibm Canada Limited-Ibm Canada Limitee | Compiler generation of instruction sequences for unresolved storage devices |
ATE381059T1 (de) * | 2001-10-31 | 2007-12-15 | Aplix Corp | System zum ausführen von zwischenkode, methode zum ausführen von zwischenkode, und computerprogrammprodukt zum ausführen von zwischenkode |
US7178129B2 (en) * | 2001-12-07 | 2007-02-13 | Dbase, Inc. | Drag-and drop dynamic distributed object model |
DE10339458A1 (de) * | 2002-08-28 | 2004-03-25 | Denso Corp., Kariya | Gasmessfühler und Verfahren zu dessen Herstellung |
JP3831396B2 (ja) * | 2002-08-30 | 2006-10-11 | 株式会社ルネサステクノロジ | データ処理装置及びicカード |
GB2393270B (en) * | 2002-09-19 | 2005-07-27 | Advanced Risc Mach Ltd | Executing variable length instructions stored within a plurality of discrete memory address regions |
US7281248B2 (en) * | 2002-11-19 | 2007-10-09 | Microsoft Corporation | Virtualized and realized user interface controls |
US7219329B2 (en) * | 2003-06-13 | 2007-05-15 | Microsoft Corporation | Systems and methods providing lightweight runtime code generation |
US10437964B2 (en) * | 2003-10-24 | 2019-10-08 | Microsoft Technology Licensing, Llc | Programming interface for licensing |
US20050165837A1 (en) * | 2004-01-22 | 2005-07-28 | International Business Machines Corporation | System and method for embedded java memory footprint performance improvement |
US20050183077A1 (en) * | 2004-02-12 | 2005-08-18 | International Business Machines Corporation | System and method for JIT memory footprint improvement for embedded java devices |
US8510657B2 (en) | 2004-09-30 | 2013-08-13 | Microsoft Corporation | Editing the text of an arbitrary graphic via a hierarchical list |
US7348982B2 (en) | 2004-09-30 | 2008-03-25 | Microsoft Corporation | Method, system, and computer-readable medium for creating and laying out a graphic within an application program |
US8134575B2 (en) | 2004-09-30 | 2012-03-13 | Microsoft Corporation | Maintaining graphical presentations based on user customizations |
US7493604B2 (en) * | 2004-10-21 | 2009-02-17 | Microsoft Corporation | Conditional compilation of intermediate language code based on current environment |
US7533373B2 (en) * | 2005-01-25 | 2009-05-12 | Taiwan Semiconductor Manufacturing Co., Ltd | Method for prevention of system execution malfunction |
US7698697B2 (en) * | 2005-03-03 | 2010-04-13 | International Business Machines Corporation | Transforming code to expose glacial constants to a compiler |
US7707547B2 (en) * | 2005-03-11 | 2010-04-27 | Aptana, Inc. | System and method for creating target byte code |
US7743325B2 (en) * | 2005-03-15 | 2010-06-22 | Microsoft Corporation | Method and computer-readable medium for fitting text to shapes within a graphic |
US7750924B2 (en) * | 2005-03-15 | 2010-07-06 | Microsoft Corporation | Method and computer-readable medium for generating graphics having a finite number of dynamically sized and positioned shapes |
US7478224B2 (en) * | 2005-04-15 | 2009-01-13 | Atmel Corporation | Microprocessor access of operand stack as a register file using native instructions |
US20060288338A1 (en) * | 2005-06-15 | 2006-12-21 | Jinzhan Peng | Offset threaded code |
US7747944B2 (en) * | 2005-06-30 | 2010-06-29 | Microsoft Corporation | Semantically applying style transformation to objects in a graphic |
US8438486B2 (en) * | 2006-02-09 | 2013-05-07 | Microsoft Corporation | Automatically converting text to business graphics |
US7840950B2 (en) * | 2006-03-09 | 2010-11-23 | International Business Machines Corporation | Programmatic compiler optimization of glacial constants |
US8914774B1 (en) | 2007-11-15 | 2014-12-16 | Appcelerator, Inc. | System and method for tagging code to determine where the code runs |
US8954989B1 (en) | 2007-11-19 | 2015-02-10 | Appcelerator, Inc. | Flexible, event-driven JavaScript server architecture |
US8260845B1 (en) | 2007-11-21 | 2012-09-04 | Appcelerator, Inc. | System and method for auto-generating JavaScript proxies and meta-proxies |
US8566807B1 (en) | 2007-11-23 | 2013-10-22 | Appcelerator, Inc. | System and method for accessibility of document object model and JavaScript by other platforms |
US8719451B1 (en) | 2007-11-23 | 2014-05-06 | Appcelerator, Inc. | System and method for on-the-fly, post-processing document object model manipulation |
US8806431B1 (en) | 2007-12-03 | 2014-08-12 | Appecelerator, Inc. | Aspect oriented programming |
US8819539B1 (en) | 2007-12-03 | 2014-08-26 | Appcelerator, Inc. | On-the-fly rewriting of uniform resource locators in a web-page |
US8756579B1 (en) | 2007-12-03 | 2014-06-17 | Appcelerator, Inc. | Client-side and server-side unified validation |
US8527860B1 (en) | 2007-12-04 | 2013-09-03 | Appcelerator, Inc. | System and method for exposing the dynamic web server-side |
US8938491B1 (en) | 2007-12-04 | 2015-01-20 | Appcelerator, Inc. | System and method for secure binding of client calls and server functions |
US8639743B1 (en) | 2007-12-05 | 2014-01-28 | Appcelerator, Inc. | System and method for on-the-fly rewriting of JavaScript |
US8285813B1 (en) | 2007-12-05 | 2012-10-09 | Appcelerator, Inc. | System and method for emulating different user agents on a server |
US8335982B1 (en) | 2007-12-05 | 2012-12-18 | Appcelerator, Inc. | System and method for binding a document object model through JavaScript callbacks |
US8015379B2 (en) | 2008-02-01 | 2011-09-06 | International Business Machines Corporation | Wake-and-go mechanism with exclusive system bus response |
US8725992B2 (en) | 2008-02-01 | 2014-05-13 | International Business Machines Corporation | Programming language exposing idiom calls to a programming idiom accelerator |
US8788795B2 (en) | 2008-02-01 | 2014-07-22 | International Business Machines Corporation | Programming idiom accelerator to examine pre-fetched instruction streams for multiple processors |
US8880853B2 (en) | 2008-02-01 | 2014-11-04 | International Business Machines Corporation | CAM-based wake-and-go snooping engine for waking a thread put to sleep for spinning on a target address lock |
US8516484B2 (en) | 2008-02-01 | 2013-08-20 | International Business Machines Corporation | Wake-and-go mechanism for a data processing system |
US8612977B2 (en) | 2008-02-01 | 2013-12-17 | International Business Machines Corporation | Wake-and-go mechanism with software save of thread state |
US8316218B2 (en) | 2008-02-01 | 2012-11-20 | International Business Machines Corporation | Look-ahead wake-and-go engine with speculative execution |
US8225120B2 (en) | 2008-02-01 | 2012-07-17 | International Business Machines Corporation | Wake-and-go mechanism with data exclusivity |
US8341635B2 (en) | 2008-02-01 | 2012-12-25 | International Business Machines Corporation | Hardware wake-and-go mechanism with look-ahead polling |
US8386822B2 (en) | 2008-02-01 | 2013-02-26 | International Business Machines Corporation | Wake-and-go mechanism with data monitoring |
US8145849B2 (en) | 2008-02-01 | 2012-03-27 | International Business Machines Corporation | Wake-and-go mechanism with system bus response |
US8452947B2 (en) | 2008-02-01 | 2013-05-28 | International Business Machines Corporation | Hardware wake-and-go mechanism and content addressable memory with instruction pre-fetch look-ahead to detect programming idioms |
US8312458B2 (en) | 2008-02-01 | 2012-11-13 | International Business Machines Corporation | Central repository for wake-and-go mechanism |
US8171476B2 (en) | 2008-02-01 | 2012-05-01 | International Business Machines Corporation | Wake-and-go mechanism with prioritization of threads |
US8640141B2 (en) | 2008-02-01 | 2014-01-28 | International Business Machines Corporation | Wake-and-go mechanism with hardware private array |
US8127080B2 (en) | 2008-02-01 | 2012-02-28 | International Business Machines Corporation | Wake-and-go mechanism with system address bus transaction master |
US8250396B2 (en) | 2008-02-01 | 2012-08-21 | International Business Machines Corporation | Hardware wake-and-go mechanism for a data processing system |
US8732683B2 (en) | 2008-02-01 | 2014-05-20 | International Business Machines Corporation | Compiler providing idiom to idiom accelerator |
US8291079B1 (en) | 2008-06-04 | 2012-10-16 | Appcelerator, Inc. | System and method for developing, deploying, managing and monitoring a web application in a single environment |
US8880678B1 (en) | 2008-06-05 | 2014-11-04 | Appcelerator, Inc. | System and method for managing and monitoring a web application using multiple cloud providers |
US7596620B1 (en) | 2008-11-04 | 2009-09-29 | Aptana, Inc. | System and method for developing, deploying, managing and monitoring a web application in a single environment |
US8082315B2 (en) | 2009-04-16 | 2011-12-20 | International Business Machines Corporation | Programming idiom accelerator for remote update |
US8886919B2 (en) | 2009-04-16 | 2014-11-11 | International Business Machines Corporation | Remote update programming idiom accelerator with allocated processor resources |
US8230201B2 (en) | 2009-04-16 | 2012-07-24 | International Business Machines Corporation | Migrating sleeping and waking threads between wake-and-go mechanisms in a multiple processor data processing system |
US8145723B2 (en) | 2009-04-16 | 2012-03-27 | International Business Machines Corporation | Complex remote update programming idiom accelerator |
US10698708B2 (en) * | 2009-08-04 | 2020-06-30 | International Business Machines Corporation | Optimizing just-in-time compilation in a network of nodes |
US8799325B2 (en) | 2010-03-12 | 2014-08-05 | Microsoft Corporation | Reordering nodes in a hierarchical structure |
KR102663196B1 (ko) * | 2018-11-16 | 2024-05-07 | 삼성전자주식회사 | 사용자 단말장치, 서버, 사용자 단말장치의 제어방법 및 서버의 제어방법 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5487169A (en) * | 1993-11-18 | 1996-01-23 | Motorola, Inc. | Method for translating a test plan source file containing multiple programming languages |
US5590331A (en) * | 1994-12-23 | 1996-12-31 | Sun Microsystems, Inc. | Method and apparatus for generating platform-standard object files containing machine-independent code |
JPH09265736A (ja) * | 1996-03-25 | 1997-10-07 | Toshiba Corp | 情報処理装置 |
US6078744A (en) * | 1997-08-01 | 2000-06-20 | Sun Microsystems | Method and apparatus for improving compiler performance during subsequent compilations of a source program |
US6081665A (en) * | 1997-12-19 | 2000-06-27 | Newmonics Inc. | Method for efficient soft real-time execution of portable byte code computer programs |
-
1997
- 1997-11-11 JP JP30821297A patent/JP3377419B2/ja not_active Expired - Fee Related
-
1998
- 1998-11-04 CN CN98123834A patent/CN1101019C/zh not_active Expired - Lifetime
- 1998-11-10 US US09/188,943 patent/US6324686B1/en not_active Expired - Lifetime
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2006302272A (ja) * | 2005-04-21 | 2006-11-02 | Samsung Electronics Co Ltd | ジャバ仮想マシンの命令語実行方法及びその装置 |
US7725879B2 (en) | 2005-04-21 | 2010-05-25 | Samsung Electronics Co., Ltd. | Method and apparatus for executing instructions of java virtual machine and transforming bytecode |
JP2008545179A (ja) * | 2005-05-12 | 2008-12-11 | マイクロソフト コーポレーション | 複数の経路最適化を備える関数レベルジャストインタイム変換エンジン |
JP2007310546A (ja) * | 2006-05-17 | 2007-11-29 | Nec Computertechno Ltd | エミュレーション方法及びコンピュータシステム |
US8392893B2 (en) | 2006-05-17 | 2013-03-05 | Nec Computertechno, Ltd. | Emulation method and computer system |
Also Published As
Publication number | Publication date |
---|---|
US6324686B1 (en) | 2001-11-27 |
CN1101019C (zh) | 2003-02-05 |
JP3377419B2 (ja) | 2003-02-17 |
CN1218222A (zh) | 1999-06-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3377419B2 (ja) | 命令列生成方法及び装置、変換方法、及びコンピュータ | |
US6332215B1 (en) | Java virtual machine hardware for RISC and CISC processors | |
US7458069B2 (en) | System and method for fusing instructions | |
KR101642556B1 (ko) | 이진 번역을 수행하기 위한 방법 및 시스템 | |
JP5263702B2 (ja) | プログラム・コードを変換するためのコンピュータ・システム、方法、及びコンピュータ可読記録媒体 | |
US6654875B1 (en) | Dual microcode RAM address mode instruction execution using operation code RAM storing control words with alternate address indicator | |
JP2006185462A (ja) | 高データ密度のriscプロセッサ | |
JP2003515203A (ja) | Nベースタイプの演算式の最適化 | |
US8769508B2 (en) | Virtual machine hardware for RISC and CISC processors | |
US20030192035A1 (en) | Systems and methods for implementing efficient execution transfers between successive translations of stack-based program code in a virtual machine environment | |
JP2004519775A (ja) | スイッチ命令処理ロジックによるバイトコード命令処理装置 | |
JP2581236B2 (ja) | データ処理装置 | |
JP2847974B2 (ja) | データ処理装置 | |
US6687808B2 (en) | Data processor using indirect register addressing | |
JP2004086837A (ja) | データ処理装置 | |
JP4088418B2 (ja) | ソフトウェア・エミュレーションを改善するために異なるデータ・タイプの複数の結果を生成するコンピュータ命令 | |
JPH04260927A (ja) | データ処理装置 | |
US5774694A (en) | Method and apparatus for emulating status flag | |
Ung et al. | Dynamic binary translation using run-time feedbacks | |
KR20230129559A (ko) | 가변길이 명령어들을 사용하는 병렬 디코드 명령어 세트 컴퓨터 아키텍처 | |
JP3570287B2 (ja) | マイクロコンピュータ | |
US6049864A (en) | Method for scheduling a flag generating instruction and a subsequent instruction by executing the flag generating instruction in a microprocessor | |
Chandrasekharan et al. | Proact: Hardware architecture for cross-layer approximate computing | |
Streib et al. | Selected Machine Language Instructions | |
JP3147884B2 (ja) | 記憶装置及び情報処理装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
LAPS | Cancellation because of no payment of annual fees |