(57)【特許請求の範囲】
【請求項１】
オブジェクト指向言語で記述されたソースプログラムを機械語プログラムに変換するプログラム変換装置であって、
前記ソースプログラムにおけるオブジェクトを生成するためのオブジェクト生成文であってオブジェクト生成関数を呼び出すオブジェクト生成文を特定する特定手段と、
前記特定手段により特定されたオブジェクト生成文によってオブジェクト生成関数が呼び出されたと仮定した場合における当該呼出によって、当該オブジェクト生成文により生成されるべきオブジェクトのメンバ変数に対し定数値を設定すること以外の動作が行われるか否かを判断する判断手段と、
前記判断手段により肯定的な判断がなされた場合に、前記オブジェクト生成文を前記生成関数を呼び出すコードに変換する第１変換手段と、
前記判断手段により否定的な判断がなされた場合に、前記呼出によって前記メンバ変数に対して設定される値を算出するメンバ変数値算出手段と、
前記メンバ変数算出手段により前記値の算出なされたときに、前記オブジェクト生成文を、前記メンバ変数値算出手段により算出された値をもつデータであってオブジェクトのメンバ変数と同じサイズのデータのみに変換する第２変換手段と
を備えることを特徴とするプログラム変換装置。
【請求項２】
前記判断手段は、
前記オブジェクト生成文により呼び出されるオブジェクト生成関数が他の関数を呼び出すものではない場合であって、当該オブジェクト生成関数によって前記オブジェクトのメンバ変数に設定される値が、定数と当該オブジェクト生成関数の定義中の仮引数とで構成される式又は前記仮引数により表現できる場合に、前記メンバ変数に設定される値を前記式又は前記仮引数により表現した仮メンバ変数値式を生成する仮メンバ変数値式生成部と、前記仮メンバ変数値式生成部により仮メンバ変数値式が生成されている場合に、前記仮メンバ変数値式における仮引数を、前記オブジェクト生成文中の実引数に置換した実メンバ変数値式を生成する実メンバ変数値式生成部と、
前記実メンバ変数値式生成部により生成された実メンバ変数値式が定数値であることを検出する定数値検出部とを有し、
前記判断手段は、前記定数値検出部により前記実メンバ変数値式が定数値であることが検出されたときに、否定的に前記判断をなすことを特徴とする請求項１記載のプログラム変換装置。
【請求項３】
前記判断手段は、前記特定手段により特定されたオブジェクト生成文により呼び出されるオブジェクト生成関数の定義に、メンバ変数に値を設定する代入文以外の文が含まれているときに、肯定的に前記判断をなすことを特徴とする請求項１記載のプログラム変換装置。
【請求項４】
前記判断手段は、前記特定手段により特定されたオブジェクト生成文により呼び出されるオブジェクト生成関数の定義に、さらに第２のオブジェクト生成文が含まれている場合には、当該第２のオブジェクト生成文によって第２のオブジェクト生成関数が呼び出されたと仮定したときに、当該呼出によって、当該第２のオブジェクト生成文により生成されるべきオブジェクトのメンバ変数に対し定数値を設定すること以外の動作が行われないならば、当該第２のオブジェクト生成文を、前記代入文と等価なものとみなして前記判断をなすことを特徴とする請求項３記載のプログラム変換装置。
【請求項５】
前記オブジェクト指向言語はＣ＋＋言語であり、
前記オブジェクト生成関数は、コンストラクタ初期設定子と関数本体とで構成されるコンストラクタであり、前記判断手段は、前記特定手段により特定されたオブジェクト生成文によって呼び出されるコンストラクタの関数本体が空文以外のときに、肯定的に前記判断をなすことを特徴とする請求項１記載のプログラム変換装置。
【請求項６】
前記プログラム変換装置はさらに、前記特定手段により特定されたオブジェクト生成文が、生成後に値の変化しないオブジェクトを生成するものであるか否かを判断する変化要否判断手段を備え、
前記変換手段は、前記変化要否判断手段により肯定的な判断がなされたときに、前記オブジェクト生成文をＲＯＭ領域に配置されるべき属性を有するデータに変換し、
前記変化要否判断手段により否定的な判断がなされたときに、前記オブジェクト生成文をＲＡＭ領域に配置されるべき属性を有するデータに変換することを特徴とする
請求項１〜５のいずれか１項に記載のプログラム変換装置。
【請求項７】
オブジェクト指向言語で記述されたソースプログラムを機械語プログラムに変換するプログラム変換処理を、コンピュータに実行させるための制御プログラムを記録した記録媒体であって、前記制御プログラムは、コンピュータに、
前記ソースプログラムにおけるオブジェクトを生成するためのオブジェクト生成文であってオブジェクト生成関数を呼び出すオブジェクト生成文を特定する特定ステップと、
前記特定ステップにより特定されたオブジェクト生成文によってオブジェクト生成関数が呼び出されたと仮定した場合における当該呼出によって、当該オブジェクト生成文により生成されるべきオブジェクトのメンバ変数に対し定数値を設定すること以外の動作が行われるか否かを判断する判断ステップと、
前記判断ステップにより肯定的な判断がなされた場合に、前記オブジェクト生成文を前記生成関数を呼び出すコードに変換する第１変換ステップと、
前記判断ステップにより否定的な判断がなされた場合に、前記呼出によって前記メンバ変数に対して設定される値を算出するメンバ変数値算出ステップと、前記メンバ変数値算出ステップにより前記値の算出がなされた場合に、前記オブジェクト生成文を、前記メンバ
変数値算出ステップにより算出された値をもつデータであってオブジェクトのメンバ変数と同じサイズのデータのみに変換する第２変換ステップとを実行させることを特徴とする記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ソースプログラムを機械語命令列に変換するプログラム変換装置に関し、特にオブジェクト生成文を含むオブジェクト指向言語のソースプログラムを変換対象とするプログラム変換装置に関する。
【０００２】
【従来の技術】
オブジェクト指向言語において、オブジェクト（インスタンス）は、使用する前に生成する必要があり、オブジェクト生成文により生成される。
また、オブジェクト生成関数は、オブジェクトのメンバ関数であり、オブジェクトが生成される際に実行されるものである。
従って、オブジェクト生成文は、オブジェクトを生成するための文であると同時に、オブジェクト生成関数を呼び出す意味も有する。
なお、オブジェクト生成関数は、通常、オブジェクトのメンバ変数を初期化する処理等を行うように設計される。
以下、オブジェクト指向言語Ｃ＋＋（以下、「Ｃ＋＋言語」という。）で記述されたソースプログラムを機械語に翻訳（変換）する従来のプログラム変換装置の説明を行なう。
図１は、オブジェクト生成関数を含むクラスＸのクラス定義とクラスＸのオブジェクトを生成するオブジェクト生成文とからなるＣ＋＋言語のソースプログラムの一部を示す図である。
Ｃ＋＋言語では、オブジェクト生成関数はコンストラクタと呼ばれ、クラス名と同じ名前の関数で表される。ここでは、「Ｘ（ｉｎｔ  ａ，ｉｎｔ  ｂ）」がクラスＸのオブジェクト生成関数である。
【０００３】
また、Ｃ＋＋言語では、オブジェクト生成文は、オブジェクトの宣言文として記述され、ここでは、オブジェクトの宣言文「ｃｏｎｓｔ  Ｘ  ｏｂｊ（２，３）；」がクラスＸのオブジェクト「ｏｂｊ」を生成する意味を有する文である。
このオブジェクトの宣言文において「ｏｂｊ」の後の「（２，３）」は、オブジェクト生成関数に渡す実引数である。
また、「ｃｏｎｓｔ  Ｘ  ｏｂｊ（２，３）」の先頭の修飾子「ｃｏｎｓｔ」は生成されるオブェクトが値の変化しないオブジェクトであることを表している。以下、このような値の変化しないオブジェクトを、ｃｏｎｓｔオブジェクトという。
なお、このオブジェクト「ｏｂｊ」は、関数や他のオブジェクトから参照可能な大域的なオブジェクトであるため、このソースプログラムが機械語に翻訳されて実行される段階においては、必ずメモリに確保されるものである。
プログラム変換装置は、ソースプログラムを機械語に翻訳をするいわゆるコンパイラであり、ソースプログラムを参照することにより、特定のプロセッサ上で実行可能な機械語プログラムを生成する。
ソースプログラム中のデータは、ＲＡＭ領域に配置されるべき属性を有するデータ又はＲＯＭ領域に配置されるべき属性を有するデータに翻訳され、ソースプログラム中の各手続きは、ＲＯＭ領域に配置されるべき属性を有するコードに翻訳される。
ここで、ＲＡＭ領域とは読み書き可能なメモリ領域をいい、ＲＯＭ領域とは読み出しのみが可能なメモリ領域をいう。
プログラム変換装置によって出力された機械語プログラムは、特定のプロセッサ上においてオペレーティングシステムの制御下で、コードやデータがそれぞれの配置属性に基づきＲＯＭ領域やＲＡＭ領域に配置された後に、実行されることになる。
従来のプログラム変換装置は、図１に示すようなオブジェクト生成文をオブジェクトデータとオブジェクト生成関数を呼び出すサブルーチンコール命令とに翻訳する。
ここで、オブジェクトデータとは、オブジェクトのメンバ変数の集合をいう。
なお、従来のプログラム変換装置は、上述のサブルーチンコール命令をＲＯＭ領域に配置されるべき属性を有するコードとして生成し、オブジェクトデータについては、常にＲＡＭ領域に配置されるべき属性を有するデータとして生成する。
かかるオブジェクトデータが常にＲＡＭ領域に配置されるべき属性を有するデータとして生成される理由は、オブジェクトが生成されるときに実行されるオブジェクト生成関数の動作によって、オブジェクトのメンバ変数に対して動的に値が設定される得るからである。このことは、生成されるオブジェクトがｃｏｎｓｔオブジェクトであっても変わらない。
【０００４】
図１４は、従来のプログラム変換装置が図１に示したオブジェクト生成文を翻訳した結果である機械語命令列を示す図である。
これは、従来のプログラム変換装置がソースプログラムに基づいて生成する機械語プログラムの一部に相当する。
なお、同図では、わかり易くするため機械語をニモニックコードで示しており、また、簡単のためにオブジェクト生成関数についての変換結果は省略している。
ここで、「．ｓｅｃｔｉｏｎ  ＲＡＭＡＲＥＡ」から「．ｓｅｃｔｉｏｎ  ＥＮＤ」に挟まれた部分は、ＲＡＭ領域に配置される属性のデータを表し、「ｏｂｊ：１２」は、オブジェクトｏｂｊが１２バイトのサイズであることを表している。
従って、機械語プログラムが実行される時には、ＲＡＭ領域に１２バイトの領域が確保されることになる。
また、「．ｓｅｃｔｉｏｎ  ＴＥＸＴ」から「．ｓｅｃｔｉｏｎ  ＥＮＤ」に挟まれた部分は、ＲＯＭ領域に配置される属性のコードを表し、「ｍｏｖ  ＆ｏｂｊ，Ｒ０」は、オブジェクトｏｂｊのアドレスをレジスタＲ０に格納する命令を表し、「ｍｏｖ  ＃２，Ｒ１」、「ｍｏｖ  ＃３，Ｒ２」は、それぞれ実引数２、３を、レジスタＲ１、Ｒ２に格納する機械語命令を表し、「ｃａｌｌ  Ｘ」は、オブジェクト生成関数を呼び出すサブルーチンコール命令を表している。
このように、従来のプログラム変換装置は、ソースプログラム中のオブジェクト生成文を、無条件にオブジェクト生成関数を呼び出すためのコードと、ＲＡＭ領域に配置される属性のオブジェクトデータとに翻訳する。
【０００５】
【発明が解決しようとする課題】
一般に、機械語プログラムのコードサイズが大きければ、このプログラムの実行には容量の大きなメモリが必要になり、実行に要するコストが高くなる。
従って、コスト面からは機械語プログラムのコードサイズは小さい方が望ましい。
また、家電機器等への組み込み用マイクロコンピュータの分野においては、ＲＡＭのコストは、ＲＯＭのコストより高く、ＲＯＭの４倍以上のコストがかかる場合もある。
従って、可能な限り多くのデータを、ＲＡＭ領域ではなく、ＲＯＭ領域に配置される属性にすることは、コスト削減につながる。
そこで、本発明は、機械語プログラムのコードサイズを削減し、又は、ＲＡＭ領域に配置される属性のデータを削減することにより、オブジェクト指向言語で記述されたソースプログラムを実行コストの低い機械語プログラムに変換するプログラム変換装置を提供することを目的とする。
【０００６】
【課題を解決するための手段】
＜着眼点＞
上記課題を解決するために、本発明は、オブジェクト生成関数の動作内容が、機械語プログラムの実行時ではなく、プログラム変換装置による翻訳時に定まる場合がある点に着目してなされた。
大域的なオブジェクトを生成する旨のオブジェクト生成文により呼び出されることになっているオブジェクト生成関数が、オブジェクトのメンバ変数への定数値の設定以外の動作を行わないものである場合は、翻訳時に予めこのオブジェクト生成関数の動作結果となるオブジェクトのメンバ変数の集合であるオブジェクトデータを算出して、このオブジェクトデータをオブジェクト生成文の翻訳結果とすれば足りる。
これにより、本発明に係るプログラム変換装置は、オブジェクト生成関数の動作内容が所定のものである場合に、大域的なオブジェクトを生成する旨のオブジェクト生成文をオブジェクトデータのみに翻訳することができる。従って、従来のプログラム変換装置がオブジェクト生成文を無条件にオブジェクト生成関数を呼び出すためのコードとオブジェクトデータとに翻訳するのに対し、本発明に係るプログラム変換装置は、生成する機械語プログラムのコードサイズを削減するものであるといえる。
また、上述のように、オブジェクト生成関数の動作内容が所定のものである場合に、オブジェクト生成文を、オブジェクトデータのみに翻訳することができるのであれば、生成されるオブジェクトがｃｏｎｓｔオブジェクトであるときに、このオブジェクトデータが格納されるメモリ領域は一切更新されないこととなる。
これにより、本発明に係るプログラム変換装置は、オブジェクト生成関数の動作内容が所定のものである場合に、大域的なｃｏｎｓｔオブジェクトを生成する旨のオブジェクト生成文をＲＯＭ領域に配置されるべき属性のデータに翻訳することができる。従って、従来のプログラム変換装置がｃｏｎｓｔオブジェクトを必ずＲＡＭ領域に配置されるべき属性のデータに翻訳するのに対し、本発明に係るプログラム変換装置は、ＲＡＭ領域に配置される属性のデータを削減するものであるといえる。
【０００７】
＜構成＞上記課題を解決するために、本発明に係るプログラム変換装置は、オブジェクト指向言語で記述されたソースプログラムを機械語プログラムに変換するプログラム変換装置であって、前記ソースプログラムにおけるオブジェクトを生成するためのオブジェクト生成文であってオブジェクト生成関数を呼び出すオブジェクト生成文を特定する特定手段と、前記特定手段により特定されたオブジェクト生成文によってオブジェクト生成関数が呼び出されたと仮定した場合における当該呼出によって、当該オブジェクト生成文により生成されるべきオブジェクトのメンバ変数に対し定数値を設定すること以外の動作が行われるか否かを判断する判断手段と、前記判断手段により否定的な判断がなされた場合に、前記呼出によって前記メンバ変数に対して設定される値を算出するメンバ変数値算出手段と、前記メンバ変数算出手段により前記値の算出なされたときに、前記オブジェクト生成文を、前記メンバ変数値算出手段により算出された値をもつデータであってオブジェクトのメンバ変数と同じサイズのデータのみに変換する変換手段とを備えることを特徴とする。
【０００８】
上記構成の説明中、「メンバ変数に対し定数値を設定すること」とは、演算処理（判断、分岐を含む）の実行の結果として定数値をメンバ変数に設定することである。また、上記構成の説明中、「オブジェクト生成文によってオブジェクト生成関数が呼び出されたと仮定した場合における」とは、オブジェクト生成関数の現実の実行を仮想した場合をいう。従って、「当該呼出」による動作内容は、呼び出されるオブジェクト生成関数がオブジェクト生成文から渡される引数があるならばその引数の値によって特定されるものであり、また、呼び出されるオブジェクト生成関数からさらに呼び出される関数があれば、これら全ての関数における全ての処理によって特定されるものである。上記構成により、オブジェクトの生成文を直接オブジェクト生成関数呼出し後の値のオブジェクトデータに変換するのみであって、オブジェクト生成関数を呼び出す旨のサブルーチンコール命令に変換しないため、本発明に係るプログラム変換装置は、結果的に前記サブルーチンコール命令に必要なコードのサイズだけ小さな機械語プログラムを生成する。また、前記プログラム変換装置はさらに、前記特定手段により特定されたオブジェクト生成文が、生成後に値の変化しないオブジェクトを生成するものであるか否かを判断する変化要否判断手段を備え、前記変換手段は、前記変化要否判断手段により肯定的な判断がなされたときに、前記オブジェクト生成文をＲＯＭ領域に配置されるべき属性を有するデータに変換し、前記変化要否判断手段により否定的な判断がなされたときに、前記オブジェクト生成文をＲＡＭ領域に配置されるべき属性を有するデータに変換することとすることもできる。これにより、ｃｏｎｓｔオブジェクトを生成するためのオブジェクト生成文を、一定条件下で、ＲＯＭ領域に配置されるべき属性のデータに変換する。従って、結果的に機械語プログラムの実行に際して必要となるＲＡＭ領域を縮小することができる。
【０００９】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を用いて説明する。
＜構成＞
図２は本発明のプログラム変換装置１００の構成を示す図である。
プログラム変換装置１００は、コンピュータに備えられたメモリに格納されたプログラムがＣＰＵにより実行されることで、ソースプログラムを機械語プログラムに翻訳（変換）する動作を行ういわゆるコンパイラであり、機能的には、制御部１０２、仮初期値式生成部１０３、仮初期値式記憶部１０４、実初期値式生成部１０５、実初期値式記憶部１０６、オブジェクト生成文翻訳部１０７及び一般文翻訳部１０８から構成される。
コンピュータに備えられたメモリに格納されたプログラムにおいて、制御部１０２は、メインルーチンに相当し、仮初期値式生成部１０３、実初期値式生成部１０５、オブジェクト生成文翻訳部１０７及び一般文翻訳部１０８はサブルーチンに相当する。
同図には、プログラム変換装置１００の他に入力ファイル１０１及び出力ファイル１０９も記載している。
ここで、入力ファイル１０１にはオブジェクト指向言語で記述されたソースプログラムが格納されている。また、出力ファイル１０９には、プログラム変換装置１００が入力ファイル１０１を翻訳した結果として生成する機械語命令列が格納される。
制御部１０２は、入力ファイル１０１からメモリにソースプログラムを読み込み、ソースプログラム中の各文に逐次着目して、着目した文の種類により、処理を振り分ける。即ち、制御部１０２は、着目した文の種類に応じて、仮初期値式生成部１０３、実初期値式生成部１０５、オブジェクト生成文翻訳部１０７又は一般文翻訳部１０８を起動する。
ここで、着目とは、処理対象とすること、即ち、処理をするためにポインタ等により所在を特定することをいう。
【００１０】
仮初期値式生成部１０３は、制御部１０２に起動され、後述する仮初期値式生成処理を行う部分である。即ち、仮初期値式生成部１０３は、オブジェクト生成関数の定義に着目し、仮初期値式を生成し、生成できた場合にはオブジェクト生成関数の名称と仮初期値式との組を仮初期値式記憶部１０４に記憶する。
ここで、仮初期値式は、オブジェクト生成関数と対応するオブジェクトのそれぞれのメンバ変数を、オブジェクト生成関数の仮引数と定数のみで表現した式である。仮初期値式について具体的には後述する。
また、オブジェクト生成関数の名称は、オブジェクト名及び仮引数の数に関する情報を含む。
仮初期値式記憶部１０４は、メモリ中の特定の領域である。
実初期値式生成部１０５は、制御部１０２により起動され、後述する実初期値式生成処理を行う部分である。即ち、実初期値式生成部１０５は、オブジェクト生成文に着目し、オブジェクト生成文によって呼び出されることになっているオブジェクト生成関数の名称と仮初期値式との組が仮初期値式記憶部１０４に記憶されている場合に、この仮初期値式の仮引数をオブジェクト生成文に含まれる実引数に置き換えた実初期値式を生成し、この実初期値式が定数となった場合には、着目しているオブジェクト生成文を特定する情報と実初期値式との組を実初期値式記憶部１０６に記憶する。
実初期値式記憶部１０６は、メモリ中の特定の領域である。
【００１１】
オブジェクト生成文翻訳部１０７は、制御部１０２により起動され、後述するオブジェクト生成文翻訳処理を行う部分である。即ち、オブジェクト生成文翻訳部１０７は、オブジェクト生成文に着目し、そのオブジェクト生成文を特定する情報と実初期値式との組が実初期値式記憶部１０６に記憶されていた場合、オブジェクト生成文がｃｏｎｓｔオブジェクトを生成する文であるときには、着目したオブジェクト生成文を、ＲＯＭ領域に配置されるべき属性のオブジェクトデータに翻訳し、ｃｏｎｓｔオブジェクトを生成する文でないときには、ＲＡＭ領域に配置されるべき属性のオブジェクトデータに翻訳し、翻訳結果を出力ファイル１０９に出力する。また、オブジェクト生成文翻訳部１０７は、着目したオブジェクト生成文を特定する情報と実初期値式との組が実初期値式記憶部１０６に記憶されていないときには、着目したオブジェクト生成文を、ＲＡＭ領域に配置されるべき属性のオブジェクトデータとオブジェクト生成関数を呼び出すサブルーチンコール命令の機械語命令列からなるコードとに翻訳し、出力ファイル１０９に出力する。
一般文翻訳部１０８は、制御部１０２により起動され、一般文翻訳処理を行う部分である。即ち、一般文翻訳部１０８は、オブジェクト生成文以外の文を、機械語命令列に翻訳し、出力ファイル１０９に出力する。この一般文翻訳処理は、一般的なプログラム変換装置で用いられている通常の翻訳処理である。
【００１２】
＜動作＞
以下、上述の構成を備えるプログラム変換装置１００の動作について、図１に示したＣ＋＋言語で記述されたソースプログラムの翻訳を例として、説明する。この翻訳対象となるソースプログラムは、入力ファイル１０１に格納されているとする。
図３は、プログラム変換装置１００の動作を示すフローチャートである。
制御部１０２は、入力ファイル１０１に格納されているソースプログラムをメモリに読み込む（ステップＳ３０１）。
制御部１０２は、読み込んだソースプログラム中の各文に逐次着目して、その内容に応じて処理を振り分けるものであり、このためステップＳ３０２からステップＳ３０９までの処理を行う。
制御部１０２は、ソースプログラム中の１文に着目し（ステップＳ３０２）、この文がオブジェクト生成関数の定義であるかを判断し（ステップＳ３０３）、オブジェクト生成関数の定義でなければ、次に大域的なオブジェクトを生成するためのオブジェクト生成文であるかを判断し（ステップＳ３０５）、オブジェクト生成文でもなければ、一般文翻訳部１０８を起動して一般文翻訳処理を行わせる（ステップＳ３０６）。一般文翻訳処理の終了後、制御部１０２は、ソースプログラム中に未だ着目していない文があるか否かを判断し（ステップＳ３０９）、全ての文を処理し終えたならば動作を終了し、未だ着目していない文があるならば次の文に着目すべくステップＳ３０２の処理に戻る。
制御部１０２は、着目した文が（ステップＳ３０２）、オブジェクト生成関数の定義であれば（ステップＳ３０３）、オブジェクト生成関数の定義を入力して仮初期値式生成部１０３を起動する。ここで、入力するとは、オブジェクト生成関数の定義等の着目した文についての所在を示すポインタを渡すことをいう。起動された仮初期値式生成部１０３は、仮初期値式生成処理を行う（ステップＳ３０４）。この仮初期値式生成処理については、後に詳細に説明する。
【００１３】
なお、着目した文がオブジェクト生成関数であるか否かの判断は、ソースプログラム中の前後の文を参照することにより、クラス定義の内部に存在しクラス名と同一名が付されていることを検知することによって行われるが、この判断自体は、一般的なプログラム変換装置において用いられる技術の域を出るものではない。
図１に示すソースプログラムの例においては、制御部１０２がクラスＸのオブジェクト生成関数の定義「Ｘ（ｉｎｔ  ａ，ｉｎｔ  ｂ）｛ｘ＝ａ；ｙ＝ｂ；ｚ＝ａ＊ｂ；｝」に着目した場合に仮初期値式生成処理がなされることになる。
仮初期値式生成処理（ステップＳ３０４）の終了後、制御部１０２は、オブジェクト生成関数の定義を入力として、一般文翻訳部１０８を起動し、一般文翻訳処理を行わせる（ステップＳ３０６）。
一般文翻訳処理によって、オブジェクト生成関数の定義は、機械語命令列に翻訳される。
オブジェクト生成関数の定義に対する一般文翻訳部１０８の処理が終了した場合には、制御部１０２は、次にオブジェクト生成文「ｃｏｎｓｔ  Ｘ  ｏｂｊ（２，３）；」に着目する（ステップＳ３０９、Ｓ３０２）。
制御部１０２は、着目した文がオブジェクト生成関数の定義でないので（ステップＳ３０３）、オブジェクト生成文であるか否かを判定し（ステップＳ３０５）、「ｃｏｎｓｔ  Ｘ  ｏｂｊ（２，３）；」はオブジェクト生成文であるので、このオブジェクト生成文を入力として、実初期値式生成部１０５を起動する。起動された実初期値式生成部１０５は、実初期値式生成処理を行う（ステップＳ３０７）。この実初期値式生成処理については、後に詳細に説明する。
実初期値式生成処理（ステップＳ３０７）の終了後、制御部１０２は、着目しているオブジェクト生成文を入力として、オブジェクト生成文翻訳部１０７を起動し、オブジェクト生成文翻訳処理を行わせる（ステップＳ３０８）。このオブジェクト生成文翻訳処理についても、後に詳細に説明する。
このようにして、プログラム変換装置１００は、制御部１０２の振り分け制御によって、ソースプログラムの各文を逐次機械語命令列に翻訳する。
以下、仮初期値式生成処理（ステップＳ３０４）、実初期値式生成処理（ステップＳ３０７）、オブジェクト生成文翻訳処理（ステップＳ３０８）のそれぞれについて詳細に説明する。なお、一般文翻訳処理（ステップＳ３０６）は、上述したように一般的なプログラム変換装置で用いられている通常の翻訳処理であるため、詳細な動作説明は省略する。
【００１４】
＜仮初期値式生成処理＞
以下、仮初期値式生成部１０３の行う仮初期値式生成処理について説明する。
図４は、仮初期値式生成部１０３の行う仮初期値式生成処理を示すフローチャートである。
仮初期値式生成部１０３は、オブジェクト生成関数の定義を入力として、起動される。
ここでは、図１に示すオブジェクト生成関数の定義「Ｘ（ｉｎｔ  ａ，ｉｎｔｂ）｛ｘ＝ａ；ｙ＝ｂ；ｚ＝ａ＊ｂ；｝」を入力として、起動される例に触れながら説明する。
仮初期値式生成部１０３は、オブジェクト生成関数の定義に着目し、このオブジェクト生成関数がオブジェクトの値を設定する以外の処理を行なわないかどうかを判断する（ステップＳ４０１）。
この判断は、オブジェクトのメンバ変数を認識するためにメモリ中に格納されたソースプログラムにおけるクラスＸのクラス定義をも参照して行うものであり、オブジェクト生成関数の定義に含まれる文に「オブジェクトのメンバ変数に値を設定するための代入文」以外の文が含まれているかいないかによりなされる。
ここで、「オブジェクトのメンバ変数に値を設定するための代入文」とは、オブジェクトのメンバ変数を「＝」の左に記述し、「＝」の右にオブジェクト生成関数の仮引数、定数、又は算術演算子を記述した文をいう。
仮初期値式生成部１０３は、オブジェクト生成関数の定義に含まれる文に「オブジェクトのメンバ変数に値を設定するための代入文」以外の文が含まれていない場合には、オブジェクトの値設定以外の処理を行わないと判断し（ステップＳ４０１）、ｙｅｓの分岐に進み仮初期値式を生成する（ステップＳ４０２）。一方、「オブジェクトのメンバ変数に値を設定するための代入文」以外の文が含まれている場合には、仮初期値式生成部１０３は、ステップＳ４０１においてｎｏの分岐に進み、仮初期値式を生成することなく仮初期値式生成処理を終了する。
【００１５】
図１に示すオブジェクト生成関数Ｘ（ｉｎｔ  ａ，ｉｎｔ  ｂ）の定義に含まれる文は、「ｘ＝ａ；」、「ｙ＝ｂ；」及び「ｚ＝ａ＊ｂ；」であるが、これらはそれぞれ、クラスＸのオブジェクトのメンバ変数ｘ、ｙ及びｚに値を設定するための代入文である。従って、ステップＳ４０１において、仮初期値式生成部１０３は、ｙｅｓの分岐に進み仮初期値式の生成を行う（ステップＳ４０２）。
図５は、オブジェクト生成関数Ｘ（ｉｎｔ  ａ，ｉｎｔ  ｂ）について仮初期値式生成部１０３が生成した仮初期値式を示す概念図である。
なお、同図には仮初期値式４２０の構成要素の対応関係を示すために、クラスＸのオブジェクトのメンバ変数ｘ、ｙ、ｚからなるオブジェクトデータ４１０をも示している。
クラスＸのオブジェクトの第１のメンバ変数はｘであり、第２のメンバ変数はｙであり、第３のメンバ変数はｚであるため、同図に示すように、Ｘ（ｉｎｔ  ａ，ｉｎｔ  ｂ）の仮初期値式は、第１のメンバ変数を示すものとしてａ、第２のメンバ変数を示すものとしてｂ、第３のメンバ変数を示すものとしてａ＊ｂを構成要素とする。
なお、オブジェクト生成関数「Ｘ（ｉｎｔ  ａ，ｉｎｔ  ｂ）」の定義においては、クラスＸのオブジェクトのすべてのメンバ変数に値が設定されるようになっていたが、値が設定されないメンバ変数が存在する場合は値０が設定されるものとみなして、仮初期値式生成部１０３は、仮初期値式を生成する。
こうして、仮初期値式生成部１０３は仮初期値式を生成した後（ステップＳ４０２）、生成した仮初期値式とオブジェクト生成関数の名称とを組として仮初期値式記憶部１０４に格納し（ステップＳ４０３）、仮初期値式生成処理を終える。
図６は、仮初期値式記憶部１０４の内容を示す概念図である。
同図では、上述したオブジェクト生成関数の定義「Ｘ（ｉｎｔ  ａ，ｉｎｔ  ｂ）｛ｘ＝ａ；ｙ＝ｂ；ｚ＝ａ＊ｂ；｝」に着目して仮初期値式生成部１０３が格納した組４３０と、また別の組４４０とを示している。
【００１６】
＜実初期値式生成処理＞
以下、実初期値式生成部１０５の行う実初期値式生成処理について説明する。
図７は、実初期値式生成部１０５の行う実初期値式生成処理を示すフローチャートである。
実初期値式生成部１０５は、大域的なオブジェクトを生成するためのオブジェクト生成文を入力として、起動される。
ここでは、図１に示すオブジェクト生成文「ｃｏｎｓｔ  Ｘ  ｏｂｊ（２，３）；」を入力として、起動される例に触れながら説明する。
実初期値式生成部１０５は、起動されると、オブジェクト生成文に着目し、このオブジェクト生成文によって呼び出されることになっているオブジェクト生成関数の名称に基づいて仮初期値式記憶部１０４を検索し、そのオブジェクト生成関数の名称と仮初期値式との組が格納されているか判断する（ステップＳ５０１）。この判断により、着目したオブジェクト生成文により呼び出されるオブジェクト生成関数についての仮初期値式が生成済みであるか否かが判別できる。
この判断の結果、仮初期値式が生成済みでないと判断された場合には、ステップＳ５０１からｎｏの分岐に進み、実初期値式生成部１０５は、実初期値式生成処理を終了する。
一方、判断の結果、仮初期値式が生成済みであると判断された場合には（ステップＳ５０１）、実初期値式生成部１０５は、仮初期値式の仮引数をオブジェクト生成文の実引数で置き換えたものである実初期値式を生成する（ステップＳ５０２）。
ここでは、図６の組４３０に含まれる仮初期値式における仮引数ａ及びｂをオブジェクト生成文「ｃｏｎｓｔ  Ｘ  ｏｂｊ（２，３）；」の実引数２及び３で置き換えることにより実初期値式を生成する。
即ち、実初期値式は、第１のメンバ変数を示すものとして２、第２のメンバ変数を示すものとして３、第３のメンバ変数を示すものとして２＊３を構成要素とする。
実初期値式を生成した後、実初期値式生成部１０５は、実初期値式の全ての構成要素が定数となるか否かを判断する（ステップＳ５０３）。この判断は、実初期値式に算術演算子が含まれる場合には、その算術演算子に従って計算した結果が定数となるか否かの判断となる。
【００１７】
ステップＳ５０３の判断結果、実初期値式の全構成要素が定数である場合には、実初期値式生成部１０５は、オブジェクト生成文を特定する情報と実初期値式とオブジェクト生成文との組を実初期値式記憶部１０６に格納し（ステップＳ５０４）、実初期値式生成処理を終える。
なお、実初期値式の構成要素のうち算術演算子が含まれていたものは、実初期値式生成部１０５が実初期値式を実初期値式記憶部１０６に格納する際には、その算術演算を計算した上で結果の値に置き換えて格納する。
この結果、実初期値式記憶部１０６の内容は、図８のようになる。
図８は、実初期値式記憶部１０６の内容を示す概念図である。
同図では、上述したオブジェクト生成文「ｃｏｎｓｔ  Ｘ  ｏｂｊ（２，３）；」に着目して実初期値式生成部１０５が格納した組５１０を示している。
同図中、ｃｏｎｓｔ  Ｘ  ｏｂｊ（２，３）；のメモリ内でのアドレスとは、メモリ中に格納されたソースプログラム中のこのオブジェクト生成文に着目するためのポインタ値をいう。
また、ステップＳ５０３の判断結果、実初期値式の構成要素に定数でないものがある場合には（ステップＳ５０３）、実初期値式生成部１０５は、実初期値式記憶部１０６に何も格納することなく、実初期値式生成処理を終える。
【００１８】
＜オブジェクト生成文翻訳処理＞
以下、オブジェクト生成文翻訳部１０７の行うオブジェクト生成文翻訳処理について説明する。
図９は、オブジェクト生成文翻訳部１０７の行うオブジェクト生成文翻訳処理を示すフローチャートである。
オブジェクト生成文翻訳部１０７は、オブジェクト生成文を入力として、起動される。
ここでは、上述の実初期値式生成処理に引き続いて（図３参照）、図１に示すオブジェクト生成文「ｃｏｎｓｔ  Ｘ  ｏｂｊ（２，３）；」を入力として、オブジェクト生成文翻訳部１０７が起動される例に触れながら説明する。
オブジェクト生成文翻訳部１０７は起動されると、オブジェクト生成文に着目し、このオブジェクト生成文を特定する情報が、実初期値式と組とされて実初期値式記憶部１０６に格納されているか否かを判断する（ステップＳ６０１）。
ステップＳ６０１において格納されていないと判定された場合には、オブジェクト生成文翻訳部１０７は、従来のプログラム変換装置と同様に（図１４参照）、オブジェクト生成文を、オブジェクト生成関数を呼び出すためのコード（サブルーチンコール命令）と、ＲＡＭ領域に配置される属性のオブジェクトデータとに翻訳する（ステップＳ６０２）。
【００１９】
一方、実初期値式記憶部１０６が図８に示すような内容である場合には、ステップＳ６０１において、着目したオブジェクト生成文を特定する情報が、実初期値式と組として実初期値式記憶部１０６に格納されていると判断されるため、オブジェクト生成文翻訳部１０７は、着目しているオブジェクト生成文がｃｏｎｓｔオブジェクトを生成するものであるか否かを判断する（ステップＳ６０３）。
この判断は、着目しているオブジェクト生成文に修飾子「ｃｏｎｓｔ」が付されているか否かによって行われる。
ステップＳ６０３において否定的な判断がなされたとすると、オブジェクト生成文翻訳部１０７は、着目しているオブジェクト生成文を、ＲＡＭ領域に配置される属性のオブジェクトデータに翻訳する（ステップＳ６０５）。このステップＳ６０５における翻訳は、サブルーチンコール命令を生成しないため、ステップＳ６０２における翻訳と比べて、コードサイズの小さい機械語プログラムを生成することにつながる。
また、着目しているオブジェクト生成文が、図１に示す「ｃｏｎｓｔ  Ｘ  ｏｂｊ（２，３）；」であった場合には、オブジェクト生成文翻訳部１０７は、ステップＳ６０３において肯定的な判断をなし、着目しているオブジェクト生成文を、ＲＯＭ領域に配置される属性のオブジェクトデータに翻訳する（ステップＳ６０４）。
なお、ステップＳ６０４、Ｓ６０５における翻訳に際して、オブジェクト生成文翻訳部１０７は、実初期値式記憶部１０６中の着目したオブジェクト生成文に対応する実初期値式を参照して、オブジェクトデータの値を特定する。
図１０は、オブジェクト生成文翻訳処理のステップＳ６０４によるオブジェクト生成文の翻訳結果を示す図である。
【００２０】
同図は、「ｃｏｎｓｔ  Ｘ  ｏｂｊ（２，３）；」の翻訳結果を示している。また、この翻訳結果は、オブジェクトｏｂｊのオブジェクトデータが３つの４バイトデータでそれぞれの値が「２」、「３」、「６」のものから構成されることを示しており、またこのオブジェクトデータは、「．ｓｅｃｔｉｏｎ  ＲＯＭＤＡＴＡ」と「．ｓｅｃｔｉｏｎ  ＥＮＤ」とに挟まれて記述されており、ＲＯＭ領域に配置されるべきデータであることを示している。
従って、最終的に生成される機械語プログラムが、実行されるに際して、オブジェクトｏｂｊのオブジェクトデータは、ＲＯＭに配置され得る。
このことは、実行時に必要なＲＡＭ領域を縮小できることにつながる。
また、例えば、着目したオブジェクト生成文が「Ｘ  ｏｂｊ（２，３）；」であったならば、オブジェクト生成文翻訳部１０７はステップＳ６０５の処理によって、このオブジェクト生成文を、図１０に示した翻訳結果のうち「．ｓｅｃｔｉｏｎ  ＲＯＭＤＡＴＡ」を「．ｓｅｃｔｉｏｎ  ＲＡＭＤＡＴＡ」に代えたものに翻訳する。
オブジェクト生成文翻訳部１０７は、ステップＳ６０２、ステップＳ６０４、又はステップＳ６０５を行った後、翻訳結果を出力ファイル１０９に出力する（ステップＳ６０６）。
【００２１】
以上、本発明に係るプログラム変換装置について、実施形態に基づいて説明したが、本発明はこれら実施形態に限られないことは勿論である。即ち、
（１）実施の形態では、プログラム変換装置は、Ｃ＋＋言語で記述されたソースプログラムを翻訳対象としたが、これに限定されることはなく、他のオブジェクト指向言語で記述されたソースプログラムを翻訳対象とするものであってもよい。
【００２２】
（２）実施の形態では、大域的なオブジェクトを生成する旨のオブジェクト生成文についての翻訳処理（ステップＳ３０５等）を説明したが、ここでいう大域的なオブジェクトとは、オブジェクトデータが機械語プログラムの実行前にメモリに格納されるべきものであることを示すものであれば足る。即ち、言語によって大域的、局所的の別がない場合であっても、ここでいう大域的と同等の意味を示すオブジェクトを生成するためのオブジェクト生成文については、プログラム変換装置はステップＳ３０５の判断ブロックにおいてｙｅｓと判断する。
【００２３】
（３）実施の形態において図３のフローチャートに示したプログラム変換装置１００の動作は、オブジェクト生成関数の定義が、ソースプログラム中においてオブジェクト生成文より前に置かれていることを前提としたものであるが、この他の場合に対応するためには、ソースプログラム中のオブジェクト生成関数すべてについて仮初期値式生成処理を行った後に、ソースプログラム中のオブジェクト生成文に着目しても実初期値式生成処理を行うようにしてもよい。
また、オブジェクト生成文に着目するまでは、そのオブジェクト生成文に対応するオブジェクト生成関数についての仮初期値式生成処理は行わず、オブジェクト生成文を発見したときに、それが呼び出すオブジェクト生成関数を検索して仮初期値式生成処理を行い、これに続けて実初期値式生成処理とオブジェクト生成文翻訳処理とを行うようにしてもよい。
また、オブジェクト生成文を発見したときに、それが呼び出すオブジェクト生成関数を検索するならば、実初期値式生成処理と仮初期値式生成処理とを混ぜ合わせて、オブジェクト生成文の実引数の値に基づいてオブジェクト生成関数での動作を計算するような処理とすることにより、このオブジェクト生成文をオブジェクト生成関数を呼び出すサブルーチンコール命令に翻訳しなければならないかを判断することとしてもよい。これによれば、オブジェクト生成関数が仮引数の値によって分岐するような複数パスの処理構造をもっている場合においても、オブジェクト生成文の実引数で定まる単一パスのみについて、オブジェクトのメンバ変数に値を設定する以外の処理を行わないかどうかを判断すれば足りることになる。
【００２４】
（４）実施の形態では、実初期値式生成部１０５は、実初期値式が定数であるか否かの判断を（ステップＳ５０３）、仮初期値式の仮引数を実引数で置き換えた実初期値式を判断対象として行うこととしたが、判断の方法は、これに限定されることはなく、例えば、オブジェクト生成文の実引数が定数であるか否かを判別することによって行うこととしてもよい。
【００２５】
（５）実施の形態では、仮初期値式生成部１０３は、オブジェクト生成関数の定義に「オブジェクトのメンバ変数に値を設定するための代入文」以外の文が含まれるかどうかを判断することとしたが（ステップＳ４０１）、この「代入文」は、オブジェクトのメンバ変数に静的なアドレス値を代入する文も含むこととしてもよい。静的なアドレス値とは機械語プログラムの実行前に値の定まるアドレス値であり、実行中に解決されるアドレス値を含まない。また、仮初期値式生成部１０３が、オブジェクト生成関数がオブジェクトの値を設定する以外の処理を行わないと判断する基準を拡大して、「オブジェクト生成関数の内部でのみ用いる変数を左辺又は右辺に置いた代入文」が含まれていてもよいこととしてもよい。
即ち、オブジェクト生成関数がオブジェクトの値を設定する以外の処理を行わないと判断（ステップＳ４０１）する理由は、オブジェクト生成関数が静的なことが、オブジェクト生成文をオブジェクト生成関数を呼び出す旨のサブルーチンコール命令に翻訳しないでよいことの条件となるからである。ここで、オブジェクト生成関数が静的とは、オブジェクト生成関数の動作が、例えばオペレーティングシステムのサービスを呼び出すようなものや入出力動作を行うもの等のように実際に機械語プログラムを実行しなければ意味をなさないものではなく、メンバ変数への値の代入等のように動作結果を翻訳時に計算によって特定できるものをいう。なお、オブジェクト生成関数がメンバ変数への値の代入を行っていない場合は、０という定数をメンバ変数に代入しているものとして扱えばよい。
【００２６】
（６）実施の形態で示した仮初期値式生成部１０３によるオブジェクト生成関数がオブジェクトの値を設定する以外の処理を行わないかどうかの判断は、判断対象のオブジェクト生成関数から呼び出される関数がある場合には、その関数をも含めて判断することとしてもよい。即ち、その関数が、オペレーティングシステムのサービスを呼び出すようなものや入出力動作を行うものでなく、演算処理（判断、分岐含む）をするのみのものであれば、前記判断においてその関数を「オブジェクトのメンバ変数に値を設定するための代入文」であるとみなすこととしてもよい。
また、仮初期値式生成部１０３の変形例として、前記判断対象のオブジェクト生成関数の定義にさらに別のオブジェクト生成文が含まれていた場合であって、そのオブジェクト生成文が呼び出すオブジェクト生成関数の名称が仮初期値式記憶部１０４に記憶されているときには、前記判断において前記オブジェクト生成文を「オブジェクトのメンバ変数に値を設定するための代入文」であるとみなすこととするものも考えられる。以下この変形例を変形仮初期値式生成部という。但し、この場合には、判断対象となるオブジェクト生成関数についての仮初期値式は、そのオブジェクト生成関数に含まれるオブジェクト生成文に関連する仮初期値式の仮引数を当該オブジェクト生成文の実引数で置き換えたものとなる。
【００２７】
以下、オブジェクト生成文がオブジェクト生成関数の定義に含まれていた場合に上述した変形仮初期値式生成部が生成する仮初期値式について説明する。
図１１は、クラスＸのオブジェクト生成関数の定義とクラスＸのオブジェクト生成文を含むクラスＹのオブジェクト生成関数の定義を含むＣ＋＋言語で記述されたソースプログラムの一部を示す図である。
変形仮初期値式生成部によって、まず、図１１に示すソースプログラムにおけるクラスＸのオブジェクト生成関数に対応する仮初期値式が生成される。これは、仮初期値式生成部１０３と同様の処理となる（図５参照）。
次に、変形仮初期値式生成部は、クラスＸのオブジェクト生成関数に対する仮初期値式を利用して、クラスＹのオブジェクト生成関数に対する仮初期値式を生成する。
図１２は、オブジェクト生成関数Ｙ（ｉｎｔ  ｉ）について変形仮初期値式生成部が生成した仮初期値式を示す概念図である。
なお、同図には仮初期値式８２０の構成要素の対応関係を示すために、クラスＹのオブジェクトのオブジェクトデータ８１０をも示している。オブジェクトデータ８１０については、クラスＸのオブジェクトのメンバ変数であるｘ、ｙ、ｚと独自のメンバ変数ｎとで表している。
仮初期値式８２０の構成要素のうち、第１〜第３のメンバ変数に対応するものは、図５に示すクラスＸのオブジェクト生成関数についての仮初期値式４２０中の仮引数を、図１１に示すオブジェクト生成関数Ｙ（ｉｎｔ  ｉ）に含まれるオブジェクト生成文ｏｂｊ（ｉ，３）の実引数に置き換えたものであり、第４のメンバ変数に対応するものは、オブジェクト生成関数Ｙ（ｉｎｔ  ｉ）中のｎ＝ｉ＊２；に基づくものである。
【００２８】
（７）実施の形態で示した仮初期値式生成部１０３によるオブジェクト生成関数がオブジェクトの値を設定する以外の処理を行わないかどうかの判断は、さらに、ソースプログラムがＣ＋＋言語で記述されており、オブジェクト生成関数がコンストラクタ初期設定子（ｃｔｏｒ−ｉｎｉｔｉａｌｉｚｅｒ）と関数本体（ｆｃｔ−ｂｏｄｙ）で構成されるコンストラクタである場合には、関数本体が空文であるかどうかによって判断することとしてもよい。
なお、Ｃ＋＋言語のコンストラクタの詳細については、「注釈Ｃ＋＋リファレンスマニュアル」（Ｂ．ストラウストラップ著トッパンＩＳＤＮ４−８１０１−１１０．７ｃ）に詳しく説明されている。
仮初期値式生成部１０３が上述したような判断を用いる場合、オブジェクト生成関数のサブルーチンコール命令に翻訳しなくてよくなるオブジェクト生成文の数は少なくなる可能性があるが、前記判断が簡単なものであるため、プログラム変換装置の処理速度はほとんど低下しない。また、プログラマにコンストラクタを、コンストラクタ初期設定子と関数本体とで構成するように記述させることにより前記可能性は除去できる。
なお、参考までに、図１１に示したソースプログラムを、コンストラクタ初期設定子と空文である関数本体からなるコンストラクタで記述した場合の例を図１３に示す。
コンストラクタ初期設定子は「：」から「｛」に囲まれた部分であり、関数本体は「｛」から「｝」に囲まれた部分である。
例えば、同図中の「Ｘ（ｉｎｔ  ａ，ｉｎｔ  ｂ）：ｘ（ａ），ｙ（ａ），ｚ（ａ＊ｂ）｛  ｝」における関数本体は空文である。また、コンストラクタ初期設定子「ｘ（ａ）」、「ｙ（ｂ）」、「ｚ（ａ＊ｂ）」はそれぞれ「ｘ＝ａ」、「ｙ＝ｂ」、「ｚ＝ａ＊ｂ」と同じ意味である。
【００２９】
（８）実施の形態におけるプログラム変換装置の処理手順（図３、図４、図７、図９のフローチャートの手順等）を機械語プログラムにより実現し、これを記録媒体に記録して流通・販売の対象にしても良い。このような記録媒体には、ＩＣカード、光ディスク、フレキシブルディスク、ＲＯＭ等があるが、これらに記録された機械語プログラムは、汎用のコンピュータにインストールされることにより利用に供される。即ち、汎用のコンピュータは、インストールした上記機械語プログラムを逐次実行して、実施の形態に示したようなプログラム変換装置を実現する。
また、汎用のコンピュータに上述のプログラム変換装置の処理手順を実行させるためのコンピュータプログラムは、ハードディスク等の記録媒体及び通信回線等を介してオンラインで流通させ頒布することもできる。
【００３０】
【発明の効果】
以上の説明から明らかなように、本発明に係るプログラム変換装置は、オブジェクト指向言語で記述されたソースプログラムを機械語プログラムに変換するプログラム変換装置であって、前記ソースプログラムにおけるオブジェクトを生成するためのオブジェクト生成文であってオブジェクト生成関数を呼び出すオブジェクト生成文を特定する特定手段と、前記特定手段により特定されたオブジェクト生成文によってオブジェクト生成関数が呼び出されたと仮定した場合における当該呼出によって、当該オブジェクト生成文により生成されるべきオブジェクトのメンバ変数に対し定数値を設定すること以外の動作が行われるか否かを判断する判断手段と、前記判断手段により否定的な判断がなされた場合に、前記呼出によって前記メンバ変数に対して設定される値を算出するメンバ変数値算出手段と、前記メンバ変数算出手段により前記値の算出なされたときに、前記オブジェクト生成文を、前記メンバ変数値算出手段により算出された値をもつデータであってオブジェクトのメンバ変数と同じサイズのデータのみに変換する変換手段とを備えることを特徴とする。これにより、オブジェクトの生成文を直接オブジェクト生成関数呼出し後の値のオブジェクトデータに変換するのみであって、オブジェクト生成関数を呼び出す旨のサブルーチンコール命令に変換しないため、本発明に係るプログラム変換装置は、結果的に前記サブルーチンコール命令に必要なコードのサイズだけ小さな機械語プログラムを生成する。また、生成された機械語プログラムのコードサイズが小さいことは、実行速度の向上をもたらす。
【００３１】
ここで、前記判断手段は、前記オブジェクト生成文により呼び出されるオブジェクト生成関数が他の関数を呼び出すものではない場合であって、当該オブジェクト生成関数によって前記オブジェクトのメンバ変数に設定される値が、定数と当該オブジェクト生成関数の定義中の仮引数とで構成される式又は前記仮引数により表現できる場合に、前記メンバ変数に設定される値を前記式又は前記仮引数により表現した仮メンバ変数値式を生成する仮メンバ変数値式生成部と、前記仮メンバ変数値式生成部により仮メンバ変数値式が生成されている場合に、前記仮メンバ変数値式における仮引数を、前記オブジェクト生成文中の実引数に置換した実メンバ変数値式を生成する実メンバ変数値式生成部と、前記実メンバ変数値式生成部により生成された実メンバ変数値式が定数値であることを検出する定数値検出部とを有し、前記判断手段は、前記定数値検出部により前記実メンバ変数値式が定数値であることが検出されたときに、否定的に前記判断をなすこととすることもできる。
これにより、複数のオブジェクト生成文によって、同一のオブジェクト生成関数が呼び出される場合において、それぞれのオブジェクト生成文についてオブジェクト生成関数のサブルーチンコール命令に翻訳しなければならないかどうかの判断に必要な仮メンバ変数値式生成部の動作が１回で足りるようになるので、同じオブジェクト生成関数を呼び出すようなオブジェクト生成文が多く含まれるソースプログラムを翻訳する場合に、前記判断を重複動作なく行うことができるようになる。これは、オブジェクト生成関数に関して仮メンバ変数値式生成部が１回生成した仮メンバ変数値式が、複数のオブジェクト生成文それぞれに対応しての実メンバ変数値式生成部の動作の基礎となるためである。
【００３２】
また、前記判断手段は、前記特定手段により特定されたオブジェクト生成文により呼び出されるオブジェクト生成関数の定義に、メンバ変数に値を設定する代入文以外の文が含まれているときに、肯定的に前記判断をなすこととすることもできる。
これにより、オブジェクト生成文についてオブジェクト生成関数のサブルーチンコール命令に翻訳しなければならないかどうかの判断を、代入文以外の文が含まれるか否かという簡単な判断に代えるため、この判断をある程度高速に行える。
【００３３】
また、前記判断手段は、前記特定手段により特定されたオブジェクト生成文により呼び出されるオブジェクト生成関数の定義に、さらに第２のオブジェクト生成文が含まれている場合には、当該第２のオブジェクト生成文によって第２のオブジェクト生成関数が呼び出されたと仮定したときに、当該呼出によって、当該第２のオブジェクト生成文により生成されるべきオブジェクトのメンバ変数に対し定数値を設定すること以外の動作が行われないならば、当該第２のオブジェクト生成文を、前記代入文と等価なものとみなして前記判断をなすこととすることもできる。これにより、オブジェクト生成関数内にさらにオブジェクト生成文が含まれている場合であっても、一定条件下で、当該オブジェクト生成関数を呼び出すオブジェクト生成文を当該オブジェクト生成関数のサブルーチンコール命令に翻訳せずにオブジェクトデータのみに翻訳することができるようになる。
【００３４】
また、前記オブジェクト指向言語はＣ＋＋言語であり、前記オブジェクト生成関数は、コンストラクタ初期設定子と関数本体とで構成されるコンストラクタであり、前記判断手段は、前記特定手段により特定されたオブジェクト生成文によって呼び出されるコンストラクタの関数本体が空文以外のときに、肯定的に前記判断をなすこととすることもできる。
これにより、オブジェクト生成文についてオブジェクト生成関数のサブルーチンコール命令に翻訳しなければならないかどうかの判断を、関数本体が空文かどうかの簡単な判断を用いて行うため、この判断を高速に行える。
【００３５】
また、前記プログラム変換装置はさらに、前記特定手段により特定されたオブジェクト生成文が、生成後に値の変化しないオブジェクトを生成するものであるか否かを判断する変化要否判断手段を備え、前記変換手段は、前記変化要否判断手段により肯定的な判断がなされたときに、前記オブジェクト生成文をＲＯＭ領域に配置されるべき属性を有するデータに変換し、前記変化要否判断手段により否定的な判断がなされたときに、前記オブジェクト生成文をＲＡＭ領域に配置されるべき属性を有するデータに変換することとすることもできる。
これにより、ｃｏｎｓｔオブジェクトを生成するためのオブジェクト生成文を、一定条件下で、ＲＯＭ領域に配置されるべき属性のデータに変換する。従って、結果的に機械語プログラムの実行に際して必要となるＲＡＭ領域を縮小することができる。このことは、組み込み用途のマイクロコンピュータにおいては一般にＲＯＭはＲＡＭよりコストが低いので、機械語プログラムの実行コストを削減することにつながる。
【図面の簡単な説明】
【図１】オブジェクト生成関数を含むクラスＸのクラス定義とクラスＸのオブジェクトを生成するオブジェクト生成文とからなるＣ＋＋言語のソースプログラムの一部を示す図である。
【図２】本発明のプログラム変換装置１００の構成を示す図である。
【図３】プログラム変換装置１００の動作を示すフローチャートである。
【図４】仮初期値式生成部１０３の行う仮初期値式生成処理を示すフローチャートである。
【図５】オブジェクト生成関数Ｘ（ｉｎｔ  ａ，ｉｎｔ  ｂ）について仮初期値式生成部１０３が生成した仮初期値式を示す概念図である。
【図６】仮初期値式記憶部１０４の内容を示す概念図である。
【図７】実初期値式生成部１０５の行う実初期値式生成処理を示すフローチャートである。
【図８】実初期値式記憶部１０６の内容を示す概念図である。
【図９】オブジェクト生成文翻訳部１０７の行うオブジェクト生成文翻訳処理を示すフローチャートである。
【図１０】オブジェクト生成文翻訳処理のステップＳ６０４によるオブジェクト生成文の翻訳結果を示す図である。
【図１１】クラスＸのオブジェクト生成関数の定義とクラスＸのオブジェクト生成文を含むクラスＹのオブジェクト生成関数の定義を含むＣ＋＋言語で記述されたソースプログラムの一部を示す図である。
【図１２】オブジェクト生成関数Ｙ（ｉｎｔ  ｉ）について変形仮初期値式生成部が生成した仮初期値式を示す概念図である。
【図１３】図１１に示したソースプログラムを、コンストラクタ初期設定子と空文である関数本体からなるコンストラクタで記述した場合の例を示す図である。
【図１４】従来のプログラム変換装置が図１に示したオブジェクト生成文を翻訳した結果である機械語命令列を示す図である。
【符号の説明】
１００    プログラム変換装置
１０１    入力ファイル
１０２    制御部
１０３    仮初期値式生成部
１０４    仮初期値式記憶部
１０５    実初期値式生成部
１０６    実初期値式記憶部
１０７    オブジェクト生成文翻訳部
１０８    一般文翻訳部
１０９    出力ファイル
【図１】
0004026940.tif 000002
【図２】
0004026940.tif 000003
【図３】
0004026940.tif 000004
【図４】
0004026940.tif 000005
【図５】
0004026940.tif 000006
【図６】
0004026940.tif 000007
【図７】
0004026940.tif 000008
【図８】
0004026940.tif 000009
【図９】
0004026940.tif 000010
【図１０】
0004026940.tif 000011
【図１１】
0004026940.tif 000012
【図１２】
0004026940.tif 000013
【図１３】
0004026940.tif 000014
【図１４】
0004026940.tif 000015