(57)【特許請求の範囲】
【請求項１】
実行の際の動的な記憶領域の確保を指示する第1識別子および前記第１の識別子にて確保した動的な記憶領域の解放を指示する第2識別子を含む所定の識別子が用いられるソースプログラムを、中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム変換装置であって、
前記ソースプログラムを解読し中間形式プログラムに変換するソースプログラム解読手段と、
前記変換された中間形式プログラムの中から、前記第1識別子により確保される記憶領域の参照を指示することとなる識別子のうちの、最後に実行されることとなる識別子である参照識別子および、前記第１の識別子にて確保した動的な記憶領域の解放を指示する第2識別子に対応する命令の位置を検出する記憶領域参照箇所検出部と、
前記記憶領域参照箇所検出部による検出後、前記変換された中間形式プログラムの中で、前記参照識別子に対応する命令の直後に、前記確保した動的な記憶領域を解放する命令を挿入する挿入手段と、
前記記憶領域参照箇所検出部にて検出された前記変換された中間形式プログラムの中に位置する前記第2識別子に対応する命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除手段と、
前記挿入手段および前記記憶領域解放コード削除手段により変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成手段と
を備えることを特徴とするプログラム変換装置。
【請求項２】
所定の1つの対象に対する実行の際の動的な記憶領域の確保を指示する第1識別子と、所定のブロック内の命令の繰り返しを繰り返し回数とともに指示する第2識別子と、所定の複数の対象に対して連続的で、実行に際して動的な記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられるソース形式プログラムを、中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム変換装置であって、
前記ソースプログラムを解読し中間形式プログラムに変換するソースプログラム解読手段と、
前記変換された中間形式プログラムの中の、前記第1識別子に対応する命令の位置を特定する特定手段と、
前記第1識別子の位置が前記ブロック内に存在するか否かを判定する判定手段と、
前記第2識別子の繰り返し回数を検出する繰り返し回数検出手段と、
前記変換された中間形式プログラムの中から、前記第1識別子に対応する命令を削除する削除手段と、
前記ソースプログラム上で、前記第1識別子の対象となっていた前記繰り返し回数分の大きさを有する記憶領域が、前記変換された中間形式プログラムにおいて、前記第3識別子の対象として確保されるよう、前記第3識別子に対応する命令を前記変換された中間形式プログラムの中の前記第２識別子に対応する命令の直前に挿入する挿入手段と、
前記ソースプログラムに含まれる命令に対応する前記変換された中間形式プログラムに含まれる命令であって、前記第1識別子により確保される動的な記憶領域を解放するための命令が前記変換された中間形式プログラムの中にあれば、当該第1識別子により確保される動的な記憶領域を解放するための命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除手段と、
前記削除手段、前記挿入手段および前記記憶領域解放コード削除手段により変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成手段と
を備え、
前記判定手段により前記第1識別子の位置が前記ブロック内に存在すると判定されたとき、
前記繰り返し回数検出手段と、前記削除手段と、前記挿入手段が動作した後、前記記憶領域解放コード削除手段と前記実行形式プログラム生成手段が動作するように構成した
ことを特徴とするプログラム変換装置。
【請求項３】
実行の際の動的な記憶領域の確保を指示する第1識別子と、所定の小ブロックに対応する範囲内の命令の繰り返しを繰り返し回数とともに指示する第2識別子と、所定の複数の対象に対しての、所定の大ブロックに対応する範囲内の命令の実行の際のみの記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられるソース形式プログラムを、中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム変換装置であって、
前記ソースプログラムを解読し中間形式プログラムに変換するソースプログラム解読手段と、
前記変換された中間形式プログラムの中の、前記第1識別子に対応する命令の位置と、
前記第2識別子に対応する命令の位置と、前記第1識別子に対応する命令により確保される記憶領域の参照を指示することとなる参照識別子に対応する命令の位置とから、前記記憶領域の生存区間を特定する特定手段と、
前記特定した生存区間が大ブロックの内部にとどまっており、かつ、前記第1識別子の位置が小ブロック内に存在するか否かを判定する判定手段と、
前記第2識別子の繰り返し回数を検出する繰り返し回数検出手段と、
前記変換された中間形式プログラムの中から、前記第1識別子に対応する命令を削除する削除手段と、
前記ソースプログラム上で、前記第1識別子の対象となっていた前記繰り返し回数分の大きさを有する記憶領域が前記変換された中間形式プログラムにおいて、前記第3識別子の対象として確保されるよう、前記第3識別子に対応する命令を、前記変換された中間形式プログラムの中の前記大ブロックの内部かつ前記小ブロックの外部に挿入する挿入手段と、
前記ソースプログラムに含まれる命令に対応する前記変換された中間形式プログラムに含まれる命令であって、前記第1識別子により確保される動的な記憶領域を解放するための命令が前記変換された中間形式プログラムの中にあれば、当該第1識別子により確保される動的な記憶領域を解放するための命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除手段と、
前記削除手段、前記挿入手段および前記記憶領域解放コード削除手段により変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成手段と
を備え、
前記判定手段により前記特定した生存区間が大ブロックの内部にとどまっており、かつ、前記第1識別子の位置が小ブロック内に存在すると判定されたとき、
前記繰り返し回数検出手段と、前記削除手段と、前記挿入手段とが動作した後、前記記憶領域解放コード削除手段と前記実行形式プログラム生成手段が動作するように構成した
ことを特徴とするプログラム変換装置。
【請求項４】
実行の際の動的な記憶領域の確保を指示する第1識別子と、所定の小ブロックに対応する範囲内の命令の繰り返しを指示する第2識別子と、所定の大ブロックに対応する範囲内の命令の実行の際のみの記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられるソースプログラムを、中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム変換装置であって、
前記変換された中間形式プログラムの中の、前記第1識別子に対応する命令の位置と、
前記第2識別子に対応する命令の位置と、前記第1識別子に対応する命令により確保される記憶領域の参照を指示することとなる参照識別子に対応する命令の位置とから、前記記憶領域の生存区間を特定する特定手段と、
前記生存区間が小ブロックを1回実行する間以上存続するか否かを判定する判定手段と、
前記変換された中間形式プログラムの中から、前記第1識別子に対応する命令を削除する削除手段と、
前記ソースプログラム上で、前記第1識別子の対象となっていた記憶領域が前記変換された中間形式プログラムにおいて、前記第3識別子の対象として確保されるよう、前記第3識別子に対応する命令を、前記変換された中間形式プログラムの中の前記大ブロックの内部かつ前記小ブロックの外部に挿入する挿入手段と、
前記ソースプログラムに含まれる命令に対応する前記変換された中間形式プログラムに含まれる命令であって、前記第1識別子により確保される動的な記憶領域を解放するための命令が前記変換された中間形式プログラムの中にあれば、当該第1識別子により確保される動的な記憶領域を解放するための命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除手段と、
前記削除手段、前記挿入手段および前記記憶領域解放コード削除手段により変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成手段とを備え、
前記判定手段により前記生存区間が小ブロックを1回実行する間以上存続しないと判定されたとき、
前記削除手段と前記挿入手段が動作した後、前記記憶領域解放コード削除手段と前記実行形式プログラム生成手段が動作するように構成した
ことを特徴とするプログラム変換装置。
【請求項５】
実行の際の動的な記憶領域の確保を指示する第1識別子および前記第１の識別子にて確保した動的な記憶領域の解放を指示する第2識別子を含む所定の識別子が用いられるソースプログラムを、中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム実行装置に実行させるためのプログラム変換方法であって、
前記ソースプログラムを解読し中間形式プログラムに変換するソースプログラム解読ステップと、
前記変換された中間形式プログラムの中から、第1識別子により確保される記憶領域の参照を指示することとなる識別子のうちの、最後に実行されることとなる識別子である参照識別子、前記第１の識別子にて確保した動的な記憶領域の解放を指示する第2識別子に対応する命令の位置を検出する記憶領域参照箇所検出ステップと、
前記記憶領域参照箇所検出ステップによる検出後、前記変換された中間形式プログラムの中で、前記参照識別子に対応する命令の直後に、前記確保した動的な記憶領域を解放する命令を挿入する挿入ステップと、
前記記憶領域参照箇所検出ステップにて検出された前記変換された中間形式プログラムの中に位置する前記第2識別子に対応する命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除ステップと、
前記挿入ステップおよび前記記憶領域解放コード削除ステップにより変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成ステップと
を含むことを特徴とするプログラム変換方法。
【請求項６】
所定の1つの対象に対する実行の際の動的な記憶領域の確保を指示する第1識別子と、所定のブロック内の命令の繰り返しを繰り返し回数とともに指示する第2識別子と、所定の複数の対象に対して連続的で、実行に際して動的な記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられるソースプログラムを、中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム実行装置に実行させるためのプログラム変換方法であって、
前記ソースプログラムを解読し中間形式プログラムに変換するソースプログラム解読ステップと、
前記変換された中間形式プログラムの中の、前記第1識別子に対応する命令の位置を特定する特定ステップと、
前記第1識別子の位置が前記ブロック内に存在するか否かを判定する判定ステップと、
前記第2識別子の繰り返し回数を検出する繰り返し回数検出ステップと、
前記変換された中間形式プログラムの中に位置する前記第1識別子に対応する命令を削除する削除ステップと、
前記ソースプログラム上で、前記第1識別子の対象となっていた前記繰り返し回数分の大きさを有する記憶領域が、前記変換された中間形式プログラムにおいて、前記第3識別子の対象として確保されるよう、前記第3識別子に対応する命令を前記変換された中間形式プログラムの中の前記第２識別子に対応する命令の直前に挿入する挿入ステップと、
前記ソースプログラムに含まれる命令に対応する前記変換された中間形式プログラムに含まれる命令であって、前記第1識別子により確保される動的な記憶領域を解放するための命令が前記変換された中間形式プログラムの中にあれば、当該第1識別子により確保される動的な記憶領域を解放するための命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除手段と、
前記削除ステップ、前記挿入ステップおよび前記記憶領域解放コード削除ステップにより変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成ステップとを含み、
前記判定ステップにより前記第1識別子の位置が前記ブロック内に存在すると判定されたとき、
前記繰り返し回数検出ステップと、前記削除ステップと、前記挿入ステップを実行した後、前記記憶領域解放コード削除ステップと前記実行形式プログラム生成ステップを実行するようにした
ことを特徴とするプログラム変換方法。
【請求項７】
実行の際の動的な記憶領域の確保を指示する第1識別子と、所定の小ブロックに対応する範囲内の命令の繰り返しを繰り返し回数とともに指示する第2識別子と、所定の複数の対象に対しての、所定の大ブロックに対応する範囲内の命令の実行の際のみの記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられるソース形式プログラムを、
中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム実行装置に実行させるためのプログラム変換方法であって、
前記ソースプログラムを解読し中間形式プログラムに変換するソースプログラム解読ステップと、
前記変換された中間形式プログラムの中の、前記第1識別子に対応する命令の位置と、
前記第2識別子に対応する命令の位置と、前記第1識別子に対応する命令により確保される記憶領域の参照を指示することとなる参照識別子に対応する命令の位置とから、前記記憶領域の生存区間を特定する特定ステップと、
前記特定した生存区間が大ブロックの内部にとどまっており、かつ、前記第1識別子の位置が小ブロック内に存在するか否かを判定する判定ステップと、
前記第2識別子の繰り返し回数を検出する繰り返し回数検出ステップと、
前記変換された中間形式プログラムの中から、前記第1識別子に対応する命令を削除する削除ステップと、
前記ソースプログラム上で、前記第1識別子の対象となっていた前記繰り返し回数分の大きさを有する記憶領域が前記変換された中間形式プログラムにおいて、前記第3識別子の対象として確保されるよう、前記第3識別子に対応する命令を、前記変換された中間形式プログラムの中の前記大ブロックの内部かつ前記小ブロックの外部に挿入する挿入ステップと、
前記ソースプログラムに含まれる命令に対応する前記変換された中間形式プログラムに含まれる命令であって、前記第1識別子により確保される動的な記憶領域を解放するための命令が前記変換された中間形式プログラムの中にあれば、当該第1識別子により確保される動的な記憶領域を解放するための命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除ステップと、
前記削除ステップ、前記挿入ステップおよび前記記憶領域解放コード削除ステップにより変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成ステップとを含み、
前記判定ステップにより前記特定した生存区間が大ブロックの内部にとどまっており、かつ、前記第1識別子の位置が小ブロック内に存在すると判定されたとき、
前記繰り返し回数検出ステップと、前記削除ステップと、前記挿入ステップとを実行した後、前記記憶領域解放コード削除ステップと前記実行形式プログラム生成ステップを実行するようにした
ことを特徴とするプログラム変換方法。
【請求項８】
実行の際の動的な記憶領域の確保を指示する第1識別子と、所定の小ブロックに対応する範囲内の命令の繰り返しを指示する第2識別子と、所定の大ブロックに対応する範囲内の命令の実行の際のみの記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられるソースプログラムを、中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム実行装置に実行させるためのプログラム変換方法であって、
前記変換された中間形式プログラムの中の、前記第1識別子に対応する命令の位置と、
前記第2識別子に対応する命令の位置と、前記第1識別子に対応する命令により確保される記憶領域の参照を指示することとなる参照識別子に対応する命令の位置とから、前記記憶領域の生存区間を特定する特定ステップと、
前記生存区間が小ブロックを1回実行する間以上存続するか否かを判定する判定ステップと、
前記変換された中間形式プログラムの中から、前記第1識別子に対応する命令を削除する削除ステップと、
前記ソースプログラム上で、前記第1識別子の対象となっていた記憶領域が前記変換された中間形式プログラムにおいて、前記第3識別子の対象として確保されるよう、前記第3識別子に対応する命令を、前記変換された中間形式プログラムの中の前記大ブロックの内部かつ前記小ブロックの外部に挿入する挿入ステップと、
前記ソースプログラムに含まれる命令に対応する前記変換された中間形式プログラムに含まれる命令であって、前記第1識別子により確保される動的な記憶領域を解放するための命令が前記変換された中間形式プログラムの中にあれば、当該第1識別子により確保される動的な記憶領域を解放するための命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除ステップと、
前記削除ステップ、前記挿入ステップおよび前記記憶領域解放コード削除ステップにより変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成ステップとを含み、
前記判定ステップにより前記生存区間が小ブロックを1回実行する間以上存続しないと判定されたとき、
前記削除ステップと前記挿入ステップを実行した後、前記記憶領域解放コード削除ステップと前記実行形式プログラム生成ステップを実行するようにした
ことを特徴とするプログラム変換方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プログラムを変換する技術に関し、特に、コンパイラにより、動的な記憶領域の割り当ての管理を支援する技術に関する。
【０００２】
【従来の技術】
従来より、多くのプログラミング言語では、プログラム全体の実行を通じて記憶領域が確保される”大域変数”、特定の関数内部でのように局所的な部分の実行のときにのみ記憶領域が確保される”局所変数”、プログラムの実行中にコードの指示により任意のサイズの記憶領域が確保される”動的変数”が区別されて用いられている。Ｃ言語にて用いられるライブラリ関数ｍａｌｌｏｃ、Ｊａｖａにて用いられるオブジェクト生成演算子ｎｅｗなどは、変数に対するこのような動的な記憶領域の割り当てを指示するコードの例である。
【０００３】
上記のような変数のうち、”局所変数”は関数の呼び出しを終了する時点などその局所的な実行が終了したときに記憶領域が解放されることが保証されているのに対して、”動的変数”はそれが使用されなくなる時点が自明ではない。以下、”動的変数”の使用について述べる。
あるシステムとして利用される計算機内で”動的変数”を使用する際には、ヒープ領域（変数に対する動的な記憶領域の割り当てに使用される領域）は有限であるので、このシステムにて使用されなくなった変数に対応するヒープ領域を解放し、他の新たな変数に対して利用できるよう何らかの機構を備えることが必要となる。
【０００４】
ヒープ領域内の、使用されなくなったデータ（変数）に対応する領域を解放する方法は、プログラミング言語によって大きく次の2つに区分される。
＜1＞領域を確保する時と同様に、プログラマが、ソースプログラム中に明示的に、関数呼び出しなどの領域解放のための指示を記述する。
＜2＞プログラムの実行系が、ヒープ領域内で領域が割り当てられたデータの使用中、使用済み等を判別し、使用済みのデータに対応する記憶領域を解放する。
【０００５】
図16は、Ｃ言語，Ｃ＋＋言語、Ｊａｖｅの実行形式のコードの生成を説明するための図である。
Ｃ言語、Ｃ＋＋言語等のプログラミング言語では、図16（ａ）に示すように、ソースプログラムはコンパイラ（リンカ）によってマシンコードに変換され、このマシンコードが実行形式のコードとして直接実行される。上記の領域解放方法については＜1＞が用いられるものである。（Ｃ言語では、ライブラリ関数ｍａｌｌｏｃによって領域が確保され、ライブラリ関数ｆｒｅｅによって領域が解放される。Ｃ＋＋言語では、ｎｅｗ演算子によって領域が確保され、ｄｅｌｅｔｅ演算子によって領域が解放される。）
また、Ｊａｖａ等のプログラミング言語では、図16（ｂ）に示すように、ソースプログラムはコンパイラ（リンカ）によってＪａｖａバイトコードに変換され、このＪａｖａバイトコードが実行形式のコードとしてインタプリタによって解釈されつつ実行される。上記の領域解放方法については＜2＞が用いられるものである。（Ｊａｖａでは、オブジェクト生成演算子ｎｅｗによって領域が確保される。）
領域解放方法について、より詳細を説明する。
【０００６】
領域の解放がプログラム中で明示的に指示される領域解放方法＜1＞では、記憶領域の解放の責任は、プログラマに担わされ、実行系は、ヒープ領域に記憶が確保されたデータが使用中であるか、使用済みであるか等の判別を処理しない。ところが、Ｃ＋＋言語等のプログラムにて、もし、すでに使用済みであり解放されるべき領域が、プログラマのミスによる解放の指示の脱漏等によっていつまでも解放されなければ、プログラム実行時に使用できる記憶領域は次第に不足していくことになり、しかも当のプログラマにはその原因がわかりにくいという事態を引き起こす。逆に、まだプログラムにて使用中の領域が誤って解放されると、その領域に存在すべきデータが後に再利用されたとき、追跡が困難なバグとなる。
【０００７】
領域解放方法＜1＞にて、プログラマが領域解放の時点を適切に指定することは、時として、極めて困難な作業であることが知られており、使用されなくなったデータを保持する領域と、実際に解放される領域とが一致しない危険性が常に存在する。
これに対し、領域の確保のみがプログラム中で指示され領域の解放が指示されない領域解放方法＜2＞では、プログラマは領域の解放について留意する必要はなく、領域の解放が（自動記憶管理により）完全に実行系に任され、領域解放方法＜1＞で挙げた危険性を回避し、動的に記憶領域が割り当てられるデータを安全に利用することができる。
【０００８】
この領域解放方法＜2＞が用いられるＪａｖａのインタプリタ（実行系）は、プログラムの実行中に、ヒープ領域内の、細かく分断された未使用の領域を走査し、これらをひとまとめにしてより大きな使用可能領域を新たに作り出す機構を有しており、これにより動的記憶管理が円滑に行われることとなる。（この作業はガーベジコレクション処理と、また、ガーベジコレクション処理を行う機構はガーベジコレクタと呼ばれており、ガーベジコレクタは動的記憶管理には不可欠な機構である。ガーベジコレクション処理は、”識別”、”回収”の2段階の処理からなる。”識別”処理では、ヒープ領域中に確保されたデータが使用中（生存）と使用済み（ごみ）に分別され、”回収”処理では、再利用のために使用済み領域が束ねられる。）
【０００９】
【発明が解決しようとする課題】
近年、プログラムの再利用性の高さなどからオブジェクト指向言語が注目を集めている。オブジェクト指向言語では、ヒープ領域に、オブジェクトのための記憶領域を確保するものが多く、オブジェクト指向言語で記述されたアプリケーションの実行性能は、実行系の記憶領域の管理の巧拙によるところが大きい。
【００１０】
Ｃ＋＋言語、Ｊａｖａは、いずれもオブジェクト指向言語であるが、上述のように、Ｊａｖａは、領域解放方法＜2＞が用いられるものであり、動的に生成されたオブジェクトの解放を、すべてガーベジコレクタに任せている。
例えば、Ｊａｖａでは、次に示すようなプログラムが記述される可能性がある。
0004486720.tif 000002
このプログラムでは、ｆｏｒループ内部でｎｅｗ演算子が用いられて、動的にｃｏｌｏｒクラスのオブジェクトが生成される。ここで、このｃｏｌｏｒクラスオブジェクトが、繰り返しのたびに異なる色をセットするための、一時的に用いられているすぎないものとすれば、各ｉに対して、ｇ．ｓｅｔｃｏｌｏｒ（ｎｅｗ  ｃｏｌｏｒ（0，0，ｉ））が実行された後にすぐに”ごみ”となる可能性が高い。
【００１１】
Ｓｕｎ Ｍｉｃｒｏｓｙｓｔｅｍｓ社の仕様に準拠したＪａｖａ仮想マシン（インタプリタを含むバイトコードの実行系）では、その命令セットに、ヒープ領域の解放を行う命令を保持していない。すなわち、Ｊａｖａでは、ヒープ領域でのオブジェクトに対する領域の解放の一切がガーベジコレクタによって行われており、上記のプログラムでは、ｆｏｒループ内部で生成される1000個のオブジェクトの削除は、すべてガーベジコレクタに任されている。
【００１２】
しかしながら、ガーベジコレクタによるガーベジコレクションの実行には、多くの時間が費やされる。文献（株式会社ＩＤＧコミュニケーションズ”月刊ＪａｖａＷｏｒｌｄ］1998年7月号Ｐ．45）によると、一般的なＪａｖａアプリケーションの場合、ガーベジコレクションのために費やされる時間は実行時間のおよそ20％を占める。また、たとえば、ループ内でのオブジェクトの生成に代表されるように、ヒープ領域の割り当てと解放とが頻繁に繰り返されるようなアプリケーションでは、実行時間の大きな部分がガーベジコレクションのために割かれ、アプリケーション自体の実行時間は相対的に少なくなる。これでは、いくらプログラムコードの最適化によってコードの実行そのものを高速にしたとしても、それによる効果は貧弱なものになってしまう。
【００１３】
さらに、ガーベジコレクションには、その終了までに費やす時間を見積もることができないという難点があり、実行系がいつ終了するかわからないガーベジコレクションを行っている間は、プログラムの実行が停止してしまうか、パフォーマンスが極端に低下してしまうかする危険性がある。このような危険性は、対話型の処理系や実時間性が要求されるアプリケーションを記述する場合に、致命的な欠陥になりうる。
【００１４】
以上のように、Ｊａｖａでは実行系がガーベジコレクションを含む動的記憶管理を行っているため、Ｊａｖａは、実時間性を要求されるアプリケーションを記述するのに適していないといわれることがあるが、実行系の動的記憶管理に係る負荷を軽減することにより（、すなわち、ソースコードからＪａｖａバイトコードへのコンパイル時に何らかの機構を用いてＪａｖａバイトコードを変更することにより）、上述のような問題点を克服できる可能性がある。
【００１５】
次に示す特開平8―272621号公報に開示されている技術、また、特開平9−330232号公報に開示されている技術は、いずれも、動的記憶管理をコンパイラにより支援するための技術である。
特開平8−272621号公報に開示されている技術は、記憶領域の生存区間を解析し、ソースプログラム中の、ヒープ領域内にて動的に記憶領域を確保、解放するためのｍａｌｌｏｃ関数、ｆｒｅｅ関数の対を、関数スタック内にて動的に記憶領域を確保、解放するための（より高速に処理を行える）ａｌｌｏｃａ関数に変更するものである。
【００１６】
また、特開平9−330232号公報に開示されている技術は、動的に確保される記憶領域の生存区間を解析して生存区間が重ならないもの同士をグループ化して、グループ内にて記憶領域が共有化されるようソースプログラムを変更することにより、動的な記憶領域の確保・解放のためのライブラリ関数の呼び出しを削減するものである。
【００１７】
ところが、これらの2つの公報に開示されている技術は、いずれも、次に（1）、（2）として示す問題点を有している。
（1）ソースプログラム中、プログラマによる解放の指示までは、記憶領域の生存区間が存続するものとみなされており、生存区間を無用に長く存続させる可能性は低減されない。
（2）（上述の領域解放方法＜1＞を用いるＣ＋＋言語にて）プログラム中プログラマのミスによって解放指示の記述が欠落している場合、また、（上述の領域解放方法＜2＞を用いるＪａｖａのように）プログラム中で記憶領域解放の指示ができない言語に対しては、上述のような変更を適用することができない。
【００１８】
本発明は、これらを考慮してなされたものであり、プログラムの実行時において実行系に対する動的記憶管理による負担をより低減させることのできるプログラム変換装置を提供することを目的とする。
【００１９】
【課題を解決するための手段】
上記の目的を達成するために、本発明に係るプログラム変換装置は、実行の際の動的な記憶領域の確保を指示する第1識別子および前記第１の識別子にて確保した動的な記憶領域の解放を指示する第2識別子を含む所定の識別子が用いられるソースプログラムを、中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム変換装置であって、
前記ソースプログラムを解読し中間形式プログラムに変換するソースプログラム解読手段と、
前記変換された中間形式プログラムの中から、前記第1識別子により確保される記憶領域の参照を指示することとなる識別子のうちの、最後に実行されることとなる識別子である参照識別子および、前記第１の識別子にて確保した動的な記憶領域の解放を指示する第2識別子に対応する命令の位置を検出する記憶領域参照箇所検出部と、
前記記憶領域参照箇所検出部による検出後、前記変換された中間形式プログラムの中で、前記参照識別子に対応する命令の直後に、前記確保した動的な記憶領域を解放する命令を挿入する挿入手段と、
前記記憶領域参照箇所検出部にて検出された前記変換された中間形式プログラムの中に位置する前記第2識別子に対応する命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除手段と、
前記挿入手段および前記記憶領域解放コード削除手段により変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成手段と
を備えることを特徴とする。
【００２４】
本発明に係るプログラム変換装置は、所定の1つの対象に対する実行の際の動的な記憶領域の確保を指示する第1識別子と、所定のブロック内の命令の繰り返しを繰り返し回数とともに指示する第2識別子と、所定の複数の対象に対して連続的で、実行に際して動的な記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられるソースプログラムを、中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム変換装置であって、
前記ソースプログラムを解読し中間形式プログラムに変換するソースプログラム解読手段と、
前記変換された中間形式プログラムの中の、前記第1識別子に対応する命令の位置を特定する特定手段と、
前記第1識別子の位置が前記ブロック内に存在するか否かを判定する判定手段と、
前記第2識別子の繰り返し回数を検出する繰り返し回数検出手段と、
前記変換された中間形式プログラムの中から、前記第1識別子に対応する命令を削除する削除手段と、
前記ソースプログラム上で、前記第1識別子の対象となっていた前記繰り返し回数分の大きさを有する記憶領域が、前記変換された中間形式プログラムにおいて、前記第3識別子の対象として確保されるよう、前記第3識別子に対応する命令を前記変換された中間形式プログラムの中の前記第２識別子に対応する命令の直前に挿入する挿入手段と、
前記ソースプログラムに含まれる命令に対応する前記変換された中間形式プログラムに含まれる命令であって、前記第1識別子により確保される動的な記憶領域を解放するための命令が前記変換された中間形式プログラムの中にあれば、当該第1識別子により確保される動的な記憶領域を解放するための命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除手段と、
前記削除手段、前記挿入手段および前記記憶領域解放コード削除手段により変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成手段と  を備え、
前記判定手段により前記第1識別子の位置が前記ブロック内に存在すると判定されたとき、
前記繰り返し回数検出手段と、前記削除手段と、前記挿入手段が動作した後、前記記憶領域解放コード削除手段と前記実行形式プログラム生成手段が動作するように構成した
ことを特徴とする。
【００２６】
さらに、本発明に係るプログラム変換装置は、実行の際の動的な記憶領域の確保を指示する第1識別子と、所定の小ブロックに対応する範囲内の命令の繰り返しを繰り返し回数とともに指示する第2識別子と、所定の複数の対象に対しての、所定の大ブロックに対応する範囲内の命令の実行の際のみの記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられるソースプログラムを、中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム変換装置であって、
前記ソースプログラムを解読し中間形式プログラムに変換するソースプログラム解読手段と、
前記変換された中間形式プログラムの中の、前記第1識別子に対応する命令の位置と、前記第2識別子に対応する命令の位置と、前記第1識別子に対応する命令により確保される記憶領域の参照を指示することとなる参照識別子に対応する命令の位置とから、前記記憶領域の生存区間を特定する特定手段と、
前記特定した生存区間が大ブロックの内部にとどまっており、かつ、前記第1識別子の位置が小ブロック内に存在するか否かを判定する判定手段と、
前記第2識別子の繰り返し回数を検出する繰り返し回数検出手段と、
前記変換された中間形式プログラムの中から、前記第1識別子に対応する命令を削除する削除手段と、
前記ソースプログラム上で、前記第1識別子の対象となっていた前記繰り返し回数分の大きさを有する記憶領域が前記変換された中間形式プログラムにおいて、前記第3識別子の対象として確保されるよう、前記第3識別子に対応する命令を、前記変換された中間形式プログラムの中の前記大ブロックの内部かつ前記小ブロックの外部に挿入する挿入手段と、
前記ソースプログラムに含まれる命令に対応する前記変換された中間形式プログラムに含まれる命令であって、前記第1識別子により確保される動的な記憶領域を解放するための命令が前記変換された中間形式プログラムの中にあれば、当該第1識別子により確保される動的な記憶領域を解放するための命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除手段と、
前記削除手段、前記挿入手段および前記記憶領域解放コード削除手段により変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成手段と  を備え、
前記判定手段により前記特定した生存区間が大ブロックの内部にとどまっており、かつ、前記第1識別子の位置が小ブロック内に存在すると判定されたとき、
前記繰り返し回数検出手段と、前記削除手段と、前記挿入手段とが動作した後、前記記憶領域解放コード削除手段と前記実行形式プログラム生成手段が動作するように構成した
ことを特徴とする。
【００２８】
本発明に係るプログラム変換装置は、実行の際の動的な記憶領域の確保を指示する第1識別子と、所定の小ブロックに対応する範囲内の命令の繰り返しを指示する第2識別子と、所定の大ブロックに対応する範囲内の命令の実行の際のみの記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられるソースプログラムを、中間形式プログラムに変換し、前記中間形式プログラムを実行のための実行形式プログラムに変換するプログラム変換装置であって、
前記変換された中間形式プログラムの中の、前記第1識別子に対応する命令の位置と、前記第2識別子に対応する命令の位置と、前記第1識別子に対応する命令により確保される記憶領域の参照を指示することとなる参照識別子に対応する命令の位置とから、前記記憶領域の生存区間を特定する特定手段と、
前記生存区間が小ブロックを1回実行する間以上存続するか否かを判定する判定手段と、
前記変換された中間形式プログラムの中から、前記第1識別子に対応する命令を削除する削除手段と、
前記ソース形式プログラム上で、前記第1識別子の対象となっていた記憶領域が前記変換された中間形式プログラムにおいて、前記第3識別子の対象として確保されるよう、前記第3識別子に対応する命令を、前記変換された中間形式プログラムの中の前記大ブロックの内部かつ前記小ブロックの外部に挿入する挿入手段と、
前記ソースプログラムに含まれる命令に対応する前記変換された中間形式プログラムに含まれる命令であって、前記第1識別子により確保される動的な記憶領域を解放するための命令が前記変換された中間形式プログラムの中にあれば、当該第1識別子により確保される動的な記憶領域を解放するための命令を前記変換された中間形式プログラムの中から削除する記憶領域解放コード削除手段と、
前記削除手段、前記挿入手段および前記記憶領域解放コード削除手段により変更された前記中間形式プログラムを実行形式プログラムに変換する実行形式プログラム生成手段と  を備え、
前記判定手段により前記生存区間が小ブロックを1回実行する間以上存続しないと判定されたとき、
前記削除手段と前記挿入手段が動作した後、前記記憶領域解放コード削除手段と前記実行形式プログラム生成手段が動作するように構成した
ことを特徴とする。
【００３０】
【発明の実施の形態】
以下、図面を参照しつつ、本発明の実施の形態の1つであるプログラム翻訳装置について説明する。
図1は、本発明の実施の形態に含まれるプログラム翻訳装置100の全体構成を説明するためのブロック図である。ここでの説明においては、”記憶領域の生存区間が局所的である”とは、（変数、オブジェクト等に対する）記憶領域が、”単一の関数を実行する際のように、実行が開始されるとともに確保され、実行が終了されるとともに解放される”ことを示すものであり、これらの記憶領域については、生存区間は単一の関数等の範囲の中に収まっている。したがって、記憶領域の生存区間が局所的でない場合とは、たとえば、動的に確保された記憶領域のアドレスそのものが、関数が呼び出される際の引数として指定される場合であり、この場合、呼び出される関数にてアドレスそのものが参照される可能性が高く、生存区間が単一の関数の範囲の中には収まっているとはいえない。
【００３１】
図1に示すように、プログラム翻訳装置100は、従来のプログラム翻訳装置と同様に、ソースプログラム1を中間形式プログラム2に変換するソースプログラム解読部101と、中間形式プログラム2中にて動的に記憶領域を割り当てるコード（Ｃ言語のｍａｌｌｏｃ、Ｃ＋＋言語のｎｅｗ、Ｊａｖａのｎｅｗ等）を検出して中間形式プログラム2中のその割り当て箇所を示すデータを出力する記憶領域割り当て箇所検出部102と、記憶領域割り当て箇所検出部102の出力に基づいて、割り当てられた記憶領域を参照するコードを検出して、中間形式プログラム2のその参照箇所を示すデータを出力する記憶領域参照箇所検出部103と、記憶領域割り当て箇所検出部102にて検出された割り当て箇所および記憶領域参照箇所検出部103にて検出された参照箇所に基づいて、記憶領域の生存区間を解析する記憶領域生存区間解析部104と、中間形式プログラム2を実行形式プログラム3に変換する実行形式プログラム生成部115とを含んでいる。
【００３２】
また、プログラム翻訳装置100は、（本発明に関わる部分として、）記憶領域生存区間解析部104から出力される生存区間に基づいて、生存区間を終了する箇所の直後に記憶領域を解放するコードを挿入する記憶領域解放コード生成部105と、（ソースプログラム1が動的に記憶領域の解放を記述することができる言語である際に、）中間形式プログラム2中の（プログラマが記述した）動的に記憶領域を解放するためのコード（Ｃ言語のｆｒｅｅ、Ｃ＋＋言語のｄｅｌｅｔｅ等）を削除する記憶領域解放コード削除部110とを含んでいる。
【００３３】
さらに、プログラム翻訳装置100は、（本発明に関わる部分として、）記憶領域生存区間解析部104から出力される生存区間に基づいて、条件Ａ”（対象とする）記憶領域の生存区間が局所的である”が満たされているか否かを判定する局所記憶領域判定部106と、条件Ｂ”（対象とする）記憶領域の生存区間の開始箇所が可算回の繰り返し回数を有するループ内にある”が満たされているか否かを判定するループ内定義記憶領域判定部107と、（対象とする）記憶領域に関し、条件Ａ”記憶領域の生存区間が局所的である”と、条件Ｂ”記憶領域の生存区間の開始箇所が可算回の繰り返し回数を有するループ内にある”とが同時に満たされているか否かを判定するループ内定義局所記憶領域判定部108と、条件Ｃ”記憶領域の生存区間がループ1回の内部にとどまっている”が満たされているか否かを判定するループ内記憶領域判定部109と、条件Ａが満たされていると局所記憶領域判定部106が判定した場合に、動的に確保されるよう指示されている記憶領域が局所変数の記憶領域として確保されるよう中間形式プログラム2を変更する記憶領域局所化コード生成部111と、条件Ｂが満たされているとループ内定義記憶領域判定部107が判定した場合に、複数回繰り返されるループの、動的に確保されるよう指示されている記憶領域が（動的にかつ）連続的に確保されるよう中間形式プログラム2を変更する記憶領域連続化コード生成部112と、条件Ａと条件Ｂとが満たされているとループ内定義局所記憶領域判定部108が判定した場合に、動的に確保されるよう指示されている記憶領域が局所的な配列変数の記憶領域として確保されるよう中間形式プログラム2を変更する記憶領域連続局所化コード生成部113と、条件Ｃが満たされているとループ内記憶領域判定部109が判定した場合に、動的に確保されるよう指示されている記憶領域が複数回のループの繰り返しに対して共通化して用いられるよう中間形式プログラム2を変更する記憶領域共通化コード生成部114とを含んでいる。
【００３４】
これらの構成のプログラム翻訳装置100では、次に図2〜図4、図7〜図10に示すような処理が行われる。
図2は、プログラム翻訳装置100にて行われる処理の概要を示すためのフローチャートであり、図3は、図2のＳ13での参照箇所検出処理の手順を説明するためのフローチャートであり、図4は、図3のＳ132にて呼び出されるサブルーチンｓｅｅｋ＿ｕｓｅ＿ａｎｄ＿ａｄｄｒｅｓｓｓｕｂｓｔ（ａ）での処理の手順を説明するためのフローチャートである。また、図5、図6は、記憶領域参照箇所検出部103および記憶領域生存区間解析部104の動作を説明するためのプログラムを示す図である。（以下、本実施の形態では、Ｃ＋＋言語によるプログラムを用いて説明するが、Ｃ言語、Ｊａｖａ等の他の言語についても同様に本発明を適用することができる。また、図5、図6内の（1）〜（4）はコードを特定するための記号であり、図5に示すコード（1）〜コード（4）の間、図6に示すコード（1）〜コード（5）の間等には、変数Ａ、変数Ｂ、および、これらの記憶領域には関わらないコードが挿入されているものとする。）
プログラム翻訳装置100（図1参照）では、まず、ソースプログラム解読部101により、（従来のプログラム翻訳装置と同様の）フロントエンド処理が行なわれ、ソースプログラム1が中間形式プログラム2に変換される（Ｓ11）。続いて、記憶領域割り当て箇所検出部102により、中間形式プログラム2中にて、（Ｃ言語のｍａｌｌｏｃ、Ｃ＋＋言語のｎｅｗ、Ｊａｖａのｎｅｗ等の）所定の形式の変数、配列変数、オブジェクト等に対して動的に記憶領域を割り当てるコードが検出され（Ｓ12）、記憶領域参照箇所検出部103により、中間形式プログラム2中にて、Ｓ12で確保される記憶領域が参照される箇所を検出するための参照箇所検出処理が行われる（Ｓ13）。
（この参照箇所の検出には、データフロー解析により得られるＤＵ（定義使用）情報、および、ＵＤ（使用定義）情報が用いられる。データフロー解析に関しては、Ａｌｆｒｅｄ  Ｖ．Ａｈｏ，Ｒａｖｉ  Ｓｅｔｈｉ，Ｊｅｆｆｒｅｙ  Ｄ．Ｕｌｌｍａｎ共著、”Ｃｏｍｐｉｌｅｒｓ：Ｐｒｉｎｃｉｐｌｅｓ，Ｔｅｃｈｎｉｑｕｅｓ，ａｎｄ  Ｔｏｏｌｓ”、Ａｄｄｉｓｏｎ―Ｗｅｓｌｅｙ社、1985年に詳しい。
【００３５】
ＤＵ情報とＵＤ情報とにより、中間形式プログラム3中、変数等に対しての定義箇所と使用箇所とを検出することができるが、これは記憶領域に対する定義と使用とをそのまま示すものではない。すなわち、すでに定義されている変数の動的記憶領域のアドレスを、別の異なる変数に代入するときには、すでに定義されている変数の動的記憶領域が、別の異なる変数の記憶領域として参照される可能性が生じる。
【００３６】
ここでは、記憶領域参照箇所検出部103は、すでに確保されている動的記憶領域のアドレスを別の異なる変数に代入するコードと、この新たな変数についての記憶領域を参照するコードとを含めて、すでに確保されている動的記憶領域に対する参照箇所とみなし、検出を行うものとする。）
この記憶領域参照箇所検出部103により行われる参照箇所検出処理を図3〜図5を用いてより詳細に説明する。
【００３７】
参照箇所検出処理は、変数ｘを参照する箇所と、変数ｘが記憶されているアドレスを代入する箇所とを求める（図4にその処理の内容を示す）再帰関数ｓｅｅｋ＿ｕｓｅ＿ａｎｄ＿ａｄｄｒｅｓｓｓｕｂｓｔ（ａ）を用いることによって実現することができる。
参照箇所検出処理では、まず、割り当てられた記憶領域を参照する変数がａとされ（Ｓ131）、変数ａの参照箇所とａのアドレスを代入する箇所を求めるサブルーチンｓｅｅｋ＿ｕｓｅ＿ａｎｄ＿ａｄｄｒｅｓｓｓｕｂｓｔ（ａ）が呼び出され（Ｓ132）、このサブルーチンｓｅｅｋ＿ｕｓｅ＿ａｎｄ＿ａｄｄｒｅｓｓｓｕｂｓｔ（ａ）の返り値（ｒｅｆｐｌａｃｅ＿ｘ）が変数ａについての記憶領域を示すすべての参照箇所を含むものとして記憶される（Ｓ133）。
【００３８】
サブルーチンｓｅｅｋ＿ｕｓｅ＿ａｎｄ＿ａｄｄｒｅｓｓｓｕｂｓｔ（ａ）では、まず、ＤＵ情報、ＵＤ情報から、変数ｘのすべての参照箇所が検出され、ｒｅｆｐｌａｃｅ＿ｘに記録され（Ｓ1321）、続いて、変数ｘのアドレスを代入する未計算のコードがまだ残っているか否かが判断される（Ｓ1322）。
未計算のコードがまだ残っていれば（Ｓ1322にて、Ｙｅｓ）、この変数ｘのアドレスを代入するコードがｄｅｆ＿ｙとして検出され（Ｓ1323）、ｄｅｆ＿ｙにより定義される変数がｙとされてｓｅｅｋ＿ｕｓｅ＿ａｎｄ＿ａｄｄｒｅｓｓｓｕｂｓｔ（ｙ）が実行される（Ｓ1324）。ｓｅｅｋ＿ｕｓｅ＿ａｎｄ＿ａｄｄｒｅｓｓｓｕｂｓｔ（ｙ）の返り値は、ｒｅｆｐｌａｃｅ＿ｘに記録される（Ｓ1325）。
【００３９】
未計算のコードが残っていなければ（Ｓ1322にて、Ｎｏ）、ｒｅｆｐｌａｃｅ＿ｘが返り値とされて（Ｓ1326）、本処理は終了する。
図5に示すプログラムでは、コード（1）により変数Ａに対して動的に割り当てられる記憶領域は、コード（2）、コード（3）による変数Ａの使用によって参照される。コード（3）によっては、（変数Ａの参照と）同時に変数Ａのアドレスが変数Ｂに代入されることにより変数Ｂが定義されており、この定義によって変数Ａに対する記憶領域が参照されている。図3に示す参照箇所検出処理を行なう記憶領域参照箇所検出部103（図1参照）は、図5に示すプログラムについては、上述のような処理によってコード（1）〜コード（4）のすべてを同一の記憶領域に対する参照箇所とみなし、この参照箇所を示すデータを記憶領域生存区間解析部104に出力することとなる。
【００４０】
これらのような記憶領域参照箇所検出部103による参照箇所検出処理（図2のＳ13）を終えると、次に、記憶領域生存区間解析部104によって生存区間が解析される（図2のＳ14）。
この生存区間の解析を、図5を再び用いて、また、図6を用いて説明する。
図5に示すプログラムについては、上述のような記憶領域参照箇所検出部103（図1参照）での処理によってコード（1）〜コード（4）のすべてが、同一の記憶領域に対する参照箇所とみなされている。記憶領域生存区間解析部104は、これらの参照箇所を示すデータを入力して変数Ａの生存区間と変数Ｂの生存区間とを含めた区間を（対象とする）記憶領域の生存区間とみなし、これを示すデータを記憶領域解放コード生成部105、局所記憶領域判定部106、ループ内定義記憶領域判定部107、ループ内定義局所記憶領域判定部108、および、ループ内記憶領域判定部109に出力する。
【００４１】
ここで、この記憶領域生存区間解析部104は、Ｃ言語、Ｃ＋＋言語のように、プログラマがソースプログラム1に記憶領域の解放を記述することができる言語を用いる場合、記憶領域の生存区間を、記憶領域を解放するためのコードまで続くものとせず、この解放のためのコードを除いて、最後に参照されるコードの記述される箇所までとする。（なぜなら、プログラム上での意味を考えると、確保された記憶領域が”ごみ”となるのは、解放のためのコードを除いて、最後に参照されるコードの記述される箇所の直後だからである。）
すなわち、図6に示すプログラムでは、変数Ａを解放するコード（5）もまた変数Ａの記憶領域を参照しているため、記憶領域参照箇所検出部103はＤＵ情報、ＵＤ情報に従ってこれを参照箇所として検出するものとするが、コード（5）が記憶領域を解放するためのコードであるので、記憶領域生存区間解析部104は、生存区間の終了する箇所をコード（5）が記述されている箇所とは解析せず、記憶領域の生存区間を（図5に示すプログラムと同様、）コード（1）からコード（4）までの区間として解析するものとする。
【００４２】
このような記憶領域生存区間解析部104による生存区間解析処理（図2のＳ14）を終えると、（Ｓ12にて検出されたコードに対応して確保される）記憶領域の生存区間がループ1回の内部にとどまっているか否か（上述の条件Ｃが満たされるか否か）がループ内記憶領域判定部109により判定される（Ｓ15）。生存区間がループ1回の内部にとどまっていれば（Ｓ15にて、Ｙｅｓ）、（後に図10に示すフローチャートを用いてより詳細な手順を説明する）共通化処理が記憶領域共通化コード生成部114により行われ（Ｓ16）、Ｓ24へと処理は移される。
【００４３】
生存区間がループ1回の内部にとどまっていなければ（Ｓ15にて、Ｎｏ）、続いて、”生存区間が局所的であり、かつ、その生存区間の開始箇所が可算回の繰り返し回数を有するループ内にある”か否か（上述の条件Ａと条件Ｂとが同時に満たされるか否か）がループ内定義局所記憶領域判定部108により判定される（Ｓ17）。”生存区間が局所的であり、かつ、その生存区間の開始箇所が可算回の繰り返し回数を有するループ内にある”のであれば（Ｓ17にて、Ｙｅｓ）、（後に図9を用いて説明する）連続局所化処理が記憶領域連続局所化コード生成部113により行われ（Ｓ18）、Ｓ24へと処理が移される。
【００４４】
”生存区間が局所的であり、かつ、その生存区間の開始箇所が可算回の繰り返し回数を有するループ内にある”のでなければ（Ｓ17にて、Ｎｏ）、生存区間の開始箇所が可算回の繰り返し回数を有するループ内にあるか否か（条件Ｂが満たされるか否か）が判定される（Ｓ19）。生存区間の開始箇所が可算回の繰り返し回数を有するループ内にあれば（Ｓ19にて、Ｙｅｓ）、（後に図8を用いて説明する）連続化処理が記憶領域連続化コード生成部112により行われ（Ｓ20）、生存区間の終了直後に記憶領域を解放するコードが記憶領域解放コード生成部105により挿入され（Ｓ21）、Ｓ24へと処理が移される。
（通常、繰り返し回数は、ループを記述するコードとともに指定される条件式を解析することによって、算定することができるが、この条件式として予測不能な変数を用いる比較を指定するループでは、繰り返し回数を特定できない場合がある。このような場合、繰り返し回数は可算回ではないとされる。）
生存区間の開始箇所が可算回の繰り返し回数を有するループ内になければ（Ｓ19にて、Ｎｏ）、生存区間が局所的であるか否か（条件Ａが満たされるか否か）が判定される（Ｓ22）。生存区間が局所的であれば（Ｓ22にて、Ｙｅｓ）、（後に図7を用いて説明する）局所化処理が記憶領域局所化コード生成部111により行われ（Ｓ23）、Ｓ24へと処理が移され、生存区間が局所的でなければ（Ｓ22にて、Ｎｏ）、Ｓ21にて生存区間の終了直後に記憶領域を解放するコードが挿入され、Ｓ24へと処理が移される。
【００４５】
Ｓ24では、当初からプログラマによりソースプログラム1内に記述されていた動的な記憶領域を解放するためのコード（Ｃ言語のｆｒｅｅ、Ｃ＋＋言語のｄｅｌｅｔｅ等）に対応して、Ｓ11のフロントエンド処理にて生成された中間形式プログラム2内の（、その位置が記憶領域参照箇所検出部103によりすでに検出されている、）コードが記憶領域解放コード削除部110により削除され、続いて、Ｓ25にて、すべての動的に確保される記憶領域に対して、以上のような処理が行われたか否かが判断される。
【００４６】
すべての動的に確保される記憶領域に対して上述の処理が行われていなければ（Ｓ25にて、Ｎｏ）、その未処理の記憶領域に対してＳ12からの処理が繰り返され、すべての動的に確保される記憶領域に対して上述の処理が行われていれば（Ｓ25にて、Ｙｅｓ）、実行形式プログラム生成部115により、バックエンド処理が行われ、中間形式プログラム2が実行形式プログラム3に変換されて（Ｓ26）、処理は終了する。
【００４７】
以上のように処理が行われるが、（特に本発明に関わる、）Ｓ23の局所化処理、Ｓ20の連続化処理、Ｓ18の連続局所化処理、Ｓ16の共通化処理について、それぞれ図7〜図10を用いてより詳細を説明する。また、図11〜図14に、これらの処理により変更されるプログラムを示す。（実際は、これらの変更は中間形式プログラム2中で行われるが、説明の便宜上、これらに対応する、Ｃ＋＋言語によるソースプログラム1を示すものとする。）
図7は、図2のＳ23での、記憶領域局所化コード生成部111による局所化処理の詳細を説明するためのフローチャートである。
【００４８】
記憶領域局所化コード生成部111（図1参照）は、局所記憶領域判定部106が、生存区間が局所的である（条件Ａが満たされる）と判定した記憶領域に対して、この記憶領域を動的に確保する代わりに、局所変数に対するものとして確保するように中間形式プログラム2を変更する。
より詳しくは、この局所化処理では、図7に示すように、まず、記憶領域ｍを動的に確保するためのコード（Ｃ言語のｍａｌｌｏｃ、Ｃ＋＋言語、Ｊａｖａのｎｅｗ等）が削除され（Ｓ231）、記憶領域ｍを確保されることとなっていた変数と、同じサイズ、同じ型の局所変数に対し、記憶領域ｌを確保するためのコードが生成される（Ｓ232）。続いて、記憶領域ｍを参照するコードのすべてが、記憶領域ｌを参照するコードに変更され（Ｓ233）、本処理は終了する。
【００４９】
図11は、これらの局所化処理によるプログラムの変更を示す図である。図11（ａ）は、局所化処理が行われる前のプログラムを示しており、図11（ｂ）は、局所化処理が行われた後のプログラムを示している。
図11（ａ）に示すプログラムでは、コード（1）により記憶領域が動的に確保され、コード（2）〜コード（4）の各々により確保された記憶領域が参照されるが、この記憶領域の生存区間は局所的であり、図7に示すような処理による局所化が可能である。
【００５０】
実際、図11（ｂ）に示すように、上述のような局所化処理によって、局所化前のプログラムに存在していたコード（1）が削除されて、代わりに局所変数に対して記憶領域を確保するコード（11）が挿入されることとなり、コード（12）〜コード（14）の各々はコード（11）によって確保される記憶領域を参照するものとなる。
【００５１】
図8は、図2のＳ20での、記憶領域連続化コード生成部112による連続化処理の詳細を説明するためのフローチャートである。
記憶領域連続化コード生成部112（図1参照）は、ループ内定義記憶領域判定部107が、生存区間の開始箇所が可算回の繰り返し回数を有するループ内にある（条件Ｂが満たされる）と判定した記憶領域に対して、複数回のループについて記憶領域が連続して確保されるように、中間形式プログラム2を変更する。
【００５２】
より詳しくは、この連続化処理では、図8に示すように、まず、記憶領域ｍを動的に確保するためのコードが削除され（Ｓ201）、確保されることとなっていた記憶領域ｍのサイズｓとループの繰り返し回数ｋとが検出され（Ｓ202、Ｓ203）、ループを通して確保される領域の総サイズ（ｓ×ｋ）が計算される（Ｓ204）。続いて、ループ外部の、ループの実行を開始する直前に、サイズ（ｓ×ｋ）の記憶領域ａｗを確保するためのコードが挿入され（Ｓ205）、記憶領域ｍを参照するコードのすべてが、記憶領域ａｗを参照するコードに変更され（Ｓ206）、本処理は終了する。
【００５３】
この変更の際、記憶領域ａｗ内の新たに参照されるべきアドレスａｄｄは、ループの繰り返し回数ｉ（ｉ＝1，2，3，…，ｋ）を用いて次式によって求められ、参照すべき記憶領域が指定される。
ａｄｄ＝（記憶領域ａｗの先頭アドレス）＋｛ｓ×（ｉ−1）｝
図12は、これらの連続化処理によるプログラムの変更を示す図である。図12（ａ）は、連続化処理が行われる前のプログラムを示しており、図12（ｂ）は、連続化処理が行われた後のプログラムを示している。
【００５４】
図12（ａ）に示すプログラムでは、ｆｏｒループ内で、コード（1）により記憶領域が動的に確保され、コード（2）、コード（3）の各々により確保された記憶領域が参照され、コード（4）により確保された記憶領域のアドレスが関数を呼び出す際の引数として用いられている。このプログラムは、コード（4）によって、この記憶領域の生存区間は局所的とはいえないものとなっているが、生存区間の開始箇所が可算回の繰り返し回数を有するループ内にあるので、図8に示すような処理による連続化が可能である。。
【００５５】
実際、図12（ｂ）に示すように、上述のような連続化処理によって、連続化前のプログラムに存在していたコード（1）が削除されて、代わりに配列変数に対して記憶領域を確保するコード（11）がｆｏｒループの開始前に挿入されることとなり、コード（12）〜コード（14）の各々はコード（11）によって確保される記憶領域を参照するものとなる。
【００５６】
図9は、図2のＳ18での、記憶領域連続局所化コード生成部113による連続局所化処理の詳細を説明するためのフローチャートである。
記憶領域連続局所化コード生成部113（図1参照）は、ループ内定義局所記憶領域判定部108が、”生存区間が局所的であり、かつ、その生存区間の開始箇所が可算回の繰り返し回数を有するループ内にある”（条件Ａと条件Ｂとが同時に満たされる）と判定した記憶領域に対して、これらの記憶領域を動的に確保する代わりに、局所的な配列変数として確保するように中間形式プログラム2を変更する。
【００５７】
より詳しくは、この連続局所化処理では、図9に示すように、まず、記憶領域ｍを動的に確保するためのコードが削除され（Ｓ181）、確保されることとなっていた記憶領域ｍのサイズｓ、型とループの繰り返し回数ｋとが検出される（Ｓ182、Ｓ183）。続いて、記憶領域ｍが確保されることとなっていた変数と同じサイズ、同じ型の要素を有し、要素の数が繰り返し回数ｋに等しい局所的な配列変数Ｌを確保するためのコードが挿入され（Ｓ184）、記憶領域ｍを参照するコードのすべてが、局所的な配列変数Ｌの、該当する要素の記憶領域を参照するコードに変更され（Ｓ185）、本処理は終了する。
【００５８】
この変更の際、配列変数Ｌの各要素に対する記憶領域のアドレスａｄｄは、ループの繰り返し回数（ｉ＝1，2，3，…，ｋ）を用いて次式によって求められ、参照すべき記憶領域を指定することができる。
ａｄｄ＝（配列変数Ｌの記憶領域の先頭アドレス）＋｛ｓ×（ｉ−1）｝図13は、これらの連続局所化処理によるプログラムの変更を示す図である。図13（ａ）は、連続局所化処理が行われる前のプログラムを示しており、図13（ｂ）は、連続局所化処理が行われた後のプログラムを示している。
【００５９】
図13（ａ）に示すプログラムでは、ｆｏｒループ内で、コード（1）により記憶領域が動的に確保され、コード（2）〜コード（4）の各々により確保された記憶領域が参照されるが、この記憶領域の生存区間は局所的であり、かつ、生存区間の開始箇所が可算回の繰り返し回数を有するループ内にあるので、図9に示すような処理による連続局所化が可能である。
（このプログラムでは記憶領域の参照領域がループ1回の内部にとどまらないため、（後に示すような）記憶領域の共通化を行うことはできない。すなわち、図13（ａ）に示すプログラムでは、たとえば、ｉ＝4のループにおいてコード（1）により確保される記憶領域のアドレスは、ｉ＝4のループにおいてコード（4）により変数ｂとして保持されることとなり、次のｉ＝5のループにおいてコード（2）により参照されることとなる。）
実際、図13（ｂ）に示すように、上述のような連続局所化処理によって、連続局所化前のプログラムに存在していたコード（1）が削除されて、代わりに、局所的な変数となる要素をｆｏｒループの繰り返し回数分有する配列変数に対して記憶領域を確保するためのコード（11）がｆｏｒループの開始前に挿入されることとなり、コード（12）〜コード（14）の各々はコード（11）によって確保される記憶領域を参照するものとなる。
【００６０】
図10は、図2のＳ16での、記憶領域共通化コード生成部114による共通化処理の詳細を説明するためのフローチャートである。
記憶領域共通化コード生成部114（図1参照）は、ループ内記憶領域判定部109が、生存区間がループ1回の内部にとどまっている（条件Ｃが満たされる）と判定した記憶領域に対して、記憶領域を動的に確保する代わりに、複数回のループに対して同じ記憶領域を共通して用いるように中間形式プログラム2を変更する。
（生存区間がループ1回の内部にとどまっている記憶領域は、次に繰り返されるループでは”ごみ”になっている。このような記憶領域に対応する変数を動的に確保する必要はなく、このような記憶領域の生存区間が局所的であることは自明であるので、記憶領域を1つの局所変数に対するものとして確保しておき、繰り返されるループに対してこの記憶領域を上書きしつつ何度も参照させることとすれば、（プログラムの実行に要する処理を煩雑にすることなく、）当初のプログラマの意図が達成されることとなる。）
より詳しくは、この共通化処理では、図10に示すように、まず、記憶領域ｍを動的に確保するためのコードが削除され（Ｓ161）、確保されることとなっていた記憶領域ｍのサイズｓと型とが検出される（Ｓ162）。続いて、記憶領域ｍが確保されることとなっていた変数と同じサイズ、同じ型を有する局所変数Ｌ1つを確保するためのコードがループを有する関数内で生成され（Ｓ163）、記憶領域ｍを参照するコードのすべてが、局所変数Ｌを参照するコードに変更され（Ｓ164）、本処理は終了する。
【００６１】
図14は、これらの共通化処理によるプログラムの変更を示す図である。図14（ａ）は、共通化処理が行われる前のプログラムを示しており、図14（ｂ）は、共通化処理が行われた後のプログラムを示している。
図14（ａ）に示すプログラムでは、ｆｏｒループ内で、コード（1）により記憶領域が動的に確保され、コード（2）、コード（3）の各々により確保された記憶領域が参照されるが、この記憶領域の生存区間はループ1回の内部にとどまっているので、図10に示すような処理による共通化が可能である。
【００６２】
実際、図14（ｂ）に示すように、上述のような共通化処理によって、共通化前のプログラムに存在していたコード（1）が削除されて、代わりに、局所変数1つを確保するためのコード（11）がｆｏｒループを有する関数の所定の位置に挿入されることとなり、コード（12）、コード（13）の各々はコード（11）によって確保される記憶領域を参照するものとなる。
【００６３】
以上のように、プログラム翻訳装置100では、当初にソースプログラム1の中でプログラマにより動的に確保されるよう指示されていた記憶領域に対しては、生存区間に応じて、図7に示す局所化処理、図8に示す連続化処理、図9に示す連続局所化処理、図10に示す共通化処理が行われ、連続化処理以外の3つの処理（およびこれらに後続する図2のＳ21、Ｓ24等での処理）では動的に確保されることとなっていた記憶領域が局所化されるよう処理が行われ、連続化処理の後には動的に確保される記憶領域の生存区間の終了直後に記憶領域が解放されるよう処理が行われる。また、プログラム翻訳装置100では、これらのような4つの処理の対象とならない生存区間を有する記憶領域に対しては、連続化処理の後と同様、生存区間の終了直後に記憶領域が解放されるよう処理が行われる。
【００６４】
すなわち、プログラム翻訳装置100では、動的に確保されることとなっていた記憶領域は、動的には確保されないよう変更され、また、確保から解放までの区間の短縮化が図られ、プログラムの実行時において、実行系に対する動的記憶管理による負担が低減されることとなる。
さらに、連続化処理によっては、動的な記憶領域は連続的に一度に確保されるため、実行系による”回収”処理の効率化が促され、ループ内で何度も領域確保のための処理を行う必要がなくなり、これらにより、プログラムの実行を高速化することができることとなる。
【００６５】
上記の実施の形態のプログラム翻訳装置100では、ソースプログラムとしてＣ＋＋言語を想定したため、動的に確保される記憶領域を解放するための命令がプログラマによって指定される必要があることを前提としたが、このような命令を用いないＪａｖａ等の言語を扱うプログラム翻訳装置についても、記憶領域解放コード削除部110（図1参照）での処理のような、ソースプログラム1中のコードに対応する解放のための命令に関する処理を除いて、同様に、本発明を適用することができる。
【００６６】
また、上記の実施の形態のプログラム翻訳装置100では、実行形式プログラムにて、ソースプログラム1中の記憶領域を解放するためのコードに対して、ＣＰＵにて直接解釈される命令が生成されることを想定したが、実行形式プログラムにて、ソースプログラム1中の記憶領域を解放するためのコードに対して、ＯＳ、仮想マシン等にて呼び出されるライブラリとこのライブラリを呼び出すための命令とを生成するものとすることができる。（動的な記憶領域を解放するための直接的な命令が用意されていないプラットフォームでは、動的な記憶領域の解放をライブラリによって指示することができ、以下に示すプログラム翻訳装置150はこれらに対応するものである。）
これらのような上述の実施の形態の変形例のプログラム翻訳装置150について説明する。
【００６７】
図15は、本変形例のプログラム翻訳装置150の全体構成を説明するためのブロック図である。本変形例のプログラム翻訳装置150では、プログラム翻訳装置100（図1参照）と同様の機能を有する部分については同様の符号を用いている。また、これらの各部での処理の手順は、図2に準ずるものとする。
本変形例のプログラム翻訳装置150は、上述のプログラム翻訳装置100の記憶領域解放コード生成部105の代わりに、記憶領域解放呼び出しコード生成部151および記憶領域解放ライブラリ152を有している。
【００６８】
記憶領域解放呼び出しコード生成部151は、記憶領域解放コード生成部105と同様記憶領域生存区間解析部104から出力される記憶領域の生存区間を示すデータを入力とし、記憶領域の生存区間の終了直後に記憶領域を解放するためのライブラリを呼び出すためのコードを挿入し、この解放のためのライブラリのコードが記述された記憶領域解放ライブラリ152を中間形式プログラム2に追加する。
【００６９】
これらのような動的な記憶領域の解放にライブラリを用いるプログラム翻訳装置150によっても、上述のプログラム翻訳装置100と同様、当初プログラマにより動的に確保されるよう指示されていた記憶領域は、動的には確保されないよう変更され、また、確保から開放までの区間の短縮化が図られ、プログラムの実行時において、実行系に対する動的記憶管理による負担が低減されることとなる。
【００７０】
【発明の効果】
本発明に係るプログラム変換装置は、実行の際の動的な記憶領域の確保を指示する第1識別子を含む所定の識別子が用いられる第1形式プログラムを、実行のための第2形式プログラムに変換するプログラム変換装置である。
本プログラム変換装置は、前記変換を行う際、第1形式プログラム中で、第1識別子により確保される記憶領域の参照を指示することとなる識別子のうちの、最後に実行されることとなる識別子である参照識別子を判別し、第2形式プログラム中、前記参照識別子に対応する命令の直後に、前記記憶領域を解放する命令を挿入することを特徴としている。
【００７１】
本プログラム変換装置によると、上記の変換が行われる際、第1形式プログラム中で、上記のような参照識別子が判別され、第2形式プログラム中、参照識別子に対応する命令の直後に、記憶領域を解放する命令が挿入される。
これにより、上述のような処理に実行系を対応させることによって、、Ｊａｖａ等によるプログラムの実行時において、記憶領域の生存区間が無用に長引かせられることが防止され、実行系の動的記憶管理による負担を低減させることができる。
【００７２】
上記のプログラム変換装置では、前記記憶領域を解放する命令は、命令の集合となるライブラリによって実現されるものとし、前記第2形式プログラム中への前記記憶領域を解放する命令の挿入を、前記ライブラリを呼び出すための命令の挿入と、前記第2形式プログラムへの前記ライブラリの追加とすることができる。
【００７３】
本プログラム変換装置によると、上記の変換が行われる際、第1形式プログラム中で、上記のような参照識別子が判別され、第2形式プログラム中、参照識別子に対応する命令の直後に、記憶領域を解放するライブラリを呼び出すための命令が挿入され、このライブラリが第2形式プログラムに追加される。
これにより、上述のような処理に実行系を対応させることによって、ＯＳ、仮想マシン等からの、、Ｊａｖａ等によるプログラムの実行時において、実行系の動的記憶管理による負担を低減させることができる。
【００７４】
また、本発明に係るプログラム変換装置は、実行の際の動的な記憶領域の確保を指示する第1識別子と、所定のブロックに対応する範囲内の命令を実行する際のみの記憶領域の確保を指示する第2識別子とを含む所定の識別子が用いられる第1形式プログラムを、実行のための第2形式プログラムに変換するプログラム変換装置である。
【００７５】
本プログラム変換装置は、前記変換を行う際、第1形式プログラム中での、第1識別子の位置と、第1識別子により確保される記憶領域の参照を指示することとなる参照識別子の位置とから、前記記憶領域の生存区間を特定し、前記生存区間が前記ブロックの内部にとどまっているか否かを判定し、前記生存区間が前記ブロックの内部にとどまっていると判定されたとき、第2形式プログラム中にて、第1識別子に対応する命令を削除し、第1形式プログラム上で、前記第1識別子の対象となっていた記憶領域が第2識別子の対象として確保されるよう、第2識別子に対応する命令を挿入することを特徴としている。
【００７６】
本プログラム変換装置によると、上記の変換が行われる際、記憶領域の生存区間が特定され、この生存区間がブロックの内部にとどまっているとき、第2形式プログラム中にて、第1識別子に対応する命令が削除され、第1形式プログラム上で、第1識別子の対象となっていた記憶領域が第2識別子の対象として確保されるよう、第2識別子に対応する命令が挿入される。
【００７７】
これにより、Ｊａｖａ等によるプログラムにて記憶領域が無用に動的に確保されることが防止され、実行時において実行系の動的記憶管理による負担を低減させることができる。
本発明に係るプログラム変換装置は、所定の1つの対象に対する実行の際の動的な記憶領域の確保を指示する第1識別子と、所定のブロック内の命令の繰り返しを繰り返し回数とともに指示する第2識別子と、所定の複数の対象に対して連続的で、実行に際して動的な記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられる第1形式プログラムを、実行のための第2形式プログラムに変換するプログラム変換装置である。
【００７８】
本プログラム変換装置は、前記変換を行う際、第1形式プログラム中での、第1識別子の位置を特定し、前記第1識別子の位置が前記ブロック内に存在するか否かを判定し、前記第1識別子の位置が前記ブロック内に存在すると判定されたとき、前記第2識別子の繰り返し回数を検出し、第2形式プログラム中にて、前記第1識別子に対応する命令を削除し、第1形式プログラム上で、前記第1識別子の対象となっていた前記繰り返し回数分の大きさを有する記憶領域が、第3識別子の対象として確保されるよう、第3識別子に対応する命令を前記ブロックの外部に挿入することを特徴としている。
【００７９】
本プログラム変換装置によると、上記の変換が行われる際、第1識別子の位置が特定され、この第1識別子の位置が上記のブロック内に存在するとき、第2識別子の繰り返し回数が検出され、第2形式プログラム中にて、第1識別子に対応する命令が削除され、第1形式プログラム上で、第1識別子の対象となっていた繰り返し回数分の大きさを有する記憶領域が、第3識別子の対象として確保されるよう、第3識別子に対応する命令がブロックの外部に挿入される。
【００８０】
これにより、Ｃ言語、Ｃ＋＋言語、Ｊａｖａ等によるプログラムにて、動的な記憶領域がブロックを繰り返すたびに頻繁に確保されることが防止され、実行時において実行系の動的記憶管理による負担を低減させることができる。さらに、これらの記憶領域は連続的に確保され、動的記憶管理による回収処理が効率的に行われることとなる。
【００８１】
また、本発明に係るプログラム変換装置は、実行の際の動的な記憶領域の確保を指示する第1識別子と、所定の小ブロックに対応する範囲内の命令の繰り返しを繰り返し回数とともに指示する第2識別子と、所定の複数の対象に対しての、所定の大ブロックに対応する範囲内の命令の実行の際のみの記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられる第1形式プログラムを、実行のための第2形式プログラムに変換するプログラム変換装置である。
【００８２】
本プログラム変換装置は、前記変換を行う際、第1形式プログラム中での、第1識別子の位置と、第2識別子の位置と、第1識別子により確保される記憶領域の参照を指示することとなる参照識別子の位置とから、前記記憶領域の生存区間を特定し、前記生存区間が大ブロックの内部にとどまっており、かつ、前記第1識別子の位置が小ブロック内に存在するか否かを判定し、前記生存区間が大ブロックの内部にとどまっており、かつ、前記第1識別子の位置が小ブロック内に存在すると判定されたとき、前記第2識別子の繰り返し回数を検出し、第2形式プログラム中にて、第1識別子に対応する命令を削除し、第1形式プログラム上で、前記第1識別子の対象となっていた前記繰り返し回数分の大きさを有する記憶領域が第3識別子の対象として確保されるよう、第3識別子に対応する命令を、前記大ブロックの内部かつ前記小ブロックの外部に挿入することを特徴としている。
【００８３】
本プログラム変換装置によると、上記の変換が行われる際、記憶領域の生存区間が特定され、この生存区間が大ブロックの内部にとどまっており、かつ、第1識別子の位置が小ブロック内に存在するとき、第2識別子の繰り返し回数が検出され、第2形式プログラム中にて、第1識別子に対応する命令が削除され、第1形式プログラム上で、第1識別子の対象となっていた繰り返し回数分の大きさを有する記憶領域が第3識別子の対象として確保されるよう、第3識別子に対応する命令が、上記の大ブロックの内部かつ小ブロックの外部に挿入される。
【００８４】
これにより、Ｊａｖａ等によるプログラムにて記憶領域が無用に動的に確保されることが防止され、実行時において実行系の動的記憶管理による負担を低減させることができる。
本発明に係るプログラム変換装置は、実行の際の動的な記憶領域の確保を指示する第1識別子と、所定の小ブロックに対応する範囲内の命令の繰り返しを指示する第2識別子と、所定の大ブロックに対応する範囲内の命令の実行の際のみの記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられる第1形式プログラムを、実行のための第2形式プログラムに変換するプログラム変換装置である。
【００８５】
本プログラム変換装置は、前記変換を行う際、第1形式プログラム中での、第1識別子の位置と、第2識別子の位置と、第1識別子により確保される記憶領域の参照を指示することとなる参照識別子の位置とから、前記記憶領域の生存区間を特定し、前記生存区間が小ブロックを1回実行する間以上存続するか否かを判定し、前記生存区間が小ブロックを1回実行する間以上存続しないと判定されたとき、第2形式プログラム中にて、第1識別子に対応する命令を削除し、第1形式プログラム上で、前記第1識別子の対象となっていた記憶領域が第3識別子の対象として確保されるよう、第3識別子に対応する命令を、前記大ブロックの内部かつ前記小ブロックの外部に挿入することを特徴としている。
【００８６】
本プログラム変換装置によると、上記の変換が行われる際、記憶領域の生存区間が特定され、この生存区間が小ブロックを1回実行する間以上存続しないとき、第2形式プログラム中にて、第1識別子に対応する命令が削除され、第1形式プログラム上で、第1識別子の対象となっていた記憶領域が第3識別子の対象として確保されるよう、第3識別子に対応する命令が、上記の大ブロックの内部かつ小ブロックの外部に挿入される。
【００８７】
これにより、Ｊａｖａ等によるプログラムにて記憶領域が無用に動的に確保されることが防止され、実行時において実行系の動的記憶管理による負担を低減させることができる。
さらに、本発明に係るプログラム変換装置は、実行の際の動的な記憶領域の確保を指示する第1識別子と、前記記憶領域の解放を指示する第2識別子とを含む所定の識別子が用いられる第1形式プログラムを、実行のための第2形式プログラムに変換するプログラム変換装置である。
【００８８】
本プログラム変換装置は、前記変換を行う際、第1形式プログラム中で、第2識別子と、第1識別子により確保される記憶領域の参照を指示することとなる識別子のうちの、最後に実行されることとなる識別子である参照識別子とを判別し、第2形式プログラム中の前記第2識別子に対応する命令を削除し、第2形式プログラム中、前記参照識別子に対応する命令の直後に、前記第2識別子に対応する命令を挿入することを特徴としている。
【００８９】
本プログラム変換装置によると、上記の変換が行われる際、第1形式プログラム中で、上記のような参照識別子が判別され、第2形式プログラム中、第2識別子に対応する命令が削除され、参照識別子に対応する命令の直後に、記憶領域を解放する命令が挿入される。
これにより、Ｃ言語、Ｃ＋＋言語等によるプログラムの実行時において、記憶領域の生存区間が無用に長引かせられることが防止され、実行系の動的記憶管理による負担を低減させることができる。
【００９０】
本発明に係るプログラム変換装置は、実行の際の動的な記憶領域の確保を指示する第1識別子と、前記記憶領域の解放を指示する第2識別子と、所定のブロックに対応する範囲内の命令を実行する際のみの記憶領域の確保を指示する第3識別子とを含む所定の識別子が用いられる第1形式プログラムを、実行のための第2形式プログラムに変換するプログラム変換装置である。
【００９１】
本プログラム変換装置は、前記変換を行う際、第1形式プログラム中での、第1識別子の位置と、第1識別子により確保される記憶領域の参照を指示することとなる参照識別子の位置とから、前記記憶領域の生存区間を特定し、前記生存区間が前記ブロックの内部にとどまっているか否かを判定し、前記生存区間が前記ブロックの内部にとどまっていると判定されたとき、第2形式プログラム中にて、第1識別子に対応する命令と第2識別子に対応する命令とを削除し、前記第1形式プログラム上で、前記第1識別子の対象となっていた記憶領域が第3識別子の対象として確保されるよう、第3識別子に対応する命令を挿入すること特徴としている。
【００９２】
本プログラム変換装置によると、上記の変換が行われる際、記憶領域の生存区間が特定され、この生存区間がブロックの内部にとどまっているとき、第1識別子に対応する命令と第2識別子に対応する命令とが削除され、第1形式プログラム上で、第1識別子の対象となっていた記憶領域が第3識別子の対象として確保されるよう、第3識別子に対応する命令が挿入される。
【００９３】
これにより、Ｃ言語、Ｃ＋＋言語等によるプログラムにて記憶領域が無用に動的に確保されることが防止され、実行時において実行系の動的記憶管理による負担を低減させることができる。
また、本発明に係るプログラム変換装置は、実行の際の動的な記憶領域の確保を指示する第1識別子と、前記記憶領域の解放を指示する第2識別子と、所定の小ブロックに対応する範囲内の命令の繰り返しを繰り返し回数とともに指示する第3識別子と、所定の複数の対象に対しての、所定の大ブロックに対応する範囲内の命令の実行の際のみの記憶領域の確保を指示する第4識別子とを含む所定の識別子が用いられる第1形式プログラムを、実行のための第2形式プログラムに変換するプログラム変換装置である。
【００９４】
本プログラム変換装置は、前記変換を行う際、第1形式プログラム中での、第1識別子の位置と、第3識別子の位置と、第1識別子により確保される記憶領域の参照を指示することとなる参照識別子の位置とから、前記記憶領域の生存区間を特定し、前記生存区間が大ブロックの内部にとどまっており、かつ、前記第1識別子の位置が小ブロック内に存在するか否かを判定し、前記生存区間が大ブロックの内部にとどまっており、かつ、前記第1識別子の位置が小ブロック内に存在すると判定されたとき、前記第3識別子の繰り返し回数を検出し、第2形式プログラム中にて、第1識別子に対応する命令と第2識別子に対応する命令とを削除し、第1形式プログラム上で、前記第1識別子の対象となっていた前記繰り返し回数分の大きさを有する記憶領域が第4識別子の対象として確保されるよう、第4識別子に対応する命令を、前記大ブロックの内部かつ前記小ブロックの外部に挿入することを特徴としている。
【００９５】
本プログラム変換装置によると、上記の変換が行われる際、記憶領域の生存区間が特定され、この生存区間が大ブロックの内部にとどまっており、かつ、第1識別子の位置が小ブロック内に存在するとき、第3識別子の繰り返し回数が検出され、第2形式プログラム中にて、第1識別子に対応する命令と第2識別子に対応する命令とが削除され、第1形式プログラム上で、第1識別子の対象となっていた繰り返し回数分の大きさを有する記憶領域が第4識別子の対象として確保されるよう、第4識別子に対応する命令が、上記の大ブロックの内部かつ小ブロックの外部に挿入される。
【００９６】
これにより、Ｃ言語、Ｃ＋＋言語等によるプログラムにて記憶領域が無用に動的に確保されることが防止され、実行時において実行系の動的記憶管理による負担を低減させることができる。
本発明に係るプログラム変換装置は、実行の際の動的な記憶領域の確保を指示する第1識別子と、前記記憶領域の解放を指示する第2識別子と、所定の小ブロックに対応する範囲内の命令の繰り返しを指示する第3識別子と、所定の大ブロックに対応する範囲内の命令の実行の際のみの記憶領域の確保を指示する第4識別子とを含む所定の識別子が用いられる第1形式プログラムを、実行のための第2形式プログラムに変換するプログラム変換装置である。
【００９７】
本プログラム変換装置は、前記変換を行う際、第1形式プログラム中での、第1識別子の位置と、第3識別子の位置と、第1識別子により確保される記憶領域の参照を指示することとなる参照識別子の位置とから、前記記憶領域の生存区間を特定し、前記生存区間が小ブロックを1回実行する間以上存続するか否かを判定し、前記生存区間が小ブロックを1回実行する間以上存続しないと判定されたとき、第2形式プログラム中にて、第1識別子に対応する命令と第2識別子に対応する命令とを削除し、第1形式プログラム上で、前記第1識別子の対象となっていた記憶領域が第4識別子の対象として確保されるよう、第4識別子に対応する命令を、前記大ブロックの内部かつ前記小ブロックの外部に挿入することを特徴としている。
【００９８】
本プログラム変換装置によると、上記の変換が行われる際、記憶領域の生存区間が特定され、この生存区間が小ブロックを1回実行する間以上存続しないとき、第2形式プログラム中にて、第1識別子に対応する命令と第2識別子に対応する命令とが削除され、第1形式プログラム上で、第1識別子の対象となっていた記憶領域が第4識別子の対象として確保されるよう、大4識別子に対応する命令が、上記の大ブロックの内部かつ小ブロックの外部に挿入される。
【００９９】
これにより、Ｃ言語、Ｃ＋＋言語等によるプログラムにて記憶領域が無用に動的に確保されることが防止され、実行時において実行系の動的記憶管理による負担を低減させることができる。
【図面の簡単な説明】
【図１】本発明の実施の形態に含まれるプログラム翻訳装置100の全体構成を説明するためのブロック図である。
【図２】プログラム翻訳装置100にて行われる処理の概要を示すためのフローチャートである。
【図３】図2のＳ13での参照箇所検出処理の手順を説明するためのフローチャートである。
【図４】図3のＳ132にて呼び出されるサブルーチンｓｅｅｋ＿ｕｓｅ＿ａｎｄ＿ａｄｄｒｅｓｓｓｕｂｓｔ（ａ）での処理の手順を説明するためのフローチャートである。
【図５】記憶領域参照箇所検出部103および記憶領域生存区間解析部104の動作を説明するための第1のプログラムを示す図である。
【図６】記憶領域参照箇所検出部103および記憶領域生存区間解析部104の動作を説明するための第2のプログラムを示す図である。
【図７】図2のＳ23での、記憶領域局所化コード生成部111による局所化処理の詳細を説明するためのフローチャートである。
【図８】図2のＳ20での、記憶領域連続化コード生成部112による連続化処理の詳細を説明するためのフローチャートである。
【図９】図2のＳ18での、記憶領域連続局所化コード生成部113による連続局所化処理の詳細を説明するためのフローチャートである。
【図１０】図2のＳ16での、記憶領域共通化コード生成部114による共通化処理の詳細を説明するためのフローチャートである。
【図１１】局所化処理によるプログラムの変更を示す図である。
【図１２】連続化処理によるプログラムの変更を示す図である。
【図１３】連続局所化処理によるプログラムの変更を示す図である。
【図１４】共通化処理によるプログラムの変更を示す図である。
【図１５】本実施の形態の変形例のプログラム翻訳装置150の全体構成を説明するためのブロック図である。
【図１６】Ｃ言語，Ｃ＋＋言語、Ｊａｖｅの実行形式のコードの生成を説明するための図である。
【符号の説明】
1  ソースプログラム
2  中間形式プログラム
3  実行形式プログラム
100、150  プログラム翻訳装置
101  ソースプログラム解読部
102  記憶領域割り当て箇所検出部
103  記憶領域参照箇所検出部
104  記憶領域生存区間解析部
105  記憶領域解放コード生成部
106  局所記憶領域判定部
107  ループ内定義記憶領域判定部
108  ループ内定義局所記憶領域判定部
109  ループ内記憶領域判定部
110  記憶領域解放コード削除部
111  記憶領域局所化コード生成部
112  記憶領域連続化コード生成部
113  記憶領域連続局所化コード生成部
114  記憶領域共通化コード生成部
115  実行形式プログラム生成部
151  記憶領域解放呼び出しコード生成部
152  記憶領域解放ライブラリ
【図１】
0004486720.tif 000003
【図２】
0004486720.tif 000004
【図３】
0004486720.tif 000005
【図４】
0004486720.tif 000006
【図５】
0004486720.tif 000007
【図６】
0004486720.tif 000008
【図７】
0004486720.tif 000009
【図８】
0004486720.tif 000010
【図９】
0004486720.tif 000011
【図１０】
0004486720.tif 000012
【図１１】
0004486720.tif 000013
【図１２】
0004486720.tif 000014
【図１３】
0004486720.tif 000015
【図１４】
0004486720.tif 000016
【図１５】
0004486720.tif 000017
【図１６】
0004486720.tif 000018