(57)【特許請求の範囲】
【請求項１】
開発系コンピュータで開発された配布プログラムと前記配布プログラムを実行系コンピュータで実行する際に利用するライブラリ関数であって開発時に使用したものとを記録しているインストーラを、実行系コンピュータへ供給し、前記実行系コンピュータの操作者が前記配布プログラムの前記インストーラを起動し、前記実行系コンピュータへインストールする際に、上記実行系コンピュータのライブラリに保持されているライブラリ関数を上記配布プログラムで使われるライブラリ関数のバージョンに一致させるライブラリ関数バージョン一致方法であって、前記開発系コンピュータにて前記配布プログラムに使用するライブラリ関数のバージョンを前記配布プログラム内に記述しておき、前記実行系コンピュータへ前記配布プログラムをインストールする際に、前記インストーラが前記配布プログラムに使用するライブラリ関数とそのバージョンを検出し、当該ライブラリ関数に対応する前記実行系コンピュータのライブラリに保持されているライブラリ関数とそのバージョンを検出し、ライブラリ関数とバージョンが一致したときは、前記実行系コンピュータのライブラリへ前記配布プログラムにおいて使用されるバージョンのライブラリ関数の追記は行わず、ライブラリ関数のバージョンが一致するものが存在しないときのみ、前記実行系コンピュータのライブラリをそのまま保持し、前記実行系コンピュータのライブラリへ前記配布プログラムにおいて使用されるバージョンのライブラリ関数を前記インストーラから追記する様にしたことを特徴とするライブラリ関数バージョン一致方法。
【請求項２】
請求項１に記載の前記配布プログラムのライブラリ呼出命令コードに、当該ライブラリ関数と、そのバージョンを示す符号とが記述されていることを特徴とするライブラリ関数バージョン一致方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、開発系で開発した配布プログラムを実行系へインストールする際に行われるライブラリ関数のバージョンアップ方法に関し、特に、アプリケーションプログラム開発で用いたライブラリ関数と同一のライブラリ関数を全て実行系に保持することができるライブラリ関数バージョンアップ方法に関する。
【０００２】
【従来の技術】
近年、パソコンの普及に伴いソフトウェアの低価格化、大量供給、および早期開発の進展に伴い、ソフトウェアの質の低下、すなわち、ソフトウェアの品質検査を充分行うことなく市場に供給しなければならない状況に至っている。この時、既に市場への提供を済ませているソフトウェアに対して追加や改善を行った部分の置き換え（更新：バージョンアップ）を速やかに実施する必要が生じており、これが重要な技術となってきている。
ここでは、オペレーティングシステムの構成要素も、オペレーティングシステムにアクセスするライブラリも追加・更新の対象となる。
一般に、オペレーティングシステムでは、複数のアプリケーションプログラムを同時期に並行して実行する場合、アプリケーションプログラムが異なるアプリケーションプログラムの命令コードの中に分岐していかないように異なるアドレス空間を割り当てる様になっている。
しかし、多機能化して肥大化したライブラリ関数の命令コードを個別のアプリケーションソフトウェア毎に組み込むと、全く同じ機能を持った命令コードが複数個メモリ上に存在することになり、メモリの使用効率が悪くなってしまう。
ライブラリ関数をアプリケーションプログラムに組み込む場合は、そのアプリケーションプログラムが呼び出しているライブラリ関数だけをライブラリの中から引き出して組み込む様にしているが、入出力処理のような利用頻度の高いものは殆どのアプリケーションプログラムの中にそのライブラリ関数が重なって入ることになってしまう。
そこで、同一のライブラリ関数の命令コード一式をメモリ上に一つだけ置き、各アプリケーションプログラムは、実行権を得ている間にそれらの命令コード一式を利用する方式（ダイナミックリンク）がとられるようになってきている。
この方式では、アプリケーションプログラムを開発する側（開発系と呼ぶ）が利用しているライブラリ関数のバージョンと、開発したアプリケーションプログラムを実行する側（実行系と呼ぶ）が利用しているライブラリ関数のバージョンとが一致するとは限らない。
そこで、ライブラリ関数のバージョンがより新しい場合はより古いバージョンの機能を全て包含していることを前提として、開発したアプリケーションプログラムを実行系にインストールするときに、そのアプリケーションプログラムが利用する開発系のライブラリ関数のバージョンと実行系のライブラリ関数のバージョンとを比較して、開発系のライブラリ関数のバージョンの方が実行系のライブラリ関数のバージョンよりもより新しい場合に、開発系のライブラリ関数を実行系にインストールすることがなされている。
【０００３】
上述した開発系のライブラリ関数を実行系にインストールしてバージョンアップする方法の一例について図９を参照して説明する。
図９は、従来のライブラリ関数のバージョンアップ方法の手順を示す図である。
図９において、点線の左側が開発者側の開発系２であり、点線の右側がパソコン等の実行系４である。図９に示す様に、まず、開発者側で、バージョンアップ対象であるライブラリを利用している開発者が開発しているアプリケーションプログラム１とそのバージョンアップ対象のライブラリ３とをコンパイラ５でコンパイルして配布プログラム７を作成する。次に、実行系４においてインストーラ９が上記開発系２から供給された上記配布プログラム７と共にバージョンアップ対象のライブラリ３のインストールを実行すると、上記配布プログラム７が実行系４のハードディスク１１のプログラムファイル１３に書き込まれると共に、ＯＳ１５を用いて上記ハードディスク１１の実行系ライブラリ（バージョン番号ｆ，１）１７を上記バージョンアップ対象のライブラリ（バージョン番号ｆ，２）に書き換えることにより、バージョンアップを行っている。
次に、上記図９に示したバージョンアップ方法の詳細について説明する。
まず、図１０〜図１３を参照して上記アプリケーションプログラム１のソースコード、バージョンアップ対象のライブラリ３、配布プログラム７、および実行系ライブラリ１７について説明する。
図１０に示す様に、上記アプリケーションプログラム１のソースコードは、ｆというライブラリ関数名１９をもつライブラリ関数を呼び出す記述を含むＣ言語で記述したプログラムのソースコードであって、図１０ではライブラリ関数名１９の関数呼び出しを行う文の記述のみ例示しているが、その全体はＣ言語の言語処理系で処理可能なプログラムの記述となっていることは言うまでもない。
上記ソースコードをコンパイルする作業を行うアプリケーションプログラム開発者が利用するライブラリが、開発系ライブラリ３であり、その構造例を図１１に示す。上記開発系ライブラリ３は、一つのライブラリファイル２１でできており、その中には、複数の関数ブロック２３がある。関数ブロック２３は、その開始と終了が明確になっており、コンパイラ５によって個別に読み出し可能である。
上記関数ブロック２３には、関数名フィールド２５があり、上記コンパイラ５によって、個別に読み出した関数ブロックの中から読み出し可能である。また、上記関数ブロック２３にはバージョンフィールド２７があり、その関数ブロック２３のバージョンを識別する符号を記録している。上記バージョンを識別する符号としては、その関数ブロック２３を開発した日付時刻など、ライブラリ関数開発の新旧関係を識別可能な情報が用いられる。上記開発系ライブラリ３の中で、同一の関数名が関数名フィールド２５に書き込まれている関数ブロック２３が複数個重複して存在するようなことはない。
【０００４】
次に、アプリケーションプログラム開発者は、上記アプリケーションプログラム１のソースコードを作成する作業を終えると、上記コンパイラ５の入力に上記ソースコードと開発系ライブラリ３を与えてコンパイラ５を起動し、上記コンパイラ５は処理を終了すると、配布プログラム７を生成するわけであるが、このコンパイラ５の処理手順の例を、図１４を参照して以下に説明する。
図１４のステップ１０１において、上記コンパイラ５は、処理を開始するとまずソースコード読み込み処理を実行する。上記ソースコード読み込み処理は、アプリケーションプログラム開発者がコンパイラ５に入力として与えた上記ソースコードを、先頭から読み込みコンパイルする。
次に、ステップ１０３において、読み込んだ部分がライブラリ関数呼び出しの形式であるかどうかをライブラリ呼び出し判定処理で判定し、このライブラリ呼び出し判定処理の判定の結果、読み込んだ部分がライブラリ関数呼び出し処理でなかった場合は、一般コード生成処理を実行する（ステップ１０５）。上記一般コード生成処理は、ライブラリ関数呼び出し以外のＣ言語にしたがう記述を命令コードにコンパイルする処理である。
上記ステップ１０３において、読み込んだ部分がライブラリ関数呼び出しであった場合、ステップ１０７においてライブラリ呼び出し命令生成処理を実行する。上記ライブラリ呼び出し命令生成処理は、図１０に示したソースコード（ライブラリ関数名１９がｆであるライブラリ関数を呼び出す処理）を図１２に示す配布プログラムにコンパイルし、その配布プログラム７に命令コードを書き込む。
【０００５】
従来技術におけるコンパイラ５は、ライブラリ関数名１９をｆとするライブラリ関数を呼び出す部分を、図１２に示すように、そのライブラリ関数名１９に応じたライブラリ参照フィールド２９を持つライブラリ呼び出し命令３１に変換している。
次に、ステップ１０９において、上記コンパイラ５は、ソースコード読み込み処理（ステップ１０１）で読み込み、一般コード生成処理（ステップ１０５）またはライブラリ呼び出し命令生成処理（ステップ１０７）で命令コードを生成した読み込み部分が、入力しているソースコード４の最後の部分であるかどうかを処理終了判定処理で判定し、最後の部分でなかったならば再び上記ステップ１０１のソースコード読み込み処理から処理を行い、最後の部分であったならば、配布プログラム７の生成を完了して、コンパイラ５の処理を終了する。
【０００６】
次に、アプリケーションプログラム開発者がアプリケーションプログラムの開発を終了した後に、アプリケーションプログラム利用者が利用できるようにするには、コンパイル処理を行った後にできあがった配布プログラム７を実行系にインストールするわけであるが、このインストーラ９によるインストール処理について図１５を参照して以下に説明する。
まず、図１５のステップ１１１において、上記インストーラ９は、処理を開始すると、まず上記配布プログラム７の複写処理を実行する。この配布プログラムの複写処理は、上記配布プログラム７を実行系が読み取って実行可能な場所および格納形式でプログラムファイル１３に複写するものである。ここでは、単純に、配布プログラム７と全く同一の形式とする。
上記インストーラ９は、次に、ステップ１１３において、上記配布プログラム７が利用するライブラリ関数のバージョン番号を検出するバージョン番号の検出処理を実行する。この検出処理においては、上記インストーラ９は上記配布プログラム７を読み取り、その中からライブラリ呼び出し命令３１（図１２参照）を識別し、その中のライブラリ参照フィールド２９を読み出して、呼び出すライブラリ関数名１９を識別し、そのライブラリ関数名１９と同一名称の上記開発系ライブラリ３の関数名フィールド２５を有する関数ブロック２３をライブラリファイル２１から呼び出し、そのバージョンフィールド２７を読み出して、利用するバージョン番号を検出する。
【０００７】
ここで、上記インストーラ９は、上記実行系４の側で動作する。そして、上記配布プログラム７と開発系ライブラリ３のライブラリファイル２１を一つの可搬媒体に記録しておくなどの措置をとり、上記インストーラ９が開発系ライブラリ３のライブラリファイル２１を読み取り可能としておく。
上記インストーラ９は、次に、ステップ１１５において、上記実行系４の中の規定位置に格納してある実行系ライブラリ１７のライブラリファイル３３（図１３参照）を読み取り、上記開発系ライブラリ３のライブラリファイル２１に対して行ったのと同様にして、実行系ライブラリ１７の中から、呼び出すライブラリ関数名１９と同じ名称の関数名フィールド３５を有する関数ブロック３７を読み取り、その中のバージョンフィールド３９を読み取ってインストールしたアプリケーションプログラムが利用可能なバージョン番号のライブラリを検出する。
上記インストーラ９は、利用可能バージョン番号検出処理（ステップ１１５）において、上記実行系ライブラリ１７の関数ブロック３７をライブラリファイル３３の中に見いだすことがなかった場合は、ステップ１１７において、利用可能バージョン番号の検出成否判定処理で検出無しと判定し、この場合は、開発系ライブラリ３から読み取った関数ブロック２３を実行系ライブラリ１７のライブラリファイル３５の中に無条件に追加するライブラリの複写処理を実行する（ステップ１１９）。
【０００８】
そして、上記ステップ１１７の利用可能バージョン番号の検出成否判定処理で検出有りと判定した場合は、開発系ライブラリ３のライブラリファイル２１の関数ブロック２３のバージョンフィールド２７から読み取ったバージョン番号と、上記実行系ライブラリ１７のライブラリファイル３３の関数ブロック３７のバージョンフィールド３９から読み取ったバージョン番号とを比較する利用可能判定処理を実行する（ステップ１２１）。
上記利用可能判定処理は、利用可能バージョン番号が利用するバージョン番号よりもより小さな値であり、利用可能バージョン番号の方がより古いことを示している場合ならば、ステップ１２３においてライブラリの上書き処理を実行する。
上記ライブラリ上書き処理では、上記実行系ライブラリ１７のライブラリファイル３３の中から利用可能バージョン番号の検出処理（ステップ１１５）で読み取った関数ブロック３７と同じ格納位置に、上記開発系ライブラリ３のライブラリファイル２１の中から利用するバージョン番号の検出処理（ステップ１１３）で読み取った関数ブロック２３を上書きする。
図１５に示した例では、一つのライブラリ関数についてのみ処理するようにしているが、利用するバージョンの検出処理（ステップ１１３）以降の処理を、上記配布プログラム７の中のライブラリ呼出命令全てについて適用することで、複数のライブラリ関数について処理することができる。
上記実行系ライブラリ１７の例を図１３に示す。従来方式の実行系ライブラリ１７の形式は、図１１に示す従来方式の開発系ライブラリの例と同じ形式となる。
【０００９】
次に、上記従来技術の実行系４の動作処理について図１６を参照して説明する。
上記実行系４を操作してアプリケーションプログラムを起動する利用者が、上記実行系４に対する入力として、上記インストーラ９が作成したプログラムファイル１３を指定して、上記実行系４の処理を起動すると、起動した実行系４は、まずプログラムファイル１３をメモリ上に読み込む、プログラムのロードを実行する（ステップ１２５）。
このプログラムのロードが終わると、上記実行系４は、ロードしたプログラムファイル１３の内容である命令コードを解析して、実行すべき命令コードを特定する命令の解析処理を行う（ステップ１２７）。その結果、実行すべき命令コードがライブラリ呼出命令であるかどうかを、ステップ１２９のライブラリ呼出判定処理で判定し、ライブラリ呼出命令でなければ一般命令の実行を行う（ステップ１３１）。一般命令の実行では、ライブラリ呼出命令以外の全ての命令コードの実行を行う。
上記ステップ１２９におけるライブラリ呼出判定処理でライブラリ呼出命令であると判定した場合は、その命令コードのライブラリ参照フィールドを読み出し、読み出すライブラリ関数名を識別し、そのライブラリ関数名と同じ名称の関数名フィールド３５を有する関数ブロック３７のコードエリア４１を実行系ライブラリ１７のライブラリファイル３３から読み取り、メモリ上にロードする、ライブラリのロードを行う（ステップ１３３）。上記ライブラリのロードでは、すでにメモリ上に同一名称のライブラリ関数があれば、そのライブラリ関数のコードエリアのメモリ上へのロードは行わない。
【００１０】
上記ライブラリのロードを終えると、上記実行系４は、ライブラリのロードでコードエリア４１からメモリ上にロードした命令コードの列、もしくは既にメモリ上に存在していた場合には、コードエリア４１からメモリ上にロードしたときに相当する命令コードの列を実行するライブラリの実行を行う（ステップ１３５）。
次に、一般命令の実行若しくはライブラリの実行を行った実行系４は、その結果処理が終了するかどうかを判定する実行終了判定処理を行い（ステップ１３７）、終了しないと判定したならば引き続く命令コードを識別して命令の解析（ステップ１２７）からの処理を再び行う。終了すると判定したならば、上記実行系４は処理を終了する。
以上のようにして、従来技術では、アプリケーションプログラムを開発する開発系２が有するライブラリ関数のバージョンと、アプリケーションプログラムを実行する実行系４が有するライブラリ関数のバージョンに違いがあったとしても、インストール時により新しいバージョンに実行系４が有するライブラリ関数を更新することによって、従来から実行系４に存在するアプリケーションプログラムの動作も新しく開発したアプリケーションプログラムの動作もともに可能にしていた。
【００１１】
【発明が解決しようとする課題】
しかしながら、以上述べた従来技術では、ライブラリ関数のバージョンがより新しい場合は古いバージョンの機能を全て包含していることが、新しいバージョンのライブラリ関数の開発において保証できない場合、新しいアプリケーションプログラムを実行系にインストールするときに行うライブラリの上書き処理（図１５のステップ１２３）の結果、新しくインストールしたアプリケーションプログラムは正常に動作するものの、実行系に既に存在していたアプリケーションプログラムのいくつかの動作が正常でなくなってしまう問題があった。
すなわち、上述した従来技術では、実行系ライブラリを新しいバージョンに更新する時に、古いバージョンのライブラリの上に上書きするために古いバージョンのライブラリ関数を用いるアプリケーションプログラムが正常に実行できなくなってしまうものであった。
この様な状況が生じるのは、新しいバージョンのライブラリ関数を開発する開発者は、通常、旧版との互換性を意識して開発を進めるのが一般的であるが、新しい機能を実現するために、必ずしも古いバージョンのライブラリ関数の全機能をそのまま踏襲できるとは限らないからである。
本発明は、上記事情に鑑みてなされたものであって、アプリケーションプログラム開発で用いたライブラリ関数と同一のライブラリ関数を全て実行系に保持することができるライブラリ関数バージョンアップ方法を提供することを目的とする。
【００１２】
【課題を解決するための手段】
上記目的を達成するため、本発明は、開発系コンピュータで開発された配布プログラムと前記配布プログラムを実行系コンピュータで実行する際に利用するライブラリ関数であって開発時に使用したものとを記録しているインストーラを、実行系コンピュータへ供給し、前記実行系コンピュータの操作者が前記配布プログラムの前記インストーラを起動し、前記実行系コンピュータへインストールする際に、上記実行系コンピュータのライブラリに保持されているライブラリ関数を上記配布プログラムで使われるライブラリ関数のバージョンに一致させるライブラリ関数バージョン一致方法において、前記開発系コンピュータにて前記配布プログラムに使用するライブラリ関数のバージョンを前記配布プログラム内に記述しておき、前記実行系コンピュータへ前記配布プログラムをインストールする際に、前記インストーラが前記配布プログラムに使用するライブラリ関数とそのバージョンを検出し、当該ライブラリ関数に対応する前記実行系コンピュータのライブラリに保持されているライブラリ関数とそのバージョンを検出し、ライブラリ関数とバージョンが一致したときは、前記実行系コンピュータのライブラリへ前記配布プログラムにおいて使用されるバージョンのライブラリ関数の追記は行わず、ライブラリ関数のバージョンが一致するものが存在しないときのみ、前記実行系コンピュータのライブラリをそのまま保持し、前記実行系コンピュータのライブラリへ前記配布プログラムにおいて使用されるバージョンのライブラリ関数を前記インストーラから追記する様にしたことを特徴とする。
【００１３】
【発明の実施の形態】
以下、本発明を図示した実施形態に基づいて説明する。図１は、本発明によるライブラリ関数のバージョンアップ方法の一実施形態の手順を示す図である。
本発明によるライブラリ関数のバージョンアップ方法の要点は、配布プログラムにライブラリ関数のバージョン番号を付けて実行系へ配布し、インストール時に古いバージョンのライブラリ関数に追記して新しいバージョンのライブラリ関数を実行系ライブラリに書き込む様にしたことである。
すなわち、図１に示す様に、点線の左側を開発者側の開発系５２とし、点線の右側をパソコン等の実行系５４とした場合、まず、開発者側で、バージョンアップ対象であるライブラリを利用している開発者が開発しているアプリケーションプログラム５１とバージョンアップ対象のライブラリ５３とをコンパイラ５５でコンパイルして配布プログラム５７を作成する。ここで、上記配布プログラム５７は、図４において後述する如くに、そのライブラリ呼出命令７１中に呼び出すライブラリ関数のバージョンを指定する関数バージョンフィールド７３を有している。
次に、上記開発系５２から実行系５４のインストーラ５９へ上記配布プログラム５７と共にバージョンアップ対象のライブラリ５３がインストールされると、上記配布プログラム５７が実行系５４のハードディスク６１のプログラムファイル６３に書き込まれると共に、後述する如くに、ＯＳ６５を用いて上記ハードディスク６１の実行系ライブラリ６７に、図５に示す様に、上記バージョンアップ対象のライブラリ（バージョン番号ｆ，２）を追記する。
【００１４】
次に、上記図１に示したバージョンアップ方法の詳細について説明する。まず、図２〜図５を参照して上記アプリケーションプログラム５１のソースコード、バージョンアップ対象のライブラリ５３、配布プログラム５７、および実行系ライブラリ６７について説明する。
図２に示す様に、上記アプリケーションプログラム５１のソースコードは、ｆというライブラリ関数名１９をもつライブラリ関数を呼び出す記述を持つＣ言語で記述したプログラムのソースコードであって、図２では、ライブラリ関数名１９の関数呼び出しを行う文の記述のみ例示しているが、その全体はＣ言語の言語処理系で処理可能なプログラムの記述となっている。
上記ソースコードをコンパイルする作業を行うアプリケーションプログラム開発者が利用するライブラリが、開発系ライブラリ５３であり、その構造例を図３に示している。開発系ライブラリ５３は、一つのライブラリファイル２１でできており、その中には、複数の関数ブロック２３がある。関数ブロック２３は、その開始と終了が明確になっており、コンパイラ５５によって個別に読み出し可能である。
上記関数ブロック２３には、関数名フィールド２５があり、上記コンパイラ５５によって、個別に読み出した関数ブロックの中から読み出し可能である。また、上記関数ブロック２３にはバージョンフィールド２７があり、その関数ブロック２３のバージョンを識別する番号を記録している。バージョンを識別する番号としては、その関数ブロック２３を開発した日付時刻など、ライブラリ関数開発の新旧関係を識別可能な情報が用いられる。
【００１５】
次に、上記アプリケーションプログラム開発者は、上記アプリケーションプログラム５１のソースコードを作成する作業を終えると、上記コンパイラ５５の入力にソースコードと開発系ライブラリ５３を与えてコンパイラ５５を起動し、コンパイラ５５の処理が終了すると、配布プログラム５７を生成するわけであるが、このコンパイラ５５の処理手順を図６を参照して以下に説明する。
図６のステップ２０１において、上記コンパイラ５５は、処理を開始するとまずソースコード読み込み処理を実行する。このソースコード読み込み処理は、アプリケーションプログラム開発者が上記コンパイラ５５に入力として与えたソースコードを先頭から読み込み、コンパイルする。
次に、ステップ２０３において、上記読み込んだ部分がライブラリ関数呼び出しの形式であるかどうかをライブラリ呼び出し判定処理で判定し、このライブラリ呼び出し判定処理の判定の結果、読み込んだ部分がライブラリ関数呼出処理でなかった場合は、一般コード生成処理を実行する（ステップ２０５）。この一般コード生成処理は、この実施例においては、ライブラリ関数呼出以外のＣ言語にしたがう記述を命令コードにコンパイルする処理である。
上記ステップ２０３において、読み込んだ部分がライブラリ関数呼出であった場合、次に、ステップ２０７において、バージョン番号読み込み処理が行われる。このバージョン番号読み込み処理は、次のライブラリ呼出命令生成処理（ステップ２０９）で必要とされる配布プログラム５７中に書き込むバージョン番号を得るためのもので、図２に示すソースコードをソースコード読み込み処理（ステップ２０１）で読み込んで判別しているライブラリ関数名１９を用いて、図５に示す様にそれと同じ名称の関数名フィールド７５を有する関数ブロック７７を実行系ライブラリ５３のライブラリファイル７９から読み込み、そのバージョンフィールド８１を読み込むことによって、上記配布プログラム５７の中に書き込むバージョン番号を得る様にしている。
【００１６】
そして、次に、ステップ２０９において、ライブラリ呼出命令生成処理を実行する。このライブラリ呼出命令生成処理は、図２に示した例（ライブラリ関数名１９がｆであるライブラリ関数を呼び出す処理）を、図４に示す例にコンパイルし、配布プログラム５７に命令コードを書き込む。
上記コンパイラ５５は、ライブラリ関数名１９をｆとするライブラリ関数を呼び出す部分を図４に示すように、そのライブラリ関数名１９に応じたライブラリ参照フィールド８３および呼び出すライブラリ関数のバージョンを指定する関数バージョンフィールド７３を持つライブラリを呼び出す命令７１に変換している。
上記コンパイラ５５は、ソースコード読み込み処理（ステップ２０１）で読み込み、一般コード生成処理（ステップ２０５）またはライブラリ呼出命令生成処理（ステップ２０９）で命令コードを生成し、読み込んだ部分が、入力しているソースコードの最後の部分であるかどうかを処理終了判定処理で判定し（ステップ２１１）、最後の部分でなかったならば再びステップ２０１のソースコード読み込み処理から処理を行い、最後の部分であったならば、上記配布プログラム５７の生成を完了して、コンパイルの処理を終了する。
【００１７】
次に、アプリケーションプログラム開発者がアプリケーションプログラムの開発を終了した後に、アプリケーションプログラム利用者が利用できるようにするには、コンパイル処理を行った後にできあがった配布プログラム５７を実行系にインストールするわけであるが、このインストーラ５９によるインストール処理について図７を参照して以下に説明する。
まず、図７のステップ２１３において、上記インストーラ５９は、処理を開始すると、まず配布プログラム５７の複写処理を実行する。この配布プログラムの複写処理は、上記配布プログラム５７を実行系５４が読み取って実行可能な場所および格納形式でプログラムファイル６３に複写する。ここでは、単純に、配布プログラム５７と全く同一の形式とする。
上記インストーラ５９は、次に、ステップ２１５において、配布プログラム５７が利用するライブラリ関数のバージョン番号を検出するバージョン番号の検出処理を実行する。すなわち、上記インストーラ５９は配布プログラム５７を読み取り、その中からライブラリ呼出命令７１を識別し、その中のライブラリ参照フィールドを読み出して、呼び出すライブラリ関数名１９を識別し、そのライブラリ関数名１９と同一名称の関数名フィールド２５を有する関数ブロック２３をライブラリファイル２１から読み出し、そのバージョンフィールド２７を読み出して、利用するバージョン番号を検出する。
【００１８】
次に、インストーラ２は、ステップ２１７において、利用可能バージョン番号の検出処理を行う。この利用可能バージョン番号の検出処理は、実施例における実行系ライブラリ６７のライブラリファイル７９の中から、バージョン番号を検出する対象としているライブラリ関数名１９と同じ名称の関数名フィールド７５を有する全ての関数ブロック７７を読み取って、それらの中のバージョンフィールド８１の全てを読み取る。
次に、ステップ２１９において、上記インストーラ５９は、上記利用可能バージョン番号の検出処理で読み取った全てのバージョン番号の中に、利用するバージョン番号の検出処理で読み取ったバージョン番号があるかどうかを判定する利用可能判定処理を行う。その結果、利用するバージョン番号の検出処理で読み取ったバージョン番号が、利用可能バージョン番号の検出処理で読み取ったバージョン番号の中にない場合、ステップ２２１においてライブラリ複写処理を行う。このライブラリ複写処理（ステップ２２１）は、開発系ライブラリ５３から読み取った関数ブロック２３を実行系ライブラリ６７のライブラリファイル７９の中に無条件に追加する処理である。
ここで、上記実行系ライブラリ６７の例を図５に示す。この実施形態においては、上記実行系ライブラリ６７のライブラリファイル７９の中に、バージョンフィールド８１の内容が異なれば、関数名フィールド７５の内容が同一の関数ブロック７７が複数存在する。また、バージョンフィールド８１の内容がともに等しく、かつ関数名フィールド７５の内容がともに等しい。２つの関数ブロック７７は存在しないように構成されている。
【００１９】
次に、上記実行系５４の動作処理について図８を参照して説明する。
上記実行系５４を操作してアプリケーションプログラムを起動する利用者は、実行系５４に対する入力として、インストーラ５９が作成したプログラムファイル６３を指定して、実行系５４の処理を起動すると、起動した実行系５４は、まずプログラムファイル６３をメモリ上に読み込む、プログラムのロードを実行する（ステップ２２３）。
上記プログラムのロードが終わると、上記実行系５４は、ロードしたプログラムファイル６３の内容であった命令コードを解析して、実行すべき命令コードを特定する命令の解析処理を行う（ステップ２２５）。その結果、ステップ２２７において、実行すべき命令コードがライブラリ呼出命令であるかどうかをライブラリ呼出判定処理で判定し、ライブラリ呼出命令でなければ一般命令の実行を行う（ステップ２２９）。この一般命令の実行では、ライブラリ呼出命令以外の全ての命令コードの実行を行う。
上記ライブラリ呼出判定処理（ステップ２２７）でライブラリ呼出命令であると判定した場合は、ステップ２３１において上記命令の解析処理で識別した実行すべき命令コードの中から、呼び出すべきライブラリ関数のバージョン番号を検出するバージョン番号検出処理をライブラリのロードの直前に行う。ここで、この実施形態におけるプログラムファイル６３の形式は、図４に示す配布プログラムと同一の形式であり、その中の、ライブラリ呼出命令７１は、そのライブラリ関数バージョンフィールド７３に、呼び出すべきバージョンを保持している。上記バージョン番号検出処理では、呼び出すべきライブラリ関数のバージョン番号の検出を、このライブラリ関数バージョンフィールド７３を読むことで行う。
【００２０】
次に、ステップ２３３におけるライブラリのロードでは、上記実行系ライブラリ６７のライブラリファイル７９の中から、呼び出すべきライブラリ関数名と同じ名称を有する関数名フィールド７５を有し、かつ上記バージョン検索処理で検出したバージョン番号と同じ番号を有するバージョンフィールドを有する関数ブロック７７のコードエリア８５を読み出し、メモリ上にロードする。次に、上記ライブラリのロードを終えると、上記実行系５４は、上記ライブラリのロードの場合ではコードエリア８５からメモリ上にロードした命令コードの列、もしくは既にメモリ上に存在していた場合には、コードエリア１８からメモリ上にロードしたときに相当する命令コードの列を実行するライブラリの実行を行う（ステップ２３５）。一般命令の実行もしくはライブラリの実行を行った実行系５４は、次に、ステップ２３７において、その結果処理が終了するかどうかを判定する実行終了判定処理を行い、終了しないと判定したならば引き続く命令コードを識別して上記命令の解析（ステップ２２５）からの処理を再び行う。終了すると判定したならば、実行系５４は処理を終了する。尚、バージョンアップを例に挙げ一連の説明を行なったが、本発明はバージョンアップだけに限定されるものではなく、バージョンアップまたはバージョンダウンなどにより、開発系コンピュータと実行系コンピュータ間でのライブラリ関数のバージョンを一致させるものであることは言うまでも無い。
【００２１】
【発明の効果】
本発明は、以上説明した様に、配布プログラムにライブラリ関数のバージョン番号を付けて実行系へ配布し、インストール時に古いバージョンのライブラリ関数に追記して新しいバージョンのライブラリ関数を実行系ライブラリに書き込む様にしたので、アプリケーションプログラム開発で用いたライブラリ関数と同一のライブラリ関数を全て実行系に保持することが可能となり、アプリケーションプログラムの動作検証を行ったときと同一の条件で常にアプリケーションプログラムを動作させることが可能となる。
【図面の簡単な説明】
【図１】本発明によるライブラリ関数のバージョンアップ方法の一実施形態の手順を示す図である。
【図２】図１に示したプログラムソースを示す図である。
【図３】図１に示した開発系ライブラリの内部構造を示す図である。
【図４】図１に示した配布プログラムを示す図である。
【図５】図１に示した実行系ライブラリを示す図である。
【図６】図１に示したコンパイラの処理手順を示すフローチャートである。
【図７】図１に示したインストーラの処理手順を示すフローチャートである。
【図８】図１に示した実行系の処理手順を示すフローチャートである。
【図９】従来のライブラリ関数のバージョンアップ方式の手順を示す図である。
【図１０】図９に示したプログラムソースを示す図である。
【図１１】図９に示した開発系ライブラリの内部構造を示す図である。
【図１２】図９に示した配布プログラムを示す図である。
【図１３】図９に示した実行系ライブラリを示す図である。
【図１４】図９に示したコンパイラの処理手順を示すフローチャートである。
【図１５】図９に示したインストーラの処理手順を示すフローチャートである。
【図１６】図９に示した実行系の処理手順を示すフローチャートである。
【符号の説明】
１…ソースコード、                      ２…開発系、
３…開発系ライブラリ、                  ４…実行系、
５…コンパイラ、                        ７…配布プログラム、
９…インストーラ、                      １３…プログラムファイル、
１５…ＯＳ、                            １７…実行系ライブラリ、
１９…ライブラリ関数名、                ２１…ライブラリファイル、
２３…関数ブロック、                    ２５…関数名フィールド、
２７…バージョンフィールド、            ２９…ライブラリ参照フィールド、
３１…ライブラリ呼出命令、              ３３…ライブラリファイル、
３５…関数名フィールド、                ３７…関数ブロック、
３９…バージョンフィールド、            ４１…コードエリア、
５１…ソースコード、                    ５２…開発系、
５３…開発系ライブラリ、                ５４…実行系、
５５…コンパイラ、                      ５７…配布プログラム、
５９…インストーラ、                    ６３…実行系ライブラリ、
６５…ＯＳ、                            ６７…実行系ライブラリ、
７１…ライブラリ呼出命令、
７３…ライブラリ関数バージョンフィールド、
７５…関数名フィールド、                ７７…関数ブロック、
７９…ライブラリファイル、              ８１…バージョンフィールド、
８３…ライブラリ関数参照フィールド、    ８５…コードエリア、
１０１〜２３７…各ステップ
【図１】
0004484001.tif 000002
【図２】
0004484001.tif 000003
【図３】
0004484001.tif 000004
【図４】
0004484001.tif 000005
【図５】
0004484001.tif 000006
【図６】
0004484001.tif 000007
【図７】
0004484001.tif 000008
【図８】
0004484001.tif 000009
【図９】
0004484001.tif 000010
【図１０】
0004484001.tif 000011
【図１１】
0004484001.tif 000012
【図１２】
0004484001.tif 000013
【図１３】
0004484001.tif 000014
【図１４】
0004484001.tif 000015
【図１５】
0004484001.tif 000016
【図１６】
0004484001.tif 000017