(57)【要約】【課題】  プログラム言語の翻訳において、他プログラムのインタフェース情報を他の実行可能ファイルより参照する場合、全ての参照される実行可能ファイル（ＤＬＬ）をローディングし、該当する他プログラムを検索して見つけ出さなければならず、翻訳性能やメモリ消費量に影響を及ぼしていた。【解決手段】  他プログラムのインタフェース情報の最初の参照時に、リポジトリ解析部２０６が参照される実行可能ファイル（ＤＬＬ）２０７から取得した他プログラムのインタフェース情報をローカルリポジトリ２０８に格納しておき、２回目からの他プログラムのインタフェース情報の参照時には、ローカルリポジトリ２０８から他プログラムのインタフェース情報を取得して、プログラム間の参照解決をする。【選択図】  図２
2005346406.tif 000002
【特許請求の範囲】
【請求項１】
他プログラムのインタフェース情報を実行可能ファイルより参照する言語の翻訳において、最初の参照時に参照する他プログラムのインタフェース情報を外部記憶に保持するステップと、２回目以降の参照時に外部記憶より入力して当該プログラムのインタフェース情報を解決するステップを備える他プログラム参照解決方法。
【請求項２】
請求項１に記載の方法において、外部記憶の他プログラムのインタフェース情報の更新日時と実行可能ファイルの更新日時を比較することで、外部記憶の他プログラムのインタフェース情報と実行可能ファイル内にある他プログラムのインタフェース情報との整合性をとる方法。
【請求項３】
請求項１、請求項２及び請求項３に記載の機能を実現するプログラムを格納した記録媒体装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータのソフトウェアプログラムにおいて、他プログラムを参照する際の参照方法に関する。
【背景技術】
【０００２】
近年のソフトウェアとして、オペレーティングシステムの違いを意識せずに共通のソフトウェア環境を作り出し、さらに共通言語仕様（Common Language Specification）のもとにどの言語でも同じ実行環境で動作する共通言語ランタイム（Common Language Runtime）という技術が導入されている。共通言語ランタイムでは、言語を意識しないソフトウェアを構築することができる。例えば、オブジェクト指向プログラミングにおいて、Ｃ＃言語で生成したクラスのインスタンスオブジェクトを、ＣＯＢＯＬ言語で生成したクラスのインスタンスオブジェクトが継承したり、ＣＯＢＯＬ言語のプログラムから、Ｃ＃言語のクラスのメソッドを呼び出すことが可能である。
【０００３】
原始プログラムが共通言語ランタイム上で動作するためのアプリケーションである実行可能プログラムに翻訳されるとき、その原始プログラムの中で他の実行可能プログラム内のクラスを参照している場合、各言語翻訳プログラムは、他の実行可能プログラム内のクラスの情報を取得しなければならない。
【０００４】
例えば.NET Frameworkでは、他のアセンブリ（Windows（登録商標）システムにおけるＤＬＬファイルやＥＸＥファイルに含まれる実行可能プログラムの単位）内のクラスの情報を取得するには、アセンブリのバイナリフォーマットの中から、外部参照するクラスの情報として、クラスに含まれるメソッドの名前や引数などのインタフェース情報が含まれるメタデータ情報を、アセンブリのアクセス関数を使用して取得する（例えば特許文献１等参照）。
【０００５】
【特許文献１】特開２００２−０２４０３２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
上記の従来技術において、原始プログラム上で他のアセンブリであるＤＬＬ内に含まれるクラスを参照する場合に、参照されるクラスが原始プログラム上の参照元クラスの中に指定される。言語コンパイラは、その指定されたクラスを、コマンドライン上に指定された複数の参照されるＤＬＬのファイル名の中から探さなければならない。コマンドラインに指定された全ての参照されるＤＬＬをローディングし、その中からアセンブリの一種であるＤＬＬ内に含まれるマニフェスト及びメタデータを参照するためのアクセス関数を使用して、情報を取得する手順に則ってクラスを一個ずつ検索して見つけ出す。
【０００７】
上記の場合、原始プログラムをコンパイル中に、他のアセンブリであるＤＬＬを参照している場合の問題として、その参照されているＤＬＬを全てローディングしてメモリを圧迫することと、ＤＬＬを一個ずつ検索して参照されるクラスを探し出すための検索時間を要することがある。本発明の目的は、一度参照されたクラスを、２回目以降の参照時に、より少ないメモリで、より少ない検索時間で探し出すことで、プログラム開発時のコンパイル時間を短縮し、プログラム開発の効率を向上させることにある。
【課題を解決するための手段】
【０００８】
上記目的を達成するために、局所的に管理するローカルな外部記憶ファイルとしてローカルリポジトリを導入する。ここで、リポジトリとは、クラスのインタフェース情報を格納しておき、他のアセンブリからクラスの情報が参照された場合に、そのクラスのインタフェース情報を提供するためのものである。ローカルリポジトリには、一度参照されたクラスの定義情報を格納しておき、２回目以降の参照時にそのローカルリポジトリを利用して名前の参照解決をするものである。
【発明の効果】
【０００９】
以上により、ローカルリポジトリを使用して原始プログラムから参照されるクラスのインタフェース情報を取得することにより、参照されるクラスが含まれると考えられるＤＬＬをすべて検索して参照されるクラスを見つけ出し、言語翻訳プログラムがそのクラスのインタフェース情報を使用できるようにメモリ上に展開する処理の時間を短縮することが可能となる。特に、原始プログラムから参照されるクラスを含んでいるアセンブリ（ＤＬＬ）が多ければ多いほど、また、参照されるアセンブリがすでに変更されることはなく、開発中の原始プログラムを何度も翻訳すればするほど有効となる。言語翻訳性能を向上させ、プログラム開発の効率向上に貢献する。
【００１０】
また、参照されるクラスのインタフェース情報を他のアセンブリ（ＤＬＬ）から直接取得する方法では、参照されるクラスが含まれると考えられるアセンブリを全てメモリ中にローディングする必要があり、多くのメモリを消費することから、ローカルリポジトリを使用することでコンピュータ資源の削減という観点からも効果的である。
【発明を実施するための最良の形態】
【００１１】
本発明の一実施例を、図にしたがって説明する。
【００１２】
図１に本発明の基本構成を示す。コンピュータ１０１の構成要素として、ＣＰＵ１０２、ディスプレイ１０３、キーボード１０４、２次記憶装置１０５、主記憶装置１０６から成り、バス１１０によって各構成要素が接続されている。２次記憶装置１０５は、利用者が作成する原始プログラム１１１を含む。主記憶装置１０６は、コンピュータを動作させるための基本プログラムであるオペレーティングシステム１０７、利用者が動作させるアプリケーションプログラム１０９、原始プログラム１１１を翻訳して、オペレーティングシステム１０７上で動作させるための実行可能プログラム（アプリケーションプログラム１０９に相当する）を作成する言語翻訳プログラム１０８から構成される。ここでオペレーティングシステム１０７は、例えば.NET Frameworkのような、各種言語翻訳プログラムから作成したアプリケーションプログラムが動作するための共通言語基盤のプログラムも含む。
【００１３】
図２に、外部記憶としてローカルリポジトリを使用した言語翻訳プログラム１０８の構成を示す。言語翻訳プログラム１０８は、利用者が作成した原始プログラム１１１を入力とし、オペレーティングシステム１０７で動作するようなアセンブリ１０９を出力する。アセンブリ１０９は、共通言語基盤上で動作する実行単位で、Windows（登録商標）システムにおけるＤＬＬファイルやＥＸＥファイルに含まれる実行可能プログラムを指す。
【００１４】
言語翻訳プログラム１０８は、原始プログラム１１１を入力すると、字句解析部２０１で字句に分解する。分解した字句を、構文解析部２０２で構文にしたがって内部的に表現した中間語２０３に変換する。意味解析部２０４では中間語２０３をさらに詳細に表現し、コード生成部２０５で実行可能プログラムであるアセンブリ１０９に変換する。
【００１５】
原始プログラム１１１が例えばオペレーティングシステム１０７のクラスライブラリを呼び出すなど他のアセンブリ（ＤＬＬファイル）２０７を参照している場合、言語翻訳プログラム１０８は、呼び出したクラスなどのインタフェース情報を取得して、クラスの参照関係を解決する必要がある。そのため、構文解析部２０２において、原始プログラム１１１が他のアセンブリ２０７を参照していたら、リポジトリ解析部２０６が参照している他のクラスのインタフェース情報を取得して解析し、構文解析部２０２に渡してクラスの参照関係を解決する。ここで、.NET Frameworkのような共通言語基盤システムでは、アセンブリをそのままリポジトリとして使用している。
【００１６】
本発明では、参照されるアセンブリ２０７に含まれているクラスが参照される場合に、１回目は参照されるアセンブリ２０７からそのままクラスのインタフェース情報を取得する。そのときに、リポジトリ解析部２０６がそのインタフェース情報をローカルリポジトリ２０８に格納しておく。そして、同じクラスを原始プログラムの別の個所で参照していたり、再度原始プログラムを翻訳する場合には、クラスのインタフェース情報を、参照されるアセンブリ２０７から取得せずに、格納しておいたローカルリポジトリ２０８から取得する。
【００１７】
図３に、ローカルリポジトリ２０８の構成図を示す。ローカルリポジトリ２０８は、ローカルリポジトリのヘッダ部３０１とローカルリポジトリの本体部３０２から構成される。ローカルリポジトリのヘッダ部３０１は、原始プログラム１１１から参照されるクラス単位に、参照されるクラス名３０３、参照されるクラスを含んでいるＤＬＬ名３０４、ＤＬＬの更新日時３０５、ローカルリポジトリの本体部３０２に格納されているインタフェース情報へのインデックス３０６で構成されている。ローカルリポジトリの本体部３０２は、参照されるクラス単位に、クラスのインタフェース情報３０７から構成されている。クラスのインタフェース情報３０７には、クラスに含まれるメソッドのメソッド名やそのメソッドの引数の情報が含まれている。また、クラスのインタフェース情報３０７は、ローカルリポジトリのヘッダ部３０１に含まれるインタフェース情報へのインデックス３０６と関連付けられている。
【００１８】
原始プログラムから他のアセンブリに含まれるクラスを参照する場合に、ローカルリポジトリに格納する情報の例を図４に示す。図４において、原始プログラムＡ（４０１）、原始プログラムＢ（４０２）、および原始プログラムＣ（４０３）の３個の原始プログラムから１個のアセンブリ１０９が生成されるとする。原始プログラムＡ（４０１）内のクラスＡ１において、アセンブリＸ．ｄｌｌ（４０４）に含まれるクラスＸ１とクラスＸ２を参照している。原始プログラムＢ（４０２）内のクラスＢ１において、アセンブリＸ．ｄｌｌ（４０４）に含まれるクラスＸ１とアセンブリＹ．ｄｌｌ（４０５）に含まれるクラスＹ１を参照している。原始プログラムＣ（４０３）内のクラスＣ１において、アセンブリＸ．ｄｌｌ（４０４）に含まれるクラスＸ３を参照している。その場合、ローカルリポジトリ２０８には、クラスＸ１、クラスＸ２、クラスＸ３、およびクラスＹ１のインタフェース情報が格納される。ローカルリポジトリのヘッダ部３０１におけるクラスＸ１の情報として、クラス名「クラスＸ１」、クラスＸ１が含まれるＤＬＬ名「Ｘ．ｄｌｌ」、ＤＬＬ「Ｘ．ｄｌｌ」の更新日時である「２００４０１１０  ０８：０４：１５」、インタフェース情報がローカルリポジトリの本体部３０２の先頭に格納されるためにインタフェース情報へのインデックス「０」が格納される。同様に、クラスＸ２、クラスＸ３、およびクラスＹ１の情報がローカルリポジトリのヘッダ部３０１に格納される。一方、ローカルリポジトリの本体部３０２におけるクラスＸ１の情報として、クラスＸ１のインタフェース情報が先頭（すなわちインデックス０）に格納される。同様に、クラスＸ２、クラスＸ３、およびクラスＹ１のインタフェース情報が順に格納される。
【００１９】
図５において、リポジトリ解析部２０６が、ローカルリポジトリ２０８を使用して、他のアセンブリ２０７に含まれるクラスを参照する処理の流れを説明する。まず、リポジトリ解析部２０６は、他のアセンブリ（ＤＬＬ）のクラスが参照されているかを判定する（５０１）。参照されていない場合は、何もせずに終了する。参照されている場合、参照されるクラスがローカルリポジトリにあるかを判定する（５０２）。ローカルリポジトリにある場合、ローカルリポジトリのヘッダ部３０１に格納されている、参照されるクラスの更新日時３０５が、そのクラスを含んでいるＤＬＬの現在の更新日時より新しいかを判定する（５０３）。ここで、更新日時は、現在のＤＬＬに含まれるインタフェース情報と整合性をとるためのもので、バージョン情報等でもよい。５０３の判定で新しい場合、ローカルリポジトリのヘッダ部３０１に格納されているインタフェース情報へのインデックス３０６より、参照されるクラスのインタフェース情報３０７を取得し（５０４）、その情報を構文解析部２０２に渡して終了する。参照されるクラスがローカルリポジトリにあるかの判定（５０２）で存在しない場合、参照されるアセンブリ（ＤＬＬ）を１個ずつ検索して（５０５）、参照するクラスを見つける。また、参照されるクラスの更新日時３０５が、そのクラスを含んでいるＤＬＬの現在の更新日時より新しいかの判定（５０３）で、古い場合、ローカルリポジトリのヘッダ部３０１に格納されているＤＬＬ名３０４を検索する（５０６）。５０５および５０６において、参照されるクラスを含んでいるアセンブリ（ＤＬＬ）が見つかったかを判定する（５０７）。見つかった場合、ローカルリポジトリに参照されるクラスの情報を登録し（５０８）、参照されるクラスのインタフェース情報３０７を取得する処理（５０４）に移る。参照されるクラスを含んでいるアセンブリ（ＤＬＬ）が見つかったかの判定（５０７）において見つからなかった場合、検索エラーを出力し（５０９）、終了する。
【図面の簡単な説明】
【００２０】
【図１】本発明の基本構成を示す図である。
【図２】ローカルリポジトリを使用した言語翻訳プログラムの構成を示す図である。
【図３】一度参照されたクラスを格納しておくローカルリポジトリの構成を示す図である。
【図４】原始プログラムから他のアセンブリ（ＤＬＬ）に含まれるクラスを参照する場合に、ローカルリポジトリに格納する情報の例を示す図である。
【図５】ローカルリポジトリを使用して、他のアセンブリ（ＤＬＬ）に含まれるクラスを参照する処理を示す流れ図である。
【符号の説明】
【００２１】
１０１…コンピュータ、１０２…ＣＰＵ、１０３…ディスプレイ、１０４…キーボード、１０５…２次記憶装置、１０６…主記憶装置、１０７…オペレーティングシステム、１０８…言語翻訳プログラム、１０９…アプリケーションプログラム（アセンブリ（実行可能プログラム））、１１０…バス、１１１…原始プログラム、２０３…アセンブリ（実行可能プログラム）、２０１…字句解析部、２０２…構文解析部、２０３…中間語、２０４…意味解析部、２０５…コード生成部、２０６…リポジトリ解析部、２０７…参照されるアセンブリ（ＤＬＬ）、２０８…ローカルリポジトリ、３０１…ローカルリポジトリのヘッダ部、３０２…ローカルリポジトリの本体部、３０３…参照されるクラス名、３０４…ＤＬＬ名、３０５…ＤＬＬの更新日時、３０６…インタフェース情報へのインデックス、３０７…クラスのインタフェース情報（メソッド名、メソッド引数の情報等）、４０１…原始プログラムＡ、４０２…原始プログラムＢ、４０３…原始プログラムＣ、４０４…アセンブリＸ．ｄｌｌ、４０５…アセンブリＹ．ｄｌｌ、５０１…他のアセンブリ（ＤＬＬ）のクラスが参照されているかという判定処理、５０２…参照されるクラスがローカルリポジトリにあるかの判定処理、５０３…参照されるクラスの更新日時が、そのクラスを含んでいるＤＬＬの現在の更新日時より新しいかという判定処理、５０４…参照されるクラスのインタフェース情報を取得する処理、５０５…参照されるアセンブリ（ＤＬＬ）を１個ずつ検索する処理、５０６…ローカルリポジトリのヘッダ部に格納されているＤＬＬ名を検索する処理、５０７…参照されるクラスを含んでいるアセンブリ（ＤＬＬ）が見つかったかを判定する処理、５０８…ローカルリポジトリに参照されるクラスの情報を登録する処理、５０９…検索エラーを出力する処理。
【図１】
2005346406.tif 000003
【図２】
2005346406.tif 000004
【図３】
2005346406.tif 000005
【図４】
2005346406.tif 000006
【図５】
2005346406.tif 000007