JP4748829B2 - コンパイルする方法をランタイムにおいて選択する方法及び装置 - Google Patents
コンパイルする方法をランタイムにおいて選択する方法及び装置 Download PDFInfo
- Publication number
- JP4748829B2 JP4748829B2 JP30965799A JP30965799A JP4748829B2 JP 4748829 B2 JP4748829 B2 JP 4748829B2 JP 30965799 A JP30965799 A JP 30965799A JP 30965799 A JP30965799 A JP 30965799A JP 4748829 B2 JP4748829 B2 JP 4748829B2
- Authority
- JP
- Japan
- Prior art keywords
- floating point
- underflow
- bytecode
- compiled
- point operation
- 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 - Lifetime
Links
- 238000000034 method Methods 0.000 title claims description 139
- 238000004590 computer program Methods 0.000 claims description 9
- 230000000977 initiatory effect Effects 0.000 claims 1
- 238000003860 storage Methods 0.000 description 28
- 230000008569 process Effects 0.000 description 16
- 238000012545 processing Methods 0.000 description 11
- 238000010586 diagram Methods 0.000 description 10
- 230000015654 memory Effects 0.000 description 10
- 230000002093 peripheral effect Effects 0.000 description 5
- 238000013500 data storage Methods 0.000 description 3
- 230000006870 function Effects 0.000 description 3
- 230000008859 change Effects 0.000 description 2
- 238000012937 correction Methods 0.000 description 2
- 238000001514 detection method Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012546 transfer Methods 0.000 description 2
- 238000013519 translation Methods 0.000 description 2
- 230000003044 adaptive effect Effects 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000002457 bidirectional effect Effects 0.000 description 1
- 230000015572 biosynthetic process Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000007796 conventional method Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000007429 general method Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 201000008103 leukocyte adhesion deficiency 3 Diseases 0.000 description 1
- 230000014759 maintenance of location Effects 0.000 description 1
- 238000011022 operating instruction Methods 0.000 description 1
- 238000004549 pulsed laser deposition Methods 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000001926 trapping method Methods 0.000 description 1
- 230000003936 working memory Effects 0.000 description 1
Images
Classifications
-
- 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
-
- 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
Description
【発明の属する技術分野】
一般的に、本発明はコンピュータ・ソフトウェア及びソフトウェア・ポータビリティの分野に関する。特に、本発明はプログラムをプラットフォーム固有の要件に基づいてコンパイルする方法に関する。
【0002】
【従来の技術】
ジャバ(Java(商標名))バーチャル・マシン(JVM)は、様々なコンピュータ・アーキテクチャ上でインプリメント可能であり、 異なるマイクロプロセッサからそれぞれ生じる異なる仕様及び規格に適応可能である。この種の規格の1つの例としては、いくつかのマイクロプロセッサが浮動小数点数を扱う際に利用する拡張精度浮動小数点フォーマットが挙げられる。この種のマイクロプロセッサの1つとしては、拡張精度(80ビット)浮動小数点演算を使用するインテル社のIA−32マイクロプロセッサ・アーキテクチャが挙げられる。一般的に、他のプロセッサは単(32ビット)精度浮動小数点演算または倍(64ビット)精度浮動小数点演算を使用する。
【0003】
拡張精度フォーマットで算出された数値を単精度フォーマットまたは倍精度フォーマットへ変換する際、問題が発生する。浮動小数点オペレーションが結果をIEEE754の指定するレンジ及び精度で形成すべきことは、ジャバ(商標名)言語によって指定されている。このIEEE754の内容は、この開示をもって本明細書中に開示したものとする。その一方、カリフォルニア州サンタクララに所在するインテル社が製造するインテルIA−32プロセッサは結果をより広いレンジ及びより高い精度で形成する。これによって、前記の問題が発生する。これらのより広い結果はIEEE754単精度フォーマット及び倍精度フォーマットへ正確に丸める必要がある。IA−32マイクロプロセッサの場合、この種の丸めを実施する少なくとも2つの方法があり、これらの方法はそれぞれ異なるコスト(コード・サイズ及び実行速度)を伴う。スタティック・コンパイラ(またはワンタイム・ダイナミック・コンパイラ)は、1つのインプリメンテーションを選択する必要があり、この選択は全ての状況下で最適な選択とはならない。前記の問題を図1に示す。
【0004】
図1は倍精度浮動小数点の一般的なフォーマットと、拡張精度浮動小数点のフォーマットとを示すブロック図である。フォーマット102は、インテルIA−32アーキテクチャの倍精度浮動小数点フォーマットとは対照的なインテルIA−32アーキテクチャの拡張精度浮動小数点数フォーマットを示す。符号ビット104は、この浮動小数点数が正及び負のいずれであるかを示す。浮動小数点数の指数の値を表すための指数値を示すビット106が、これに続いて配置されている。
【0005】
ビット108は仮数を保持するためのビットを含む。仮数部は浮動小数点数の整数部を表すビットを最高で64ビット保持できる。従って、80(1+15+64)ビットが、拡張精度浮動小数点フォーマット内に存在する。一般的に、浮動小数点オペレーションは浮動小数点ユニットによって処理される。仮数及び指数を操作することによって、このユニットは浮動小数点数を必要とする複雑なオペレーションを効率的に実施できる。当該技術分野でよく知られているように、浮動小数点数を整数及び指数で表すことにより、浮動小数点数の演算は遙かに容易になる。
【0006】
更に、図1はIEEE754に開示されている倍精度浮動小数点フォーマット112を示す。このフォーマットは拡張精度フォーマットとレイアウトの点で類似しているが、指数フィールド及び仮数フィールド内のビット数の点で異なる。前記のように、インテルIA−32プロセッサは結果を拡張精度フォーマットで形成する。前記の問題はジェームズ・ゴスリン、ビル・ジョイ及びガイ・スチールによる“ジャバ(商標名)言語詳説”(ISBN0−201−63451−1)に由来しており、この文献の内容はこの開示をもって本明細書に開示したものとする。この詳説では、結果をIEEE754単精度フォーマットまたは倍精度フォーマットで形成する必要がある。フォーマット112の説明へ戻り、符号ビット104は、倍精度フォーマットまたは単精度フォーマットと対照をなす拡張精度フォーマットにおける符号ビットと同じである。指数ビット114はビット106と同じ機能を有するが、拡張精度フォーマットにおける15ビットとは対照的に11ビットを保持する。仮数ビット116は拡張精度フォーマットにおける64ビットとは対照的に52ビットを保持する。従って、倍精度浮動小数点フォーマットは64ビットを保持可能である。仮数長の違いを、図1の破線領域118で示す(指数長における4ビットの違いは図中にこれと同様に示されていない)。
【0007】
拡張精度の結果が例えばIA−32プロセッサから与えられた際、単精度フォーマットまたは倍精度フォーマットの結果を必要とするジャバ言語では、問題が発生する。拡張指数が単精度または倍精度のレンジの外側に位置する場合、オーバフローまたはアンダフローが発生し得る。IA−32では、オーバフローはハードウェアによって処理されるが、本発明の方法で解決に努めることができる。指数を減らすべく、仮数が(右側へ)シフトするので、アンダフローは処理が更に困難である。しかしながら、このシフトによって仮数のビットが失われ、これによって、結果の精度が失われる。正しく、かつ、精度が更に低い仮数を演算するためには、幾つかの命令が必要であり、一般的に、オペレーションは必要な時に呼び出されるように、別個のサブルーチンに置かれる。前記の問題は結果を正しく丸めることではなく、むしろ、訂正が生ずべきことを検出することにある。
【0008】
図2(a)及び図2(b)は浮動小数点アンダフローを検出する2つの方法を示す。図2(a)に示す1つの方法では、問題を訂正するトラップ・ルーチン206を呼び出すために、プログラム・コード202内のトラップ・ハンドラ204を使用して、トラップを実施することによって、プログラム・コード202は、その問題を検出する。図2(b)に示す別の方法では、プログラム・コード208はコード210を含んでおり、そのコード210は、乗算オペレーション及び除算オペレーションなど、問題を潜在的に引き起こし得る方法で、浮動小数点が使用される度、その問題を検出する。
【0009】
トラップ・ハンドラ206を利用することによって、問題の解決に努めている間、全てのオペレーションは中止される。トラップを呼び出す際、トラップ・ルーチンの実行前に、トラップを引き起こした命令のロケーションを含むマシンの状態を格納する。しかし、トラップを呼び出さない場合、オペレーション毎のオーバーヘッドは存在しない。そして、トラップ・ハンドラをセットアップするための、ワンタイム・オーバーヘッドがスレッド毎に存在するのみである。そして、このセットアップされたトラップ・ハンドラは全ての浮動小数点オペレーションを監視する。その一方、プログラム・コード210は、浮動小数点アンダフローの問題を処理するために、コードをプログラムへ挿入する技術を示す。この方法では、正しく丸められた結果を形成するために、必要に応じて、問題をチェックし、サブルーチンを呼び出す目的で、インライン・コードがアンダフローの問題を引き起こし得る各オペレーションの後に続けられる。この方法は、発生しない各アンダフローに対する多くの不必要なプロセッサ・オペレーションを必要とする。しかし、その問題が検出された際、この問題は、全てのオペレーションを一時停止させることと、トラップを処理するために、プロセス・コンテキストまたはスレッド・コンテキストを保存することを要することなく、解決される。前記のように、浮動小数点アンダフローは、任意のプラットフォーム上における選択可能な解決策を有する問題の1つの例である。他の問題が発生し得る。この場合、ジャバ・バーチャル・マシンは特定の問題を解決するいくつかのインプリメンテーションを利用可能であり、各インプリメンテーションはいくらかのケースでより効率的である。
【0010】
【発明が解決しようとする課題】
従って、プラットフォーム固有のバリエーションに起因して生じる問題の解決に使用するために、インプリメンテーションをインテリジェントに、ダイナミックに選択することが望ましい。浮動小数点アンダフローの問題を単なる例として使用した場合、例えば、必要なインライン・コードの量を減少し、さらに問題を訂正するサブルーチンをディスパッチするための、トラップ・ハンドラの使用のオーバーヘッドを防止するとともに、浮動小数点アンダフローを検出し、訂正することが望ましい。ダイナミック・ランタイム・コンパイラが1つのインプリメンテーションを選択し、その効率を監視し、要求されれば、そのインプリメンテーションを変更できることが望ましい。
【0011】
【課題を解決するための手段およびその作用・効果】
バーチャル・マシンによって、プログラム実行中に、プログラムに関連するバイトコードをコンパイルする方法を決定する本発明に従う方法、装置及びコンピュター・プログラム製品を開示する。本発明の1つの態様では、複数の方法でランタイムにおいてコンパイルできるプログラム内の命令を取り出し、特定の方法(一般的には、デフォルトの方法)でコンパイルする。次いで、バーチャル・マシンは命令をコンパイルする別の方法がより望ましいことをランタイムにおいて決定し、バイトコード命令はこの別の方法でリコンパイルされる。
【0012】
1つの形態では、リコンパイルされるバイトコード命令を含む実行可能なコードは、リコンパイルされる他の命令と一緒にキューへ加えられる。バーチャル・マシンはプログラムの実行時に発生したプログラムの全ての変化する要件を調べる。この場合、これらの要件は、プログラムをコンパイルできる複数の方法のそれぞれのプロフィール・データに由来している。別の形態では、命令をコンパイルする第1の方法、即ち、デフォルトの方法とは異なる方法で、前記の特定のバイトコード命令をバーチャル・マシンによってリコンパイルする。
【0013】
本発明の別の態様では、単一のプログラムから、実行可能な命令の異なるセットを形成する方法を提供する。バイトコード命令の1つのセットを形成するために、プログラムを特定の方法(デフォルトの方法など)でランタイムにおいてコンパイルする。次いで、バーチャル・マシンはプログラムを別の方法でコンパイルすることが望ましいか否かをランタイムにおいて決定する。そして、バーチャル・マシンは、そのようにして、ネイティブ命令の別のセットを形成し、この別のセットは第1のセットと置換される。
【0014】
1つの形態では、プログラムをリコンパイルする方法を決定するために、バーチャル・マシンは、プログラムを実行できる複数の方法のそれぞれのダイナミックに形成されたプロフィール・データを調べる。プロフィール・データは、プログラムを特定の方法で実行した回数を格納するカウンタを含む。プログラムのダイナミックに変化する要件をより効率的に処理するために、バーチャル・マシンは、ネイティブ命令の特定のセットをネイティブ命令の別のセットと置換すべきか否かを決定する。
【0015】
本発明の別の態様では、プログラム内の浮動小数点命令を実行するシステムを開示する。システムは、特定の命令が浮動小数点アンダフローを形成し得るか否かを決定する。次いで、浮動小数点オペレーションがアンダフローを引き起こした回数を決定するために、システムはインジケータをチェックする。インジケータが所定値未満である場合、バーチャル・マシンは浮動小数点オペレーションを1つの方法でランタイムにおいてコンパイルする。インジケータが所定値を越えている場合、バーチャル・マシンは浮動小数点オペレーションを別の方法でランタイムにおいてコンパイルする。
【0016】
本発明の更に別の態様では、トラップ・ルーチンまたは明示的チェックを使用して浮動小数点アンダフローを検出するための命令を形成する方法を開示する。プログラム内のオペレーションが浮動小数点アンダフローを形成し得るか否かを決定する。次いで、特定の浮動小数点オペレーションがアンダフローを引き起こした回数を決定するために、カウンタをチェックする。カウンタが所定値未満である場合、オペレーションをトラップ・ルーチンを用いてランタイムにおいてコンパイルする。カウンタが所定値を越えている場合、オペレーションを明示的インライン・チェックを用いてリコンパイルする。トラップ・ルーチンに関連するデータ及び明示的インライン・チェックに関連するデータを、ランタイムにおいてダイナミックに形成し、格納する。
【0017】
本発明は添付図面に基づく以下の説明によって更によく理解できる。
【0018】
【発明の実施の形態】
本発明の特定の実施例を詳述する。この実施例は添付図面に示されている。本発明を特定の実施例に関連して詳述するが、これは本発明を1つの実施例に限定することを意図するものではない。逆に、添付の請求の範囲によって定義される本発明の精神及び範囲内に含まれる別例、変更例及び等価なものを包含することを意図している。
【0019】
本発明は、特定の種類のオペレーションを任意のアーキテクチャ上で実施する選択可能な複数のインプリメンテーションの選択に取り組む。一般的に、従来の方法はコードをコンパイル・タイムにおいてスタティックに一度形成するか、またはランタイムにおいてダイナミックに一度形成する。ここで開示され、クレームされた発明は、バーチャル・マシンが、ランタイム・コンパイラによって形成するコード・セグメントを、複数の可能なコード・セグメントの中からランタイム・パフォーマンス・データに基づいてランタイムで選択することを可能にする。これによって、ダイナミック・コンパイラは1つのインプリメンテーションを選択でき、要求されれば、その効率を監視し、インプリメンテーションを変更する。
【0020】
前記のように、浮動小数点アンダフローを検出して修正する2つの一般的な方法が存在する。このうちの一方の方法は、高速で短いコードであって、正常なプログラムの実行の中断をトラップの処理中に必要とするコードを使用することを含むトラップ法を使用する。他方の方法は、アンダフローを各浮動小数点オペレーション後に検出するために、コードをプログラム内に挿入することを含む。これは、コードを毎回実行することを必要とするが、プログラムを順番に続行することを可能にする。
【0021】
拡張浮動小数点フォーマットの結果を単精度浮動小数点フォーマットまたは倍精度浮動小数点フォーマットで格納する必要が生じた際、アンダフローの問題が発生する。これは、例えば、結果をインテル・アーキテクチャ・コンピュータ上で算出し、次いで、この結果を単精度フォーマットまたは倍精度フォーマットで格納する際、発生し得る。より具体的には、この問題は、結果の指数が宛先において表示可能な最小の指数(IEEE754単精度フォーマットまたは倍精度フォーマット)より小さく、仮数が正確な結果を丸めた結果である際など、非常に小さな数を使用した演算を実施する際に、発生する。最も近い表現を宛先内に格納するために、仮数が不正確であること(その結果、丸められたこと)と、仮数を丸めた方法及び理由と、を知る必要がある。この検出及び訂正は、例えば数値がゼロに近づく速度を測定すべく、非常に小さな数の正確さを維持するために、重要である。
【0022】
図3は本発明の一実施例に従う、ジャバ・ソース・コードからネイティブ命令を形成することに関連した入力/出力及び実行ソフトウェア/システムを示すブロック図である。他の実施例では、本発明を、別の言語のためのバーチャル・マシンを用いて実施するか、またはジャバ・クラス・ファイル以外のクラス・ファイルを用いて実施できる。図の左側から始めると、第1入力は、カリフォルニア州マウンテンビューに所在するサン・マイクロシステムズによって開発されたジャバ(商標名)プログラム言語で書かれたジャバ・ソース・コード301である。ジャバ・ソース・コード301をバイトコード・コンパイラ303へ入力する。本質的に、バイトコード・コンパイラ303はソース・コード301をバイトコードへコンパイルするプログラムである。バイトコードは1つ以上のジャバ・クラス・ファイル305に含まれる。ジャバ・クラス・ファイル305はジャバ・バーチャル・マシン(JVM)を有する任意のコンピュータ上で実行できるので、ポータブルといえる。バーチャル・マシンの複数のコンポーネントを図4により詳細に示す。ジャバ・クラス・ファイル305はJVM307へ入力される。JVM307は任意のコンピュータ上に存在可能である。従って、JVM307は、バイトコード・コンパイラ303を有する同一のコンピュータ上に存在する必要はない。JVM307はインタプリタまたはコンパイラなどの幾つかの役割のうちの1つとしての動作が可能である。それがコンパイラとして動作する場合、それは“ジャスト・イン・タイム(JIT)”コンパイラまたはアダプティブ・コンパイラとしてさらに動作し得る。インタプリタとして動作する際、JVM307はジャバ・クラス・ファイル305に含まれる各バイトコード命令をインタプリトする。
【0023】
図4は後で記述する図11のコンピュータ・システム1000によってサポートできるJVM307などのバーチャル・マシン311を示す図である。前記のように、コンピュータ・プログラム(例:ジャバ(商標名)プログラム言語で書かれたプログラム)をソースからバイトコードへ翻訳する際、ソース・コード301はコンパイルタイム環境303内のバイトコード・コンパイラ303へ提供される。バイトコード・コンパイラ309は、ソース・コード301をバイトコード305へ翻訳する。一般的に、ソフトウェア開発者がソース・コード301を形成した時点において、ソース・コード301はバイトコード305へ翻訳される。
【0024】
一般的に、バイトコード305はネットワーク(例:図11のネットワーク・インターフェース1024)を通じて複製、ダウンロード若しくは配布されるか、または図11の一次ストレージ1004などのストレージ・デバイス上へ格納され得る。本実施例では、バイトコード303はプラットフォームから独立している。即ち、バイトコード303は、適切なバーチャル・マシン311を実行している実質的に全てのコンピュータ・システム上で実行可能である。バイトコードをコンパイルすることによって形成されたネイティブ命令は、後からJVMで使用するために保持できる。この結果、インタプリトされたコードより優れた速度の効果をネイティブ・コードへ提供するために、翻訳のコストは複数の実行を通じて償却される。例えば、ジャバ(商標名)環境では、バイトコード305はJVMを実行しているコンピュータ・システム上で実行可能である。
【0025】
バイトコード305はバーチャル・マシン311を含むランタイム環境313へ提供される。一般的に、ランタイム環境313は図11のCPU1002などのプロセッサを使用して実行できる。バーチャル・マシン311はコンパイラ315、インタプリタ317及びランタイム・システム319を含む。一般的に、バイトコード305はコンパイラ315またはインタプリタ317へ提供可能である。
【0026】
バイトコード305をコンパイラ315へ提供した際、バイトコード305に含まれるメソッドはネイティブ・マシン命令(図示せず)へコンパイルされる。その一方、バイトコード305をインタプリタ317へ提供した際、バイトコード305は1バイトコードずつインタプリタ317内へ読み込まれる。そして、各バイトコードがインタプリタ317内へ読み込まれることにより、インタプリタ317は各バイトコードによって定められたオペレーションを実施する。一般的に、インタプリタ317は実質的に連続してバイトコード305を処理し、バイトコード305に関連するオペレーションを実施する。
【0027】
オペレーティング・システム321がメソッドを呼び出す際、このメソッドをインタプリトされたメソッドとして呼び出すことを決定した場合、ランタイム・システム319はメソッドをインタプリタ317から獲得できる。その一方、メソッドをコンパイルされたメソッドとして呼び出すことを決定した場合、ランタイム・システム319はコンパイラ315を起動する。次いで、コンパイラ315はネイティブ・マシン命令をバイトコード305から形成し、マシン言語命令を実行する。一般的に、バーチャル・マシン311を終了する際、マシン言語命令は廃棄される。バーチャル・マシン、より詳細には、ジャバ(商標名)バーチャル・マシンのオペレーションはティム・リンドホルム及びフランク・イェリンによる“ジャバ(商標名)バーチャル・マシン詳説”(ISBN0−201−63452−X)と称される文献に更に詳細に開示されており、この文献の内容はこの開示をもって本明細書中に開示したものとする。
【0028】
前記のように、ジャバ・プログラム内の命令は時には1より多い方法でコンパイルできる。先の例の続きを説明する。乗算(FMUL)オペレーションまたは除算(FDIV)オペレーションなどのアンダフローを潜在的に引き起こし得る浮動小数点オペレーションは、少なくとも2つの方法(明示的チェックを伴う方法またはトラップを伴う方法)でコンパイル可能である。図5はジャバ・プログラムからネイティブ命令の異なるバージョンがどのように形成され得るかを示す流れ図である。バイトコード・コンパイラによってジャバ・クラス・ファイル内にコンパイルされた後、ブロック403(図3のシステム307)において、ジャバ・プログラム401(図3及び図4の入力301)は、JVMによってバイトコードからネイティブ・マシン命令へランタイムでコンパイルされる。JVMは例示を目的として使用しているだけである。当業者に知られているように、バーチャル・マシンは任意の入力表現からネイティブ命令セットへの一般的な翻訳に用いる。この場合、インプリメンテーションの選択が存在する。JVMによるジャバ・クラス・ファイルのコンパイレーションの方法を図6に基づいて以下に記述する。
【0029】
前記のように、JVMは2つ役割、即ち、クラス・ファイルに含まれるジャバ・バイトコードをインタプリトすることと、クラス・ファイルをコンパイルし、これによって、JVMを有する同一コンピュータ上で実行されるネイティブ命令セット(即ち、これらはポータブルでない)を形成することのうち、いずれか一方の役割を担うことが可能である。従って、コンパイラとして動作するJVMの場合、ブロック405に示すように、JVMがバイトコードをどのようにコンパイルするかに依存して、様々なネイティブ命令セットが同一のジャバ・プログラムから形成され得る。浮動小数点オペレーションを例として使用した場合、ネイティブ命令407はその全てのFMUL及びFDIVにおける明示的チェック(即ち、インライン)を含むことが可能な一方、ネイティブ命令409はこれら同じ浮動小数点オペレーションのためのトラップのみを含むことが可能であり、また、ネイティブ命令411はこれら両方の組み合わせを含むことが可能である。
【0030】
どのコンパイレーション・ルートを採用するか(即ち、ジャバ・ソース・コードをコンパイルすることと、ジャバ・ソース・コードをインタプリトすることと、どのようにもしくはいつジャバ・ソース・コードを実行するかについて他のオペレーションを実施することのうちのどれか)をランタイムにおいて決定するJVMを、図5が示していないことは注目に値する。これに代えて、JVMの採用したコンパイレーション・ルートが、そのコードをランタイムにおいてコンパイルすることである場合、それを異なる“方法”で実行し、これによって、ネイティブ命令の異なるセットを形成することを、図5は示している。このプロセスを図6に関連して詳述する。
【0031】
図6は本発明の一実施例に従うジャバ・バイトコードをネイティブ・マシン命令へコンパイルするジャバ・バーチャル・マシンのプロセスを示すフローチャートである。ステップ501では、JVMは1つ以上のバイトコード命令をジャバ・クラス・ファイルから取り出す。ステップ503では、JVMは特定の命令を複数の方法でコンパイルできるか否かを決定する。複数の方法でコンパイルできるバイトコード命令の特定の例は図8に基づいて後で詳述する。JVMが、IADDオペレーションまたはLSUBオペレーションのように、1つの方法でしか命令をコンパイルできないことを決定した場合、JVMはバイトコードをステップ505でコンパイルする。以前に取り出したバイトコードをコンパイルした後、JVMは残されたバイトコードが存在するか否かをステップ515で決定する。
【0032】
バイトコードをコンパイルする複数の方法が存在することを、JVMが決定した場合、JVMはどの方法でバイトコードをコンパイルするかをステップ507で決定すべく処理を続行する。記述した実施例では、図7に詳細を示すように、この決定を行うために、JVMはメカニズムを使用する。このメカニズムは、バイトコード命令をコンパイルできる異なる方法のそれぞれのダイナミックに形成されたプロフィール情報を使用することを含む。ステップ509では、JVMは、バイトコードをデフォルトの方法を用いてコンパイルするか否かを決定する。そのデフォルトの方法は、一般的に、ランタイム・コンパイラのライタが、その時点で利用可能なオプションを検討した後、最も効率的または論理的な方法であると確信する方法である。
【0033】
ステップ509で、JVMがバイトコードを第1の方法でコンパイルすることを決定した場合、ステップ513で、JVMはこれを実施して、図5のネイティブ命令セットAなどの第1ネイティブ命令セットを形成する。次いで、JVMは、他のバイトコードがクラス・ファイル内に存在するか否かをステップ515で決定する。存在する場合、JVMは、次のバイトコードを取り出すためにステップ501へ戻る。バイトコードが1つも存在しない場合、プロセスは完了する。ステップ509で、JVMが、バイトコードをコンパイルする方法が第1の方法、即ち、デフォルトの方法でないことを決定した場合、JVMはバイトコード命令を別のコンパイレーション技術を使用してステップ511でコンパイルする。次いで、JVMはステップ513からの場合と同様に処理を続行し、コンパイルする残りのバイトコードが存在するか否かをステップ515において決定する。簡単にするために、2つの異なる方法のみを図6に示すが、本発明はバイトコードをコンパイルする3つ以上の方法へ効果的に適用できる。
【0034】
図7は本発明の一実施例に従うダイナミックに形成されたプロフィール・データを含むネイティブ・マシン命令をどのように形成するかを示すブロック図である。JVMによってバイトコード命令をコンパイルし得る異なる方法のそれぞれに関する情報を含む点を除けば、図7は図5に類似している。その情報は、図6のステップ503に示すように、バイトコードをネイティブ命令へコンパイルする複数の方法が存在することが決定されると、形成される。ジャバ・プログラム601が図7のトップに位置している。バイトコード・コンパイラによってバイトコードへコンパイルされた後、ジャバ・プログラム601はジャバ・バーチャル・マシン603へ入力される。次いで、JVMは、バイトコードをネイティブ命令へコンパイルし得る異なる方法に基づいて、幾つかの異なるネイティブ命令セット605を出力可能である。ネイティブ命令セット605は、ランタイムにおいてダイナミックに集められたデータ607を格納するデータ・スペースを更に含むことができる。この情報は、カウンタ、タイミング・データ、及びバイトコードをコンパイルする特定の方法の効率に関する他の情報のようなプロフィール情報を含んでよい。
【0035】
ダイナミックに集められたデータは、ネイティブ命令と一緒に格納可能であり、そして、バイトコードをJVMによってコンパイルする間に更新できる。1つの実施例では、図6のステップ507で最初に説明したように、JVMは、バイトコードをどの方法でコンパイルするかを決定するために、この情報を調べる。ダイナミック・プロフィール・データは、例えば、コンパイルの特定の方法が効率的であり続けるか否か、バイトコードがその方法で何回実行されたか、または特定の時間を経過したか否かを決定するために、JVMによって使用され得る。JVMは、現在の命令がバイトコードの最も効率的なインプリメンテーションであるか否かを決定するために、コンパイル中におけるデータへのクエリーが可能である。効率的に実行されていないことがJVMによって確認された任意のバイトコードを、JVMによってリコンパイルできる。JVMは、データ607へのクエリーによってどのようにバイトコードがコンパイルされるべきかを決定すると、図6のステップ509に示すように、JVMはこれが第1の方法(デフォルトの方法)であるべきか、または他の方法のうちの1つであるべきかを決定することによって、処理を継続し得る。
【0036】
図8は本発明の記述した実施例に従う、浮動小数点オペレーションをコンパイルし、アンダフローが発生した場合、このアンダフローを訂正する方法を決定するジャバ・バーチャル・マシンを示すフローチャートである。前記のように、浮動小数点オペレーションのコンパイルは、プログラムを幾つかの方法でコンパイルする方法を決定する特定の例である。より一般的には、コンパイレーションをヒューリスティックス、即ち、コード(例:テーブルスイッチ命令のコンパイル)の平均的振る舞いに関する仮定によってガイドする任意のアプリケーションは、前記のようにプログラムを幾つかの方法でコンパイルする方法を決定する方法を利用できる。ステップ701では、JVMはバイトコードをジャバ・クラス・ファイルから取り出す。ステップ703では、JVMは、バイトコード命令がアンダフローを形成し得るか否かを決定する。アンダフローを形成し得る一般的な2つの浮動小数点オペレーションは乗算及び除算である。記述した実施例では、JVMは、特定の命令がアンダフローの問題を形成できないことを決定すると、ステップ705に示すように、JVMはバイトコードをコンパイルすべく処理を続行する。
【0037】
命令がアンダフローの問題を潜在的に形成し得る場合、JVMは、どのようにアンダフローが検出され、訂正されるを決定するプロセスを開始する。前記のように、記述した実施例では、JVMはアンダフローを検出するための明示的チェック(即ち、インライン・コード)またはトラップを使用し得る。別の実施例では、前記の方法に代えて、または前記の方法に加えて、アンダフローを検出する別の方法を使用できる。
【0038】
ステップ707では、バーチャル・マシンは、アンダフローを検出するためのトラップに関連するカウンタが所定の閾値を越えたか否かをチェックする。トラップの一部として、各トラッピング命令に関連するカウンタをインクリメントするための命令が含まれている。任意のカウンタがある閾値を越えた場合、バイトコード・トランスレータを再呼び出しするための命令が更に含まれている。カウンタは、特定のバイトコード(この例では、浮動小数点命令)をどの方法でコンパイルするのかを決定するためにチェックできる情報、即ち、プロフィール・データの1つの例である。図7に示すように、カウンタ及びこれに類する情報607は、ネイティブ命令セットと一緒に維持可能である。別の実施例では、JVMがどの方法でバイトコードをコンパイルするために使用されるべきかを決定するために、カウンタに代えて、またはカウンタと一緒に、タイマなどの別の種類のデータを使用できる。
【0039】
JVM上でのジャバ・クラス・ファイルの1回の実行中に複数回実施される特定の浮動小数点オペレーションを実行するために、特定の方法が使用される度に、カウンタが更新され得る。例えば、特定の命令を条件付きループ内に有することによって、カウンタの更新を行い得る。トラップを使用して訂正するアンダフローを特定の浮動小数点オペレーションが引き起こす度に、カウンタはインクリメントされる。図6に示すステップ509で説明した“第1の方法”は、命令をコンパイルするトラップ法に該当し得る。記述した実施例では、一般的に採用される実行のパスにおけるオペレーションの数を減少させることが好ましいため、第1の方法でコンパイルする際、カウンタを避けることが望ましい。図8に示す特定の実施例では、コンパイルする(そして、アンダフローを潜在的に形成する)特定の浮動小数点オペレーションのためのカウンタが閾値へ達していない場合、JVMは第1の方法(この例では、命令をコンパイルするトラップ法)の使用を継続する。カウンタが閾値を越えている場合、“第2の方法”でのリコンパイレーションを行うために、フラグをこの命令/方法に対して立てる。前記のように、各トラッピング命令に関連するカウンタをインクリメントするための命令がトラップの一部として含まれている。
【0040】
トラップ法を使用した命令のコンパイルにおける第1工程は、ステップ709に示すように、トラップ・ハンドラがセットアップされているか否かを決定することである。ジャバ・クラス・ファイルがトラップを初めて呼び出した際、トラップ・ハンドラが形成される。トラップ・ハンドラを必要とするコードをコンパイルすることを、コンパイラが初めて決定した際(トラップ・ハンドラはこれ以前に必要となり得ない)、トラップ・ハンドラが(JVMによって)セットアップされる。記述した実施例及び殆どのジャバ・プログラムでは、1つのトラップ・ハンドラがプログラム内の各スレッドに対して存在する。スレッドの詳細な説明は“ジャバ言語詳説”に開示されており、この文献の内容はこの開示をもって本明細書に開示したものとする。トラップ・ハンドラを形成する場合、これはステップ711で行われる。トラップ・ハンドラが特定のスレッドに対して既にセットアップされている場合、ステップ713に示すように、JVMはトラップ法を使用して命令をコンパイルする。トラップ・ハンドラを使用して命令をコンパイルするこのプロセスは、図9において更に詳述する。コンパイルを終えると、JVMは他のバイトコードがジャバ・クラス・ファイル内に存在するか否かを見るためにステップ715においてチェックする。存在する場合、JVMはステップ701へ戻り、プロセスを繰り返す。
【0041】
ステップ707では、JVMは、カウンタが所定値を超えたか否か(即ち、命令が特定の方法で所定回数を超えて実行されたか否か)をチェックする。超えている場合、JVMはバイトコードを次の方法でコンパイルする。この例では、その方法は、浮動小数点アンダフローを検出し、訂正するために、ステップ717に示すように、明示的チェック(インライン・コード)を使用する。別の実施例では、バイトコード・トランスレータがコンパイルされたバイトコードを特定の方法で実行し続けるべきか否かを決定するために、カウンタ以外の基準を使用することができる。バイトコード命令をコンパイルする明示的チェック法は図10において詳述する。ステップ719では、バーチャル・マシンは明示的チェックと一緒に使用するタイマをセットする。その時間は、明示的チェック法を使用した時間的な長さを測定するために、使用される。次いで、ステップ715では、バーチャル・マシンはそれ以上のバイトコードが存在するか否かをチェックする。何も存在しない場合、ジャバ・クラス・ファイル内のバイトコードをコンパイルするプロセスは完了する。
【0042】
図9は浮動小数点命令からのアンダフローを処理するために、トラップを使用する図8のステップ713のプロセスの詳細を示すフローチャートである。ステップ801では、JVMは、ジャバ・クラス・ファイル内のどのバイトコード命令がトラップを呼び出しているかを決定する。バーチャル・マシンは、どの命令がトラップを呼び出しているかを決定すると、バーチャル・マシンは浮動小数点オペレーションに関連するカウンタをステップ803でインクリメントする。図7で述べたように、カウンタをネイティブ命令と一緒に維持し得る。カウンタがインクリメントされると、バーチャル・マシンはカウンタの値をステップ805でチェックする。カウンタが閾値を越えている場合、ステップ807において、浮動小数点命令を含むモジュールに対して、リコンパイルするためにフラグを立てる。
【0043】
記述した実施例では、モジュールを即座にリコンパイルしない。その代わりに、そのリソース及びアクティビティのレベルに基づいてバーチャル・マシンによって決定された時点において、モジュールは、リコンパイルするために、キューへ加えられる。別の実施例では、モジュールを即座にまたは設定時間にコンパイルし得る。モジュールをリコンパイルする実際の時間とは無関係に、記述した実施例では、カウンタに基づいて、バーチャル・マシンはリコンパイルすることを決定する。別の実施例では、バーチャル・マシンは図7で述べたネイティブ命令と一緒に格納可能なダイナミックに形成されたプロフィール・データから得られた別の印を使用できる。ステップ807で、モジュールに対して、リコンパイルするために、フラグを立てるか、別の方法でマークすると、バーチャル・マシンは、ジャバ・クラス・ファイル内にそれ以上のバイトコードが存在するか否かをチェックするために、図8のステップ715へ戻る。カウンタがステップ805で所定値を超えていない場合、JVMは、ステップ809で、浮動小数点アンダフローを処理するために、トラップを使用することによって処理を継続する。次いで、バーチャル・マシンは図8のステップ715へ戻る。
【0044】
図10は図8のステップ717で述べた浮動小数点アンダフローを検出し、訂正するための明示的チェック・ルーチンを示すフローチャートである。前記のように、明示的チェックは、浮動小数点アンダフローを検出し、訂正するために、JVMによってジャバ・クラス・ファイルから形成されたネイティブ命令セット内へ挿入されたコードである。図10は、バーチャル・マシンが、明示的チェック法(明示的チェック法は図6のステップ511で述べた“次の方法”に該当し得る)でコンパイルする時、または図9のステップ807同様に、リコンパイルするために浮動小数点命令を含むモジュールに対してフラグを立てる時を、どのように決定するかを示す。ステップ901では、バーチャル・マシンは、浮動小数点アンダフローを訂正するために、明示的チェック法を使用する。前記のように、明示的チェックによってアンダフローが何回検出されたかを追跡するために、明示的カウンタを挿入し得るか、またはタイマを使用し得る。カウンタをこのパスで使用することによる1つの潜在的問題としては、カウンタが処理の期間で比較的コスト高となり得る点が挙げられる。別の実施例では、タイマ及びカウンタの組み合わせを使用可能である。次いで、バーチャル・マシンは明示的チェックを最初に使用した時点から何時間経過したかをチェックする。図8のステップ719において思い起こすと、記述した実施例では、命令を明示的チェックとしてコンパイルした後、バーチャル・マシンはタイマをセットする。所定時間を経過したか否かを決定するために、これと同じタイマをステップ903で使用する。記述した実施例では、所定時間を経過した場合、ステップ905において、JVMはコンパイルするためにモジュールに対してフラグを立てるか、またはマークをつける。
【0045】
1つの実施例では、特定の時間を経過した後、JVMはバイトコードをリコンパイルする。これは、現在コンパイルしている方法をデフォルトの方法へリセットすることによって、ジャバ・クラス・ファイルの実行が新たな状況へ適合せずに潜在的に非効率的になることを防止するために、行われる。バーチャル・マシンが決定した時点で、リコンパイルするためにモジュールに対してフラグを立て、キューへ加えると、この特定の浮動小数点命令に対応するカウンタ及び他のプロフィール・データをリセットまたはリフレッシュし、これによって、新しいプロフィール情報を維持できる。カウンタをステップ907でリセットする。次いで、バーチャル・マシンは図8のステップ719へ戻る。
【0046】
本発明はコンピュータ・システム内に格納された情報を使用する様々なコンピュータ実装オペレーションを使用する。これらのオペレーションは物理量の物理操作を必要とするオペレーションを含む(但し、同オペレーションに限定されない)。一般的に、必ずしも必要でないが、これらの量は格納、転送、結合、比較及び他の操作が可能な電気信号または磁気信号の形態をなす。本発明の一部を構成するここで記述するオペレーションは、有用なマシン・オペレーションである。実施する操作は形成、識別、実行、決定、比較、実行、ダウンロードまたは検出等の用語で示されることが多い。主に共通の用法を得る理由で、これらの電気信号または磁気信号をビット、値、エレメント、変数、キャラクター等として示すと時に都合が良い。しかし、これらの用語またはこれらに類似する用語の全ては適切な物理量に関連づけるべきであり、かつ、これらの量に適用された都合の良いラベルにすぎない点を覚えておく必要がある。
【0047】
更に、本発明は前記のオペレーションを実施するためのデバイス、システムまたは装置に関する。システムは要求された目的のために特別に構築可能であり、または、システムは、そのコンピュータに格納されたコンピュータ・プログラムによって選択的に作動または構成される汎用コンピュータとすることが可能である。前記のプロセスは特定のコンピュータまたは他のコンピューティング装置に本質的には関連しない。特に、様々な汎用コンピュータを、ここで開示されていることに基づいて記述されたプログラムと併用してよく、あるいは、これに代えて、要求されたオペレーションを実施するために、より特別なコンピュータ・システムを形成することはより都合が良い。
【0048】
図11は本発明の一実施例に従う処理の実施に適した汎用コンピュータ・システム1000のブロック図である。例えば、JVM307、バーチャル・マシン311またはバイトコード・コンパイラ303を汎用コンピュータ・システム1000上で実行できる。図11は汎用コンピュータ・システムの一実施例を示す。本発明の処理を実施するために、他のコンピュータ・システム・アーキテクチャ及び構成を使用することができる。以下に記述する様々なサブシステムからなるコンピュータ・システム1000は、少なくとも1つのマイクロプロセッサ・サブシステム(中央処理装置、即ち、CPUとも称される)1002を含む。即ち、CPU1002はシングルチップ・プロセッサまたはマルチプル・プロセッサによって実現し得る。CPU1002はコンピュータ・システム1000のオペレーションを制御する汎用デジタル・プロセッサである。メモリから取り出した命令を使用して、CPU1002は入力情報の受信及び操作と、出力デバイス上での情報の出力及び表示とを制御する。
【0049】
CPU1002は、メモリ・バス1008を介して、一般的にランダム・アクセス・メモリ(RAM)からなる第1の一次ストレージ1004に双方向接続され、一般的にリード・オンリ・メモリ(ROM)からなる第2の一次ストレージ領域1006に単方向接続されている。当該技術分野でよく知られているように、一次ストレージ1004は汎用ストレージ領域及び作業メモリとして使用可能であり、さらには入力データ及び処理済みデータを格納するためにも使用できる。更に、CPU1002上で処理されるプロセスのためのデータ及び命令を格納する以外に、一次ストレージ1004はプログラミング命令及びデータを格納可能であり、そして、一般的に、データ及び命令を、メモリ・バス1008の間を双方向で高速転送するために、使用される。同様に、当該技術分野でよく知れられているように、一次ストレージ1006は、一般的に、CPU1002がその機能を果たすために使用する基本オペレーティング命令、プログラム・コード、データ及びオブジェクトを含む。一次ストレージ・デバイス1004,1006は、例えば、データ・アクセスが双方向または単方向のいずれを必要とするかに依存して、以下に詳述する適切なコンピュータ読み取り可能ストレージ媒体を含み得る。CPU1002は、キャッシュ・メモリ1010において、頻繁に必要となるデータを超高速で直接取り出し、そして、格納できる。
【0050】
取り外し可能大容量ストレージ・デバイス1012はコンピュータ・システム1000のための別のデータ・ストレージ容量を提供し、ペリフェラル・バス1014を介してCPU1002に双方向または単方向のいずれかで接続されている。例えば、CD−ROMとして知られている特定の取り外し可能大容量ストレージ・デバイスは、一般的にデータを単方向でCPU1002へ送信する。その一方、フロッピー・ディスクはデータを双方向でCPU1002へ送信し得る。ストレージ1012は、磁気テープ、フラッシュ・メモリ、搬送波に具現化された信号、スマート・カード、ポータブル大容量ストレージ・デバイス及び他のストレージ・デバイス等のコンピュータ読み取り可能媒体を更に含み得る。また、固定大容量ストレージ1016は、別のデータ・ストレージ容量を提供し、ペリフェラル・バス1014を介してCPU1002に双方向で接続されている。一般的に、これらの媒体へのアクセスは一次ストレージ1004,1006へのアクセスより遅い。大容量ストレージ1012,1016は、一般的に、CPU1002が頻繁に使用しない他のプログラミング命令及びデータ等を格納する。必要に応じて、大容量ストレージ1012,1016内に保持された情報は、一次ストレージ1004(例:RAM)の一部を構成するバーチャル・メモリとして標準的に組込み可能である。
【0051】
ストレージ・サブシステムへのCPU1002のアクセスを提供する以外に、ペリフェラル・バス1014は、同様に、他のサブシステム及びデバイスへのアクセスを提供するために使用される。記述した実施例では、これらは、ディスプレイ・モニタ1018及びアダプタ1020、プリンタ・デバイス1022、ネットワーク・インターフェース1024、補助入力/出力装置インターフェース1026、サウンド・カード1028及びスピーカ1030、並びに必要とされる他のサブシステムを含む。
図示するように、ネットワーク接続を使用することにより、ネットワーク・インターフェース1024はCPU1002を別のコンピュータ、コンピュータ・ネットワークまたは通信ネットワークへ接続可能にする。前記の方法のステップを実行するうえで、ネットワーク・インターフェース1024を通じることで、CPU1002が、オブジェクト、プログラム命令またはバイトコード命令などの情報を別のネットワーク内のコンピュータから受信するか、または情報を別のネットワーク内のコンピュータに出力することを意図している。CPUで実行する命令のシーケンスとしてしばしば表される情報は、例えば、搬送波に具現化されたコンピュータ・データ信号の形態で別のネットワークに対して送受信可能である。インターフェース・カードまたはこれに類似するデバイスと、CPU1002によって実行される適切なソフトウェアとは、コンピュータ・システム1000を外部ネットワークへ接続し、標準プロトコルに従ってデータを転送するために使用できる。即ち、本発明で具現化される方法はCPU1002上で単独で実行してよいし、または、処理の一部を共有する遠隔CPUと協動することにより、インターネット、イントラネットワーク若しくはローカル・エリア・ネットワーク等のネットワークを通じて実行してよい。また、別の大容量ストレージ・デバイス(図示せず)をネットワーク・インターフェース1024を通じてCPU1002へ接続してよい。
【0052】
補助入力/出力装置インターフェース1026は、CPU1002に他のデバイスにデータを送信させ、より一般的に、そのデバイスからのデータを受信させ得る汎用及びカスタム・インターフェースを表す。キーボード1036またはポインタ・デバイス1038からの入力を受信し、さらにはデコードしたシンボルをキーボード1036またはポインタ・デバイス1038からCPU1002へ送信するために、キーボード・コントローラ1032がローカル・バス1034を通じてCPU1002へ接続されている。ポインタ・デバイスは、マウス、スタイラス、トラック・ボールまたはタブレットであってよく、そして、グラフィカル・ユーザ・インターフェースとの相互作用に有用である。
【0053】
加えて、本発明の実施例は、さらに、様々なコンピュータ実行オペレーションを実施するためのプログラム・コードを含むコンピュータ読み取り可能媒体を有するコンピュータ・ストレージ製品に関する。コンピュータ読み取り可能媒体は、コンピュータ・システムによって後からの読み取りが可能なデータを格納し得る任意のデータ・ストレージ・デバイスである。コンピュータ読み取り可能媒体の例としては、ハード・ディスクと、フレキシブル・ディスクと、特定用途向け集積回路(ASIC)またはプログラム可能論理回路(PLD)などの特別に形成されたハードウェア・デバイスと、を含めた前記の全ての媒体が挙げられる(但し、これらに限定されない)。
【0054】
前記のハードウェア・エレメント及びソフトウェア・エレメントが標準的な設計及び構成を有することを当業者は理解し得る。本発明を使用するのに適した他のコンピュータ・システムは別のサブシステムまたは少数のサブシステムを含み得る。更に、メモリ・バス1008、ペリフェラル・バス1014及びローカル・バス1034はサブシステムをリンクするのに役立つ任意の相互接続方式の実例である。例えば、ローカル・バスはCPUを固定大容量ストレージ1016及びディスプレイ・アダプタ1020へ接続するために使用可能である。しかし、図11に示すコンピュータ・システムは本発明を使用するのに適したコンピュータ・システムの例である。サブシステムの別の構成を有する他のコンピュータ・アーキテクチャを利用し得る。
【0055】
以上、理解を容易にする目的で、本発明をある程度詳しく説明したが、本発明の請求の範囲内において、特定の変更及び修正を実施しても良い。例えば、トラップ法及び明示的インライン・チェック法を浮動小数点アンダフローに関連して詳述したが、アンダフローを検出する他のツールも使用し、本発明に組み入れることができる。別の例では、命令をコンパイルする2つの方法を開示したが、プログラムをコンパイルする更に多くの方法を利用可能な場合、本発明の方法及び装置はこれら2つより多い方法に対応可能である。更に、本発明を浮動小数点アンダフロー・オペレーションを使用して説明したが、プラットフォーム固有のバリエーションに起因する問題の解決に使用するために、本発明はインプリメンテーションをインテリジェントで、ダイナミックに選択できる。浮動小数点アンダフローは、この種の問題の1つに過ぎない。更に、本発明の方法及び装置の両方をインプリメントするための代わりの方法が存在することを認識する必要がある。従って、本実施例は例示を目的とするものであって、限定を目的としない。更に、本発明はここで与えられた詳細部分に限定されることなく、添付の請求の範囲及びそれに等価なものの範囲内で変更できる。
【図面の簡単な説明】
【図1】従来技術で知られているような倍精度浮動小数点の一般的なフォーマットと拡張精度浮動小数点のフォーマットを示すブロック図である。
【図2】従来技術で知られているような浮動小数点アンダフローを検出する2つの方法を示す図である。
【図3】ジャバ・ソース・コードを含むジャバ(商標名)プログラムを特定のプラットフォーム、即ち、コンピュータ上で実行されるネイティブ・コードに変換することを示すブロック/プロセス図である。
【図4】図11のコンピュータ・システム1000によってサポートされているバーチャル・マシン307を示す図である。
【図5】ネイティブ命令の異なるバージョンがジャバ・プログラムからどのように形成されるのかを示すブロック図である。
【図6】本発明の一実施例に従う、ジャバ・バイトコードをコンパイルするジャバ・バーチャル・マシンのプロセスを示すフローチャートである。
【図7】本発明の一実施例に従う、ダイナミックに形成されたプロフィール・データを含むネイティブ命令がどのように形成されるのかを示すブロック図である。
【図8】本発明の一実施例に従う、浮動小数点オペレーションをコンパイルするとともに、アンダフローが発生した場合、このアンダフローを訂正する方法を決定するジャバ・バーチャル・マシンを示すフローチャートである。
【図9】図8のステップ713に示す浮動小数点命令からのアンダフローを処理するトラップ・ルーチンを使用するプロセスをより詳細を示すフローチャートである。
【図10】図8のステップ717に示す浮動小数点アンダフローを検出し、訂正するための明示的チェック・ルーチンを示すフローチャートである。
【図11】本発明の一実施例を実現することに適した一般的なコンピュータ・システムのブロック図である。
【符号の説明】
1000…コンピュータ・システム
1002…CPU
1004…第1の一次ストレージ
1006…第2の一次ストレージ領域
1008…メモリ・バス
1010…キャッシュ・メモリ
1012…取り外し可能大容量ストレージ・デバイス
1014…ペリフェラル・バス
1016…固定大容量ストレージ
1018…ディスプレイ・モニタ
1020…アダプタ
1022…プリンタ・デバイス
1024…ネットワーク・インターフェース
1026…補助入力/出力装置インターフェース
1028…サウンド・カード
1030…スピーカ
1032…キーボード・コントローラ
1034…ローカル・バス
1036…キーボード
1038…ポインタ・デバイス
Claims (18)
- コンピュータによって実行される、コンピュータ・プログラム内の浮動小数点アンダフローを形成する浮動小数点オペレーションに関連するバイトコード命令をコンパイルする方法をランタイムにおいて決定する方法であって、
複数の方法でコンパイルされ得る前記コンピュータ・プログラムに関連するバイトコード命令を取り出す工程と、
前記浮動小数点オペレーションが浮動小数点アンダフローを形成し得るか否かを判定する工程と、
前記浮動小数点アンダフローに関する判定を受けて、前記バイトコード命令を第1の方法でコンパイルする工程と、
前記浮動小数点オペレーションが浮動小数点アンダフローを形成し得るとき、前記バイトコード命令をコンパイルする第2の方法が望ましいことを、ランタイムにおいて決定する工程と、前記第2の方法は、前記浮動小数点アンダフローに関連する予め定められた条件に基づいて決定されることと、
前記バイトコード命令を前記第2の方法でリコンパイルする工程と、
を備える方法。 - 請求項1に記載の方法において、
リコンパイルされるべき前記バイトコード命令を備えるモジュールを、キューへ加える工程
を更に備えることを特徴とする方法。 - 請求項1に記載の方法において、
前記バイトコード命令を複数の方法でコンパイルできることを、ランタイムにおいて決定する工程
を更に備えることを特徴とする方法。 - 請求項1に記載の方法において、
前記コンピュータ・プログラムのダイナミックに変化する効率を調べる工程
を更に備えることを特徴とする方法。 - 請求項4に記載の方法において、
コンピュータ・プログラムをコンパイルできる前記複数の方法のうちの現在実行中の1つの方法に関する特定のデータを、ランタイムにおいて集める工程
を更に備えることを特徴とする方法。 - 請求項1に記載の方法において、
前記第2の方法が前記第1の方法と異なる際、前記バイトコード命令を前記第2の方法でリコンパイルする工程
を更に備えることを特徴とする方法。 - コンピュータによって実行される、プログラム内の浮動小数点オペレーションを実行する方法であって、
浮動小数点オペレーションが浮動小数点アンダフローを形成し得るか否かを決定する工程と、
前記浮動小数点オペレーションが浮動小数点アンダフローを形成し得るとき、特定の浮動小数点オペレーションがアンダフローを何回引き起こしたかを決定するために、特定のインジケータをチェックする工程と、
前記特定のインジケータが所定の基準を満たした時、前記特定の浮動小数点オペレーションを第1の方法を用いてコンパイルし、それ以外の時は、前記特定の浮動小数点オペレーションを第2の方法を用いてコンパイルする工程と、
を備える方法。 - 請求項7に記載の方法において、
前記特定の浮動小数点オペレーションをコンパイルする第1及び第2の方法に関するデータを、ランタイムにおいてダイナミックに形成し、格納する工程
を更に備えることを特徴とする方法。 - 請求項7に記載の方法において、
前記第1の方法はトラップ・ルーチンであり、前記第2の方法は明示的チェックであり、前記明示的チェックはインライン・コードを前記プログラムへ挿入することによってインプリメントされることを特徴とする方法。 - 請求項9に記載の方法において、
前記特定の浮動小数点オペレーションが明示的チェックを用いてコンパイルされた時点から所定時間が経過したか否かをチェックする工程と、
前記所定時間が経過している場合、リコンパイルされるべき前記特定の浮動小数点オペレーションを含むモジュールをマークする工程と、
を更に備えることを特徴とする方法。 - 請求項9に記載の方法において、
前記トラップ・ルーチンを開始する工程
を更に備えることを特徴とする方法。 - 請求項9に記載の方法において、
前記特定の浮動小数点オペレーションが明示的チェックを用いてコンパイルされる場合、タイマをセットする工程
を更に備えることを特徴とする方法。 - 請求項9に記載の方法において、
前記特定のインジケータは、前記浮動小数点アンダフローがトラップ・ルーチンを用いて処理される度に、インクリメントされるカウンタであることを特徴とする方法。 - 請求項9に記載の方法において、
どの浮動小数点オペレーションが前記トラップ・ルーチンの実行を引き起こしたかを決定する工程と、
カウンタをインクリメントする工程と、
前記カウンタが所定値を超えている場合、リコンパイルされるべき前記特定の浮動小数点オペレーションを含むモジュールをマークする工程と、
を備えることを特徴とする方法。 - 請求項14に記載の方法において、
前記モジュールがリコンパイルすべくマークされている場合、前記モジュールをリコンパイル・キューへ加える工程を更に含む請求項19に記載の方法。 - 請求項14に記載の方法において、
前記方法がリコンパイルされるべくマークされている場合、前記方法に関連するカウンタをリセットする工程
を更に備えることを特徴とする方法。 - コンピュータ・プログラム内の浮動小数点アンダフローを形成する浮動小数点オペレーションに関連するバイトコード命令をコンパイルする方法をランタイムにおいて決定するコンピュータ・プログラムを格納するコンピュータ読み取り可能媒体であって、
複数の方法でコンパイルされ得る前記浮動小数点オペレーションに関連するバイトコード命令を取り出す機能と、
前記浮動小数点アンダフローに関する判定を受けて、前記バイトコード命令を第1の方法でコンパイルする機能と、
前記浮動小数点オペレーションが浮動小数点アンダフローを形成し得るとき、前記バイトコード命令をコンパイルする第2の方法が望ましいことを、ランタイムにおいて決定する機能と、前記第2の方法は、前記浮動小数点アンダフローに関連する予め定められた条件に基づいて決定されることと、
前記バイトコード命令を前記第2の方法でリコンパイルする機能と、
をコンピュータによって実現させるコンピュータ読み取り可能媒体。 - コンピュータによって実現される、プログラム内の浮動小数点命令を実行するバーチャルマシンシステムであって、
浮動小数点命令が浮動小数点アンダフローを形成し得るか否かを決定する命令インタプリタと、
特定の浮動小数点オペレーションが浮動小数点アンダフローを引き起こした回数を保持する浮動小数点アンダフロー・インジケータと、
前記特定のインジケータ部が所定の基準を満たした時、前記特定の浮動小数点オペレーションを第1の方法を用いてコンパイルし、それ以外の時は、前記特定の浮動小数点オペレーションを第2の方法を用いてコンパイルするコンパイラ
を備え、
前記特定の浮動小数点オペレーションがアンダフローを何回引き起こしたかを決定するために、前記浮動小数点アンダフロー・インジケータがチェックされることを特徴とするバーチャルマシンシステム。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US09/183499 | 1998-10-30 | ||
US09/183,499 US6298477B1 (en) | 1998-10-30 | 1998-10-30 | Method and apparatus for selecting ways to compile at runtime |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2000181724A JP2000181724A (ja) | 2000-06-30 |
JP4748829B2 true JP4748829B2 (ja) | 2011-08-17 |
Family
ID=22673059
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP30965799A Expired - Lifetime JP4748829B2 (ja) | 1998-10-30 | 1999-10-29 | コンパイルする方法をランタイムにおいて選択する方法及び装置 |
Country Status (6)
Country | Link |
---|---|
US (1) | US6298477B1 (ja) |
EP (1) | EP0997816B1 (ja) |
JP (1) | JP4748829B2 (ja) |
CN (1) | CN1255674B (ja) |
CA (1) | CA2287746A1 (ja) |
DE (1) | DE69942385D1 (ja) |
Families Citing this family (40)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6976626B2 (en) * | 1997-09-16 | 2005-12-20 | Metrologic Instruments, Inc. | Wireless bar code symbol driven portable data terminal (PDT) system adapted for single handed operation |
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 |
US7941647B2 (en) | 1999-01-28 | 2011-05-10 | Ati Technologies Ulc | Computer for executing two instruction sets and adds a macroinstruction end marker for performing iterations after loop termination |
US7275246B1 (en) * | 1999-01-28 | 2007-09-25 | Ati International Srl | Executing programs for a first computer architecture on a computer of a second architecture |
US8074055B1 (en) | 1999-01-28 | 2011-12-06 | Ati Technologies Ulc | Altering data storage conventions of a processor when execution flows from first architecture code to second architecture code |
US8127121B2 (en) | 1999-01-28 | 2012-02-28 | Ati Technologies Ulc | Apparatus for executing programs for a first computer architechture on a computer of a second architechture |
US6954923B1 (en) | 1999-01-28 | 2005-10-11 | Ati International Srl | Recording classification of instructions executed by a computer |
US8065504B2 (en) | 1999-01-28 | 2011-11-22 | Ati International Srl | Using on-chip and off-chip look-up tables indexed by instruction address to control instruction execution in a processor |
US7111290B1 (en) * | 1999-01-28 | 2006-09-19 | Ati International Srl | Profiling program execution to identify frequently-executed portions and to assist binary translation |
GB9921720D0 (en) * | 1999-09-14 | 1999-11-17 | Tao Group Ltd | Loading object-oriented computer programs |
US6904594B1 (en) * | 2000-07-06 | 2005-06-07 | International Business Machines Corporation | Method and system for apportioning changes in metric variables in an symmetric multiprocessor (SMP) environment |
US6973646B1 (en) * | 2000-07-21 | 2005-12-06 | International Business Machines Corporation | Method for compiling program components in a mixed static and dynamic environment |
JP2002169696A (ja) * | 2000-12-04 | 2002-06-14 | Mitsubishi Electric Corp | データ処理装置 |
EP1360584A1 (en) * | 2001-02-12 | 2003-11-12 | Trimedia Technologies, Inc. | An optimized dynamic bytecode interpreter |
US6966057B2 (en) * | 2001-03-30 | 2005-11-15 | Intel Corporation | Static compilation of instrumentation code for debugging support |
US6968546B2 (en) * | 2001-03-30 | 2005-11-22 | Intel Corporation | Debugging support using dynamic re-compilation |
US7418344B2 (en) * | 2001-08-02 | 2008-08-26 | Sandisk Corporation | Removable computer with mass storage |
US6993755B1 (en) * | 2001-10-24 | 2006-01-31 | Sun Microsystems, Inc. | Dynamic compilation control |
WO2003050674A1 (en) * | 2001-12-07 | 2003-06-19 | Dbase, Inc. | Drag-and-drop dynamic distributed object model |
US7340730B2 (en) * | 2002-03-18 | 2008-03-04 | Sun Microsystems, Inc. | On demand, network accessible, run time compile server |
US7272827B2 (en) | 2002-04-03 | 2007-09-18 | International Business Machines Corporation | Statically detecting externally referenced interfaces of a program |
US20040044988A1 (en) * | 2002-08-29 | 2004-03-04 | Schene Christopher Robin | Generation of compiled code for simulator speed up |
US7143396B2 (en) * | 2002-11-06 | 2006-11-28 | Sun Microsystems, Inc. | System and method for measuring code segment performance |
US7290254B2 (en) * | 2003-03-25 | 2007-10-30 | Intel Corporation | Combining compilation and instruction set translation |
US7617490B2 (en) * | 2003-09-10 | 2009-11-10 | Intel Corporation | Methods and apparatus for dynamic best fit compilation of mixed mode instructions |
US8079034B2 (en) * | 2003-09-15 | 2011-12-13 | Intel Corporation | Optimizing processor-managed resources based on the behavior of a virtual machine monitor |
US6925928B2 (en) * | 2003-09-18 | 2005-08-09 | Anthony Fox | Trash compactor for fast food restaurant waste |
US7178131B2 (en) * | 2003-09-29 | 2007-02-13 | International Business Machines Corporation | Inspecting the runtime behavior of a program while minimizing perturbation |
US7340729B2 (en) * | 2003-10-28 | 2008-03-04 | Sap Ag | Reducing recompilation frequency |
US7853934B2 (en) * | 2005-06-23 | 2010-12-14 | Hewlett-Packard Development Company, L.P. | Hot-swapping a dynamic code generator |
US7735061B2 (en) * | 2006-05-03 | 2010-06-08 | Epic Games, Inc. | Efficient encoding and access of mathematically precise variable precision numeric types |
US8296742B2 (en) * | 2006-10-10 | 2012-10-23 | Microsoft Corporation | Automatic native generation |
US9378002B2 (en) * | 2006-12-22 | 2016-06-28 | Core Wireless Licensing S.A.R.L. | System, method, apparatus and computer program product for providing memory footprint reduction |
CN101360088B (zh) * | 2007-07-30 | 2011-09-14 | 华为技术有限公司 | 正则表达式编译、匹配系统及编译、匹配方法 |
US8572579B2 (en) * | 2010-08-19 | 2013-10-29 | Oracle International Corporation | Break on next called function or method in java debugger agent |
US8782645B2 (en) * | 2011-05-11 | 2014-07-15 | Advanced Micro Devices, Inc. | Automatic load balancing for heterogeneous cores |
CN104424009B (zh) * | 2013-09-06 | 2017-10-17 | 华为技术有限公司 | OpenCL程序编译方法和编译器 |
US9547483B1 (en) * | 2015-11-06 | 2017-01-17 | International Business Machines Corporation | Feedback directed optimized compiling of optimized executable code |
US10491524B2 (en) | 2017-11-07 | 2019-11-26 | Advanced Micro Devices, Inc. | Load balancing scheme |
US20190220294A1 (en) * | 2018-01-17 | 2019-07-18 | International Business Machines Corporation | Using lightweight jit compilation for short-lived jvms on parallel distributing computing framework |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH01118931A (ja) * | 1987-11-02 | 1989-05-11 | Hitachi Ltd | プログラム変換方式 |
JPH04273533A (ja) * | 1991-02-28 | 1992-09-29 | Hokkaido Nippon Denki Software Kk | 翻訳プログラムの手続きインライン展開方式 |
CN1068435A (zh) * | 1991-07-10 | 1993-01-27 | 西北大学 | 通用代码——汉字计算机程序设计语言卡 |
US5854932A (en) * | 1995-08-17 | 1998-12-29 | Microsoft Corporation | Compiler and method for avoiding unnecessary recompilation |
JP3313560B2 (ja) * | 1996-01-31 | 2002-08-12 | 株式会社日立製作所 | 浮動小数点演算処理装置 |
JP3339317B2 (ja) * | 1996-07-24 | 2002-10-28 | 日本電気株式会社 | 動的情報利用型プログラム最適化装置 |
US5926832A (en) * | 1996-09-26 | 1999-07-20 | Transmeta Corporation | Method and apparatus for aliasing memory data in an advanced microprocessor |
US5880984A (en) * | 1997-01-13 | 1999-03-09 | International Business Machines Corporation | Method and apparatus for performing high-precision multiply-add calculations using independent multiply and add instruments |
US6078744A (en) * | 1997-08-01 | 2000-06-20 | Sun Microsystems | Method and apparatus for improving compiler performance during subsequent compilations of a source program |
US5960202A (en) * | 1997-10-31 | 1999-09-28 | Hewlett Packard Company | Method and apparatus for automatically logging compiler options and/or overriding compiler options |
JP3377419B2 (ja) * | 1997-11-11 | 2003-02-17 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 命令列生成方法及び装置、変換方法、及びコンピュータ |
JPH11194959A (ja) * | 1997-12-26 | 1999-07-21 | Nec Corp | コンパイル方法もしくはコンパイルプログラムを記録したコンピュータ読みとり可能な記憶媒体 |
-
1998
- 1998-10-30 US US09/183,499 patent/US6298477B1/en not_active Expired - Lifetime
-
1999
- 1999-10-27 EP EP99308510A patent/EP0997816B1/en not_active Expired - Lifetime
- 1999-10-27 DE DE69942385T patent/DE69942385D1/de not_active Expired - Lifetime
- 1999-10-29 JP JP30965799A patent/JP4748829B2/ja not_active Expired - Lifetime
- 1999-10-29 CA CA002287746A patent/CA2287746A1/en not_active Abandoned
- 1999-10-30 CN CN99126635.8A patent/CN1255674B/zh not_active Expired - Lifetime
Also Published As
Publication number | Publication date |
---|---|
US6298477B1 (en) | 2001-10-02 |
JP2000181724A (ja) | 2000-06-30 |
CN1255674B (zh) | 2010-06-23 |
EP0997816A2 (en) | 2000-05-03 |
EP0997816B1 (en) | 2010-05-19 |
CA2287746A1 (en) | 2000-04-30 |
CN1255674A (zh) | 2000-06-07 |
DE69942385D1 (de) | 2010-07-01 |
EP0997816A3 (en) | 2003-08-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4748829B2 (ja) | コンパイルする方法をランタイムにおいて選択する方法及び装置 | |
US6324686B1 (en) | Just in time compiler technique | |
EP1232430B1 (en) | Optimization of n-base typed arithmetic expressions | |
US6233678B1 (en) | Method and apparatus for profiling of non-instrumented programs and dynamic processing of profile data | |
JP4398538B2 (ja) | 命令セット内の命令に応答してプロセスを実行するデータ処理システムおよびその命令処理方法 | |
US6553565B2 (en) | Method and apparatus for debugging optimized code | |
US6192516B1 (en) | Interpreter generation and implementation utilizing interpreter states and register caching | |
Yellin et al. | The java virtual machine specification | |
JP2005018760A (ja) | アプリケーションのプロファイリングを容易にするシステムおよび方法 | |
US20040244009A1 (en) | Inline database for receiver types in object-oriented systems | |
US7007198B2 (en) | Method for handling exceptions of applications | |
US7721275B2 (en) | Data-flow based post pass optimization in dynamic compilers | |
US5278985A (en) | Software method for implementing dismissible instructions on a computer | |
US6604167B1 (en) | Method and apparatus traversing stacks for just-in-time compilers for Java virtual machines | |
Fog | Optimizing software in C++ | |
US11204767B2 (en) | Context switching locations for compiler-assisted context switching | |
US8091077B1 (en) | System and method for handling rare events by modification of executable code | |
He et al. | Improving the performance of program monitors with compiler support in multi-core environment | |
JP2006164294A (ja) | Jitコンパイラを備えた仮想計算機 | |
US20050240914A1 (en) | Portable just-in-time compilation in managed runtime environments | |
Beebe et al. | The floating-point environment | |
von Mayrhauser et al. | Teaching engineering disciplines to tool developers | |
Miranda et al. | A Sketch for an Adaptive Optimizer for Smalltalk written in Smalltalk | |
Darcy et al. | Analysis of “Proposal for Extension to Java Floating Point Semantics, Revision 1” | |
Siemers et al. | The Perm architecture approach: Supporting embedded system development |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20061024 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20100126 |
|
A601 | Written request for extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20100426 |
|
A602 | Written permission of extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20100430 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20100721 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20101124 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20110324 |
|
A911 | Transfer to examiner for re-examination before appeal (zenchi) |
Free format text: JAPANESE INTERMEDIATE CODE: A911 Effective date: 20110329 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20110426 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20110517 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 Ref document number: 4748829 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20140527 Year of fee payment: 3 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
EXPY | Cancellation because of completion of term |