(57)【特許請求の範囲】
【請求項１】
コンパイラとプリローダと仮想マシンが格納されたメモリと該メモリに格納されたコンパイラとプリローダと仮想マシンを起動するプロセッサを備えたデータ処理装置によって配列の静的初期化を行う配列の静的初期化方法であって、
配列の静的初期化により当該配列を静的値とするバイトコードを保存する特別メソッド付きのクラスファイルを生成するために、前記プロセッサが前記コンパイラを起動して当該静的配列を保存するソースコードをコンパイルするコンパイル工程と、
前記プロセッサが前記コンパイラを起動することにより送信された前記バイトコードを保存する特別メソッド付きのクラスファイルを、前記プロセッサが前記プリローダを起動することにより送信された場所から受信する受信工程と、
前記プロセッサが前記仮想マシンを起動することにより前記特別メソッドが実行されたとした場合になされる前記配列の静的初期化を識別するために、前記プロセッサが前記仮想マシンを起動して前記バイトコードを実行することなく、前記プロセッサが前記メモリ上の前記プリローダを起動することにより、
前記クラスファイルから前記特別メソッドを検索して取得するとともに、前記特別メソッドに関連するデータ構造に対して疑似実行変数を割り当て、割り当てた疑似実行変数を前記特別メソッドのバイトコードに基づいて操作して前記特別メソッドのバイトコードを疑似実行する疑似実行工程と、
前記疑似実行の結果に基づいて前記プロセッサが前記仮想マシンを起動して前記配列の静的初期化を実現するための命令であって前記バイトコードより短い命令を生成するとともに前記バイトコードと置き換えて前記クラスファイルに保存する保存工程と、
前記配列の静的初期化を行うために前記プロセッサが前記仮想マシンを起動することにより前記出力ファイルに保存された前記命令の表現を解釈する解釈工程とを備えたことを特徴とする配列の静的初期化方法。
【請求項２】
前記疑似実行工程は、
スタック割当工程と、
前記特別メソッドから、前記スタックを処理するために前記プロセッサが前記仮想マシンを起動して実行するバイトコードを読み出す読出工程と、
バイトコードの読み出しに基づいて前記割当スタック上でスタックを処理するスタック処理工程とを含むことを特徴とする請求項１に記載される配列の静的初期化方法。
【請求項３】
前記疑似実行工程は、
変数割当工程と、
前記特別メソッドから、当該特別メソッドのローカル変数を処理するために前記プロセッサが前記仮想マシンを起動して実行するバイトコードを読み出す読出工程と、
バイトコードの読み出しに基づいて前記割当変数上でローカル変数を処理するローカル変数処理工程とを含むことを特徴とする請求項１に記載される配列の静的初期化方法。
【請求項４】
前記疑似実行工程は、
前記特別メソッドのコンスタント・プールに対するポインタを取得する取得工程と、
前記特別メソッドから、前記コンスタント・プールを処理するために前記プロセッサが前記仮想マシンを起動して実行するバイトコードを読み出す読出工程と、
バイトコードの読み出しに基づいて前記コンスタント・プールを処理するコンスタント・プール処理工程とを含むことを特徴とする請求項１に記載される配列の静的初期化方法。
【請求項５】
記憶デバイスと、メモリとプロセッサを備えたデータ処理システムであって、
前記記憶デバイスは、配列の静的初期化を行う際に使用されるソースコードを含むプログラムと、バイトコードを含み前記配列の静的初期化を行う際に実行される特別メソッドを保持するクラスファイルを少なくとも１つ含む１以上のクラスファイルとを保持し、
前記メモリは、コンパイラとプリローダと仮想マシンとを保持し、
前記プロセッサは、前記メモリ上の前記コンパイラを起動して、前記プログラムをコンパイルして前記クラスファイルを生成し、
前記プロセッサは、前記メモリ上のプリローダを起動して、前記１以上のクラスファイルを統合し、
前記プロセッサが前記メモリ上の仮想マシンを起動して前記特別メソッドを実行することにより行う静的初期化の効果を決定するために、前記プロセッサが前記メモリ上の仮想マシンを起動して当該特別メソッドを実行することなく、前記プロセッサは、前記メモリ上のプリローダを起動して、前記クラスファイルから前記特別メソッドを検索して取得するとともに、前記特別メソッドに関連するデータ構造に対して疑似実行変数を割り当て、前記特別メソッドから前記バイトコードを読み出し、読み出した前記バイトコードに基づいて割り当てた疑似実行変数を操作して疑似実行するとともに、疑似実行の結果に基づいて当該静的初期化を行う命令であって前記バイトコードより短い命令を作成し、
さらに、前記プロセッサは、前記メモリ上の前記仮想マシンを起動して、その作成済命令を解釈して配列の静的初期化を行うことを特徴とするデータ処理システム。
【請求項６】
前記作成済み命令は、コンスタント・プールへのエントリを含むことを特徴とする請求項５に記載されるデータ処理システム。
【請求項７】
コンパイラとプリローダと仮想マシンが格納されたメモリ及び該メモリに格納されたコンパイラとプリローダと仮想マシンを起動するプロセッサを有するコンピュータが読み取り可能な記憶媒体であって、
配列の静的初期化に関するオペレーションを行うために前記プロセッサが仮想マシンを起動して実行するバイトコードを、前記プロセッサがコンパイラを起動して送信し、前記プロセッサがプリローダを起動して送信された場所から受信する手順と、
前記プロセッサが仮想マシンを起動して前記バイトコードを実行したとした場合の前記オペレーションを識別するために、前記プロセッサが前記仮想マシンを起動して当該バイトコードを実行することなく、前記プロセッサが前記メモリ上の前記プリローダを起動して、前記バイトコードに関連するデータ構造に対して疑似実行変数を割り当て、割り当てた疑似実行変数を前記バイトコードに基づいて操作して当該バイトコードを疑似実行するシミュレーション手順と、
前記プロセッサが前記メモリ上の前記プリローダを起動して、当該疑似実行の結果に基づいて、前記オペレーションを行うために仮想マシンを起動する前記プロセッサに対する命令であって、前記バイトコードより短い命令を作成する作成手順とからなる制御手順をコンピュータに実行させるプログラムが記憶されていることを特徴とするコンピュータが読み取り可能な記憶媒体。
【請求項８】
更に、前記制御手順は、前記オペレーションを行うために前記プロセッサ上で、その作成済命令を実行させる実行手順を含むことを特徴とする請求項７に記載されるコンピュータが読取り可能な記憶媒体。
【請求項９】
更に、前記制御手順は、前記オペレーションを行うために、前記プロセッサが前記仮想マシンを起動することによりその作成済命令を解釈する解釈手順を含むことを特徴とする請求項７に記載されるコンピュータが読み取り可能な記憶媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、データ処理システムに関し、更に詳しくは、静的初期化方法及びそのシステムに関するものである。
【０００２】
【従来の技術】
JavaTMは、プラットフォーム独立のコードの生成・実行を行うためにプログラミング言語及びプログラミング環境の両者を記述するものである。このプラットフォーム独立のコードは、JavaTM仮想マシン上で実行される。このJavaTM仮想マシンは、プラットフォーム独立のコードを解釈する抽象コンピュータマシンである。JavaTM仮想マシンの詳細については、ティム・リンドホルム及びフランク・イェリン著:アジソンウェスレイ出版(1997年版)"The JavaTM 仮想マシン仕様"に記載されているのでそちらを参照されたい。JavaTM仮想マシンは、JavaTMプログラミング言語その他のプログラミング言語を特定して認識するものではないが、その代わりにJava仮想マシンは、特定のファイルフォーマット、即ちクラスファイルフォーマットを認識するものである。クラスファイルは、プラットフォーム独立のコードを構成するJava仮想マシンの命令(又はバイトコード)を保持したものである。
【０００３】
Javaプログラムの実行に際し、開発者は、図１に示した工程で作業を進める。まず、開発者は、コンピュータプログラムのコンパイルを行う(ステップ102)。Javaプログラミング言語等の高級言語においては、開発者は、ソースコードを保持したコンピュータプログラムを開発し、JavaTMコンパイラを起動させ、そのコードのコンパイルを行っている。Javaコンパイラは、カリフォルニア州マウンテンビューのサンマイクロシステムズから入手可能なJavaTMソフトウエア開発者キットの一部である。Javaコンパイラは、Java仮想マシン上で実行するのに適したバイトコードを含む1又は複数のクラスファイルを出力する。各クラスファイルは、クラスやインタフェースのいずれか1つの型を保持している。クラスファイルフォーマットの詳細については、"The JavaTM 仮想マシン仕様"の83-137頁に説明されている。これによれば、クラスファイルフォーマットは、強固なファイルフォーマットである。
【０００４】
【発明が解決しようとする課題】
しかしながら、このクラスファイルフォーマットは、仮想マシンに対して効率的に配列の静的初期化を行うように命令することができない。以下この欠点に関し詳細に説明する。
プログラムをコンパイルした後、開発者は、ステップ102におけるクラスファイルの出力をプリローダを用いて.mクラスファイルと称される単一ファイルに統合する(ステップ104)。サンマイクロシステムズから入手可能なプリローダは、クラスファイルを結合させ、そのクラスファイルの実行を容易にする予備処理を行う。クラスファイルを統合した後、開発者は、.mクラスファイルの仮想マシンへのロードを行う(ステップ106)。このステップにおいては、Java仮想マシンは、メモリ中に.mクラスファイルを保存する。そして、Java仮想マシンは、そのバイトコードを読み出して、.mクラスファイルが保持するバイトコードを解釈した後、それらを処理し実行する。バイトコードの解釈が完了するまで、.mクラスファイルは、メモリ中に保存される。Java仮想マシンにより認識されるバイトコードの詳細については、"The JavaTM仮想マシン仕様"の151-338頁に説明されている。
【０００５】
［仕様］
上述したように、クラスファイルフォーマットは、仮想マシンに配列の静的初期化を行うように命令することができない。この問題を解決するために、JavaTMコンパイラは、静的配列の初期化メソッドを含む特別メソッドである<clinit>を生成してクラスの初期化を行う。静的配列の初期化の一例を表１のコードテーブル#1に示す。
【０００６】
【表１】
0004699580.tif 000002
【０００７】
この例においては、配列"setup"は、静的初期化がなされた4つの整数−1, 2, 3, 4を保持する。この所定の静的初期化がなされると、JavaTMコンパイラは、静的初期化を行う<特別>メソッドを生成する。この静的初期化は、仮コードで関数的に記述され、その一例を表２のコードテーブル#2に示す。
【０００８】
【表２】
0004699580.tif 000003
【０００９】
上述のコードテーブルが示すように、<特別>メソッドを関数的に記述する場合、いくつかのステートメントを必要とする。しかしながら、バイトコードによって行われる<特別>メソッドの実際の処理は、より多くのステートメントを必要とする。これらのバイトコードは、スタックを処理することにより、要求された静的初期化を行うものである。スタックは、Javaプログラミング環境の多くのメソッドにより使用されるメモリの一部である。上述したスタック初期化の一例に使用される<特別>メソッドにより行われる各ステップを表３のコードテーブル#3に示す。
【００１０】
【表３】
0004699580.tif 000004
【００１１】
<特別>メソッドの使用は、Java仮想マシンに静的配列の初期化を行うように命令する方法を提供するが、その配列の初期化に必要なコード量は、そのサイズの配列を何度も行うと相当量のメモリを必要とすることになる。従って、静的初期化の手法を改善する必要がある。
【００１２】
本発明の解決しようとする課題は、配列の静的初期化に必要なメモリ使用量を節約することができるデータ処理システムの配列の静的初期化方法、データ処理方法並びにデータ処理システム及びその制御手順をコンピュータに実行させるプログラムを記憶したコンピュータ読み取り可能な記憶媒体を提供することにある。
【００１３】
【課題を解決するための手段】
上記課題を解決するために、本発明に係る請求項１に記載のデータ処理装置が行う配列の静的初期化方法は、配列の静的初期化により当該配列を静的値とするバイトコードを保存する特別メソッド付きのクラスファイルを生成するために、当該静的配列を保存するソースコードをコンパイルするコンパイル工程と、コンパイラから送信された前記クラスファイルをプリローダにより受信する受信工程と、前記プロセッサによって特別メソッドが実行されたとした場合になされる前記配列の静的初期化を識別するために、前記プロセッサ上で当該コードを実行することなく、メモリ上で前記プリローダにより前記特別メソッドのバイトコードを疑似実行する疑似実行工程と、前記疑似実行の結果に基づいて前記配列の静的初期化を実現するための命令を出力ファイルに保存する保存工程と、前記配列の静的初期化を行うために仮想マシンにより前記出力ファイルに保存された表現を解釈する解釈工程とを備えたことを要旨とするものである。
【００１４】
この場合に、前記保存工程は、請求項２に記載されるように、コンスタント・プール・エントリをコンスタント・プールに保存する保存工程を含むようにするとよい。
【００１５】
また、前記擬似実行工程は、請求項３に記載されるように、スタック割当工程と、前記特別メソッドから前記スタックを処理するバイトコードを読み出す読出工程と、バイトコードの読み出しに基づいて前記割当スタック上でスタックを処理するスタック処理工程とを含むようにするとよい。或いは、前記擬似実行工程は、請求項４に記載されるように、変数割当工程と、前記特別メソッドから当該特別メソッドのローカル変数を処理するバイトコードを読み出す読出工程と、バイトコードの読み出しに基づいて前記割当変数上でローカル変数を処理するローカル変数処理工程とを含むようにしてもよい。更に、これに代えて、前記擬似実行工程は、請求項５に記載されるように、前記特別メソッドのコンスタント・プールへの参照を取得する取得工程と、前記特別メソッドから前記コンスタント・プールを処理するバイトコードを読み出す読出工程と、バイトコードの読み出しに基づいて前記コンスタント・プールを処理するコンスタント・プール処理工程とを含めてもよい。
【００１６】
次に、本発明に係る請求項６に記載のデータ処理装置は、オペレーションを行うために前記プロセッサ上で実行されるコードをコンパイラから受信する受信工程と、前記コードが前記プロセッサにより実行されたとした場合の当該コードのオペレーションを識別するために、前記プロセッサ上で当該コードを実行することなくメモリ上で当該コードを前記プリローダにより疑似実行する疑似実行工程と、前記コードのオペレーションを行うために前記プロセッサに対する命令を作成する作成工程とを備えたことを要旨とするものである。
【００１７】
上記構成を有する請求項６に記載のデータ処理装置によれば、まず、オペレーションを行うプロセッサ上で実行されるべきコードが受信される。次に、このコードは、メモリ上で擬似実行されるが、この擬似実行は、当該プロセッサ上で当該コードを実行することなくなされ、これにより、当該コードが前記プロセッサにより実行されたとした場合の当該オペレーションが識別されることになる。その後、当該プロセッサ用の指令が作成され、当該オペレーションが行われることになる。
【００１８】
当該オペレーションがデータ構造を初期化するものである場合には、請求項７に記載されるように、前記擬似実行工程は、当該データ構造の初期化を識別するために前記コードを擬似実行するものであるとよい。或いは、当該オペレーションが配列の静的初期化を行うものである場合には、請求項８に記載されるように、前記擬似実行工程は、当該配列の静的初期化を識別するために前記コードを実行するものであるとよい。
【００１９】
更に、請求項９に記載されるように、前記オペレーション(データ構造の初期化や配列の静的初期化等)を行うために前記プロセッサ上で、その作成済命令を実行させる実行工程を含めるとよい。
【００２０】
更に、請求項１０に記載されるように、前記オペレーション(データ構造の初期化や配列の静的初期化等)を行うために仮想マシンにその作成済命令を解釈させる解釈工程を含めるとよい。
【００２１】
また、前記オペレーション(データ構造の初期化や配列の静的初期化)がメモリ効果を有する場合には、請求項１１に記載されるように、前記擬似実行工程は、当該メモリ効果を識別するために、前記コードを擬似実行するものであるとよい。
【００２２】
次に、本発明に係る請求項１２に記載のデータ処理装置は、記憶デバイスとメモリを備え、当該記憶デバイスは、データ構造の静的初期化を行うソースコードを含むプログラムと、前記データ構造の静的初期化を行う特別メソッドを保持するクラスファイルを少なくとも１つ含むクラスファイルとを保持し、当該メモリは、前記プログラムをコンパイルして前記クラスファイルを生成するコンパイラと、前記クラスファイルを統合し、前記特別メソッドがメモリ上で行う静的初期化の効果を決定するために当該特別メソッドをプロセッサ上で実行することなくメモリ上で疑似実行し、疑似実行の結果に基づいて当該静的初期化を行う命令を作成するプリローダと、前記コンパイラと前記プリローダとを作動させるプロセッサとを備えたことを要旨とするものである。
【００２３】
上記構成を有するデータ処理システムによれば、クラスファイルが統合される際に、プリローダにより全ての<特別>メソッドが識別され、これらのメソッドが擬似実行される。これにより、それらのメソッドにより行われる静的初期化が決定される。次に、<特別>メソッドにより行われる静的初期化を示す表現式が当該プリローダにより作成され、この表現式が.mクラスファイルへ保存され、その<特別>メソッドと置き換えられる。このようにして、多くの命令を保持する<特別>メソッドのコードは、仮想マシンに対して静的初期化を行うように命令する単一の表現式に置き換えられる。これにより、メモリの相当量が節約され、仮想マシンにより実行されるコード量を減少させることができる。この場合、仮想マシンは、この表現式を認識するように修正され、適切な配列の静的初期化がこの仮想マシンにより行われることになる。
【００２４】
この場合に、当該プリローダは、請求項１３に記載されるように、その作成済命令を含む出力ファイルを生成するメカニズムを含むとよく、更に、当該メモリは、請求項１４に記載されるように、その静的初期化を行うために、当該作成済命令を解釈する仮想マシンを含むとよい。
【００２５】
また、前記データ構造は、請求項１５に記載されるように、配列であってもよい。そして、前記特別メソッドは、請求項１６に記載されるように、前記データ構造の静的初期化を行うバイトコードを有するとよい。また、前記作成済命令は、請求項１７に記載されるように、コンスタント・プールへのエントリを含むとよい。
【００２６】
【発明の実施の形態】
本発明に係るシステム及び方法は、<特別>メソッドを、当該<特別>メソッドと同一の静的初期化を仮想マシンに行わせる1又は複数の指令(その仮想マシンにより読み出された際に)に置き換えることにより、Javaプログラミング環境における配列の静的初期化を行う改良システム及び方法を提供するものである。この改良システム及び方法によれば、必要なメモリ容量が少なくて済み且つ必要な時間も短くて済むものである。その結果、配列の静的初期化を行う際のメモリの除去が可能となり、メモリの有効利用が図られることになる。
【００２７】
［概略］
本発明に係るシステム及び方法は、プリローダにおいて所定の予備処理を行うことにより<特別>メソッドに対する必要性を除去するものである。特に、プリローダは、統合用クラスファイルを受信し、<特別>メソッドを検索しながらそれらをスキャンするものである。プリローダが<特別>メソッドを見つける際、メモリに対して<特別>メソッド実行のシミュレーション(即ち、"擬似実行")を行う。これは、Java仮想マシンによって解釈されたとした場合のその<特別>メソッドが有するメモリ効果を決定するためである。即ち、そのプリローダは、Java仮想マシンにより実行される<特別>メソッドの結果となるであろう静的初期化を識別するためにその<特別>メソッド実行のシミュレーションを行うものである。この静的初期化を識別した後、プリローダは、その<特別>メソッドと同一の静的初期化を行わせるために1又は複数の指令(又は命令)を生成し、これらの指令をJava仮想マシンに出力し、当該<特別>メソッドと置き換えるものである。次に、これらの指令は、ランタイム時にJava仮想マシンによって読み出され、そのJava仮想マシンにその<特別>メソッドにより行われたのと同一の静的初期化を行わせる。その指令は、その<特別>メソッドよりも、必要とするメモリスペースが相当量少なくて済む。例えば、上述のコードテーブル#3に記述したバイトコードは、.mクラスファイルに保持される次の指令へ縮小されることになる。その.mクラスは、4つの整数からなる配列で、初期値1, 2, 3, 4を保持している。
CONSTANT_Array T_INT 4 1 2 3 4
本実施形態である仮想マシンは、この表現式を認識し、その配列の静的初期化を行い、その配列を所定値とする。その結果、その形態に係る仮想マシンは、従来の仮想マシンに較べて、静的配列の初期化時に必要なメモリ消費を除去することができる。
【００２８】
［実装の詳細］
図２は、本発明に係るデータ処理システム200の構成を示したものである。データ処理システム200は、コンピュータシステム202を備え、このコンピュータシステム202は、インターネット204に接続されている。コンピュータシステム202は、メモリ206、補助記憶デバイス208、中央処理ユニット(CPU)210、入力デバイス212、及びビデオディスプレイ214を含むものである。メモリ206は、更に、JavaTMコンパイラ218、JavaTMプリローダ220、及びJavaTMランタイムシステム221を含むものである。JavaTMランタイムシステム221は、JavaTM仮想マシン222を含むものである。補助記憶デバイス208は、ソースコード形態のプログラム224、種々のクラスファイル226、及び.mクラスファイル228を含むものである。JavaTMコンパイラ218は、プログラム224を1又は複数のクラスファイル226にコンパイルするものである。次に、プリローダ220は、クラスファイル226を受信して.mクラスファイル228を生成する。その.mクラスファイルは、全てのクラスファイルを統合したものである。この統合により、その.mクラスファイル228は、仮想マシン222上で実行可能となる。
【００２９】
本発明に係る処理は、プリローダ220により行われるものであり、プリローダ220は、<特別>メソッドを検索する。そして、その<特別>メソッドが見つかった際に、プリローダ200は、(1)その<特別>メソッドが仮想マシン222により解釈されたとした場合の当該<特別>メソッドによるメモリ効果を決定するために当該<特別>メソッドの実行をシミュレートし、(2)これらのメモリ効果を複製する静的初期化指令を生成し、(3)その<特別>メソッドと置き換えるために、.mクラスファイルにこれらの指令を出力するものである。これにより、相当量のメモリが節約されることになる。
【００３０】
加えて、本発明に係る処理は、仮想マシン222によって行われるものであるが、これは、プリローダ200の静的初期化指令を認識するように仮想マシン222を修正するためである。本発明の好適な実施形態は、メモリ206に記憶されているものとして説明されているが、いわゆる当業者に自明であるように、その他のコンピュータ読み取り可能な媒体、例えば、補助記憶デバイス(ハードディスク、フロッピーディスク、又はCD-ROM等)、又はRAMやROM等のその他の形態の記憶デバイスに記憶させるようにしてもよい。更に、いわゆる当業者に自明であるように、コンピュータ202が追加の又は異なるコンポーネントを含むものであってもよい。
【００３１】
［プリローダ］
図３は、静的配列の初期化を行うために本発明に係るプリローダ220によって行われる工程のフローチャートを示したものである。プリローダ220により行われる第1の工程では、プリローダ220は、<特別>メソッドを取得するために、クラスファイルを読み出す(ステップ302)。<特別>メソッドを取得した後、プリローダ220は、擬似実行中に使用する種々の変数を割り当てる(ステップ304)。擬似実行に際しては、以下に述べるように、プリローダ220は、<特別>メソッドに保持されるバイトコードの仮想マシンによる実行をシミュレートする。これらのバイトコードは、その<特別>メソッドに関連付けられる種々のデータ構造を処理するものであある。種々のデータ構造には、コンスタント・プール、スタック又はローカル変数(又はレジスタ)が含まれる。
【００３２】
コンスタント・プールは、可変長構造のテーブルであり、種々のストリング定数、クラス名、フィールド名、及びクラスファイル内で参照されるその他の定数を表現するものである。スタックは、そのメソッドの実行中にオペランドを記憶するのに使用するメモリの一部である。従って、スタックサイズは、このメソッドの実行中においては常にそのオペランドにより占有される最大スペースとなる。ローカル変数は、このメソッドにより使用される変数である。
【００３３】
変数割当の際、プリローダ220は、<特別>メソッドのコンスタント・プールに対するポインタを取得し、スタックに適当なサイズを割り当て、配列を割り当てる。その配列割当は、各配列の各エントリが各ローカル変数に対応するようになされる。以下に述べるように擬似実行は、これらの変数を操作するものである。
【００３４】
変数を割当た後、プリローダ220は、<特別>メソッドからバイトコードを読み出す(ステップ306)。次に、プリローダ220は、そのバイトコードを認識するか否かを決定する(ステップ308)。このステップにおいては、プリローダ220は、全てのバイトコードのサブセットを認識する。ここで、このサブセットは、配列の静的初期化を行うのに通常用いられるバイトコードのみを保持するものである。
以下に示すものは、好適な実施形態に係るプリローダ220により認識されるバイトコードのリストを示したものである。
【００３５】
【表４】
0004699580.tif 000005
【００３６】
上記にリストしたバイトコード以外のバイトコードは、認識されない。上述した以外のその他のバイトコードは、<特別>メソッドが配列の静的初期化に対して追加機能を行うものであることを示している。この場合、<特別>メソッドは、最適化され得ない。バイトコードが認識されないと、プリローダ220は、最適化(擬似実行)に不適であると判断し、処理は、ステップ316へ続く。
【００３７】
プリローダ220がバイトコードを認識する場合には、プリローダ220は、そのバイトコードにより反映されるオペレーションを擬似実行する(ステップ310)。このステップにおいては、プリローダ220は、ステップ304において割り当てた変数に基づいてそのバイトコードを擬似実行する。その結果、ある値がスタックからポップされ、ローカル変数は更新され、あるいは、コンスタント・プールからある値が取り出されることになる。加えて、プリローダ220は、特定の静的変数が特定の手法で初期化されるべきことを示す"put static"バイトコードに出くわすことになる。プリローダ220がこのようなバイトコードを受信する場合、プリローダ220は、後で使用するハッシュテーブルへ要求された初期化指示を保存する。ハッシュテーブルは、次の通りである。
Setup: =Array(1,2,3,4)
【００３８】
そのバイトコードにより反映されたオペレーションを行った後、プリローダ220は、<特別>メソッド内に更にバイトコードがあるかどうか決定する(ステップ314)。まだバイトコードがある場合、処理は、ステップ306へ戻る。しかしながら、更なるバイトコードがない場合、プリローダ220は、配列の静的初期化を行うために指令を.mクラスファイルへ保存する(ステップ318)。このステップにおいては、プリローダ220は、コンスタント・プール・エントリを次のようにして.mクラスファイルへ保存する。
0004699580.tif 000006
【００３９】
そのコンスタント・プールのこのエントリは、特定の配列が4つの整数−その初期値がそれぞれ1,2,3,4である−を保持することを示す。実行時においては、仮想マシンは、そのクラスファイルを.mクラスファイルに初期化する場合に、このコンスタント・プールへの参照に出くわし、適当な配列を生成する。その結果、その<特別>メソッドに保持される多くの命令が除去され、1つの表現式として表されることになる。これにより、相当量のメモリが節約され、必要な時間が短縮されることになる。
【００４０】
［プリローダの実装例］
以下の表５から表７(コードテーブル#5)に示した仮コードは、好適な実施形態に係るプリローダの処理の一例を説明したものである。プリローダ220は、"JavaTM仮想マシン仕様"104-106頁に記載されているように、<特別>メソッドを定義するメソッド情報のデータ構造をパラメータとして受信する。そして、プリローダ220は、この<特別>メソッドのバイトコードを擬似実行する。尚、ここで説明するのは、実施形態の一例についてであることに留意されたい。即ち、2, 3個のバイトコードがプリローダ220により処理されるものとして以下説明を行うということである。しかしながら、コードテーブル#4の全てのバイトコードが本実施形態により処理可能なものであることは、いわゆる当業者にとって自明のことである。
【００４１】
【表５】
0004699580.tif 000007
【００４２】
【表６】
0004699580.tif 000008
【００４３】
【表７】
0004699580.tif 000009
【００４４】
［実施形態に係る仮想マシン］
上述したように、Java仮想マシン222は、以下に説明する点について修正が加えられる以外は、"JavaTM仮想マシン仕様"で定義される標準のJava仮想マシンであればよい。従来の仮想マシンは、種々のコンスタント・プール・エントリ、例えば、CONSTANT_Integer, CONSTANT_String, 及びCONSTANT_Long等、を認識するものである。これらの型のコンスタント・プール・エントリは、種々の変数情報を保持するものであり、その初期値も含むものである。しかしながら、実施形態に係る仮想マシンは、更に、コンスタント・プールのCONSTANT_Arrayエントリをも認識するものである。
【００４５】
クラスファイルフォーマットにおけるコンスタント・プール・エントリのCONSTANT_Arrayのフォーマットは、以下の通りである。
【００４６】
【表８】
0004699580.tif 000010
【００４７】
u1型フィールドは、表９に示したテーブルにリストされた値のいずれかである。
【００４８】
【表９】
0004699580.tif 000011
【００４９】
フィールドuxオブジェクト[長さ]は、値の配列であり、その配列要素を提供するものである。その配列中の要素数は、コンスタント・プール・エントリの長さフィールドにより与えられるものである。これらの値の実際のサイズは、次の表１０に示す通りである。
【００５０】
【表１０】
0004699580.tif 000012
【００５１】
表１０に示したバイトは、T_CLASS以外の型については、配列の要素に保存される実際の値である。一方、T_CLASSについては、各u2は、それ自体がコンスタント・プールのエントリに対するインデックスである。参照されるコンスタント・プール・エントリは、CONSTANT_Array、CONSTANT_Object、又はNULL値を示す特別コンスタント・プールエントリ0のいずれかでなければならない。
【００５２】
例えば、配列
int[] = {10, 20, 30, 40};
を示すには、コンスタント・プール・エントリは、次のようになる。
0004699580.tif 000013
【００５３】
他の例としては、配列
new Foo[3] /*全てNULLに初期化済み*/
を示すには、コンスタント・プール・エントリは、次のようになる。
0004699580.tif 000014
ここで、"xx"は、コンスタント・プール内のクラスFooを示すコンスタント・プールのインデックスである。
【００５４】
二次元配列は次の通りである。
new byte[][]={{1, 2, 3, 4}, {5, 6, 7, 8}};
この二次元配列は、副次的配列を符号化する2つのコンスタント・プール・エントリを保持することにより、また、その副次的配列間の関連を示す2つの追加エントリを保持することにより、符号化されるものである。この符号化は、オブジェクトの型としてのJavaTMの配列概念、及び配列の配列としての多次元配列に対応している。上記の二次元配列のコンスタント・プール・エントリは、次の通りである。
Entry1:    CONSTANT_Array T_BYTE 4 1 2 3 4
Entry2:    CONSTANT_Array T_BYTE 4 5 6 7 8
Entry3:    CONSTANT_Class with name "[[B"
0004699580.tif 000015
ここで、Entry1, Entry2及びEntry3は、対応するコンスタント・プール・エントリのインデックスの2バイトで符号化したものである。
【００５５】
以上、本発明に係るシステム及び方法について好適な実施の形態に基づいて説明したが、本発明がこの実施形態に限定されるものでないことは、いわゆる当業者にとっては、自明である。種々の変形例が本発明の趣旨に従って可能である。尚、本発明の範囲は、特許請求の範囲によって定められる。
【００５６】
【発明の効果】
以上説明したように、本発明に係る請求項１に記載のデータ処理装置が行う配列の静的初期化方法によれば、配列の静的初期化により当該配列を静的値とするバイトコードを保存する特別メソッド付きのクラスファイルを生成するために、当該静的配列を保存するソースコードをコンパイルするコンパイル工程と、コンパイラから送信された前記クラスファイルをプリローダにより受信する受信工程と、前記プロセッサによって特別メソッドが実行されたとした場合になされる前記配列の静的初期化を識別するために、前記プロセッサ上で当該コードを実行することなく、メモリ上で前記プリローダにより前記特別メソッドのバイトコードを疑似実行する疑似実行工程と、前記疑似実行の結果に基づいて前記配列の静的初期化を実現するための命令を出力ファイルに保存する保存工程と、前記配列の静的初期化を行うために仮想マシンにより前記出力ファイルに保存された表現を解釈する解釈工程とを備えたので、配列の静的初期化に必要なメモリ使用量を節約することができる。
【００５７】
本発明に係る請求項６に記載のデータ処理装置によれば、オペレーションを行うために前記プロセッサ上で実行されるコードをコンパイラから受信する受信工程と、前記コードが前記プロセッサにより実行されたとした場合の当該コードのオペレーションを識別するために、前記プロセッサ上で当該コードを実行することなくメモリ上で当該コードを前記プリローダにより疑似実行する疑似実行工程と、前記コードのオペレーションを行うために前記プロセッサに対する命令を作成する作成工程とを備えたので、配列の静的初期化に必要なメモリ使用量を節約することができる。
【００５８】
本発明に係る請求項１２に記載のデータ処理装置によれば、クラスファイルが統合される際に、プリローダにより全ての<特別>メソッドが識別され、これらのメソッドが擬似実行され、それらのメソッドにより行われる静的初期化が決定される。次に、<特別>メソッドにより行われる静的初期化を示す単一の表現式が当該プリローダにより作成され、この単一の表現式が.mクラスファイルへ保存され、その<特別>メソッドと置き換えられる。これにより、多くの命令を保持する<特別>メソッドのコードが、仮想マシンに対して静的初期化を行うように命令する単一の表現式に置き換えられるため、仮想マシンにより実行されるコード量を減少させることができ、配列の静的初期化に必要なメモリ使用量を節約することができる。
【００５９】
本発明に係る方法及びシステムによれば、処理に必要な時間も短縮されることから、本発明は、情報通信産業の更なる進展に極めて有益なものである。
【図面の簡単な説明】
【図１】  Javaプログラム環境におけるプログラム開発工程のフローチャートである。
【図２】本発明に係るデータ処理システムの構成図である。
【図３】図２に示したプリローダによって行われる工程のフローチャートである。
【符号の説明】
200  データ処理システム
202  コンピュータシステム
204  インターネット
206  メモリ
208  補助記憶デバイス
210  CPU
212  入力デバイス
214  ビデオディスプレイ
218  コンパイラ
220  プリローダ
221  Javaランタイムシステム
224  プログラム
226  クラスファイル
228  .mクラスファイル
【図１】
0004699580.tif 000016
【図２】
0004699580.tif 000017
【図３】
0004699580.tif 000018