(57)【特許請求の範囲】
【請求項１】
ソースコードにより記述されたクラス定義を実行可能形式ファイルにコンパイルし、前記クラス定義に示されているアドレスを補正して実行可能形式ファイルを主記憶装置に配置する方法において、
前記クラス定義中で、当該クラス定義内における他の静的変数の絶対アドレスを指定して参照する静的変数を抽出し、
主記憶装置上の任意の領域に前記実行可能形式ファイルを配置するとともに、
抽出した前記静的変数の絶対アドレスに対し、そのクラスの先頭アドレスによって定まるオフセットアドレスを、前記絶対アドレスに加算する補正を行うことを特徴とするクラスの主記憶装置への配置方法。
【請求項２】
ソースコードにより記述されたクラス定義を実行可能形式ファイルにコンパイルし、前記クラス定義に示されているアドレスを補正して実行可能形式ファイルを主記憶装置に配置する方法において、
前記クラス定義中で、当該クラス定義内におけるメソッドの絶対アドレスを参照するためにジャンプテーブルを設けている場合に、前記ジャンブテーブルに含まれるメソッドの絶対アドレスを抽出し、
メモリ上の任意の領域に前記実行可能形式ファイルを配置し、
抽出した前記メソッドの絶対アドレスに対し、そのクラスの先頭アドレスによって定まるオフセットアドレスを、前記絶対アドレスに加算する補正を行うことを特徴とするクラスの主記憶装置への配置方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、オブジェクト指向技術で開発されたプログラムのクラスの主記憶装置への配置方法に関する。
【０００２】
【従来の技術】
オブジェクト指向プログラミングによって、例えばよく知られたＣ言語によりプログラムを作成する場合、オブジェクトの性質を抽出して宣言するためにクラス定義を行う。このクラスの内部には、ある変数のアドレスを参照するような変数を含めることができる。この変数の中に静的変数というものがあり、これはクラスから生成される全てのインスタンスより共通に参照することができる変数である。この静的変数のアドレスは、クラスの先頭アドレスを基準とした絶対アドレスで表現される。従って、クラスをコンパイル／リンクし、主記憶装置上に配置する場合、静的変数に対しては絶対アドレスが割り付けられる。
【０００３】
【発明が解決しようとする課題】
ところで、上記のような従来のクラスの主記憶装置への配置方法には次のような解決すべき課題があった。
オブジェクト指向プログラミング技術で開発されたシステムにおいて、プログラムの修正や機能追加の際には、システムを停止することなく新しいクラスを動的にメモリ上の空き領域に配置する仕組みが要求される。この要求に応えるため、プログラムカウンタ相対アドレシングによる方式が知られている。この方式では、コンパイル／リンクを行うと、クラス内部で参照するアドレスは、プログラムカウンタの値をオフセット値とした相対アドレスに換算され、実行時に参照される。従って、クラスを主記憶装置上の任意の場所に再配置することが可能になる。
【０００４】
ところが、クラスに上記のような静的変数が含まれている場合には、その静的変数が参照している他の静的変数のアドレスまでは補正をしない。従って、実際にはアドレスが不正となり、参照が不能になる。このため、従来はプログラムカウンタ相対アドレシング方式を採用する場合には、静的変数による参照を避けてプログラミングを行っていた。ところが、これでは例えば、アドレスを参照する木構造データを静的に作ることはできなかった。なお、この木構造データというのは、枝から順番に幹に向かって変数を辿り、目的とするデータを参照するようなデータ構造をいう。
【０００５】
一方、クラスにはクラスの内部に含まれるいくつかのメソッドを選択し分岐する仕組みが含められることがある。この場合、一般のプログラムで行われているような条件文等を伴う分岐関数を設けるとよい。しかしながら、分岐するメソッドの数が多くなると、メソッドを選択して分岐するまでの手順が増えて効率が低下し、クラス定義のコードサイズが大きくなるというデメリットがある。そこで、メソッドのアドレスを参照するジャンプテーブルを用いて、該当するメソッドをコールする方が効率のよいプログラムとなる。ところが、先に説明したプログラムカウンタ相対アドレシングを用いた場合には、やはりクラスの再配置の際にジャンプテーブル中のメソッドのアドレスが補正の対象にならない。従って、絶対アドレスで表示されたメソッドの呼び出しができなくなってしまう。このため、従来このようなジャンプテーブルを静的に作ることはできなかった。
【０００６】
【課題を解決するための手段】
本発明は以上の点を解決するため次の構成を採用する。
〈構成１〉
ソースコードにより記述されたクラス定義を実行可能形式ファイルにコンパイルし、クラス定義に示されているアドレスを補正して実行可能形式ファイルを主記憶装置に配置する方法において、クラス定義中で、当該クラス定義内における他の静的変数の絶対アドレスを指定して参照する静的変数を抽出し、主記憶装置上の任意の領域に実行可能形式ファイルを配置するとともに、抽出した静的変数の絶対アドレスに対し、そのクラスの先頭アドレスによって定まるオフセットアドレスを、絶対アドレスに加算する補正を行う。
【０００７】
〈説明〉
プログラムカウンタ相対アドレシング方式では、クラス定義中に含まれる静的変数に対して、コンパイル、リンク時に、メモリ即ち主記憶装置上の絶対アドレスが割りつけられる。なお、静的変数とは、オブジェクト指向プログラムにおいて、あるクラスから生成される全てのインスタンスより共通に参照することができ、実記憶上では絶対アドレスにより特定されるデータセグメントに配置された変更不可能な変数のことをいう。
このようなクラスをコンパイルした実行可能形式ファイルが、主記憶装置上の任意の空き領域に再配置されると、ある静的変数が他の静的変数の絶対アドレスを指定して参照しているような場合に、参照するアドレスが不正になる。
そこで、コンパイル時に該当する静的変数を予め抽出する。
【０００８】
主記憶装置上のクラスの先頭アドレスによって定まるオフセットアドレスを、絶対アドレスに加算する補正をして新たな絶対アドレスに置き換えれば、その新たな絶対アドレスにより、再配置後の静的変数が参照できるようになる。補正はコンパイル直後でも、主記憶装置への再配置後であってもよい。
これにより、個々のクラスを主記憶装置上に自由に再配置することが可能になる。また、クラス中では専ら静的なアドレス参照を採用すればよいことから、静的変数を頻繁に参照するような場合に、動的なアドレス変換を伴う参照を行う場合に比べて効率の良いプログラミングが可能となる。
【０００９】
〈構成２〉
ソースコードにより記述されたクラス定義を実行可能形式ファイルにコンパイルし、クラス定義に示されているアドレスを補正して実行可能形式ファイルを主記憶装置に配置する方法において、クラス定義中で、当該クラス定義内におけるメソッドのアドレスを参照するためにジャンプテーブルを設けている場合に、ジャンブテーブルに含まれるメソッドの絶対アドレスを抽出し、メモリ上の任意の領域に実行可能形式ファイルを配置し、抽出した前記メソッドの絶対アドレスに対し、そのクラスの先頭アドレスによって定まるオフセットアドレスを、絶対アドレスに加算する補正を行う。
【００１０】
〈説明〉
クラスの中で、メソッドのアドレスを参照するためにジャンプテーブルを設けている場合に、そのクラスをメモリ上の任意の領域に再配置したとき、ジャンプテーブル中の絶対アドレスは変化しない。従って、あるメソッドの絶対アドレスを指定してジャンプするような場合に、ジャンプ先アドレスが不正になる。そこで、静的変数の場合と同様にして絶対アドレスの補正を行う。その結果、この場合にも、ジャンプテーブルによる静的なアドレス指定を採用すればよいことから、条件分岐やその他の演算による動的なアドレス変換を伴う指定を行う場合に比べて効率の良いプログラミングが可能となる。
【００１１】
【発明の実施の形態】
以下、本発明の実施の形態を具体例を用いて説明する。
〈具体例１〉
図１は、本発明の具体例１の方法を説明するブロック図である。
この方法では、クラス定義１をコンパイルする際に、コンパイラ／リンカ２とアドレス補正情報生成装置４とを使用する。クラス定義１はオブジェクト指向プログラミング技術により記述されたよく知られた内容のものである。コンパイラ／リンカ２はソースコードで作成されたクラス定義１をコンパイルし、実行可能形式ファイル３を生成するためのよく知られた装置から構成される。一方、アドレス補正情報生成装置４は、構文解析装置５と、意味解析装置６と、補正アドレス抽出装置７と、構文解析木情報８を備え、クラス定義１の中から静的変数の絶対アドレスを指定して参照するような静的変数を抽出する。構文解析装置５はクラス定義１の各文の要素を検出し、その構文を解析する部分で、意味解析装置６は各要素の意味を解析する部分である。補正アドレス抽出装置７は、構文解析の結果得られた構文解析木情報８を用いて、その内部に含まれる他の静的変数の絶対アドレスを指定して参照する静的変数を抽出する部分である。この具体的な説明は後で述べるが、この補正アドレス抽出装置７によってアドレス補正情報９が得られる。実行可能形式ファイル３は、配置装置１１によって主記憶装置１３の任意の位置に配置される。このとき、アドレス補正装置１２は、アドレス補正情報９を参照しながら、主記憶装置１３に配置された実行可能形式ファイル３中の先に説明した静的変数を参照する絶対アドレス部分を取り出し、これを補正する。クラス配置装置１０は、このような配置装置１１とアドレス補正装置１２とから構成されている。
【００１２】
なお、上記構文解析装置５はアドレスコードの内容を解析しないよう構文解析木情報８に変換し、構文上の誤り等をチェックする部分で、意味解析装置６は構文解析装置によって得られた構文解析木を元に意味上の誤り等をチェックする部分である。また、補正アドレス抽出装置７は、構文解析木を元に静的変数及び静的変数のアドレスを参照する静的変数の絶対アドレスを抽出し、抽出された情報をテーブル形式でアドレス補正情報としてファイルに出力する部分である。
【００１３】
また、クラス配置装置１０の配置装置１１は実行形式モジュールをメモリ上にプログラムカウンタ相対アドレシング方式によって配置する装置である。このとき、先に説明したように、静的変数を参照する静的変数の内容は修正されずにそのまま主記憶装置上に割り付けられる。アドレス補正装置１２は配置装置によって主記憶装置上に配置されたクラスの該当する静的変数部分を検出し、アドレス補正情報９及びそのクラスの主記憶装置上での先頭アドレス（オフセット）を用いて該当する部分の補正を行う装置である。
【００１４】
なお、これらの具体的な動作を説明する前に、ＰＣ相対アドレシング方式とアドレス補正情報の内容、アドレス補正動作の概要等を説明する。
図２は、ＰＣ相対アドレシング方式の説明図である。
図に示すフェーズ１には、クラスＡのソースファイルが表示されている。このソースファイルには、例えば変数ｂのアドレスを参照する静的変数ａが含められているとする。フェーズ２では、これがコンパイルされて、実行可能形式ファイルに変換されている。この図を見て分かるように、実行可能形式ファイルの先頭アドレスを０番地とした場合に、変数ａは変数ｂのアドレスを参照している。
【００１５】
ここで、ＰＣ相対アドレス方式を採用し、主記憶装置上に実行可能形式ファイルを配置すると、フェーズ３に示すようになる。このとき、クラスＡの先頭アドレスは、必ずしもメモリの０番地とは一致しない。従って、変数ａはクラスＡの先頭アドレスに変数ａのアドレスを加えた位置に存在する。また、変数ｂはクラスＡの先頭アドレスに変数ｂのアドレスを加えた位置に存在する。ところが、変数ａは静的変数であって、こうしてメモリ上に配置される際にも内容が変更されず、フェーズ２に示した通り、変数ｂの絶対アドレスを表示している。これではフェーズ３においてクラスをメモリ上に配置した後、変数ａは変数ｂを参照することができない。本発明では、この変数ａを変数ｂのアドレスを参照するように変換する操作を行う。
【００１６】
図３に、この目的のために使用するアドレス補正情報の説明図を示す。
まず、クラス定義１は先に説明したように、コンパイラ／リンカ２によって実行可能形式ファイル１５に変換される。この場合の実行可能形式ファイル１５の構造は図２を用いて説明したフェーズ２に示すものと同様である。
一方、図３において、クラス定義１からアドレス補正情報生成装置４によってアドレス補正情報が抽出される。これはソースコードの段階で構文解析等を行うことによって、静的変数の絶対アドレスを参照する静的変数を抽出することにより行われる。即ち、アドレス補正情報１６は、他の静的変数のアドレスを参照する静的変数ａの絶対アドレス等により構成される。
【００１７】
図４には、アドレス補正動作の説明図を示す。
上記のように生成された実行可能形式ファイル３とアドレス補正情報９は、図１に示したクラス配置装置１０に入力する。そして、配置装置１１が実行可能形式ファイル３を主記憶装置の所定の場所に配置する。このとき、主記憶装置上でクラスの先頭アドレスが決定する。配置装置１１はこの先頭アドレスをアドレス補正装置１２に通知する。アドレス補正装置１２はアドレス補正情報９を用いて、既に主記憶装置上に配置されたクラスの該当するアドレスの内容を補正する。即ち、変数ａの値をクラスの先頭アドレス＋ｂの絶対アドレスになるように書き換える。
【００１８】
なお、このアドレスの補正は必ずしも主記憶装置に実行可能形式ファイルを配置してしまった後で行う必要はない。例えば、配置装置１１が予め主記憶装置上にクラスを配置する際の先頭アドレスを認識していれば、これをアドレス補正装置１２に通知し、アドレス補正装置１２は実行可能形式ファイル３の補正を行う。そして、補正後の実行可能形式ファイル３を配置装置１１が主記憶装置中に配置するという方法を採用することもできる。前者の方法を▲１▼、後者の方法を▲２▼というように区別してこの図中に示している。
【００１９】
図５は、本発明の方法の具体的動作説明図である。
本発明の方法をより具体的に説明するために、この図によって静的変数のコンパイルと補正時の内容について詳細に説明する。
まず、例えばこの図の左上に示すように、クラス定義２に含まれる静的変数をａ＝１００といった内容のものとする。これをステップＳ１でコンパイルすると、例えばこの図に示すように“ＸＸＸＸ”となるものとする。ここで、ステップＳ２において、先に説明したように、この静的変数ａのアドレス５０を抽出し、補正情報としておく。次に、ステップＳ３においてコンパイルされた静的変数が主記憶装置に配置される。この場合のクラスの先頭アドレスを、例えばこの図に示すように３００とする。ここで、アドレス補正処理が開始されると、まずアドレスが５０の静的変数ａが参照する絶対アドレスの内容を先頭アドレスを用いて補正する。即ち、当初参照していた絶対アドレス１００に先頭アドレス３００を加算する。そして、正しいアドレスを参照する静的変数をコンパイルした“ＹＹＹＹ”を生成する。そして、主記憶装置上に記憶したクラスの“ＸＸＸＸ”を“ＹＹＹＹ”に置き換える補正を実行する（ステップＳ５）。以上のようにして静的変数の参照する絶対アドレスがクラスの配置結果に基づいて補正される。
【００２０】
〈具体例１の効果〉
以上のようにしてプログラムカウンタ相対アドレシング方式を採用した場合においても、他の静的変数の絶対アドレスを参照する静的変数を適正に補正するので、このような静的変数の使用が可能となる。従って、例えば頻繁に参照のみを行う静的データのアドレスを参照するような静的変数を定義することができ、あるいは木構造のデータを採用することもでき、メソッド毎にアドレス変換等を行うダイナミックなアドレス参照を行う場合に比べて、効率よいプログラミングを実施することができる。
【００２１】
〈具体例２〉
上記の例では、クラス中に存在する静的変数を問題としたが、クラス中にメソッドのアドレスを参照するジャンプテーブルが設けられることがある。このジャンプテーブルに入っているメソッドのアドレスは、そのクラスの先頭からカウントした絶対アドレスになっている。プログラムカウンタ相対アドレシングにより実行可能形式ファイルにファイル化され、主記憶装置上に配置される際にこのジャンプテーブルに表示された絶対アドレスも変換されない。そこで、上記の静的変数が参照する絶対アドレスと同様に、この具体例においてジャンプテーブルの絶対アドレスを補正する。
【００２２】
図６には、具体例２の方法を説明するブロック図を示す。
クラス定義１は、具体例１と同様にコンパイラ／リンカ２によってコンパイルされ、実行可能形式ファイル３とされる。また、クラス定義１は、ジャンプテーブル補正情報生成装置２０によって処理され、ジャンプテーブル補正情報２２が抽出される。ジャンプテーブル補正情報生成装置２０には、構文解析装置５、意味解析装置６、ジャンプテーブル抽出装置２１及び構文解析木情報８が設けられる。上記ジャンプテーブル補正情報生成装置２０は、クラス定義１を解析し、ジャンプテーブル上のメソッドのアドレスが格納される領域の絶対アドレスを抽出し、そのテーブルを作成する。このテーブルがジャンプテーブル補正情報２２となる。これは具体例１の場合とよく類似している。構文解析装置５、意味解析装置６の構成や役割は、具体例１に示したものと同様である。ジャンプテーブル抽出装置２１は、構文解析木情報８を元にテーブル上のメソッドのアドレスが格納される領域の絶対アドレスを抽出する処理を行う部分である。クラス配置装置１０は、具体例１で説明したと同様の構成の配置装置１１やアドレス補正装置１２を備えている。その他の部分は具体例１で説明したものと同様である。
【００２３】
図７に、ジャンプテーブル補正情報の説明図を示す。
図に示すように、クラス定義１はコンパイラ／リンカ２によって実行可能形式ファイル２５に変換される。このとき、例えばアドレスａにはメソッドＡの絶対アドレスが格納され、アドレスｂにはメソッドＢの絶対アドレスが格納され、アドレスｃにはメソッドＣの絶対アドレスが格納されているものとする。これらがジャンプテーブルを構成する。図に示すように、メソッドＡ，Ｂ，Ｃには、実行可能形式ファイル２５の該当するアドレスに格納されている。ジャンプテーブル補正情報生成装置２０はジャンプテーブルを参照し、図に示すようなジャンプテーブル補正情報２６を生成する。その内容は、ジャンプテーブルの各部のアドレスａ，ｂ，ｃとなっている。このような補正情報の生成方法は具体例１と同様である。
【００２４】
図８には、アドレス補正動作の説明図を示す。
上記のようにして生成された実行可能形式ファイル２５とジャンプテーブル補正情報２６は、この図に示すようにして主記憶装置へ配置される際の補正処理に使用される。まず、配置装置１１は実行可能形式ファイル２５を所定の主記憶装置上のアドレスに配置する。この場合に、アドレス補正装置１２は、ジャンプテーブルにおいて指定しているメソッドＡの絶対アドレス、メソッドＢの絶対アドレス、メソッドＣの絶対アドレスをそれぞれ補正して該当するメソッドを参照できるようにする。この場合の補正はクラスの先頭アドレスを各絶対アドレスに加算することにより行われる。
【００２５】
なお、この補正動作やその具体的な処理は具体例１を用いて説明した場合と同様である。また、実行可能形式ファイルを主記憶装置上に配置した後でアドレス補正を行ってもよいし、また実行可能形式ファイル２５の状態でアドレス補正を行うようにしてもよい。これも具体例１の場合と同様である。
【００２６】
〈具体例２の効果〉
クラスのソースコード上で、あるメソッドへジャンプするアドレスを検出し、これを補正することによって、メソッドの絶対アドレスを持つジャンプテーブルを静的に作ることができる。そして、プログラムカウンタ相対アドレシングでクラスを再配置した場合にも、このジャンプテーブルの内容が適正に補正されるため、このような方式においてもジャンプテーブルを利用できる。従って、例えばメソッドを選択して分岐するような処理に一般的なプログラミング言語の持つ分岐機構等を記述することによってコードサイズを増加させたり、記述自体を複雑にし、プログラミングの効率を低下させるといったことを防止できる。
【図面の簡単な説明】
【図１】本発明の方法を説明するブロック図である。
【図２】ＰＣ相対アドレシング方式の説明図である。
【図３】アドレス補正情報の説明図である。
【図４】アドレス補正動作の説明図である。
【図５】本発明の方法の具体的動作説明図である。
【図６】具体例２の方法を説明するブロック図である。
【図７】ジャンプテーブル補正情報の説明図である。
【図８】アドレス補正動作の説明図である。
【符号の説明】
１  クラス定義
２  コンパイラ／リンカ
３  実行可能形式ファイル
４  アドレス補正情報生成装置
９  アドレス補正情報
１０  クラス配置装置
１１  配置装置
１２  アドレス補正装置
１３  主記憶装置
【図１】
0003596570.tif 000002
【図２】
0003596570.tif 000003
【図３】
0003596570.tif 000004
【図４】
0003596570.tif 000005
【図５】
0003596570.tif 000006
【図６】
0003596570.tif 000007
【図７】
0003596570.tif 000008
【図８】
0003596570.tif 000009