(57)【特許請求の範囲】
【請求項１】
オブジェクト指向言語のプログラムをファイル単位で機械語命令列に翻訳し出力ファイルとして出力する翻訳装置と、前記翻訳装置で翻訳された出力ファイルを連結して実行ファイルを生成する連結装置とを備えるプログラム変換装置であって、
前記オブジェクト指向言語のプログラムには、オーバーライドメソッドを含むクラスの定義とオーバーライドメソッド呼び出し命令が含まれ、
前記翻訳装置は、
前記クラスの定義に基づいてファイル単位のクラスの継承関係を、継承関係情報に翻訳する継承関係翻訳手段と、
前記オーバーライドメソッド呼び出し命令を、この命令によって呼び出されるメソッドが属するクラスを表すメソッドクラス情報と、この命令によって呼び出されるメソッドがオーバーライドメソッドでない場合の機械語命令列を表す非オーバーライド情報と、オーバーライドメソッドである場合の機械語命令列を表すオーバーライド情報とを含むメソッド命令列に翻訳するメソッド翻訳手段とを備え、
前記連結装置は、
前記翻訳装置で翻訳された全ての出力ファイルの中の全ての前記継承関係情報に基づいて、前記オーバーライドメソッド呼び出し命令によって呼び出されるメソッドが属するクラスが、継承されるか否かを判断する判断手段と、
前記判断手段で継承されないと判断された場合には、前記メソッド命令列に含まれる前記オーバーライド情報は用いず、当該メソッド命令列に含まれる前記非オーバーライド情報を用いることにより、オーバーライドメソッドでない場合の機械語命令列を生成し、一方、前記判断手段で継承されると判断された場合には、当該メソッド命令列に含まれる前記非オーバーライド情報は用いず、当該メソッド命令列に含まれる前記オーバーライド情報を用いることにより、オーバーライドメソッドである場合の機械語命令列を生成し、前記メソッド命令列を、生成した機械語命令列に置換する置換手段と
を備えることを特徴とするプログラム変換装置。
【請求項２】
前記メソッド翻訳手段は、
前記オーバーライドメソッド呼び出し命令を翻訳するにあたり、前記非オーバーライド情報と、前記オーバーライド情報との両方を含む１つのマクロ命令と、前記メソッドクラス情報を含む１つの疑似命令とで表されるメソッド命令列に翻訳すること
を特徴とする請求項１に記載のプログラム変換装置。
【請求項３】
前記メソッド翻訳手段は、
前記オーバーライドメソッド呼び出し命令を翻訳するにあたり、前記メソッドクラス情報と、前記非オーバーライド情報と、前記オーバーライド情報との全てを含む１つのマクロ命令で表されるメソッド命令列に翻訳すること
を特徴とする請求項１に記載のプログラム変換装置。
【請求項４】
前記マクロ命令は、
マクロ名と、前記メソッドクラス情報と、非オーバーライド情報としてオーバーライドメソッドでない場合に呼び出すラベル名と、オーバーライド情報の一部としてオーバーライドメソッドである場合に使用するオブジェクトの先頭からのオフセット値と、オーバーライド情報の一部としてオーバーライドメソッドである場合に使用するメソッドアドレス格納テーブルの先頭からのオフセット値で構成されること
を特徴とする請求項３に記載のプログラム変換装置。
【請求項５】
前記メソッド翻訳手段は、
前記オーバーライドメソッド呼び出し命令を翻訳するにあたり、前記非オーバーライド情報の代わりにオーバーライドメソッドでない場合の機械語命令列である非オーバーライド命令を含み、前記オーバーライド情報の代わりにオーバーライドメソッドである場合の機械語命令列であるオーバーライド命令を含むメソッド命令列に翻訳し、
前記置換手段は、
前記メソッド命令列をオーバーライドメソッドでない場合の機械語命令列に置換する際には、メソッド命令列から非オーバーライド命令以外の不必要な部分を除くだけの処理をおこない、前記メソッド命令列をオーバーライドメソッドである場合の機械語命令列に置換する際には、メソッド命令列からオーバーライド命令以外の不必要な部分を除くだけの処理をおこなうこと
を特徴とする請求項１に記載のプログラム変換装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はプログラムを翻訳するプログラム変換装置等に関し、特に、オブジェクト指向言語のオーバーライドメソッド呼び出し命令のコードサイズを縮小し、実行速度を向上させるプログラム変換装置等に関する。
【０００２】
【従来の技術】
オブジェクト指向言語には、多様性を構築する特別なメソッドとしてオーバーライドメソッドがある。オーバーライドメソッドとは、例えば、クラスＡとクラスＡを継承するクラスＢがそれぞれ同じ型のメソッドｆを持ちクラスＢのオブジェクトに対してメソッドｆを呼び出すと、その呼び出しがクラスＡへのポインタやリファレンスを経由していてもクラスＢのメソッドｆが呼び出されるような機能を持つメソッドを言う。また、このような機能をオーバーライド機能と言う。
【０００３】
オブジェクト指向言語Ｃ＋＋（以下「Ｃ＋＋言語」と言う）ではオーバーライドメソッドは仮想関数と呼ばれ、関数の先頭にｖｉｒｔｕａｌ指定子を付加することにより指定できる。また、Ｃ＋＋言語ではメソッドは関数であり、関数ｆをクラスＡで仮想関数に指定すればそのクラスＡを継承するクラスＢでもその関数ｆは自動的に仮想関数となる。
【０００４】
また、オブジェクト指向言語Ｊａｖａ（以下「Ｊａｖａ言語」と言う）ではメソッドはデフォルトでオーバーライドメソッドとなる。
従来のオブジェクト指向言語のオーバーライドメソッド呼び出しの実現方法について、「注釈Ｃ＋＋リファレンスマニュアル」（Ｂ．ストラウストラップ著トッパンＩＳＢＮ４−８１０１−８０２７−１１０．７ｃ）の例を用いて説明する。
【０００５】
図１２はＣ＋＋言語の仮想関数を含むクラス定義を示す図である。図中のｖｉｒｔｕａｌ指定子が先頭についている関数及びそれを継承した関数が仮想関数である。したがって、クラスＡの関数ｆ，ｇ及びｈ、クラスＢの関数ｆ、ｇ及びｈ並びにクラスＣの関数ｆ，ｇ及びｈが仮想関数である。
図１３は、図１２に示したクラスの継承関係を表す図である。クラスＡはクラスＢに継承され、さらにクラスＢはクラスＣに継承されている。
【０００６】
図１４は、図１２に示したクラスで作成したオブジェクトのメモリ配置をクラス別に示す図である。クラスＡを例にとると、一般に、メソッドアドレステーブル「Ａ＿ｖｔｂｌ」をオブジェクト外に配置し、このメソッドアドレステーブルのアドレス「Ａ＿ｖｐｔｒ」のみをオブジェクト内に配置する。オブジェクト毎にメソッドアドレステーブルを配置しないので、同じクラスのオブジェクトを複数作成した場合にメモリのサイズがそれらの重複分だけ節約できる。ここで、「＆Ａ：：ｆ」はクラスＡで定義された仮想関数ｆのアドレスを表す。仮想関数ｆを呼び出す場合は、まずオブジェクト内のメソッドアドレステーブル「Ａ＿ｖｔｂｌ」のアドレス「Ａ＿ｖｐｔｒ」に基づいてこのメソッドアドレステーブル内の仮想関数のアドレス「＆Ａ：：ｆ」を読み出し、その後にこのアドレスを呼び出す事になる。
【０００７】
図１５はクラスＣの仮想関数ｈの呼び出しを含む関数ｉをＣ＋＋言語で記述した例を示す図である。ここで、ｉの引数はクラスＣのオブジェクトへのポインタである。
図１６は、図１５の関数ｉを従来のプログラム変換装置で機械語命令列に  変換した例を示す図である。関数ｉは引数であるオブジェクトへのポインタをレジスタｒ０上に保持した状態で呼び出される。
【０００８】
まず、クラスＣのオブジェクトの中の仮想関数ｈへのポインタを命令「ｍｏｖ（ｒ０＋４），ｒ１」でｒ１レジスタに転送する。次にこれを用いてメソッドアドレステーブル内のオフセット８を加算したところにある仮想関数ｈの実アドレス「＆Ｃ：：ｈ」を命令「ｍｏｖ（ｒ１＋８），ｒ１」でｒ１レジスタに転送し、命令「ｊｓｒ  ｒ１」でｒ１のアドレスへ分岐している。ここで、命令「ｍｏｖ（ｒ０＋ｄ），ｒ１」はｒ０のアドレスにｄを加算したアドレスで示されるメモリの内容をｒ１に読み出す命令を表し、命令「ｊｓｒ  ｒ１」はｒ１のアドレスに分岐するサブルーチンコール命令を表し、命令「ｒｔｓ」は関数ｉからの復帰命令を表す。
【０００９】
図１７は、上記の関数ｈが仮想関数でない関数（以下「非仮想関数」と言う）として定義されていたと仮定した場合に、関数ｈの呼び出しを含む関数ｉを機械語命令列に変換した例を示す図である。
図１６と図１７を比較すると、仮想関数の呼び出しは４命令、非仮想関数の呼び出しは２命令である。
【００１０】
【発明が解決しようとする課題】
しかしながら、上記のような従来のオブジェクト指向言語のオーバーライドメソッド呼び出しの実現方法は、オーバーライドメソッドに指定されたものは全て同様に処理するので、オーバーライド機能を使わないメソッドをオーバーライドメソッドに指定すると機械語命令列のコードサイズが大きくなり実行速度が遅くなるという問題点がある。
【００１１】
また、プログラマがオーバーライド機能を使わないメソッドの全てをオーバーライドメソッドでないメソッド（以下「非オーバーライドメソッド」と言う）に指定するのは、いちいちオーバーライド機能を使うかどうかを考慮したり、設計段階でオーバーライド機能を使うかどうかを確定できないメソッドを後で非オーバーライドメソッドに指定したりしなければならず、プログラマの負担が大きくなる。
【００１２】
さらに、ｊａｖａ言語ではメソッドがオーバーライドメソッドでないことを表すｆｉｎａｌ指定子が用意されているが、Ｃ＋＋言語ではオーバーライドメソッドでないことを表す指定子が無いので、あるメソッドをクラスＡでオーバーライドメソッドに指定すると、そのクラスＡを継承するクラスＢでそのメソッドを非オーバーライドメソッドに指定することができない。
【００１３】
そこで、本発明はかかる問題点に鑑み、オブジェクト指向言語のオーバーライドメソッド呼び出し命令のコードサイズを縮小し、実行速度を向上させるプログラム変換装置を提供することを目的とする。
【００１４】
【課題を解決するための手段】
本発明に係るプログラム変換装置は、オーバーライドメソッドを含むクラスの定義とオーバーライドメソッド呼び出し命令が含まれるオブジェクト指向言語のプログラムを機械語命令列に翻訳して実行ファイルを生成するプログラム変換装置であって、前記クラスの定義に基づいて全てのクラスの継承関係を継承関係情報として抽出する抽出手段と、全ての前記継承関係情報に基づいて前記オーバーライドメソッド呼び出し命令によって呼び出されるメソッドが属するクラスが継承されるか否かを判断する判断手段と、前記判断手段で継承されないと判断された場合に前記オーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合の機械語命令列に翻訳するメソッド翻訳手段を備えることを特徴とする。
【００１５】
本発明は，１つの入力ファイルにプログラムの実行に必要な全てのクラス定義が含まれている場合に、全てのクラスの継承関係に基づいてオーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合もしくはオーバーライドメソッドである場合のどちらかに翻訳するという方法をとる。
これによって、あるクラスが他のクラスに全く継承されない場合にそのクラスで定義されるオーバーライドメソッドがオーバーライド機能を使うことができないという性質を利用して、オーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合の命令列に翻訳することができる。即ち、間接呼び出しを直接呼び出しにすることができる。
【００１６】
また、本発明に係るプログラム変換装置は、オーバーライドメソッドを含むクラスの定義とオーバーライドメソッド呼び出し命令が含まれるオブジェクト指向言語のプログラムをファイル単位で機械語命令列に翻訳し出力ファイルとして出力する翻訳装置と、前記翻訳装置で翻訳された出力ファイルを連結して実行ファイルを生成する連結装置とを備えるプログラム変換装置であって、前記オブジェクト指向言語のプログラムにはオーバーライドメソッドを含むクラスの定義とオーバーライドメソッド呼び出し命令が含まれ、前記翻訳装置は、前記クラスの定義に基づいてファイル単位のクラスの継承関係を継承関係情報に翻訳する継承関係翻訳手段と、前記オーバーライドメソッド呼び出し命令をこの命令によって呼び出されるメソッドが属するクラスを表すメソッドクラス情報とこの命令によって呼び出されるメソッドがオーバーライドメソッドでない場合の機械語命令列を表す非オーバーライド情報とオーバーライドメソッドである場合の機械語命令列を表すオーバーライド情報とを含むメソッド命令列に翻訳するメソッド翻訳手段とを備え、前記連結装置は、前記翻訳装置で翻訳された全ての出力ファイルの中の全ての前記継承関係情報に基づいて前記オーバーライドメソッド呼び出し命令によって呼び出されるメソッドが属するクラスが継承されるか否かを判断する判断手段と、前記メソッド命令列を前記判断手段で継承されないと判断された場合にはオーバーライドメソッドでない場合の機械語命令列だけに置換し、一方、継承されると判断された場合にはオーバーライドメソッドである場合の機械語命令列だけに置換する置換手段とを備えることを特徴とする。
【００１７】
入力ファイルが複数の場合、翻訳装置ではファイル単位のクラスの継承関係が判るだけで全てのクラスの継承関係は判らない。また、従来の連結装置ではクラスの継承関係は全く判らない。
本発明は、翻訳装置でファイル単位のクラスの継承関係を継承関係情報に翻訳し、連結装置で全ての前記継承関係情報を参照するので、連結装置において全てのクラスの継承関係が判る。さらに、翻訳装置でオーバーライドメソッド呼び出し命令を、オーバーライドメソッドでない場合とオーバーライドメソッドである場合の両方の命令列に翻訳し、連結装置でどちらかを選択するという方法をとる。
【００１８】
これによって、あるクラスが他のクラスに全く継承されない場合にそのクラスで定義されるオーバーライドメソッドがオーバーライド機能を使うことができないという性質を利用して、オーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合の命令列に翻訳することができる。即ち、間接呼び出しを直接呼び出しにすることができる。
【００１９】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を用いて説明する。
図１は本発明のプログラム変換装置の構成を示す図である。便宜上、図１には入力ファイルＡ１０１、Ｂ１０２、出力ファイルＡ１０８、Ｂ１０９及び実行ファイル１１５も併せて記載している。ここで、この入力ファイルＡ１０１及びＢ１０２は高級言語で書かれたソースプログラムである。また、この出力ファイルＡ１０８及びＢ１０９は各入力ファイルを翻訳した機械語命令列である。さらに、この実行ファイル１１５はこの２つの出力ファイルを連結し、生成した機械語命令列である。なお、ここで言うファイルとは、入出力の単位となるソースプログラムや機械語命令列の集まりを指す。
【００２０】
本装置は大別すると、翻訳部１０３及び連結部１１０で構成されている。
翻訳部１０３はファイル単位で実施され、クラス定義毎にクラスの継承関係を継承関係疑似命令に翻訳し、オーバーライドメソッド呼び出し命令を、この命令によって呼び出されるメソッドが属するクラスを表すメソッドクラス疑似命令、この命令によって呼び出されるメソッドがオーバーライドメソッドでない場合の機械語命令列及びオーバーライドメソッドである場合の機械語命令列に翻訳し、その他の翻訳しなかった命令を機械語命令列に翻訳し、出力ファイルとして出力する。
【００２１】
ここでは、入力ファイルＡ１０１の入力により出力ファイルＡ１０８を、入力ファイルＢ１０２の入力により出力ファイルＢ１０９を出力する。
翻訳部１０３は、継承関係翻訳部１０４、メソッド呼び出し検出部１０５、メソッド翻訳部１０６及び命令翻訳部１０７を備えている。
継承関係翻訳部１０４はクラス定義毎に、クラスの継承関係を継承関係疑似命令に翻訳する。
【００２２】
メソッド呼び出し検出部１０５は入力ファイル内のオーバーライドメソッド呼び出し命令を検出する。
メソッド翻訳部１０６は、メソッド呼び出し検出部１０５で検出されたオーバーライドメソッド呼び出し命令をメソッド命令列に翻訳する。ここでメソッド命令列は、この命令によって呼び出されるメソッドが属するクラスを表すメソッドクラス疑似命令、この命令によって呼び出されるメソッドがオーバーライドメソッドでない場合の機械語命令列、オーバーライドメソッドである場合の機械語命令列及びこれらを識別する疑似命令の総称とする。
【００２３】
命令翻訳部１０７は、前記メソッド翻訳部１０６で翻訳しなかった命令を機械語命令列に翻訳する。
連結部１１０は翻訳部１０３で翻訳された出力ファイルの全てを、置換し連結して実行ファイルを生成する。ここでは、出力ファイルＡ１０８及びＢ１０９の入力により実行ファイル１１５を出力する。
【００２４】
連結部１１０は、メソッド命令列検出部１１１、継承クラス判定部１１２、メソッド置換部１１３及びファイル連結部１１４を備えている。
メソッド命令列検出部１１１は入力された全ての出力ファイルの中から、メソッド翻訳部１０６により翻訳されたメソッド命令列を検出する。
継承クラス判定部１１２は、メソッド命令列検出部１１１で検出されたメソッド命令列中のメソッドクラス疑似命令からそのメソッドの属するクラスを認識し、そのクラスが他のクラスに継承されるかどうかを、全ての出力ファイル中の全ての継承関係疑似命令に基づいて判定する。
【００２５】
メソッド置換部１１３は、メソッド命令列検出部１１１で検出されたメソッド命令列を、継承クラス判定部１１２によってメソッド命令列の属するクラスが継承されないクラスであると判定された場合にはオーバーライドメソッドでない場合の機械語命令列だけに置換し、逆に、継承されるクラスと判定された場合にはオーバーライドメソッドである場合の機械語命令列だけに置換し、全ての置換後全ての継承関係疑似命令を消去する。
【００２６】
ファイル連結部１１４は、メソッド置換部１１３で置換されたファイルの全てを連結して実行ファイルを生成する。
図１のように構成したプログラム作成装置の動作をＣ＋＋言語のプログラムを用いて説明する。
図２はＣ＋＋言語の仮想関数を含むクラスＸの定義、クラスＸを継承するクラスＹの定義、クラスＸを継承するクラスＺの定義、関数ｖｏｉｄ  ｉ（Ｙ＊）の定義及び関数ｖｏｉｄ  ｊ（Ｚ＊）の定義を示す図である。ここでは、図１中の入力ファイルＡ１０１に納められる。
【００２７】
図３は、図２に示したクラスの継承関係を表す図である。クラスＸはクラスＹ及びクラスＺに継承されている。
図４はＣ＋＋言語の仮想関数を含むクラスＸの定義、クラスＸを継承するクラスＹの定義、クラスＸを継承するクラスＺの定義、クラスＺを継承するクラスＷの定義及び関数ｖｏｉｄ  ｋ（Ｗ＊）の定義を示す図である。ここでは、図１中の入力ファイルＢ１０２に納められる。なお、簡単のために説明に関係しないメソッドの定義、プログラム及び以後の処理内容の表記は省略する。ただし、プログラムの実行に必要なクラスの定義はすべて表記されているものとする。
【００２８】
図５は、図４に示したクラスの継承関係を表す図である。クラスＸはクラスＹ及びクラスＺに、クラスＺはクラスＷに継承されている。
入力ファイルＡ１０１には図２に示したＣ＋＋言語のソースプログラムが、入力ファイルＢ１０２には図４に示したＣ＋＋言語のソースプログラムが納められている。
【００２９】
翻訳部１０３は図２に示した入力ファイルＡ１０１の入力により、図６で示した出力ファイルＡ１０８を出力する。
同様にして、翻訳部１０３は図４に示した入力ファイルＢ１０２の入力により、図７で示した出力ファイルＢ１０９を出力する。
連結部１１０は、図６に示した出力ファイルＡ１０８及び図７に示した出力ファイルＢ１０９の入力により、図８で示した実行ファイル１１５を出力する。
【００３０】
また、ここで用いられている機械語命令列等の意味は以下のとうりである。
．ＢＡＳＥ  ｎａｍｅ    ：  ｎａｍｅで表されるクラスが、別のクラスから継承されていることを表す継承関係疑似命令である。
＿ｉ＿ＦＰ１Ｙ          ：  関数ｖｏｉｄ  ｉ（Ｙ＊）のアドレスを表すラベルである。
【００３１】
．ＭＥＴＨＯＤ  Ｓ      ：  メソッド命令列の先頭を表す疑似命令である。
．ＣＬＡＳＳ  ｎａｍｅ  ：  メソッドの属するクラスを表すメソッドクラス疑似命令である。
ｊｓｒ  Ｌａｂｅｌ      ：  Ｌａｂｅｌで表されるアドレスに分岐するサブルーチンコール命令である。
【００３２】
＿ｈ＿１Ｙ              ：  クラスＹの仮想関数ｖｏｉｄ  ｈ（ｖｏｉｄ）のアドレスを表すラベルである。
．ＭＥＴＨＯＤ  Ｍ      ：  オーバーライドメソッドでない場合の命令列とオーバーライドメソッドである場合の命令列を区切る疑似命令である。
ｍｏｖ（ｒ０＋４），ｒ１：  ｒ０＋４をアドレスとするメモリの内容をｒ１にロードする転送命令である。
【００３３】
ｍｏｖ（ｒ１＋０），ｒ１：  ｒ１をアドレスとするメモリの内容をｒ１にロードする転送命令である。
ｊｓｒ  ｒ１            ：  レジスタｒ１に格納されたアドレスに分岐するサブルーチンコール命令である。
．ＭＥＴＨＯＤ  Ｅ      ：  メソッド命令列の終端を表す疑似命令である。
【００３４】
ｒｔｓ                  ：  関数からの復帰命令である。
＿ｊ＿ＦＰ１Ｚ          ：  関数ｖｏｉｄ  ｊ（Ｚ＊）のアドレスを表すラベルである。
＿ｈ＿１Ｚ              ：  クラスＺの仮想関数ｖｏｉｄ  ｈ（ｖｏｉｄ）のアドレスを表すラベルである。
【００３５】
＿ｋ＿ＦＰ１Ｗ          ：  関数ｖｏｉｄ  ｋ（Ｗ＊）のアドレスを表すラベルである。
＿ｈ＿１Ｗ              ：  クラスＷの仮想関数ｖｏｉｄ  ｈ（ｖｏｉｄ）のアドレスを表すラベルである。
ここから、翻訳部１０３の詳細な動作について説明する。
【００３６】
図９は翻訳部１０３の動作フローチャートを示す図である。
まず、入力ファイルＡ１０１が入力される。ここでは、図２に示したＣ＋＋言語のプログラムが入力された場合を考える（ステップ９０１）。
次に、継承関係翻訳部１０４の処理が終了したかどうかを判定する。終了してなければクラス情報を取得しに行き、終了していたらメソッド呼び出し検出部１０５の処理へ行く。ここでは、クラスＸ、クラスＹ及びクラスＺの定義毎に順次クラス情報を取得しに行き、その後メソッド呼び出し検出部１０５の処理へ行く（ステップ９０２）。
【００３７】
未処理のクラス定義がある場合は、クラス定義毎にクラス情報を取得する。ここでは、クラスＸ、クラスＹ及びクラスＺの定義毎に順次クラス情報を取得する（ステップ９０３）。
次に、取得したクラス定義毎のクラス情報からこのクラスが他のクラスを継承しているかどうかを判定する。Ｙｅｓなら継承関係を翻訳しに行き、Ｎｏなら終了判定へ戻る。ここでは、クラスＸの場合は他のクラスを継承していないので終了判定へ戻り、クラスＹ及びクラスＺの場合はクラスＸを継承しているので順次継承関係を翻訳しに行く（ステップ９０４）。
【００３８】
このクラスが他のクラスを継承している場合は、クラスの継承関係を継承関係疑似命令に翻訳する。ここでは、クラスＹ及びクラスＺがクラスＸを継承しているので継承しているクラス名を継承関係疑似命令「．ＢＡＳＥ  １Ｘ」に翻訳し、終了判定へ戻る（ステップ９０５）。なお、継承関係疑似命令は、継承されるクラスのクラス名と継承するクラスのクラス名とをペアで表すものであってもよい。この様にすると、全てのクラスの継承関係を連結装置で完全に再現できるので、全てのクラスの継承関係はもとより、オーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合の命令列に翻訳した場合にその根拠となった情報等を参照用に出力することもできる。
【００３９】
継承関係翻訳部１０４の処理が終了すると、次に、メソッド呼び出し検出部１０５の処理が終了したかどうかを判定する。終了してなければオーバーライドメソッド呼び出し命令を検出しに行き、終了していたら従来の翻訳処理へ行く。ここでは、関数「ｖｏｉｄ  ｉ（Ｙ＊）」の仮想関数呼び出し命令及び関数「ｖｏｉｄ  ｊ（Ｚ＊）」の仮想関数呼び出し命令について順次命令を検出しに行き、その後従来の翻訳処理へ行く（ステップ９０６）。
【００４０】
未処理のオーバーライドメソッド呼び出し命令がある場合は、これを検出する。ここでは、関数「ｖｏｉｄ  ｉ（Ｙ＊）」及び関数「ｖｏｉｄ  ｊ（Ｚ＊）」の仮想関数呼び出し命令を順次検出し、メソッド命令列に翻訳しに行く（ステップ９０７）。
次に、検出されたオーバーライドメソッド呼び出し命令をメソッド翻訳部１０６がメソッド命令列に翻訳する。ここでは、関数「ｖｏｉｄ  ｉ（Ｙ＊）」及び関数「ｖｏｉｄ  ｊ（Ｚ＊）」の仮想関数呼び出し命令をメソッド命令列に順次翻訳し、終了判定へ戻る（ステップ９０８）。ここで、関数「ｖｏｉｄ  ｉ（Ｙ＊）」のメソッド命令列は、図６で示される出力ファイルＡ１０８前半の「．ＭＥＴＨＯＤ  Ｓ」で始まり「．ＭＥＴＨＯＤ  Ｅ」で終了する部分である。このメソッド命令列に含まれている「．ＣＬＡＳＳ  １Ｙ」はこの命令によって呼び出されるメソッドがクラスＹに属することを表すメソッドクラス疑似命令であり、「．ＣＬＡＳＳ  １Ｙ」と「．ＭＥＴＨＯＤ  Ｍ」の間にある機械語命令列はこの命令によって呼び出されるメソッドがオーバーライドメソッドでない場合の機械語命令列であり、「．ＭＥＴＨＯＤ  Ｍ」と「．ＭＥＴＨＯＤ  Ｅ」の間にある機械語命令列はオーバーライドメソッドである場合の機械語命令列である。なお、機械語命令列を生成する方法は従来と同様なので説明を省略する。また、関数「ｖｏｉｄ  ｊ（Ｚ＊）」のメソッド命令列は関数「ｖｏｉｄ  ｉ（Ｙ＊）」と同様なので説明を省略する。
【００４１】
図１０はメソッド命令列を示す図である。
なお、メソッド命令列は常に同じ形式となるので図１０（ａ）に示すメソッド命令列を、図１０（ｂ）に示すようにメソッドクラス疑似命令及び１つのマクロ命令で表してもよいし、図１０（ｃ）に示すようにメソッドクラス疑似命令の情報も含め１つのマクロ命令で表してもよい。ここで、図１０（ｂ）でマクロ名「ｊｓｒｖ」の後ろに順に出力しているのは、オーバーライドメソッド呼び出し命令によって呼び出されるメソッドがオーバーライドメソッドでない場合に呼び出すラベル名、オーバーライドメソッドである場合に使用するオブジェクトの先頭からのオフセット値、オーバーライドメソッドである場合に使用するメソッドアドレス格納テーブルの先頭からのオフセット値及びオーバーライドメソッドである場合に使用するレジスタ名であり、図１０（ｃ）でマクロ名「ｊｓｒｗ」の後ろに順に出力しているのは、オーバーライドメソッド呼び出し命令によって呼び出されるメソッドの属するクラス名、このオーバーライドメソッド呼び出し命令によって呼び出されるメソッドがオーバーライドメソッドでない場合に呼び出すラベル名、オーバーライドメソッドである場合に使用するオブジェクトの先頭からのオフセット値、オーバーライドメソッドである場合に使用するメソッドアドレス格納テーブルの先頭からのオフセット値及びオーバーライドメソッドである場合に使用するレジスタ名である。なお、オーバーライドメソッドである場合に使用するレジスタ名は固定しておけば必ずしも必要ではない。
【００４２】
メソッド呼び出し検出部１０５の処理が終了すると、次に、メソッド翻訳部１０６で翻訳しなかった命令を命令翻訳部１０７が機械語命令列に翻訳する。なお、この処理は従来の翻訳装置が行なう処理と異ならないので詳しい説明を省略する（ステップ９０９）。
次に、出力ファイルＡ１０８を出力する。ここでは、図６に示した出力ファイルを出力する（ステップ９１０）。
【００４３】
続いて、入力ファイルＢ１０２が入力される。ここでは、図４に示したＣ＋＋言語のプログラムが入力された場合を考える（ステップ９０１）。
次に、クラスＸ、クラスＹ、クラスＺ及びクラスＷの定義毎に順次クラス情報を取得しに行き、その後メソッド呼び出し検出部１０５の処理へ行く（ステップ９０２）。
【００４４】
未処理のクラス定義がある場合は、クラスＸ、クラスＹ、クラスＺ及びクラスＷの定義毎に順次クラス情報を取得する（ステップ９０３）。
次に、クラスＸの場合は他のクラスを継承していないので終了判定へ戻り、クラスＹ及びクラスＺの場合はクラスＸを継承し、クラスＷの場合はクラスＺを継承しているので順次継承関係を翻訳しに行く（ステップ９０４）。
【００４５】
クラスＹ及びクラスＺがクラスＸを継承しているので継承しているクラス名を継承関係疑似命令「．ＢＡＳＥ  １Ｘ」に翻訳し、クラスＷがクラスＺを継承しているので継承しているクラス名を継承関係疑似命令「．ＢＡＳＥ  １Ｚ」に翻訳し、順次終了判定へ戻る（ステップ９０５）。
継承関係翻訳部１０４の処理が終了すると、次に、関数「ｖｏｉｄ  ｋ（Ｗ＊）」の仮想関数呼び出し命令について命令を検出しに行き、その後従来の翻訳処理へ行く（ステップ９０６）。
【００４６】
未処理のオーバーライドメソッド呼び出し命令がある場合は、関数「ｖｏｉｄｋ（Ｗ＊）」の仮想関数呼び出し命令を検出し、メソッド命令列に翻訳しに行く（ステップ９０７）。
次に、関数「ｖｏｉｄ  ｋ（Ｗ＊）」の仮想関数呼び出し命令をメソッド命令列に翻訳し、終了判定へ戻る（ステップ９０８）。関数「ｖｏｉｄ  ｋ（Ｚ＊）」のメソッド命令列は関数「ｖｏｉｄ  ｉ（Ｙ＊）」と同様なので説明を省略する。
【００４７】
メソッド呼び出し検出部１０５の処理が終了すると、次に、メソッド翻訳部１０６で翻訳しなかった命令を命令翻訳部１０７が機械語命令列に翻訳する。なお、この処理は従来の翻訳装置が行なう処理と異ならないので詳しい説明を省略する（ステップ９０９）。
次に、出力ファイルＢ１０９を出力する。ここでは、図７に示した出力ファイルを出力する（ステップ９１０）。
【００４８】
続いて、連結部１１０の詳細な動作について説明する。
図１１は連結部１１０の動作フローチャートを示す図である。
まず、出力ファイルＡ１０８及び出力ファイルＢ１０９が入力される。ここでは、図６に示した出力ファイル及び図４に示した出力ファイルが入力された場合を考える（ステップ１１０１）。
【００４９】
次に、メソッド命令列検出部１１１の処理が終了したかどうかを判定する。終了してなければ命令列を検出しに行き、終了していたら承継関係疑似命令を消去しに行く。ここでは、関数「ｖｏｉｄ  ｉ（Ｙ＊）」のメソッド命令列、関数「ｖｏｉｄ  ｊ（Ｚ＊）」のメソッド命令列及び関数「ｖｏｉｄ  ｋ（Ｗ＊）」のメソッド命令列について順次命令列を検出しに行き、その後承継関係疑似命令を消去しに行く（ステップ１１０２）。
【００５０】
未処理のメソッド命令列がある場合は、入力された全ての出力ファイルの中からメソッド命令列を検出する。ここでは、関数「ｖｏｉｄ  ｉ（Ｙ＊）」、関数「ｖｏｉｄ  ｊ（Ｚ＊）」及び関数「ｖｏｉｄ  ｋ（Ｗ＊）」のメソッド命令列を順次検出し、そのクラスが継承されるかを判定に行く（ステップ１１０３）。次に、検出されたメソッド命令列中のメソッドクラス疑似命令からそのメソッドの属するクラスを認識し、そのクラスが他のクラスに継承されるかどうかを、全ての出力ファイル中の全ての継承関係疑似命令に基づいて判定する。ここでは、まず、関数「ｖｏｉｄ  ｉ（Ｙ＊）」のメソッド命令列中のメソッドクラス疑似命令「．ＣＬＡＳＳ  １Ｙ」からクラスＹを認識し、全ての出力ファイル中の全ての継承関係疑似命令「．ＢＡＳＥ  １Ｘ」及び「．ＢＡＳＥ  １Ｚ」に基づいてクラスＹが他のクラスに継承されないことを判定し、オーバーライドメソッドでない場合の命令列に置換しに行き、次に、関数「ｖｏｉｄ  ｊ（Ｚ＊）」のメソッドクラス疑似命令「．ＣＬＡＳＳ  １Ｚ」からクラスＺを認識し、出力ファイルＢ１０９中の継承関係疑似命令「．ＢＡＳＥ  １Ｚ」に基づいてクラスＺが他のクラスに継承されることを判定し、オーバーライドメソッドである場合の命令列に置換しに行き、次に、関数「ｖｏｉｄ  ｋ（Ｗ＊）」のメソッド命令列中のメソッドクラス疑似命令「．ＣＬＡＳＳ  １Ｗ」からクラスＷを認識し、全ての出力ファイル中の全ての継承関係疑似命令「．ＢＡＳＥ  １Ｘ」及び「．ＢＡＳＥ  １Ｚ」に基づいてクラスＷが他のクラスに継承されないことを判定し、オーバーライドメソッドでない場合の命令列に置換しに行く（ステップ１１０４）。
【００５１】
そのメソッドの属するクラスが他のクラスに継承されないと判定された場合には、メソッド命令列検出部１１１で検出されたメソッド命令列をメソッド置換部１１３が、オーバーライドメソッドでない場合の機械語命令列だけに置換する。ここでは、関数「ｖｏｉｄ  ｉ（Ｙ＊）」のメソッド命令列を命令「ｊｓｒ  ＿ｈ＿１Ｙ」に、関数「ｖｏｉｄ  ｊ（Ｗ＊）」のメソッド命令列を命令「ｊｓｒ  ＿ｈ＿１Ｗ」に順次置換し終了判定へ戻る（ステップ１１０５）。
【００５２】
そのメソッドの属するクラスが他のクラスに継承されると判定された場合には、メソッド命令列検出部１１１で検出されたメソッド命令列をメソッド置換部１１３が、オーバーライドメソッドである場合の機械語命令列だけに置換する。ここでは、関数「ｖｏｉｄ  ｊ（Ｚ＊）」のメソッド命令列を命令「ｍｏｖ  （ｒ０＋４），ｒ１」、「ｍｏｖ  （ｒ１＋０），ｒ１」及び「ｊｓｒ  ｒ１」に置換し終了判定へ戻る（ステップ１１０６）。
【００５３】
メソッド命令列検出部１１１の処理が終了すると、次に、全ての継承関係疑似命令を、メソッド置換部１１３が消去する。ここでは、継承関係疑似命令「．ＢＡＳＥ  １Ｘ」及び「．ＢＡＳＥ  １Ｚ」を消去する（ステップ１１０７）。
次に、メソッド置換部１１３で置換されたファイルの全てを、ファイル連結部１１４が連結して実行ファイルを生成する。なお、上記のファイルを連結する処理は従来の連結装置が行なう処理と異ならないので詳しい説明を省略する（ステップ１１０８）。
【００５４】
次に、実行ファイル１１５を出力する。ここでは、図８に示した実行ファイルを出力する（ステップ１１０９）。
なお、本実施例でメソッド置換部１１３が行う処理は、図１０（ａ）に示すようにメソッド命令列がオーバーライドメソッドでない場合の命令列とオーバーライドメソッドである場合の命令列の両方をそのままの形で含んでいる場合にはこのメソッド命令列から不必要な部分を除くだけの処理となり、メソッド命令列が図１０（ｂ）（ｃ）に示すようなマクロ命令の場合にはこのマクロ命令に基づいて必要な命令列を生成する処理となる。
【００５５】
また、本実施例では翻訳装置と連結装置とを備えるとしたが、連結装置は必ずしも必要ではない。１つの入力ファイルにプログラムの実行に必要な全てのクラス定義が含まれている場合には、この入力ファイルを翻訳するだけのプログラム変換装置であってもよく、この入力ファイルは複数の入力ファイルからあらかじめ連結されて生成されたものであってもよい。この場合には、プログラム変換装置は、クラス定義で継承しているクラス名を疑似命令に翻訳したり、オーバーライドメソッド呼び出し命令をメソッド命令列に翻訳したり、メソッド命令列を置換したりする必要がなく、クラスの定義に基づいて全てのクラスの継承関係を抽出し、オーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合もしくはオーバーライドメソッドである場合のどちらかに翻訳するものであればよい。
【００５６】
また、本実施例のプログラム変換装置は本実施例を実現するプログラムを汎用のコンピュータに読み取らせることで実現可能である。従って、このプログラムを記録したコンピュータ読み取り可能な記憶媒体のみの移動により容易に譲渡される。
【００５７】
【発明の効果】
（イ）以上の説明から明かなように、本発明に係るプログラム変換装置は、オブジェクト指向言語のプログラムを機械語命令列に翻訳して実行ファイルを生成するプログラム変換装置であって、前記オブジェクト指向言語のプログラムにはオーバーライドメソッドを含むクラスの定義とオーバーライドメソッド呼び出し命令が含まれ、前記クラスの定義に基づいて全てのクラスの継承関係を継承関係情報として抽出する抽出手段と、全ての前記継承関係情報に基づいて前記オーバーライドメソッド呼び出し命令によって呼び出されるメソッドが属するクラスが継承されるか否かを判断する判断手段と、前記判断手段で継承されないと判断された場合に前記オーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合の機械語命令列に翻訳するメソッド翻訳手段を備えることを特徴とする。
【００５８】
本発明は，１つの入力ファイルにプログラムの実行に必要な全てのクラス定義が含まれている場合に、全てのクラスの継承関係に基づいてオーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合もしくはオーバーライドメソッドである場合のどちらかに翻訳するという方法をとる。
これによって、あるクラスが他のクラスに全く継承されない場合にそのクラスで定義されるオーバーライドメソッドがオーバーライド機能を使うことができないという性質を利用して、オーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合の命令列に翻訳することができる。即ち、間接呼び出しを直接呼び出しにすることができる。
【００５９】
従って、この分だけオーバーライドメソッド呼び出し命令のコードサイズが縮小でき、実行速度が向上する。
（ロ）また、本発明に係るプログラム変換装置は、オブジェクト指向言語のプログラムをファイル単位で機械語命令列に翻訳し出力ファイルとして出力する翻訳装置と、前記翻訳装置で翻訳された出力ファイルを連結して実行ファイルを生成する連結装置とを備えるプログラム変換装置であって、前記オブジェクト指向言語のプログラムにはオーバーライドメソッドを含むクラスの定義とオーバーライドメソッド呼び出し命令が含まれ、前記翻訳装置は、前記クラスの定義に基づいてファイル単位のクラスの継承関係を継承関係情報に翻訳する継承関係翻訳手段と、前記オーバーライドメソッド呼び出し命令をこの命令によって呼び出されるメソッドが属するクラスを表すメソッドクラス情報とこの命令によって呼び出されるメソッドがオーバーライドメソッドでない場合の機械語命令列を表す非オーバーライド情報とオーバーライドメソッドである場合の機械語命令列を表すオーバーライド情報とを含むメソッド命令列に翻訳するメソッド翻訳手段とを備え、前記連結装置は、前記翻訳装置で翻訳された全ての出力ファイルの中の全ての前記継承関係情報に基づいて前記オーバーライドメソッド呼び出し命令によって呼び出されるメソッドが属するクラスが継承されるか否かを判断する判断手段と、前記メソッド命令列を前記判断手段で継承されないと判断された場合にはオーバーライドメソッドでない場合の機械語命令列だけに置換し、一方、継承されると判断された場合にはオーバーライドメソッドである場合の機械語命令列だけに置換する置換手段とを備えることを特徴とする。
【００６０】
入力ファイルが複数の場合、翻訳装置ではファイル単位のクラスの継承関係が判るだけで全てのクラスの継承関係は判らない。また、従来の連結装置ではクラスの継承関係は全く判らない。
本発明は、翻訳装置でファイル単位のクラスの継承関係を継承関係情報に翻訳し、連結装置で全ての前記継承関係情報を参照するので、連結装置において全てのクラスの継承関係が判る。さらに、翻訳装置でオーバーライドメソッド呼び出し命令を、オーバーライドメソッドでない場合とオーバーライドメソッドである場合の両方の命令列に翻訳し、連結装置でどちらかを選択するという方法をとる。
【００６１】
これによって、あるクラスが他のクラスに全く継承されない場合にそのクラスで定義されるオーバーライドメソッドがオーバーライド機能を使うことができないという性質を利用して、オーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合の命令列に翻訳することができる。即ち、間接呼び出しを直接呼び出しにすることができる。
【００６２】
従って、この分だけオーバーライドメソッド呼び出し命令のコードサイズが縮小でき、実行速度が向上する。
（ハ）また、本発明に係るプログラム変換装置は前記（ロ）のプログラム変換装置において、前記メソッド翻訳手段は、前記非オーバーライド命令と、前記オーバーライド命令とを１つのマクロ命令で表すことを特徴とする。
【００６３】
これによって、命令数が減少する。
従って、翻訳装置から出力される出力ファイルのファイルサイズが縮小でき、前記連結装置の実行速度が向上する。
（ニ）また、本発明に係るプログラム変換装置は前記（ロ）のプログラム変換装置において、前記メソッド翻訳手段は、前記メソッドクラス情報と、前記非オーバーライド命令と、前記オーバーライド命令とを１つのマクロ命令で表すことを特徴とする。
【００６４】
これによって、前記メソッドクラス情報の命令も不要となり、命令数が減少する。また、マクロ命令が１行なので従来の連結装置が行う命令の書式と類似している。
従って、翻訳装置から出力される出力ファイルのファイルサイズが縮小でき、前記連結装置の実行速度が向上し、また、前記連結装置の追加変更を少なくすることができる。
【００６５】
（ホ）また、本発明に係るプログラム変換装置は前記（ニ）のプログラム変換装置において、前記マクロ命令は、マクロ名と、前記メソッドクラス情報と、オーバーライドメソッドでない場合に呼び出すラベル名と、オーバーライドメソッドである場合に使用するオブジェクトの先頭からのオフセット値と、オーバーライドメソッドである場合に使用するメソッドアドレス格納テーブルの先頭からのオフセット値で構成されることを特徴とする。
【００６６】
これによって、このマクロ命令の書式は従来の連結装置が行う命令の書式と類似する。
従って、前記連結装置の追加変更を少なくすることができる。
（ヘ）また、本発明に係るプログラム変換装置は前記（イ）、（ロ）、（ハ）、（ニ）又は（ホ）のプログラム変換装置において、前記継承関係情報は、クラスの定義において他のクラスに継承されているクラス名を表す情報であることを特徴とする。
【００６７】
これによって、複数のクラスが同じクラスを継承している場合に、前記継承関係情報は複数必要なく、１つを共用することができる。
従って、翻訳装置から出力される出力ファイルのファイルサイズが縮小でき、前記連結装置の実行速度が向上する。
（ト）また、本発明に係るプログラムを記録したコンピュータ読み取り可能な記憶媒体は、オブジェクト指向言語のプログラムを機械語命令列に翻訳して実行ファイルを生成するプログラムを記録したコンピュータ読み取り可能な記憶媒体であって、前記オブジェクト指向言語のプログラムにはオーバーライドメソッドを含むクラスの定義とオーバーライドメソッド呼び出し命令が含まれ、前記クラスの定義に基づいて全てのクラスの継承関係を継承関係情報として抽出する抽出手順と、全ての前記継承関係情報に基づいて前記オーバーライドメソッド呼び出し命令によって呼び出されるメソッドが属するクラスが継承されるか否かを判断する判断手順と、前記判断手順で継承されないと判断された場合に前記オーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合の機械語命令列に翻訳するメソッド翻訳手順を備えることを特徴とする。
【００６８】
本発明は，１つの入力ファイルにプログラムの実行に必要な全てのクラス定義が含まれている場合に、全てのクラスの継承関係に基づいてオーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合もしくはオーバーライドメソッドである場合のどちらかに翻訳するという方法をとる。
これによって、あるクラスが他のクラスに全く継承されない場合にそのクラスで定義されるオーバーライドメソッドがオーバーライド機能を使うことができないという性質を利用して、オーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合の命令列に翻訳することができる。即ち、間接呼び出しを直接呼び出しにすることができる。
【００６９】
従って、この分だけオーバーライドメソッド呼び出し命令のコードサイズが縮小でき、実行速度が向上する。
（チ）また、本発明に係るプログラムを記録したコンピュータ読み取り可能な記憶媒体は、オブジェクト指向言語のプログラムをファイル単位で機械語命令列に翻訳し出力ファイルとして出力する翻訳手順と前記翻訳手順で翻訳された出力ファイルを連結して実行ファイルを生成する連結手順とを備えるプログラムを記録したコンピュータ読み取り可能な記憶媒体であって、前記オブジェクト指向言語のプログラムにはオーバーライドメソッドを含むクラスの定義とオーバーライドメソッド呼び出し命令が含まれ、前記翻訳手順は、前記クラスの定義に基づいてファイル単位のクラスの継承関係を継承関係情報に翻訳する継承関係翻訳手順と、前記オーバーライドメソッド呼び出し命令をこの命令によって呼び出されるメソッドが属するクラスを表すメソッドクラス情報とこの命令によって呼び出されるメソッドがオーバーライドメソッドでない場合の機械語命令列を表す非オーバーライド情報とオーバーライドメソッドである場合の機械語命令列を表すオーバーライド情報とを含むメソッド命令列に翻訳するメソッド翻訳手順とを備え、前記連結手順は、前記翻訳手順で翻訳された全ての出力ファイルの中の全ての前記継承関係情報に基づいて前記オーバーライドメソッド呼び出し命令によって呼び出されるメソッドが属するクラスが継承されるか否かを判断する判断手順と、前記メソッド命令列を前記判断手順で継承されないと判断された場合にはオーバーライドメソッドでない場合の機械語命令列だけに置換し、一方、継承されると判断された場合にはオーバーライドメソッドである場合の機械語命令列だけに置換する置換手順とを備えることを特徴とする。
【００７０】
入力ファイルが複数の場合、翻訳手順ではファイル単位のクラスの継承関係が判るだけで全てのクラスの継承関係は判らない。また、従来の連結手順ではクラスの継承関係は全く判らない。
本発明は、翻訳手順でファイル単位のクラスの継承関係を継承関係情報に翻訳し、連結手順で全ての前記継承関係情報を参照するので、連結手順において全てのクラスの継承関係が判る。さらに、翻訳手順でオーバーライドメソッド呼び出し命令を、オーバーライドメソッドでない場合とオーバーライドメソッドである場合の両方の命令列に翻訳し、連結手順でどちらかを選択するという方法をとる。
【００７１】
これによって、あるクラスが他のクラスに全く継承されない場合にそのクラスで定義されるオーバーライドメソッドがオーバーライド機能を使うことができないという性質を利用して、オーバーライドメソッド呼び出し命令をオーバーライドメソッドでない場合の命令列に翻訳することができる。即ち、間接呼び出しを直接呼び出しにすることができる。
【００７２】
従って、この分だけオーバーライドメソッド呼び出し命令のコードサイズが縮小でき、実行速度が向上する。
【図面の簡単な説明】
【図１】本発明のプログラム変換装置の構成を示す図である
【図２】入力ファイルＡ１０１に納められる、Ｃ＋＋言語の仮想関数を含むクラスＸの定義、クラスＸを継承するクラスＹの定義、クラスＸを継承するクラスＺの定義、関数ｖｏｉｄ  ｉ（Ｙ＊）の定義及び関数ｖｏｉｄ  ｊ（Ｚ＊）の定義を示す図である。
【図３】図２に示したクラスの継承関係を表す図である。
【図４】入力ファイルＢ１０２に納められる、Ｃ＋＋言語の仮想関数を含むクラスＸの定義、クラスＸを継承するクラスＹの定義、クラスＸを継承するクラスＺの定義、クラスＺを継承するクラスＷの定義及び関数ｖｏｉｄ  ｋ（Ｗ＊）の定義を示す図である。
【図５】図４に示したクラスの継承関係を表す図である。
【図６】図２に示した入力ファイルＡ１０１の入力により、翻訳部１０３が出力する出力ファイルＡ１０８を示す図である。
【図７】図４に示した入力ファイルＢ１０２の入力により、翻訳部１０３が出力する出力ファイルＢ１０９を示す図である。
【図８】図６に示した出力ファイルＡ１０８及び図７に示した出力ファイルＢ１０９の入力により、連結部１１０が出力する実行ファイル１１５を示す図である。
【図９】翻訳部１０３の動作フローチャートを示す図である。
【図１０】図１０（ａ）はメソッド命令列を示す図である。図１０（ｂ）はメソッド命令列をメソッドクラス疑似命令及び１つのマクロ命令で表した図である。図１０（ｃ）はメソッド命令列をメソッドクラス疑似命令の情報も含め１つのマクロ命令で表した図である。
【図１１】連結部１１０の動作フローチャートを示す図である。
【図１２】Ｃ＋＋言語の仮想関数を含むクラス定義を示す図である。
【図１３】図１２に示したクラスの継承関係を表す図である。
【図１４】図１２に示したクラスで作成したオブジェクトのメモリ配置をクラス別に示す図である。
【図１５】クラスＣの仮想関数ｈの呼び出しを含む関数ｉをＣ＋＋言語で記述した例を示す図である。
【図１６】図１５の関数ｉを従来のプログラム変換装置で機械語命令列に  変換した例を示す図である。
【図１７】上記の関数ｈが非仮想関数として定義されていたと仮定した場合に、関数ｈの呼び出しを含む関数ｉを機械語命令列に変換した例を示す図である。
【符号の説明】
１０１    入力ファイルＡ
１０２    入力ファイルＢ
１０３    翻訳部
１０４    継承関係翻訳部
１０５    メソッド呼び出し検出部
１０６    メソッド翻訳部
１０７    命令翻訳部
１０８    出力ファイルＡ
１０９    出力ファイルＢ
１１０    連結部
１１１    メソッド命令列検出部
１１２    継承クラス判定部
１１３    メソッド置換部
１１４    ファイル連結部
１１５    実行ファイル
【図１】
0003672207.tif 000002
【図２】
0003672207.tif 000003
【図３】
0003672207.tif 000004
【図４】
0003672207.tif 000005
【図５】
0003672207.tif 000006
【図６】
0003672207.tif 000007
【図７】
0003672207.tif 000008
【図８】
0003672207.tif 000009
【図９】
0003672207.tif 000010
【図１０】
0003672207.tif 000011
【図１１】
0003672207.tif 000012
【図１２】
0003672207.tif 000013
【図１３】
0003672207.tif 000014
【図１４】
0003672207.tif 000015
【図１５】
0003672207.tif 000016
【図１６】
0003672207.tif 000017
【図１７】
0003672207.tif 000018