(57)【特許請求の範囲】
【請求項１】
あるプログラムから他のプログラムにリンクしているアドレスを解決するアドレス解決装置において、
呼び出し先のプログラムのアドレステーブルの内容を呼び出し元のプログラムから呼び出し先のプログラムに要求するアドレス要求手段と、
上記アドレステーブルの内容の要求時に起動され、自アドレステーブルに上位のプログラムのアドレステーブルの内容が登録されていないときに継承関係にある上位のプログラムのアドレステーブルの内容を上記呼び出し先のプログラムから上記上位のプログラムに要求し、返却されたときに上記自アドレステーブルに登録するアドレス生成手段と、
上記自アドレステーブルに上記上位のプログラムのアドレステーブルの内容が登録されていたときは当該内容を、登録されていなかったときは上記アドレス生成手段によって登録された後に当該内容を、上記呼び出し先のプログラムから上記呼び出し元のプログラムに返却するアドレス返却手段と
を備えたことを特徴とするアドレス解決装置。
【請求項２】
上記上位のプログラムが複数ある場合には、全ての上位のプログラムのアドレステーブルの内容を要求することを特徴とする請求項１記載のアドレス解決装置。
【請求項３】
呼び出し先のプログラムのアドレステーブルの内容を呼び出し元のプログラムから呼び出し先のプログラムに要求するアドレス要求手段と、
上記アドレステーブルの内容の要求時に起動され、自アドレステーブルに上位のプログラムのアドレステーブルの内容が登録されていないときに継承関係にある上位のプログラムのアドレステーブルの内容を上記呼び出し先のプログラムから上記上位のプログラムに要求し、返却されたときに上記自アドレステーブルに登録するアドレス生成手段と、
上記自アドレステーブルに上記上位のプログラムのアドレステーブルの内容が登録されていたときは当該内容を、登録されていなかったときは上記アドレス生成手段によって登録された後に当該内容を、上記呼び出し先のプログラムから上記呼び出し元のプログラムに返却するアドレス返却手段と
して機能させるプログラムを記録したコンピュータ読取可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、あるプログラムから他のプログラムにリンクしているアドレスを解決するアドレス解決装置および記録媒体に関するものである。
【０００２】
【従来の技術】
従来、あるプログラムから他のプログラムを呼び出す場合のアドレス解決方法は、アドレスを参照している場所から直接のアドレスが定義されている場所に直接アドレス解決のための情報が出されていたため、全ての情報をリンク時に解決する必要があった。
【０００３】
例えば図３の（ａ）のように、プログラムＰＲＯＧ１、２、３に図示の矢印の呼び出し関係があった場合、プログラムＰＲＯＧ１のリンクの際には、リンクオブジェクトにプログラムＰＲＯＧ２とＰＲＯＧ３を指定する必要があった。
【０００４】
【発明が解決しようとする課題】
通常のプログラム言語では、サブルーチンを呼び出すためのＣＡＬＬ命令に書かれた名前が呼び出し名に対応しているため、その名前が定義されているプログラムを探すだけで、アドレス解決を行うことができた。
【０００５】
しかしながら、オブジェクト指向の概念が導入され、サブルーチンを呼び出すＣＡＬＬ命令、およびＩＮＶＯＫＥ命令（ここではクラスのメソッドを呼び出す命令をＩＮＶＯＫＥ命令と記述する）では、そのプログラムに記述されている命令だけでは、実際に呼び出される他のプログラムが何であるか判らないという問題があった。
【０００６】
例えば図３の（ｂ）のような構成の場合、プログラムＰＲＯＧ１のリンクの際には、リンクオプションにクラスＣＬＡＳＳ１を指定する必要がある。
また、図３の（ｃ）のような構成の場合（ＣＬＡＳＳ１がＣＬＡＳＳ２を継承している場合）には、プログラムＰＲＯＧ１からクラスＣＬＡＳＳ２のメソッドＭ１が呼び出されるため、プログラムＰＲＯＧ１のリンクの際には、リンクオプションにクラスＣＬＡＳＳ１とクラスＣＬＡＳＳ２を指定しなければならない。このようなプログラムはオブジェクト指向では一般的であるが、プログラムを見ただけでは何をリンクする必要があるか判らないという問題があった。
【０００７】
本発明は、これらの問題を解決するため、リンク時にプログラム中の呼び出し元のアドレス要求ルーチン、呼び出し先のアドレス生成ルーチンとアドレス返却ルーチンによって自動的に継承等のアドレス解決することを目的としている。
【０００８】
【課題を解決するための手段】
図１を参照して課題を解決するための手段を説明する。
図１において、アドレス要求ルーチン（アドレス要求手段）１は、アドレステーブルの内容（アドレス）の要求を行うものである。
【０００９】
アドレス生成ルーチン（アドレス生成手段）２は、継承関係にある上位のプログラム（クラス）のアドレステーブル４の内容（アドレス）を要求し、返却されたアドレスをもとに複写（登録）してアドレステーブル４を生成などするものである。
【００１０】
アドレス返却ルーチン（アドレス返却手段）３は、アドレステーブル４の内容（アドレス）を呼び出し元に返却などするものである。
アドレステーブル４は、リンク関係にあるアドレスやそのプログラムの名前などを登録するものである。
【００１１】
次に、動作を説明する。
呼び出し元のプログラム中に設けたアドレス要求手段１が呼び出し先のプログラムのアドレステーブル４の内容（アドレス）を要求し、呼び出し先のプログラム中に設けたアドレス生成手段２が継承関係があるときに自アドレステーブル４に上位のプログラムのアドレステーブル４の内容が登録されていないときに上位のプログラムのアドレステーブル４の内容（アドレス）を要求し、この要求を受けた上位のプログラム中に設けたアドレス返却手段３がアドレステーブル４の内容（アドレス）を呼び出し元に返却し、返却されたアドレスをもとにアドレステーブル４の内容を複写（登録）および呼び出し元に当該アドレステーブル４の内容（アドレス）を返却するようにしている。
【００１２】
この際、継承関係にある上位のプログラムが複数ある場合には、全ての上位のプログラムのアドレステーブル４の内容（アドレス）を要求するようにしている。
【００１３】
従って、リンク時にプログラム中の呼び出し元のアドレス要求ルーチン、呼び出し先のアドレス生成ルーチンとアドレス返却ルーチンによって自動的に継承等のアドレス解決することが可能となる。
【００１４】
【発明の実施の形態】
次に、図１および図２を用いて本発明の実施の形態および動作を順次詳細に説明する。
【００１５】
図１は、本発明の説明図を示す。
図１において、（１）プログラムＰＲＯＧ１は、呼び出し元のプログラムであって、ここでは、アドレス要求ルーチン（アドレス要求手段）１などを設けたものである。
【００１６】
アドレス要求ルーチン（アドレス要求手段）１は、呼び出し先のプログラムのアドレステーブル４および自アドレステーブル４の内容（アドレス）の要求を行うものである。
【００１７】
（２）プログラムＰＲＯＧ２は、プログラムＰＲＯＧ１から呼び出されるプログラム（ここでは、継承するクラス）であって、クラスＣＬＡＳＳ１であり、アドレス生成ルーチン（アドレス生成手段）２およびアドレス返却ルーチン（アドレス返却手段）３などを設けたものである。
【００１８】
アドレス生成ルーチン２は、継承関係にある上位のプログラム（クラス）のアドレステーブル４の内容（アドレス）を要求し、返却された上位のプログラムのアドレスをもとにアドレステーブル４に複写（登録）などするものである。
【００１９】
アドレス返却ルーチン３は、アドレステーブル４の内容（アドレス）を呼び出し元に返却などするものである。
アドレステーブル４は、リンク関係（継承関係）にあるアドレスやそのプログラム名などを登録するものである。
【００２０】
（３）プログラムＰＲＯＧ３は、（２）プログラムＰＲＯＧ２の上位の継承関係にあるプログラム（ここでは、継承されるクラスＣＬＡＳＳ２（親））であって、アドレス返却ルーチン３などを設けたものである。
【００２１】
次に、図１の構成の動作を説明する。
▲１▼は、（１）プログラムＰＲＯＧ１中の「ｉｎｖｏｋｅ  ＣＬＡＳＳ１  Ｍ１」というｉｎｖｏｋｅ命令（クラスＣＬＡＳＳ１のメソッドＭ１を呼び出すｉｎｖｏｋｅ命令）に対応して、本実施例で展開した命令「ｃａｌｌ  ＣＬＡＳＳ１ＲＴＮ」によって、呼び出し先のクラスＣＬＡＳＳ１中のアドレス生成ルーチン２を呼び出す。
【００２２】
▲２▼は、▲１▼で呼び出されたクラスＣＬＡＳＳ１のアドレス生成ルーチン２がアドレステーブル４の初期化が未か判別し、ＹＥＳのときに図示のように上記のクラスＣＬＡＳＳ２を呼び出す。
【００２３】
▲３▼は、▲２▼で呼び出されたクラスＣＬＡＳＳ２のアドレス返却ルーチン３が自アドレステーブル４の内容（アドレス）をクラスＣＬＡＳＳ１に返却する。
▲４▼は、▲３▼で返却を受けたアドレスをもとにアドレステーブル４の内容を、自己のアドレステーブル４に複写する。ここでは、矢印で示すようにクラスＣＬＡＳＳ１のアドレステーブル４中にメソッドＭ１のアドレスを複写して登録する。
【００２４】
▲５▼は、クラスＣＬＡＳＳ１のアドレス返却ルーチン３が自己のアドレステーブル４の内容（アドレス）を、プログラムＰＲＯＧ１に返却する。ここでは、クラスＣＬＡＳＳ１のメソッドＭ２のアドレスおよびクラスＣＬＡＳＳ２のメソッドアＭ１のアドレス（継承関係にあるアドレス）の両者が登録されたメソッドテーブル４の内容（アドレス）を、プログラムＰＲＯＧ１に返却する。これにより、プログラムＰＲＯＧ１は、クラスＣＬＡＳＳ１のメソッドＭ２のアドレス以外に、継承関係にあるＣＬＡＳＳ２のメソッドＭ１のアドレスを取得できるようになる。
【００２５】
▲６▼は、プログラムＰＲＯＧ１は、クラスＣＬＡＳＳ１のアドレステーブル４からメソッドＭ１のアドレスを取り出し、そこに分岐する。
以上のように、プログラムＰＲＯＧ１は、ここでは、継承関係にあるクラスＣＬＡＳＳ２を意識することなく、アドレス要求ルーチン１、アドレス生成ルーチン２およびアドレス返却手段３をプログラムＰＲＯＧ１、クラスＣＬＡＳＳ１、２にコンパイル時に展開して（埋め込んで）おくことにより、実行時に自動的にその継承関係にあるクラスＣＬＡＳＳ２のメソッドＭ１のアドレスを取得し、そのメソッドＭ１のアドレスに分岐し、処理を続行することが可能となる。
【００２６】
次に、図２のフローチャートの順番に従い図１のような構成を持つ場合の一般的な動作を詳細に説明する。
図２は、本発明の動作説明フローチャートを示す。ここで、プログラムＰＲＯＧ１は図１のプログラムＰＲＯＧ１に対応し、プログラムＰＲＯＧ２は図１のプログラムＰＲＯＧ２（クラスＣＬＡＳＳ１）に対応し、プログラムＰＲＯＧ３は図１のプログラムＰＲＯＧ３（クラスＣＬＡＳＳ２）に対応する。
【００２７】
図２において、Ｓ１は、プログラムＰＲＯＧ１中でアドレステーブル要求を行う。これは、「ＣＡＬＬ  アドレス生成／返却ルーチン」という命令を実行し、Ｓ１０のプログラムＰＲＯＧ２（クラスＣＬＡＳＳ１）のアドレス生成／返却ルーチン３を呼び出す。これは、例えば図１の▲１▼に示すように、プログラムＰＲＯＧ１のアドレス要求ルーチン１がクラスＣＬＡＳＳ１のアドレス生成ルーチン２を呼び出す。
【００２８】
Ｓ２は、「ＣＡＬＬ  アドレステーブルの内容」を行う。これは、Ｓ１でプログラムＰＲＯＧ２を呼び出し、継承関係にあるプログラム（クラス）のアドレステーブル４の内容（アドレス）の全ての返却を受けてアドレステーブル４に登録した後、実行する処理であって、プログラムＰＲＯＧ１中にあるアドレステーブル４から分岐先のアドレス、例えば図１の▲６▼に示すメソッドＭ１のアドレスを取り出して分岐し処理を続行する。
【００２９】
Ｓ１０は、Ｓ１から呼び出されたクラスＣＬＡＳＳ１中のアドレス生成／返却ルーチンの実行を開始する。
Ｓ１１は、Ｓ１０で実行を開始したアドレス生成ルーチン２によって自己のアドレステーブル４が完成しているか判別する。ＹＥＳの場合には、継承関係にある上位の全てのクラスのアドレステーブル４の内容を取り込んで自己のアドレステーブル４に複写（登録）されていると判明したので、Ｓ１４に進む。一方、Ｓ１１のＮＯの場合には、継承関係にある上位の全てのクラスのアドレステーブル４の内容を取り込んで自己のアドレステーブル４に登録していないと判明したので、Ｓ１２、Ｓ１３の処理を実行する。
【００３０】
Ｓ１２は、Ｓ１１のＮＯで自己のアドレステーブル４が完成していないと判明したので、アドレステーブル要求を上位のクラスに通知する。これは、「ＣＡＬＬ  アドレス返却ルーチン」を実行、例えば図１の▲２▼のアドレス生成ルーチン２によって、上位のクラスＣＬＡＳＳ２のアドレス返却ルーチン３を呼び出す（尚、ここでは、クラスＣＬＡＳＳ２が最上位のクラスとしている。しかし、最上位のクラスでない場合には、図１の▲１▼のように、上位のクラスのアドレス生成ルーチン２を呼び出すことを繰り返し、最上位のクラスのアドレス返却ルーチン３となるまで行う）。
【００３１】
Ｓ１３は、親のアドレステーブル４の内容を自己のアドレステーブル４に複写する。これは、Ｓ１２で上位（親）のクラスのアドレス返却ルーチン３を呼び出し、返却された上位（親）のクラスのアドレステーブル４のアドレスをもとに自己のアドレステーブル４に複写する。
【００３２】
Ｓ２０は、Ｓ１２から呼び出された上位（親）のクラスＣＬＡＳＳ２のアドレス返却ルーチン３が処理開始する。
Ｓ２１は、アドレステーブル４の内容（アドレス）を返却する。これは、Ｓ１２で呼び出された親のクラスＣＬＡＳＳ２のアドレス返却ルーチン３が自己のアドレステーブル４の内容（アドレス）を、クラスＣＬＡＳＳ１に返却する。そして、既述したＳ１３でクラスＣＬＡＳＳ１のアドレステーブル４にその内容を複写する。
【００３３】
以上によって、プログラムＰＲＯＧ１のアドレス要求ルーチン１がＳ１でアドレステーブル４の内容（アドレス）を呼び出し先のクラスＣＬＡＳＳ１に要求するのみで、当該クラスＣＬＡＳＳ１と継承関係にある上位の全てのクラスのアドレステーブル４の内容を自動的に取得し、プログラムＰＲＯＧ１がクラスＣＬＡＳＳ１のアドレステーブル４を参照することが可能となる。そして、Ｓ２の「ＣＡＬＬ  アドレステーブル４の内容」によって、呼び出し先のアドレス（図１ではメソッドＭ１のアドレス）を取り出してそのアドレスに分岐して処理を続行することが可能となる。
【００３４】
このように、コンパイル時に図１の「ｉｎｖｏｋｅ  ＣＬＡＳＳ１  Ｍ１」というｉｎｖｏｋｅ命令があったときに、▲１▼の「ｃａｌｌ  ＣＬＡＳＳ１  ＲＴＮ」、および▲６▼の「ｃａｌｌ  アドレステーブルが保持しているアドレス」というような２つのＣＡＬＬ命令を展開、および呼び出し先のクラスと継承関係にある上位のクラスにアドレス生成ルーチン２およびアドレス返却ルーチン３を展開して（埋め込んで）おくことで、実行時に自動的に継承関係にある上位のクラスのアドレステーブル４の内容（アドレス）を呼び出し元の例えばプログラムＰＲＯＧ１が取得してアドレステーブル４に複写（登録）してアドレス解決を図り、当該アドレステーブル４に登録されたアドレス（例えば図１のメソッドＭ１のアドレス）に分岐して処理を続行することが可能となる。
【００３５】
尚、上記実施例では、メッドアドレスをアドレステーブル４に複写（登録）するとして説明したが、アドレスでなくオフセットを複写（登録）してもよいし、更に、情報としてメソッド名の文字列をアドレステーブル４に複写（登録）しておき、この文字列を比較して一致するメソッド名を見つけるようにしてもよい。
【００３６】
【発明の効果】
以上説明したように、本発明によれば、リンク時にプログラム中の呼び出し元のアドレス要求ルーチン、呼び出し先のアドレス生成ルーチンとアドレス返却ルーチンによって自動的に継承等のアドレス解決してアドレステーブル４に登録し、アドレステーブル４から取り出した分岐先のアドレスに分岐して処理を続行できると共に、オブジェクト指向言語で利用される継承等に対しても、暗に参照されている情報を、自動的に明に記述した情報（アドレス解決した情報を複写（登録）したアドレステーブル４の内容）として獲得できる。
【図面の簡単な説明】
【図１】本発明の説明図である。
【図２】本発明の動作説明フローチャートである。
【図３】従来技術の説明図である。
【符号の説明】
１：アドレス要求ルーチン（アドレス要求手段）
２：アドレス生成ルーチン（アドレス生成手段）
３：アドレス返却ルーチン（アドレス返却手段）
４：アドレステーブル
【図１】
0003673654.tif 000002
【図２】
0003673654.tif 000003
【図３】
0003673654.tif 000004