(57)【特許請求の範囲】
【請求項１】
オブジェクト指向プログラミングによるソースプログラムをコンパイルすることで、スレッドの生成により実行されるオブジェクトプログラムを生成するコンパイラ装置において、
前記ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出する検出手段と、
前記検出手段の検出結果をオブジェクトデータ保持情報として前記オブジェクトプログラムに組み込む第１の組込手段と、
前記オブジェクトプログラムの実行時に、前記オブジェクトデータ保持情報に基づいて、複数のスレッドのうち一つのスレッドのみが当該メソッドを実行するように制御する排他制御命令を前記オブジェクトプログラムに組み込む第２の組込手段と、
を備えることを特徴とするコンパイラ装置。
【請求項２】
前記ソースプログラムにおけるクラス定義に基づいて、クラスの継承関係をチェックする継承関係チェック手段を備え、前記検出手段は、前記継承関係チェック手段のチェック結果に基づいて、当該クラスに対して継承関係にあるクラスについてもクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出し、前記第２の組込手段は、前記オブジェクトプログラムの実行時に、前記オブジェクトデータ保持情報に基づいて、複数のスレッドのうち一つのスレッドのみが、継承関係にあるクラスのメソッドも含めて実行するように制御する排他制御命令を前記オブジェクトプログラムに組み込むことを特徴とする請求項１に記載のコンパイラ装置。
【請求項３】
オブジェクト指向プログラミングによるソースプログラムをコンパイルすることで、スレッドの生成により実行されるオブジェクトプログラムを生成するコンパイラ装置において、
前記ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出する検出手段と、
前記オブジェクトプログラムの実行時に、複数のスレッドのうち一つのスレッドのみが、前記検出手段により検出されたオブジェクトデータをアクセスするように制御する排他制御命令を前記オブジェクトプログラムに組み込む組込手段と、
を備えることを特徴とするコンパイラ装置。
【請求項４】
オブジェクト指向プログラミングによるソースプログラムをコンパイルさせることで、スレッドの生成により実行されるオブジェクトプログラムを生成させるコンパイラを記録したコンピュータ読み取り可能な記録媒体であって、
前記ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出させる検出工程と、
前記検出工程の検出結果をオブジェクトデータ保持情報として前記オブジェクトプログラムに組み込ませる第１の組込工程と、
前記オブジェクトプログラムの実行時に、前記オブジェクトデータ保持情報に基づいて、複数のスレッドのうち一つのスレッドのみが当該メソッドを実行するように制御する排他制御命令を前記オブジェクトプログラムに組み込ませる第２の組込工程と、
をコンピュータに実行させるためのコンパイラを記録したコンピュータ読み取り可能な記録媒体。
【請求項５】
前記ソースプログラムにおけるクラス定義に基づいて、クラスの継承関係をチェックさせる継承関係チェック工程を含み、前記検出工程においては、前記継承関係チェック工程のチェック結果に基づいて、当該クラスに対して継承関係にあるクラスについてもクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出させ、前記第２の組込工程においては、前記オブジェクトプログラムの実行時に、前記オブジェクトデータ保持情報に基づいて、複数のスレッドのうち一つのスレッドのみが、継承関係にあるクラスのメソッドも含めて実行するように制御する排他制御命令を前記オブジェクトプログラムに組み込ませることを特徴とする請求項４に記載のコンパイラを記録したコンピュータ読み取り可能な記録媒体。
【請求項６】
オブジェクト指向プログラミングによるソースプログラムをコンパイルさせることで、スレッドの生成により実行されるオブジェクトプログラムを生成させるコンパイラを記録したコンピュータ読み取り可能な記録媒体であって、
前記ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出させる検出工程と、
前記オブジェクトプログラムの実行時に、複数のスレッドのうち一つのスレッドのみが、前記検出手段により検出されたオブジェクトデータをアクセスするように制御する排他制御命令を前記オブジェクトプログラムに組み込ませる組込工程と、
をコンピュータに実行させるためのコンパイラを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、オブジェクトデータが複数のスレッドからアクセスされる場合に、アクセスを自動的にシリアライズすることで、アクセス競合を容易に回避することができるコンパイラ装置およびコンパイラを記録したコンピュータ読み取り可能な記録媒体に関するものである。
【０００２】
従来より、複数のクライアントがサーバ上のアプリケーションプログラムを共用することで、リソースの有効活用を図ることが可能なクライアント−サーバシステムが用いられている。このようなクライアント−サーバシステムにおいては、当該クライアントからの起動により、アプリケーションプログラムを起動させるためのスレッドが生成される。ここで、複数のクライアントからの起動により、同一のオブジェクトデータに関して、複数のスレッドが生成された場合には、スレッド間で競合が生じるため、このようなアクセス競合を効果的に回避する手段、手法が要請されている。
【０００３】
【従来の技術】
図２３は、上述した従来のクライアント−サーバシステムの構成を示すブロック図である。この図に示したクライアント−サーバシステムは、サーバ１と、サーバ１にネットワーク３を介してそれぞれ接続されたクライアント４1 およびクライアント４2 から構成されている。サーバ１において、アプリケーションプログラムＡＰ1 およびアプリケーションプログラムＡＰ2 は、オブジェクト指向プログラミングによるソースプログラムがコンパイルされた実行形式のプログラムであり、クライアント４1 およびクライアント４2 から起動される。
【０００４】
上記アプリケーションプログラムＡＰ1 は、オブジェクト指向プログラミングにおける親クラスＣ1 に対応している。一方、アプリケーションプログラムＡＰ2 は、上記親クラスＣ1 を継承する子クラスＣ2 に対応している。このような継承関係より、アプリケーションプログラムＡＰ1 およびアプリケーションプログラムＡＰ2 の起動時には、親クラスＣ1 の共通領域ＣO （オブジェクトデータ）がアクセスされることになる。スレッド生成部２は、アプリケーションプログラムＡＰ1 およびアプリケーションプログラムＡＰ2 を実行するためのスレッドＳ1 およびスレッドＳ2 を生成する。
【０００５】
上記構成において、クライアント４1 およびクライアント４2 によりサーバ１のアプリケーションプログラムＡＰ1 およびアプリケーションプログラムＡＰ2 が起動されると、スレッド生成部２は、スレッドＳ1 およびスレッドＳ2 をそれぞれ生成する。ここで、アプリケーションプログラムＡＰ1 およびアプリケーションプログラムＡＰ2 の実行に際しては、共通領域Ｃ0 （オブジェクトデータ）がスレッドＳ1 およびスレッドＳ2 に同時にアクセスされる、というアクセス競合が発生する。このような場合、スレッドＳ1 、スレッドＳ2 が共通領域Ｃ0 （オブジェクトデータ）に同時にアクセスしないように、スレッドＳ1 およびスレッドＳ2 をシリアライズするために排他制御を行う必要がある。この排他制御とは、スレッドＳ1 （またはスレッドＳ2 ）に共通領域Ｃ0 へのアクセス権を付与しておき、アクセスが終了した時点でスレッドＳ2 （またはスレッドＳ1 ）にアクセス権を付与することで、アクセス競合を回避するための制御をいう。
【０００６】
従来においては、排他制御の例として、アプリケーションプログラムの利用者が、当該アプリケーションプログラムを実行する前に、コマンド入力等により手動で当該アプリケーションプログラムを実行するためのロックをスレッドに獲得させるといった手法（以下、第１の手法という）が採られている。これにより、当該アプリケーションプログラムは、ロックを獲得したスレッドによってのみ実行され、他のスレッドは、当該アプリケーションプログラムを実行することができない。そして、アプリケーションプログラムの実行が終了すると、利用者により、ロックが解除される。これにより、他のスレッドは、当該アプリケーションプログラムの実行を行い得る。また、従来においては、別の排他制御の例として、親クラスＣ1 および子クラスＣ2 の作成時に、プログラマが、メソッド定義の中で上述した排他制御を行うための命令を記述するという手法（以下、第２の手法という）も採られている。
【０００７】
【発明が解決しようとする課題】
ところで、前述したように、従来においては、共通領域Ｃ0 （オブジェクトデータ）に複数のスレッドが同時にアクセスされるというアクセス競合を回避すべく、第１の手法または第２の手法により排他制御を行っている旨を述べた。
【０００８】
しかしながら、第１の手法においては、利用者により手動でロックの獲得／解除を行っているため、利用者のミスによりロックの解除のし忘れ等が発生することで、他のスレッド（利用者）が当該アプリケーションプログラムを長時間に亘って利用できない状態になるというトラブルが予想される。したがって、第１の手法は、アプリケーションプログラムの利用効率が低下する恐れがあることから、得策であるとは言えない。また、第１の手法においては、アプリケーションプログラムのデータ構造、特に、オブジェクトデータが存在するクラスを利用者が意識して排他制御を行うことが困難である。したがって、苦肉の策として、第１の手法においては、オブジェクトデータの存在の有無にかかわらず、アプリケーションプログラム単位で排他制御を行っていることから、本来、排他制御を行う必要がないアプリケーションに対して排他制御を行ってしまう場合があり、アプリケーションプログラムの利用効率が低下する。
【０００９】
さらに、第２の手法においては、プログラマにより、メソッド定義の中で上述した排他制御を行うための命令を記述するという手法が採られているが、ヒューマンエラーにより、誤った排他制御の命令を記述する可能性がある。このような場合には、排他制御が正常に実行されないというトラブルが発生するため、この第２の手法も得策であるとは言えない。このように、上述した第１および第２の手法は、利用者（プログラマも含む）に作業負担を強いる割には、効果的にアクセス競合を回避することができないのである。
【００１０】
本発明は、上記に鑑みてなされたもので、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータのアクセス競合を容易に回避することができるコンパイラ装置およびコンパイラを記録したコンピュータ読み取り可能な記録媒体を提供することを目的とする。
【００１１】
【課題を解決するための手段】
上記目的を達成するために、請求項１にかかる発明は、オブジェクト指向プログラミングによるソースプログラムをコンパイルすることで、スレッドの生成により実行されるオブジェクトプログラムを生成するコンパイラ装置において、前記ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出する検出手段（後述する実施の形態１のオブジェクトデータ検出部７１に相当）と、前記検出手段の検出結果をオブジェクトデータ保持情報として前記オブジェクトプログラムに組み込む第１の組込手段（後述する実施の形態１のオブジェクトコード生成部７０に相当）と、前記オブジェクトプログラムの実行時に、前記オブジェクトデータ保持情報に基づいて、複数のスレッドのうち一つのスレッドのみが当該メソッドを実行するように制御する排他制御命令を前記オブジェクトプログラムに組み込む第２の組込手段（後述する実施の形態１のオブジェクトコード生成部７０に相当）とを備えることを特徴とする。
【００１２】
この請求項１にかかる発明によれば、ソースプログラムがコンパイルされる際、検出手段により、ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かが検出された後、第１の組込手段により、検出結果がオブジェクトデータ保持情報としてオブジェクトプログラムに組み込まれる。さらに、第２の組込手段により、排他制御命令がオブジェクトプログラムに組み込まれる。そして、オブジェクトプログラムが実行されると、排他制御により、複数のスレッドのうち一つのスレッドが、オブジェクトデータに対応する当該メソッドを実行する。
【００１３】
このように、請求項１にかかる発明によれば、コンパイル時に、オブジェクトデータ保持情報および排他制御命令を自動的にオブジェクトプログラムに組み込むようにしたので、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータのアクセス競合が容易に回避される。
【００１４】
また、請求項２にかかる発明は、請求項１に記載のコンパイラ装置において、前記ソースプログラムにおけるクラス定義に基づいて、クラスの継承関係をチェックする継承関係チェック手段（後述する実施の形態１の継承関係チェック部７２に相当）を備え、前記検出手段は、前記継承関係チェック手段のチェック結果に基づいて、当該クラスに対して継承関係にあるクラスについてもクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出し、前記第２の組込手段は、前記オブジェクトプログラムの実行時に、前記オブジェクトデータ保持情報に基づいて、複数のスレッドのうち一つのスレッドのみが、継承関係にあるクラスのメソッドも含めて実行するように制御する排他制御命令を前記オブジェクトプログラムに組み込むことを特徴とする。
【００１５】
この請求項２にかかる発明によれば、ソースプログラムがコンパイルされる際、継承関係チェック手段により、ソースプログラムにおけるクラスの継承関係がチェックされ、検出手段により、当該クラスに対して継承関係にあるクラスについてもクラス定義に基づいて、オブジェクトデータが定義されているか否かが検出される。さらに、第１の組込手段により、検出結果がオブジェクトデータ保持情報としてオブジェクトプログラムに組み込まれた後、第２の組込手段により、排他制御命令がオブジェクトプログラムに組み込まれる。そして、オブジェクトプログラムが実行されると、排他制御により、複数のスレッドのうち一つのスレッドのみが継承関係にあるクラスのメソッドも含めて実行される。
【００１６】
このように、請求項２にかかる発明によれば、コンパイル時に、クラスの継承関係をチェックし、このチェック結果に基づくオブジェクトデータ保持情報および排他制御命令を自動的にオブジェクトプログラムに組み込むようにしたので、従来困難とされていた、クラスの継承関係も考慮した状態で、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータのアクセス競合が容易に回避される。
【００１７】
また、請求項３にかかる発明は、オブジェクト指向プログラミングによるソースプログラムをコンパイルすることで、スレッドの生成により実行されるオブジェクトプログラムを生成するコンパイラ装置において、前記ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出する検出手段（後述する実施の形態２のオブジェクトデータ検出部７１に相当）と、前記オブジェクトプログラムの実行時に、複数のスレッドのうち一つのスレッドのみが、前記検出手段により検出されたオブジェクトデータをアクセスするように制御する排他制御命令を前記オブジェクトプログラムに組み込む組込手段（後述する実施の形態２のオブジェクトコード生成部７０に相当）とを備えることを特徴とする。
【００１８】
この請求項３にかかる発明によれば、ソースプログラムがコンパイルされる際、検出手段により、ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かが検出された後、組込手段により、排他制御命令がオブジェクトプログラムに組み込まれる。そして、オブジェクトプログラムが実行されると、排他制御により、複数のスレッドのうち一つのスレッドのみが、検出されたオブジェクトデータをアクセスするように制御する。また、オブジェクトデータが検出されなかったメソッドに関しては、排他制御が行われることなく、複数のスレッド間では、同一の上記メソッドが実行される。
【００１９】
このように、請求項３にかかる発明によれば、コンパイル時に、排他制御命令を自動的にオブジェクトプログラムに組み込むようにしたので、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータのアクセス競合が容易に回避される。
【００２０】
また、請求項４にかかる発明は、オブジェクト指向プログラミングによるソースプログラムをコンパイルさせることで、スレッドの生成により実行されるオブジェクトプログラムを生成させるコンパイラを記録したコンピュータ読み取り可能な記録媒体であって、前記ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出させる検出工程（後述する実施の形態１のステップＳＢ２およびステップＳＢ４に相当）と、前記検出工程の検出結果をオブジェクトデータ保持情報として前記オブジェクトプログラムに組み込ませる第１の組込工程（後述する実施の形態１のステップＳＢ７〜ステップＳＢ１０に相当）と、前記オブジェクトプログラムの実行時に、前記オブジェクトデータ保持情報に基づいて、複数のスレッドのうち一つのスレッドのみが当該メソッドを実行するように制御する排他制御命令を前記オブジェクトプログラムに組み込ませる第２の組込工程（後述する実施の形態１のステップＳＡ５に相当）とをコンピュータに実行させるためのコンパイラを記録したコンピュータ読み取り可能な記録媒体である。
【００２１】
この請求項４にかかる発明によれば、ソースプログラムがコンパイルされる際、検出工程において、ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かが検出された後、第１の組込工程において、検出結果がオブジェクトデータ保持情報としてオブジェクトプログラムに組み込まれる。さらに、第２の組込工程において、排他制御命令がオブジェクトプログラムに組み込まれる。そして、オブジェクトプログラムが実行されると、排他制御により、複数のスレッドのうち一つのスレッドが、オブジェクトデータに対応する当該メソッドを実行する。
【００２２】
このように、請求項４にかかる発明によれば、コンパイル時に、オブジェクトデータ保持情報および排他制御命令を自動的にオブジェクトプログラムに組み込むようにしたので、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータのアクセス競合が容易に回避される。
【００２３】
また、請求項５にかかる発明は、請求項４に記載のコンパイラを記録したコンピュータ読み取り可能な記録媒体において、前記ソースプログラムにおけるクラス定義に基づいて、クラスの継承関係をチェックさせる継承関係チェック工程（後述する実施の形態１のステップＳＢ１に相当）を含み、前記検出工程においては、前記継承関係チェック工程のチェック結果に基づいて、当該クラスに対して継承関係にあるクラスについてもクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出させ、前記第２の組込工程においては、前記オブジェクトプログラムの実行時に、前記オブジェクトデータ保持情報に基づいて、複数のスレッドのうち一つのスレッドのみが、継承関係にあるクラスのメソッドも含めて実行するように制御する排他制御命令を前記オブジェクトプログラムに組み込ませることを特徴とする。
【００２４】
この請求項５にかかる発明によれば、ソースプログラムがコンパイルされる際、継承関係チェック工程において、ソースプログラムにおけるクラスの継承関係がチェックされ、検出工程において、当該クラスに対して継承関係にあるクラスについてもクラス定義に基づいて、オブジェクトデータが定義されているか否かが検出される。さらに、第１の組込工程において、検出結果がオブジェクトデータ保持情報としてオブジェクトプログラムに組み込まれた後、第２の組込工程において、排他制御命令がオブジェクトプログラムに組み込まれる。そして、オブジェクトプログラムが実行されると、排他制御により、複数のスレッドのうち一つのスレッドのみが継承関係にあるクラスのメソッドも含めて実行される。
【００２５】
このように、請求項５にかかる発明によれば、コンパイル時に、クラスの継承関係をチェックし、このチェック結果に基づくオブジェクトデータ保持情報および排他制御命令を自動的にオブジェクトプログラムに組み込むようにしたので、従来困難とされていた、クラスの継承関係も考慮した状態で、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータのアクセス競合が容易に回避される。
【００２６】
また、請求項６にかかる発明は、オブジェクト指向プログラミングによるソースプログラムをコンパイルさせることで、スレッドの生成により実行されるオブジェクトプログラムを生成させるコンパイラを記録したコンピュータ読み取り可能な記録媒体であって、前記ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かを検出させる検出工程（後述する実施の形態２のステップＳＧ４に相当）と、前記オブジェクトプログラムの実行時に、複数のスレッドのうち一つのスレッドのみが、前記検出手段により検出されたオブジェクトデータをアクセスするように制御する排他制御命令を前記オブジェクトプログラムに組み込ませる組込工程（後述する実施の形態１のステップＳＧ５に相当）とをコンピュータに実行させるためのコンパイラを記録したコンピュータ読み取り可能な記録媒体である。
【００２７】
この請求項６にかかる発明によれば、ソースプログラムがコンパイルされる際、検出工程において、ソースプログラムにおけるクラス定義に基づいて、オブジェクトデータが定義されているか否かが検出された後、組込工程において、排他制御命令がオブジェクトプログラムに組み込まれる。そして、オブジェクトプログラムが実行されると、排他制御により、複数のスレッドのうち一つのスレッドのみが、検出されたオブジェクトデータをアクセスするように制御する。また、オブジェクトデータが検出されなかったメソッドに関しては、排他制御が行われることなく、複数のスレッド間では、同一の上記メソッドが実行される。
【００２８】
このように、請求項６にかかる発明によれば、コンパイル時に、排他制御命令を自動的にオブジェクトプログラムに組み込むようにしたので、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータのアクセス競合が容易に回避される。
【００２９】
【発明の実施の形態】
以下、図面を参照して本発明にかかるコンパイラ装置およびコンパイラを記録したコンピュータ読み取り可能な記録媒体の実施の形態１および２について詳細に説明する。
【００３０】
（実施の形態１）
図１は、本発明にかかる実施の形態１の構成を示すブロック図である。この図に示した情報処理装置１０において、ＣＰＵ（Central Processing Unit）２０は、装置各部を制御するものである。ＲＯＭ（Read Only Memory）３０は、ＣＰＵ２０において実行される各種プログラムや、変数、初期値等を記憶する。ＲＡＭ（Random Access Memory）４０は、ＣＰＵ２０において生成される各種演算データ等を一時的に記憶する。コンパイラ部５０は、高水準言語で記述されたソースプログラムＳＰを機械語からなるオブジェクトプログラムＯＰに翻訳するものであり、プログラム解析部６０およびオブジェクトコード生成部７０を有している。このソースプログラムＳＰは、オブジェクト指向プログラミングにより作成されたプログラムである。
【００３１】
ここで、上記ソースプログラムＳＰの一例を図２（ａ）〜（ｃ）を参照して説明する。図２（ａ）〜（ｃ）には、ソースプログラムＳＰとして、ソースプログラム２００FJ、ソースプログラム２００A およびソースプログラム２００B がそれぞれ図示されている。ソースプログラム２００FJは、ＦＪＢＡＳＥクラスのソースプログラムであり、ソースプログラム２００A は、上記ＦＪＢＡＳＥクラスを継承しているＡクラスのソースプログラムである。さらに、ソースプログラム２００B は、Ａクラスを継承しているＢクラスのソースプログラムである。すなわち、ＦＪＢＡＳＥクラス、ＡクラスおよびＢクラスは、ＡクラスがＦＪＢＡＳＥクラスを継承しており、ＢクラスがＡクラスを継承しているという継承関係を有している。
【００３２】
図３は、図２（ａ）に示したソースプログラム２００FJにおいてＦＪＢＡＳＥクラスを定義したクラス定義（ＦＪＢＡＳＥ）を示す図である。この図において、クラス定義は、高水準言語の一例としてＣＯＢＯＬ言語で記述されている。IDENTIFICATION DIVISION（見出し部）には、CLASS-ID（クラス名）として「FJBASE」が記述されている。また、クラス定義においては、ＦＪＢＡＳＥクラスに関するファクトリ定義とオブジェクト定義とがそれぞれ記述されている。上記ファクトリ定義には、ＦＪＢＡＳＥクラスのオブジェクトインスタンスを生成するためのファクトリオブジェクトが定義されている。このファクトリ定義において、IDENTIFICATION DIVISION（見出し部）には、「FACTORY」が記述されており、PROCEDURE DIVISION（手続き部）には、上記ファクトリオブジェクトに関する「メソッドＮＥＷ」が定義されている。
【００３３】
一方、オブジェクト定義には、ＦＪＢＡＳＥクラスのオブジェクトが定義されており、IDENTIFICATION DIVISION（見出し部）として「OBJECT」、PROCEDURE DIVISION（手続き部）として「メソッドＭ１」および「メソッドＭ２」がそれぞれ定義されている。上記メソッドＮＥＷ、Ｍ１およびＭ２の定義の一例としては、図７（ｃ）に示すようにIDENTIFICATION DIVISION（見出し部）、PROCEDURE DIVISION（手続き部）等により記述されている。
【００３４】
図４は、図２（ｂ）に示したソースプログラム２００A においてＡクラスを定義したクラス定義（Ａ）を示す図である。この図において、IDENTIFICATION DIVISION（見出し部）には、CLASS-ID（クラス名）として「A」が記述されているとともに、継承関係を示すINHERITSには、「FJBASE」が記述されている。このINHERITS（「FJBASE」）により、ＡクラスがＦＪＢＡＳＥクラスを継承していることがわかる。また、クラス定義においては、Ａクラスに関するファクトリ定義とオブジェクト定義とがそれぞれ記述されている。また、ファクトリ定義には、Ａクラスのオブジェクトインスタンスを生成するためのファクトリオブジェクトが定義されている。このファクトリ定義において、IDENTIFICATION DIVISION（見出し部）には、「FACTORY」が記述されており、PROCEDURE DIVISION（手続き部）には、上記ファクトリオブジェクトに関する「メソッドＭ３」および「メソッドＭ４」が定義されている。
【００３５】
一方、オブジェクト定義には、Ａクラスのオブジェクトが定義されており、IDENTIFICATION DIVISION（見出し部）として「OBJECT」が記述されている。また、Ａクラスのオブジェクト定義には、ENVIRONMENT DIVISION（環境部）、DATA DIVISION（データ部）およびPROCEDURE DIVISION（手続き部）がそれぞれ記述されている。上記DATA DIVISION（データ部）には、前述したオブジェクトデータが定義されており、PROCEDURE DIVISION（手続き部）には、「メソッドＭ５」および「メソッドＭ６」がそれぞれ定義されている。
【００３６】
図５は、図２（ｃ）に示したソースプログラム２００B においてＢクラスを定義したクラス定義（Ｂ）を示す図である。この図において、IDENTIFICATION DIVISION（見出し部）には、CLASS-ID（クラス名）として「B」が記述されているとともに、継承関係を示すINHERITSには、「A」が記述されている。このINHERITS（「A」）により、ＢクラスがＡクラスを継承していることがわかる。また、クラス定義においては、Ｂクラスに関するファクトリ定義とオブジェクト定義とがそれぞれ記述されている。上記ファクトリ定義には、Ｂクラスのオブジェクトインスタンスを生成するためのファクトリオブジェクトが定義されている。このファクトリ定義において、IDENTIFICATION DIVISION（見出し部）には、「FACTORY」が記述されている。また、ファクトリ定義においては、ENVIRONMENT DIVISION（環境部）およびPROCEDURE DIVISION（手続き部）がそれぞれ定義されており、上記PROCEDURE DIVISION（手続き部）には、ファクトリオブジェクトに関する「メソッドＭ７」および「メソッドＭ８」がそれぞれ定義されている。
【００３７】
一方、オブジェクト定義には、Ｂクラスのオブジェクトが定義されており、IDENTIFICATION DIVISION（見出し部）として「OBJECT」が記述されている。また、Ｂクラスのオブジェクト定義には、ENVIRONMENT DIVISION（環境部）、DATA DIVISION（データ部）およびPROCEDURE DIVISION（手続き部）がそれぞれ記述されている。上記DATA DIVISION（データ部）には、前述したオブジェクトデータが定義されており、PROCEDURE DIVISION（手続き部）には、「メソッドＭ９」および「メソッドＭ１０」がそれぞれ定義されている。
【００３８】
プログラム解析部６０は、ソースプログラムＳＰを解析するものであり、ソースプログラムＳＰの字句を解析する字句解析部６１、構文を解析する構文解析部６２および意味を解析する意味解析部６３から構成されている。オブジェクトコード生成部７０は、プログラム解析部６０の解析結果に基づいて、ソースプログラムＳＰからオブジェクトコードを生成し、これをオブジェクトプログラムＯＰとして出力する。
【００３９】
このオブジェクトコード生成部７０において、オブジェクトデータ検出部７１は、ソースプログラムＳＰにおけるオブジェクトデータを検出するものである。具体的には、オブジェクトデータ検出部７１は、ソースプログラムＳＰ（たとえば、ソースプログラム２００FJ、ソースプログラム２００A およびソースプログラム２００B ）において、オブジェクトデータ（DATA DIVISION（データ部））を検出する。継承関係チェック部７２は、ソースプログラムＳＰ（たとえば、ソースプログラム２００FJ、ソースプログラム２００A およびソースプログラム２００B ）におけるクラスの継承関係のチェックを行う。具体的には、継承関係チェック部７２は、図５および図６に示したINHERITS（図５および図６参照）を確認することで、クラスの継承関係をチェックする。
【００４０】
入力装置８０は、キーボード、マウス等であり、各種データ入力、コマンド入力に用いられる。出力装置９０は、ＣＲＴ（Cathode-Ray Tube）、ＬＣＤ（Liquid Crystal Display）、プリンタ等であり、データの表示、印刷等を行う。記憶装置１００は、たとえば、ハードディスク装置等の外部記憶装置である。読取装置１１０は、たとえば、ＣＤ−ＲＯＭ（Compact Disk - Read Only Memory）等の記録媒体１２０に記録されたデータ、プログラム等を読み取る装置である。
【００４１】
つぎに、上述した実施の形態１の動作について、図６に示したフローチャートを参照しつつ説明する。以下においては、図１に示したソースプログラムＳＰとして、ソースプログラム２００FJ、ソースプログラム２００A およびソースプログラム２００B （図２（ａ）〜（ｃ）参照）をコンパイルする動作について説明する。図６に示したステップＳＡ１では、まず、ソースプログラム２００FJがプログラム解析部６０に読み込まれる。これにより、ステップＳＡ２では、字句解析部６１、構文解析部６２および意味解析部６３により、ソースプログラム２００FJの字句、構文および意味についての解析が行われた後、解析結果がオブジェクトコード生成部７０に渡される。
【００４２】
ステップＳＡ３では、オブジェクトコード生成部７０の継承関係チェック部７２は、ソースプログラム２００FJに関する継承関係チェック処理を行う。すなわち、継承関係チェック処理において、図８に示したステップＳＢ１では、継承関係チェック部７２は、ソースプログラム２００FJに関する図３に示したクラス定義（ＦＪＢＡＳＥ）において、前述したINHERITSを確認することで、ＦＪＢＡＳＥクラスが継承しているクラスがあるか否かを判断する。この場合、図３に示したクラス定義（ＦＪＢＡＳＥ）にINHERITSが定義されていないため、継承関係チェック部７２は、判断結果を「Ｎｏ」とする。
【００４３】
ステップＳＢ２では、オブジェクトデータ検出部７１は、自クラス（この場合、ＦＪＢＡＳＥクラス）において、オブジェクトデータ（DATA DIVISION（データ部））が定義されているか否かを判断する。この場合、図３に示したクラス定義（ＦＪＢＡＳＥ）にオブジェクトデータ（DATA DIVISION（データ部））が定義されていないため、オブジェクトデータ検出部７１は、判断結果を「Ｎｏ」とする。ステップＳＢ６では、オブジェクトデータ検出部７１は、上記オブジェクトデータ（DATA DIVISION（データ部））が定義されていないものが、ファクトリ定義であるか否かを判断する。この場合、図３に示したファクトリ定義にオブジェクトデータが定義されていないため、オブジェクトデータ検出部７１は、判断結果を「Ｙｅｓ」とする。
【００４４】
ステップＳＢ９では、継承関係チェック部７２は、図２（ａ）に示したクラス情報ファイル４００FJおよびロードモジュール３００FJにおけるオブジェクトデータ保持情報ＡおよびＣにそれぞれ「０」を設定した後、図６に示したメインルーチンに戻る。ここで、ロードモジュール３００FJおよびクラス情報ファイル４００FJは、ソースプログラム２００FJがコンパイルされることにより、生成されるものである。ロードモジュール３００FJは、実行形式のプログラムであり、クラス情報ファイル４００FJは、自クラス（この場合、ＦＪＢＡＳＥクラス）または継承している親クラスにおいて、ファクトリ定義およびオブジェクト定義（図３参照）で、オブジェクトデータ（DATA DIVISION（データ部））が定義されているか否かを表す情報であり、オブジェクトデータ保持情報ＡおよびＢからなる。
【００４５】
上記オブジェクトデータ保持情報Ａは、ファクトリ定義にオブジェクトデータ（DATA DIVISION（データ部））が定義されているか否かを表す情報である。具体的には、オブジェクトデータ保持情報Ａには、ファクトリ定義にオブジェクトデータ（DATA DIVISION（データ部））が定義されている場合、「１」が設定され、定義されていない場合、「０」が設定される。また、オブジェクトデータ保持情報Ｂは、オブジェクト定義にオブジェクトデータ（DATA DIVISION（データ部））が定義されているか否かを表す情報である。具体的には、オブジェクトデータ保持情報Ｂには、オブジェクト定義にオブジェクトデータ（DATA DIVISION（データ部））が定義されている場合、「１」が設定され、定義されていない場合、「０」が設定される。なお、図２（ｂ）および（ｃ）に示したクラス情報ファイル４００A および４００B は、上述したクラス情報ファイル４００FJと同様のファイルである。
【００４６】
また、ロードモジュール３００FJにおけるオブジェクトデータ保持情報Ｃは、オブジェクトデータ保持情報Ａと同一の情報である。すなわち、オブジェクトデータ保持情報Ｃには、ファクトリ定義にオブジェクトデータ（DATA DIVISION（データ部））が定義されている場合、「１」が設定され、定義されていない場合、「０」が設定される。オブジェクトデータ保持情報Ｄは、オブジェクトデータ保持情報Ｂと同一の情報である。すなわち、オブジェクトデータ保持情報Ｄには、オブジェクト定義にオブジェクトデータ（DATA DIVISION（データ部））が定義されている場合、「１」が設定され、定義されていない場合、「０」が設定される。
【００４７】
なお、図２（ｂ）および（ｃ）に示したロードモジュール３００A および３００B におけるそれぞれのオブジェクトデータ保持情報ＣおよびＤは、上述したロードモジュール３００FJにおけるオブジェクトデータ保持情報ＣおよびＤと同様の情報である。なお、ステップＳＢ６の判断結果が「Ｎｏ」である場合、図２（ａ）に示したクラス情報ファイル４００FJおよびロードモジュール３００FJにおけるオブジェクトデータ保持情報ＢおよびＤには、「０」がそれぞれ設定される。ここで、ステップＳＢ６の判断結果が「Ｎｏ」となる例としては、図３に示したクラス定義（ＦＪＢＡＳＥ）においてファクトリ定義がない場合である。
【００４８】
図６に示したステップＳＡ４では、オブジェクトコード生成部７０は、図３に示したソースプログラム２００FJのクラス定義において、メソッドが定義されているか否かを判断する。この場合、図３に示すように、ファクトリ定義においてメソッドＮＥＷが、オブジェクト定義においてメソッドＭ１およびＭ２がそれぞれ定義されているため、オブジェクトコード生成部７０は、ステップＳＡ４の判断結果を「Ｙｅｓ」として、ステップＳＡ５へ進む。なお、メソッドが定義されていない場合、オブジェクトコード生成部７０は、ステップＳＡ４の判断結果を「Ｎｏ」としてステップＳＡ６へ進む。
【００４９】
ステップＳＡ５では、オブジェクトコード生成部７０は、図７（ｄ）に示したように、当該メソッド（手続き）のプロローグにロック制御ライブラリ１（図１１参照）を呼び出すためのロック制御ライブラリ１呼び出し命令をロードモジュール３００FJ（図２（ａ）参照）に組み込む。上記ロック制御ライブラリ１は、前述した排他制御に関するロックを獲得する処理を実行するためのライブラリである。さらに、オブジェクトコード生成部７０は、図７（ｄ）に示したように、当該メソッド（手続き）のエピローグにロック制御ライブラリ２（図１２参照）を呼び出すためのロック制御ライブラリ２呼び出し命令をロードモジュール３００FJ（図２（ａ）参照）に組み込んだ後ステップＳＡ６へ進む。上記ロック制御ライブラリ２は、獲得したロックを解放する処理を実行するためのライブラリである。なお、ロック制御ライブラリ１および２における処理については、後述する。
【００５０】
ステップＳＡ６では、オブジェクトコード生成部７０は、図３に示したソースプログラム２００FJにおいて、たとえば、図７（ａ）に示すようなクラス利用者プログラムによりメソッドの呼び出しがプログラミングされているか否かを判断し、この判断結果が「Ｎｏ」である場合、ステップＳＡ１０へ進む。ここで、図７（ａ）に示したクラス利用者プログラムは、図７（ｂ）に示したように、ファクトリオブジェクト生成ライブラリ（図９参照）の呼び出し命令、メソッド呼び出し命令をそれぞれ表している。上記ファクトリオブジェクト生成ライブラリは、前述したファクトリオブジェクトを生成する処理を実行するためのライブラリであり、その詳細については後述する。
【００５１】
ステップＳＡ６の判断結果が「Ｙｅｓ」の場合、ステップＳＡ７では、オブジェクトコード生成部７０は、呼び出しされるメソッドが、ファクトリ定義で定義されたファクトリメソッド（たとえば、図３に示したメソッドＮＥＷ）であるか否かを判断し、同判断結果が「Ｙｅｓ」である場合、ステップＳＡ８へ進む。なお、ステップＳＡ７の判断結果が「Ｎｏ」である場合、オブジェクトコード生成部７０は、ステップＳＡ９へ進む。ステップＳＡ８では、オブジェクトコード生成部７０は、ファクトリオブジェクト生成ライブラリ（図９参照）を呼び出すためのファクトリオブジェクト生成ライブラリ呼び出し命令をロードモジュール３００FJ（図２（ａ）参照）に組み込んだ後、ステップＳＡ９へ進む。
【００５２】
ステップＳＡ９では、オブジェクトコード生成部７０は、利用者プログラム（図７参照）において呼び出しが指示されているメソッドを呼び出すための命令（メソッド呼び出し命令）をロードモジュール３００FJに組み込んだ後、ステップＳＡ１０へ進む。ステップＳＡ１０では、オブジェクトコード生成部７０は、全オブジェクト（この場合、ロードモジュール３００FJおよびクラス情報ファイル４００FJ）を出力する。これにより、ソースプログラム２００FJに関するコンパイルが終了する。
【００５３】
つぎに、ステップＳＡ１でソースプログラム２００A がプログラム解析部６０に読み込まれると、ステップＳＡ２では、前述した動作と同様にして、プログラム解析部６０により、ソースプログラム２００A の字句、構文および意味についての解析が行われた後、解析結果がオブジェクトコード生成部７０に渡される。これにより、ステップＳＡ３では、継承関係チェック部７２は、ソースプログラム２００A に関する継承関係チェック処理を行う。すなわち、継承関係チェック処理において、図８に示したステップＳＢ１では、継承関係チェック部７２は、前述した動作と同様にして、ソースプログラム２００A に関する図４に示したクラス定義（Ａ）において、前述したINHERITSを確認することで、Ａクラスが継承しているクラスがあるか否かを判断する。この場合、図４に示したクラス定義（Ａ）にINHERITS（FJBASE）が定義されているため、継承関係チェック部７２は、判断結果を「Ｙｅｓ」とする。
【００５４】
ステップＳＢ３では、オブジェクトデータ検出部７１は、自クラス（この場合、Ａクラス）が継承しているクラス（この場合、ＦＪＢＡＳＥクラス）に関するクラス情報ファイル（この場合、クラス情報ファイル４００FJ）を読み込んだ後、ステップＳＢ４へ進む。ステップＳＢ４では、オブジェクトデータ検出部７１は、上記クラス情報ファイル４００FJを確認することで、Ａクラスが継承しているＦＪＢＡＳＥクラスのクラス定義（図３参照）においてオブジェクトデータ（DATA DIVISION（データ部））が定義されているか否かを判断する。具体的には、オブジェクトデータ検出部７１は、クラス情報ファイル４００FJのオブジェクトデータ保持情報ＡまたはＢに「１」が設定されているか否かを判断する。この場合、オブジェクトデータ検出部７１は、クラス情報ファイル４００FJのオブジェクトデータ保持情報Ａに「０」が設定されているため、ステップＳＢ４の判断結果を「Ｎｏ」として、ステップＳＢ２へ進む。
【００５５】
ステップＳＢ２では、オブジェクトデータ検出部７１は、自クラス（この場合、Ａクラス）において、オブジェクトデータ（DATA DIVISION（データ部））が定義されているか否かを判断する。この場合、図４に示したオブジェクト定義にオブジェクトデータ（DATA DIVISION（データ部））が定義されているため、オブジェクトデータ検出部７１は、判断結果を「Ｙｅｓ」とする。ステップＳＢ５では、オブジェクトデータ検出部７１は、上記オブジェクトデータ（DATA DIVISION（データ部））がファクトリ定義で定義されているか否かを判断する。この場合、図４に示したファクトリ定義にオブジェクトデータが定義されていないため、オブジェクトデータ検出部７１は、判断結果を「Ｎｏ」とする。
【００５６】
ステップＳＢ８では、継承関係チェック部７２は、図２（ｂ）に示したクラス情報ファイル４００A およびロードモジュール３００A におけるオブジェクトデータ保持情報ＢおよびＤにそれぞれ「１」を設定した後、図６に示したメインルーチンに戻る。ここで、上記オブジェクトデータ保持情報ＢおよびＤに「１」が設定されていることから、ＡクラスまたはＡクラスが継承しているＦＪＢＡＳＥクラスのオブジェクト定義においてオブジェクトデータ（DATA DIVISION（データ部））が定義されていることがわかる。なお、ステップＳＢ５の判断結果が「Ｙｅｓ」である場合には、ステップＳＢ７では、オブジェクトデータ保持情報ＡおよびＣに「１」が設定される。
【００５７】
図６に示したステップＳＡ４〜ステップＳＡ９では、前述した動作と同様にして、ソースプログラム２００A （Ａクラス）に関する動作が行われる。そして、ステップＳＡ１０では、オブジェクトコード生成部７０は、全オブジェクト（この場合、ロードモジュール３００A およびクラス情報ファイル４００A ）を出力する。これにより、ソースプログラム２００A に関するコンパイルが終了する。
【００５８】
つぎに、ステップＳＡ１でソースプログラム２００B がプログラム解析部６０に読み込まれると、ステップＳＡ２では、前述した動作と同様にして、プログラム解析部６０により、ソースプログラム２００B の字句、構文および意味についての解析が行われた後、解析結果がオブジェクトコード生成部７０に渡される。これにより、ステップＳＡ３では、継承関係チェック部７２は、ソースプログラム２００B に関する継承関係チェック処理を行う。すなわち、継承関係チェック処理において、図８に示したステップＳＢ１では、継承関係チェック部７２は、前述した動作と同様にして、ソースプログラム２００B に関する図５に示したクラス定義（Ｂ）において、前述したINHERITSを確認することで、Ｂクラスが継承しているクラスがあるか否かを判断する。この場合、図５に示したクラス定義（Ｂ）にINHERITS（A）が定義されているため、継承関係チェック部７２は、判断結果を「Ｙｅｓ」とする。
【００５９】
ステップＳＢ３では、オブジェクトデータ検出部７１は、自クラス（この場合、Ｂクラス）が継承しているクラス（この場合、Ａクラス）に関するクラス情報ファイル（この場合、クラス情報ファイル４００A ）を読み込んだ後、ステップＳＢ４へ進む。ステップＳＢ４では、オブジェクトデータ検出部７１は、上記クラス情報ファイル４００A を確認することで、Ｂクラスが継承しているＡクラスのクラス定義（図４参照）においてオブジェクトデータ（DATA DIVISION（データ部））が定義されているか否かを判断する。具体的には、オブジェクトデータ検出部７１は、クラス情報ファイル４００A のオブジェクトデータ保持情報ＡまたはＢに「１」が設定されているか否かを判断する。この場合、クラス情報ファイル４００A のオブジェクトデータ保持情報Ｂに「１」が設定されているため、オブジェクトデータ検出部７１は、ステップＳＢ４の判断結果を「Ｙｅｓ」として、ステップＳＢ５へ進む。
【００６０】
ステップＳＢ５では、オブジェクトデータ検出部７１は、上記オブジェクトデータ（DATA DIVISION（データ部））がファクトリ定義で定義されているか否かを判断する。この場合、図５に示したファクトリ定義にオブジェクトデータが定義されていないため、オブジェクトデータ検出部７１は、判断結果を「Ｎｏ」とする。
【００６１】
ステップＳＢ８では、継承関係チェック部７２は、図２（ｃ）に示したクラス情報ファイル４００B およびロードモジュール３００B におけるオブジェクトデータ保持情報ＢおよびＤにそれぞれ「１」を設定した後、図６に示したメインルーチンに戻る。ここで、上記オブジェクトデータ保持情報ＢおよびＤに「１」が設定されていることから、ＢクラスまたはＢクラスが継承しているＡクラスのオブジェクト定義においてオブジェクトデータ（DATA DIVISION（データ部））が定義されていることがわかる。
【００６２】
図６に示したステップＳＡ４〜ステップＳＡ９では、前述した動作と同様にして、ソースプログラム２００B （Ｂクラス）に関する動作が行われる。そして、ステップＳＡ１０では、オブジェクトコード生成部７０は、全オブジェクト（この場合、ロードモジュール３００B およびクラス情報ファイル４００B ）を出力する。これにより、ソースプログラム２００B に関するコンパイルが終了する。
【００６３】
つぎにプログラム実行時の処理について、図９〜図１２に示したフローチャートを参照しつつ説明する。以下においては、図１に示した情報処理装置１０をサーバとし、このサーバに接続された複数のクライアント（図示略）が上記サーバにアクセスすることで、図２（ｃ）に示したロードモジュール３００B を実行する場合について説明する。ここで、クライアントからの起動によりスレッドが生成され、図７（ａ）に示したクラス利用者プログラムに応じたオブジェクトプログラムが実行されると、図９に示したファクトリオブジェクト生成ライブラリが呼び出される（図７（ｂ）の▲１▼−１参照）。
【００６４】
これにより、ステップＳＣ１では、ファクトリオブジェクトが既に生成されているか否かが判断され、同判断結果が「Ｙｅｓ」である場合、処理がメインルーチンへ移行する。ここで、ファクトリオブジェクトは、Ｂクラスのオブジェクトインスタンスを生成するためのものであり、上記オブジェクトインスタンスが生成される前に、サーバ（情報処理装置１０）側で生成されるものである。この場合、ステップＳＣ１の判断結果が「Ｎｏ」であるものとすると、ステップＳＣ２では、図７（ｅ）に示したＢクラスのファクトリオブジェクトが生成される。つぎのステップＳＣ３では、図２（ｃ）に示したオブジェクトデータ保持情報Ｃ（この場合「０」）が、図７（ｅ）に示したＢクラスのファクトリオブジェクトにおけるオブジェクトデータ保持情報Ｅの領域に複写される。
【００６５】
つぎのステップＳＣ４では、上記オブジェクトデータ保持情報Ｅが「１」であるか否かが判断される。このステップＳＣ４の判断結果が「Ｙｅｓ」である場合、ステップＳＣ５では、ミューテックスが作成され、これが、図７（ｅ）に示したファクトリオブジェクトにミューテックスＦとして設定される。上記ミューテックスは、セマフォのように、複数のスレッド間において一つのスレッドのみを実行可能とし、他のスレッドを実行待ち状態にするという排他制御を行うためのフラグである。この場合、オブジェクトデータ保持情報Ｅが「０」であるため、ステップＳＣ４の判断結果が「Ｎｏ」となり、処理がメインルーチンへ移行される。
【００６６】
つぎにメソッドＮＥＷ（図２（ａ）参照）の呼び出し命令（図７（ｂ）の▲１▼−２参照）が実行されると、図１０に示したメソッド呼び出しの処理が実行される。すなわち、ステップＳＤ１では、メソッド（この場合、メソッドＮＥＷ）のプロローグのコードが開始され、ステップＳＤ２では、図１１に示したロック制御ライブラリ１が実行される。すなわち、ステップＳＥ１では、実行中のＢクラスのファクトリオブジェクト（図７（ｅ）参照）のオブジェクトデータ保持情報Ｅの値が「１」であるか否かが判断される。この場合、上記オブジェクトデータ保持情報Ｅが「０」であるため、ステップＳＥ１の判断結果が「Ｎｏ」となり、図１０に示したメインルーチンへ処理が移行する。つぎのステップＳＤ３では、呼び出されたメソッドがメソッドＮＥＷであるか否かが判断され、この場合、判断結果が「Ｙｅｓ」となる。
【００６７】
これにより、ステップＳＤ４では、ファクトリオブジェクト（図７（ｅ）参照）により、図７（ｅ）に示したＢクラスのオブジェクトインスタンスが生成される。つぎのステップＳＤ６では、当該クラス（この場合、Ｂクラス）のロードモジュール（この場合、ロードモジュール３００B （図２（ｃ）参照））のオブジェクトデータ保持情報Ｄ（＝「１」）が、図７（ｅ）に示したＢクラスのオブジェクトインスタンスにおけるオブジェクトデータ保持情報Ｅの領域に複写される。つぎのステップＳＤ７では、上記オブジェクトデータ保持情報Ｅが「１」であるか否かが判断される。この場合、オブジェクトデータ保持情報Ｅが「１」であるため、ステップＳＤ７の判断結果が「Ｙｅｓ」となり、つぎのステップＳＤ８では、ミューテックスが作成され、これが、図７（ｅ）に示したＢクラスのオブジェクトインスタンスにミューテックスＦとして設定される。なお、ステップＳＤ７の判断結果が「Ｎｏ」である場合、処理がステップＳＤ９へ移行する。
【００６８】
ステップＳＤ９では、図１２に示したロック制御ライブラリ２が実行される。すなわち、ステップＳＦ１では、図７（ｅ）に示したＢクラスのファクトリオブジェクトのオブジェクトデータ保持情報Ｅが「１」であるか否かが判断される。この場合、上記オブジェクトデータ保持情報Ｅが「０」であるため判断結果が「Ｎｏ」となり、処理が終了する。
【００６９】
つぎに、メソッドＭ１（図２（ａ）参照）の呼び出し命令（図７（ｂ）の▲２▼参照）が実行されると、図１０に示したメソッド呼び出しの処理が実行される。すなわち、ステップＳＤ１では、メソッドＭ１のプロローグのコードが開始され、ステップＳＤ２では、図１１に示したロック制御ライブラリ１が実行される。すなわち、ステップＳＥ１では、実行中のＢクラスのオブジェクトインスタンス（図７（ｅ）参照）のオブジェクトデータ保持情報Ｅの値が「１」であるか否かが判断される。
【００７０】
この場合、上記オブジェクトデータ保持情報Ｅが「１」であるため、ステップＳＥ１の判断結果が「Ｙｅｓ」となる。つぎのステップＳＥ２では、当該スレッドは、Ｂクラスのオブジェクトインスタンス（図７（ｅ）参照）におけるミューテックスＦよりロックを獲得する。つぎに、ステップＳＥ３では、当該スレッドは、ミューテックスＦを参照することで、他のスレッドが、当該オブジェクトインスタンスに関するオブジェクトデータを使用している最中であるか否かを判断する。
【００７１】
ここで、すでに、他のスレッドが上記オブジェクトデータを使用している場合には、当該スレッドは、オブジェクトデータを使用できない状態にあるため、ステップＳＥ３の判断を繰り返すことで、待機する。つまり、この場合には、Ｂクラスのオブジェクトインスタンス（メソッド）を実行し、このオブジェクトインスタンスに関するオブジェクトデータを使用できるスレッドは、一つに制限されるという排他制御が行われる。そして、他のスレッドがＢクラスのオブジェクトインスタンスの実行を終えることにより、当該オブジェクトデータが未使用状態になると、ステップＳＥ３の判断結果が「Ｎｏ」となり、待機していたスレッドは、図１０に示したステップＳＤ３へ進む。ステップＳＤ３では、当該メソッドがメソッドＭ１であるため、判断結果が「Ｎｏ」となる。ステップＳＤ５では、メソッドＭ１が実行されることで、手続きが行われる。なお、この手続き中においては、他のスレッドは、Ｂクラスのオブジェクトインスタンスに関するメソッドを実行することができない。
【００７２】
つぎのステップＳＤ９では、当該スレッドは、ロック制御ライブラリ２（図１２参照）を実行する。すなわち、ステップＳＦ１では、図７（ｅ）に示したＢクラスのオブジェクトインスタンスのオブジェクトデータ保持情報Ｅが「１」であるか否かが判断される。この場合、上記オブジェクトデータ保持情報Ｅが「１」であるため判断結果が「Ｙｅｓ」となり、ステップＳＦ２では、当該スレッドにより、図７（ｅ）に示したミューテックスＦよりロックを解放する。これにより、他のスレッドは、Ｂクラスのオブジェクトインスタンスに関するメソッドを実行することが可能となる。
【００７３】
以上説明したように、上述した実施の形態１によれば、ソースプログラムＳＰのコンパイル時に、オブジェクトデータ保持情報Ｃ、Ｄ、および排他制御命令（ロック制御ライブラリ１および２呼び出し命令）を自動的にオブジェクトプログラムＯＰ（ロードモジュール３００FJ、３００A および３００B ）に組み込むようにしたので、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータ（DATA DIVISION（データ部））のアクセス競合が容易に回避される。また、実施の形態１によれば、継承関係チェック部７２によりクラスの継承関係をチェックし、このチェック結果に基づく上記オブジェクトデータ保持情報Ｃ、Ｄ、および排他制御命令（ロック制御ライブラリ１および２呼び出し命令）を自動的にオブジェクトプログラムに組み込むようにしたので、従来困難とされていた、クラスの継承関係も考慮した状態で、アクセス競合が容易に回避される。
【００７４】
（実施の形態２）
さて、前述した実施の形態１においては、図２（ａ）〜（ｃ）に示したようにＦＪＢＡＳＥクラス、ＡクラスおよびＢクラスに関して継承関係をチェックし、この継承関係を考慮してオブジェクトデータ（DATA DIVISION（データ部））に関するオブジェクトデータ保持情報ＣおよびＤをロードモジュール３００FJ、３００A および３００B にそれぞれ組み込む例について説明したが、これらオブジェクトデータ保持情報ＣおよびＤを用いることなく、前述した排他制御を行うようにしてもよい、以下この場合を実施の形態２として説明する。
【００７５】
なお、実施の形態２の構成が図１に示したものとほぼ同様であるため、以下においては、図１を参照して実施の形態２について説明する。ただし、実施の形態２においては、図１に示したオブジェクトコード生成部７０の機能が実施の形態１の場合と異なっており、かつ継承関係チェック部７２が設けられていない。このオブジェクトコード生成部７０の機能の詳細については後述する。
【００７６】
つぎに、実施の形態２の動作について図１７に示したフローチャートを参照しつつ説明する。この実施の形態２においては、図２（ａ）〜（ｃ）に示したソースプログラム２００FJ、２００A および２００B がソースプログラムＳＰとして用いられるものとする。また、これらソースプログラム２００FJ、２００A および２００B には、図１３〜図１５に示したクラス定義が定義されている。
【００７７】
図１７に示したステップＳＧ１では、まず、ソースプログラム２００FJがプログラム解析部６０に読み込まれる。これにより、ステップＳＧ２では、プログラム解析部６０により、ソースプログラム２００FJの字句、構文および意味についての解析が行われた後、解析結果がオブジェクトコード生成部７０に渡される。これにより、ステップＳＧ３では、オブジェクトコード生成部７０は、ステップＳＡ４（図６参照）と同様にして、図１３に示したソースプログラム２００FJのクラス定義において、メソッドが定義されているか否かを判断する。この場合、図１３に示すように、ファクトリ定義においてメソッドＮＥＷが、オブジェクト定義においてメソッドＭ１およびＭ２がそれぞれ定義されているため、オブジェクトコード生成部７０は、ステップＳＧ３の判断結果を「Ｙｅｓ」として、ステップＳＧ４へ進む。なお、メソッドが定義されていない場合、オブジェクトコード生成部７０は、ステップＳＧ３の判断結果を「Ｎｏ」としてステップＳＧ６へ進む。
【００７８】
ステップＳＧ４では、オブジェクトデータ検出部７１は、図１３に示したクラス定義（ＦＪＢＡＳＥ）においてオブジェクトデータ（DATA DIVISION（データ部））が定義されているか否かを判断し、この場合、オブジェクトデータが定義されていないため、判断結果を「Ｎｏ」として、ステップＳＧ６へ進む。ステップＳＧ６では、オブジェクトコード生成部７０は、図１３に示したソースプログラム２００FJにおいて、たとえば、図１８（ａ）に示すようなクラス利用者プログラムによりメソッドの呼び出しがプログラミングされているか否かを判断し、この判断結果が「Ｎｏ」である場合、ステップＳＧ１０へ進む。図１８（ａ）に示したクラス利用者プログラムは、メソッドＭ１がメソッドＭ５に変更されている点を除いて前述した図７（ａ）に示すものと同一である。
【００７９】
ステップＳＧ６の判断結果が「Ｙｅｓ」の場合、ステップＳＧ７では、オブジェクトコード生成部７０は、呼び出しされるメソッドが、ファクトリ定義で定義されたファクトリメソッド（たとえば、図１３に示したメソッドＮＥＷ）であるか否かを判断し、同判断結果が「Ｙｅｓ」である場合、ステップＳＧ８へ進む。なお、ステップＳＧ７の判断結果が「Ｎｏ」である場合、オブジェクトコード生成部７０は、ステップＳＧ９へ進む。ステップＳＧ８では、オブジェクトコード生成部７０は、ファクトリオブジェクト生成ライブラリ（図１９参照）を呼び出すためのファクトリオブジェクト生成ライブラリ呼び出し命令をロードモジュール３００FJ’（図１６（ａ）参照）に組み込んだ後、ステップＳＧ９へ進む。
【００８０】
ステップＳＧ９では、オブジェクトコード生成部７０は、利用者プログラム（図１８参照）において呼び出しが指示されているメソッドを呼び出すための命令（メソッド呼び出し命令）をロードモジュール３００FJ’に組み込んだ後、ステップＳＧ１０へ進む。ステップＳＧ１０では、オブジェクトコード生成部７０は、全オブジェクト（この場合、ロードモジュール３００FJ’）を出力する。これにより、ソースプログラム２００FJに関するコンパイルが終了する。
【００８１】
つぎに、ステップＳＧ１でソースプログラム２００A がプログラム解析部６０に読み込まれると、ステップＳＧ２では、前述した動作と同様にして、プログラム解析部６０により、ソースプログラム２００A の字句、構文および意味についての解析が行われた後、解析結果がオブジェクトコード生成部７０に渡される。これにより、ステップＳＧ３では、オブジェクトコード生成部７０は、図１４に示したソースプログラム２００A のクラス定義において、メソッドが定義されているか否かを判断する。この場合、図１４に示すように、ファクトリ定義においてメソッドＭ３およびＭ４が、オブジェクト定義においてメソッドＭ５およびＭ６がそれぞれ定義されているため、オブジェクトコード生成部７０は、ステップＳＧ３の判断結果を「Ｙｅｓ」とする。
【００８２】
ステップＳＧ４では、オブジェクトデータ検出部７１は、図１４に示したクラス定義（Ａ）においてオブジェクトデータ（DATA DIVISION（データ部））が定義されているか否かを判断し、この場合、オブジェクト定義においてメソッドＭ５およびＭ６に関してオブジェクトデータ（DATA DIVISION（データ部））が定義されているため、判断結果を「Ｙｅｓ」とする。ステップＳＧ５では、オブジェクトコード生成部７０は、図１６（ｂ）に示したように、メソッドＭ５およびＭ６（手続き）のプロローグにロック制御ライブラリ１（図２１参照）を呼び出すためのロック制御ライブラリ１呼び出し命令（図１８（ｃ）および（ｄ）参照）をロードモジュール３００A’（図１６（ｂ）参照）に組み込む。上記ロック制御ライブラリ１は、前述したロックを獲得する処理を実行するためのライブラリである。
【００８３】
さらに、オブジェクトコード生成部７０は、図１６（ｂ）に示したように、メソッドＭ５およびＭ６（手続き）のエピローグにロック制御ライブラリ２（図２２参照）を呼び出すためのロック制御ライブラリ２呼び出し命令をロードモジュール３００A’（図１６（ｂ）参照）に組み込んだ後、ステップＳＧ６へ進む。ステップＳＧ６〜ステップＳＧ９では、前述した動作と同様にして、ソースプログラム２００A （Ａクラス）に関する動作が行われる。そして、ステップＳＧ１０では、オブジェクトコード生成部７０は、全オブジェクト（この場合、ロードモジュール３００A’）を出力する。これにより、ソースプログラム２００A に関するコンパイルが終了する。
【００８４】
つぎに、ステップＳＧ１でソースプログラム２００B がプログラム解析部６０に読み込まれると、ステップＳＧ２では、前述した動作と同様にして、プログラム解析部６０により、ソースプログラム２００B の字句、構文および意味についての解析が行われた後、解析結果がオブジェクトコード生成部７０に渡される。これにより、ステップＳＧ３では、オブジェクトコード生成部７０は、図１５に示したソースプログラム２００B のクラス定義において、メソッドが定義されているか否かを判断する。この場合、図１５に示すように、ファクトリ定義においてメソッドＭ７およびＭ８が、オブジェクト定義においてメソッドＭ９およびＭ１０がそれぞれ定義されているため、オブジェクトコード生成部７０は、ステップＳＧ３の判断結果を「Ｙｅｓ」とする。
【００８５】
ステップＳＧ４では、オブジェクトデータ検出部７１は、図１５に示したクラス定義（Ｂ）においてオブジェクトデータ（DATA DIVISION（データ部））が定義されているか否かを判断し、この場合、オブジェクト定義においてメソッドＭ９およびＭ１０に関してオブジェクトデータ（DATA DIVISION（データ部））が定義されているため、判断結果を「Ｙｅｓ」とする。ステップＳＧ５では、オブジェクトコード生成部７０は、図１６（ｃ）に示したように、メソッドＭ９およびＭ１０（手続き）のプロローグにロック制御ライブラリ１（図２１参照）を呼び出すためのロック制御ライブラリ１呼び出し命令（図１８（ｃ）および（ｄ）参照）をロードモジュール３００B’（図１６（ｃ）参照）に組み込む。上記ロック制御ライブラリ１は、前述したロックを獲得する処理を実行するためのライブラリである。
【００８６】
さらに、オブジェクトコード生成部７０は、図１６（ｃ）に示したように、メソッドＭ９およびＭ１０（手続き）のエピローグにロック制御ライブラリ２（図２２参照）を呼び出すためのロック制御ライブラリ２呼び出し命令をロードモジュール３００B’（図１６（ｃ）参照）に組み込んだ後、ステップＳＧ６へ進む。ステップＳＧ６〜ステップＳＧ９では、前述した動作と同様にして、ソースプログラム２００Ｂ（Ｂクラス）に関する動作が行われる。そして、ステップＳＧ１０では、オブジェクトコード生成部７０は、全オブジェクト（この場合、ロードモジュール３００B’を出力する。これにより、ソースプログラム２００B に関するコンパイルが終了する。
【００８７】
つぎにプログラム実行時の処理について、図１９〜図２２に示したフローチャートを参照しつつ説明する。以下においては、図１に示した情報処理装置１０をサーバとし、このサーバに接続された複数のクライアント（図示略）が上記サーバにアクセスすることで、図１６（ｃ）に示したロードモジュール３００B’を実行する場合について説明する。ここで、クライアントからの起動によりスレッドが生成され、図１８（ａ）に示したクラス利用者プログラムに応じたオブジェクトプログラムが実行されると、図１９に示したファクトリオブジェクト生成ライブラリが呼び出される（図１８（ｂ）の▲１▼−１参照）。
【００８８】
これにより、ステップＳＨ１では、ステップＳＣ１（図９参照）と同様にして、ファクトリオブジェクトが既に生成されているか否かが判断され、同判断結果が「Ｙｅｓ」である場合、処理がメインルーチンへ移行する。この場合、ステップＳＨ１の判断結果が「Ｎｏ」であるものとすると、ステップＳＨ２では、図１８（ｅ）に示したＢクラスのファクトリオブジェクトが生成される。つぎのステップＳＨ３では、ステップＳＣ５（図９参照）と同様にして、ミューテックスが作成され、これが、図１８（ｅ）に示したファクトリオブジェクトにミューテックスＦとして設定される。上記ミューテックスは、実施の形態１において説明したように、複数のスレッド間において一つのスレッドのみを実行可能とし、他のスレッドを実行待ち状態にするという排他制御を行うためのフラグである。
【００８９】
つぎにメソッドＮＥＷ（図１６（ａ）参照）の呼び出し命令（図１８（ｂ）の▲１▼−２参照）が実行されると、図２０に示したメソッド呼び出しの処理が実行される。すなわち、ステップＳＩ１では、メソッド（この場合、メソッドＮＥＷ）のプロローグのコードが開始され、ステップＳＩ２では、メソッドＮＥＷに関してロック制御ライブラリ１の呼び出しがあるか否かが判断される。この場合、図１６（ａ）に示したメソッドＮＥＷには、ロック制御ライブラリ１の呼び出し命令が組み込まれていないため、ステップＳＩ２の判断結果が「Ｎｏ」となる。つぎのステップＳＩ４では、呼び出されたメソッドがメソッドＮＥＷであるか否かが判断され、この場合、判断結果が「Ｙｅｓ」となる。
【００９０】
これにより、ステップＳＩ６では、ファクトリオブジェクト（図１８（ｅ）参照）により、図１８（ｅ）に示したＢクラスのオブジェクトインスタンスが生成される。つぎのステップＳＩ７では、ステップＳＤ８（図１０参照）と同様にして、ミューテックスが作成され、これが、図１８（ｅ）に示したＢクラスのオブジェクトインスタンスにミューテックスＦとして設定される。なお、ステップＳＩ４の判断結果が「Ｎｏ」である場合、処理がステップＳＩ５へ移行する。
【００９１】
ステップＳＩ８では、メソッドＮＥＷに関してロック制御ライブラリ２の呼び出しがあるか否かが判断される。この場合、図１６（ａ）に示したメソッドＮＥＷには、ロック制御ライブラリ２の呼び出し命令が組み込まれていないため、ステップＳＩ８の判断結果が「Ｎｏ」となり、処理が終了する。このように、オブジェクトデータ（DATA DIVISION（データ部））が定義されていないメソッドＮＥＷが実行される際には、前述したロック制御が行われないため、複数のスレッド間でメソッドＮＥＷが同時に実行される。なお、オブジェクトデータが定義されていない他のメソッドＭ１、Ｍ２、Ｍ３、Ｍ４、Ｍ７およびＭ８（図１６（ａ）、（ｂ）および（ｃ）参照）の場合も、上述したメソッドＮＥＷの場合と同様である。
【００９２】
つぎに、メソッドＭ５（図１６（ｂ）参照）の呼び出し命令（図１８（ｂ）の▲２▼参照）が実行されると、図２０に示したメソッド呼び出しの処理が実行される。すなわち、ステップＳＩ１では、メソッドＭ５のプロローグのコードが開始され、ステップＳＩ２では、メソッドＭ５に関してロック制御ライブラリ１の呼び出しがあるか否かが判断される。この場合、図１６（ｂ）に示したメソッドＭ５には、ロック制御ライブラリ１の呼び出し命令が組み込まれているため、ステップＳＩ２の判断結果が「Ｙｅｓ」となる。ステップＳＩ３では、図２１に示したロック制御ライブラリ１が実行される。すなわち、ステップＳＪ１では、当該スレッドは、Ｂクラスのオブジェクトインスタンス（図１８（ｅ）参照）におけるミューテックスＦよりロックを獲得する。つぎに、ステップＳＪ２では、当該スレッドは、ミューテックスＦを参照することで、他のスレッドが、当該オブジェクトインスタンスに関するオブジェクトデータを使用している最中であるか否かを判断する。
【００９３】
ここで、すでに、他のスレッドが上記オブジェクトデータを使用している場合には、当該スレッドは、オブジェクトデータを使用できない状態にあるため、ステップＳＪ２の判断を繰り返すことで、待機する。つまり、この場合には、Ｂクラスのオブジェクトインスタンス（メソッド）を実行し、このオブジェクトインスタンスに関するオブジェクトデータを使用できるスレッドは、一つに制限される。そして、他のスレッドがＢクラスのオブジェクトインスタンスの実行を終えることにより、当該オブジェクトデータが未使用状態になると、ステップＳＪ２の判断結果が「Ｎｏ」となり、待機していたスレッドは、図２０に示したステップＳＩ４へ進む。ステップＳＩ４では、当該メソッドがメソッドＭ５であるため、判断結果が「Ｎｏ」となる。ステップＳＩ５では、メソッドＭ５が実行されることで、手続きが行われる。なお、この手続き中においては、他のスレッドは、Ｂクラスのオブジェクトインスタンスに関するメソッドを実行することができない。
【００９４】
つぎのステップＳＩ８では、メソッドＭ５に関してロック制御ライブラリ２の呼び出しがあるか否かが判断される。この場合、図１６（ｂ）に示したメソッドＭ５には、ロック制御ライブラリ２の呼び出し命令が組み込まれているため、ステップＳＩ８の判断結果が「Ｙｅｓ」となる。ステップＳＩ９では、図２２に示したロック制御ライブラリ２が実行される。すなわち、ステップＳＫ１では、当該スレッドにより、図１８（ｅ）に示したミューテックスＦよりロックを解放する。これにより、他のスレッドは、Ｂクラスのオブジェクトインスタンスに関するメソッドを実行することが可能となる。このように、オブジェクトデータ（DATA DIVISION（データ部））が定義されているメソッドＭ５が実行される際には、前述したロック制御（排他制御）が行われるため、メソッドＭ５を実行することができるスレッドが一つに限定される。なお、オブジェクトデータが定義されている他のメソッドＭ６、Ｍ９、Ｍ１０（図１６（ｂ）および（ｃ）参照）の場合も、上述したメソッドＭ５の場合と同様である。
【００９５】
以上説明したように、実施の形態２によれば、ソースプログラムＳＰのコンパイル時に、排他制御命令（ロック制御ライブラリ１および２呼び出し命令）を自動的にオブジェクトプログラム（ロードモジュール３００A’等）に組み込むようにしたので、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータ（DATA DIVISION（データ部））のアクセス競合が容易に回避される。
【００９６】
以上本発明の実施の形態１および２について図面を参照して詳述してきたが、具体的な構成例は、これら実施の形態１および２に限られるものではなく、本発明の要旨を逸脱しない範囲の設計変更等があっても本発明に含まれる。たとえば、実施の形態１および２においては、前述したコンパイラ装置の機能を実現するためのコンパイラ（プログラム）を図１に示したコンピュータ読み取り可能な記録媒体１２０に記録して、この記録媒体１２０に記録されたコンパイラをコンピュータに読み込ませ、実行させることによりコンパイラ装置の機能を実現するようにしてもよい。なお、記録媒体１２０には、ＣＤ−ＲＯＭ、光ディスク、フロッピーディスク、ハードディスク等の可搬型の記録媒体が含まれることはもとより、ネットワークのようにデータを一時的に記録保持するような伝送媒体も含まれる。
【００９７】
【発明の効果】
以上説明したように、請求項１、４にかかる発明によれば、コンパイル時に、オブジェクトデータ保持情報および排他制御命令を自動的にオブジェクトプログラムに組み込むようにしたので、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータのアクセス競合が容易に回避されるという効果を奏する。
【００９８】
また、請求項２、５にかかる発明によれば、コンパイル時に、クラスの継承関係をチェックし、このチェック結果に基づくオブジェクトデータ保持情報および排他制御命令を自動的にオブジェクトプログラムに組み込むようにしたので、従来困難とされていた、クラスの継承関係も考慮した状態で、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータのアクセス競合が容易に回避されるという効果を奏する。
【００９９】
また、請求項３、６にかかる発明によれば、コンパイル時に、排他制御命令を自動的にオブジェクトプログラムに組み込むようにしたので、利用者に特段の負担をかけることなく、複数のスレッド間におけるオブジェクトデータのアクセス競合が容易に回避されるという効果を奏する。
【図面の簡単な説明】
【図１】本発明にかかる実施の形態１の構成を示すブロック図である。
【図２】同実施の形態１の動作を説明する図である。
【図３】同実施の形態１におけるクラス定義（ＦＪＢＡＳＥ）を示す図である。
【図４】同実施の形態１におけるクラス定義（Ａ）を示す図である。
【図５】同実施の形態１におけるクラス定義（Ｂ）を示す図である。
【図６】同実施の形態１の動作を説明するフローチャートである。
【図７】同実施の形態１における動作を説明する図である。
【図８】同実施の形態１における継承関係チェック処理を説明するフローチャートである。
【図９】同実施の形態１におけるファクトリオブジェクト生成ライブラリの処理を説明するフローチャートである。
【図１０】同実施の形態１におけるメソッド呼び出しの処理を説明するフローチャートである。
【図１１】同実施の形態１におけるロック制御ライブラリ１の処理を説明するフローチャートである。
【図１２】同実施の形態１におけるロック制御ライブラリ２の処理を説明するフローチャートである。
【図１３】本発明にかかる実施の形態２におけるクラス定義（ＦＪＢＡＳＥ）を示す図である。
【図１４】同実施の形態２におけるクラス定義（Ａ）を示す図である。
【図１５】同実施の形態２におけるクラス定義（Ｂ）を示す図である。
【図１６】同実施の形態２におけるロードモジュールを示す図である。
【図１７】同実施の形態２の動作を説明するフローチャートである。
【図１８】同実施の形態２の動作を説明する図である。
【図１９】同実施の形態２におけるファクトリオブジェクト生成ライブラリの処理を説明するフローチャートである。
【図２０】同実施の形態２におけるメソッド呼び出しの処理を説明するフローチャートである。
【図２１】同実施の形態２におけるロック制御ライブラリ１の処理を説明するフローチャートである。
【図２２】同実施の形態２におけるロック制御ライブラリ２の処理を説明するフローチャートである。
【図２３】従来例の構成を示すブロック図である。
【符号の説明】
１０  情報処理装置
２０  ＣＰＵ
５０  コンパイラ部
６０  プログラム解析部
７０  オブジェクトコード生成部
７１  オブジェクトデータ検出部
７２  継承関係チェック部
１２０  記録媒体
【図１】
0003756352.tif 000002
【図２】
0003756352.tif 000003
【図３】
0003756352.tif 000004
【図４】
0003756352.tif 000005
【図５】
0003756352.tif 000006
【図６】
0003756352.tif 000007
【図７】
0003756352.tif 000008
【図８】
0003756352.tif 000009
【図９】
0003756352.tif 000010
【図１０】
0003756352.tif 000011
【図１１】
0003756352.tif 000012
【図１２】
0003756352.tif 000013
【図１３】
0003756352.tif 000014
【図１４】
0003756352.tif 000015
【図１５】
0003756352.tif 000016
【図１６】
0003756352.tif 000017
【図１７】
0003756352.tif 000018
【図１８】
0003756352.tif 000019
【図１９】
0003756352.tif 000020
【図２０】
0003756352.tif 000021
【図２１】
0003756352.tif 000022
【図２２】
0003756352.tif 000023
【図２３】
0003756352.tif 000024