(57)【特許請求の範囲】
【請求項１】
コンピュータの処理によって、クラスのプロパティ宣言を持つ動的スクリプト言語である第１のプログラミング言語のプログラムを、第２のプログラミング言語の実行系上で仮想的に実行するための方法であって、
前記コンピュータの処理によって、前記第１のプログラミング言語の前記プログラムのプロパティ名から一意的に決まるインターフェース・クラスを生成してロードするステップと、
前記コンピュータの処理によって、前記第１のプログラミング言語の前記プログラムの実行中に出現した前記第１のプログラミング言語の第２のクラスに対し、前記第１のプログラミング言語の該第２のクラスが、前記第１のプログラミング言語の第１のクラスを直接継承しているときに、前記第１のプログラミング言語の前記第１のクラスに対応させた前記第２のプログラミング言語の第１のクラスをキーとして、前記第２のプログラミング言語の第１のクラスを継承した前記第２のプログラミング言語の第２のクラスをキャッシュすることにより、動的に作られる前記第１のプログラミング言語の前記プログラム上のクラス階層と対応するように、前記第２のプログラミング言語の実行系上のクラス階層を用意するステップを有し、
前記第１のプログラミング言語の前記プログラムの前記第１及び第２のクラスのプロパティ宣言に対応して、前記第２のプログラミング言語の前記第１及び第２のクラスにフィールドが用意され、
前記インターフェース・クラスを実装するように用意された前記第２のプログラミング言語のクラスにより、前記インターフェース・クラスを通じたプロパティ・アクセス・ステップが可能ならしめられる、
プログラム実行方法。
【請求項２】
前記インターフェースを通じたプロパティ・アクセス・ステップは、該プロパティに対応するインターフェース・クラスが実装されているかどうかを判断し、もしそうなら、該インターフェース・クラス経由でフィールドへのアクセスを実現するステップを有する、請求項１に記載のプログラム実行方法。
【請求項３】
前記第１のプログラミング言語がＰＨＰであり、前記第２のプログラミング言語がＪａｖａ(R)である、請求項１に記載のプログラム実行方法。
【請求項４】
コンピュータの処理によって、クラスのプロパティ宣言を持つ動的スクリプト言語である第１のプログラミング言語のプログラムを、第２のプログラミング言語の実行系上で仮想的に実行するためのプログラムであって、
前記コンピュータに、
前記第１のプログラミング言語の前記プログラムのプロパティ名から一意的に決まるインターフェース・クラスを生成してロードするステップと、
前記第１のプログラミング言語の前記プログラムの実行中に出現した前記第１のプログラミング言語の第２のクラスに対し、前記第１のプログラミング言語の該第２のクラスが、前記第１のプログラミング言語の第１のクラスを直接継承しているときに、前記第１のプログラミング言語の前記第１のクラスに対応させた前記第２のプログラミング言語の第１のクラスをキーとして、前記第２のプログラミング言語の第１のクラスを継承した前記第２のプログラミング言語の第２のクラスをキャッシュすることにより、動的に作られる前記第１のプログラミング言語の前記プログラム上のクラス階層と対応するように、前記第２のプログラミング言語の実行系上のクラス階層を用意するステップを実行させ、
前記第１のプログラミング言語の前記プログラムの前記第１及び第２のクラスのプロパティ宣言に対応して、前記第２のプログラミング言語の前記第１及び第２のクラスにフィールドが用意され、
前記インターフェース・クラスを実装するように用意された前記第２のプログラミング言語のクラスにより、前記インターフェース・クラスを通じたプロパティ・アクセス・ステップが可能ならしめられる、
プログラム実行プログラム。
【請求項５】
前記インターフェースを通じたプロパティ・アクセス・ステップは、該プロパティに対応するインターフェース・クラスが実装されているかどうかを判断し、もしそうなら、該インターフェース・クラス経由でフィールドへのアクセスを実現するステップを有する、請求項４に記載のプログラム。
【請求項６】
前記第１のプログラミング言語がＰＨＰであり、前記第２のプログラミング言語がＪａｖａ(R)である、請求項４に記載のプログラム。
【請求項７】
コンピュータの処理によって、クラスのプロパティ宣言を持つ動的スクリプト言語である第１のプログラミング言語のプログラムを、第２のプログラミング言語の実行系上で仮想的に実行するためのシステムであって、
前記第１のプログラミング言語の前記プログラムのプロパティ名から一意的に決まるインターフェース・クラスを生成してロードする手段と、
前記第１のプログラミング言語の前記プログラムの実行中に出現した前記第１のプログラミング言語の第２のクラスに対し、前記第１のプログラミング言語の該第２のクラスが、前記第１のプログラミング言語の第１のクラスを直接継承しているときに、前記第１のプログラミング言語の前記第１のクラスに対応させた前記第２のプログラミング言語の第１のクラスをキーとして、前記第２のプログラミング言語の第１のクラスを継承した前記第２のプログラミング言語の第２のクラスをキャッシュすることにより、動的に作られる前記第１のプログラミング言語の前記プログラム上のクラス階層と対応するように、前記第２のプログラミング言語の実行系上のクラス階層を用意する手段を有し、
前記第１のプログラミング言語の前記プログラムの前記第１及び第２のクラスのプロパティ宣言に対応して、前記第２のプログラミング言語の前記第１及び第２のクラスにフィールドが用意され、
前記インターフェース・クラスを実装するように用意された前記第２のプログラミング言語のクラスにより、前記インターフェース・クラスを通じたプロパティ・アクセス・ステップが可能ならしめられる、
プログラム実行システム。
【請求項８】
前記インターフェースを通じたプロパティ・アクセス・ステップは、該プロパティに対応するインターフェース・クラスが実装されているかどうかを判断し、もしそうなら、該インターフェース・クラス経由でフィールドへのアクセスを実現するステップを有する、請求項７に記載のシステム。
【請求項９】
前記第１のプログラミング言語がＰＨＰであり、前記第２のプログラミング言語がＪａｖａ(R)である、請求項７に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、コンピュータ上で、プログラムを呼び出して実行するための技術に関する。
【背景技術】
【０００２】
従来より、サーバ環境で使用されるプログラミング言語処理系、あるいは実行系として、ＰＨＰのような動的スクリプト言語と、Ｊａｖａ(R)のようなより静的なプログラミング言語が使用されているが、近年になって、Ｊａｖａ(R)のクラス資産をＰＨＰなどから簡易に呼び出せるように、Ｊａｖａ(R)仮想マシンあるいは、コンピュータ共通言語基盤（ＣＬＩ）のような静的な言語プラットフォーム上でＰＨＰのような動的スクリプト言語が、静的な言語プラットフォームのクラスを宣言し、タイプ付けされていないアクセスを可能ならしめる仕組みが提供されるようになってきている。
【０００３】
図１は、Ｊａｖａ(R)のＶＭ上の実装と、ＰＨＰの仮想処理モデルとの対比を示す。Ｊａｖａ(R)は静的なプログラミング処理環境なので、符号１０２で示すように、ロードしたクラス・オブジェクトは、長く残るが、ＰＨＰのような動的言語処理系のプログラミング・モデルでは典型的に、ロードしたクラス・オブジェクトがメモリ上にある期間は、符号１０４、１０６及び１０８で示すように、比較的短い。
【０００４】
次に、図２を参照して、ＰＨＰのクラスの動的ロードの例を説明する。ＰＨＰで書かれたコード２０２は、$theme/B.phpと、view/C.phpをincludeしている。$themeは変数で、$theme = "theme/classic"の場合は、コード２０４がincludeされる。コード２０６は、コード２０４と同一の場所のファイルであるが、内容が変更されており別のタイム・スタンプをもつという想定である。
【０００５】
$theme = "theme/modern"の場合は、コード２０８がincludeされる。
【０００６】
コード２０２に戻って、$o = new Cで、クラスCのインスタンスを生成したとき、クラスCの宣言は、コード２１０に含まれている。そこで、コード２１０から見て取れるように、クラスCはクラスBを継承するのであるが、Ｊａｖａ  ＶＭ上でＰＨＰのオブジェクトを呼び出す仕組みが、その都度のハッシュ・テーブルによるアクセスとなって重く、パフォーマンスがよくないという問題点がある。
【０００７】
これに関して知られている従来技術は、下記のとおりである。
【０００８】
特開２００７−１０９００４号公報は、引数の内容により処理の異なるプログラムを、解析の容易なプログラムに変換することに関し、プログラム群から呼び出し先プログラムと呼び出し先プログラムの処理を異ならせる引数と該引数の内容とを検出し呼び出し先プログラムの処理のうち引数の内容に応じた処理のみを実行するプログラムを専用呼び出し先プログラムとして、引数と引数の内容毎に生成する専用呼び出し先プログラム生成部と、プログラム群から呼び出し先プログラムを呼び出す呼び出し箇所を検出する呼び出し箇所検出部と、専用呼び出し先プログラム生成部により生成された専用呼び出し先プログラムを呼び出すように呼び出し箇所を書き換える呼び出し元プログラム書き換え部とを備えることを開示する。
【０００９】
米国特許公開２００８／０１６３１６７Ａ１は、スクリプト言語を用いて、Ｊａｖａ(R)のオブジェクト・メソッド呼び出しを実行するための技法に関し、スクリプト言語のＪａｖａアクセス実装からJavaのメソッドを呼ぶ統一の方式を提供する方法及び、名前でフィールド・アクセスができるようにする技法を開示する。
【００１０】
本出願人に係る特願２００８−２９８３４６号明細書には、未知の型のオブジェクトに高速にアクセスする方法を提供するために、実行のオーバーヘッドの増大を回避し得る、未知の型のオブジェクトを取り扱える方法を、特にアプリケーション・プログラミング・インターフェースとして提供することが記述されている。このプログラミング・インターフェースは、アクセスするフィールドの型がプリミティブ型の場合にもその値を直接利用し得る機能、呼び出すメソッドの返り値やパラメータの型がプリミティブ型の場合にもプリミティブ型の値を直接利用し得る機能、アクセス対象のオブジェクトのクラスに特化したランタイム用のコードを生成し得る機能、とを備え、生成コードにおいては、ｇｅｔｔｅｒ／ｓｅｔｔｅｒメソッド等の指定されたメソッドが直接呼び出される。
【００１１】
http://www.projectzero.org/sMash/1.1.x/docs/zero.devguide.doc/zero.php/ZeroAdvancedPHPJavaBridge.html は、Ｊａｖａ(R)オブジェクトと対話し、Ｊａｖａインターフェースを実装し、Ｊａｖａクラスをイントスタンス化し、ｅｘｔｅｎｄするために、Ｗｅｂｓｐｈｅｒｅ  ｓＭａｓｈで、ＰＨＰ  Ｊａｖａブリッジを使用できることを開示する。このＵＲＬには、ＰＨＰコードの中から、Ｊａｖａのクラスを呼び出すコードも記述されている。例えば、下記のようなコードの例が示されている。
<?php
...
$map = new Java("java.util.HashMap");
$map->put("title","Java Bridge");
...
echo $map->get("title")."\n";
...
?>
【００１２】
しかし、これらの従来技術では、ＰＨＰのような動的スクリプト言語処理系から、生成したクラス・オブジェクトに動的にアクセスすることを可能とする際、上述したその都度のハッシュ・テーブルによるアクセスの遅さの問題が依然としてある。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開２００７−１０９００４号公報
【特許文献２】特願２００８−２９８３４６号明細書
【特許文献３】米国特許公開２００８／０１６３１６７Ａ１
【非特許文献】
【００１４】
【非特許文献１】http://www.projectzero.org/sMash/1.1.x/docs/zero.devguide.doc/zero.php/ZeroAdvancedPHPJavaBridge.html
【発明の概要】
【発明が解決しようとする課題】
【００１５】
従って、この発明の目的は、ＰＨＰのような動的スクリプト言語処理系から、Ｊａｖａ(R)ＶＭのような静的クラスにアクセスする際のオーバーヘッドを減らすことにある。
【課題を解決するための手段】
【００１６】
本発明は、上記目的を解決するためになされたものであり、本発明によれば、ＰＨＰのようなクラスのプロパティ宣言を持つスクリプト言語のプログラムの開始から終了までの処理をＪａｖａ(R)のような言語のプログラムとしてその実行系上で仮想的に複数回処理実行するために、ＰＨＰのプロパティ名pから一意に決まるＪａｖａ(R)のインターフェース・クラスI(p)を必要に応じて生成してロードするＪａｖａ(R)のクラスローダであって、ＰＨＰのプログラム・ファイルやクラスなどに対応して生成するＪａｖａ(R)のクラスをロードするクラスローダ自体またはその親となるをクラスローダが用意される。
【００１７】
そして、本発明によれば、ＰＨＰのプログラムの実行中に出現したＰＨＰのクラスCに対し、クラスＣがクラスBを直接継承しているときに、当該プログラムの実行中ＰＨＰのクラスBに対応させたＪａｖａ(R)のクラスB’をキーとして、クラスB'を継承したＪａｖａ(R)のクラスC'をキャッシュすることにより、動的に作られるＰＨＰ上のクラス階層と同じＪａｖａ(R)上のクラス階層を準備するステップが実行され、
ＰＨＰのクラスCに対応してＪａｖａ(R)のクラスC'を生成するステップにおいては、
a) クラスC'はクラスB'をスーパークラスとする(extendsする)ように宣言し、
b)  ＰＨＰのクラスの各プロパティ宣言に対応してそれぞれＪａｖａ(R)のクラスにフィールドを用意し、
c) 上記インターフェース・クラスI(p)を実装する（implementsする）ようにＪａｖａ(R)のクラスを宣言して、当該インターフェースに備わったメソッドの実装として、Ｊａｖａ(R)のフィールドへのアクセスとしてプロパティ・アクセスのコードを備えさせることにより、インターフェースを通じたプロパティアクセスを可能にするステップが実行される。
【００１８】
本発明によればさらに、ＰＨＰのオブジェクト・アクセスに相当するＪａｖａ(R)コードでは、まず対象オブジェクトの実行時クラス検査（instanceof検査）を行うステップが実行される。このステップは、
a) アクセスされているプロパティpに対応するインターフェース・クラスI(p)を実装している場合には、そのオブジェクトの当該インターフェース経由で高速なプロパティ・アクセスのためのメソッド呼び出しを行うステップと、
b) 実装していない場合には、従来の表探索などの手法による低速なプロパティ・アクセスを行うステップによりコード生成時に未知の型のオブジェクトへのインターフェースを通じた高速なフィールドアクセスを実現するステップ（実行時プロパティ・インターフェース検査）からなる。
【発明の効果】
【００１９】
本発明によれば、従来の技術で必要であった、アクセサを検索するステップが不要であり、型検査のみですむように呼び出し元コードが生成されるので、コードの呼び出しが高速化される。
【図面の簡単な説明】
【００２０】
【図１】ＰＨＰとＪａｖａ(R)のオブジェクトの寿命の対比を図式的に示す図である。
【図２】ＰＨＰのクラスが、場合により、異なるスーパークラスを継承する様子を図式的に示す図である。
【図３】ハードウェア構成のブロック図である。
【図４】機能ブロックのレイヤを示す図である。
【図５】ＰＨＰのクラスに対応して、Ｊａｖａ(R)のクラスを登録する処理のフローチャートを示す図である。
【図６】スーパークラスなしのクラスとして登録する処理のフローチャートを示す図である。
【図７】スーパークラスありのクラスとして登録する処理のフローチャートを示す図である。
【図８】ＰＨＰのクラスと、Ｊａｖａ(R)のクラスの対応の一例を示す図である。
【図９】ＰＨＰのクラスの継承のコードの例を示す図である。
【図１０】ＰＨＰのクラスに対応して、Ｊａｖａ(R)のクラスを生成し、階層関係を記録する様子を示す図である。
【図１１】クラス継承関係キャッシュ・テーブルの内容の例を示す図である。
【図１２】レフレクティブ・アクセスのコードの例を示す図である。
【図１３】ＰＨＰのクラスに対応する、Ｊａｖａ(R)インターフェース・クラスの例を示す図である。
【図１４】クラス階層図の例を示す図である。
【図１５】クラスローダの階層関係を示す図である。
【発明を実施するための形態】
【００２１】
以下、図面に従って、本発明の実施例を説明する。これらの実施例は、本発明の好適な態様を説明するためのものであり、発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断わらない限り、同一符号は、同一の対象を指すものとする。
【００２２】
図３を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図１において、システム・バス３０２には、ＣＰＵ３０４と、主記憶（ＲＡＭ）３０６と、ハードディスク・ドライブ（ＨＤＤ）３０８と、キーボード３１０と、マウス３１２と、ディスプレイ３１４が接続されている。ＣＰＵ３０４は、好適には、３２ビットまたは６４ビットのアーキテクチャに基づくものであり、例えば、インテル社のＰｅｎｔｉｕｍ（商標）４、インテル社のＣｏｒｅ（商標）  ２  ＤＵＯ、ＡＭＤ社のＡｔｈｌｏｎ（商標）などを使用することができる。主記憶３０６は、好適には、１ＧＢ以上の容量、より好ましくは、２ＧＢ以上の容量をもつものである。
【００２３】
ハードディスク・ドライブ３０８には、オペレーティング・システムが、格納されている。オペレーティング・システムは、Ｌｉｎｕｘ（商標）、マイクロソフト社のＷｉｎｄｏｗｓ（商標）  ７、Ｗｉｎｄｏｗｓ  ＸＰ（商標）、Ｗｉｎｄｏｗｓ（商標）２００３サーバ、アップルコンピュータのＭａｃ  ＯＳ（商標）などの、ＣＰＵ３０４に適合する任意のものでよい。
【００２４】
ハードディスク・ドライブ３０８にはまた、Ａｐａｃｈｅなどの、Ｗｅｂサーバとしてシステムを動作させるためのプログラムが保存され、システムの起動時に、主記憶３０６にロードされる。
【００２５】
ハードディスク・ドライブ３０８にはさらに、Ｊａｖａ(R)仮想マシン（ＶＭ）を実現するためのJava(R) Runtime Environmentプログラムが保存され、システムの起動時に、主記憶３０６にロードされる。
【００２６】
ハードディスク・ドライブ３０８にはさらに、Ｊａｖａ(R)クラス・オブジェクト、ローダ、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器、及び、ＰＨＰで書かれたソースコードが保存されている。本発明は、従来技術における、Ｊａｖａ(R)クラス・オブジェクト、ーダ、及びＰＨＰ用Ｊａｖａ(R)バイトコード生成器に変更を加えて、後述する、クラス継承キャッシュなどの機能を実行させるものであるが、その詳細は、後述する。
【００２７】
キーボード３１０及びマウス３１２は、オペレーティング・システムが提供するグラフィック・ユーザ・インターフェースに従い、ディスプレイ３１４に表示されたアイコン、タスクバー、ウインドウなどのグラフィック・オブジェクトを操作するために使用される。
【００２８】
ディスプレイ３１４は、これには限定されないが、好適には、１０２４×７６８以上の解像度をもち、３２ビットtrue colorのＬＣＤモニタである。
【００２９】
通信インターフェース３１６は、好適には、イーサネット(R)プロトコルにより、ネットワークと接続されている。通信インターフェース３１６は、クライアント・コンピュータ（図示しない）からＡｐａｃｈｅが提供する機能により、ＴＣＰ／ＩＰなどの通信プロトコルに従い、処理リクエストを受け取り、あるいは処理結果を、クライアント・コンピュータ（図示しない）に返す。
【００３０】
次に図４の機能レイヤ・ブロック図を参照して、本発明を実施するための機能要素とその働きについて説明する。
【００３１】
図４において、最下層は、オペレーティング・システム４０２であり、これには限定されないが、この実施例では、Ｗｉｎｄｏｗｓ（商標）２００３サーバまたはＬｉｎｕｘ（商標）である。
【００３２】
オペレーティング・システム４０２の上では、オペレーティング・システム４０２に適合するバージョンのＪａｖａ(R)  ＶＭ４０４が動作する。
【００３３】
Ｊａｖａ(R)  ＶＭ４０４のレイヤの上では、本発明に係るＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６、ローダ４０８、Ｊａｖａ(R)実行時ライブラリ４１０が動作する。一実施例では、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６は、通常のＰＨＰ処理系の機能の一部を変更したものであり、ＰＨＰのソースコード（スクリプト）を解釈して、Ｊａｖａ(R)  ＶＭ４０４が実行可能なバイトコードを生成する。
【００３４】
尚、ローダ４０６と、Ｊａｖａ(R)実行時ライブラリ４１０にも、本発明の機能を実現するための変更が加えられていることに留意されたい。
【００３５】
ＰＨＰソースコード４１２は、ハードディスク・ドライブ３０８に保存され、周知のように、<?php 〜 ?>で記述されるステートメントを含み、拡張子phpをもつファイルである。ネットワークを介してクライアント・コンピュータ（図示さない）から受け取ったリクエストに応答して、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６が、指定されたＰＨＰソースコード４１２を解釈実行して、バイトコードを生成する。
【００３６】
次に、図５乃至図７のフローチャートを参照して、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６などが、ＰＨＰソースコード４１２の内容を解釈して、クラスを登録する処理について説明する。
【００３７】
図５のステップ５０２では、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６は、ＰＨＰソースコード４１２中にクラスの宣言があると、ランタイム・シンボル・テーブルに登録されているクラス・オブジェクトを、宣言されたクラス名でルックアップする。ここで、ランタイム・シンボル・テーブルとは、クラス名などを格納するために、主記憶３０６に予め確保された領域である。
【００３８】
ランタイム・シンボル・テーブルに登録されているクラス・オブジェクトが見つかったなら、ステップ５０４で、ステップ５０６に分岐し、クラス名が重複しているというエラーを表示して処理を終る。
【００３９】
ランタイム・シンボル・テーブルに登録されているクラス・オブジェクトが見つからなかったなら、ステップ５０４で、ステップ５０８に分岐し、そこで、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６は、宣言されたクラスが、スーパークラスを継承(extends)しているかどうかの判断を行う。
【００４０】
宣言されたクラスが、スーパークラスを継承していないと判断されたなら、ステップ５１０からステップ５１２に分岐し、そこで、スーパークラスなしのクラスとしての登録が行われる。ステップ５１２の処理は、図６のフローチャートを参照して、後で詳細に説明する。
【００４１】
宣言されたクラスが、スーパークラスを継承していると判断されたなら、ステップ５１４に進み、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６は、ランタイム・シンボル・テーブルに登録されているクラス・オブジェクトを、スーパークラス名でルックアップする。
【００４２】
ランタイム・シンボル・テーブルに登録されているスーパークラスが見つからなかったなら、処理はステップ５１６で、ステップ５１８に分岐し、スーパークラスが見つからないというエラーを表示して処理を終る。
【００４３】
ランタイム・シンボル・テーブルに登録されているスーパークラスが見つかったなら、処理はステップ５１６で、ステップ５２０に分岐し、そこで、スーパークラスありのクラスとしての登録が行われる。ステップ５２０の処理は、図７のフローチャートを参照して、後で詳細に説明する。
【００４４】
次に、図６のフローチャートを参照して、スーパークラスなしのクラスとしての登録処理について説明する。ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６は、ステップ６０２で、この場所、すなわち現在処理中のＰＨＰコードに関連する永続クラス・キャッシュの場所に、クラス・オブジェクトをフェッチしようと試みる。
【００４５】
フェッチできたなら、ステップ６０４で、ステップ６０６に分岐し、そこで、宣言されたクラス名で、ランタイム・シンボル・テーブルに、クラス・オブジェクトが登録されて処理が終わる。
【００４６】
ステップ６０２で、クラス・オブジェクトをフェッチできなかったなら、ステップ６０４からステップ６０８に分岐し、そこで、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６は、ＰＨＰオブジェクトのベース・クラスを継承するクラスのＪａｖａ(R)ＶＭのバイト・コードを生成してロードする。
【００４７】
続いて、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６は、ステップ６１０で、ロードされたクラス・オブジェクトを、この場所、すなわち現在処理中のＰＨＰコードに関連する、永続クラス・キャッシュの場所にストアし、ステップ６０６に進む。ステップ６０６では、宣言されたクラス名で、ランタイム・シンボル・テーブルに、クラス・オブジェクトが登録されて処理が終わる。
【００４８】
次に、図７のフローチャートを参照して、スーパークラスありのクラスとしての登録処理について説明する。ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６は、ステップ７０２で、スーパークラスのクラス・オブジェクトをキーとして、この場所、すなわち現在処理中のＰＨＰコードに関連する、メモリ中の、永続クラス継承キャッシュから、クラス・オブジェクトをフェッチしようと試みる。
【００４９】
フェッチできたなら、ステップ７０４で、処理はステップ７０６に分岐し、そこで、宣言されたクラス名で、ランタイム・シンボル・テーブルに、クラス・オブジェクトが登録されて処理が終わる。
【００５０】
ステップ７０２で、クラス・オブジェクトをフェッチできなかったなら、ステップ７０４からステップ７０８に分岐し、そこで、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６は、スーパークラスのクラス・オブジェクトを継承するクラスのＪａｖａ(R)ＶＭのバイト・コードを生成する。
【００５１】
次に、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６は、ステップ７１０で、スーパークラス、またはもしあるなら、その子クラスのクラス・ローダを用いて、バイト・コードをロードする。
【００５２】
続いて、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６は、ステップ７１２で、スーパークラスのクラス・オブジェクトをキーとして、ロードされたクラス・オブジェクトを、この場所、すなわち現在処理中のＰＨＰコードに関連するメモリ中の、永続クラス継承キャッシュにストアし、ステップ７０６に進む。ステップ７０６では、宣言されたクラス名で、ランタイム・シンボル・テーブルに、クラス・オブジェクトが登録されて処理が終わる。
【００５３】
以上、ＰＨＰソースコードに記述されているクラスに従い、Ｊａｖａ(R)クラスをロードし、登録する処理について説明したが、本発明の理解を深めるために、具体的な例を以ってさらに説明する。図８は、ＰＨＰのクラス階層の一例と、それに対応してＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６によって生成されるＪａｖａ(R)クラス階層の対応を示す図である。
【００５４】
図示されているように、ＰＨＰのクラス階層は、スーパークラスとしてのDashletと、Dashletを継承するDashletGenericと、DashletGenericを継承するMyCasesDashletからなる。
【００５５】
このＰＨＰのクラス階層に対応して生成されるＪａｖａ(R)クラス階層は、スーパークラスとしてのPHPObjectと、PHPObjectを継承するC1_Dashletと、C1_Dashletを継承するC2_DashletGenericと、C2_DashletGenericを継承するC3_MyCasesDashletからなる。
【００５６】
見て取れるように、ＰＨＰのクラスに対応して生成されるＪａｖａ(R)クラスは、PHPObjectをベースのスーパークラスとする。Ｊａｖａ(R)クラスは、PHPObject以下の階層構造は、ＰＨＰのクラス階層と対応するが、対応するクラス名には、クラス名の衝突を回避するために、好適には適当なプリフィックスがＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６によって自動的に付けられる。
【００５７】
図９に、図８のＰＨＰのクラスのソースコードの記述の一部を、継承(extends)も含めて、参考までに示す。
【００５８】
図１０は、ＰＨＰのクラスと、Ｊａｖａ(R)クラスの対応を示す例を示す図である。ＰＨＰソースコード１００２に記述されたクラスＣが、場合により、ＰＨＰソースコード１００４に記述されたクラスＢかまたは、ＰＨＰソースコード１００６に記述されたクラスＢのどちらかを継承することは、図２に関連して既に説明したとおりである。
【００５９】
本発明によれば、ＰＨＰのクラスに対して、一意的な名前のＪａｖａ(R)クラスが生成される。すなわち、ＰＨＰソースコード１００４に記述されたクラスＢに対しては、プリフィックスPO12_で以ってP012_Bという名前のＪａｖａ(R)クラス１００８が生成され、ＰＨＰソースコード１００６に記述されたクラスＢに対しては、プリフィックスP056_で以ってP056_Bという名前のＪａｖａ(R)クラス１０１０が生成される。このようなプリフィックスは、クラス名の衝突を避けるために、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６によって自動生成される。
【００６０】
このように、ＰＨＰソースコード１００４に記述されたクラスＢ、及びＰＨＰソースコード１００６に記述されたクラスＢの各々に一意的に単一のＪａｖａ(R)クラスが生成されるのは、それぞれのクラスＢが、ＰＨＰスクリプト内で、スーパークラスをもたないからである。
【００６１】
さて、本発明によれば、図６のステップ６１０に示すように、スーパークラスをもたないクラスに対して、クラス・オブジェクトが、主記憶３０６の所定領域に確保された永続クラス継承キャッシュにストアされる。
【００６２】
一方、ＰＨＰソースコード１００２に記述されたクラスＣは、ＰＨＰソースコード１００４に記述されたクラスＢまたは、ＰＨＰソースコード１００６に記述されたクラスＢのどちらを継承するからよって、それぞれプリフィックスPO234_とPO567_をもつ、異なるＪａｖａ(R)クラス１０１４、１０１６が生成される。
【００６３】
さらに、本発明によれば、図７のステップ７１２に示すように、スーパークラスをもつクラスに対して、クラス・オブジェクトが、永続クラス継承キャッシュにストアされる。図１０に示すクラス継承関係キャッシュ・テーブル１０１２は、永続クラス・キャッシュにストアされたクラス・オブジェクトと、永続クラス継承キャッシュにストアされたクラス・オブジェクトの間の継承関係を維持する。クラス継承関係キャッシュ・テーブル１０１２の情報は、主記憶３０６の所定の位置に配置されている。
【００６４】
図１１は、クラス継承関係キャッシュ・テーブル１０１２のより詳細な情報を示す図である。図示されているように、クラス継承関係キャッシュ・テーブル１０１２は、キーとしての宣言する場所及び継承されたスーパークラスの実装と、値としての宣言されたクラスの実装の情報を含む。
【００６５】
次に、図１２に、ＰＨＰのクラスのプロパティへの（動的な値でプロパティを指定する）リフレクティブなアクセスに対処する例を示す。Ｊａｖａコード１２０２からは、PHPObjectというクラスが、PHPValueというクラスから継承していることが見て取れる。
【００６６】
また、ＰＨＰソースコード１２０４に対応するＪａｖａクラス１２０６は、ＰＨＰソースコード１２０４の$qというプロパティ名に対応して、PropertyHolder_qというインターフェース・クラスを実装することと、Ｊａｖａコード１２０２におけるprotected PHPValue getReflectivelyNWarning(NameString propName){ }をオーバーライドしていることに留意されたい。インターフェース・クラスPropertyHolder_qは、それを実装するクラスと併せて、ＰＨＰ用Ｊａｖａ(R)バイトコード生成器４０６によって生成される。なお、PropertyHolder_qの詳細は後述する。
【００６７】
図１３は、ＰＨＰソースコードで宣言されたクラス１３０２と、それを継承するクラス１３０４にそれぞれ対応するＪａｖａ(R)インターフェース・クラスPropertyHolder_q１３０６、PropertyHolder_p１３０８、さらには、インターフェース・クラスPropertyHolder_qを実装するクラスPO12_B１３１０、インターフェース・クラスPropertyHolder_pを実装し、クラスPO12_Bを継承するクラスPO234_C１３１２が示されている。このようにすることにより、クラスに対する、いわゆるsetter/getterアクセスを実現することができる。
【００６８】
図１４は、ＰＨＰソースコードで宣言されたクラス１３０２と、それを継承するクラス１３０４に対応して、生成され、あるいは継承されるクラスのクラス図を参考までに示すものである。
【００６９】
さらに、図１５は、図４でローダ４０８として示されているものであり、オンデマンド・インターフェース・ローダを含むクラスローダの階層を示す図である。図１５において、ScriptBuilderはＰＨＰスクリプト（ソースコード）に応じて生成したＪａｖａバイトコード群をロードするクラスローダである（クラスローダ単位で、捨てられるようになっている。）
【００７０】
OnDemandInterfaceLoaderは、プロパティ名ごとに作られるインターフェースのＪａｖａバイトコード群をロードするクラスローダである。Ｊａｖａのクラスローダのセキュリティ上の制約上、プロパティごとのインターフェースを利用するクラスはそのインターフェースをロードしたクラスローダか、そのクラスローダの子クラスローダ（クラスの継承関係とは別）によってロードされなくてはならない。そのため図１５のような構成になっている。
【００７１】
このようなＪａｖａクラスが、ＰＨＰクラスに対応して生成されているとき、下記のようなＰＨＰコードあったとする。
<?php
include "view/C.php"
$o = new C;
$v = $o->p;
?>
但し、view/C.phpは、下記のようなコードだとする。
<?php
class C extends B {
var $p;
}
すると、$v = $o->p;  のところは、下記のようなＪａｖａコードとなるように、ＰＨＰ用バイトコード生成器４０６によってバイトコードが生成される。
PHPValue v = (o instanceof PropertyHolder_p) ?
((PropertyHolder_p) o).get_p() :
Op.shPROPERTY_R(o,runtime,"p");
すなわち、oが、PropertyHolder_pのインスタンスであるときは、((PropertyHolder_p) o).get_p()が実行され、これはgetterアクセスであるので、相対的に高速である。
【００７２】
一方、oが、PropertyHolder_pのインスタンスでない場合は、
Op.shPROPERTY_R(o,runtime,"p")が実行され、これは相対的に時間がかかる。
というのは、shPROPERTY_R()を詳細に書き下すと、
PHPValue shPROPERTY_R(PHPValue o, Runtime r, String propertyName) {
if (o instanceof PHPObject) {
return ((PHPObject) o).getNotDeclared(propertyName);
} else {
....
}
であり、さらに、PHPObjectの宣言は図１２の１２０２のとおりであり、
properties.get(propertyName); 
のようなpropertyNameによるハッシュ検索に時間がかかる。
【００７３】
しかし、本発明が提供する仕組は、$v = $o->p;のところで、oが、PropertyHolder_pのインスタンスである場合、PHPValue v = Op.shPROPERTY_R(o,runtime,"p");
という重い処理の実行を回避することを可能ならしめる。
【００７４】
なお、参考までに、
PHPValue v = (o instanceof PropertyHolder_p) ?
((PropertyHolder_p) o).get_p() :
Op.shPROPERTY_R(o,runtime,"p");
に対応するバイトコードは、次のとおりである。
aload <o>
dup
instanceof PropertyHolder_p
ifeq general
checkcast PropertyHolder_p
invokeinstance PropertyHolder_p.get_p()LPHPValue
goto done
general:
.. Op.shPROPERTY_R(o,runtime,<propertyref p>);
done
astore <v>
【００７５】
以上、本発明の実施例を、動的スクリプト言語としてＰＨＰ、静的言語としてＪａｖａ(R)を使用する例で説明したが、本発明は、このような特定のプログラミング言語処理系あるいは実行系に限定されず、動的スクリプト言語として、オブジェクト指向の概念をサポートするPerl、Ruby、Pythonなどの任意の処理系に本発明を適用可能であることを、この技術分野の当業者なら理解するであろう。また、静的言語の実行系も、Ｊａｖａ(R)に限らず、オブジェクト指向の概念をサポートする任意の実行系を使用することができる。
【００７６】
また、本発明は、サーバ環境のみならず、スタンドアロン環境、クラウド・コンピューティング環境など、任意の環境で使用可能であり、特定のオペレーティング・システム、あるいはハードウェアに限定されるものではないことも、この技術分野の当業者なら理解するであろう。
【符号の説明】
【００７７】
３０２  システム・バス
３０４  ＣＰＵ
３０６  主記憶
３０８  ハードディスク・ドライブ
３１０  キーボード
３１２  マウス
３１４  ディスプレイ
３１６  通信インターフェース
４０２  オペレーティング・システム
４０４  Ｊａｖａ  ＶＭ
４０６  ＰＨＰ用バイトコード生成器
４０８  ローダ
４１０  実行時ライブラリ
４１２  ソースコード
【図１】
0005425715.tif 000002
【図２】
0005425715.tif 000003
【図３】
0005425715.tif 000004
【図４】
0005425715.tif 000005
【図５】
0005425715.tif 000006
【図６】
0005425715.tif 000007
【図７】
0005425715.tif 000008
【図８】
0005425715.tif 000009
【図９】
0005425715.tif 000010
【図１０】
0005425715.tif 000011
【図１１】
0005425715.tif 000012
【図１２】
0005425715.tif 000013
【図１３】
0005425715.tif 000014
【図１４】
0005425715.tif 000015
【図１５】
0005425715.tif 000016