トップ :: G 物理学 :: G06 計算;計数




【発明の名称】 プログラム変換装置
【発明者】 【氏名】坂田 俊幸

【要約】 【課題】new演算子等からなり動的に領域確保し変数に代入する動的領域確保文を含むオブジェクト生成関数が記述されたソースプログラムを、実行速度の高い或いは実行コストの低い機械語プログラムに変換するプログラム変換装置を提供する。

【解決手段】オブジェクト生成関数中に動的領域確保文があればオブジェクト生成関数変換部103は、オブジェクト生成関数にポインタ型仮引数を追加し動的領域確保文をポインタ型仮引数の変数への代入文に置き換えた静的オブジェクト生成関数を生成する。オブジェクト生成文変換部106等は、動的領域確保文により確保される領域サイズが計算できれば、そのサイズの領域を確保する属性のデータを作成し、オブジェクト生成文を、そのデータのアドレスを静的オブジェクト生成関数に実引数として与える文に換えて翻訳し、全メンバ変数が翻訳時に求まり不変ならROM領域配置属性のデータに変換する。
【特許請求の範囲】
【請求項1】 動的に領域を確保して当該領域の先頭アドレスをポインタ型変数に代入する動的領域確保文を含むオブジェクト生成関数を呼び出すことによりオブジェクトを生成するオブジェクト生成文が記述されたソースプログラムを、機械語プログラムに変換するプログラム変換装置であって、前記オブジェクト生成文により前記オブジェクト生成関数が呼び出されたと仮定した場合において前記動的領域確保文によって確保される領域のサイズを計算する計算手段と、前記計算手段により計算された前記領域のサイズが定数値である場合には、前記動的領域確保文を、当該サイズの第1データと、当該第1データの先頭アドレスを前記ポインタ型変数に代入するための中間表現とに変換する第1変換手段と、前記第1変換手段により動的領域確保文が変換された後のオブジェクト生成関数を、前記オブジェクト生成文が呼び出すものとして、前記オブジェクト生成文を機械語命令に変換する第2変換手段とを備えることを特徴とするプログラム変換装置。
【請求項2】 前記第2変換手段は、前記第1変換手段による変換後の前記オブジェクト生成関数が前記オブジェクト生成文により呼び出されたと仮定した場合における当該呼出によって前記オブジェクトのメンバ変数に対し設定される値が定数値であるときに、前記オブジェクト生成文を、前記メンバ変数に設定されるアドレス値又は定数値をもつデータであってオブジェクトのメンバ変数と同じサイズの第2データに変換し、さらに前記オブジェクト生成文により生成されるオブジェクトが値の変化しないオブジェクトであれば当該第2データをROM領域に配置されるべき属性のデータにすることを特徴とする請求項1記載のプログラム変換装置。
【請求項3】 前記第2変換手段は、前記第1変換手段による変換後の前記オブジェクト生成関数が前記オブジェクト生成文により呼び出されたと仮定した場合における当該呼出によって前記第1データに対し設定される値が定数値であるときに、当該定数値を前記第1データの初期値とし、さらに前記第1データが初期値から変化しないものであれば前記第1データをROM領域に配置されるべき属性のデータにすることを特徴とする請求項1又は2記載のプログラム変換装置。
【請求項4】 前記第1変換手段は、前記動的領域確保文を含むオブジェクト生成関数を基礎として、ポインタ型の仮引数を追加しさらに前記動的領域確保文を、前記ポインタ型変数に前記仮引数を代入する代入文に置き換えた中間表現である静的オブジェクト生成関数を生成するものであり、前記第2変換手段は、前記オブジェクト生成文を、前記第1データの先頭アドレスを前記ポインタ型の仮引数として用いることができるように渡して前記第1変換手段により生成された前記静的オブジェクト生成関数を呼び出す中間表現に変換し、当該中間表現に応じた機械語命令を生成することを特徴とする請求項1〜3のいずれか1項に記載のプログラム変換装置。
【請求項5】 前記第1データと、前記オブジェクトのメンバ変数に対応するデータとを隣接するメモリ領域に割り当てられる属性のデータにすることを特徴とする請求項1〜4のいずれか1項に記載のプログラム変換装置。
【請求項6】 動的に領域を確保して当該領域の先頭アドレスをポインタ型変数に代入する動的領域確保文を複数含むソースプログラムを、機械語プログラムに変換するプログラム変換装置であって、前記複数の動的領域確保文それぞれにより確保されるべき領域のサイズを計算するサイズ計算手段と、引数としてサイズを受け取り当該サイズの領域を動的に確保して当該領域の先頭アドレスを返却するサブルーチンである動的領域確保ルーチンを、前記複数の動的領域確保文それぞれにより確保されるべき領域のサイズの合計値を引数として呼び出すことにより、前記複数の動的領域確保文により確保されるべき全ての領域を一括して確保するためのサブルーチンコール命令を生成する動的領域確保ルーチン呼出命令生成手段と、前記サブルーチンコール命令の実行により返却されるアドレスと前記サイズ計算手段により計算された前記各領域のサイズとに基づき、前記動的領域確保ルーチンにより確保される領域のうち前記複数の動的領域確保文それぞれの分に相当する各領域の先頭アドレスを算出する先頭アドレス算出手段と、前記複数の動的領域確保文それぞれを、当該動的領域確保文に対応して前記先頭アドレス算出手段により算出された領域の先頭アドレスを該当するポインタ型変数に代入する命令に変換する変換手段とを備えることを特徴とするプログラム変換装置。
【請求項7】 動的に領域を確保して当該領域の先頭アドレスをポインタ型変数に代入する動的領域確保文を含むオブジェクト生成関数を呼び出すことによりオブジェクトを生成するオブジェクト生成文が記述されたソースプログラムを機械語プログラムに変換するプログラム変換処理を、コンピュータに実行させるための制御プログラムを記録した記録媒体であって、前記プログラム変換処理は、前記オブジェクト生成文により前記オブジェクト生成関数が呼び出されたと仮定した場合において前記動的領域確保文によって確保される領域のサイズを計算する計算ステップと、前記計算ステップにより計算された前記領域のサイズが定数値である場合には、前記動的領域確保文を、当該サイズのデータと、当該データの先頭アドレスを前記ポインタ型変数に代入するための中間表現とに変換する第1変換ステップと、前記第1変換ステップにより動的領域確保文が変換された後のオブジェクト生成関数を、前記オブジェクト生成文が呼び出すものとして、前記オブジェクト生成文を機械語命令に変換する第2変換ステップとを含むことを特徴とする記録媒体。
【請求項8】 動的に領域を確保して当該領域の先頭アドレスをポインタ型変数に代入する動的領域確保文を複数含むソースプログラムを、機械語プログラムに変換するプログラム変換処理を、コンピュータに実行させるための制御プログラムを記録した記録媒体であって、前記プログラム変換処理は、前記複数の動的領域確保文それぞれにより確保されるべき領域のサイズを計算するサイズ計算ステップと、引数としてサイズを受け取り当該サイズの領域を動的に確保して当該領域の先頭アドレスを返却するサブルーチンである動的領域確保ルーチンを、前記複数の動的領域確保文それぞれにより確保されるべき領域のサイズの合計値を引数として呼び出すことにより、前記複数の動的領域確保文により確保されるべき全ての領域を一括して確保するためのサブルーチンコール命令を生成する動的領域確保ルーチン呼出命令生成ステップと、前記サブルーチンコール命令の実行により返却されるアドレスと前記サイズ計算ステップにより計算された前記各領域のサイズとに基づき、前記動的領域確保ルーチンにより確保される領域のうち前記複数の動的領域確保文それぞれの分に相当する各領域の先頭アドレスを算出する先頭アドレス算出ステップと、前記複数の動的領域確保文それぞれを、当該動的領域確保文に対応して前記先頭アドレス算出ステップにより算出された領域の先頭アドレスを該当するポインタ型変数に代入する命令に変換する変換ステップとを含むことを特徴とする記録媒体。
【発明の詳細な説明】【0001】
【発明の属する技術分野】本発明は、ソースプログラムを機械語命令列に変換するプログラム変換装置に関し、特にオブジェクト生成文を含むオブジェクト指向言語のソースプログラムを変換対象とするプログラム変換装置に関する。
【0002】
【従来の技術】オブジェクト指向言語において、オブジェクト(インスタンス)は、使用する前に生成する必要があり、オブジェクト生成関数を呼び出すオブジェクト生成文により生成される。ここで、オブジェクト生成関数は、オブジェクトのメンバ関数の1つであり、一般にオブジェクトの初期設定等の処理を内容とするように設計されるものである。なお、オブジェクト生成関数の名称は、オブジェクト名に関する情報を含む。
【0003】以下、オブジェクト指向言語C++(以下、「C++言語」という。)で記述されたソースプログラムを機械語プログラムに変換(翻訳)する従来のプログラム変換装置の説明を行なう。ここで、変換の語は、ソースプログラム等の変換対象に基づいて機械語プログラム等の結果物を生成することを意味するものとして用いており、変換対象自体を更新することを意味するものではない。
【0004】図12は、オブジェクト生成関数を含むクラスIntArrayの定義と、クラスIntArrayのオブジェクトを生成するオブジェクト生成文とを含むC++言語のソースプログラムの一部を示す図である。C++言語では、オブジェクト生成関数はコンストラクタと呼ばれ、クラス名と同じ名前の関数で表される。同図に示す「IntArray(int size)」がクラスIntArrayのオブジェクト生成関数である。
【0005】このオブジェクト生成関数中の「memp=new int[size];」は、int型の変数がsizeで示された個数分からなる配列用のメモリ領域を動的に確保して、そのメモリ領域の先頭アドレスをmempに代入する意味の文である。以下、演算子newを含む文等、実行時に動的にメモリ領域を確保してそのメモリ領域の先頭アドレスをポインタ型の変数に代入する文を動的領域確保文という。なお、同図中には示していないが、クラスIntArrayには、ポインタ型のメンバ変数mempを利用してメモリにアクセスするようなメンバ関数がオブジェクト生成関数以外にも存在する。
【0006】また、C++言語では、オブジェクト生成文は、オブジェクトの宣言文として記述され、同図に示すオブジェクトの宣言文「const IntArrayArrayObj(10);」がクラスIntArrayのオブジェクト「ArrayObj」を生成する意味を有する。このオブジェクトの宣言文において「Arrayobj」の後の「(10)」は、オブジェクト生成関数に渡す実引数である。
【0007】また、「const IntArray ArrayObj(10)」の先頭の修飾子「const」は生成されるオブェクトが値の変化しないオブジェクトであることを表している。以下、このような値の変化しないオブジェクトを、constオブジェクトという。なお、このオブジェクト「Arrayobj」は、関数や他のオブジェクトから参照可能な大域的なオブジェクトであるため、このソースプログラムが機械語に翻訳されて実行され始めるまでには、必ずメモリに確保されるものである。
【0008】プログラム変換装置は、ソースプログラムを機械語に翻訳するいわゆるコンパイラであり、ソースプログラムを参照することにより、特定のプロセッサ上で実行可能な機械語プログラムを生成する。家電機器等への組み込み用マイクロコンピュータの分野でのプログラムの開発においては、ソースプログラム中のデータは、プログラム変換装置により、RAM領域に配置されるべき属性を有するデータ又はROM領域に配置されるべき属性を有するデータに翻訳され、ソースプログラム中の各手続きは、ROM領域に配置されるべき属性を有するコードに翻訳される。
【0009】ここで、RAM領域とは読み書き可能なメモリ領域をいい、ROM領域とは読み出しのみが可能なメモリ領域をいう。プログラム変換装置によって出力された機械語プログラムは、コードやデータがそれぞれの配置属性に基づきROM領域やRAM領域に配置されて、特定のプロセッサ上においてオペレーティングシステム(OS)等の制御下で、実行されることになる。つまり、ここでいうコードはCPUに実行されることになる機械語命令列であり、データはOSによってコードの実行前にメモリに配置されるものである。
【0010】従来のプログラム変換装置は、図12に示すようなオブジェクト生成文をオブジェクトデータとオブジェクト生成関数を呼び出すサブルーチンコール命令とに翻訳する。ここで、オブジェクトデータとは、オブジェクトのメンバ変数の集合をいう。従来のプログラム変換装置は、上述のサブルーチンコール命令をROM領域に配置されるべき属性を有するコードとして生成し、オブジェクトデータについては、常にRAM領域に配置されるべき属性を有するデータとして生成する。
【0011】かかるオブジェクトデータが常にRAM領域に配置されるべき属性を有するデータとして生成される理由は、オブジェクトが生成されるときに実行されるオブジェクト生成関数の動作によって、オブジェクトのメンバ変数に対して動的に値が設定される得るからである。このことは、生成されるオブジェクトがconstオブジェクトであっても変わらない。
【0012】図13は、従来のプログラム変換装置が図12に示したオブジェクト生成文を翻訳した結果である機械語命令列を示す図である。これは、従来のプログラム変換装置が図12に示したソースプログラムに基づいて生成する機械語プログラムの一部に相当する。なお、同図では、わかり易くするため機械語をニモニックコードで示している。
【0013】ここで、「.section RAMAREA」から「.section END」に挟まれた部分は、RAM領域に配置されるべき属性のデータを表し、「Arrayobj:8」は、オブジェクトArrayobjが8バイトのサイズであることを表している。従って、機械語プログラムが実行される時には、まずRAM領域に8バイトの領域が確保されることになる。
【0014】また、「.section TEXT」から「.section END」に挟まれた部分は、ROM領域に配置されるべき属性のコードを表し、「_InitObj()」は、オブジェクトを生成する時に実行するものとしてプログラム変換装置が生成する関数を表し、「mov &ArrayObj,R0」は、オブジェクトArrayObjのアドレスをレジスタR0に格納する機械語命令を表し、「mov#10,R1」は、実引数である10をレジスタR1に格納する機械語命令を表し、「call InitArray」は、オブジェクト生成関数を呼び出すサブルーチンコールの機械語命令を表し、retは関数からの復帰命令を表している。
【0015】また、「IntArray()」は、オブジェクト生成関数を表し、「movR0,R2」はレジスタR0に格納されて渡されるオブジェクトの先頭アドレスをレジスタR2に格納する機械語命令を表し、「mov R1,M(R2,0)」は、レジスタR2で示されるアドレスからオフセット0の位置のメモリにレジスタR1の値を格納する機械語命令を表し、「lshift R1,#2,R0」は、レジスタR1の値を左に2ビットシフトした値をレジスタR0に格納する機械語命令を表し、「call _memory_alloc_func」は、レジスタR0の内容が示すサイズの領域を実行時に動的に確保しその領域の先頭アドレスをレジスタR0に格納して返す動的領域確保関数を呼び出すサブルーチンコールの機械語命令を表し、「mov R0,M(R2,4)」は、レジスタR2で示されるアドレスからオフセット4の位置のメモリ内容としてレジスタR0の値を格納する機械語命令を表し、retは関数からの復帰命令を表している。
【0016】このように、従来のプログラム変換装置は、ソースプログラム中のオブジェクト生成文を、オブジェクト生成関数を呼び出すためのコードと、RAM領域に配置されるべき属性のオブジェクトデータとに翻訳する。一般に、機械語プログラムのコードサイズが大きければ、このプログラムの実行には容量の大きなメモリが必要になり、実行に要するコストが高くなる。
【0017】従って、コスト面からは機械語プログラムのコードサイズは小さい方が望ましい。また、家電機器等への組み込み用マイクロコンピュータの分野においては、RAMのコストは、ROMのコストより高く、ROMの4倍以上のコストがかかる場合もある。
【0018】従って、可能な限り多くのデータを、RAM領域ではなく、ROM領域に配置されるべき属性にすることは、コスト削減につながる。そこで、機械語プログラムのコードサイズを削減し、又は、RAM領域に配置されるべき属性のデータを削減することにより、オブジェクト指向言語で記述されたソースプログラムを実行コストの低い機械語プログラムに変換するプログラム変換装置の実現が望まれている。
【0019】ところで、ソースプログラムを実行コストの低い機械語プログラムに変換するプログラム変換装置に関する技術として、特開2000−40005号公報に開示されている技術がある。この特開2000−40005号公報に開示されている技術は、オブジェクト生成文を翻訳する場合において、オブジェクト生成関数呼び出し後のメンバ変数値を翻訳段階で計算しメンバ変数値が定数となると判明したときにはその定数をメンバ変数の内容としたオブジェクトを生成するとともにオブジェクト生成関数の呼び出しを削除することによりコードサイズを削減し、更に、そのメンバ変数値が定数となると判明したときに、オブジェクト生成文においてオブジェクトの値が変化しないと宣言されていればオブジェクトをROM領域に配置することにより、使用するRAM領域を削減する技術である。
【0020】
【発明が解決しようとする課題】しかしながら、上述の公報に開示されている技術は、オブジェクト生成関数呼び出し直後におけるメンバ変数値が翻訳段階で計算できる場合にしか有効でないため、オブジェクト生成関数の中に動的領域確保文が含まれていた場合には有効とはならない。なぜなら、動的領域確保文が含まれていれば、動的領域確保文の実行によって確保されるメモリ領域の先頭アドレスがメンバ変数値に代入されることになるが、翻訳段階ではそのアドレス値を特定できないからである。
【0021】そこで、本発明はかかる問題点に鑑みなされたものであり、動的領域確保文を含むオブジェクト生成関数が記述されたソースプログラムを、実行コストの低い機械語プログラムに変換するプログラム変換装置を提供することを目的とする。また、一般にプログラム変換装置には実行速度の高い機械語プログラムの生成が求められるため、本発明は、上記目的の他に、動的領域確保文を含むオブジェクト生成関数が記述されたソースプログラムを、実行速度の高い機械語プログラムに変換するプログラム変換装置を提供することを目的とする。
【0022】
【課題を解決するための手段】上記目的を達成するために、本発明に係るプログラム変換装置は、動的に領域を確保して当該領域の先頭アドレスをポインタ型変数に代入する動的領域確保文を含むオブジェクト生成関数を呼び出すことによりオブジェクトを生成するオブジェクト生成文が記述されたソースプログラムを、機械語プログラムに変換するプログラム変換装置であって、前記オブジェクト生成文により前記オブジェクト生成関数が呼び出されたと仮定した場合において前記動的領域確保文によって確保される領域のサイズを計算する計算手段と、前記計算手段により計算された前記領域のサイズが定数値である場合には、前記動的領域確保文を、当該サイズの第1データと、当該第1データの先頭アドレスを前記ポインタ型変数に代入するための中間表現とに変換する第1変換手段と、前記第1変換手段により動的領域確保文が変換された後のオブジェクト生成関数を、前記オブジェクト生成文が呼び出すものとして、前記オブジェクト生成文を機械語命令に変換する第2変換手段とを備えることを特徴とする。
【0023】上記構成により、動的領域確保文により確保されることが予定されていた領域は機械語プログラム中においてデータとして置かれることになるため、動的領域確保関数のサブルーチンコールを行わないことによりプログラム実行速度が向上する。なお、ここでいうデータ(第1データ)は、機械語プログラムが実行されるまでにOSによってメモリ中の領域が確保され、そのデータのメモリアドレスが決定される意味の属性を持ったものであり、OSはこの属性に従って動作するため第1データの先頭アドレスには確保したメモリ領域のメモリアドレスが設定されることになる。また、第2変換手段を特開2000−40005号公報に開示されている従来技術を用いて具体化したならば、コードサイズの削減等が図れる。
【0024】また、本発明に係るプログラム変換装置は、動的に領域を確保して当該領域の先頭アドレスをポインタ型変数に代入する動的領域確保文を複数含むソースプログラムを、機械語プログラムに変換するプログラム変換装置であって、前記複数の動的領域確保文それぞれにより確保されるべき領域のサイズを計算するサイズ計算手段と、引数としてサイズを受け取り当該サイズの領域を動的に確保して当該領域の先頭アドレスを返却するサブルーチンである動的領域確保ルーチンを、前記複数の動的領域確保文それぞれにより確保されるべき領域のサイズの合計値を引数として呼び出すことにより、前記複数の動的領域確保文により確保されるべき全ての領域を一括して確保するためのサブルーチンコール命令を生成する動的領域確保ルーチン呼出命令生成手段と、前記サブルーチンコール命令の実行により返却されるアドレスと前記サイズ計算手段により計算された前記各領域のサイズとに基づき、前記動的領域確保ルーチンにより確保される領域のうち前記複数の動的領域確保文それぞれの分に相当する各領域の先頭アドレスを算出する先頭アドレス算出手段と、前記複数の動的領域確保文それぞれを、当該動的領域確保文に対応して前記先頭アドレス算出手段により算出された領域の先頭アドレスを該当するポインタ型変数に代入する命令に変換する変換手段とを備えることを特徴とする。
【0025】上記構成により、一般に比較的実行時間の長い動的領域確保ルーチンを呼び出す回数を削減できるため、変換結果のプログラムの実行速度が向上するようになる。
【0026】
【発明の実施の形態】以下、本発明の実施の形態に係るプログラム変換装置について、図面を用いて詳細に説明する。
<構成>図1は、本発明の実施の形態に係るプログラム変換装置100の機能構成図である。
【0027】プログラム変換装置100は、コンピュータに備えられたメモリに格納されたプログラムがCPUにより実行されることで、ソースプログラムを機械語プログラムに翻訳(変換)する動作を行ういわゆるコンパイラであり、機能的には、制御部102、オブジェクト生成関数変換部103、動的領域確保文検出部104、記憶部105、オブジェクト生成文変換部106、動的確保領域計算部107、オブジェクト生成関数呼び出し翻訳部108及び一般文翻訳部109から構成される。
【0028】コンピュータに備えられたメモリに格納されたプログラムにおいて、制御部102は、メインルーチンに相当し、オブジェクト生成関数変換部103、動的領域確保文検出部104、オブジェクト生成文変換部106、動的確保領域計算部107、オブジェクト生成関数呼び出し翻訳部108及び一般文翻訳部109はサブルーチンに相当する。
【0029】同図には、プログラム変換装置100の他に入力ファイル101及び出力ファイル110も記載している。ここで、入力ファイル101にはオブジェクト指向言語で記述されたソースプログラムが格納されている。また、出力ファイル110には、プログラム変換装置100が入力ファイル101を翻訳した結果として生成する機械語命令列が格納される。
【0030】制御部102は、入力ファイル101からメモリにソースプログラムを読み込み、ソースプログラム中の各文に逐次着目して、着目した文の種類により、処理を振り分ける機能を有する。即ち、制御部102は、着目した文の種類に応じて、オブジェクト生成関数変換部103、オブジェクト生成文変換部106又は一般文翻訳部109を起動する。ここで、着目とは、処理対象とすること、即ち、処理をするためにポインタ等により所在を特定することをいう。
【0031】オブジェクト生成関数変換部103は、ソースプログラム中のオブジェクト生成関数の定義が着目されたときに制御部102に起動されるものであり、オブジェクト生成関数の定義中に動的領域確保文が存在するか検出させるべく動的領域確保文検出部104を起動し、動的領域確保文が検出された場合には、新たに静的オブジェクト生成関数を生成しその静的オブジェクト生成関数をその動的領域確保文と対にして記憶部105に格納する機能を有する。
【0032】ここで、静的オブジェクト生成関数とは、動的領域確保文を含んでいた元のオブジェクト生成関数に基づき生成される関数であり、静的オブジェクト生成関数の仮引数は、元のオブジェクト生成関数の仮引数にポインタ型の仮引数を追加したものであり、静的オブジェクト生成関数の処理内容については、元のオブジェクト生成関数の動的領域確保文を、その動的領域確保文における代入先のポインタ型のメンバ変数にその新しく追加した仮引数の値を代入する代入文に置き換えたものである。
【0033】動的領域確保文検出部104は、オブジェクト生成関数の定義中に動的領域確保文が存在するか調べて、存在する場合には動的領域確保文を呼び出し元であるオブジェクト生成関数変換部103に伝え、存在しなければその旨を伝える機能を有する。記憶部105は、メモリ中の特定の領域である。
【0034】オブジェクト生成文変換部106は、ソースプログラム中のオブジェクト生成文が着目されたときに制御部102に起動されるものであり、オブジェクト生成文のオブジェクトのクラスに対応する静的オブジェクト生成関数が記憶部105に既に格納されているか否かを判定し、格納されている場合には静的オブジェクト生成関数と対となっている動的領域確保文を指定してその動的領域確保文が確保する領域のサイズを計算させるべく動的確保領域計算部107を起動しそのサイズが定数値であった場合にはオブジェクト生成文を、その定数値をサイズとし初期値指定なしのRAM領域に配置されるべき属性のデータとそのRAM領域の先頭アドレスをポインタ型の実引数として呼び出す静的オブジェクト生成関数呼び出しコードとに変換し、オブジェクト生成関数呼び出し翻訳部108を起動する機能を有する。また、オブジェクト生成文変換部106は、動的確保領域計算部107の起動結果として、動的領域確保文が確保する領域のサイズが定数値とならないと判明した場合には、オブジェクト生成文をオブジェクト生成関数呼び出しコードに変換し、オブジェクト生成関数呼び出し翻訳部108を起動する機能を有する。ここで、静的オブジェクト生成関数呼び出しコードは、静的オブジェクト生成関数を呼び出す意味の中間表現即ち内部処理用の形式のコードであり、オブジェクト生成関数呼び出しコードは、オブジェクト生成関数を呼び出す意味の中間表現である。
【0035】なお、RAM領域に配置されるべき属性のデータ或いはROM領域に配置されるべき属性のデータは、それらを含む機械語プログラムが特定のプロセッサ上でOS等の制御下で実行される際において、実行前にメモリに割り当てられることになり、これらのデータに初期値指定があればその初期値がメモリに格納されることになる。
【0036】動的確保領域計算部107は、オブジェクト生成文変換部106から指定された動的領域確保文が確保する領域のサイズを計算してオブジェクト生成文変換部106にサイズを返し、サイズが定数値とならない場合にはサイズの返却の代わりにサイズが定数値とならない旨の通知を返す。オブジェクト生成関数呼び出し翻訳部108は、オブジェクト生成文変換部106により起動され、オブジェクト生成文を参照しつつ、静的オブジェクト生成関数呼び出しコード又はオブジェクト生成関数呼び出しコードを翻訳する機能を有する。即ち、これらの関数呼び出しコードにより生成されるオブジェクトの各メンバ変数の初期値を計算し、いずれのメンバ変数の初期値も定数であった場合には、そのオブジェクトがconstオブジェクトであれば、その関数呼び出しコードをその定数を初期値とするROM領域に配置されるべき属性のデータに翻訳し、constオブジェクトでなければ、その関数呼び出しコードを、その定数を初期値とするRAM領域に配置されるべき属性のデータに翻訳する。関数呼び出しコードにより生成されるオブジェクトの初期値の計算結果が定数以外の場合は、オブジェクトのサイズであり初期値指定なしのRAM領域に配置されるべき属性のデータと、静的オブジェクト生成関数又はオブジェクト生成関数に相当するサブルーチンのサブルーチンコール命令列に翻訳する。
【0037】また、サブルーチンコールで呼び出されるサブルーチンに相当する関数の定義が翻訳されていなければ、関数の定義を翻訳する。なお、オブジェクト生成関数呼び出し翻訳部108は翻訳結果を出力ファイル110に出力する。一般文翻訳部109は、制御部102により起動され、オブジェクト生成文以外の文を機械語命令列に翻訳し、出力ファイル110に出力する一般文翻訳処理を行う機能を有する。この一般文翻訳処理は、一般的なプログラム変換装置で用いられている通常の翻訳処理である。
<データ>図2は、オブジェクト生成関数変換部103が記憶部105に格納するデータの内容例を示す図である。
【0038】同図に示すように、記憶部105には動的領域確保文と静的オブジェクト生成関数の定義との組が格納される。なお、同図にはわかりやすくするため動的領域確保文や静的オブジェクト生成関数の定義等をC++言語で記述して示したが、実際にはプログラム変換装置100は、一般のプログラム変換装置と同様に、入力ファイル101からソースプログラムをメモリに読み込んだ後に中間表現に変換して翻訳処理を行うものであり、これに合わせて静的オブジェクト生成関数の定義も中間表現の形式で生成する。
【0039】同図の例に示す「_IntArray_static」という静的オブジェクト生成関数は、図12に示した「memp=new int[size];」という動的領域確保文に対応して、その動的領域確保文を含む「IntArray」というオブジェクト生成関数に基づいてオブジェクト生成関数変換部103により生成されたものである。
【0040】この「_IntArray_static」という静的オブジェクト生成関数の仮引数は、「IntArray」の仮引数である「int size」と、新たに追加された「void *area」とである。また、静的オブジェクト生成関数中の「memp=area;」という文は、「IntArray」中の動的領域確保文における「new int[size]」を仮引数の内容である「area」に置き換えたものである。
<動作>以下、上述した構成を備えるプログラム変換装置100の動作について説明する。
【0041】ここでは、入力ファイル101に図12に示したC++言語のソースプログラムが格納されていることとし、プログラム変換装置100がそのソースプログラムを変換する場合を例にして説明する。図3は、プログラム変換装置100の全体的な動作を示すフローチャートである。
【0042】まず、プログラム変換装置100の制御部102は入力ファイル101に格納されているソースプログラムを読み込み、そのプログラム中の一文に着目する(ステップS301)。なお、一文にはオブジェクト生成関数の定義も含まれるものとする。続いて制御部102は、着目した文がオブジェクト生成関数の定義であるか否かを判定し(ステップS302)、オブジェクト生成関数の定義であった場合には、オブジェクト生成関数の定義を入力としてオブジェクト生成関数変換部103を起動することにより、オブジェクト生成関数変換処理を行わせる(ステップS303)。オブジェクト生成関数変換処理は、一定条件下で静的オブジェクト生成関数を生成する処理であり、その詳しい内容については後述する。
【0043】ここでは、着目した文がクラスIntArrayのオブジェクト生成関数「IntArray(int size)」の定義であれば、オブジェクト生成関数変換処理が行われることになる。着目した文がオブジェクト生成関数の定義でない場合には、制御部102は、着目した文がオブジェクト生成文であるか否かを判定し(ステップS305)、オブジェクト生成文であったときには、オブジェクト生成文を入力としてオブジェクト生成文変換部106を起動することにより、オブジェクト生成文変換処理を行わせる(ステップS306)。オブジェクト生成文変換処理は、オブジェクト生成文を一旦、静的オブジェクト生成関数呼び出しコード又はオブジェクト生成関数呼び出しコードに変換し、その変換結果である関数呼び出しコードを翻訳する処理であり、その詳しい内容については後述する。
【0044】ここでは、着目した文がクラスIntArrayのオブジェクト生成文「const IntArray ArrayObj(10);」であれば、オブジェクト生成文変換処理が行われることになる。また、ステップS305において着目した文がオブジェクト生成文でなかった場合には、その文を入力として、一般文翻訳部109を起動して一般文翻訳処理を行わせる(ステップS307)。
【0045】オブジェクト生成関数変換処理(ステップS303)、オブジェクト生成文変換処理(ステップS306)又は一般文翻訳処理(ステップS307)が終了した後、制御部102は未だ着目していない文があるか否かを判定し(ステップS304)、あればステップS301に戻って次の文に着目し、なければ動作を終了する。
【0046】以下、オブジェクト生成関数変換処理について説明する。図4は、主にオブジェクト生成関数変換部103により行われるオブジェクト生成関数変換処理を示すフローチャートである。オブジェクト生成関数変換部103は、オブジェクト生成関数の定義を入力として制御部102に起動されると、動的領域確保文検出部104にオブジェクト生成関数の定義に動的領域確保文が含まれればこれを検出させる(ステップS401)。
【0047】オブジェクト生成関数変換部103は、動的領域確保文が存在しない旨の通知を動的領域確保文検出部104から受けるとオブジェクト生成関数変換処理を終了する(ステップS402)。動的領域確保文検出部104により動的領域確保文が検出された場合にはオブジェクト生成関数変換部103は、入力されたオブジェクト生成関数の定義をコピーして名前だけを変更して新たにオブジェクト生成関数の定義を生成する(ステップS403)。名前の変更は予め定めた命名規則に従うものとする。この命名規則は例えば元のオブジェクト生成関数の名前の前に「_」を付加し、後に「_static」を付加するものである。
【0048】図12に示した例では、「IntArray(int size)」の定義が入力され、この定義中に「memp=new int[size];」という動的領域確保文が存在するため、オブジェクト生成関数変換部103は、「_IntArray_static(int size)」の定義を生成する。ステップS403に続いて、オブジェクト生成関数変換部103は生成したオブジェクト生成関数の仮引数としてポインタ型の仮引数を追加する(ステップS404)。仮引数名は所定の規則に従って定めるものであり、例えば「area」と定める。
【0049】ポインタ型の仮引数を追加した後、オブジェクト生成関数変換部103は、新たに生成したオブジェクト生成関数の定義に含まれる動的領域確保文の右辺を、追加した仮引数に置き換える(ステップS405)。これにより静的オブジェクト生成関数の定義が生成されることになる。ステップS405に続いて、オブジェクト生成関数変換部103は、検出された動的領域確保文と、生成した静的オブジェクト生成関数の定義とを対にして記憶部105に記憶し、オブジェクト生成関数変換処理を終了する(ステップS406)。
【0050】この結果、記憶部105には図2に示したデータが格納されることになる。以下、オブジェクト生成文変換処理について説明する。図5は、オブジェクト生成文変換処理を示すフローチャートである。オブジェクト生成文変換部106は、オブジェクト生成文を入力として起動されると、そのオブジェクト生成文により呼び出されるオブジェクト生成関数に対応する静的オブジェクト生成関数の定義が既に生成され記憶部105に格納されているか否かを判定する(ステップS501)。オブジェクト生成文「const IntArray ArrayObj(10);」が入力されると、オブジェクト生成文変換部106はクラス名「IntArray」から所定の命名規則に従って対応する静的オブジェクト生成関数名が「_IntArray_static」であることを導き、その関数名をキーとして記憶部105から検索することになる。
【0051】既に記憶部105にオブジェクト生成文に対応する静的オブジェクト生成関数の定義が格納されている場合には、オブジェクト生成文変換部106は、動的確保領域計算部107を起動し、動的領域確保文で確保される領域のサイズを計算させる(ステップS502)。動的確保領域計算部107は、動的領域確保文により確保される領域のサイズがオブジェクト生成関数への仮引数で表されている場合にはその仮引数に対応するオブジェクト生成文の実引数の値を用いて、そのサイズ計算を行う。
【0052】ここでは、動的領域確保文の右辺の「new int(size)」で確保される領域のサイズは、仮引数「size」に対応する実引数値が「10」であるため、int型の4バイトと10とを乗ずることにより40と計算されることになる。オブジェクト生成文変換部106は、ステップS502によるサイズの計算結果が定数であるか否かを判定し(ステップS503)、定数である場合には、計算されたサイズの初期値指定のないRAM領域に配置されるべき属性のデータを生成し(ステップS504)、オブジェクト生成文を、ステップS504で生成したデータの先頭アドレスを実引数にした静的オブジェクト生成関数呼び出しコードに変換する(ステップS505)。
【0053】ここでは、図12に示すオブジェクト生成文に対応して、ステップS504で「_area00」という名前で識別可能な40バイトのRAM領域に配置されるべき属性のデータが生成され、ステップS505でその先頭アドレスを実引数に含む「_IntArray_static(10,&_area00);」という静的オブジェクト生成関数呼び出しコードが生成されることになる。
【0054】なお、オブジェクト生成文変換部106は、ステップS501においてオブジェクト生成文に対応する静的オブジェクト生成関数の定義が生成済みでないと判定した場合、又はステップS503において動的領域確保文により確保される領域のサイズが定数でないと判定した場合には、オブジェクト生成文を単にオブジェクト生成関数呼び出しコードに変換する(ステップS506)。例えば、もしIntArrayが動的領域確保文を含まないオブジェクト生成関数であったならば、「IntArray(10);」というオブジェクト生成関数呼び出しコードが生成されることになる。
【0055】ステップS503において動的領域確保文により確保される領域のサイズが定数でないと判定される場合としては、例えば、確保領域のサイズの算出基礎となる変数が、ユーザからの入力値等のOSの提供する入出力ルーチンの戻り値である場合等が挙げられる。オブジェクト生成文変換部106は、ステップS505の実行後には生成した静的オブジェクト生成関数呼び出しコードを入力としオブジェクト生成関数呼び出し翻訳部108を起動することにより、またステップS506の実行後には生成したオブジェクト生成関数呼び出しコードを入力としオブジェクト生成関数呼び出し翻訳部108を起動することにより、関数呼出しコード翻訳処理を行わせ(ステップS507)、オブジェクト生成文変換処理を終える。
【0056】以下、この関数呼び出しコード翻訳処理について説明する。図6は、オブジェクト生成関数呼び出し翻訳部108によりなされる関数呼び出しコード翻訳処理を示すフローチャートである。オブジェクト生成関数呼び出し翻訳部108は、オブジェクト生成文変換部106から静的オブジェクト生成関数呼び出しコード又はオブジェクト生成関数呼び出しコードを入力として起動されると、オブジェクト生成関数の定義とオブジェクト生成関数呼び出しコードにおける実引数とに基づいて、そのオブジェクト生成関数に対応して生成されることになるオブジェクトの各メンバ変数の初期値を計算し(ステップS601)、全てのメンバ変数の初期値が定数であるか否かを判定する(ステップS602)。つまり、実際にプログラムを動作させることなくコンパイル時においてメンバ変数の値を算定することができるかを判定する。なお、このステップS601、S602に示す処理の実現には、特開2000−40005号公報に開示されている従来技術を使用すればよい。
【0057】ステップS602において定数であると判定した場合には、オブジェクト生成関数呼び出し翻訳部108は、そのオブジェクトは実行時にオブジェクトの値が変化しないconstオブジェクトか否かを「const」という修飾子の有無により判定し(ステップS603)、constオブジェクトであれば入力された関数呼び出しコードを、その定数を初期値としたROM領域に配置されるべき属性のデータに翻訳し(ステップS604)、関数呼び出しコード翻訳処理を終える。また、ステップS603においてconstオブジェクトでないと判定した場合には、オブジェクト生成関数呼び出し翻訳部108は入力された関数呼び出しコードを、ステップS601で計算された初期値のRAM領域に配置されるべき属性のデータに翻訳し(ステップS605)、関数呼び出しコード翻訳処理を終える。なお、翻訳結果は出力ファイル110に出力されることになる。
【0058】また、ステップS602において少なくとも1つのメンバ変数の初期値が定数でないと判断した場合、即ち入力された関数呼び出しコードの実引数と、その関数呼び出しコードにより呼び出されるオブジェクト生成関数の定義とに基づいた計算によってもメンバ変数が定数値として特定できない場合には、オブジェクト生成関数呼び出し翻訳部108は全メンバ変数に相当するサイズであって初期値指定なしのRAM領域に配置されるべき属性のデータを生成し(ステップS606)、入力された関数呼び出しをオブジェクト生成関数のサブルーチンコール命令列に翻訳し(ステップS607)、関数呼び出しコード翻訳処理を終える。
【0059】「_IntArray_static(10,&_area00);」という静的オブジェクト生成関数呼び出しコードを入力されて呼び出された場合には、オブジェクト生成関数呼び出し翻訳部108は、図12に示すオブジェクトのメンバ変数「length」及び「memp」の初期値を、静的オブジェクト生成関数の定義に含まれる「length=size;」及び「memp=area;」という代入文と静的オブジェクト生成関数呼び出しコードの実引数「10」及び「&_area00」とより、それぞれ「10」,「&_area00」と計算し、「&_area00」は、プログラム実行前にRAM領域のアドレス値として定まるものであるため、メンバ変数の初期値が定数であると判定する。この場合、元のオブジェクト生成文は「const」という修飾子を有するものであるため、ステップS604が実行され翻訳結果として、ROM領域に配置されるべき属性のオブジェクトデータが得られる。
【0060】こうして、図12に示したソースプログラムは、プログラム変換装置100により、図7で示される機械語命令列に翻訳され、出力ファイル110に出力される。<考察>図7は、プログラム変換装置100による図12に示したソースプログラムの翻訳結果を示す図である。
【0061】結果的に、ソースプログラム中のオブジェクト生成文が図7に示す機械語命令列に変換されたことになる。同図中、「.section RAMAREA」から「.section END」に挟まれた部分は、RAM領域に配置されるべき属性のデータを表し、「_area00:40」は、_area00という名前で識別されるデータ領域が40バイトのサイズであることを表している。
【0062】また、「.section ROMAREA」から「.section END」に挟まれた部分は、ROM領域に配置されるべき属性のデータを表し、「ArrayObj 10:4,&_area00:4」は、ArrayObjというオブジェクトの初期値として4バイトの即値データ10及び4バイトの即値アドレス&_area00がROM領域に格納されることを表している。
【0063】この図7に示すプログラム変換装置100による翻訳結果と、図13に示した従来のプログラム変換装置による翻訳結果とを比較すると、プログラム変換装置100によれば、オブジェクト生成関数に相当する機械語命令列が生成されておらずこのためコードサイズが削減されていることが明らかであり、memory_alloc_funcという動的領域確保関数を呼び出すサブルーチンコール等も生成していないため、プログラムの実行速度が向上する。
【0064】また、プログラム変換装置100によれば、ArrayObjをRAM領域ではなく、ROM領域に配置されるべき属性のデータとするため、生成されたプログラムの実行に必要となるRAM領域も削減される。
<補足>以上、本発明に係るプログラム変換装置について、実施の形態に基づいて説明したが、本発明はこの実施の形態に限られないことは勿論である。即ち、(1)本実施の形態では、プログラム変換装置は、C++言語で記述されたソースプログラムを翻訳対象としたが、これに限定されることはなく、他のオブジェクト指向言語で記述されたソースプログラムを翻訳対象とするものであってもよい。
(2)本実施の形態では、記憶部105には静的オブジェクト生成関数の定義を動的領域確保文と対にして格納することとしたが、静的オブジェクト生成関数の定義を元のオブジェクト生成関数の定義と対応付けて格納することとしてもよい。
【0065】また、プログラム変換装置の処理手順は、フローチャートによって示した手順に限定されることはない。即ち、ソースプログラムのオブジェクト生成関数の定義中に動的領域確保文が存在し、その動的領域確保文によって確保される領域のサイズをソースプログラムの内容に基づいてコンパイル時に固定値として算定することができたならば、動的領域確保文を、その算定したサイズのRAM領域に配置されるべき属性のデータと、そのデータの先頭アドレスを動的領域確保文によりアドレスが代入されることになっていたメンバ変数に代入する中間表現とに変換する手順であればよい。これにより比較的に実行時間の長いところの動的領域確保関数のサブルーチンコールが不要となるため、プログラムの実行速度の向上を図ることができる。更に、その結果としてオブジェクトの全メンバ変数がコンパイル時に固定値として算定することができるものになったならば、オブジェクト生成関数のサブルーチンコール等のコードを生成することなく、その全メンバ変数の値である固定値を初期値としてもつRAM領域或いはROM領域に配置されるべき属性のデータをオブジェクト生成文の翻訳結果とする手順であればよい。これにより実行速度はさらに向上し、コードサイズも削減される。なお、中間表現は、ソースプログラムレベルの記述形式であっても差し支えない。
(3)本実施の形態で示したプログラム変換装置100は、動的領域確保文によって確保される領域のサイズがコンパイル時に固定値として算定することができなかった場合には、従来のプログラム変化装置と同様の動作を行うことになり、翻訳結果のプログラムは、オブジェクト生成関数に相当する機械語サブルーチン内で_memory_alloc_funcという動的領域確保関数を呼び出すものとなる。しかし、動的領域確保文によって確保される領域のサイズがコンパイル時には固定値として算定できなくても、オブジェクト生成文に相当する機械語命令列の実行前に固定値として算定することができれば、実施の形態において示したような確保領域の先頭アドレスをオブジェクト生成関数に相当する機械語サブルーチンに引数として与える方式を利用することにより、オブジェクト生成関数に相当する機械語サブルーチンから動的領域確保関数の呼び出しを削除することが可能になる。この方法により、ソースプログラムに同一クラスのオブジェクト生成文が複数記述されているような場合において動的領域確保関数の呼び出し回数を削減し、実行時間の短縮を図ることが可能になる。以下に、この方法について説明する。
【0066】図8は、図12に示したものと同じクラスIntArrayの定義と、新たにクラスIntArrayのオブジェクトを生成する2つのオブジェクト生成文とを含むC++言語のソースプログラムの一部を示す図である。図8中、getsizeは、引数として渡した番号に応じてプログラム実行環境中の特定の要素に関するサイズを取得する関数である。
【0067】従って、ArrayObj1というオブジェクトについてのメンバ変数lengthの初期値は、getsize(1)の実行結果として取得したサイズとなり、メンバ変数mempの初期値は、そのlengthで示されるサイズの確保された領域についての先頭アドレスとなる。また、ArrayObj2というオブジェクトについてのメンバ変数lengthの初期値は、getsize(2)の実行結果として取得したサイズとなり、メンバ変数mempの初期値は、そのlengthで示されるサイズの確保された領域についての先頭アドレスとなる。
【0068】図9は、従来のプログラム変換装置が図8に示したオブジェクト生成文を翻訳した結果である機械語命令列を示す図である。図9に示す機械語命令列では、_InitObj中においてArrayObj1とArrayObj2という2つのオブジェクトを生成するためにオブジェクト生成関数に相当するサブルーチンであるIntArrayが2度呼び出されており、そのIntArray中では_memory_alloc_funcが呼び出されている。従って、このプログラムが実行されると、_memory_alloc_funcという動的領域確保関数が2度実行されることになる。
【0069】これに対し、確保した領域の先頭アドレスをオブジェクト生成関数に相当する機械語サブルーチンに引数として与える方式を用いる本発明に係るプログラム変換装置による翻訳結果を次に示す。図10は、本発明の方式を用いて図8に示したオブジェクト生成文を翻訳した結果である機械語命令列を示す図である。
【0070】図10に示す機械語命令列では、オブジェクト生成関数に相当するサブルーチンとして、上述の実施の形態に静的オブジェクト生成関数として示したものと同様に、通常のIntArrayに対してポインタ型の引数を追加しその引数をメンバ変数に代入するものである_IntArray_staticが存在する。また、_InitObj中において_memory_alloc_funcが1度呼び出され、_IntArray_staticが2度呼び出されている。
【0071】この図10に示す機械語命令列の内容を図11に高級言語レベルの表記を用いて簡単に示す。以下、図11に基づいて説明する。「s1=getsize(1);」、「s2=getsize(2);」は、図8に示した2つのオブジェクト生成文それぞれの実引数として記述されたgetsizeに基づいて生成される。これらが実行されると、getsizeによって得られたそれぞれのサイズがs1、s2に代入されることになる。
【0072】「areatop=_memory_alloc_func((s1+s2)*4);」は、s1で示されるサイズとs2で示されるサイズの合計分だけのint型の領域を確保して、その先頭アドレスをareatopに代入するものである。従来のように領域確保を2度行うのではなく、2度分の合計サイズの領域を1度で確保することになる。
【0073】「_IntArray_static(&ArrayObj1,s1,areatop);」は、ArrayObj1オブジェクトのメンバ変数に設定するため、サイズを示すs1と確保された領域の先頭アドレスであるareatopとをオブジェクト生成関数に相当するサブルーチンに渡すものである。「_IntArray_static(&ArrayObj2,s2,areatop+(s1*4));」は、ArrayObj2オブジェクトのメンバ変数に設定するため、サイズを示すs2と、まとめて1度で確保された領域のうちArrayObj2用の領域の先頭アドレスであるareatop+(s1*4)とをオブジェクト生成関数に相当するサブルーチンに渡すものである。
【0074】このように、複数の動的領域確保文を1つにまとめることにより、動的に領域を確保するライブラリ関数又はシステムコールの呼び出しを1度に削減することができ、実行時間の短縮が図れる。
(4)本実施の形態では、動的領域確保文によって確保される領域の初期値は計算せずに、動的領域確保文に対応してRAM領域に配置されるべき属性のデータを生成する方法を用いたが、動的領域確保文によって確保された領域についても、オブジェクトのメンバ変数の初期値の計算と同様の方法で初期値を計算し定数であるか否かを判定し、初期値が定数であってその領域の内容が実行時に変更されないと判明している場合はROM領域に配置されるべき属性のデータに翻訳することとしてもよい。これにより、動的領域確保文によって確保される領域に格納されるデータもROM領域に予め置くことが可能となるため、プログラムの実行に必要なRAM領域を更に削減できるようになる。
(5)本実施の形態では、動的領域確保文が1つの場合について説明したが、動的領域確保文が複数であっても、ポインタ型の仮引数を動的領域確保文の数だけ増やし、動的領域確保文を、メンバ変数にポインタ型の仮引数を代入する文に置換することとして静的オブジェクト生成関数を生成し、また各動的領域確保文により確保されるサイズの領域についての各先頭アドレスを実引数としてその静的オブジェクト生成関数を呼び出すようにすればよい。
(6)本実施の形態では特に示さなかったが、動的領域確保文により確保される領域とオブジェクトのメンバ変数を格納するための領域が共にROM領域に配置されるべき属性のデータとなった場合又は共にRAM領域に配置されるべき属性のデータとなった場合には、これらのデータを隣接するメモリ領域に割り当てられるような属性のものとしてもよい。即ち、各データの相対アドレスを指定して連続したアドレスに位置されるように設定することとしてもよい。このようにするとオブジェクトのメンバ関数によってアクセスされる領域が隣接していることになるため、ハードウェアアーキテクチャやOSの仕様によっては、2つの領域が離れているのに比べて高速に参照が可能となり、プログラム実行速度が向上する。
(7)本実施の形態では動的領域確保文に対応して生成されたデータは、初期値指定のないRAM領域に配置されるべき属性のデータであるとしたが、任意の初期値を指定するものとしても差し支えない。
(8)実施の形態において図3〜図6を用いて示したプログラム変換装置の処理手順を汎用のコンピュータに実行させるためのコンピュータプログラムを、記録媒体に記録し又は各種通信路等を介して、流通させ頒布することもできる。
【0075】かかる記録媒体には、ICカード、光ディスク、フレキシブルディスク、ROM等がある。流通、頒布されたコンピュータプログラムは、汎用のコンピュータにインストール等されることにより利用に供され、汎用のコンピュータは、当該コンピュータプログラムを実行して、本実施の形態に示したようなプログラム変換装置を実現する。
【0076】
【発明の効果】以上の説明から明らかなように本発明に係るプログラム変換装置は、動的に領域を確保して当該領域の先頭アドレスをポインタ型変数に代入する動的領域確保文を含むオブジェクト生成関数を呼び出すことによりオブジェクトを生成するオブジェクト生成文が記述されたソースプログラムを、機械語プログラムに変換するプログラム変換装置であって、前記オブジェクト生成文により前記オブジェクト生成関数が呼び出されたと仮定した場合において前記動的領域確保文によって確保される領域のサイズを計算する計算手段と、前記計算手段により計算された前記領域のサイズが定数値である場合には、前記動的領域確保文を、当該サイズの第1データと、当該第1データの先頭アドレスを前記ポインタ型変数に代入するための中間表現とに変換する第1変換手段と、前記第1変換手段により動的領域確保文が変換された後のオブジェクト生成関数を、前記オブジェクト生成文が呼び出すものとして、前記オブジェクト生成文を機械語命令に変換する第2変換手段とを備えることを特徴とする。
【0077】これにより、動的領域確保文により確保されることが予定されていた領域は機械語プログラム中においてデータとして置かれることになるため、動的領域確保関数のサブルーチンコールを行わないことによりプログラム実行速度が向上する。また、第2変換手段を特開2000−40005号公報に開示されている従来技術を用いて具体化したならば、コードサイズの削減等が図れる。
【0078】また、前記第2変換手段は、前記第1変換手段による変換後の前記オブジェクト生成関数が前記オブジェクト生成文により呼び出されたと仮定した場合における当該呼出によって前記オブジェクトのメンバ変数に対し設定される値が定数値であるときに、前記オブジェクト生成文を、前記メンバ変数に設定されるアドレス値又は定数値をもつデータであってオブジェクトのメンバ変数と同じサイズの第2データに変換し、さらに前記オブジェクト生成文により生成されるオブジェクトが値の変化しないオブジェクトであれば当該第2データをROM領域に配置されるべき属性のデータにするものとしてもよい。
【0079】これにより、オブジェクト生成文を、オブジェクト生成関数を呼び出した後になるであろう状態のオブジェクトデータ(即ち第2データ)に翻訳し、またオブジェクト生成文がconst修飾子を持つものであればそのオブジェクトデータにROM領域に配置されるべき属性を与えるため、オブジェクト生成関数に相当するコードが削減でき、実行時に必要なRAM領域を削減し得るようになる。組み込み用途のマイクロコンピュータにおいては一般にRAMはROMよりコストが高いため、これによりコスト削減が図れる。
【0080】また、前記第2変換手段は、前記第1変換手段による変換後の前記オブジェクト生成関数が前記オブジェクト生成文により呼び出されたと仮定した場合における当該呼出によって前記第1データに対し設定される値が定数値であるときに、当該定数値を前記第1データの初期値とし、さらに前記第1データが初期値から変化しないものであれば前記第1データをROM領域に配置されるべき属性のデータにするものとしてもよい。
【0081】これにより、動的領域確保文により確保されることが予定されていた領域を、一定条件下でROM領域に配置されるべき属性のデータとして機械語プログラム中に置くことになるため、コスト削減が図れる。また、前記第1変換手段は、前記動的領域確保文を含むオブジェクト生成関数を基礎として、ポインタ型の仮引数を追加しさらに前記動的領域確保文を、前記ポインタ型変数に前記仮引数を代入する代入文に置き換えた中間表現である静的オブジェクト生成関数を生成するものであり、前記第2変換手段は、前記オブジェクト生成文を、前記第1データの先頭アドレスを前記ポインタ型の仮引数として用いることができるように渡して前記第1変換手段により生成された前記静的オブジェクト生成関数を呼び出す中間表現に変換し、当該中間表現に応じた機械語命令を生成するものとしてもよい。
【0082】これにより、動的領域確保文をオブジェクト生成関数から除去するためのプログラム変換装置の処理構造を比較的簡単なものにすることができる。また、前記第1データと、前記オブジェクトのメンバ変数に対応するデータとを隣接するメモリ領域に割り当てられる属性のデータにすることとしてもよい。これにより、機械語プログラムの動作環境となるハードウェアアーキテクチャやOSの仕様によってはプログラム実行速度が向上する。
【0083】また、本発明に係るプログラム変換装置は、動的に領域を確保して当該領域の先頭アドレスをポインタ型変数に代入する動的領域確保文を複数含むソースプログラムを、機械語プログラムに変換するプログラム変換装置であって、前記複数の動的領域確保文それぞれにより確保されるべき領域のサイズを計算するサイズ計算手段と、引数としてサイズを受け取り当該サイズの領域を動的に確保して当該領域の先頭アドレスを返却するサブルーチンである動的領域確保ルーチンを、前記複数の動的領域確保文それぞれにより確保されるべき領域のサイズの合計値を引数として呼び出すことにより、前記複数の動的領域確保文により確保されるべき全ての領域を一括して確保するためのサブルーチンコール命令を生成する動的領域確保ルーチン呼出命令生成手段と、前記サブルーチンコール命令の実行により返却されるアドレスと前記サイズ計算手段により計算された前記各領域のサイズとに基づき、前記動的領域確保ルーチンにより確保される領域のうち前記複数の動的領域確保文それぞれの分に相当する各領域の先頭アドレスを算出する先頭アドレス算出手段と、前記複数の動的領域確保文それぞれを、当該動的領域確保文に対応して前記先頭アドレス算出手段により算出された領域の先頭アドレスを該当するポインタ型変数に代入する命令に変換する変換手段とを備えることを特徴とする。
【0084】これにより、一般に比較的実行時間の長い動的領域確保ルーチンを呼び出す回数を削減できるため、変換結果のプログラムの実行速度が向上するようになる。
【出願人】 【識別番号】000005821
【氏名又は名称】松下電器産業株式会社
【出願日】 平成12年10月3日(2000.10.3)
【代理人】 【識別番号】100090446
【弁理士】
【氏名又は名称】中島 司朗 (外1名)
【公開番号】 特開2002−108628(P2002−108628A)
【公開日】 平成14年4月12日(2002.4.12)
【出願番号】 特願2000−304148(P2000−304148)