(57)【要約】【課題】リンカを効率よく行い、リンカの処理時間を短縮させて開発の作業効率を上げることができる、リンカプログラム、情報記憶媒体、リンカ装置を提供する。【解決手段】実行初回時において各オブジェクトに対応づけて、プログラムの修正に伴う緩衝用の隙間領域を設けてアドレスを決定する処理を行う。そして、修正されたプログラムのオブジェクトを含む複数のオブジェクトをリンクさせる際には、修正されたオブジェクトのみに対して、修正前のプログラムのオブジェクトが占める領域と隙間領域とからなるアドレス範囲内にアドレスを決定して実行ファイルを生成する。【選択図】図３
2008250787.tif 000002
【特許請求の範囲】
【請求項１】
複数のプログラムをコンパイルして生成された複数のオブジェクトを結合することによって実行ファイルを生成するリンカプログラムであって、
前記実行ファイルがロードされるメモリ上で、オブジェクトが占める領域と空き領域となる隙間領域とが交互に配置されるように、前記複数のオブジェクトのアドレスを決定する処理を行うアドレス決定部として、コンピュータを機能させ、
前記アドレス決定部が、
修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する際には、当該プログラムに対する修正前のプログラムをコンパイルして生成されたオブジェクトが占める領域と、当該領域に隣接する隙間領域とからなるアドレス範囲を使用して、当該修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する処理を行うことを特徴とするリンカプログラム。
【請求項２】
請求項１において、
オブジェクトに対応づけられたアドレスを使用して、当該オブジェクトを呼び出す他のオブジェクトを、オブジェクト毎に記憶部に登録するアドレス登録部と、
してコンピュータを更に機能させ、
前記アドレス決定部が、
前記修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定した際には、前記他のオブジェクトにおいて、前記修正前のプログラムをコンパイルして生成されたオブジェクトを呼び出すためのアドレスを、前記修正されたプログラムをコンパイルして生成されたオブジェクトに対応づけられたアドレスに変更する処理を行い、
前記アドレス登録部が、
記憶部に登録されている前記修正前のプログラムをコンパイルして生成されたオブジェクトを呼び出すためのアドレスを、前記修正されたプログラムをコンパイルして生成されたオブジェクトに対応づけられたアドレスに変更する処理を行うことを特徴とするリンカプログラム。
【請求項３】
請求項１又は２において、
前記アドレス決定部が、
前記修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを前記アドレス範囲内で決定できるか否かを判断し、
前記修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを前記アドレス範囲内に決定できないと判断された場合には、当該オブジェクト用の隙間領域が確保されるように当該オブジェクトのアドレスを決定すると共に、前記修正前の前記プログラムをコンパイルして生成されたオブジェクトが占める領域よりも先頭アドレス側又は最終アドレス側に配置されているオブジェクトのアドレスをシフトすることを特徴とするプログラム。
【請求項４】
請求項１〜３のいずれかにおいて、
前記各オブジェクトのサイズに応じて、前記隙間領域を動的に設定する処理を行う隙間領域設定部として、コンピュータを更に機能させることを特徴とするプログラム。
【請求項５】
請求項１〜３のいずれかにおいて、
操作者の操作入力情報に基づいて、前記隙間領域を設定する処理を行う隙間領域設定部として、コンピュータを更に機能させることを特徴とするプログラム。
【請求項６】
複数のプログラムをコンパイルして生成された複数のオブジェクトを結合することによって実行ファイルを生成するリンカプログラムであって、
操作者の操作入力情報に基づいて、第１のモードと第２のモードとの間で、モードを切り替える処理を行うモード設定部と、
前記第１のモードでは、前記実行ファイルがロードされるメモリ上で、オブジェクトが占める領域と空き領域となる隙間領域とが交互に配置されるように、前記複数のオブジェクトのアドレスを決定する処理を行い、修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する際には、当該プログラムに対する修正前のプログラムをコンパイルして生成されたオブジェクトが占める領域と、当該領域に隣接する隙間領域とからなるアドレス範囲を使用して、当該修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する処理を行い、前記第２のモードでは、前記メモリ上で、前記各オブジェクトが占める領域の間に隙間領域が生じないように、前記複数のオブジェクトのアドレスを決定する処理を行うアドレス決定部として、コンピュータを機能させることを特徴とするリンカプログラム。
【請求項７】
コンピュータ読み取り可能な情報記憶媒体であって、請求項１〜６のいずれかのリンカプログラムを記憶したことを特徴とする情報記憶媒体。
【請求項８】
複数のプログラムをコンパイルして生成された複数のオブジェクトを結合することによって実行ファイルを生成するリンカ装置であって、
前記実行ファイルがロードされるメモリ上で、オブジェクトが占める領域と空き領域となる隙間領域とが交互に配置されるように、前記複数のオブジェクトのアドレスを決定する処理を行うアドレス決定部と、
を含み、
前記アドレス決定部が、
修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する際には、当該プログラムに対する修正前のプログラムをコンパイルして生成されたオブジェクトが占める領域と、当該領域に隣接する隙間領域とからなるアドレス範囲を使用して、当該修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する処理を行うことを特徴とするリンカ装置。
【請求項９】
複数のプログラムをコンパイルして生成された複数のオブジェクトを結合することによって実行ファイルを生成するリンカ装置であって、
操作者の操作入力情報に基づいて、第１のモードと第２のモードとの間で、モードを切り替える処理を行うモード設定部と、
前記第１のモードでは、前記実行ファイルがロードされるメモリ上で、オブジェクトが占める領域と空き領域となる隙間領域とが交互に配置されるように、前記複数のオブジェクトのアドレスを決定する処理を行い、修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する際には、当該プログラムに対する修正前のプログラムをコンパイルして生成されたオブジェクトが占める領域と、当該領域に隣接する隙間領域とからなるアドレス範囲を使用して、当該修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する処理を行い、前記第２のモードでは、前記メモリ上で、前記各オブジェクトが占める領域の間に隙間領域が生じないように、前記複数のオブジェクトのアドレスを決定する処理を行うアドレス決定部と、
を含むことを特徴とするリンカ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、リンカプログラム、情報記憶媒体、リンカ装置に関する。
【背景技術】
【０００２】
近年のシステム開発では、プログラムの規模が大きくなり、プログラムの作成、コンパイル、リンカに時間を要してしまい開発効率を著しく悪化させてしまうことがある。
【０００３】
しかし、コンパイルに要する時間は、修正されたプログラムのみを対象とすれば処理時間を節約できる。また、コンパイルする対象のプログラムが増加してもマルチタスク（並列）処理を行うことができるのでコンパイル処理の時間を削減することができる。
【０００４】
一方、リンカは、コンパイルされた全てのオブジェクトファイル（中間ファイル）をリンク（結合）させると共に、メモリにロードされるときのメモリ空間の配置を決定し、メモリ上のアドレスを仮決定する処理が行われるのでシングルタスクによる処理になる。従って、一部のプログラムの修正に伴い、リンカは全てをリンクさせてアドレスを再決定しなければならないので、リンカに要する時間を削減することは難しい。
【０００５】
そこで、従来からリンカに要する処理時間を節約する手法がある（特許文献１、２）。しかし、特許文献１、２は、メモリ空間における修正モジュールの配置に無駄があり、修正されたモジュールは再リンクを必要とするものであるのでリンカ処理に時間を要するものであった。
【特許文献１】特開昭６２−２９０９４５号公報
【特許文献２】特開平７−４４３７０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
本発明は、以上のような課題に鑑みたものであり、その目的とするところは、リンカを効率よく行い、リンカの処理時間を短縮させて開発の作業効率を上げることができる、リンカプログラム、情報記憶媒体、リンカ装置を提供することにある。
【課題を解決するための手段】
【０００７】
（１）本発明は、
複数のプログラムをコンパイルして生成された複数のオブジェクトを結合することによって実行ファイルを生成するリンカ装置であって、
前記実行ファイルがロードされるメモリ上で、オブジェクトが占める領域と空き領域となる隙間領域とが交互に配置されるように、前記複数のオブジェクトのアドレスを決定する処理を行うアドレス決定部と、
を含み、
前記アドレス決定部が、
修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する際には、当該プログラムに対する修正前のプログラムをコンパイルして生成されたオブジェクトが占める領域と、当該領域に隣接する隙間領域とからなるアドレス範囲を使用して、当該修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する処理を行うことを特徴とするリンカ装置に関係する。
【０００８】
また本発明は、上記各部としてリンカ装置を機能させるリンカプログラムに関係する。また本発明は、リンカ装置で読み取り可能な情報記憶媒体であって、上記各部としてリンカ装置を機能させるプログラムを記憶（記録）した情報記憶媒体に関係する。
【０００９】
本発明の「オブジェクトが占める領域に隣接する隙間領域」とは、オブジェクトが占める領域に対して、先頭アドレス側に隣接する隙間領域及び最終アドレス側に隣接する隙間領域の少なくとも一方の隙間領域をいう。
【００１０】
本発明によれば、修正されたプログラムをコンパイルして生成されたオブジェクト（以下、「修正後のオブジェクト」という。）のアドレスを決定する際には、当該プログラムに対する修正前のプログラムをコンパイルして生成されたオブジェクト（以下、「修正前のオブジェクト」という。）が占める領域と、当該領域に隣接する隙間領域とからなるアドレス範囲を使用して、修正後のオブジェクトのアドレスを決定する処理を行うので、修正後のオブジェクトのみに対してアドレスを決定すればよい。したがって、従来のリンカプログラムに比べて、処理量が少なく格段に早く実行ファイルを生成することができる。つまり、修正後のオブジェクト以外の他のオブジェクトのアドレスを決定する必要はないので、処理量を抑えることができる。
【００１１】
特に、修正後のオブジェクトが、修正前のオブジェクトのアドレス範囲を超えた場合には、修正前のオブジェクトが占める領域に隣接する隙間領域とからなるアドレス範囲内であれば、修正後のオブジェクトのアドレスのみを変更すればよいので処理量を抑えることができる。
【００１２】
（２）また本発明のリンカ装置、リンカプログラム及び情報記憶媒体では、
オブジェクトに対応づけられたアドレスを使用して、当該オブジェクトを呼び出す他のオブジェクトを、オブジェクト毎に記憶部に登録するアドレス登録部と、
を含み、
前記アドレス決定部が、
前記修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定した際には、前記他のオブジェクトにおいて、前記修正前のプログラムをコンパイルして生成されたオブジェクトを呼び出すためのアドレスを、前記修正されたプログラムをコンパイルして生成されたオブジェクトに対応づけられたアドレスに変更する処理を行い、
前記アドレス登録部が、
記憶部に登録されている前記修正前のプログラムをコンパイルして生成されたオブジェクトを呼び出すためのアドレスを、前記修正されたプログラムをコンパイルして生成されたオブジェクトに対応づけられたアドレスに変更する処理を行うようにしてもよい。
【００１３】
本発明によれば、修正後のオブジェクトのアドレスを決定した際には、当該オブジェクトを呼び出す他のオブジェクトにおいて、修正前のオブジェクトを呼び出すためのアドレスから、修正後のオブジェクトに対応付けられたアドレスに変更する処理を行うので、修正後のオブジェクトのアドレスを決定すると共に、修正後のオブジェクトを呼び出す他のオブジェクトに対して、修正後のオブジェクトを呼び出すための呼び出しアドレスを書き換える処理を行うことができる。したがって、アドレス変更に伴う必要最小限の処理で実行ファイルを生成することができる。また、本発明によれば、修正後のオブジェクトは他のオブジェクトから確実に呼び出されるように、実行ファイルを生成することができる。
【００１４】
（３）また本発明のリンカ装置、リンカプログラム及び情報記憶媒体では、
前記アドレス決定部が、
前記修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを前記アドレス範囲内で決定できるか否かを判断し、
前記修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを前記アドレス範囲内に決定できないと判断された場合には、当該オブジェクト用の隙間領域が確保されるように当該オブジェクトのアドレスを決定すると共に、前記修正前の前記プログラムをコンパイルして生成されたオブジェクトが占める領域よりも先頭アドレス側又は最終アドレス側に配置されているオブジェクトのアドレスをシフトするようにしてもよい。
【００１５】
本発明によれば、修正後のオブジェクトのメモリ上に占める領域が、修正後のオブジェクトのメモリ上に占める領域と、修正後のオブジェクトのメモリ上に占める領域に隣接する隙間領域とからなる領域を上回る領域になったとしても、適切に各オブジェクトのアドレスが決定されるとともに、修正後のオブジェクト用の隙間領域を改めて確保する処理を行う。したがって、修正後のオブジェクトに対するプログラムがさらに修正されたとしても、次回のリンカ処理では処理時間を節約して実行ファイルを生成することができる。
【００１６】
（４）また本発明のリンカ装置、リンカプログラム及び情報記憶媒体では、
前記各オブジェクトのサイズに応じて、前記隙間領域を動的に設定する処理を行う隙間領域設定部を含むようにしてもよい。
【００１７】
本発明によれば、各オブジェクトのサイズに応じて隙間領域が動的に設定されるので、各プログラムの規模に応じて、隙間領域を動的に設定できる。また、動的に設定されるので手間をとらずに隙間領域を設定することができる。その結果、本発明によれば、リンカにおける処理時間をさらに節約することができる。
【００１８】
（５）また本発明のリンカ装置、リンカプログラム及び情報記憶媒体では、
操作者の操作入力情報に基づいて、前記隙間領域を設定する処理を行う隙間領域設定部を含むようにしてもよい。
【００１９】
本発明によれば、予め決められたプログラム設計に基づいて、プログラマ等の操作者が修正内容を予測して隙間領域を決定できるので、修正に伴う再リンク処理を避けることができると共にメモリの使用効率を上げることができる。
【００２０】
例えば、修正内容が大きく生じるプログラムに対するオブジェクトが占める領域に隣接する隙間領域を大きく見積もり、修正内容が殆どないと考えられるプログラムに対するオブジェクトが占める領域に隣接する隙間領域を小さく見積もることができるので、修正に伴う再リンク処理を避けると共にメモリの使用効率を上げることができる。
【００２１】
（６）また本発明は、
複数のプログラムをコンパイルして生成された複数のオブジェクトを結合することによって実行ファイルを生成するリンカ装置であって、
操作者の操作入力情報に基づいて、第１のモードと第２のモードとの間で、モードを切り替える処理を行うモード設定部と、
前記第１のモードでは、前記実行ファイルがロードされるメモリ上で、オブジェクトが占める領域と空き領域となる隙間領域とが交互に配置されるように、前記複数のオブジェクトのアドレスを決定する処理を行い、修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する際には、当該プログラムに対する修正前のプログラムをコンパイルして生成されたオブジェクトが占める領域と、当該領域に隣接する隙間領域とからなるアドレス範囲を使用して、当該修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する処理を行い、前記第２のモードでは、前記メモリ上で、前記各オブジェクトが占める領域の間に隙間領域が生じないように、前記複数のオブジェクトのアドレスを決定する処理を行うアドレス決定部と、
を含むことを特徴とするリンカ装置に関する。
【００２２】
また本発明は、上記各部としてリンカ装置を機能させるリンカプログラムに関係する。また本発明は、リンカ装置で読み取り可能な情報記憶媒体であって、上記各部としてリンカ装置を機能させるプログラムを記憶（記録）した情報記憶媒体に関係する。
【００２３】
本発明によれば、操作者の操作入力情報に基づいて、第１のモード又は第２のモードを切り替えて実行ファイルを生成することができる。したがって、例えば、第１のモードが複数のプログラムの動作検証を行うモードであり、第２のモードが製品化を行うモードである場合には、第１のモードでは、修正されたプログラムをコンパイルして生成されたオブジェクトのみに対してアドレスを決定することができ、リンカによる処理時間を節約することができる。一方、第２のモードでは、隙間領域が生じないように複数のオブジェクトのアドレスを決定する処理を行うので、メモリ使用効率のよい実行ファイルが生成される。つまり、修正プログラムを含む複数のプログラムの動作検証を行う場合には、リンカに要する時間を節約させて開発作業を進めることができる実行ファイルを生成することができ、製品化を行う場合には、製品として出荷できるようなメモリ使用効率のよい実行ファイルを生成することができる。
【発明を実施するための最良の形態】
【００２４】
以下、本実施形態について説明する。なお、以下に説明する本実施形態は、特許請求の範囲に記載された本発明の内容を不当に限定するものではない。また本実施形態で説明される構成の全てが、本発明の必須構成要件であるとは限らない。
【００２５】
１．構成
図１に本実施形態のリンカ装置の機能ブロック図の例を示す。なお本実施形態のリンカ装置は図１の構成要素（各部）の一部を省略した構成としてもよい。
【００２６】
操作部１６０は、操作者の操作データを入力するためのものであり、その機能は、マウス、キーボード、ボタン、マイク、タッチパネル型ディスプレイなどにより実現できる。特に、本実施形態では、プログラムをコンパイルすることによって生成されたオブジェクトの隙間領域のデータを、操作者が操作部１６０を用いて入力することができる。
【００２７】
記憶部１７０は、処理部１００や通信部１９６などのワーク領域となるもので、その機能はＲＡＭ（ＶＲＡＭ）などにより実現できる。特に、本実施形態の記憶部１７０は、データベース１７４にアドレステーブル１７４ａを設定する。アドレステーブル１７４ａには、複数のオブジェクトのアドレスに対応づけて、当該オブジェクトを呼び出す他のオブジェクトが登録される。
【００２８】
情報記憶媒体１８０（コンピュータにより読み取り可能な媒体）は、プログラムやデータなどを格納するものであり、その機能は、メモリカード、光ディスク（ＣＤ、ＤＶＤ）、光磁気ディスク（ＭＯ）、磁気ディスク、ハードディスク、磁気テープ、或いはメモリ（ＲＯＭ）などにより実現できる。処理部１００は、情報記憶媒体１８０に格納されるプログラム（データ）に基づいて本実施形態の種々の処理を行う。即ち情報記憶媒体１８０には、本実施形態の各部としてコンピュータを機能させるためのプログラム（各部の処理をコンピュータに実行させるためのプログラム）が記憶される。
【００２９】
表示部１９０は、本実施形態により操作者が操作入力を行うための画像を出力するものであり、その機能は、ＣＲＴ、ＬＣＤ、タッチパネル型ディスプレイ、或いはＨＭＤ（ヘッドマウントディスプレイ）などにより実現できる。
【００３０】
なお本実施形態の各部としてコンピュータを機能させるためのプログラム（データ）は、サーバからネットワーク及び通信部１９６を介して本実施形態のリンカ装置の記憶部１７０に配信してもよい。また、本実施形態のプログラムファイル（ソースファイル）、オブジェクトファイルをサーバや他の装置（コンピュータ）からネットワーク及び通信部１９６を介して、本実施形態のリンカ装置の記憶部１７０に配信してもよい。
【００３１】
処理部１００（プロセッサ）は、操作部１６０からの操作データやプログラムなどに基づいて、リンカプログラムを実行する処理を行う。また、処理部１００は、コンパイラやローダーの処理を有していてもよい。ここで、コンパイラとは、ソースファイル（プログラムファイル）を、字句解析、最適化処理を行い機械語で記載されたオブジェクトファイル（中間ファイル）に変換する処理を行う。ローダーとは、リンカによって生成された実行ファイルをＣＰＵが実行できるようにメモリに読み込む処理を行う。
【００３２】
例えば、コンパイラは、複数のプログラムファイルを分割して並列にコンパイルすることができる。また、ローダーは、リンカによって仮決定されたアドレスをそのまま実メモリ上のアドレスとして確定する処理を行うことができる。なお、ローダーは、リンカによって仮決定されたアドレスを変更して実メモリ上のアドレスを確定する処理を行ってもよい。例えば、ＤＬＬ（ダイナミックリンクライブラリ）のアドレスと、リンカによって生成された実行ファイルのアドレスとが重複する場合には、重複を回避するように、リンカで仮決定したアドレス、または、ＤＬＬのアドレスを変更してアドレスを確定する処理を行ってもよい。
【００３３】
なお、処理部１００は、複数のオブジェクトを結合する処理を行う。つまり、複数のプログラムそれぞれをコンパイルすることによって、生成された複数のオブジェクトの機械語を結合し、コンピュータに実行可能な実行ファイルを生成する処理を行うことができる。
【００３４】
また、処理部１００は記憶部１７０内の主記憶部１７２をワーク領域として各種処理を行う。処理部１００の機能は各種プロセッサ（ＣＰＵ、ＤＳＰ等）、ＡＳＩＣ（ゲートアレイ等）などのハードウェアや、プログラムにより実現できる。
【００３５】
処理部１００は、アドレス決定部１１０、アドレス登録部１１２、隙間領域設定部１１４、モード設定部１１６を含む。なおこれらの一部を省略する構成としてもよい。
【００３６】
本実施形態のアドレス決定部１１０は、実行ファイルがロードされるメモリ上で、オブジェクトが占める領域と空き領域となる隙間領域とが交互に配置されるように、前記複数のオブジェクトのアドレスを決定する処理を行う。なお、本実施形態のアドレス決定部は、複数のオブジェクトを結合した後にアドレスを決定して、実行ファイルを生成してもよいし、複数のオブジェクトを結合しながらアドレスを決定して実行ファイルを生成してもよい。
【００３７】
特に、本実施形態のアドレス決定部１１０は、修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する際には、当該プログラムに対する修正前のプログラムをコンパイルして生成されたオブジェクトが占める領域と、当該領域に隣接する隙間領域とからなるアドレス範囲を使用して、当該修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する処理を行う。
【００３８】
また本実施形態のアドレス決定部１１０は、メモリ上で空き領域となる隙間領域は、各オブジェクト用に設定するようにしてもよい。そして、修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する際には、当該プログラムに対する修正前のプログラムをコンパイルして生成されたオブジェクトが占める領域と、当該領域に隣接する当該オブジェクト用の隙間領域とからなるアドレス範囲を使用して、当該修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する処理を行うようにしてもよい。
【００３９】
また、本実施形態のアドレス決定部１１０は、修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定した際には、他のオブジェクトにおいて、前記修正前のプログラムをコンパイルして生成されたオブジェクトを呼び出すためのアドレスを、前記修正されたプログラムをコンパイルして生成されたオブジェクトに対応づけられたアドレスに変更してもよい。
【００４０】
また、本実施形態のアドレス決定部１１０は、修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを前記アドレス範囲内で決定できるか否かを判断し、修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを前記アドレス範囲内に決定できないと判断された場合には、当該オブジェクト用の隙間領域が確保されるように当該オブジェクトのアドレスを決定すると共に、前記修正前の前記プログラムをコンパイルして生成されたオブジェクトが占める領域よりも先頭アドレス側又は最終アドレス側に配置されているオブジェクトのアドレスをシフトしてもよい。
【００４１】
なお、本実施形態のアドレス決定部１１０は、実行ファイルがロードされるメモリ上で、前記各オブジェクト間において空き領域となる隙間領域が生じないように、複数のオブジェクトのアドレスを決定する処理を行うようにしてもよい。
【００４２】
なお、本実施形態のアドレス決定部１１０は、後述するモード設定部１１６において、切り替えられたモードによってアドレスを決定してもよい。具体的に説明すると、第１のモードでは、実行ファイルがロードされるメモリ上で、オブジェクトが占める領域と空き領域となる隙間領域とが交互に配置されるように、前記複数のオブジェクトのアドレスを決定する処理を行い、修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する際には、当該プログラムに対する修正前のプログラムをコンパイルして生成されたオブジェクトが占める領域と、当該領域に隣接する隙間領域とからなるアドレス範囲を使用して、当該修正されたプログラムをコンパイルして生成されたオブジェクトのアドレスを決定する処理を行い、前記第２のモードでは、前記メモリ上で、前記各オブジェクトが占める領域の間に隙間領域が生じないように、前記複数のオブジェクトのアドレスを決定する処理を行うようにしてもよい。
【００４３】
本実施形態のアドレス登録部１１２は、オブジェクトに対応づけられたアドレスを使用して、当該オブジェクトを呼び出す他のオブジェクトを、オブジェクト毎に記憶部に登録するようにしてもよい。特に本実施形態のアドレス登録部１１２は、記憶部に登録されている修正前のプログラムをコンパイルして生成されたオブジェクトを呼び出すためのアドレスを、当該プログラムに対する修正されたプログラムをコンパイルして生成されたオブジェクトに対応づけられたアドレスに変更する処理を行うようにしてもよい。特に本実施形態のアドレス登録部１１２は、記憶部のデータベース１７４のアドレステーブル１７４ａに、複数のオブジェクトのアドレスに対応づけて、当該オブジェクトを呼び出す他のオブジェクトの登録・更新・削除の処理を行うことができる。なお、アドレス登録部１１２は、テーブル形式においてデータを格納せずに、ファイル形式でデータを格納してもよい。
【００４４】
本実施形態の隙間領域設定部１１４は、各オブジェクトのサイズに応じて、隙間領域を動的に設定する処理を行う。また、本実施形態の隙間領域設定部１１４は、操作者の操作入力情報に基づいて、隙間領域を設定する処理を行う。
【００４５】
本実施形態のモード設定部１１６は、操作者の操作入力情報に基づいて、第１のモードと第２のモードとの間で、モードを切り替える処理を行う。例えば、複数のプログラムの動作検証を行うモードを第１のモードとして、製品化を行うモードを第２のモードとして設定し、第１のモードと第２のモードの間で、モードを切り替える処理を行ってもよい。
【００４６】
２．本実施形態の手法
２．１  リンカの役割
本実施形態のリンカプログラムは、従来のリンカよりも、処理時間を削減することができるものである。まず、開発工程におけるリンカについて、図２を用いて説明する。
【００４７】
図２に示すように、通常、プログラムを開発する工程において、処理内容に応じた複数のモジュールに分けてプログラムが作成され、コンパイル、リンカの処理を経て、最終的にコンピュータのＣＰＵで実行される実行ファイルが生成される。
【００４８】
例えば、プログラムＰＡ〜ＰＤが生成され、コンパイルによってオブジェクトＯＡ〜ＯＤが生成される。ここで、コンパイルは、プログラムファイルに記載されたプログラムコードを分析し字句解析や最適化処理を行い、コンピュータに読み取り可能な機械語に変換する処理を行い、最終的にオブジェクトファイルを生成するものである。
【００４９】
そして、オブジェクトＯＡ〜ＯＤが生成された後に、リンカが行われる。オブジェクトは、プログラムを機械語に変換したにすぎず、各オブジェクトのリンク（結合）がなされておらず、メモリにロードされたときのアドレスも決定されていない。
【００５０】
したがって、リンカによって、複数のオブジェクトが結合されると共に、アドレスが決定され初めて実行ファイルが生成される。またリンカでは、必要に応じたライブラリＬＩＢも結合されアドレスが決定される場合もある。なお、アドレスの決定は、実メモリ上のアドレスではなく、あくまで仮アドレスであり、実アドレスの確定は、ローダーによって決定される。
【００５１】
このようにリンカを経て実行ファイルＥＸＥが生成される。そして、実行ファイルは、コマンド等の実行に基づいて、ローダーによってコンピュータのメモリにロードされて、コンピュータのＣＰＵによって実行される。なお、実行ファイルだけでなく、必要なＤＬＬ（ダイナミック・リンク・ライブラリ）もメモリ上にロードされる場合もある。
【００５２】
このような開発工程において、本実施形態では、リンカの処理時間を短縮しようとしたものである。以下、本実施形態のリンカの処理について説明する。
【００５３】
２．２  隙間領域を設けてアドレスを決定するリンカプログラムの説明
従来のリンカプログラムでは、各オブジェクトをリンクさせながら、メモリの使用効率を良くするためにオブジェクト間において隙間を生じさせないようにオブジェクトのアドレスを決定して実行ファイルを生成していた。例えば、図３（Ａ）に示すように、各オブジェクト間において隙間無くアドレスを決定していた。しかし、従来のリンカプログラムでは、プログラムの一部が修正された場合には、オブジェクトに変更が生じてしまい、実行ファイルのアドレスを再決定しなければならないので、全てのオブジェクトを再リンクさせてアドレスを決定していた。
【００５４】
一方、本実施形態のリンカプログラムは、実行初回時において各オブジェクト間において、プログラムの修正に伴う緩衝用の隙間領域を設けてアドレスを決定する処理を行う。そして、修正されたプログラムのオブジェクトを含む複数のオブジェクトをリンクさせる際には、修正されたオブジェクトのみに対して、修正前のプログラムのオブジェクトと隙間領域とからなるアドレス範囲内にアドレスを決定して実行ファイルを生成する。
【００５５】
つまり、一部のプログラムが修正されたとしても、全てのオブジェクトに対して結合させてアドレスを決定する再リンクの処理を行う必要はない。その結果、本実施形態のリンカプログラムは、従来のリンカプログラムに要する処理時間よりも格段に処理時間を圧縮できる。
【００５６】
図３（Ｂ）を用いて説明すると、リンカプログラムの実行の初回時において各オブジェクトＯＡ〜ＯＤをリンクさせながら、メモリ上に緩衝用の隙間領域ＳＡ〜ＳＤを生じさせるようにアドレスを決定する。このようにすれば、プログラムの一部が修正されオブジェクトＯＢに変更があっても、修正前のオブジェクトＯＢと隙間領域ＳＢに収まる範囲において、修正後のオブジェクトＯＢのみのアドレス修正のみで処理を終了させることができる。つまり、修正のないオブジェクトＯＡ、ＯＣ、ＯＤをリンクさせて、アドレスを変更するという処理を避けることができる。
【００５７】
なお、修正前のオブジェクトの開始アドレスから修正されたオブジェクトを配置するようにアドレスを決定することが望ましい。隙間領域をオブジェクトに対して後ろのアドレスに設定する方がアドレスの決定を容易に行うことができるからである。
【００５８】
また、修正前のオブジェクトＯＢが占有するアドレス範囲と、オブジェクトＯＢの隙間領域ＳＢのアドレス範囲とからなるアドレス範囲において、修正後のオブジェクトＯＢのアドレス範囲に応じて、隙間領域ＳＢを拡大・縮小するようにしてもよい。他のオブジェクト（例えば、ＯＡ、ＯＣ、ＯＤ）に対するアドレス変更の必要性が生じないからである。
【００５９】
また、修正前のオブジェクトＯＢが占有するアドレス範囲と、オブジェクトＯＡの隙間領域ＳＡ及びオブジェクトＯＢの隙間領域ＳＢの少なくとも一方を含むアドレス範囲と、からなるアドレス範囲内において、修正後のオブジェクトＯＢのアドレスを決定してもよい。例えば、修正後のオブジェクトＯＢのアドレスを、修正前のオブジェクトＯＢが占有するアドレス範囲と隙間領域ＳＢのアドレス範囲とを含むアドレス範囲を超えて、決定しなければならない場合には、隙間領域ＳＡのアドレス範囲を使用して、修正後のオブジェクトＯＢのアドレスを決定してもよい。このようにすれば、後述するように、オブジェクトＯＢ以外のオブジェクト（例えば、ＯＡ、ＯＣ、ＯＤ）のアドレスを変更する必要がなくなり、リンカプログラムの処理負荷を抑えることができる。
【００６０】
さて、修正されたオブジェクトのアドレスが変更される場合があるが、その場合にアドレスが変更されるオブジェクトの命令（命令１）を呼び出す他のオブジェクトの命令（命令２）が存在する場合には、呼び出し元の命令（命令２）において、呼び出し先となる命令（命令１）のアドレスを書き換える必要がある。したがって、本実施形態のリンカプログラムでは、修正オブジェクトだけでなく、修正オブジェクトの命令を呼び出す他のオブジェクトにおいて呼び出しアドレスを変更する処理を行う。
【００６１】
具体的に説明すると、本実施形態のリンカプログラムを初めて実行する際に、図４（Ａ）に示すように、各オブジェクトＯＡ〜ＯＤそれぞれをリンクさせて（結合させて）、隙間領域ＳＡ〜ＳＤを設けながらアドレスが決定される。そして、例えば、オブジェクトＯＢでは、アドレス「４１０」番地に命令ｆ１が決定され、アドレス「４８０」番地に命令ｆ２が決定され、オブジェクトＯＣではアドレス「６６０」番地に、命令ｆ３が決定される。また、本実施形態のリンカプログラムの実行初回時には、各オブジェクトの命令に、当該オブジェクトの命令が他のどのオブジェクトに呼び出されているのかをデータベースのアドレステーブルに登録する処理を行う。
【００６２】
図５（Ａ）（Ｂ）は、アドレステーブルの例を示す。本実施形態のリンカプログラムは、例えば、オブジェクトＯＢは、オブジェクト名「ＯＢ」と、当該オブジェクトＯＢの命令「ｆ１」と、命令ｆ１を呼び出す（参照する）オブジェクト名「ＯＡ」と、命令ｆ１のアドレス「４１０」とを、それぞれ対応づけて登録する。
【００６３】
同様に、オブジェクト名「ＯＢ」と、オブジェクトＯＢの命令「ｆ２」と、命令ｆ２を参照するオブジェクト名「ＯＡ」と、命令ｆ２のアドレス「４８０」とを、それぞれ対応づけて登録する。また、オブジェクト名「ＯＣ」と、オブジェクトＯＣの命令「ｆ３」と、命令ｆ３を参照するオブジェクト名「ＯＡ」と、命令ｆ３のアドレスとを対応づけて登録する。
【００６４】
そして、例えば、オブジェクトＯＢが変更された場合には、修正後のオブジェクトＯＢのアドレス範囲が、修正前のオブジェクトＯＢのアドレス範囲と隙間領域との範囲「４００〜６４９」に収まる範囲である場合には、アドレス範囲「４００〜６４９」において、修正後のオブジェクトＯＢのアドレスを決定する。例えば、図４（Ｂ）に示すように、修正後のオブジェクトＯＢは、「４００〜６３９」のアドレス範囲に設定され、例えば、命令ｆ１はアドレス「４１５」、命令ｆ２はアドレス「６００」に設定される。
【００６５】
このように本実施形態では、修正されたプログラムをコンパイルし、コンパイルされたオブジェクト（修正オブジェクト）に対してアドレスを決定するだけでリンク処理を終了させることができる。
【００６６】
しかし、図４（Ａ）（Ｂ）の例に示すように、修正オブジェクトＯＢ以外の他のオブジェクトであるオブジェクトＯＡが、修正オブジェクトＯＢの命令ｆ１、ｆ２を呼び出している場合には、呼び出しアドレスを変更しなければならない。オブジェクトＯＢの命令ｆ１、命令ｆ２のアドレスが変更されているので、オブジェクトＯＡにおいて間違ったアドレスを参照されることになってしまうからである。したがって、オブジェクトＯＡにおいて、命令ｆ１、命令ｆ２を呼び出す際のアドレスを変更する処理を行う。
【００６７】
例えば、図５（Ａ）のアドレステーブルを参照し、変更した対象のオブジェクトＯＢの命令ｆ１、命令ｆ２のアドレスを参照し、現在の命令ｆ１、ｆ２のアドレスと異なる場合には、命令ｆ１、命令ｆ２を呼び出す（参照する）オブジェクトＯＡの命令の呼び出しアドレスを書き換える処理を行う。
【００６８】
つまり、本実施形態のリンカプログラムでは、図５（Ａ）に示すアドレステーブルを参照して、変更対象のオブジェクトであるオブジェクトＯＢの命令ごとにアドレスの変更を確認し、変更されている場合には、当該命令を呼び出すオブジェクトＯＡの命令ｆ１、命令ｆ２を呼び出す命令において呼び出しアドレスを変更する処理を行う。
【００６９】
例えば、図４（Ｂ）に示すように、命令ｆ１のアドレスが「４１５」に変更され、命令ｆ２のアドレスが「６００」に変更された場合には、オブジェクトＯＡにおいて、命令ｆ１を呼び出すアドレスを、「４１０」から「４１５」に変更し、命令ｆ２を呼び出すアドレスを、「４８０」から「６００」に変更する処理を行う。
【００７０】
より具体的に説明すると、オブジェクトＯＡの「ｆ１のアドレス４１０にジャンプする」とする命令を「ｆ１のアドレス４１５にジャンプする」とする命令に書き換える処理を行い、オブジェクトＯＡの「ｆ２のアドレス４８０にジャンプする」とする命令を「ｆ１のアドレス６００にジャンプする」とする命令に書き換える処理を行う。このようにすれば、オブジェクトＯＡが、確実にｆ１、ｆ２を呼び出すことができる。
【００７１】
なお、呼び出したオブジェクト（例えばオブジェクトＯＡ）に対して呼び出しアドレスを変更した後は、修正オブジェクトＯＢの変更されたアドレスにアドレステーブルを書き換える処理を行う。つまり、図５（Ｂ）に示すように、オブジェクトＯＢの命令ｆ１のアドレスを「４１０」から「４１５」へ書き換え、命令ｆ２のアドレスを「４８０」から「６００」へ書き換える処理を行う。
【００７２】
さて、本実施形態のリンカプログラムは、各オブジェクトに対応して、隙間領域を持たせるように、アドレスを決定するが、プログラムの修正によって、プログラムコードが膨大になり、コンパイルされるオブジェクトも膨大になる場合には、隙間領域を上回りアドレスを変更しなければならない場合が生じる。
【００７３】
そこで、本実施形態では、修正されたオブジェクトが、当該オブジェクトの隙間領域を超えてアドレスを変更しなければならない場合には、改めて隙間領域を確保するために、修正されたオブジェクトに新たに隙間領域を生じさせるようにして当該オブジェクトのアドレスを確定する処理を行うと共に、その修正されたオブジェクトの後に続くオブジェクトのアドレスを順次ずらす処理を行う。
【００７４】
図６を用いて説明すると、まず、本実施形態のリンカプログラムは初回時に図６（Ａ）に示すのように、オブジェクトＯＡ〜ＯＤに対応づけて、隙間領域ＳＡ〜ＳＤを配置するようにアドレスを決定する処理を行う。
【００７５】
そして、例えば、図６（Ｂ）（Ｃ）に示すように、修正されたオブジェクトＯＢが、隙間領域ＳＢを超えてないで変更される場合には、オブジェクトＯＢと隙間領域ＳＢからなるアドレスの範囲において、オブジェクトＯＢのアドレスを変更する処理を行う。したがって、オブジェクトＯＢ以降に続くオブジェクトＯＣ、オブジェクトＯＤに対しては、結合してアドレスを決定する再リンク処理を必要としない。
【００７６】
しかし、例えば、図６（Ｄ）に示すように、修正されたオブジェクトＯＢが、隙間領域ＳＢを超えて変更を伴う場合には、オブジェクトＯＢ用に新たに隙間領域ＳＢ´を設け、さらに、隙間領域ＳＢ´の後に続くオブジェクトのアドレスを、オブジェクトＯＢと新たな隙間領域ＳＢ´から、元のオブジェクトＯＢと隙間領域ＳＢを減算した分だけずらす処理が行われる。
【００７７】
もちろん、プログラムの修正を予想して、修正されたオブジェクトＯＢが、隙間領域を超えないように、リンカ初回時に隙間領域を十分確保できることが望ましい。しかし、プログラムの修正次第で、隙間領域を超えてオブジェクトのアドレスを変更しなければならない場合もある。したがって、本実施形態のリンカプログラムでは、修正オブジェクトＯＢの隙間領域ＳＢ´を設けるとともに、修正オブジェクトＯＢ以後のオブジェクトをずらす処理を行う。したがって、他のオブジェクトに対して結合してアドレスを決定する再リンク処理を伴うものであるが、隙間領域を生じさせることによって、次回のリンカに要する時間を節約できるので、結果として開発作業の効率を図ることができる。
【００７８】
なお、例えば、図７（Ａ）に示すように、ずらし領域Ｓを設けて、図７（Ｂ）に示すように、アドレスの先頭方向にずらすようにしてもよい。
【００７９】
また、本実施形態のリンカプログラムでは、各オブジェクトをメモリアドレスの先頭から順に配置し、オブジェクトが隙間領域を超えてアドレス変更を行う場合には、最終アドレスの方向にずらす例を説明した。しかし、オブジェクトを、メモリアドレスの最後の方から順に配置するようにしてもよい。例えば、図８に示すように、メモリの最終アドレスから、オブジェクトとそのオブジェクトの隙間領域を確保してアドレスを順に決定してもよい。そして、オブジェクトが隙間領域を超えてアドレス変更を行う場合には、ずらす方向を、最終アドレスの方ではなく、先頭アドレス方にずらすように結合してアドレスを決定する再リンク処理を行うようにする。
【００８０】
次に、図９（Ａ）（Ｂ）（Ｃ）を用いて、本実施形態のリンカプログラムが、初回実行時において、メモリ空間上にオブジェクトそれぞれに対応づけて隙間領域を設ける場合について説明する。
【００８１】
本実施形態では、例えばリンカプログラムの初回時の実行において、隙間領域の大きさを動的に決定することができる。例えば、図９（Ａ）に示すように、オブジェクトＯＡ〜ＯＤそれぞれに対応する隙間領域は一定の領域とするように予め決めてもよいし、図９（Ｂ）に示すように、オブジェクトＯＡ〜ＯＤの大きさに応じて動的に隙間領域を決定するようにしてもよい。例えば、オブジェクトの大きさに所与の割合を乗じた大きさとして隙間領域を確保してもよい。例えば、図９（Ｂ）では、オブジェクトの大きさに３割を乗じた大きさを当該オブジェクトの隙間領域として確保する例を示す。
【００８２】
なお、オブジェクトに対してさらに、図９（Ｃ）に示すように、ＧＵＩ（グラフィカルユーザインターフェース）によって、操作者の操作入力に基づいて、隙間領域を確保するようにしてもよい。このようにすれば、設計段階で予定されるプログラムの容量に応じた無駄のない隙間領域を確保することができ、上述したように、修正オブジェクトの容量の変化によって、再度隙間領域を設けて、修正オブジェクト以後のオブジェクトに結合してアドレスを決定する再リンク処理を行うという処理負担を回避することができる。
【００８３】
２．３  本実施形態のリンカプログラムを使用する開発手法
本実施形態のリンカプログラムは、初回時に実行する際を除いて、リンカに要する時間を大幅に圧縮できる。したがって、システム開発の特にテスト工程において、修正やテストを何度も繰り返す場合には、本実施形態のリンカプログラムを使用することで効率よく開発作業を進めることができる。そして最終的に製品として実行ファイルを出荷する場合には、従来のリンカプログラムを使用して、メモリ使用効率のよい実行ファイルを生成するようにすればよい。
【００８４】
つまり、従来のリンカプログラムは、本実施形態のリンカプログラムに比べて、メモリに隙間を生じさせないように、各オブジェクトをリンク処理が行われる。したがって、従来のリンカプログラムはリンカ処理に時間を要し開発作業に不向きではあるが、開発作業を終了した段階においては、メモリの使用効率を重視しているので、製品用の実行ファイルを生成する際には従来のリンカプログラムを使用する方が望ましい。
【００８５】
以上のように、開発作業においては、隙間領域を確保するリンカプログラムを利用して実行ファイルを生成し、開発作業を終えた段階では、隙間領域を確保しない、従来のリンカプログラムを利用して実行ファイルを生成する手法を採用することで、従来にはない、開発作業が効率よく短時間で終了させることができ、さらに、最終的にはメモリ使用効率のよい実行ファイルを生成することができる。
【００８６】
３．本実施形態の処理
次に、本実施形態のリンカプログラムの詳細な処理例について図１０、図１１のフローチャートを用いて説明する。
【００８７】
図１０は、最初にリンカプログラムを実行する際の処理例を示したフローチャートである。まず、リンカプログラムは、各オブジェクトを結合させると共に、メモリ上に隙間ができるように各オブジェクトのアドレスを決定する処理を行う（ステップＳ１００）。具体的に説明すると、複数のオブジェクトファイルを読み込み、オブジェクトファイルに記載された各オブジェクトを結合させると共に、メモリ上に隙間領域ができるように各オブジェクトの命令のアドレスを決定する処理を行う。
【００８８】
そして、各オブジェクトに記載された命令（命令１）に対応付けて、当該命令（命令１）を呼び出す他のオブジェクトをアドレステーブルに登録する処理を行う（ステップＳ１１０）。
【００８９】
図１１のフローチャートは、修正されたプログラムをコンパイルしたオブジェクトを含む複数のオブジェクトに対してリンカ処理を行う本実施形態のリンカプログラムの処理例を示す。
【００９０】
まず、修正されたオブジェクトのサイズが修正前のオブジェクトと隙間領域とからなるサイズよりも大きいか否かを判断する（ステップＳ２００）。大きいと判断される場合には、（ステップＳ２００のＹｅｓ）、修正前のオブジェクトの開始アドレスから修正されたオブジェクトのアドレスを決定し、新たに隙間領域を確保する処理を行い（ステップＳ２１０）、修正されたオブジェクトに続いて配置されたオブジェクトのアドレスを決定する処理を行う（ステップＳ２２０）。つまり、修正されたオブジェクト及び修正されたオブジェクトの隙間領域を新たに確保したので、後に続くオブジェクトをずらすようにアドレスを書き換える処理を行う。
【００９１】
一方、修正オブジェクトのサイズが修正前のオブジェクトと隙間領域とからなるサイズよりも大きくないと判断される場合には（ステップＳ２００のＮｏ）、修正前のオブジェクトと隙間領域とからなるアドレス範囲内に、修正されたオブジェクトのアドレスを決定する処理を行う（ステップＳ２３０）。
【００９２】
そして、修正されたオブジェクトの命令を呼び出す他のオブジェクトが存在するか否かを判断する（ステップＳ２４０）。
【００９３】
そして、他のオブジェクトが存在する判断される場合には（ステップＳ２４０のＹｅｓ）、他のオブジェクトにおいて、当該命令を呼び出すアドレスを書き換える処理を行い（ステップＳ２５０）、アドレステーブルを更新する処理を行う（ステップＳ２６０）。
【００９４】
一方、他のオブジェクトが存在しないと判断される場合には（ステップＳ２４０のＮｏ）、処理を終了する。
【００９５】
なお本発明は、上記実施形態で説明したものに限らず、種々の変形実施が可能である。例えば、明細書又は図面中の記載において広義や同義な用語として引用された用語は、明細書又は図面中の他の記載においても広義や同義な用語に置き換えることができる。
【００９６】
なお、本実施形態では、リンカプログラムについて説明したが、ローダーによって実行ファイルがメモリ上にロードされる際にリンカも行うダイナミックリンカによるプログラムにおいても適用してもよい。
【図面の簡単な説明】
【００９７】
【図１】本実施形態のリンカ装置の機能ブロックの例。
【図２】リンカの説明図。
【図３】従来及び本実施形態のリンカプログラムの説明図。
【図４】従来及び本実施形態のリンカプログラムの説明図。
【図５】アドレステーブルの説明図。
【図６】本実施形態のリンカプログラムの説明図。
【図７】本実施形態のリンカプログラムの説明図。
【図８】本実施形態のリンカプログラムの説明図。
【図９】本実施形態の隙間領域の説明図。
【図１０】本実施形態の処理のフローチャート。
【図１１】本実施形態の処理のフローチャート。
【符号の説明】
【００９８】
１００  処理部、１１０  アドレス決定部、１１２  アドレス登録部、
１１４  隙間領域設定部、１１６  モード設定部、
１２０  描画部、１３０  音生成部、
１６０  操作部、１７０  記憶部、１７２  主記憶部、１７４  描画バッファ、
１８０  情報記憶媒体、１９０  表示部、１９２  音出力部、
１９４  携帯型情報記憶装置、１９６  通信部
【図１】
2008250787.tif 000003
【図２】
2008250787.tif 000004
【図３】
2008250787.tif 000005
【図４】
2008250787.tif 000006
【図５】
2008250787.tif 000007
【図６】
2008250787.tif 000008
【図７】
2008250787.tif 000009
【図８】
2008250787.tif 000010
【図９】
2008250787.tif 000011
【図１０】
2008250787.tif 000012
【図１１】
2008250787.tif 000013