(57)【要約】【課題】  そのソースファイルにより生成されたプログラムの実行性能を向上させることが可能な技術を提供する。【解決手段】  アクセス対象に関する実行時の情報であるアクセス情報に示されたアクセス対象の直接アクセス部分の記述が展開クラスソースファイルに追加されているか否かを検査してその結果を記憶装置へ格納するステップと、前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述を追加した展開クラスソースファイルを生成して記憶装置へ格納するステップと、前記検査の結果を記憶装置から読み出し、前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述が追加されていないことを前記結果が示している場合に前記展開クラスソースファイルの生成処理を呼び出す展開処理を行うステップとを有するものである。【選択図】図２
2006343796.tif 000002
【特許請求の範囲】
【請求項１】
リフレクション機構を用いる記述を直接アクセス方法を用いる記述に変換するソースファイル変換方法であって、
アクセス対象に関する実行時の情報であるアクセス情報に示されたアクセス対象の直接アクセス部分の記述が展開クラスソースファイルに追加されているか否かを検査してその結果を記憶装置へ格納するステップと、
前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述を追加した展開クラスソースファイルを生成して記憶装置へ格納するステップと、
前記検査の結果を記憶装置から読み出し、前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述が追加されていないことを前記結果が示している場合に前記展開クラスソースファイルの生成処理を呼び出す展開処理を行うステップとを有することを特徴とするソースファイル変換方法。
【請求項２】
前記アクセス情報に対応した直接アクセス部分の識別情報を含む識別子を前記検査の結果として記憶装置に格納することを特徴とする請求項１に記載されたソースファイル変換方法。
【請求項３】
対象クラスソースファイルに前記展開処理の呼び出しを追加した初期の展開クラスソースファイルを生成して記憶装置に格納する初期展開クラス生成処理を行うステップを有することを特徴とする請求項１または請求項２のいずれかに記載されたソースファイル変換方法。
【請求項４】
前記展開クラスソースファイルにより生成された展開クラスのインスタンスのメソッドを委譲呼び出しする委譲クラスソースファイルを生成して記憶装置に格納する委譲クラス生成処理を行うステップを有することを特徴とする請求項１乃至請求項３のいずれか１項に記載されたソースファイル変換方法。
【請求項５】
前記委譲クラスソースファイルが記憶装置に格納されているかどうかを調べて前記委譲クラス生成処理が行われているか否かを検査し、まだ前記委譲クラス生成処理が行われていない場合には前記委譲クラス生成処理及び初期展開クラス生成処理を呼び出し、既に前記委譲クラス生成処理が行われている場合にはその委譲クラスソースファイルから生成された委譲クラスのロードを行うステップを有することを特徴とする請求項４に記載されたソースファイル変換方法。
【請求項６】
最も新しく生成された展開クラスを選択してインスタンスを生成して記憶装置に格納するステップを有することを特徴とする請求項１乃至請求項５のいずれか１項に記載されたソースファイル変換方法。
【請求項７】
前記展開クラスソースファイルを生成する際に、その展開クラスが最新のものであるかを識別する為の識別情報をクラス名に付加して展開クラスソースファイルの生成を行うことを特徴とする請求項１乃至請求項６のいずれか１項に記載されたソースファイル変換方法。
【請求項８】
リフレクション機構を用いる記述を直接アクセス方法を用いる記述に変換するソースファイル変換装置であって、
アクセス対象に関する実行時の情報であるアクセス情報に示されたアクセス対象の直接アクセス部分の記述が展開クラスソースファイルに追加されているか否かを検査してその結果を記憶装置へ格納する展開済検査手続きと、
前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述を追加した展開クラスソースファイルを生成して記憶装置へ格納する展開クラス生成手続きと、
前記展開済検査手続きを呼び出してその検査の結果を記憶装置から読み出し、前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述が追加されていないことを前記結果が示している場合に前記展開クラス生成手続きを呼び出す展開手続きとを備えることを特徴とするソースファイル変換装置。
【請求項９】
リフレクション機構を用いる記述を直接アクセス方法を用いる記述に変換するソースファイル変換方法をコンピュータに実行させる為のプログラムであって、
アクセス対象に関する実行時の情報であるアクセス情報に示されたアクセス対象の直接アクセス部分の記述が展開クラスソースファイルに追加されているか否かを検査してその結果を記憶装置へ格納するステップと、
前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述を追加した展開クラスソースファイルを生成して記憶装置へ格納するステップと、
前記検査の結果を記憶装置から読み出し、前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述が追加されていないことを前記結果が示している場合に前記展開クラスソースファイルの生成処理を呼び出す展開処理を行うステップとをコンピュータに実行させることを特徴とするプログラム。
【請求項１０】
リフレクション機構を用いる記述を直接アクセス方法を用いる記述に変換するソースファイル変換方法をコンピュータに実行させる為のプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
アクセス対象に関する実行時の情報であるアクセス情報に示されたアクセス対象の直接アクセス部分の記述が展開クラスソースファイルに追加されているか否かを検査してその結果を記憶装置へ格納するステップと、
前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述を追加した展開クラスソースファイルを生成して記憶装置へ格納するステップと、
前記検査の結果を記憶装置から読み出し、前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述が追加されていないことを前記結果が示している場合に前記展開クラスソースファイルの生成処理を呼び出す展開処理を行うステップとをコンピュータに実行させる為のプログラムを記録したことを特徴とするコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はプログラムの実行性能を向上させる為にソースファイルを変換するソースファイル変換技術に関し、特にリフレクション機構を用いる記述を直接アクセス方法を用いる記述に変換したソースファイルを生成するソースファイル変換技術に適用して有効な技術に関するものである。
【背景技術】
【０００２】
従来のプログラムにおいてメソッドやメンバ変数にアクセスする場合、通常はアクセスするメソッドやメンバ変数をソースファイルの中で直接指定する（以後、アクセスする対象であるメソッドやメンバ変数をアクセス対象と呼び、またアクセス対象をソースファイルの中で直接指定してアクセスする方法を直接アクセス方法と呼ぶ）。
【０００３】
Java(登録商標)等のプログラミング言語には、ロードしたプログラム自体をデータとして扱うことを可能にするリフレクション機構が存在する。このリフレクション機構を用いると、アクセス対象の情報をプログラムの実行時に検出して利用することが可能となる。これは拡張性の高いプログラムを実現する際に有用であるため、リフレクション機構が存在するプログラミング言語を用いたプログラムにおいて拡張性が求められる場面で、多くのソースファイルはリフレクション機構を用いる様に記述されている。以後、リフレクション機構を用いることによりアクセス対象の情報を実行時に検出してアクセスする方法をリフレクションアクセス方法と呼ぶ。このリフレクションアクセス方法では、アクセス対象の検索やアクセス権限のチェックを行うため、直接アクセス方法よりも実行性能が劣る。
【０００４】
また、プログラムの実行時にアクセス対象の情報を検出してアクセスする機能を、バイトコード生成によって実現する方法がある（例えば、非特許文献１参照。）。この方法では、バイトコード処理ライブラリを利用して、直接アクセス方法を用いてアクセスを行うバイトコードを実行時に生成する。以後、この方法をバイトコード生成アクセス方法と呼ぶ。バイトコード生成アクセス方法は実行時にアクセス対象の情報を検出してアクセスする機能を有し、かつ直接アクセス方法と同等の実行性能を実現する。一方、バイトコード生成アクセス方法では、直接アクセス方法を用いてアクセスするバイトコードを実行時に生成する様に、ソースファイルの内容を記述しておく必要がある。
【０００５】
【非特許文献１】Dennis Sosnoski著、「Java programming dynamics、Part8: Replacing reflection with code generation」、http://www-106.ibm.com/developerworks/java/library/j-dyn0610/
【発明の開示】
【発明が解決しようとする課題】
【０００６】
実行時にアクセス対象の情報を検出してアクセスするプログラムを実現する既存のソースファイルの多くは、プログラミング言語の仕様で用意されているリフレクションアクセス方法を用いる様に記述されている。しかしリフレクションアクセス方法は、アクセス対象の検索やアクセス権限のチェックを行うため、直接アクセス方法よりも実行性能が劣る。
【０００７】
バイトコード生成アクセス方法では、実行時にアクセス対象の情報を検出してアクセスするプログラムを、直接アクセス方法と同等の実行性能で実現できる。しかし、直接アクセス方法でアクセスするプログラムを実行時に生成する様、ソースファイルの内容を記述しておく必要がある。このため、リフレクションアクセス方法で記述されている既存のソースファイルに対してバイトコード生成アクセス方法を適用する場合には、ソースファイルの内容を作り直してテストを行う必要があるため、大きなコストが発生してしまう。
【０００８】
本発明の目的は上記問題を解決し、リフレクション機構を用いる様に記述されたソースファイルを手作業で変更すること無く、そのソースファイルにより生成されたプログラムの実行性能を向上させることが可能な技術を提供することにある。
【課題を解決するための手段】
【０００９】
本発明は、リフレクション機構を用いる記述を直接アクセス方法を用いる記述に変換するソースファイル変換装置であって、実行時のアクセス情報に対応する直接アクセス部分の記述がソースファイルに追加されていない場合にその直接アクセス部分の記述を追加した展開クラスソースファイルを生成するものである。
【００１０】
本発明では、まず、リフレクション機構を用いる対象クラスソースファイルを、後述の展開クラスソースファイルにより生成される展開クラスのインスタンスのメソッドを委譲呼び出しする様に変更した委譲クラスソースファイルを生成する。
【００１１】
次に、リフレクション機構を用いる対象クラスソースファイルに展開手続きの呼び出しを追加した初期の展開クラスソースファイルを生成し、その展開クラスソースファイルから得られる展開クラスによりインスタンスを生成する。
【００１２】
その後、前記委譲クラスソースファイルにより得られる委譲クラスにより展開クラスのインスタンスのメソッドを委譲呼び出しすると、そこで呼び出された展開手続きでは、その実行時のアクセス対象に関する情報であるアクセス情報を取得して展開済検査手続きを呼び出す。
【００１３】
展開済検査手続きでは、前記アクセス情報と展開クラスソースファイルとを比較し、そのアクセス情報に示されたアクセス対象の直接アクセス部分の記述が前記展開クラスソースファイルに追加されているか否かを検査して、その結果を主記憶装置に格納し展開手続きへ返す。
【００１４】
展開手続きでは、前記結果を参照し、前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述が前記展開クラスソースファイルに追加されていないことを前記結果が示している場合には展開クラス生成手続きを呼び出し、展開クラス生成手続きでは、前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述を追加した展開クラスソースファイルを生成し、その展開クラスソースファイルから得られる最も新しい展開クラスによりインスタンスを生成する。
【００１５】
また、前記結果を参照した結果、前記アクセス情報に示されたアクセス対象の直接アクセス部分の記述が前記展開クラスソースファイルに追加されている場合には、その結果に示された識別子で識別される直接アクセス部分に分岐してその直接アクセス部分の処理を実行する。
【００１６】
前記の様に本発明では、実行時のアクセス情報に対応する直接アクセス部分の記述が展開クラスソースファイルに追加されていない場合に、その直接アクセス部分の記述を追加した展開クラスソースファイルを生成するので、次の実行時で同じアクセス情報が用いられた場合には、そのアクセス情報に対応する直接アクセス部分によりプログラムを実行することが可能となり、その実行性能を向上させることができる。
【発明の効果】
【００１７】
本発明によれば、リフレクション機構を用いる様に記述されたソースファイルを手作業で変更すること無く、そのソースファイルにより生成されたプログラムの実行性能を向上させることが可能である。
【発明を実施するための最良の形態】
【００１８】
以下にプログラミング言語Javaを例とし、またアクセス対象がメソッドである場合を例として、リフレクション機構を用いる記述を直接アクセス方法を用いる記述に変換する一実施形態のソースファイル変換装置について説明する。
【００１９】
図１は本実施形態のソースファイル変換装置の概略構成を示す図である。図１に示す様に計算機１０１は、ＣＰＵ１０２、主記憶１０４、二次記憶装置１１７、及び、これらを相互に接続するバス１０３を備えている。
【００２０】
主記憶１０４は、オペレーティングシステムであるＯＳ１０５と、ＯＳ１０５上で動作するプログラミング言語Javaの実行環境(Java Runtime Environment)であるＪＲＥ１０６と、ＪＲＥ１０６上で動作する実行プログラム１０７を含み、実行プログラム１０７は、本実施形態の計算機１０１によって生成される１つ又は複数の委譲クラス１１５と、１つ又は複数の展開クラス１１６を含み、更に、本実施形態における課題を解決する手続きである展開準備手続き１０８、委譲クラス生成手続き１０９、初期展開クラス生成手続き１１０、展開手続き１１１、展開済検査手続き１１２、展開クラス生成手続き１１３、委譲先インスタンス生成手続き１１４を含んでいる。
【００２１】
また二次記憶装置１１７は、１つ又は複数の対象クラスソースファイル１１８、委譲クラス生成手続き１０９が出力する１つ又は複数の委譲クラスソースファイル１１９、初期展開クラス生成手続き１１０が出力する１つ又は複数の初期展開クラスソースファイル１２０、展開クラス生成手続き１１３が出力する１つ又は複数の展開クラスソースファイル１２１、委譲クラスソースファイル１１９をコンパイルして得る１つ又は複数の委譲クラスクラスファイル１２２、及び、初期展開クラスソースファイル１２０、展開クラスソースファイル１２１をコンパイルして得る１つ又は複数の展開クラスクラスファイル１２３を含んでいる。
【００２２】
本実施形態の計算機１０１に前記各手続きを実行させる為のプログラムは、ＣＤ−ＲＯＭ等の記録媒体に記録され磁気ディスク等に格納された後、主記憶装置にロードされて実行されるものとする。なお前記プログラムを記録する記録媒体はＣＤ−ＲＯＭ以外の他の記録媒体でも良い。また前記プログラムを当該記録媒体から計算機１０１にインストールして使用しても良いし、ネットワークを通じて当該記録媒体にアクセスして前記プログラムを使用するものとしても良い。
【００２３】
図２は本実施形態のソースファイル変換処理の入出力の概要を示す図である。図２に示す様に、展開準備手続き１０８は対象クラスソースファイル１１８を入力２０１として受け取り、対象クラスソースファイル１１８を渡して委譲クラス生成手続き１０９の呼び出し２０２及び初期展開クラス生成手続き１１０の呼び出し２０３を行う。
【００２４】
委譲クラス生成手続き１０９は、展開準備手続き１０８を介して対象クラスソースファイル１１８を入力として受け取り、展開クラス１１６のインスタンスのメソッドを委譲呼び出しする委譲クラスソースファイル１１９を出力２０４とする。
【００２５】
初期展開クラス生成手続き１１０は、展開準備手続き１０８を介して対象クラスソースファイル１１８を入力として受け取り、展開手続き１１１の呼び出しを含む初期展開クラスソースファイル１２０を出力２０５とする。
【００２６】
展開手続き１１１は、実行時のアクセス対象の情報を示すアクセス情報２０７を入力２０８として受け取り、アクセス情報２０７を渡して展開済検査手続き１１２の呼び出し２０９を行う。展開済検査手続き１１２は、直接アクセス部分が展開クラス１１６のソースファイルに追加済みであるかどうかや、追加済みである場合にアクセス情報２０７に対応した直接アクセス部分を示す識別子を返り値として展開手続き１１１に返す。また、展開手続き１１１は、展開済検査手続き１１２からの返り値が直接アクセス部分の追加されていないことを示している場合にアクセス情報２０７を渡して展開クラス生成手続き１１３の呼び出し２１０を行う。
【００２７】
展開クラス生成手続き１１３は、展開手続き１１１を介してアクセス情報２０７を入力とし、更に初期展開クラスソースファイル１２０を入力２０６とし、アクセス情報２０７に対応する直接アクセス部分を追加した展開クラスソースファイル１２１を出力２１２とする。そして展開クラス生成手続き１１３は、更に委譲先インスタンス生成手続き１１４の呼び出し２１１を行い、委譲先インスタンス生成手続き１１４は、最新の展開クラス１１６によりインスタンスを生成して展開クラス生成手続き１１３に制御を戻す。なお、展開クラス生成手続き１１３を再度実行するときには、出力した展開クラスソースファイル１２１を入力２１３とする。
【００２８】
図３は本実施形態の委譲クラス生成手続き１０９の処理概要を示す図である。図３では、委譲クラス生成手続き１０９が、展開準備手続き１０８を介して対象クラスソースファイル１１８を入力２０１として受け取り、委譲クラスソースファイル１１９を出力２０４とする様子を表している。
【００２９】
委譲クラス生成手続き１０９は、対象クラスソースファイル１１８のクラス定義３０１及び３０９に合わせてクラス定義３１０及び３１５を委譲クラスソースファイル１１９へ書き込む。また、委譲先である展開クラス１１６のインスタンスを保持するメンバ変数定義３１１を委譲クラスソースファイル１１９へ書き込む。そして、対象クラスソースファイル１１８のメソッド定義３０２〜３０８に合わせて、展開クラス１１６のインスタンスのメソッドを委譲呼び出しするメソッド定義３１２〜３１４を委譲クラスソースファイル１１９へ書き込む。
【００３０】
図４は本実施形態の初期展開クラス生成手続き１１０の処理概要を示す図である。図４では、初期展開クラス生成手続き１１０が、展開準備手続き１０８を介して対象クラスソースファイル１１８を入力２０１として受け取り、初期展開クラスソースファイル１２０を出力２０５とする様子を表している。
【００３１】
初期展開クラス生成手続き１１０は、対象クラスソースファイル１１８のコピー４０２〜４０５、４０９、４１０、４１２、４１３を有する初期展開クラスソースファイル１２０を作成する。また、委譲クラスを継承した子クラスとし、また展開クラスであることを示すクラス名とするため、クラス定義４０１を初期展開クラスソースファイル１２０に書き込む。また、展開手続き１１１の呼び出し４０６を初期展開クラスソースファイル１２０に書き込む。更に、展開手続き１１１の返り値により分岐するswitch文４０７、４０８及び４１１を書き込む。
【００３２】
図５は本実施形態の展開クラス生成手続き１１３の処理概要を示す図である。図５では、展開クラス生成手続き１１３が、初期展開クラスソースファイル１２０を入力２０６として受け取り、更に、アクセス対象であるメソッドが存在するクラスの型５１７、アクセス対象であるメソッド名５１８、アクセス対象であるメソッドの引数の型のリスト５１９、及びリフレクションアクセス部分を特定する位置情報５２０（リフレクションアクセス部分のソースファイルでの行番号）からなるアクセス情報２０７を、展開手続き１１１を介して入力２０８として受け取り、展開クラスソースファイル１２１を出力２１２とする様子を表している。なお、図５のクラスの型５１７であるPrinter、メソッド名５１８であるprint1や引数の型のリスト５１９であるString,Stringは、実行時に取得されるアクセス情報の一例を表している。
【００３３】
展開クラス生成手続き１１３は、初期展開クラスソースファイル１２０のコピー５０２〜５０７、５１１〜５１６を有する展開クラスソースファイル１２１を作成する。また、展開クラスであることを示す様にクラス定義５０１を書き込む。また、直接アクセス部分５０８〜５１０を書き込む。
【００３４】
図６は本実施形態の展開準備手続き１０８の処理手順を示すフローチャートである。図６に示す様に展開準備手続き１０８は、まず、予め対象クラスとして指定されているクラスを主記憶１０４にロードする要求が発生したことを検出すると、二次記憶装置１１７の委譲クラスクラスファイル１２２を格納した所定のディレクトリを参照し、その対象クラスの名称に対応する委譲クラスクラスファイル１２２が既に存在するか否かを調べて、その結果による分岐処理を行う（処理６０１）。
【００３５】
分岐処理の結果、対応する委譲クラスクラスファイル１２２が存在していなかった場合、展開準備手続き１０８は、予め指定されたソースファイルのパスを基にして、前記対象クラスの名称に対応する対象クラスソースファイル１１８を二次記憶装置１１７で探索して入力する（処理６０２）。
【００３６】
次に展開準備手続き１０８は、前記入力した対象クラスソースファイル１１８を渡して委譲クラス生成手続き１０９を呼び出す（処理６０３）。次に展開準備手続き１０８は、前記入力した対象クラスソースファイル１１８を渡して初期展開クラス生成手続き１１０を呼び出す（処理６０４）。
【００３７】
一方、処理６０１において委譲クラスクラスファイル１２２が既に存在していた場合、展開準備手続き１０８は、その委譲クラス１１５を主記憶１０４へロードする（処理６０５）。この処理６０１の分岐により、プログラムの実行を一度止めて再度実行する場合に、前回の実行時に得た委譲クラス１１５を再度利用できる。
【００３８】
図７は本実施形態の委譲クラス生成手続き１０９の処理手順を示すフローチャートである。図７に示す様に委譲クラス生成手続き１０９は、まず、展開準備手続き１０８を介して対象クラスソースファイル１１８を入力として受け取る（処理７０１）。
【００３９】
次に委譲クラス生成手続き１０９は、空の委譲クラスソースファイル１１９を二次記憶装置１１７上に作成する（処理７０２）。次に委譲クラス生成手続き１０９は、前記受け取った対象クラスソースファイル１１８のクラス定義３０１の文字列を読み出して委譲クラスソースファイル１１９に書き込むことにより、委譲クラスソースファイル１１９に、対象クラスソースファイル１１８と同じクラス定義３１０を書き込む（処理７０３）。
【００４０】
次に委譲クラス生成手続き１０９は、委譲先インスタンス生成手続き１１４を示す文字列create()を用いて、委譲先インスタンス生成手続き１１４を呼び出すことにより取得する委譲先インスタンスを保持する為のメンバ変数定義３１１を示す文字列を生成し、委譲クラスソースファイル１１９に書き込む（処理７０４）。
【００４１】
次に委譲クラス生成手続き１０９は、対象クラスソースファイル１１８中の文字列を順次読み出してリフレクション機構の記述に該当するgetClass等の部分が存在しているかどうかを調べることにより、対象クラスソースファイル１１８の中からリフレクション機構を用いるメソッド定義を探索する（処理７０５）。
【００４２】
次に委譲クラス生成手続き１０９は、前記探索の結果を元に、対象クラスソースファイル１１８中にリフレクション機構を用いるメソッド定義が存在しているか否かによる分岐処理を行う（処理７０６）。
【００４３】
対象クラスソースファイル１１８中にリフレクション機構を用いるメソッド定義３０２〜３０８が存在している場合、委譲クラス生成手続き１０９は、その対象クラスソースファイル１１８中のリフレクション機構を用いるメソッド定義３０３〜３０７の内容を、メンバ変数定義３１１で生成したメソッドの呼び出しを行う記述に変更した文字列を書き込むことにより、委譲クラスソースファイル１１９に、委譲先インスタンスのメソッドを委譲呼び出しするメソッド定義３１２〜３１４を書き込み（処理７０７）、処理７０５へ戻る。ここで、メソッド定義３１４の各引数は、メソッド定義３０２の引数から生成するものとする。
【００４４】
また、処理７０６においてリフレクション機構を用いるメソッド定義が存在していなければ、委譲クラス生成手続き１０９は、クラス定義の終了３１５を委譲クラスソースファイル１１９に書き込む（処理７０８）。
【００４５】
次に委譲クラス生成手続き１０９は、前記の様にして生成した委譲クラスソースファイル１１９をコンパイルして、委譲クラスクラスファイル１２２を生成する（処理７０９）。次に委譲クラス生成手続き１０９は、その生成した委譲クラス１１５を主記憶１０４へロードする（処理７１０）。この様に委譲クラスを作成しておくことにより、その実行時に展開クラスのインスタンスを順次置き換えて実行することが可能になる。
【００４６】
図８は本実施形態の初期展開クラス生成手続き１１０の処理手順を示すフローチャートである。図８に示す様に初期展開クラス生成手続き１１０は、まず、展開準備手続き１０８を介して対象クラスソースファイル１１８を入力として受け取る（処理８０１）。
【００４７】
次に初期展開クラス生成手続き１１０は、空の初期展開クラスソースファイル１２０を二次記憶装置１１７上に作成し（処理８０２）、前記受け取った対象クラスソースファイル１１８のクラス定義３０１のクラス名の文字列にアンダースコア"_"と５桁の数値"00000"を付加することにより、委譲クラス１１５を継承するクラス定義４０１を生成し、初期展開クラスソースファイル１２０に書き込む（処理８０３）。
【００４８】
次に初期展開クラス生成手続き１１０は、対象クラスソースファイル１１８中の文字列を順次読み出してリフレクション機構のgetMethodやinvokeの記述に該当する部分が存在しているかどうかを調べることにより、対象クラスソースファイル１１８の中からリフレクションアクセス部分を探索する（処理８０４）。
【００４９】
次に初期展開クラス生成手続き１１０は、前記探索の結果を元に、対象クラスソースファイル１１８中にリフレクションアクセス部分が存在するか否かによる分岐処理を行う（処理８０５）。
【００５０】
対象クラスソースファイル１１８中にリフレクションアクセス部分が存在していた場合、初期展開クラス生成手続き１１０は、そのリフレクションアクセス部分の直前までのメソッド定義３０２〜３０５のコピー４０２〜４０５を、初期展開クラスソースファイル１２０に書き込む（処理８０６）。
【００５１】
次に初期展開クラス生成手続き１１０は、展開手続き１１１を示す文字列check()、メソッド定義３０３の文字列targetClass、メソッド定義３０２の文字列mName、メソッド定義３０５の文字列argClasses、リフレクションアクセス部分の行番号6を用いてaccessIDを返り値とする展開手続き１１１の呼び出し４０６を示す文字列を生成し、初期展開クラスソースファイル１２０に書き込む（処理８０７）。次に初期展開クラス生成手続き１１０は、展開手続き１１１の返り値accessIDで分岐するswitch文４０７、４０８を初期展開クラスソースファイル１２０に書き込む（処理８０８）。
【００５２】
次に初期展開クラス生成手続き１１０は、対象クラスソースファイル１１８のリフレクションアクセス部分であるメソッド定義３０６、３０７のコピー４０９、４１０を初期展開クラスソースファイル１２０に書き込む（処理８０９）。次に初期展開クラス生成手続き１１０は、switch文の終了４１１を初期展開クラスソースファイル１２０に書き込み（処理８１０）、処理８０４に戻る。
【００５３】
また初期展開クラス生成手続き１１０は、分岐処理８０５においてリフレクションアクセス部分が存在しなければ、対象クラスソースファイル１１８の未コピーであった部分のコピー４１２、４１３を初期展開クラスソースファイル１２０に書き込む（処理８１１）。
【００５４】
次に初期展開クラス生成手続き１１０は、前記の様にして生成した初期展開クラスソースファイル１２０をコンパイルして、展開クラスクラスファイル１２３を生成する（処理８１２）。次に初期展開クラス生成手続き１１０は、その生成した展開クラス１１６を主記憶１０４へロードする（処理８１３）。
【００５５】
この様に初期展開クラスソースファイル１２０を作成することにより、実行時に直接アクセス部分を追加していく為の展開手続き１１１を呼び出すことが可能となる。また追加したswitch文により、アクセス対象毎にそのアクセス対象に対応した直接アクセス部分を実行することが可能となる。
【００５６】
図９は本実施形態の展開手続き１１１の処理手順を示すフローチャートである。実行時に展開手続き１１１が呼び出されると、図９に示す様に展開手続き１１１は、まずアクセス情報２０７を呼び出し時の引数として受け取る（処理９０１）。
【００５７】
次に展開手続き１１１は、前記受け取ったアクセス情報２０７を渡して展開済検査手続き１１２を呼び出す（処理９０２）。
【００５８】
次に展開手続き１１１は、前記呼び出した展開済検査手続き１１２の返り値を参照して、展開済検査手続き１１２の返り値が-1であるか否かによる分岐処理を行う（処理９０３）。展開済検査手続き１１２の返り値が-1でなかった場合には、その返り値を展開手続き１１１の呼び出し元へ返して（処理９０６）、終了する。展開済検査手続き１１２の返り値が-1であった場合には、前記受け取ったアクセス情報２０７を渡して展開クラス生成手続き１１３を呼び出す（処理９０４）。
【００５９】
次に展開手続き１１１は、展開済検査手続き１１２の返り値-1を展開手続き１１１の呼び出し元へ返して（処理９０５）、展開手続き１１１の処理を終了する。
【００６０】
図１０は本実施形態の展開済検査手続き１１２の処理手順を示すフローチャートである。図１０に示す様に展開済検査手続き１１２は、まず、展開手続き１１１からアクセス情報２０７を入力として受け取る（処理１００１）。
【００６１】
次に展開済検査手続き１１２は、展開クラスソースファイル１２１中の文字列を順次読み出して、アクセス情報２０７で示されたクラスの型５１７、メソッド名５１８及び引数の型のリスト５１９に該当する直接アクセス部分の記述が展開クラスソースファイル１２１中に存在しているかを調べることにより、アクセス情報２０７に対応する直接アクセス部分が既に展開クラスソースファイル１２１に追加済みであるか否かによる分岐処理を行う（処理１００２）。展開済検査手続き１１２は、直接アクセス部分が展開クラスソースファイル１２１に追加済みでなければ、-1を展開手続き１１１に返し（処理１００３）、追加済みであれば、アクセス情報２０７に対応した直接アクセス部分を識別する為の識別子を格納したテーブルを参照し、展開手続き１１１から受け取ったアクセス情報２０７に対応する識別子を展開手続き１１１へ返す（処理１００４）。
【００６２】
図１１は本実施形態の展開クラス生成手続き１１３の処理手順を示すフローチャートである。図１１に示す様に展開クラス生成手続き１１３は、まず、展開手続き１１１を介してアクセス情報２０７を入力として受け取る（処理１１０１）。
【００６３】
次に展開クラス生成手続き１１３は、現在実行中である展開クラス１１６に対応する現状の展開クラスソースファイルを入力として受け取る（処理１１０２）。ここでは、初期展開クラスソースファイル１２０が現状の展開クラスソースファイルに相当する場合を想定する。
【００６４】
次に展開クラス生成手続き１１３は、前記受け取ったアクセス情報２０７に対応した直接アクセス部分を識別する為の識別子を展開手続き１１１に返す様に、アクセス情報２０７と識別子とを格納したテーブルを修正する（処理１１０３）。
【００６５】
次に展開クラス生成手続き１１３は、空の展開クラスソースファイル１２１を二次記憶装置１１７上に作成し（処理１１０４）、初期展開クラスソースファイル１２０のクラス定義４０１の文字列を読み出して、そのクラス名に含まれる５桁の数値を１増加させたクラス定義５０１を生成し、展開クラスソースファイル１２１に書き込む（処理１１０５）。
【００６６】
次に展開クラス生成手続き１１３は、初期展開クラスソースファイル１２０の中の、アクセス情報２０７に対応した条件分岐であるswitch文４０７までのコピー５０２〜５０７を展開クラスソースファイル１２１に書き込む（処理１１０６）。
【００６７】
次に展開クラス生成手続き１１３は、クラスの型５１７の文字列Printer、文字列target、メソッド名５１８の文字列print1、引数の型のリスト５１９に示された文字型に該当する引数を示す文字列args[0],args[1]により直接アクセス部分((Printer) target).print1(args[0],args[1])を生成し、アクセス情報２０７に対応した識別子accessIDが1である場合に実行する直接アクセス部分５０８〜５１０を展開クラスソースファイル１２１に追加する（処理１１０７）。
【００６８】
次に展開クラス生成手続き１１３は、初期展開クラスソースファイル１２０の中の、アクセス情報２０７に対応した条件分岐以降の記述のコピー５１１〜５１６を、展開クラスソースファイル１２１に書き込む（処理１１０８）。
【００６９】
次に展開クラス生成手続き１１３は、前記の様にして生成した展開クラスソースファイル１２１をコンパイルして、展開クラスクラスファイル１２３を作成し（処理１１０９）、展開クラス生成手続き１１３は、委譲先インスタンス生成手続き１１４を呼び出す（処理１１１０）。そして展開クラス生成手続き１１３は、委譲クラス１１５のインスタンスのメンバに展開クラス１１６のインスタンスを代入する（処理１１１１）。
【００７０】
この様に、実行時のアクセス情報２０７に対応した直接アクセス部分を展開クラスソースファイル１２１に追加することにより、次回以降の同じアクセス対象へのアクセスでは、その追加した直接アクセス部分による実行が行われるため、プログラムを高速に実行することができる。
【００７１】
図１２は本実施形態の委譲先インスタンス生成手続き１１４の処理手順を示すフローチャートである。図１２に示す様に委譲先インスタンス生成手続き１１４は、まず、二次記憶装置１１７の展開クラスクラスファイル１２３を格納した所定のディレクトリを参照し、クラス名に付随させた５桁の数値が最大である様な、最新の展開クラスクラスファイル１２３を探索する（処理１２０１）。
【００７２】
次に委譲先インスタンス生成手続き１１４は、前記探索した最新の展開クラスクラスファイル１２３により展開クラス１１６を主記憶１０４へロードする（処理１２０２）。そして、委譲先インスタンス生成手続き１１４は、前記ロードした展開クラス１１６のインスタンスを生成する（処理１２０３）。
【００７３】
以上の説明ではJava言語での実施形態を示したが、リフレクション機構が存在する他のプログラミング言語においても同様に本実施形態の手法を適用可能である。また、以上の説明ではアクセス対象がメソッドである場合の実施形態を示したが、アクセス対象がメンバ変数である場合においても、アクセス情報をアクセス対象のメンバ変数が存在するクラス、メンバ変数の名称、及びリフレクションアクセス部分の位置情報とすることにより、本実施形態の手法を適用可能である。
【００７４】
以上説明した様に本実施形態のソースファイル変換装置によれば、実行時のアクセス情報に対応する直接アクセス部分の記述がソースファイルに追加されていない場合にその直接アクセス部分の記述を追加した展開クラスソースファイルを生成するので、リフレクション機構を用いる様に記述されたソースファイルを手作業で変更すること無く、そのソースファイルにより生成されたプログラムの実行性能を向上させることが可能である。
【図面の簡単な説明】
【００７５】
【図１】本実施形態のソースファイル変換装置の概略構成を示す図である。
【図２】本実施形態のソースファイル変換処理の入出力の概要を示す図である。
【図３】本実施形態の委譲クラス生成手続き１０９の処理概要を示す図である。
【図４】本実施形態の初期展開クラス生成手続き１１０の処理概要を示す図である。
【図５】本実施形態の展開クラス生成手続き１１３の処理概要を示す図である。
【図６】本実施形態の展開準備手続き１０８の処理手順を示すフローチャートである。
【図７】本実施形態の委譲クラス生成手続き１０９の処理手順を示すフローチャートである。
【図８】本実施形態の初期展開クラス生成手続き１１０の処理手順を示すフローチャートである。
【図９】本実施形態の展開手続き１１１の処理手順を示すフローチャートである。
【図１０】本実施形態の展開済検査手続き１１２の処理手順を示すフローチャートである。
【図１１】本実施形態の展開クラス生成手続き１１３の処理手順を示すフローチャートである。
【図１２】本実施形態の委譲先インスタンス生成手続き１１４の処理手順を示すフローチャートである。
【符号の説明】
【００７６】
１０１…計算機、１０２…ＣＰＵ、１０３…バス、１０４…主記憶、１０５…ＯＳ、１０６…ＪＲＥ、１０７…実行プログラム、１０８…展開準備手続き、１０９…委譲クラス生成手続き、１１０…初期展開クラス生成手続き、１１１…展開手続き、１１２…展開済検査手続き、１１３…展開クラス生成手続き、１１４…委譲先インスタンス生成手続き、１１５…委譲クラス、１１６…展開クラス、１１７…二次記憶装置、１１８…対象クラスソースファイル、１１９…委譲クラスソースファイル、１２０…初期展開クラスソースファイル、１２１…展開クラスソースファイル、１２２…委譲クラスクラスファイル、１２３…展開クラスクラスファイル、２０１…入力、２０２及び２０３…呼び出し、２０４及び２０５…出力、２０６…入力、２０７…アクセス情報、２０８…入力、２０９〜２１１…呼び出し、２１２…出力、２１３…入力、３０１及び３０９…クラス定義、３０２〜３０８…メソッド定義、３１０及び３１５…クラス定義、３１１…メンバ変数定義、３１２〜３１４…メソッド定義、４０１…クラス定義、４０２〜４０５…コピー、４０６…呼び出し、４０７、４０８及び４１１…switch文、４０９、４１０、４１２、４１３…コピー、５０１…クラス定義、５０２〜５０７…コピー、５０８〜５１０…直接アクセス部分、５１１〜５１６…コピー、５１７…クラスの型、５１８…メソッド名、５１９…引数の型のリスト、５２０…位置情報、６０１…分岐処理、６０２〜６０５…処理、７０１〜７０５…処理、７０６…分岐処理、７０７〜７１０…処理、８０１〜８０４…処理、８０５…分岐処理、８０６〜８１３…処理、９０１〜９０２…処理、９０３…分岐処理、９０４〜９０６…処理、１００１…処理、１００２…分岐処理、１００３〜１００４…処理、１１０１〜１１１１…処理、１２０１〜１２０３…処理。
【図１】
2006343796.tif 000003
【図２】
2006343796.tif 000004
【図３】
2006343796.tif 000005
【図４】
2006343796.tif 000006
【図５】
2006343796.tif 000007
【図６】
2006343796.tif 000008
【図７】
2006343796.tif 000009
【図８】
2006343796.tif 000010
【図９】
2006343796.tif 000011
【図１０】
2006343796.tif 000012
【図１１】
2006343796.tif 000013
【図１２】
2006343796.tif 000014