(57)【要約】【課題】動的リンクを行うオブジェクト指向プログラム実行システムにおいて、メンバの継承関係が多階層になっても処理の実行効率が低下することなく、メンバ解決にかかる処理量を少なくする名前解決方法を提供することを目的とする。【解決手段】データ参照の局所性により、同一の命令箇所では、同一インスタンスに対する同一メンバ解決が多いことに着目し、メンバ解決時に実行対象となるインスタンスの情報を保持しておき、前回と同一インスタンスに対するメンバ解決時には、保持しておいた情報にてメンバ解決を行うことにより、メンバ解決の計算量を削減する。【選択図】　図１
2004126739.tif 000002
【特許請求の範囲】
【請求項１】
動的リンクを行うオブジェクト指向プログラムを所定のコンパイラによりコンパイルすることにより得られるクラス（あるいはクラス単位のファイルであるクラスファイル）を実行する方法であって、前記クラスに格納された実行命令が、名前解決を要する名前解決命令であって、
前記実行対象の命令で指定されているクラスメンバの名前を解決するステップと、
前記名前を解決したクラスメンバの情報に基づき、実行対象となっているインスタンスに対するメンバの名前を解決するステップと、
前記解決したインスタンスに対するメンバと、前記メンバを継承する実行対象インスタンスのクラスの情報とをメンバ情報としてキャッシュするステップと、前記実行対象の命令である名前解決を要する名前解決命令を、解決した名前をキャッシュしていることを示す別の名前解決済み名前解決命令に置換えるステップと、
前記名前解決を要する名前解決命令が再度実行された場合に、実行対象のインスタンスクラスが、キャッシュしているメンバの実体を持つクラスと同一、または、キャッシュしている実行対象インスタンスクラスと同一である際に、キャッシュに保存している前記メンバ情報を利用して名前解決を行うステップとを備えることを特徴とする名前解決方法。
【請求項２】
前記クラスは、読込み専用記憶部、または読書き可能記憶部に配置してあり、
前記キャッシュするステップは、実行対象命令が読書き可能記憶部に配置してある場合のみ、解決したメンバ情報をキャッシュするステップであることを特徴とする請求項１記載の名前解決方法。
【請求項３】
前記クラスは、読込み専用記憶部、または読書き可能記憶部にクラス単位で配置してあり、
各クラスの情報として、前記クラスが、読込み専用記憶部に配置されているのか、読書き可能記憶部に配置されているのかを識別可能な情報記憶部として、書込み可能フラグを持ち、
前記キャッシュするステップは、前記書込み可能フラグに基づいて、クラスが前記読書き可能記憶部に配置してある判断した場合のみ、解決した面罵情報をキャッシュするステップであることを特徴とする請求項２記載の名前解決方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、動的リンクを行うオブジェクト指向プログラムの実行方法であって、特に、実行するメソッドを決定する名前解決方法に関するものである。
【０００２】
【従来の技術】
近年、情報処理機器や、情報通信機器や、情報家電機器において、ソフトウェアの開発量と必要なシステム資源が増大し、これに対して、効率的な開発手法・システム構成が求められている。これに対し、オブジェクト指向を用いたプログラム実行システムの開発や、動的リンクを行うシステム構成が利用されている。
動的リンクを行うオブジェクト指向プログラム実行システムにおいて、クラス継承を行ったメンバの名前解決処理は、実行命令にて指定されたクラスのメンバ解決処理と、その後、クラスのメンバ情報に基づき実行対象命令が処理対象とする実行対象インスタンスに対するメンバ解決処理を行う必要性がある。このような名前解決処理における実行効率を上げるために、実行命令にて指定されたクラスのメンバ解決情報をキャッシュすることにより、実行命令にて指定されたクラスのメンバ解決処理をスキップする技術が処理の実行効率を上げる技術が知られている（例えば、非特許文献１参照）。
【０００３】
【非特許文献１】
Ｓｕｎ　Ｍｉｃｒｏｓｙｓｔｅｍｓ社「Ｔｈｅ　ＪａｖａＴＭ　Ｖｉｒｔｕａｌ　Ｍａｃｈｉｎｅ　Ｓｐｅｃｉｆｉｃａｔｉｏｎ　（ｆｉｒｓｔ
ｅｄｉｔｉｏｎ）」
【０００４】
【発明が解決しようとする課題】
しかしながら、前記従来の技術では、メンバの継承関係が多階層になった場合、インスタンスに対するメンバ解決のための計算量が多くなり、本来の処理の実行効率を低下させるという問題が発生する。
【０００５】
これは、データ参照の局所性により、同一の命令箇所では、同一インスタンスに対する同一メンバ解決が多く、名前解決を必要とする命令が実行される度に、インスタンスに対するメンバ解決を毎回行うと全処理量に占めるメンバ解決の処理量が膨大となり、本来実行したい処理の実行効率が低下するためである。
【０００６】
また、前記従来の技術では、ＲＯＭ上の実行命令に対しても書換処理を実行するため、キャッシュメモリと実メモリ間で不整合が発生し、書換処理が行われた実行命令部が、期待とは異なる不正な動作をする場合が存在した。
【０００７】
本発明は、上記問題点を解決するためになされたものであり、メンバの継承関係が多階層になっても処理の実行効率が低下することがなく、メンバ解決にかかる処理量を少なくする名前解決方法を提供すること目的とする。
【０００８】
【課題を解決するための手段】
この課題を解決するために本発明は、動的リンクを行うオブジェクト指向プログラムを所定のコンパイラによりコンパイルすることにより得られたクラスファイルを実行する方法であって、前記クラスファイルに記述された実行対象の命令が、名前解決を要する名前解決命令であって、前記実行対象の命令で指定されているクラスメンバの名前を解決するステップと、前記名前を解決したクラスメンバの情報に基づき、実行対象となっているインスタンスに対するメンバの名前を解決するステップと、前記解決したインスタンスに対するメンバと、前記メンバを継承する実行対象インスタンスのクラスの情報とをメンバ情報としてキャッシュするステップと、前記実行対象の命令である名前解決を要する名前解決命令を、解決した名前をキャッシュしていることを示す別の名前解決済み名前解決命令に置換えるステップと、前記名前解決を要する名前解決命令が再度実行された場合に、実行対象のインスタンスクラスが、キャッシュしているメンバの実体を持つクラスと同一、または、キャッシュしている実行対象インスタンスクラスと同一である際に、キャッシュに保存している前記メンバ情報を利用して名前解決を行うステップとを備えることを特徴とし、２回目以降はキャッシュされているメンバ情報を用いて処理を行う。
【０００９】
また、本発明は、前記クラスファイルは、読込み専用記憶部、または読書き可能記憶部に配置してあり、前記キャッシュするステップは、実行対象命令が読書き可能記憶部に配置してある場合のみ、解決したメンバ情報をキャッシュするステップであることを特徴とし、読書き可能記憶部に配置してあり、かつ２回目以降はキャッシュされているメンバ情報を用いて処理を行う。
【００１０】
また、本発明は、前記クラスファイルは、読込み専用記憶部、または読書き可能記憶部にクラス単位で配置してあり、各クラスの情報として、前記クラスが、読込み専用記憶部に配置されているのか、読書き可能記憶部に配置されているのかを識別可能な情報である、書込み可能フラグを持ち、前記キャッシュするステップは、前記書込み可能フラグに基づいて、クラスファイルが前記読書き可能記憶部に配置してある判断した場合のみ、解決した面罵情報をキャッシュするステップであることを特徴とする。
【００１１】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を用いて説明する。
【００１２】
図１は、本発明の実施の形態における名前解決方法を実施するプログラム実行装置の構成の一例を示す機能ブロック図である。
【００１３】
図１において、プログラム実行装置は、プログラム実行部４０００と、読込み専用記憶部２０００と、読書き可能記憶部３０００とを備えている。ここで、プログラム実行部４０００への入力は、オブジェクト指向言語にて記述したプログラムを、所定のコンパイラによりコンパイルすることによって得られたクラスファイル（以下、クラスファイル１０００とする）であるものとする。なお、Ｊａｖａ（Ｒ）やＣ＋＋などが、代表的なオブジェクト指向言語である。
【００１４】
読込み専用記憶部２０００は、ライブラリとなるクラス群を格納している。なお、ライブラリとなるクラス群は、読書き可能記憶部３０００に格納することも可能である。その場合、プログラム実行部４０００と、読書き可能記憶部３０００を備えていればよい。
【００１５】
読書き可能記憶部３０００は、クラス１０００の実行時の格納先であり、また、プログラム実行部４０００が実行する過程で必要となる情報の記憶領域である。
【００１６】
クラス読み込み部４１００は、実行命令判定部４２００からの指示に従い、読込み指定されたクラス１０００を読込んで、読書き可能記憶部３０００に配置し、かつ読み書き可能記憶部３０００に存在するそのクラスの書込み可能フラグに、書込み可能を示す値を設定する。なお、書込み可能とは、読書き可能なＲＡＭ領域に配置されていることを意味する。
【００１７】
実行命令判定部４２００は、実行開始が指示されると、読書き可能記憶部３０００から実行対象の命令を取得し、取得した実行対象の命令を判定する。実行対象の命令種別に基づき、名前解決を要さない命令であると判定した場合は、実効対象の命令を命令実行部４７００に通知し、名前解決情報が既にキャッシュされている名前解決済み名前解決命令であると判定した場合は、解決メンバ情報比較部４８００に処理を移し、そうでない場合（名前未解決の名前解決命令）は、クラス読込み部４１００に実行対象のクラスの読込みを指示し、実行指定クラスメンバ解決部４３００に実行命令に付随しているクラスメンバ情報を通知する。
【００１８】
実行指定クラスメンバ解決部４３００は、実行命令判定部４２００から通知された実行命令に付随しているクラスメンバ情報を解決し、インスタンスメンバ解決部４４００に解決したクラスメンバ情報を通知する。
【００１９】
インスタンスメンバ解決部４４００は、通知されたクラスメンバ情報をもとに、実行対象命令が処理対象として実行対象となっているインスタンスに対して、メンバの名前の解決を行い、実行命令存在箇所判定部４５００に処理を指示する。
【００２０】
実行命令存在箇所判定部４５００は、実行対象の命令を持つメソッドの実体を持つクラスの書込み可能フラグを確認し、書込み可能フラグの値が書込み可能を示している場合、解決メンバ情報保存・命令書換部４６００に処理を移し、そうでない場合は、処理を命令実行部４７００に処理を移す。
【００２１】
解決メンバ情報保存・命令書換部４６００は、解決したメンバ情報と現在実行対象命令が処理対象として実行対象となっているインスタンスクラスの情報を名前解決済み情報として読書き可能記憶部３０００に格納し、実行対象の名前解決命令を、名前解決済み情報を参照可能な情報を付加した、名前解決済み名前解決命令に書換え、命令実行部４７００に名前解決済み名前解決命令を通知する。
【００２２】
命令実行部４７００は、通知された実行対象の命令の実行を行い、実行した結果を読書き可能記憶部２０００に格納する。
【００２３】
解決メンバ情報比較部４８００は、読書き可能記憶部３０００に格納されている名前解決済み情報を取得し、実行対象命令が処理対象として実行対象となっているインスタンスのクラスと、名前解決済み情報のメンバ情報が示すメンバの実体を保持するクラスと一致するか、または実行対象命令が処理対象として実行対象となっているインスタンスのクラスと、名前解決済み情報の実行対象インスタンスクラス情報が示すクラスが一致するかの判定を行う。何れかと一致した場合は、名前解決済み情報のメンバ情報を、実行対象命令が処理対象として実行対象となっているインスタンスのメンバの解決情報として命令実行部４７００に通知する。何れも一致しない場合は、名前解決済み情報のメンバ情報を、実行対象命令に指定されている解決したクラスメンバの解決情報としてインスタンスメンバ解決部４４００に通知する。
【００２４】
図２は、本発明の実施の形態における名前解決方法の処理の流れを示す。プログラム実行装置が実行開始の指示を受け、実行対象の命令を取得し、命令を実行する動作手順を示す。まず、実行命令判定部４２００は、実行開始の指示を受けると、指示に基づき、読込み専用記憶部２０００、または読書き可能記憶部３０００から、実行対象命令を取得し、処理を開始する。
【００２５】
実行命令判定部４２００は、取得した実行対象命令の命令種別に基づき、実行対象命令が名前解決済み名前解決命令であるか、そうでないか判定する（Ｓ４２０１）。
【００２６】
実行対象命令が、名前解決済み名前解決命令である場合（Ｓ４２０１がＹＥＳ）、解決メンバ情報比較部４８００に処理を移し、Ｓ４８０１に遷移する。
【００２７】
実行対象命令が、名前解決済み名前解決命令でない場合（Ｓ４２０１がＮＯ）、名前解決命令（名前未解決の名前解決命令）であるか、そうでない（名前解決を要さない命令）か判定する（Ｓ４２０２）。
【００２８】
実行対象命令が、名前解決を要さない命令である場合（Ｓ４２０２がＮＯ）、命令実行部４７００は、実効対象の命令に対して規定された処理を実行し、結果を読書き可能記憶部３０００に格納して処理を終了する（Ｓ４７０１）。
【００２９】
実行対象命令が、名前未解決の名前解決命令である場合（Ｓ４２０２がＹＥＳ）、クラス読込み部４１００に実行対象のクラスの読込みを指示し、実行指定クラスメンバ解決部４３００に実行命令に付随しているクラスメンバ情報を通知する（Ｓ４１００）。なお、クラス読み込み部４１００での処理については、図３に後述する。
【００３０】
実行指定クラスメンバ解決部４３００は、通知されたクラスメンバ情報を解決し、インスタンスメンバ解決部に解決したクラスメンバ情報を通知する（Ｓ４３０１）。
【００３１】
インスタンスメンバ解決部４４００は、通知されたクラスメンバの情報をもとに、実行対象命令が処理対象として実行対象となっているインスタンスに対する、メンバの名前を解決し、実行命令存在箇所判定部４５００に処理を移す（Ｓ４４０１）。
【００３２】
実行命令存在箇所判定部４５００は、実行対象命令が存在するメソッドを保持するクラスの、書換え可能フラグを確認する（Ｓ４５０１）。書換え可能フラグの値が、書換え可能を示さない場合（Ｓ４５０１がＮＯ）、命令実行部４７００は、実効対象の命令に対して規定された処理を実行し、結果を読書き可能記憶部３０００に格納して処理を終了する（Ｓ４７０１）。書換え可能フラグの値が、書換え可能を示す場合（Ｓ４５０１がＹＥＳ）、解決メンバ情報保存・命令書換部４６００が、名前解決済み情報を読書き可能記憶部３０００に格納し（Ｓ４６０１）、更に、実行対象の名前解決命令を、書換え可能情報を持つ、名前解決済み名前解決命令に書換え、命令実行部４７００に名前解決済み名前解決命令を通知する（Ｓ４６０２）。
【００３３】
命令実行部４７００は、実効対象の命令に対して規定された処理を実行し、結果を読書き可能記憶部３０００に格納して処理を終了する（Ｓ４７０１）。
【００３４】
解決メンバ情報比較部４８００は、読書き可能記憶部３０００から、名前解決済み情報を取得する（Ｓ４８０１）。
【００３５】
解決メンバ情報比較部４８００は、実行対象命令が処理対象として実行対象となっているインスタンスのクラスと、名前解決済み情報のメンバ情報が示すメンバの実体を保持するクラスと一致するか、または実行対象命令が処理対象として実行対象となっているインスタンスのクラスと、名前解決済み情報の実行対象インスタンスクラス情報が示すクラスが一致するかを判定する（Ｓ４８０２）。
【００３６】
何れかと一致した場合（Ｓ４８０２がＹＥＳ）、名前解決済み情報のメンバ情報を、実行対象命令が処理対象として実行対象となっているインスタンスのメンバの解決情報として設定し（Ｓ４８０３）、命令実行部４７００は、実効対象の命令に対して規定された処理を実行し、結果を読書き可能記憶部３０００に格納して処理を終了する（Ｓ４７０１）。
【００３７】
何れも一致しない場合（Ｓ４８０２がＮＯ）、名前解決済み情報のメンバ情報を、実行対象命令にて指定されているクラスメンバの解決情報とて設定し、インスタンスメンバ解決部４４００に処理を移し、Ｓ４４０１に遷移する。
【００３８】
図３は、本発明の実施の形態における名前解決方法の処理の流れの一部であり、クラス読込み部４１００の動作手順を示す。これは、図２のＳ４１００を詳細に示したものである。
【００３９】
クラス読込み部４１００は、実行命令判定部４２００からの指示に従い、読込み指定されたクラス１０００を読込み、読書き可能記憶部３０００に、実行可能な状態に配置する（Ｓ４１０１）。
【００４０】
次に、クラス読込み部４１００は、読書き可能記憶部３０００に配置した、実行可能な状態のクラスが持つ書込み可能フラグに、書き込み可能を示す値を設定し、処理を終了する（Ｓ４１０２）。
【００４１】
図４は、本発明の実施の形態における名前解決方法が使用する情報の構成の一例を示す図である。
【００４２】
処理に使用する情報として、クラス９１００と、メンバテーブル９２００と、フィールドテーブル９３００と、メソッドテーブル９４００と、メソッド９５００と、名前解決済み情報９６００と、メソッド実行コード９７００とを備えている。メソッド実行コードは、１つ以上の実行命令からなるメソッドのプログラムである。
【００４３】
クラス９１００は、実行可能な状態に配置された各クラスの情報である、スーパクラスである別のクラス９１００、メンバテーブル９２００、書込み可能フラグの情報を持つ。スーパクラスとは、継承関係にある親クラス（基底クラス）である。
【００４４】
書込み可能フラグとは、前記クラスが、読込み専用記憶部に配置されているのか、読書き可能記憶部に配置されているのかを識別可能な情報の記憶部である。
【００４５】
メンバテーブル９２００は、各クラス保持するフィールドテーブル９３００、メソッドテーブル９４００の情報を持つ。
【００４６】
フィールドテーブル９３００は、各クラスおよび格クラスのインスタンスが実体として持つ、フィールドの情報を持つ。
【００４７】
メソッドテーブル９４００は、各クラスおよび各クラスのインスタンスが実体として持つ、メソッドの情報を持つ。
【００４８】
メソッド９５００は、各メソッドのメソッド属性およびメソッドの実行コード９７００の情報を持つ。メソッド属性は、所属クラス、メソッドのアクセス制限、引数、返値、実行コードへのポインタ、実行コード長、実行に必要なスタック量、実行に必要なローカル変数領域サイズ、例外発生時のジャンプ先情報から構成される。
【００４９】
名前解決済み情報９６００は、名前解決したメンバの情報として、メソッド９５００あるいは、フィールドテーブル９３００中の何れかのフィールドの情報を持ち、そのメンバ９５００を継承するクラス９１００の情報を持つ。
【００５０】
メソッド実行コード９７００はメソッド９５００の実際に実行されるプログラムのコードを持ち、このコード中にて書換られた名前解決済み名前解決命令は、名前解決済み情報９６００の情報を持つ。
【００５１】
以上により、名前解決済み名前解決命令が再度実行された場合、前回実行対象であったオブジェクト（インスタンスまたはクラス）と同一のオブジェクトが実行対象となっていた場合、既に名前解決されて保持されている情報を用いることにより、少ない計算量にて名前解決処理を終了することが可能である。
【００５２】
【発明の効果】
以上のように本発明によれば、名前解決命令に対して、その実行対象クラスメンバと実行対象インスタンスクラスとをキャッシュしておくことにより、実行対象インスタンスクラスが実行対象クラスメンバの実体を保持していない場合においても、データ参照の局所性を利用して、２回目以降にメンバ解決にかかる計算負荷を軽減させることができる。
【００５３】
また、実行すべき名前解決命令が読込み専用記憶部と読書き可能記憶部の双方にあり、クラス単位で、読込み専用記憶部と読書き可能記憶部何れかに配置されているシステムにおいて、　クラスを実行可能状態で読込み専用記憶部と読書き可能記憶部何れかに配置する時点で、何れの記憶部に配置されているかを判定する書込み可能フラグを設定しておき、実行対象となっている名前解決命令を持つメンバの実体を保持するクラスの書込み可能フラグを参照し、読書き可能記憶部に存在する場合、その実行対象クラスメンバをキャッシュしておくことにより、実行対象命令の書換可否を判断する計算処理を軽減させ、かつデータ参照の局所性を利用して、２回目以降に名前解決にかかる計算負荷を軽減させ、かつキャッシュメモリと実メモリ間の不整合が発生しない。
【図面の簡単な説明】
【図１】本発明の実施の形態に係る名前解決方法を実施するプログラム実行装置の構成の一例を示す機能ブロック図
【図２】本発明の実施の形態に係る名前解決方法の処理の流れの一例を示すフローチャート
【図３】本発明の実施の形態に係るクラス読込み部における処理の流れの一例を示すフローチャート
【図４】本発明の実施の形態に係る名前解決方法が使用する情報の構成の一例を示す図
【符号の説明】
１０００　クラス
２０００　読込み専用記憶部
３０００　読書き可能記憶部
４０００　プログラム実行部
４１００　クラス読込み部
４２００　実行命令判定部
４３００　実行指定クラスメンバ解決部
４４００　インスタンスメンバ解決部
４５００　実行命令存在箇所判定部
４６００　解決メンバ情報保存・命令書換部
４７００　命令実行部
４８００　解決メンバ情報比較部
９１００　クラス
９２００　メンバテーブル
９３００　フィールドテーブル
９４００　メソッドテーブル
９５００　メソッド
９６００　名前解決済み情報
９７００　メソッド実行コード
【図１】
2004126739.tif 000003
【図２】
2004126739.tif 000004
【図３】
2004126739.tif 000005
【図４】
2004126739.tif 000006