JP4562918B2 - インタプリティブ・ランタイム環境のためのコンパイル・プログラムの生成 - Google Patents

インタプリティブ・ランタイム環境のためのコンパイル・プログラムの生成 Download PDF

Info

Publication number
JP4562918B2
JP4562918B2 JP2000592733A JP2000592733A JP4562918B2 JP 4562918 B2 JP4562918 B2 JP 4562918B2 JP 2000592733 A JP2000592733 A JP 2000592733A JP 2000592733 A JP2000592733 A JP 2000592733A JP 4562918 B2 JP4562918 B2 JP 4562918B2
Authority
JP
Japan
Prior art keywords
byte code
runtime
program
code
runtime environment
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2000592733A
Other languages
English (en)
Other versions
JP2002534735A5 (ja
JP2002534735A (ja
Inventor
ソーントリー,デーヴィッド・エム
ギルバート,マーク
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Original Assignee
Microsoft Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of JP2002534735A publication Critical patent/JP2002534735A/ja
Publication of JP2002534735A5 publication Critical patent/JP2002534735A5/ja
Application granted granted Critical
Publication of JP4562918B2 publication Critical patent/JP4562918B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators

Description

【0001】
(発明の分野)
本発明は、一般的に、インタプリティブ・ランタイム(interpretive runtime)環境に関し、更に特定すれば、インタプリティブ・ランタイム環境における実行のためのコンパイル言語のコード生成に関する。
【0002】
(著作権に関する注意/許諾)
本特許文書の開示の一部は、著作権保護の対象となる資料を含む。著作権所有者は、特許商標庁の特許ファイルまたは記録に見られる、特許文書または特許開示のファクシミリ複製については、いずれの人によるものであっても異議を唱えないが、それ以外の場合、あらゆる著作権を保存することとする。以下の告示は、以下に記載するソフトウエア・およびデータ、ならびに図面にも適用される。著作権c1997, Microsoft Corporation, All Rights Reserved.
【0003】
(発明の背景)
インタプリト言語(interpreted language)は、こん様々なハードウエア・プラットフォーム間で移植可能なコンピュータ・プログラムを作成するために、広く用いられている。同じインタプリト言語のプログラムは、異種のコンピュータ間で容易に移動することができ、インタプリテーション(interpretation)を実行するランタイム環境のみを、基礎のハードウエアに合わせて構成すればよい。
【0004】
このインタプリト言語の有効性は、その最大の欠点でもある。インタプリト言語で書かれたプログラムは、同じコンピュータ上でコンパイル言語で書かれた同じプログラムよりも、実行がはるかに遅い。この問題に対する以前の解決策は全て大きな欠点を含んでいる。
【0005】
例えば、インタプリト言語の命令を、特定のハードウエアにネーティブな言語の同等の命令に変換するネーティブ・コード・コンパイラが実現されている。そして、このネーティブ・コード・プログラムを実行する。しかしながら、コンパイルしたネーティブ・コード・プログラムはインタプリト・ランタイム環境では実行しないので、ランタイム環境によって与えられるあらゆる機能がこのプログラムには使用できない。また、このようなプログラムは、インタプリト言語プログラムよりもかなり大きい場合が多く、最少構成コンピュータにおいてリソースの問題が生ずる。
【0006】
別の手法として、インタプリト言語プログラム全体を、同じ機能を行なうコンパイル言語のプログラムに変換することがあげられる。このような処理は、実現するのが非常に複雑であり、コンパイル・コードが非効率的となることがわかった。
【0007】
したがって、対応するランタイム環境の機能にアクセスすることができ、しかもインタプリト言語プログラムの処理能力を向上させ、システム・リソースを交流させるようにこれを行なう方法が求められている。
【0008】
(発明の概要)
本発明は、前述の短所、欠点および問題に取り組むものであり、以下の明細書を読み、検討することによって理解されよう。
【0009】
ランタイム環境外部で実行するインライン・コード生成部は、当該ランタイム環境のためのインタプリタのインナループ(innerloop)の処理を再生する。インライン・コード生成部は、インタプリト言語のプログラムを処理し、コンパイル言語の対応するプログラムを生成する。基礎のハードウエアに特定的な標準的コンパイラを用いて、コンパイル言語プログラムをネーティブ言語プログラムにコンパイルする。ネーティブ言語プログラムは、ランタイム環境のフレームワーク内で動作するので、ランタイム環境が備える関数およびルーチンは、ネーティブ言語プログラムにも使用可能である。
【0010】
インライン・コード生成部は、インナループの処理時間をコード生成部にエクスポートすることによって、インタプリタ・コード・プログラムの実行に伴うオーバーヘッドを解消する。インライン・コード生成部は、既存のインタプリト言語プログラムを入力として受け入れるので、これらのプログラムによって得られる移植性の利点を保持しつつ、同時に、これらのプログラムを特定のコンパイラ上で走らせる場合、これらを最適化することができる。更に、得られるネーティブ言語プログラムはランタイム環境のフレームワーク内で動作するので、ランタイム環境が備える関数およびルーチンは、ネーティブ言語プログラムにも使用可能である。
【0011】
本発明では、種々の範囲のシステム、クライアント、サーバ、メソッド、およびコンピュータ読み取り可能媒体について記載する。この概要に記載した本発明の態様および利点に加えて、本発明の更に別の態様および利点は、図面を参照し、以下に続く詳細な説明を読むことによって明白となろう。
(発明の詳細な説明)
以下の本発明の実施形態の一例に関する詳細な説明では、その一部をなす添付図面を参照する。図面には、本発明を実施可能な具体的な実施形態の例が、例示として示されている。これらの実施形態は、当業者が本発明を実施することができるように、十分に詳細に記載されており、更にその他の実施形態も利用可能であり、論理的、機械的、電気的およびその他の変更は本発明の精神や範囲を逸脱することなく可能であることは理解されよう。したがって、以下の説明は、限定的な意味で捕えるべきではなく、本発明は、添付した特許請求の範囲によってのみ規定されるものとする。
【0012】
詳細な説明は5つの章に別れている。第1章では、本発明の実施形態を実現可能なハードウエアおよび動作環境について説明する。第2章では、本発明のシステム・レベルの概要を提示する。第3章では、本発明の実施形態の一例に対する方法を提供する。第4章では、本発明の特定的なJava(登録商標)実施態様について説明する。最後に、第5章では、詳細な説明の結論を述べる。
(ハードウエアおよび動作環境)
図1は、本発明の実施形態を実現可能なハードウエアおよび動作環境の図である。図1の説明は、本発明を実現するのに適したコンピュータ・ハードウエアおよび計算機環境の端的な全体的説明を行なうことを意図している。必ずしもその必要はないが、本発明の説明は、パーソナル・コンピュータのようなコンピュータが実行する、プログラム・モジュールのような一般的なコンピュータ実行可能命令に関連して行なう。一般に、プログラム・モジュールは、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造等を含み、特定のタスクを実行したり、あるいは特定の抽象的データ・タイプを実装する。
【0013】
更に、本発明は、別のコンピュータ・システム構成でも実施可能であることを当業者は認めよう。別のコンピュータ・システム構成には、ハンド・ヘルド・デバイス、マルチプロセッサ・システム、マイクロプロセッサ系電子機器またはプログラマブル消費者電子機器、ネットワークPC、ミニコンピュータ、メインフレーム・コンピュータ等が含まれる。また、本発明は、分散型計算機環境においても実施可能であり、この場合、通信ネットワークを通じてリンクされたリモート処理デバイスによってタスクを実行する。分散型計算機環境では、プログラム・モジュールは、ローカルおよびリモート・メモリ記憶装置双方に位置することができる。
【0014】
図1の本発明を実現するハードウエアおよび動作環境の一例は、コンピュータ20の形態の汎用計算機を含む。このコンピュータ20は、演算装置21、システム・メモリ22、およびシステム・メモリ22から演算装置21までを含む種々のシステム・コンポーネントを結合するシステム・バス23を含む。演算装置21は、1つのみでもよく、あるいは1つよりも多い演算装置21があってもよく、コンピュータ20のプロセッサは、単一の中央演算装置(CPU)、または一般に並列処理環境と呼ばれる、複数の演算装置を備えることができる。コンピュータ20は、従来のコンピュータ、分散型コンピュータ、またはその他のいずれの形式のコンピュータでもよく、本発明はこれに限定されることはない。
【0015】
システム・バス23は、数種類のバス構造のいずれでもよく、メモリ・バスまたはメモリ・コントローラ、周辺バス、および種々のバス構造のいずれかを用いたローカル・バスが含まれる。システム・メモリは、単純にメモリと呼んでもよく、リード・オンリ・メモリ(ROM)24およびランダム・アクセス・メモリ(RAM)25を含む。基本入出力システム26(BIOS)は、起動中のように、パーソナル・コンピュータ20内のエレメント間におけるデータ転送を補助する基本的なルーティンを含み、RAM24内に格納されている。更に、パーソナル・コンピュータ20は、図示しないハード・ディスクの読み書きを行なうハード・ディスク・ドライブ27、リムーバブル磁気ディスク29の読み書きを行なう磁気ディスク・ドライブ28、CD ROMまたはその他の光媒体のようなリムーバブル光ディスク31の読み書きを行なう光ディスク・ドライブ30も含む。
【0016】
ハード・ディスク・ドライブ27、磁気ディスク・ドライブ28、および光ディスク・ドライブ30は、それぞれ、ハード・ディスク・ドライブ・インターフェース32、磁気ディスク・ドライブ・インターフェース33、および光ドライブ・インターフェース34を介して、システム・バス23に接続されている。ドライブおよびそれに関連するコンピュータ読取可能媒体は、コンピュータ読取可能命令、データ構造、プログラム・モジュールおよびコンピュータ20のその他のデータの不揮発性格納を行なう。磁気カセット、フラッシュ・メモリ・カード、ディジタル・ビデオ・ディスク、ベルヌーイ・カートリッジ、ランダム・アクセス・メモリ(RAM)、リード・オンリ・メモリ(ROM)等のように、コンピュータによるアクセスが可能なデータを格納することができる、別の形式のコンピュータ読取可能媒体も、動作環境例では使用可能であることは、当業者には認められよう。
【0017】
ハード・ディスク、磁気ディスク29、光ディスク31、ROM24またはRAM25上には、多数のプログラム・モジュールを格納可能であり、オペレーティング・システム35、1つ以上のアプリケーション・プログラム36、その他のプログラム・モジュール37、およびプログラム・データ38を含む。ユーザは、キーボード40およびポインティング・デバイス42のような入力デバイスによって、コマンドおよび情報をパーソナル・コンピュータ20に入力することができる。他の入力デバイス(図示せず)は、マイクロフォン、ジョイスティック、ゲーム・パッド、衛星ディッシュ、スキャナ等を含むことができる。これらおよびその他の入力デバイスは、多くの場合、システム・バス23に結合するシリアル・ポート・インターフェース46のような周辺ハードウエア・デバイスを介して、演算装置21に接続されるが、パラレル・ポート、ゲーム・ポートまたはユニバーサル・シリアル・バス(USB)のようなその他のインターフェースによって接続することも可能である。また、ビデオ・アダプタ48のようなインターフェースを介して、モニタ47またはその他の種類のディスプレイ装置もシステム・バス23に接続されている。モニタに加えて、パーソナル・コンピュータは、通常、スピーカおよびプリンタのような、その他の周辺出力デバイス(図示せず)を含む。
【0018】
コンピュータ20は、リモート・コンピュータ49のような1つ以上のリモート・コンピュータへの論理接続を用いれば、ネットワーク環境においても動作可能である。これらの論理接続は、コンピュータ20に結合した通信デバイスまたはコンピュータ20の一部によって行われ、本発明は、特定の形式の通信デバイスに限定されることはない。リモート・コンピュータ49は、別のパーソナル・コンピュータ、サーバ、ルータ、ネットワークPC、クライアント、ピア・デバイス、またはその他の共通ネットワーク・ノードとすることができ、典型的に、コンピュータ20に関して先に述べたエレメントの多くまたは全てを含むが、図1にはメモリ記憶装置50のみを図示している。図1に示す論理接続は、ローカル・エリア・ネットワーク(LAN)51およびワイド・エリア・ネットワーク(WAN)52を含む。このようなネットワーク環境は、会社全域に及ぶコンピュータ・ネットワーク、イントラネットおよびインターネットでは一般的である。
【0019】
LANネットワーク環境で用いる場合、コンピュータ20は、ネットワーク・インターフェースまたはアダプタ53を介してローカル・ネットワーク51に接続する。WANネットワーク環境で用いる場合、コンピュータ20は、典型的に、モデム54、またはインターネットのようなワイド・エリア・ネットワーク52を通じて通信を確立するその他の形式の通信デバイスを含む。モデム54は、内蔵でも外付けでもよく、シリアル・ポート・インターフェース46を介してシステム・バス23に接続する。ネットワーク環境では、パーソナル・コンピュータ20に関して図示したプログラム・モジュールまたはその一部は、ローカルまたはリモートメモリ記憶装置に格納することができる。尚、図示のネットワーク接続は一例であり、コンピュータ間に通信リンクを確立する別の手段も使用可能であることは認められよう。
【0020】
以上、本発明の実施形態を実現可能なハードウエアおよび動作環境について説明した。本発明を実現可能なコンピュータは、従来のコンピュータ、分散型コンピュータ、またはその他のいずれの形式のコンピュータとすることもでき、本発明はこれに限定されることはない。このようなコンピュータは、通常、1つ以上の演算装置をそのプロセッサとして含み、コンピュータ読み取り可能媒体をメモリとして含む。また、コンピュータは、ネットワーク・アダプタまたはモデムのような通信デバイスも含むことができるので、他のコンピュータと結合し通信することができる。
(システム・レベルの概要)
本発明の実施形態の一例の動作のシステム・レベルでの概要について、図2Aないし図2Cを参照しながら説明する。
【0021】
図2Aは、図1のコンピュータ20のようなコンピュータにおいて、ランタイム環境で実行する、汎用コンピュータ言語インタプリタ200の論理ブロック図を示す。インタプリタ200は、一般に「バイト・コード」と呼ばれるインタプリト言語の命令を、ランタイム環境にネーティブな言語の命令として実行させる。一般に、バイト・コードおよびインタプリト言語コードは、「ランナブル」コード(runnable code)と呼ばれる。何故なら、これらは、コンパイルする必要なく、コンピュータによって実行されるからである。同様に、機械言語コードのようなネーティブ言語コードも、ランナブル・コードである。
【0022】
インタプリト言語で書いたプログラムをランタイム環境で走らせると、インタプリタ200は、プログラムの各バイト・コードを読み取り、バイト・コード型に特定のルーチンに分岐する(論理ブロック201)。次いで、インタプリタは、バイト・コードが指定する動作を実行する、ネーティブ言語命令または命令セットを実行する。プログラム内のバイト・コード全てを走らせ終わるまで、このプロセスを繰り返す。
【0023】
「ジャスト・イン・タイム」(JIT)コンパイラ210と呼ばれる、異なる形式のインタプリタを図2Bに示す。各バイト・コードをインタプリトしその動作を直ちに実行する代わりに、JIT210は、プログラム内のバイト・コード全てを、ネーティブ言語での同等の命令に変換する(論理ブロック211および212)。次いで、これらの命令をネーティブ言語プログラムに集合化し(論理ブロック213)、実行する(論理ブロック214)。論理ブロック211および212を纏めてJITコンパイラの「インナループ」と呼ぶ。
【0024】
図2Cは、ランタイム環境221外部で実行するインライン・コード生成部220を示し、JITコンパイラ210のインナループの処理を再生する。バイト・コード・プログラム222をインライン・コード生成部220に入力し、コンパイル言語223での対応するプログラムを生成する。次いで、コンパイラ224を用いて、コンパイル言語のプログラム223を、ネーティブ言語のプログラム225にコンパイルする。ネーティブ言語プログラム225をランタイム環境221によって実行すると、JITコンパイラによって生成したように見える。ネーティブ言語プログラム225はランタイム環境221の実行フレームワーク内で動作するので、ランタイム環境221によって与えられる関数およびルーチンは、インライン・コード生成部220およびランタイム環境221の間にある破線の接続で示すように、ネーティブ言語プログラム225にも使用可能である。更に、コンパイラ224はコンピュータに特定しているので、生成したコードを最適化し、冗長な命令を除去し、ハードウエアに対して追加のコード最適化を行なうことができる。
【0025】
例示の一実施形態では、インライン・コード生成部220は、Cのような上位コンパイル言語に対するソース・コード命令を出力し、コンパイラ224はその言語に特定的となる。
【0026】
実施形態の別の一例では、インライン・コード生成部220は、コンパイラ中間言語の命令を出力する。コンパイラ中間言語は、言語特定コンパイラ・ロジックとハードウエア特定コンパイラ・ロジックとの間で通信を行なうために用いられる。インライン・コード生成部によって生成された中間言語命令は、適切なハードウエア特定コンパイラ・ロジック、即ち、コンパイラ224に渡され、ネーティブ言語のプログラムを生成する。
【0027】
詳細な説明のこの章では、本発明の実施形態の一例の動作について、システム・レベルでの概要を説明した。インライン・コード生成部は、ランタイム環境外部のJITコンパイラのインナループを実現し、インタプリト・コード・プログラムの実行に伴うオーバーヘッドを解消する。インライン・コード生成部は、既存のインタプリト言語プログラムを入力として受け入れるので、これらのプログラムによって与えられる移植性の利点を確保しつつ、同時に、これらのプログラムを特定のコンピュータで走らせるときに、その実行を最適化する。更に、インライン・コード生成部は、ランタイム環境がエクスポートするあらゆる関数をも利用するコードを生成する。本発明は、インタプリト・インナループのいずれの特定的な実施形態にも限定されないが、明確化のために、JITコンパイラ・インナループの上位機能について説明した。
【0028】
(本発明の実施形態の一例の方法)
直前の章では、本発明の実施形態の一例の動作について、システム・レベルの概要を説明した。この章では、このような実施形態の一例を実行するコンピュータが処理する個々の方法について、一連のフローチャートを参照しながら、説明する。処理する方法は、コンピュータ実行可能命令で構成されたコンピュータ・プログラムから成る。フローチャートを参照しながらこれらの方法を説明することにより、当業者は、このような命令を含むこのようなプログラムを開発し、適当なコンピュータ(コンピュータ読み取り可能媒体からの命令を実行するコンピュータのプロセッサ)上で本方法を実行することが可能となる。
【0029】
最初に図3を参照すると、コンピュータがインライン・コード生成部220を実行する際に行われる行為が示されている。ブロック301において開始し、プログラム中最初のバイト・コードが読み込まれる。以下で更に詳細に説明するが、バイト・コードに一意のラベルを生成する(ブロック302)。バイト・コード型を判定し(ブロック303)、このバイト・コードをそれと同等のコンパイル言語命令または命令セットに変換する(ブロック304)。インライン・コード生成部300は、全てのバイト・コードを変換し終えるまで、プログラム内の各バイト・コードを処理し続ける(ブロック305)。当業者には直ちに理解されようが、ブロック304で生成する命令型は、インライン・コード生成部がコンパイル言語のソース・コードまたはコンパイラ中間コードのどちらを出力しているのかによって異なる。
【0030】
殆どのバイト・コード・プログラムでは、ロジックが、シーケンス外のバイト・コードにジャンプする必要がある場合、分岐命令に対して目標バイト・コードのオフセットを指定する分岐命令を用いる。インライン・コード生成部300は、バイト・コード毎にラベルを作成するので、ブロック304は、分岐命令内のオフセット値を、目標バイト・コードのラベルに変換する。一実施形態では、ブロック302で生成する各ラベルは、プログラムの先頭に対するそのオフセットを含む。インライン・コード生成部は、分岐命令内に指定されている相対的オフセットを、分岐命令のラベル内のオフセットから減算し、目標バイト・コードのラベルを計算する。全てのラベルを管理するアレイを用いる等、元のバイト・コードを同等の命令に対して生成したラベルと等価にする別の方法も、当業者には容易にわかるであろう。図3に破線で示す代替実施形態の一例では、コード生成部は、全てのバイト・コードを変換した後に、未使用ラベルを「削除」し(ブロック306)、最終的に生成した命令が参照するラベルのみを残す。
【0031】
直前の章で説明したように、ブロック304で生成したコードは、ランタイム環境がエクスポートする、あらゆるグローバル変数および/または関数にアクセスすることができる。
【0032】
本発明の実施形態の一例を実行するコンピュータによって実行する個々の方法について説明した。これらの方法について、ステップ310から306までの全てを含むフローチャートを参照しながら示した。
(Java(登録商標)仮想機械実施態様)
詳細な説明のこの章では、Java(登録商標)仮想機械(JVM:Java(登録商標) Virtual Machine)のMicrosoft Corporation(マイクロソフト社)の実施態様である、本発明の特定的な実施態様について説明する。
【0033】
図4は、JVM402に関連する本発明のインライン・コード生成部401の実施形態の一例を示す。JVM402は、3つの主要構成要素から成る。即ち、Java(登録商標)インタプリタ403、Java(登録商標) JITコンパイラ404、およびランタイム・システム405である。JVMはスタック系システムであるので、ランタイム・システム402内において実行するプログラムが作成するオブジェクトは全て、スタック406に格納される。定数プール407がプログラムの変数を与える。スタック406および定数プール407双方は、ランタイム・システム405によって管理されている。また、ランタイム・システム402は、もはや使用しないオブジェクトの背景ガベージ・コレクションのような、特殊関数408も備えている。
【0034】
Java(登録商標)プログラマは、Java(登録商標)ソース・コード(「Java(登録商標)」ファイル)409内のオブジェクトに作用するオブジェクトおよびメソッドを作成し、Java(登録商標)ファイル409をJava(登録商標)コンパイラ410に渡す。Java(登録商標)コンパイラ410は、Java(登録商標)バイト・コード(「クラス」ファイル)411を生成する。インライン・コード生成部401を用いる場合、クラス・ファイル411、およびクラス・ファイル411が参照するメソッドを収容するあらゆるJava(登録商標)クラス・ライブラリがコード生成部402に渡される。コンパイル言語コードが、コード生成部402によって発生され、ハードウエア特定コンパイラ413に渡され、実行可能ファイル(DLL0414)を生成する。
【0035】
ランタイム・システム405内で実行するプログラムによって外部メソッドが読み出された場合、JVM402は、そのメソッドがバイト・コード・クラス・ファイルまたは実行可能DLLファイルのどちらにあるか判定を行なう。これについては、以下で更に詳細に説明する。メソッドがクラス・ファイルにある場合、JVM402はそのクラス・ファイル411を、必要なクラス・ライブラリ412と共に、Java(登録商標)インタプリタ403またはJava(登録商標) JITコンパイラ404のいずれかに導出し、実行可能コードに変換する。次いで、実行可能コードは、実行のためにランタイム・システム405に導出される。一方、メソッドが、インライン・コード生成部401から生成されたDLLファイルにある場合、JVM402は単にDLLファイル414をランタイム・システム405に導出し、実行する。
【0036】
また、JVM402は、あるランタイム・システム変数およびメソッドをコード生成部401にエクスポートし、DLLファイル414内の実行可能コードがJVM402の状態を取得し、操作できるようにする。
【0037】
以下の表1は、Java(登録商標)バイト・コードのサブセットに対してJITコンパイラ404のインナループが生成したC言語の命令を示す。このC言語の命令は、スタック406、定数プール407、メソッド408、およびJVM402がエクスポートした、ランタイム・システム405内のローカル変数に対するポインタを含む。インナループは次のようにコード化される。
【0038】
【表1】
Figure 0004562918
一例として、以下のJava(登録商標)バイト・コード・プログラムを用いると、
【0039】
【表2】
Figure 0004562918
コード生成部401は、次のC言語プログラムを生成する。
【0040】
【表3】
Figure 0004562918
実行可能コード414はJVM402の外側で作成されるので、JVM402は、ランタイムにJITコンパイラ404のインナループ全体を通過する必要がなく、このためJITコンパイラ404を通過する同一のバイト・コード・プログラムに対して処理能力が大幅に向上する。 更に、定数ループ407は、コード生成部401によって具体的にコード化されるので、コンパイラ413は、性質上汎用的なコードを出力するJITコンパイラ404よりも、C言語プログラムのその部分に対して効率的なコードを生成する。コンパイラ413が最適化Cコンパイラである代替実施形態の一例では、バイト・コード同等命令の数が、最少のコンパイル命令セットに減少する。
【0041】
Java(登録商標)バイト・コードの中には、JVM402にコール・バックしなければならないものもあるので、C言語命令のみで表すことはできない。結果的に生成されたコードを、INVOKESTATIC<index>バイト・コードとして、表1に示す。これは、別のJava(登録商標)メソッドへのコールを実行する。生成されたコードは、最初にFindMethodをコールし、JVM402によって露出されたメソッド(pMethod)に対するポインタを得なければならない。次いで、生成されたコードは、エクスポートされたメソッド、ExecuteStaticMethodをコールし、呼び出したメソッドを実行し、更にLookUpExceptionをコールし、実行によって生ずるあらゆる例外を処理しなければならない。代替実施形態の一例では、ExecuteStaticMethodおよびLookUpException双方に対する命令は、INVOKESTATICに対してC言語コードでインラインで生成される。
【0042】
JVM402の実施形態の一例では、2つのフラグ、即ち、各メソッド毎のネーティブ・メソッド・フラグ501およびJITフラグ502が、当該メソッドの「状態」を示す。フラグ501、502は、クラスの内部メモリ内表現に格納することができ、あるいはデータ・ファイル内に永続させることができる。フラグを収容するデータ構造の一例を図5に示す。JVM402は、フラグ501、502を用いて、ランタイム・システム405内で呼び出されたメソッドをどのようにロードするか決定する。
【0043】
いずれのフラグもセットされていない場合、JVM402はそのメソッドに対するバイト・コードをロードし、インタプリタ403またはJITコンパイラ404のいずれかをコールして、コードを処理する。この場合は、Java(登録商標)コールに対するJava(登録商標)を表す。
【0044】
ネーティブ・メソッド・フラグのみがセットされている場合、JVM402は対応するDLLをロードし、DLL全体を探索して、呼び出したメソッドへのエントリ・ポイントを求め、JNIまたはRNIのようなネーティブ・メソッド・インターフェースによって、このメソッドをコールする。この場合は、「インポート」コードへのコールとして処理される。
【0045】
JITフラグのみがセットされている場合、JVM404は、メソッドが既に機械コードにコンパイルされていると認識し、対応するDLLファイル内にあるメソッドのエントリ・ポイントに直接ジャンプし、適切なコードを実行する。本発明を用いて生成しコンパイルした実行可能コードは、このように処理される。
【0046】
各メソッドの状態を維持するために使用可能な他のロケーションは、当業者には容易に明らかとなろう。例えば、代替実施形態の一例では、各メソッドの状態は、対応するクラス・ファイル自体の中に格納されている。別の代替実施形態の一例では、メソッドのエントリ・ポイントを指し示す秘密データ集合を維持する、J/Direct拡張子を用いる。
【0047】
この章は、Java(登録商標)バイト・コードをコンパイル言語の同等の命令に変換するインライン・コード生成部について記載した。コンパイル言語の命令は、次にコンパイラに渡され、コンパイラは実行可能な機械後コードを生成する。すると、実行可能コードは現Java(登録商標)ランタイム・システムによって直接コールすることができ、これはインタプリト・バイト・コードのスタック動作の全てに従うので、既存のガベージ・コレクタおよびその他のランタイム機能が通常通りに動作する。実行可能コードは、関数コールが行われたときまたは例外が生じたときに、それが実行しているのは何の等価バイト・コードであるかというJVMの情報を更新するだけでよい。このため、そして基本的なスタック動作はコンパイラによってレジスタを用いるために最適化することができるため、インライン・コード生成部は、インタプリタまたはJITコンパイラよりもはるかに、Java(登録商標)バイト・コードの実行を高速化する。
(結論)
以上、インライン・コード生成部について説明した。ここでは、具体的な実施形態を示し説明したが、提示した具体的な実施形態の代わりに、同一目的を達成するために想起されるあらゆる構成が使用可能であることを当業者は認めよう。本願は、本発明のあらゆる適応化または変形も包含することを意図するものである。
【0048】
例えば、全てのJava(登録商標)仮想機械はスタックに基づくが、JVMの全てが先の章に記載した定数プールを有する訳ではないことを当業者は認めよう。「定数プール」という用語は、定数を保持する使用可能な変数のあらゆる集合に適用することができるので、定数プールと同等の構造は、クラス・ファイル内に実装し、ロード時にハッシュ・テーブルにデコードする変数ストアを含む。
【0049】
更に、異なるランタイム環境は、異なるメソッド、即ち、例外処理、メソッドの呼び出し、および/またはメモリ割り当てをエクスポートし、これらは生成されたコードによって利用可能であることも、当業者は認めよう。したがって、インタプリタまたはJITコンパイラによって作成されたコードと同様に、生成されたコードは、ランタイム環境に特定的であり、インライン・コード生成部を実現するランタイム環境に固有の制限によってのみ限定される。
【0050】
本願において用いた用語は、全てのランタイム環境、過去、現在そして未来のランタイム環境を含むことを意味する。したがって、本発明は、以下の特許請求の範囲およびその均等物によってのみ限定されることを意図するのは一目瞭然である。
【図面の簡単な説明】
【図1】 図1は、本発明の実施形態を実施可能なハードウエアおよび動作環境を示す図である。
【図2】 図2Aは、本発明の実施形態の一例のシステム・レベルの概要を示す図であり、
図2Bは、本発明の実施形態の一例のシステム・レベルの概要を示す図であり、
図2Cは、本発明の実施形態の一例のシステム・レベルの概要を示す図である。
【図3】 図3は、本発明の実施形態の一例にしたがって、クライアントが実行する方法のフローチャートである。
【図4】 図4は、本発明のJava(登録商標)による実施形態の一例を示すシステム・レベルの図である。
【図5】 図5は、本発明の実施形態の一例において用いる方法状態データ構造の図である。

Claims (11)

  1. システム・バス(23)により結合されたプロセッサ(21)とシステム・メモリ(22)を備えるコンピュータ・システムにおいてインタプリト言語のプログラムを実行する方法であって、前記システム・メモリ(22)には、前記プログラムを実行するためのランタイム環境(402)を提供する命令が格納されており、前記ランタイム環境は、
    i)スタック(406)、定数プール(407)及びメソッド(408)を含み、前記メソッドを実行するランタイム・システム(405)と、
    ii)ランタイム・インタプリタ(403)と、
    iii)ランタイム・コンパイラ(404)
    を含み、
    前記方法は、
    前記ランタイム環境へエントリする前に、前記プロセッサが、前記インタプリト言語のソース・コード(409)をバイト・コードにコンパイルしてクラス・ファイル(411)を生成する第1のステップと、
    前記ランタイム環境へエントリする前に、前記プロセッサが、前記バイト・コードの少なくともある部分を、ハードウェア特定言語コンパイラ(413)を用いて、実行可能な命令へコンパイルして実行可能DLLファイル(414)を生成する第2のステップと、
    前記プロセッサが、前記ランタイム環境でプログラムを実行する際に、外部メソッドを呼び出す第3のステップと、
    前記プロセッサが、前記外部メソッドが前記クラス・ファイルと前記DLLファイルのどちらにあるかを判定し、
    i)前記外部メソッドが前記クラス・ファイルにあった場合、前記クラス・ファイルを前記ランタイム・インタプリタ又は前記ランタイム・コンパイラの一方を用いることによってインタプリト又はコンパイルして、前記ランタイム・システムにおいて実行し、
    ii)前記外部メソッドが前記DLLファイルにあった場合、前記ランタイム・システムを用いて、前記DLLファイルを実行する、第4のステップ
    を含む方法。
  2. 請求項1に記載された方法において、前記第2のステップは、
    前記バイト・コードごとに一意のラベルを作成するステップと、
    前記バイト・コードをデコードするステップと、
    前記バイト・コードを、等価のコンパイル言語命令に変換するステップ
    を含む方法。
  3. 請求項2に記載された方法において、前記第2のステップは、更に、前記バイト・コードに対する未使用ラベルを削除することによって前記コンパイル言語命令で参照されるラベルのみを残すステップを含む方法。
  4. 請求項2に記載された方法において、前記一意のラベルを作成するステップは、前記バイト・コードに対して一意の連番を作成するステップを含む方法。
  5. 請求項4に記載された方法において、前記一意の連番は、前記バイト・コードを含むプログラムの開始値に対する、前記バイト・コードのオフセット値を備え、
    前記等価のコンパイル言語命令に変換するステップでは、分岐命令内で指定された相対的オフセット値を、前記分岐命令のラベル内のオフセット値から減算することによって、目標バイト・コードのラベルが計算される、方法。
  6. システム・バス(23)により結合されたプロセッサ(21)及びシステム・メモリ(22)を備え、インタプリト言語のプログラムを実行するコンピュータ・システムであって、前記システム・メモリ(22)には、前記プログラムを実行するためのランタイム環境(402)を提供する命令が格納されており、前記ランタイム環境は、
    i)スタック(406)、定数プール(407)及びメソッド(408)を含み、前記メソッドを実行するランタイム・システム(405)と、
    ii)ランタイム・インタプリタ(403)と、
    iii)ランタイム・コンパイラ(404)
    を含み、
    前記プロセッサは、
    前記ランタイム環境へエントリする前に、前記インタプリト言語のソース・コード(409)をバイト・コードにコンパイルしてクラス・ファイル(411)を生成し、
    前記ランタイム環境へエントリする前に、前記バイト・コードの少なくともある部分を、ハードウェア特定言語コンパイラ(413)を用いて、実行可能な命令へコンパイルして実行可能DLLファイル(414)を生成し、
    前記ランタイム環境でプログラムを実行する際に、外部メソッドを呼び出し、
    前記外部メソッドが前記クラス・ファイルと前記DLLファイルのどちらにあるかを判定し、
    i)前記外部メソッドが前記クラス・ファイルにあった場合、前記クラス・ファイルを前記ランタイム・インタプリタ又は前記ランタイム・コンパイラの一方を用いることによってインタプリト又はコンパイルして、前記ランタイム・システムにおいて実行し、
    ii)前記外部メソッドが前記DLLファイルにあった場合、前記ランタイム・システムを用いて、前記DLLファイルを実行する、
    コンピュータ・システム。
  7. 請求項6に記載されたコンピュータ・システムにおいて、前記プロセッサは、前記バイト・コードを前記実行可能な命令へコンパイルする際に、
    前記バイト・コードごとに一意のラベルを作成し、
    前記バイト・コードをデコードし、
    前記バイト・コードを、等価のコンパイル言語命令に変換する、
    コンピュータ・システム。
  8. 請求項7に記載されたコンピュータ・システムにおいて、前記プロセッサは、前記バイト・コードを前記実行可能な命令へコンパイルする際に、更に、前記バイト・コードに対する未使用ラベルを削除することによって前記コンパイル言語命令で参照されるラベルのみを残す、コンピュータ・システム。
  9. 請求項7に記載されたコンピュータ・システムにおいて、前記プロセッサは、前記一意のラベルを作成する際に、前記バイト・コードに対して一意の連番を作成する、コンピュータ・システム。
  10. 請求項9に記載されたコンピュータ・システムにおいて、前記一意の連番は、前記バイト・コードを含むプログラムの開始値に対する、前記バイト・コードのオフセット値を備え、
    前記プロセッサは、前記バイト・コードを前記等価のコンパイル言語命令に変換する際に、分岐命令内で指定された相対的オフセット値を、前記分岐命令のラベル内のオフセット値から減算することによって、目標バイト・コードのラベルを計算する、
    コンピュータ・システム。
  11. 請求項1ないし5のいずれか一項に記載された方法を前記コンピュータ・システムに実行させるためのコンピュータ実行可能命令を格納するコンピュータ読み取り可能な媒体。
JP2000592733A 1998-12-30 1999-12-23 インタプリティブ・ランタイム環境のためのコンパイル・プログラムの生成 Expired - Fee Related JP4562918B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US09/223,440 US6327702B1 (en) 1998-12-30 1998-12-30 Generating a compiled language program for an interpretive runtime environment
US09/223,440 1998-12-30
PCT/US1999/030706 WO2000041075A2 (en) 1998-12-30 1999-12-23 Generating compiled programs for interpretive runtime environments

Publications (3)

Publication Number Publication Date
JP2002534735A JP2002534735A (ja) 2002-10-15
JP2002534735A5 JP2002534735A5 (ja) 2007-02-15
JP4562918B2 true JP4562918B2 (ja) 2010-10-13

Family

ID=22836504

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2000592733A Expired - Fee Related JP4562918B2 (ja) 1998-12-30 1999-12-23 インタプリティブ・ランタイム環境のためのコンパイル・プログラムの生成

Country Status (7)

Country Link
US (1) US6327702B1 (ja)
EP (1) EP1145120B1 (ja)
JP (1) JP4562918B2 (ja)
AT (1) ATE269990T1 (ja)
AU (1) AU2380700A (ja)
DE (1) DE69918334T2 (ja)
WO (1) WO2000041075A2 (ja)

Families Citing this family (30)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000020319A (ja) * 1998-06-30 2000-01-21 Canon Inc プログラム実行装置、その制御方法および記憶媒体
US6968549B1 (en) 1999-07-02 2005-11-22 Beryl Technical Assays Llc Method and system for dynamically loading data structures into memory with global constant pool
US7150005B2 (en) * 1999-07-02 2006-12-12 Beryl Technical Assays, Llc Method and system for global constant management for memory
US7028298B1 (en) * 1999-09-10 2006-04-11 Sun Microsystems, Inc. Apparatus and methods for managing resource usage
US6930235B2 (en) * 2001-03-15 2005-08-16 Ms Squared System and method for relating electromagnetic waves to sound waves
US6836884B1 (en) * 2001-06-04 2004-12-28 Microsoft Corporation Method and system for editing software programs
US6973644B2 (en) * 2002-04-12 2005-12-06 The Mathworks, Inc. Program interpreter
JP2003330732A (ja) * 2002-05-17 2003-11-21 Canon Inc 画像形成装置、制御方法、制御プログラム
US7104889B2 (en) * 2002-09-13 2006-09-12 Igt Method of using a rule based script to describe gaming machine payout
WO2004040445A1 (en) * 2002-10-29 2004-05-13 Freescale Semiconductor, Inc. Method and apparatus for selectively optimizing interpreted language code
US20040083467A1 (en) * 2002-10-29 2004-04-29 Sharp Laboratories Of America, Inc. System and method for executing intermediate code
US7318215B1 (en) 2003-02-26 2008-01-08 Microsoft Corporation Stored procedure interface language and tools
US7490332B2 (en) * 2003-04-04 2009-02-10 Sesma Systems, Inc. System and method for accessing ActiveX objects in a platform dependent environment from objects in a platform independent environment
US7478408B2 (en) * 2003-04-04 2009-01-13 Sesma Systems, Inc. System and method for accessing objects in a platform dependent environment from a platform independent environment
US7380242B2 (en) * 2003-05-14 2008-05-27 Mainsoft Israel Ltd. Compiler and software product for compiling intermediate language bytecodes into Java bytecodes
US7219329B2 (en) * 2003-06-13 2007-05-15 Microsoft Corporation Systems and methods providing lightweight runtime code generation
US7421687B1 (en) * 2003-10-08 2008-09-02 Sun Microsystems, Inc. Optimizing branch condition expressions in a JIT compiler
GB0424756D0 (en) * 2004-11-10 2004-12-08 Ibm Executing a native software routine in a virtual machine
US7530059B2 (en) * 2005-02-18 2009-05-05 International Business Machines Corporation Method for inlining native functions into compiled java code
ITRM20070273A1 (it) * 2007-05-16 2008-11-17 Micron Technology Inc Lettura di celle di memoria non volatile a livello mutiplo.
US8806457B2 (en) * 2008-12-15 2014-08-12 Apple Inc. Deferred constant pool generation
US9940147B2 (en) * 2009-08-28 2018-04-10 Adobe Systems Incorporated Systems and methods for providing information for use in a runtime computing environment
US8762972B2 (en) * 2011-02-08 2014-06-24 Nokia Corporation Methods and apparatuses for facilitating execution of applications requiring runtime compilation
US8793240B2 (en) * 2011-08-26 2014-07-29 Oracle International Corporation Generation of machine code for a database statement by specialization of interpreter code
US10037197B2 (en) * 2013-03-15 2018-07-31 Oracle International Corporation Flexible microinstruction system for constructing microprograms which execute tasks, gateways, and events of BPMN models
FR3009400B1 (fr) * 2013-07-31 2015-09-18 Oberthur Technologies Procede d'installation d'une application sur un element securise
US9158505B2 (en) 2014-01-09 2015-10-13 Microsoft Technology Licensing, Llc Specifying compiled language code in line with markup language code
WO2016183563A1 (en) 2015-05-14 2016-11-17 Walleye Software, LLC Historical data replay utilizing a computer system
US10002154B1 (en) 2017-08-24 2018-06-19 Illumon Llc Computer data system data source having an update propagation graph with feedback cyclicality
CN114186550B (zh) * 2021-12-10 2023-04-18 北京百度网讯科技有限公司 文本处理方法、装置、系统、设备以及存储介质

Family Cites Families (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4989132A (en) * 1988-10-24 1991-01-29 Eastman Kodak Company Object-oriented, logic, and database programming tool with garbage collection
JPH03240837A (ja) * 1990-02-19 1991-10-28 Nec Corp デバッグ情報生成装置
JPH05108372A (ja) * 1991-10-21 1993-04-30 Nec Ic Microcomput Syst Ltd コンパイラ最適化処理内容の出力方式
JPH0644082A (ja) * 1992-04-23 1994-02-18 Nec Corp 最適化テキスト作成方式
US6021469A (en) * 1996-01-24 2000-02-01 Sun Microsystems, Inc. Hardware virtual machine instruction processor
US5848274A (en) * 1996-02-29 1998-12-08 Supercede, Inc. Incremental byte code compilation system
US6063128A (en) * 1996-03-06 2000-05-16 Bentley Systems, Incorporated Object-oriented computerized modeling system
JPH09282174A (ja) * 1996-04-10 1997-10-31 Hitachi Ltd プログラム実行方法
US6151703A (en) * 1996-05-20 2000-11-21 Inprise Corporation Development system with methods for just-in-time compilation of programs
US6260078B1 (en) * 1996-07-03 2001-07-10 Sun Microsystems, Inc. Using a distributed object system to find and download java-based applications
US6021275A (en) * 1996-08-05 2000-02-01 General Magic, Inc. Object code structure and method for translation of architecture independent program implementations
US6186677B1 (en) * 1996-08-27 2001-02-13 Compuware Corporation Byte code instrumentation
US5884081A (en) * 1996-12-19 1999-03-16 International Business Machines Corp. Method and system for synchronizing code with design
US6098089A (en) * 1997-04-23 2000-08-01 Sun Microsystems, Inc. Generation isolation system and method for garbage collection
US5953736A (en) * 1997-04-23 1999-09-14 Sun Microsystems, Inc. Write barrier system and method including pointer-specific instruction variant replacement mechanism
US5995754A (en) * 1997-10-06 1999-11-30 Sun Microsystems, Inc. Method and apparatus for dynamically optimizing byte-coded programs
US5970249A (en) * 1997-10-06 1999-10-19 Sun Microsystems, Inc. Method and apparatus for performing byte-code optimization during pauses
US6009517A (en) * 1997-10-06 1999-12-28 Sun Microsystems, Inc. Mixed execution stack and exception handling
US6122638A (en) * 1997-11-26 2000-09-19 International Business Machines Corporation Object-oriented processor and method for caching intermediate data in an object-oriented processor
US6081665A (en) * 1997-12-19 2000-06-27 Newmonics Inc. Method for efficient soft real-time execution of portable byte code computer programs
US6110226A (en) * 1998-02-19 2000-08-29 Cygnus Solutions Java development environment using optimizing ahead-of-time compiler
US6161217A (en) * 1998-09-14 2000-12-12 Sun Microsystems, Inc. Accurate method for inlining virtual calls

Also Published As

Publication number Publication date
WO2000041075A3 (en) 2000-11-09
ATE269990T1 (de) 2004-07-15
JP2002534735A (ja) 2002-10-15
DE69918334T2 (de) 2005-08-04
AU2380700A (en) 2000-07-24
WO2000041075A2 (en) 2000-07-13
EP1145120A2 (en) 2001-10-17
EP1145120B1 (en) 2004-06-23
DE69918334D1 (de) 2004-07-29
US6327702B1 (en) 2001-12-04

Similar Documents

Publication Publication Date Title
JP4562918B2 (ja) インタプリティブ・ランタイム環境のためのコンパイル・プログラムの生成
US11175896B2 (en) Handling value types
US6381737B1 (en) Automatic adapter/stub generator
JP4372348B2 (ja) マルチプル・クラスファイルのランタイムイメージへの結合
Clausen et al. Java bytecode compression for low-end embedded systems
EP1486870B1 (en) Systems and Methods for Employing Tagged Dataypes in a Dynamic Runtime Environment
KR100640314B1 (ko) 혼합된 실행 스택 및 예외처리의 구현방법및 그 장치
US7380242B2 (en) Compiler and software product for compiling intermediate language bytecodes into Java bytecodes
EP4099152B1 (en) Extending a virtual machine instruction set architecture
US6651080B1 (en) Techniques for implementing pluggable virtual machines
US6295643B1 (en) Method and apparatus for improving java virtual machine performance using persistent execution information
US20040255268A1 (en) Systems and methods providing lightweight runtime code generation
CN106033370B (zh) 64位Java虚拟机的实现方法及装置
Hamilton Language integration in the common language runtime
Vilk et al. Doppio: breaking the browser language barrier
JP5129904B2 (ja) 実行時における関数の実行性能を増大させるための方法、計算機システム、実行時における関数の実行性能を増大させるための、コンピュータプログラムを格納するコンピュータ読み取り可能媒体
Orr et al. Fast and Flexible Shared Libraries.
US7207036B2 (en) Preprocessing of interfaces to allow fast call through
Stadler et al. Lazy continuations for Java virtual machines
US6973648B1 (en) Method and device to process multidimensional array objects
Powell et al. C# and the. NET framework: the C++ perspective
WO2006059248A2 (en) Mixed-mode code generation and execution
Martins et al. A Java interface for WMPI
Banavar et al. Etyma: A framework for modular systems
Haeberlen Using platform-specific optimizations in stub-code generation

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20061222

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20061222

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100212

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20100511

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20100518

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100609

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: 20100629

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20100728

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130806

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees