JP5425715B2 - プログラム実行方法、システム及びプログラム - Google Patents

プログラム実行方法、システム及びプログラム Download PDF

Info

Publication number
JP5425715B2
JP5425715B2 JP2010128092A JP2010128092A JP5425715B2 JP 5425715 B2 JP5425715 B2 JP 5425715B2 JP 2010128092 A JP2010128092 A JP 2010128092A JP 2010128092 A JP2010128092 A JP 2010128092A JP 5425715 B2 JP5425715 B2 JP 5425715B2
Authority
JP
Japan
Prior art keywords
class
programming language
program
php
property
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
JP2010128092A
Other languages
English (en)
Other versions
JP2011253437A (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.)
International Business Machines Corp
Original Assignee
International Business Machines 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 International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2010128092A priority Critical patent/JP5425715B2/ja
Priority to US13/151,300 priority patent/US8806432B2/en
Publication of JP2011253437A publication Critical patent/JP2011253437A/ja
Application granted granted Critical
Publication of JP5425715B2 publication Critical patent/JP5425715B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/38Creation or generation of source code for implementing user interfaces
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/51Source to source
    • 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/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/4492Inheritance

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Human Computer Interaction (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Description

この発明は、コンピュータ上で、プログラムを呼び出して実行するための技術に関する。
従来より、サーバ環境で使用されるプログラミング言語処理系、あるいは実行系として、PHPのような動的スクリプト言語と、Java(R)のようなより静的なプログラミング言語が使用されているが、近年になって、Java(R)のクラス資産をPHPなどから簡易に呼び出せるように、Java(R)仮想マシンあるいは、コンピュータ共通言語基盤(CLI)のような静的な言語プラットフォーム上でPHPのような動的スクリプト言語が、静的な言語プラットフォームのクラスを宣言し、タイプ付けされていないアクセスを可能ならしめる仕組みが提供されるようになってきている。
図1は、Java(R)のVM上の実装と、PHPの仮想処理モデルとの対比を示す。Java(R)は静的なプログラミング処理環境なので、符号102で示すように、ロードしたクラス・オブジェクトは、長く残るが、PHPのような動的言語処理系のプログラミング・モデルでは典型的に、ロードしたクラス・オブジェクトがメモリ上にある期間は、符号104、106及び108で示すように、比較的短い。
次に、図2を参照して、PHPのクラスの動的ロードの例を説明する。PHPで書かれたコード202は、$theme/B.phpと、view/C.phpをincludeしている。$themeは変数で、$theme = "theme/classic"の場合は、コード204がincludeされる。コード206は、コード204と同一の場所のファイルであるが、内容が変更されており別のタイム・スタンプをもつという想定である。
$theme = "theme/modern"の場合は、コード208がincludeされる。
コード202に戻って、$o = new Cで、クラスCのインスタンスを生成したとき、クラスCの宣言は、コード210に含まれている。そこで、コード210から見て取れるように、クラスCはクラスBを継承するのであるが、Java VM上でPHPのオブジェクトを呼び出す仕組みが、その都度のハッシュ・テーブルによるアクセスとなって重く、パフォーマンスがよくないという問題点がある。
これに関して知られている従来技術は、下記のとおりである。
特開2007−109004号公報は、引数の内容により処理の異なるプログラムを、解析の容易なプログラムに変換することに関し、プログラム群から呼び出し先プログラムと呼び出し先プログラムの処理を異ならせる引数と該引数の内容とを検出し呼び出し先プログラムの処理のうち引数の内容に応じた処理のみを実行するプログラムを専用呼び出し先プログラムとして、引数と引数の内容毎に生成する専用呼び出し先プログラム生成部と、プログラム群から呼び出し先プログラムを呼び出す呼び出し箇所を検出する呼び出し箇所検出部と、専用呼び出し先プログラム生成部により生成された専用呼び出し先プログラムを呼び出すように呼び出し箇所を書き換える呼び出し元プログラム書き換え部とを備えることを開示する。
米国特許公開2008/0163167A1は、スクリプト言語を用いて、Java(R)のオブジェクト・メソッド呼び出しを実行するための技法に関し、スクリプト言語のJavaアクセス実装からJavaのメソッドを呼ぶ統一の方式を提供する方法及び、名前でフィールド・アクセスができるようにする技法を開示する。
本出願人に係る特願2008−298346号明細書には、未知の型のオブジェクトに高速にアクセスする方法を提供するために、実行のオーバーヘッドの増大を回避し得る、未知の型のオブジェクトを取り扱える方法を、特にアプリケーション・プログラミング・インターフェースとして提供することが記述されている。このプログラミング・インターフェースは、アクセスするフィールドの型がプリミティブ型の場合にもその値を直接利用し得る機能、呼び出すメソッドの返り値やパラメータの型がプリミティブ型の場合にもプリミティブ型の値を直接利用し得る機能、アクセス対象のオブジェクトのクラスに特化したランタイム用のコードを生成し得る機能、とを備え、生成コードにおいては、getter/setterメソッド等の指定されたメソッドが直接呼び出される。
http://www.projectzero.org/sMash/1.1.x/docs/zero.devguide.doc/zero.php/ZeroAdvancedPHPJavaBridge.html は、Java(R)オブジェクトと対話し、Javaインターフェースを実装し、Javaクラスをイントスタンス化し、extendするために、Websphere sMashで、PHP Javaブリッジを使用できることを開示する。このURLには、PHPコードの中から、Javaのクラスを呼び出すコードも記述されている。例えば、下記のようなコードの例が示されている。
<?php
...
$map = new Java("java.util.HashMap");
$map->put("title","Java Bridge");
...
echo $map->get("title")."\n";
...
?>
しかし、これらの従来技術では、PHPのような動的スクリプト言語処理系から、生成したクラス・オブジェクトに動的にアクセスすることを可能とする際、上述したその都度のハッシュ・テーブルによるアクセスの遅さの問題が依然としてある。
特開2007−109004号公報 特願2008−298346号明細書 米国特許公開2008/0163167A1
http://www.projectzero.org/sMash/1.1.x/docs/zero.devguide.doc/zero.php/ZeroAdvancedPHPJavaBridge.html
従って、この発明の目的は、PHPのような動的スクリプト言語処理系から、Java(R)VMのような静的クラスにアクセスする際のオーバーヘッドを減らすことにある。
本発明は、上記目的を解決するためになされたものであり、本発明によれば、PHPのようなクラスのプロパティ宣言を持つスクリプト言語のプログラムの開始から終了までの処理をJava(R)のような言語のプログラムとしてその実行系上で仮想的に複数回処理実行するために、PHPのプロパティ名pから一意に決まるJava(R)のインターフェース・クラスI(p)を必要に応じて生成してロードするJava(R)のクラスローダであって、PHPのプログラム・ファイルやクラスなどに対応して生成するJava(R)のクラスをロードするクラスローダ自体またはその親となるをクラスローダが用意される。
そして、本発明によれば、PHPのプログラムの実行中に出現したPHPのクラスCに対し、クラスCがクラスBを直接継承しているときに、当該プログラムの実行中PHPのクラスBに対応させたJava(R)のクラスB’をキーとして、クラスB'を継承したJava(R)のクラスC'をキャッシュすることにより、動的に作られるPHP上のクラス階層と同じJava(R)上のクラス階層を準備するステップが実行され、
PHPのクラスCに対応してJava(R)のクラスC'を生成するステップにおいては、
a) クラスC'はクラスB'をスーパークラスとする(extendsする)ように宣言し、
b) PHPのクラスの各プロパティ宣言に対応してそれぞれJava(R)のクラスにフィールドを用意し、
c) 上記インターフェース・クラスI(p)を実装する(implementsする)ようにJava(R)のクラスを宣言して、当該インターフェースに備わったメソッドの実装として、Java(R)のフィールドへのアクセスとしてプロパティ・アクセスのコードを備えさせることにより、インターフェースを通じたプロパティアクセスを可能にするステップが実行される。
本発明によればさらに、PHPのオブジェクト・アクセスに相当するJava(R)コードでは、まず対象オブジェクトの実行時クラス検査(instanceof検査)を行うステップが実行される。このステップは、
a) アクセスされているプロパティpに対応するインターフェース・クラスI(p)を実装している場合には、そのオブジェクトの当該インターフェース経由で高速なプロパティ・アクセスのためのメソッド呼び出しを行うステップと、
b) 実装していない場合には、従来の表探索などの手法による低速なプロパティ・アクセスを行うステップによりコード生成時に未知の型のオブジェクトへのインターフェースを通じた高速なフィールドアクセスを実現するステップ(実行時プロパティ・インターフェース検査)からなる。
本発明によれば、従来の技術で必要であった、アクセサを検索するステップが不要であり、型検査のみですむように呼び出し元コードが生成されるので、コードの呼び出しが高速化される。
PHPとJava(R)のオブジェクトの寿命の対比を図式的に示す図である。 PHPのクラスが、場合により、異なるスーパークラスを継承する様子を図式的に示す図である。 ハードウェア構成のブロック図である。 機能ブロックのレイヤを示す図である。 PHPのクラスに対応して、Java(R)のクラスを登録する処理のフローチャートを示す図である。 スーパークラスなしのクラスとして登録する処理のフローチャートを示す図である。 スーパークラスありのクラスとして登録する処理のフローチャートを示す図である。 PHPのクラスと、Java(R)のクラスの対応の一例を示す図である。 PHPのクラスの継承のコードの例を示す図である。 PHPのクラスに対応して、Java(R)のクラスを生成し、階層関係を記録する様子を示す図である。 クラス継承関係キャッシュ・テーブルの内容の例を示す図である。 レフレクティブ・アクセスのコードの例を示す図である。 PHPのクラスに対応する、Java(R)インターフェース・クラスの例を示す図である。 クラス階層図の例を示す図である。 クラスローダの階層関係を示す図である。
以下、図面に従って、本発明の実施例を説明する。これらの実施例は、本発明の好適な態様を説明するためのものであり、発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断わらない限り、同一符号は、同一の対象を指すものとする。
図3を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図1において、システム・バス302には、CPU304と、主記憶(RAM)306と、ハードディスク・ドライブ(HDD)308と、キーボード310と、マウス312と、ディスプレイ314が接続されている。CPU304は、好適には、32ビットまたは64ビットのアーキテクチャに基づくものであり、例えば、インテル社のPentium(商標)4、インテル社のCore(商標) 2 DUO、AMD社のAthlon(商標)などを使用することができる。主記憶306は、好適には、1GB以上の容量、より好ましくは、2GB以上の容量をもつものである。
ハードディスク・ドライブ308には、オペレーティング・システムが、格納されている。オペレーティング・システムは、Linux(商標)、マイクロソフト社のWindows(商標) 7、Windows XP(商標)、Windows(商標)2003サーバ、アップルコンピュータのMac OS(商標)などの、CPU304に適合する任意のものでよい。
ハードディスク・ドライブ308にはまた、Apacheなどの、Webサーバとしてシステムを動作させるためのプログラムが保存され、システムの起動時に、主記憶306にロードされる。
ハードディスク・ドライブ308にはさらに、Java(R)仮想マシン(VM)を実現するためのJava(R) Runtime Environmentプログラムが保存され、システムの起動時に、主記憶306にロードされる。
ハードディスク・ドライブ308にはさらに、Java(R)クラス・オブジェクト、ローダ、PHP用Java(R)バイトコード生成器、及び、PHPで書かれたソースコードが保存されている。本発明は、従来技術における、Java(R)クラス・オブジェクト、ーダ、及びPHP用Java(R)バイトコード生成器に変更を加えて、後述する、クラス継承キャッシュなどの機能を実行させるものであるが、その詳細は、後述する。
キーボード310及びマウス312は、オペレーティング・システムが提供するグラフィック・ユーザ・インターフェースに従い、ディスプレイ314に表示されたアイコン、タスクバー、ウインドウなどのグラフィック・オブジェクトを操作するために使用される。
ディスプレイ314は、これには限定されないが、好適には、1024×768以上の解像度をもち、32ビットtrue colorのLCDモニタである。
通信インターフェース316は、好適には、イーサネット(R)プロトコルにより、ネットワークと接続されている。通信インターフェース316は、クライアント・コンピュータ(図示しない)からApacheが提供する機能により、TCP/IPなどの通信プロトコルに従い、処理リクエストを受け取り、あるいは処理結果を、クライアント・コンピュータ(図示しない)に返す。
次に図4の機能レイヤ・ブロック図を参照して、本発明を実施するための機能要素とその働きについて説明する。
図4において、最下層は、オペレーティング・システム402であり、これには限定されないが、この実施例では、Windows(商標)2003サーバまたはLinux(商標)である。
オペレーティング・システム402の上では、オペレーティング・システム402に適合するバージョンのJava(R) VM404が動作する。
Java(R) VM404のレイヤの上では、本発明に係るPHP用Java(R)バイトコード生成器406、ローダ408、Java(R)実行時ライブラリ410が動作する。一実施例では、PHP用Java(R)バイトコード生成器406は、通常のPHP処理系の機能の一部を変更したものであり、PHPのソースコード(スクリプト)を解釈して、Java(R) VM404が実行可能なバイトコードを生成する。
尚、ローダ406と、Java(R)実行時ライブラリ410にも、本発明の機能を実現するための変更が加えられていることに留意されたい。
PHPソースコード412は、ハードディスク・ドライブ308に保存され、周知のように、<?php 〜 ?>で記述されるステートメントを含み、拡張子phpをもつファイルである。ネットワークを介してクライアント・コンピュータ(図示さない)から受け取ったリクエストに応答して、PHP用Java(R)バイトコード生成器406が、指定されたPHPソースコード412を解釈実行して、バイトコードを生成する。
次に、図5乃至図7のフローチャートを参照して、PHP用Java(R)バイトコード生成器406などが、PHPソースコード412の内容を解釈して、クラスを登録する処理について説明する。
図5のステップ502では、PHP用Java(R)バイトコード生成器406は、PHPソースコード412中にクラスの宣言があると、ランタイム・シンボル・テーブルに登録されているクラス・オブジェクトを、宣言されたクラス名でルックアップする。ここで、ランタイム・シンボル・テーブルとは、クラス名などを格納するために、主記憶306に予め確保された領域である。
ランタイム・シンボル・テーブルに登録されているクラス・オブジェクトが見つかったなら、ステップ504で、ステップ506に分岐し、クラス名が重複しているというエラーを表示して処理を終る。
ランタイム・シンボル・テーブルに登録されているクラス・オブジェクトが見つからなかったなら、ステップ504で、ステップ508に分岐し、そこで、PHP用Java(R)バイトコード生成器406は、宣言されたクラスが、スーパークラスを継承(extends)しているかどうかの判断を行う。
宣言されたクラスが、スーパークラスを継承していないと判断されたなら、ステップ510からステップ512に分岐し、そこで、スーパークラスなしのクラスとしての登録が行われる。ステップ512の処理は、図6のフローチャートを参照して、後で詳細に説明する。
宣言されたクラスが、スーパークラスを継承していると判断されたなら、ステップ514に進み、PHP用Java(R)バイトコード生成器406は、ランタイム・シンボル・テーブルに登録されているクラス・オブジェクトを、スーパークラス名でルックアップする。
ランタイム・シンボル・テーブルに登録されているスーパークラスが見つからなかったなら、処理はステップ516で、ステップ518に分岐し、スーパークラスが見つからないというエラーを表示して処理を終る。
ランタイム・シンボル・テーブルに登録されているスーパークラスが見つかったなら、処理はステップ516で、ステップ520に分岐し、そこで、スーパークラスありのクラスとしての登録が行われる。ステップ520の処理は、図7のフローチャートを参照して、後で詳細に説明する。
次に、図6のフローチャートを参照して、スーパークラスなしのクラスとしての登録処理について説明する。PHP用Java(R)バイトコード生成器406は、ステップ602で、この場所、すなわち現在処理中のPHPコードに関連する永続クラス・キャッシュの場所に、クラス・オブジェクトをフェッチしようと試みる。
フェッチできたなら、ステップ604で、ステップ606に分岐し、そこで、宣言されたクラス名で、ランタイム・シンボル・テーブルに、クラス・オブジェクトが登録されて処理が終わる。
ステップ602で、クラス・オブジェクトをフェッチできなかったなら、ステップ604からステップ608に分岐し、そこで、PHP用Java(R)バイトコード生成器406は、PHPオブジェクトのベース・クラスを継承するクラスのJava(R)VMのバイト・コードを生成してロードする。
続いて、PHP用Java(R)バイトコード生成器406は、ステップ610で、ロードされたクラス・オブジェクトを、この場所、すなわち現在処理中のPHPコードに関連する、永続クラス・キャッシュの場所にストアし、ステップ606に進む。ステップ606では、宣言されたクラス名で、ランタイム・シンボル・テーブルに、クラス・オブジェクトが登録されて処理が終わる。
次に、図7のフローチャートを参照して、スーパークラスありのクラスとしての登録処理について説明する。PHP用Java(R)バイトコード生成器406は、ステップ702で、スーパークラスのクラス・オブジェクトをキーとして、この場所、すなわち現在処理中のPHPコードに関連する、メモリ中の、永続クラス継承キャッシュから、クラス・オブジェクトをフェッチしようと試みる。
フェッチできたなら、ステップ704で、処理はステップ706に分岐し、そこで、宣言されたクラス名で、ランタイム・シンボル・テーブルに、クラス・オブジェクトが登録されて処理が終わる。
ステップ702で、クラス・オブジェクトをフェッチできなかったなら、ステップ704からステップ708に分岐し、そこで、PHP用Java(R)バイトコード生成器406は、スーパークラスのクラス・オブジェクトを継承するクラスのJava(R)VMのバイト・コードを生成する。
次に、PHP用Java(R)バイトコード生成器406は、ステップ710で、スーパークラス、またはもしあるなら、その子クラスのクラス・ローダを用いて、バイト・コードをロードする。
続いて、PHP用Java(R)バイトコード生成器406は、ステップ712で、スーパークラスのクラス・オブジェクトをキーとして、ロードされたクラス・オブジェクトを、この場所、すなわち現在処理中のPHPコードに関連するメモリ中の、永続クラス継承キャッシュにストアし、ステップ706に進む。ステップ706では、宣言されたクラス名で、ランタイム・シンボル・テーブルに、クラス・オブジェクトが登録されて処理が終わる。
以上、PHPソースコードに記述されているクラスに従い、Java(R)クラスをロードし、登録する処理について説明したが、本発明の理解を深めるために、具体的な例を以ってさらに説明する。図8は、PHPのクラス階層の一例と、それに対応してPHP用Java(R)バイトコード生成器406によって生成されるJava(R)クラス階層の対応を示す図である。
図示されているように、PHPのクラス階層は、スーパークラスとしてのDashletと、Dashletを継承するDashletGenericと、DashletGenericを継承するMyCasesDashletからなる。
このPHPのクラス階層に対応して生成されるJava(R)クラス階層は、スーパークラスとしてのPHPObjectと、PHPObjectを継承するC1_Dashletと、C1_Dashletを継承するC2_DashletGenericと、C2_DashletGenericを継承するC3_MyCasesDashletからなる。
見て取れるように、PHPのクラスに対応して生成されるJava(R)クラスは、PHPObjectをベースのスーパークラスとする。Java(R)クラスは、PHPObject以下の階層構造は、PHPのクラス階層と対応するが、対応するクラス名には、クラス名の衝突を回避するために、好適には適当なプリフィックスがPHP用Java(R)バイトコード生成器406によって自動的に付けられる。
図9に、図8のPHPのクラスのソースコードの記述の一部を、継承(extends)も含めて、参考までに示す。
図10は、PHPのクラスと、Java(R)クラスの対応を示す例を示す図である。PHPソースコード1002に記述されたクラスCが、場合により、PHPソースコード1004に記述されたクラスBかまたは、PHPソースコード1006に記述されたクラスBのどちらかを継承することは、図2に関連して既に説明したとおりである。
本発明によれば、PHPのクラスに対して、一意的な名前のJava(R)クラスが生成される。すなわち、PHPソースコード1004に記述されたクラスBに対しては、プリフィックスPO12_で以ってP012_Bという名前のJava(R)クラス1008が生成され、PHPソースコード1006に記述されたクラスBに対しては、プリフィックスP056_で以ってP056_Bという名前のJava(R)クラス1010が生成される。このようなプリフィックスは、クラス名の衝突を避けるために、PHP用Java(R)バイトコード生成器406によって自動生成される。
このように、PHPソースコード1004に記述されたクラスB、及びPHPソースコード1006に記述されたクラスBの各々に一意的に単一のJava(R)クラスが生成されるのは、それぞれのクラスBが、PHPスクリプト内で、スーパークラスをもたないからである。
さて、本発明によれば、図6のステップ610に示すように、スーパークラスをもたないクラスに対して、クラス・オブジェクトが、主記憶306の所定領域に確保された永続クラス継承キャッシュにストアされる。
一方、PHPソースコード1002に記述されたクラスCは、PHPソースコード1004に記述されたクラスBまたは、PHPソースコード1006に記述されたクラスBのどちらを継承するからよって、それぞれプリフィックスPO234_とPO567_をもつ、異なるJava(R)クラス1014、1016が生成される。
さらに、本発明によれば、図7のステップ712に示すように、スーパークラスをもつクラスに対して、クラス・オブジェクトが、永続クラス継承キャッシュにストアされる。図10に示すクラス継承関係キャッシュ・テーブル1012は、永続クラス・キャッシュにストアされたクラス・オブジェクトと、永続クラス継承キャッシュにストアされたクラス・オブジェクトの間の継承関係を維持する。クラス継承関係キャッシュ・テーブル1012の情報は、主記憶306の所定の位置に配置されている。
図11は、クラス継承関係キャッシュ・テーブル1012のより詳細な情報を示す図である。図示されているように、クラス継承関係キャッシュ・テーブル1012は、キーとしての宣言する場所及び継承されたスーパークラスの実装と、値としての宣言されたクラスの実装の情報を含む。
次に、図12に、PHPのクラスのプロパティへの(動的な値でプロパティを指定する)リフレクティブなアクセスに対処する例を示す。Javaコード1202からは、PHPObjectというクラスが、PHPValueというクラスから継承していることが見て取れる。
また、PHPソースコード1204に対応するJavaクラス1206は、PHPソースコード1204の$qというプロパティ名に対応して、PropertyHolder_qというインターフェース・クラスを実装することと、Javaコード1202におけるprotected PHPValue getReflectivelyNWarning(NameString propName){ }をオーバーライドしていることに留意されたい。インターフェース・クラスPropertyHolder_qは、それを実装するクラスと併せて、PHP用Java(R)バイトコード生成器406によって生成される。なお、PropertyHolder_qの詳細は後述する。
図13は、PHPソースコードで宣言されたクラス1302と、それを継承するクラス1304にそれぞれ対応するJava(R)インターフェース・クラスPropertyHolder_q1306、PropertyHolder_p1308、さらには、インターフェース・クラスPropertyHolder_qを実装するクラスPO12_B1310、インターフェース・クラスPropertyHolder_pを実装し、クラスPO12_Bを継承するクラスPO234_C1312が示されている。このようにすることにより、クラスに対する、いわゆるsetter/getterアクセスを実現することができる。
図14は、PHPソースコードで宣言されたクラス1302と、それを継承するクラス1304に対応して、生成され、あるいは継承されるクラスのクラス図を参考までに示すものである。
さらに、図15は、図4でローダ408として示されているものであり、オンデマンド・インターフェース・ローダを含むクラスローダの階層を示す図である。図15において、ScriptBuilderはPHPスクリプト(ソースコード)に応じて生成したJavaバイトコード群をロードするクラスローダである(クラスローダ単位で、捨てられるようになっている。)
OnDemandInterfaceLoaderは、プロパティ名ごとに作られるインターフェースのJavaバイトコード群をロードするクラスローダである。Javaのクラスローダのセキュリティ上の制約上、プロパティごとのインターフェースを利用するクラスはそのインターフェースをロードしたクラスローダか、そのクラスローダの子クラスローダ(クラスの継承関係とは別)によってロードされなくてはならない。そのため図15のような構成になっている。
このようなJavaクラスが、PHPクラスに対応して生成されているとき、下記のようなPHPコードあったとする。
<?php
include "view/C.php"
$o = new C;
$v = $o->p;
?>
但し、view/C.phpは、下記のようなコードだとする。
<?php
class C extends B {
var $p;
}
すると、$v = $o->p; のところは、下記のようなJavaコードとなるように、PHP用バイトコード生成器406によってバイトコードが生成される。
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の宣言は図12の1202のとおりであり、
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>
以上、本発明の実施例を、動的スクリプト言語としてPHP、静的言語としてJava(R)を使用する例で説明したが、本発明は、このような特定のプログラミング言語処理系あるいは実行系に限定されず、動的スクリプト言語として、オブジェクト指向の概念をサポートするPerl、Ruby、Pythonなどの任意の処理系に本発明を適用可能であることを、この技術分野の当業者なら理解するであろう。また、静的言語の実行系も、Java(R)に限らず、オブジェクト指向の概念をサポートする任意の実行系を使用することができる。
また、本発明は、サーバ環境のみならず、スタンドアロン環境、クラウド・コンピューティング環境など、任意の環境で使用可能であり、特定のオペレーティング・システム、あるいはハードウェアに限定されるものではないことも、この技術分野の当業者なら理解するであろう。
302 システム・バス
304 CPU
306 主記憶
308 ハードディスク・ドライブ
310 キーボード
312 マウス
314 ディスプレイ
316 通信インターフェース
402 オペレーティング・システム
404 Java VM
406 PHP用バイトコード生成器
408 ローダ
410 実行時ライブラリ
412 ソースコード

Claims (9)

  1. コンピュータの処理によって、クラスのプロパティ宣言を持つ動的スクリプト言語である第1のプログラミング言語のプログラムを、第2のプログラミング言語の実行系上で仮想的に実行するための方法であって、
    前記コンピュータの処理によって、前記第1のプログラミング言語の前記プログラムのプロパティ名から一意的に決まるインターフェース・クラスを生成してロードするステップと、
    前記コンピュータの処理によって、前記第1のプログラミング言語の前記プログラムの実行中に出現した前記第1のプログラミング言語の第のクラスに対し、前記第1のプログラミング言語の該第のクラスが、前記第1のプログラミング言語の第のクラスを直接継承しているときに、前記第1のプログラミング言語の前記第1のクラスに対応させた前記第2のプログラミング言語の第1のクラスをキーとして、前記第2のプログラミング言語の第1のクラスを継承した前記第2のプログラミング言語の第2のクラスをキャッシュすることにより、動的に作られる前記第1のプログラミング言語の前記プログラム上のクラス階層と対応するように、前記第2のプログラミング言語の実行系上のクラス階層を用意するステップを有し、
    前記第1のプログラミング言語の前記プログラムの前記第1及び第2のクラスのプロパティ宣言に対応して、前記第2のプログラミング言語の前記第1及び第2のクラスにフィールドが用意され、
    前記インターフェース・クラスを実装するように用意された前記第2のプログラミング言語のクラスにより、前記インターフェース・クラスを通じたプロパティ・アクセス・ステップが可能ならしめられる、
    プログラム実行方法。
  2. 前記インターフェースを通じたプロパティ・アクセス・ステップは、該プロパティに対応するインターフェース・クラスが実装されているかどうかを判断し、もしそうなら、該インターフェース・クラス経由でフィールドへのアクセスを実現するステップを有する、請求項1に記載のプログラム実行方法。
  3. 前記第1のプログラミング言語がPHPであり、前記第2のプログラミング言語がJava(R)である、請求項1に記載のプログラム実行方法。
  4. コンピュータの処理によって、クラスのプロパティ宣言を持つ動的スクリプト言語である第1のプログラミング言語のプログラムを、第2のプログラミング言語の実行系上で仮想的に実行するためのプログラムであって、
    前記コンピュータに、
    前記第1のプログラミング言語の前記プログラムのプロパティ名から一意的に決まるインターフェース・クラスを生成してロードするステップと、
    前記第1のプログラミング言語の前記プログラムの実行中に出現した前記第1のプログラミング言語の第のクラスに対し、前記第1のプログラミング言語の該第のクラスが、前記第1のプログラミング言語の第のクラスを直接継承しているときに、前記第1のプログラミング言語の前記第1のクラスに対応させた前記第2のプログラミング言語の第1のクラスをキーとして、前記第2のプログラミング言語の第1のクラスを継承した前記第2のプログラミング言語の第2のクラスをキャッシュすることにより、動的に作られる前記第1のプログラミング言語の前記プログラム上のクラス階層と対応するように、前記第2のプログラミング言語の実行系上のクラス階層を用意するステップを実行させ、
    前記第1のプログラミング言語の前記プログラムの前記第1及び第2のクラスのプロパティ宣言に対応して、前記第2のプログラミング言語の前記第1及び第2のクラスにフィールドが用意され、
    前記インターフェース・クラスを実装するように用意された前記第2のプログラミング言語のクラスにより、前記インターフェース・クラスを通じたプロパティ・アクセス・ステップが可能ならしめられる、
    プログラム実行プログラム。
  5. 前記インターフェースを通じたプロパティ・アクセス・ステップは、該プロパティに対応するインターフェース・クラスが実装されているかどうかを判断し、もしそうなら、該インターフェース・クラス経由でフィールドへのアクセスを実現するステップを有する、請求項4に記載のプログラム。
  6. 前記第1のプログラミング言語がPHPであり、前記第2のプログラミング言語がJava(R)である、請求項4に記載のプログラム。
  7. コンピュータの処理によって、クラスのプロパティ宣言を持つ動的スクリプト言語である第1のプログラミング言語のプログラムを、第2のプログラミング言語の実行系上で仮想的に実行するためのシステムであって、
    前記第1のプログラミング言語の前記プログラムのプロパティ名から一意的に決まるインターフェース・クラスを生成してロードする手段と、
    前記第1のプログラミング言語の前記プログラムの実行中に出現した前記第1のプログラミング言語の第のクラスに対し、前記第1のプログラミング言語の該第のクラスが、前記第1のプログラミング言語の第のクラスを直接継承しているときに、前記第1のプログラミング言語の前記第1のクラスに対応させた前記第2のプログラミング言語の第1のクラスをキーとして、前記第2のプログラミング言語の第1のクラスを継承した前記第2のプログラミング言語の第2のクラスをキャッシュすることにより、動的に作られる前記第1のプログラミング言語の前記プログラム上のクラス階層と対応するように、前記第2のプログラミング言語の実行系上のクラス階層を用意する手段を有し、
    前記第1のプログラミング言語の前記プログラムの前記第1及び第2のクラスのプロパティ宣言に対応して、前記第2のプログラミング言語の前記第1及び第2のクラスにフィールドが用意され、
    前記インターフェース・クラスを実装するように用意された前記第2のプログラミング言語のクラスにより、前記インターフェース・クラスを通じたプロパティ・アクセス・ステップが可能ならしめられる、
    プログラム実行システム。
  8. 前記インターフェースを通じたプロパティ・アクセス・ステップは、該プロパティに対応するインターフェース・クラスが実装されているかどうかを判断し、もしそうなら、該インターフェース・クラス経由でフィールドへのアクセスを実現するステップを有する、請求項7に記載のシステム。
  9. 前記第1のプログラミング言語がPHPであり、前記第2のプログラミング言語がJava(R)である、請求項7に記載のシステム。
JP2010128092A 2010-06-03 2010-06-03 プログラム実行方法、システム及びプログラム Expired - Fee Related JP5425715B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2010128092A JP5425715B2 (ja) 2010-06-03 2010-06-03 プログラム実行方法、システム及びプログラム
US13/151,300 US8806432B2 (en) 2010-06-03 2011-06-02 Method, system, and program for executing program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2010128092A JP5425715B2 (ja) 2010-06-03 2010-06-03 プログラム実行方法、システム及びプログラム

Publications (2)

Publication Number Publication Date
JP2011253437A JP2011253437A (ja) 2011-12-15
JP5425715B2 true JP5425715B2 (ja) 2014-02-26

Family

ID=45065484

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010128092A Expired - Fee Related JP5425715B2 (ja) 2010-06-03 2010-06-03 プログラム実行方法、システム及びプログラム

Country Status (2)

Country Link
US (1) US8806432B2 (ja)
JP (1) JP5425715B2 (ja)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102339219B (zh) * 2010-07-20 2016-08-24 甲骨文国际公司 用于支持面向对象脚本工具的系统和方法
JP6223002B2 (ja) * 2013-06-10 2017-11-01 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation コンピュータにおけるオブジェクトの処理方法、プログラム及びシステム
US10120661B2 (en) * 2015-07-16 2018-11-06 Sugarcrm Inc. Multi-flavored software execution from a singular code base
US11044365B1 (en) 2016-06-23 2021-06-22 8X8, Inc. Multi-level programming/data sets with decoupling VoIP communications interface
US10404759B1 (en) 2016-06-23 2019-09-03 8×8, Inc. Client-specific control of shared telecommunications services
US10348902B1 (en) 2016-06-23 2019-07-09 8X8, Inc. Template-based management of telecommunications services
US11412084B1 (en) 2016-06-23 2022-08-09 8X8, Inc. Customization of alerts using telecommunications services
US11671533B1 (en) 2016-06-23 2023-06-06 8X8, Inc. Programming/data sets via a data-communications server
CN108376072A (zh) * 2016-11-14 2018-08-07 平安科技(深圳)有限公司 类名更改方法和装置
US10749938B1 (en) * 2017-06-23 2020-08-18 8×8, Inc. Switchboard server using a high-level programming interface
US10951484B1 (en) 2017-06-23 2021-03-16 8X8, Inc. Customized call model generation and analytics using a high-level programming interface
US10447861B1 (en) 2017-06-23 2019-10-15 8X8, Inc. Intelligent call handling and routing based on numbering plan area code
US10425531B1 (en) 2017-06-23 2019-09-24 8X8, Inc. Customized communication lists for data communications systems using high-level programming
US10846202B2 (en) * 2018-07-17 2020-11-24 Oracle International Corporation Multi-language heap analyzer

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4712512B2 (ja) 2005-10-14 2011-06-29 富士通株式会社 プログラム変換プログラム、プログラム変換装置、プログラム変換方法
US20080163167A1 (en) 2006-12-29 2008-07-03 Motorola, Inc. Incorporating an arbitrary scripting language with native support for java objects
JP5419033B2 (ja) 2008-11-21 2014-02-19 インターナショナル・ビジネス・マシーンズ・コーポレーション 未知のオブジェクトにアクセスする方法
US9003380B2 (en) * 2010-01-12 2015-04-07 Qualcomm Incorporated Execution of dynamic languages via metadata extraction

Also Published As

Publication number Publication date
JP2011253437A (ja) 2011-12-15
US20110302557A1 (en) 2011-12-08
US8806432B2 (en) 2014-08-12

Similar Documents

Publication Publication Date Title
JP5425715B2 (ja) プログラム実行方法、システム及びプログラム
US11366643B2 (en) Generating dynamic modular proxies
JP5466601B2 (ja) コード生成方法、システム及びプログラム
US7870546B2 (en) Collaborative classloader system and method
US8615750B1 (en) Optimizing application compiling
US20110131556A1 (en) Method, computer program and computer system for converting source code written in dynamically typed language into target code written in statically typed language and executing target code
JP6182160B2 (ja) 実行中のプロセスへのコードの動的挿入
US11366684B2 (en) Import mechanism for hardware intrinsics
US11726849B2 (en) Executing a parametric method within a specialized context
US20100058338A1 (en) Callbacks in virtual machines
EP2511820A1 (en) Bypassing user mode redirection
US9921858B2 (en) Apparatus and method for realizing runtime system for programming language
US10521200B2 (en) Unambiguous proxying of interface methods
US20050010934A1 (en) Native code isolation in a multi-tasking java virtual machine
US9471341B1 (en) Optimizing latest user defined class loader
US9015728B2 (en) Methods, apparatus, and systems to access runtime values of object instances
JP6223002B2 (ja) コンピュータにおけるオブジェクトの処理方法、プログラム及びシステム
Peck et al. Ghost: A uniform and general-purpose proxy implementation

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20130218

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130723

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20131018

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20131127

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

Ref document number: 5425715

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees