(57)【要約】【課題】必要なメモリ量を抑え、メモリ領域を効率良く再利用することが可能なプログラム変換技術を提供する。【解決手段】サブプログラム解析部５１は、入力されたプログラムからサブプログラム及び当該サブプログラムで使用するメモリ領域を抽出する。メモリ領域確保コード追加部５８は、サブプログラムにおいてメモリ領域を最初に使用するコードの直前に、メモリ領域を確保するコードを追加する。サブプログラム呼び出しコード変更部５７は、他のサブプログラムを呼び出すコードを、当該他のサブプログラムが使用するメモリ領域の解放の可否を示す解放可否情報を追加して当該他のサブプログラムを呼び出すコードに変更する。メモリ領域解放コード追加部５９は、メモリ領域を最後に使用し且つ他のサブプログラムを呼び出すものではない第５コードの直後に、当該メモリ領域を解放するコードを追加する。【選択図】        図１
2010118025.tif 000002
【特許請求の範囲】
【請求項１】
複数のサブプログラムから構成されるプログラムを変換するプログラム変換装置であって、
前記サブプログラムにおいてメモリ領域を最初に使用する第１コードの直前に、メモリ領域を確保する第２コードを追加する第１追加部と、
前記メモリ領域を使用する他のサブプログラムを呼び出す第３コードを、当該他のサブプログラムが使用するメモリ領域の解放の可否を示す解放可否情報を当該他のサブプログラムに渡すと共に当該他のサブプログラムを呼び出す第４コードに変更する第１変更部と、
メモリ領域を最後に使用し且つ他のサブプログラムを呼び出すものではない第５コードの直後に、当該メモリ領域の解放の可否を示す解放可否情報に応じて当該メモリ領域を解放する第６コードを追加する第２追加部と、
前記第２コードの追加、前記第６コードの追加及び前記第４コードへの変更のうち少なくとも１つがなされたサブプログラムから構成されるプログラムを出力する出力部とを備える
ことを特徴とするプログラム変換装置。
【請求項２】
前記第１変更部は、
呼び出す元のサブプログラムが有する前記解放可否情報と、当該呼び出す元のサブプログラム内で以降に前記メモリ領域を使用するか否かとに応じて、前記他のサブプログラムに渡す前記解放可否情報を生成する第１生成部と、
生成された前記解放可否情報を前記他のサブプログラムに渡すと共に当該他のサブプログラムを呼び出す前記第４コードに前記第３コードを変更する第２変更部とを有する
ことを特徴とする請求項１に記載のプログラム変換装置。
【請求項３】
前記第１生成部は、前記呼び出す元のサブプログラムが有する前記解放可否情報が真であって且つ当該呼び出す元のサブプログラム内で以降に前記メモリ領域を使用しない場合にのみ真となる真偽値により表される前記解放可否情報を生成する
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項４】
前記解放可否情報をその他のサブプログラムから受け取る受取部とを更に備え、
前記第１生成部は、前記解放可否情報を前記その他のサブプログラムから前記受取部が受け取った場合、当該解放可否情報を、前記呼び出す元のサブプログラムが有する前記解放可否情報として、当該解放可否情報と、当該呼び出す元のサブプログラム内で以降に前記メモリ領域を使用するか否かとに応じて、前記他のサブプログラムに渡す前記解放可否情報を生成し、前記解放可否情報を前記その他のサブプログラムから前記受取部が受け取っていない場合、前記呼び出す元のサブプログラムが有する前記解放可否情報は真であるとして、当該解放可否情報と、当該呼び出す元のサブプログラム内で以降に前記メモリ領域を使用するか否かとに応じて、前記他のサブプログラムに渡す前記解放可否情報を生成する
ことを特徴とする請求項３に記載のプログラム変換装置。
【請求項５】
前記第２追加部は、前記解放可否情報が真である場合に前記メモリ領域を解放する処理命令を含み、前記解放可否情報が偽である場合に行う処理命令を含まない前記第６コードを前記第５コードの直後に追加する
ことを特徴とする請求項４に記載のプログラム変換装置。
【請求項６】
前記第１生成部は、前記プログラムにおいて１つのメモリ領域が複数の変数から参照される場合、呼び出す元のサブプログラムが有する前記解放可否情報と、呼び出す元のサブプログラム内で以降に前記メモリ領域を使用するか否かとに応じて、何個の変数から当該メモリ領域が今後参照されるかを示すカウンタ情報を含む前記解放可否情報を生成する
ことを特徴とする請求項１乃至５のいずれか一項に記載のプログラム変換装置。
【請求項７】
前記メモリ領域に固有のカウンタを生成する第２生成部と、
前記カウンタの値を「１」増加させる第７コードを、新たな変数にメモリ領域を対応付ける第８コードの直前に追加し、前記カウンタの値を「１」減少させる第９コードを、ある変数からメモリ領域を参照する最後の第１０コードの直後に追加することによって、前記カウンタ情報を生成する第３生成部とを更に備える
ことを特徴とする請求項６に記載のプログラム変換装置。
【請求項８】
前記第２追加部は、前記カウンタの値が「０」である場合にのみ実行されるように前記第６コードを前記第５コードの直後に追加する
ことを特徴とする請求項７に記載のプログラム変換装置。  
【請求項９】
前記第８コードを、前記メモリ領域と前記カウンタの値を記憶する領域とを含む領域を前記変数に対応付ける第１１コードに変更する変更部を更に備え、
前記第２生成部は、前記第８コードにおける前記変数を、前記メモリ領域と前記カウンタの値を記憶する領域とを含む領域の中から当該メモリ領域を指す関数の呼び出しに置き換えることにより、前記カウンタを生成する
ことを特徴とする請求項８に記載のプログラム変換装置。
【請求項１０】
前記第２生成部は、前記メモリ領域の直後を、当該メモリ領域に固有のカウンタの値を記憶する領域として確保して、前記カウンタを生成する
ことを特徴とする請求項７に記載のプログラム変換装置。
【請求項１１】
前記第２生成部は、前記メモリ領域の直前を、当該メモリ領域に固有のカウンタの値を記憶する領域として確保して、前記カウンタを生成する
ことを特徴とする請求項７に記載のプログラム変換装置。
【請求項１２】
複数のサブプログラムから構成されるプログラムを変換するプログラム変換装置の有するコンピュータを、
前記サブプログラムにおいてメモリ領域を最初に使用する第１コードの直前に、メモリ領域を確保する第２コードを追加する第１追加手段と、
前記メモリ領域を使用する他のサブプログラムを呼び出す第３コードを、当該他のサブプログラムが使用するメモリ領域の解放の可否を示す解放可否情報を当該他のサブプログラムに渡すと共に当該他のサブプログラムを呼び出す第４コードに変更する第１変更手段と、
メモリ領域を最後に使用し且つ他のサブプログラムを呼び出すものではない第５コードの直後に、当該メモリ領域の解放の可否を示す解放可否情報に応じて当該メモリ領域を解放する第６コードを追加する第２追加手段と、
前記第２コードの追加、前記第６コードの追加及び前記第４コードへの変更のうち少なくとも１つがなされたサブプログラムから構成されるプログラムを出力する出力手段として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリ領域を効率的に管理可能にプログラムを変換するプログラム変換装置及びプログラムに関する。
【背景技術】
【０００２】
近年のプログラムにおいては、アプリケーションの複雑化により実現すべき機能が増大し、また製品のライフサイクルが短くなっており、それに連動して開発期間が短くなってきている。これにより、開発現場においてはいかに迅速に製品を作り上げるかが重要になってきている。このため、フレームワークを開発したり、従来、アセンブリ言語やＣ言語で記述していたファームウェアなどのアプリケーションについてもより生産性が高いとされるJAVA（登録商標）などの新しい言語にその軸足を移したりしている。これらの新しい言語においては、アプリケーションの重要で且つ複雑な管理項目の一つとしてあるメモリ領域の管理について、ライブラリや言語自身の機能として自動メモリ管理方式を導入していることが多い。自動メモリ管理方式には、例えば、ガベージコレクションがある。ガベージコレクションの方法には、例えば、ReferenceCountingMethodがある（例えば、非特許文献１参照）。
【０００３】
【非特許文献１】"A Method of Overlapping and Erasure of Lists" Communications of the. ACM, 2(12): 655-657, December 1960
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかしながら、これらの自動メモリ管理方式では生産性は非常に向上するものの、手作業でメモリ管理を行った場合に比べて性能の劣化が激しく、メモリのリソースが制限される組み込み向け分野などではその使用が困難な場合が多い。例えば、ReferenceCounting Methodではメモリ領域を確保している時間はそれを指すポインタに依存している。このため、実際に必要な期間よりも長い間メモリ領域を確保するために、実際に必要な量よりも多くのメモリ量が必要となる。従って、メモリ量の限られたメモリでは動作しなかったり、また必要以上のメモリ量を有するメモリを実装することが必要になったりする。また、最適化において無駄に確保していた時間のために異なるメモリ領域にデータを割り当てざるをえないゆえ、データを何度も使い回せる場合でもそれができずに、メモリから他のメモリへデータをコピーする必要が生じる場合もある。
【０００５】
本発明は、上記に鑑みてなされたものであって、必要なメモリ量を抑え、メモリ領域を効率良く再利用することが可能なプログラム変換装置及びプログラムを目的とする。
【課題を解決するための手段】
【０００６】
上述した課題を解決し、本発明は、複数のサブプログラムから構成されるプログラムを変換するプログラム変換装置であって、前記サブプログラムにおいてメモリ領域を最初に使用する第１コードの直前に、メモリ領域を確保する第２コードを追加する第１追加部と、前記メモリ領域を使用する他のサブプログラムを呼び出す第３コードを、当該他のサブプログラムが使用するメモリ領域の解放の可否を示す解放可否情報を当該他のサブプログラムに渡すと共に当該他のサブプログラムを呼び出す第４コードに変更する第１変更部と、メモリ領域を最後に使用し且つ他のサブプログラムを呼び出すものではない第５コードの直後に、当該メモリ領域の解放の可否を示す解放可否情報に応じて当該メモリ領域を解放する第６コードを追加する第２追加部と、前記第２コードの追加、前記第６コードの追加及び前記第４コードへの変更のうち少なくとも１つがなされたサブプログラムから構成されるプログラムを出力する出力部とを備えることを特徴とする。
【０００７】
また、本発明は、プログラムであって、複数のサブプログラムから構成されるプログラムを変換するプログラム変換装置の有するコンピュータを、前記サブプログラムにおいてメモリ領域を最初に使用する第１コードの直前に、メモリ領域を確保する第２コードを追加する第１追加手段と、前記メモリ領域を使用する他のサブプログラムを呼び出す第３コードを、当該他のサブプログラムが使用するメモリ領域の解放の可否を示す解放可否情報を当該他のサブプログラムに渡すと共に当該他のサブプログラムを呼び出す第４コードに変更する第１変更手段と、メモリ領域を最後に使用し且つ他のサブプログラムを呼び出すものではない第５コードの直後に、当該メモリ領域の解放の可否を示す解放可否情報に応じて当該メモリ領域を解放する第６コードを追加する第２追加手段と、前記第２コードの追加、前記第６コードの追加及び前記第４コードへの変更のうち少なくとも１つがなされたサブプログラムから構成されるプログラムを出力する出力手段として機能させる。
【発明の効果】
【０００８】
本発明によれば、必要なメモリ量を抑え、メモリ領域を効率良く再利用することが可能になる。
【発明を実施するための最良の形態】
【０００９】
以下に添付図面を参照して、この発明にかかるプログラム変換装置及びプログラムの最良な実施の形態を詳細に説明する。
【００１０】
[第１の実施の形態]
（１）構成
まず、本実施の形態にかかるプログラム変換装置のハードウェア構成について説明する。プログラム変換装置は、装置全体を制御するＣＰＵ（Central Processing Unit）等の制御装置と、各種データや各種プログラムを記憶するＲＯＭ（Read Only Memory）やＲＡＭ（Random Access Memory）等の記憶装置と、各種データや各種プログラムを記憶するＨＤＤ（Hard Disk Drive）やＣＤ（Compact Disk）ドライブ装置等の外部記憶装置と、これらを接続するバスとを備えており、通常のコンピュータを利用したハードウェア構成となっている。また、プログラム変換装置には、情報を表示する表示装置と、ユーザの指示入力を受け付けるキーボードやマウス等の入力装置と、外部装置の通信を制御する通信Ｉ／Ｆ（interface）とが有線又は無線により各々接続される。
【００１１】
このようなハードウェア構成において、プログラム変換装置のＣＰＵが記憶装置や外部記憶装置に記憶された各種プログラムを実行することにより実現される各種機能について説明する。図１は、プログラム変換装置５０の機能的構成を例示する図である。プログラム変換装置５０は、サブプログラム解析部５１と、サブプログラム変更部５２とを有する。これらの各部は、ＣＰＵのプログラム実行時にＲＡＭなどの記憶装置上に生成されるものである。
【００１２】
サブプログラム解析部５１には、処理命令や変数宣言などを示す複数のコードが記述された処理対象のプログラムが入力される。処理対象のプログラムは、例えば通信Ｉ／Ｆを介して外部装置から受信されて入力されるようにしても良いし、ＨＤＤやＣＤなどの記憶媒体から読み出されて入力されるようにしても良い。サブプログラム解析部５１は、入力されたプログラムからサブプログラム及び当該サブプログラムで使用するメモリ領域を抽出する。サブプログラム解析部５１の機能は、サブプログラム抽出部５３と、使用メモリ領域抽出部５４とに大別される。サブプログラム抽出部５３は、入力されたプログラムを解析して、サブプログラムを抽出する。例えばＣ言語で記述されたプログラムの場合、サブプログラム抽出部５３は、当該プログラムで定義されている関数毎にサブプログラムを抽出する。使用メモリ領域抽出部５４は、サブプログラム抽出部５３が抽出した各サブプログラムで使用されるメモリ領域を抽出する。
【００１３】
サブプログラム変更部５２は、サブプログラム解析部５１が抽出したサブプログラムを適宜変更して、変更後のサブプログラムから構成されるプログラムを出力する。サブプログラム変更部５２の機能は、コード解析部５５と、メモリ解放可否判定部５６と、サブプログラム呼び出しコード変更部５７と、メモリ領域確保コード追加部５８と、メモリ領域解放コード追加部５９と、サブプログラム再構成部６０とに大別される。コード解析部５５は、サブプログラム抽出部５３が抽出したサブプログラムの各コードをサブプログラム毎に解析する。
【００１４】
メモリ解放可否判定部５６は、コード解析部５５の解析の結果、処理対象のコードが、処理対象のサブプログラムの外部で定義されていないメモリ領域を使用する最初のコードであると解析された場合、当該メモリ領域の解放が可であることを示す解放可否情報を当該メモリ領域と対応付けてＲＡＭなどの記憶装置に記憶させる。また、メモリ解放可否判定部５６は、コード解析部５５の解析の結果、処理対象のコードが、メモリ領域を返す他のサブプログラムを呼び出すサブプログラム呼び出しであると解析された場合、返されるメモリ領域と対応付けて当該メモリ領域の解放が可であることを示す解放可否情報を対応付けて記憶装置に記憶させる。そして、メモリ解放可否判定部５６は、解放可否情報を用いて、対象のメモリ領域の解放の可否を判定する。
【００１５】
サブプログラム呼び出しコード変更部５７は、コード解析部５５の解析の結果、処理対象のコードが、対象のメモリ領域を使用する最後のコードであり且つ他のサブプログラムを呼び出すサブプログラム呼び出しであると解析された場合、且つ、メモリ解放可否判定部５６の判定の結果、当該メモリ領域の解放が可であると判定された場合、メモリ領域の解放が可であることを示す解放可否情報を生成してこれを追加して当該他のサブプログラムを呼び出すように処理対象のサブプログラムを変更する。また、サブプログラム呼び出しコード変更部５７は、対象のメモリ領域を使用する最後のコードでないか、又は、メモリ解放可否判定部５６の判定の結果、当該メモリ領域の解放が可であると判定された場合で、且つ対象のメモリを使用する他のサブプログラムを呼び出すサブプログラム呼び出しであると解析された場合、メモリ領域の解放が不可であることを示す解放可否情報を生成してこれを追加して当該他のサブプログラムを呼び出すように処理対象のサブプログラムを変更する。
【００１６】
メモリ領域確保コード追加部５８は、コード解析部５５の解析の結果、処理対象のコードが、処理対象のサブプログラムの外部で定義されていないメモリ領域を使用する最初のコードであると解析された場合、当該サブプログラムにおいて当該コードの直前にメモリ領域を確保するコード（確保コードという）を追加する。
【００１７】
メモリ領域解放コード追加部５９は、コード解析部５５の解析の結果、処理対象のコードが、メモリ領域を使用する最後のコードである且つ他のサブプログラムを呼び出すサブプログラム呼び出しでないことが解析された場合、且つ、メモリ解放可否判定部５６の判定の結果、当該メモリ領域の解放が可であると判定された場合、処理対象のサブプログラムにおいて処理対象のコードの直後にメモリ領域を解放するコード（解放コードという）を追加する。
【００１８】
サブプログラム再構成部６０は、サブプログラム呼び出しコード変更部５７と、メモリ領域確保コード追加部５８と、メモリ領域解放コード追加部５９とが適宜変更した各サブプログラムを再構成することにより、入力された処理対象のプログラムを変換し、変換したプログラムを出力する。
【００１９】
（２）動作
次に、本実施の形態にかかるプログラム変換装置５０の行うプログラム変換処理の手順について図２を用いて説明する。プログラム変換装置５０は、処理対象のプログラムが入力されると（ステップＳ１）、当該プログラムを解析してサブプログラムを抽出し（ステップＳ２）、次に各サブプログラムで使用されているメモリ領域を各々抽出する（ステップＳ３）。そして、プログラム変換装置５０は、サブプログラム毎にコードを解析して、メモリ領域毎に各コードに対する処理を行う（ステップＳ４）。
【００２０】
図３は、各コードに対して行う処理の詳細な手順を示すフローチャートである。プログラム変換装置５０は、まず、処理対象のコードが、処理対象のサブプログラムの外部で定義されていないメモリ領域を使用する最初のコードであるか否かを判定する（ステップＳ１０）。処理対象のコードが、当該最初のコードである場合（ステップＳ１０：ＹＥＳ）、プログラム変換装置５０は、処理対象のサブプログラムにおいて処理対象のコードの直前にメモリ領域を確保する確保コードを追加し、メモリ領域の解放が可であることを示す解放可否情報を当該メモリ領域と対応付けてメモリ解放可否判定部５６に記憶させる（ステップＳ１１）。一方、ステップＳ１０の判定結果が否定的である場合（ステップＳ１０：ＮＯ）、プログラム変換装置５０は、処理対象のコードが、メモリ領域を返して他のサブプログラムを呼び出すサブプログラム呼び出しであるか否かを判定する（ステップＳ１２）。当該判定結果が肯定的である場合、プログラム変換装置５０は、返されるメモリ領域と対応付けて当該メモリ領域の解放が可であることを示す解放可否情報を対応付けてメモリ解放可否判定部５６に記憶させる（ステップＳ１３）。
【００２１】
ステップＳ１３の後又はステップＳ１２の判定結果が否定的である場合、プログラム変換装置５０は、処理対象のコードが、対象のメモリ領域を使用する最後のコードであるか否かを判定する（ステップＳ１４）。処理対象のコードが、当該最後のコードである場合（ステップＳ１４：ＹＥＳ）、次いで、プログラム変換装置５０は、記憶装置に記憶された解放可否情報を参照して、当該対象のメモリ領域の解放が可であるか否かを判定する（ステップＳ１５）。メモリ領域の解放が可である場合（ステップＳ１５：ＹＥＳ）、プログラム変換装置５０は、次いで、処理対象のコードが、他のサブプログラムを呼び出すサブプログラム呼び出しであるか否かを判定する（ステップＳ１６）。処理対象のコードが、サブプログラム呼び出しである場合（ステップＳ１６：ＹＥＳ）、プログラム変換装置５０は、メモリ領域の解放が可であることを示す解放可否情報を追加して当該他のサブプログラムを呼び出すように処理対象のサブプログラムを変更する（ステップＳ１８）。ステップＳ１６の判定結果が否定的である場合、プログラム変換装置５０は、処理対象のサブプログラムにおいて処理対象のコードの直後にメモリ領域を解放する解放コードを追加する（ステップＳ１９）。
【００２２】
また、ステップＳ１４又はステップＳ１５の判定結果が否定的である場合、プログラム変換装置５０は、処理対象のコードが、メモリ領域を使用する他のサブプログラムを呼び出すサブプログラム呼び出しであるか否かを判定する（ステップＳ１７）。処理対象のコードが、サブプログラム呼び出しである場合（ステップＳ１７：ＹＥＳ）、プログラム変換装置５０は、メモリ領域の解放が不可であることを示す解放可否情報を追加して当該他のサブプログラムを呼び出すように処理対象のサブプログラムを変更する（ステップＳ２０）。ステップＳ１７の判定結果が否定的である場合（ステップＳ１７：ＮＯ）、プログラム変換装置５０は、コードの変更や追加は行わない。図２の説明に戻る。プログラム変換装置５０は、以上のような処理をサブプログラム毎に各コードに対して行った後、変更を適宜行ったサブプログラムを再構成することにより、入力された処理対象のプログラムを変換し、変換したプログラムを出力する（ステップＳ５）。
【００２３】
以上のようにして、必要なメモリ量を抑え、メモリ領域を効率良く再利用することができるような機能として、メモリ領域の確保や解放を制御する機能をプログラムに追加する。即ち、メモリ領域を指すポインタの数によらず、実際に必要とする期間のみメモリ領域を確保し、必要な期間が経過した後に解放するようにプログラムを変換する。このような構成によれば、必要最低限のメモリ量でプログラムを動作させることができる。
【００２４】
[第２の実施の形態]
次に、プログラム変換装置及びプログラムの第２の実施の形態について説明する。なお、上述の第１の実施の形態と共通する部分については、同一の符号を使用して説明したり、説明を省略したりする。
【００２５】
（１）構成
本実施の形態においては、C++言語で記述されたプログラムを処理対象として取り扱う例について説明する。図４は、本実施の形態にかかるプログラム変換装置５０´の機能的構成を示す図である。本実施の形態にかかるプログラム変換装置５０´の機能的構成は、上述の第１の実施の形態にかかるプログラム変換装置５０の機能的構成とは以下の点で異なる。プログラム変換装置５０´は、サブプログラム解析部５１と、サブプログラム変更部５２と、サブプログラム再構成部６０とに加え、サブプログラム入出力変更部６１を有する。また、サブプログラム変更部５２は、コード解析部５５と、メモリ解放可否判定部５６と、サブプログラム呼び出しコード変更部５７と、メモリ領域確保コード追加部５８と、メモリ領域解放コード追加部５９と、サブプログラム再構成部６０とに加え、メモリ領域解放可否情報生成部６３を有する。
【００２６】
サブプログラム解析部５１には、処理対象のプログラムとしてC++言語により記述されたプログラムが入力される。サブプログラム抽出部５３は、入力されたプログラムを解析して、当該プログラムで定義されている各関数をサブプログラムとして抽出する。使用メモリ領域抽出部５４の機能は上述の第１の実施の形態と同様である。
【００２７】
サブプログラム入出力変更部６１は、メモリ領域解放可否情報入力付加部６２を有する。サブプログラム入出力変更部６１は、サブプログラム解析部５１が抽出したサブプログラムとして抽出した各関数について、C++言語の仕様に応じて、関数の入力の定義を適宜変更する。具体的には、メモリ領域解放可否情報入力付加部６２は、サブプログラム解析部５１が抽出した各関数について、メモリ領域の解放の可否を示す解放可否情報が当該関数の外部の呼び出し元から渡される場合、これを入力として受け取るために、外部から入力されるメモリ領域を指す変数それぞれについて、解放可否情報を追加で外部から入力されるように関数の入力の定義を適宜変更する。
【００２８】
ここで、本実施の形態における解放可否情報について説明する。本実施の形態においては、解放可否情報は、呼び出す元のサブプログラムが有する、メモリ領域の解放の可否を示す解放可否情報が真であって且つ呼び出す元のサブプログラム内で以降に当該メモリ領域を使用しない場合にのみ真となる真偽値によって表される。呼び出す元のサブプログラムが有する、メモリ領域の解放の可否を示す解放可否情報は、呼び出す元のサブプログラムを更に呼び出しているサブプログラムから解放可否情報が渡される場合は渡された解放可否情報の値がそのまま引き継がれ、そうでない場合は真として表される。また、本実施の形態においては、メモリ領域を複数の変数から参照するサブプログラムにおいて、呼び出す先のサブプログラムに渡す解放可否情報は、何個の変数からメモリ領域が今後参照されるかを示すカウンタを含む。このカウンタの値はメモリ領域毎に計数されるものである。このカウンタ及びカウンタの値を計数するコードは、サブプログラム変更部５２の有するメモリ領域解放可否情報生成部６３が生成する。
【００２９】
具体的には、メモリ領域解放可否情報生成部６３は、コード解析部５５の解析の結果、処理対象のコードが、処理対象のサブプログラムの外部で定義されていないメモリ領域を使用する最初のコードであり且つメモリ領域の共有が発生すると解析された場合、即ち、共有の発生する対象のメモリ領域を新たな変数に対応付けるコードであると解析された場合、カウンタの値を「１」増加させるコード（インクリメントコードという）を処理対象のコードの直前に追加する。このとき、メモリ領域解放可否情報生成部６３は、当該メモリ領域を新たな変数に対応付けるコードを、当該メモリ領域とカウンタの値を記憶する領域とを含む領域を当該新たな変数に対応付けるコードに変更する。そして、メモリ領域解放可否情報生成部６３は、当該コードにおける変数を、当該メモリ領域とカウンタの値を記憶する領域とを含む領域の中から当該メモリ領域を指す関数の呼び出しに置き換えることにより、カウンタを生成する。また、メモリ領域解放可否情報生成部６３は、コード解析部５５の解析の結果、処理対象のコードが、対象のメモリ領域を使用する最後のコードである且つ他のサブプログラムを呼び出すサブプログラム呼び出しでないことが解析された場合、カウンタの値を「１」減少させるコード（デクリメントコードという）を処理対象のコードの直後に追加する。
【００３０】
次に、上述の解放可否情報の取り扱いに伴い、メモリ解放可否判定部５６、サブプログラム呼び出しコード変更部５７、メモリ領域確保コード追加部５８及びメモリ領域解放コード追加部５９の各機能が上述の第１の実施の形態と異なる点について説明する。
【００３１】
メモリ解放可否判定部５６は、コード解析部５５の解析の結果、処理対象のコードが、処理対象のサブプログラムの外部で定義されていないメモリ領域を使用する最初のコードであり且つメモリ領域の共有が発生すると解析された場合、当該コードの直前にインクリメントコードを追加する。また、メモリ解放可否判定部５６は、コード解析部５５の解析の結果、処理対象のコードが、処理対象のサブプログラムの外部で定義されていないメモリ領域を使用する最初のコードであり且つメモリ領域の共有が発生しないと解析された場合、当該メモリ領域の解放が可であることを示す解放可否情報を当該メモリ領域と対応付けてＲＡＭなどの記憶装置に記憶させる。また、メモリ解放可否判定部５６は、上述の第１の実施の形態と同様に、メモリ領域の解放の可否を示す解放可否情報が記憶装置に記憶されている場合には、当該解放可否情報を用いて、対象のメモリ領域の解放の可否を判定する。対象のメモリ領域に関する解放可否情報が記憶装置に記憶されていない場合、即ち、外部から入力される解放可否情報によって対象のメモリ領域の解放の可否が示される場合、メモリ解放可否判定部５６は、当該対象のメモリ領域の解放の可否を判定することができない。このため、本実施の形態においては、以下で説明するサブプログラム呼び出しコード変更部５７、メモリ領域確保コード追加部５８及びメモリ領域解放コード追加部５９が、外部から入力される解放可否情報に応じて各コードの追加や変更を適宜行う。
【００３２】
サブプログラム呼び出しコード変更部５７は、コード解析部５５の解析の結果、処理対象のコードが、対象のメモリ領域を使用する最後のコードであり且つ他のサブプログラムを呼び出すサブプログラム呼び出しであると解析された場合、処理対象のサブプログラムを呼び出しているサブプログラム（呼び出し元）から渡される解放可否情報に応じて、メモリ領域の解放が可であることを示す解放可否情報を生成してこれを追加して当該他のサブプログラムを呼び出すように当該処理対象のコードを変更する。尚、対象のメモリ領域を使用する最後のコードではなく且つ他のサブプログラムを呼び出すサブプログラム呼び出しであると解析された場合、サブプログラム呼び出しコード変更部５７は、上述の第１の実施の形態と同様にして、メモリ領域の解放が不可であることを示す解放可否情報を生成してこれを追加して当該他のサブプログラムを呼び出すように処理対象のサブプログラムを変更する。
【００３３】
メモリ領域確保コード追加部５８は、コード解析部５５の解析の結果、処理対象のコードが、処理対象のサブプログラムの外部で定義されていないメモリ領域を使用する最初のコードであり且つメモリ領域の共有が発生しないと解析された場合、当該サブプログラムにおいて当該コードの直前にメモリ領域を確保する確保コードを追加する。
【００３４】
メモリ領域解放コード追加部５９は、コード解析部５５の解析の結果、処理対象のコードが、対象のメモリ領域を使用する最後のコードであり且つ他のサブプログラムを呼び出すサブプログラム呼び出しでないと解析された場合、処理対象のコードの直後に、解放可否情報に応じてメモリ領域を解放するコード（条件解放コードという）を追加する。条件解放コードは、解放可否情報の値が真である場合にメモリ領域を解放する処理命令を含み、解放可否情報の値が偽である場合の処理命令を含まないコードである。より具体的には、条件解放コードは、上述のデクリメントコードの後にカウンタの値が「０」である場合にのみ、メモリ領域を解放する処理命令が実行されるコードである。
【００３５】
（２）動作
次に、本実施の形態にかかるプログラム変換装置５０´の行うプログラム変換処理の手順について図５を用いて説明する。プログラム変換装置５０´は、処理対象のプログラムが入力されると（ステップＳ１）、当該プログラムを解析して、当該プログラムで定義されている各関数をサブプログラムとして抽出し（ステップＳ３０）、次に各関数で使用されているメモリ領域を指す変数を抽出することにより、各メモリ領域を抽出する（ステップＳ３１）。そして、プログラム変換装置５０´は、ステップＳ３０で抽出した各関数について、メモリ領域の解放の可否を示す解放可否情報を入力として呼び出し元から受け取るために、当該関数の外部から入力されるメモリ領域を指す変数それぞれについて、解放可否情報を追加で外部から入力されるように関数の入力の定義を適宜変更する（ステップＳ３２）。その後、プログラム変換装置５０´は、関数毎に各コードを解析して、メモリ領域毎に各コードに対する処理を行う（ステップＳ３３）。
【００３６】
次に、各コードに対して行う処理の詳細な手順について図６を用いて説明する。ステップＳ１０の判定は上述の第１の実施の形態と同様である。ステップＳ１０の判定結果が肯定的である場合、プログラム変換装置５０´は、メモリ領域の共有が発生するか否かを判定する（ステップＳ４０）。メモリ領域の共有が発生しない場合には（ステップＳ４０：ＮＯ）、プログラム変換装置５０´は、ステップＳ１１では、上述の第１の実施の形態と同様に、処理対象の関数においてそのコードの直前にメモリ領域を確保するコードを追加する。メモリ領域の共有が発生する場合には（ステップＳ４０：ＹＥＳ）、プログラム変換装置５０´は、ステップＳ４１では、メモリ領域を確保する代わりに、当該メモリ領域に対応するカウンタの値を「１」増加させるインクリメントコードを追加する。
【００３７】
ステップＳ１２〜Ｓ１４，Ｓ１６，Ｓ１７，Ｓ２０の処理については上述の第１の実施の形態と同様である。尚ここでは、ステップＳ１４の後に、ステップＳ１５の処理をプログラム変換装置５０´は行わない。プログラム変換装置５０´は、外部のサブプログラムから解放可否情報が渡される場合、メモリ領域の解放の可否をこの時点で判定することはできないからである。そして、以下に説明するステップＳ１７´，Ｓ１８´の処理で、プログラム変換装置５０´は、メモリ領域の解放の可否に応じてコードの追加や変更を適宜行うことになる。
【００３８】
ステップＳ１７´では、プログラム変換装置５０´は、対象のメモリ領域の解放が可であることを示す解放可否情報が当該メモリ領域と対応付けられて記憶装置に記憶されている場合には、上述の第１の実施の形態と同様にして、解放可否情報を追加して当該他のサブプログラムを呼び出すように処理対象のコードを変更する。また、プログラム変換装置５０´は、対象のメモリ領域についての解放可否情報が、処理対象のサブプログラムを呼び出しているサブプログラム（呼び出し元）から渡される場合、当該解放可否情報に応じて解放可否情報を追加して当該他のサブプログラムを呼び出すように処理対象のコードを変更する。
【００３９】
ステップＳ１８´では、プログラム変換装置５０´は、対象のメモリ領域の解放が可であることを示す解放可否情報が当該メモリ領域と対応付けられて記憶装置に記憶されている場合には、上述の第１の実施の形態と同様にして、解放コードを処理対象のコードの直後に追加する。また、プログラム変換装置５０´は、対象のメモリ領域についての解放可否情報が、処理対象のサブプログラムを呼び出しているサブプログラム（呼び出し元）から渡される場合、当該解放可否情報に応じてメモリ領域を解放するコードであって、カウンタの値を「１」減少させるデクリメントコードと、当該値が「０」である場合にのみメモリ領域を解放する条件解放コードとを処理対象のコードの直後に追加する。
【００４０】
次に、具体的なプログラムの例を用いて説明する。図７〜９はメモリ領域に確保するint型の変数を用いた各プログラムについて、変換例を模式的に示す図である。図７に示されるように、変換結果を分かりやすくするため、変換するにあたってメモリ領域に固有のカウンタを有するために、プログラム変換装置５０´は、「auto_ptr_t」というテンプレートクラスＴＹ１の追加を行っている。このテンプレートクラスは従来のメモリ領域を使用するためのメンバー変数ＴＹ３と、何個の変数からメモリ領域が今後参照されるかを示すカウンタＴＹ２とを有し、カウンタＴＹ２の値を「１」減少させてその値が「０」になった時点でメモリ領域を解放し、カウンタの値を「１」増加させる関数ＴＹ４を有する。尚、テンプレートクラスではなく、型毎にクラスを生成しても、処理内容をコードに直接埋め込んでも良い。
【００４１】
図７は、関数「f」について記述されたサブプログラムが１つ示されている例である。このサブプログラムでは、呼び出し元のサブプログラムから引き継ぐメモリ領域がないため、メモリ領域の解放の可否を示す解放可否情報も受け取らない。このため、プログラム変換装置５０´は、ステップＳ３２の処理を行う必要がなく、サブプログラムである関数の入力は変わらない。次に、「*a=1;」というコードｃｄ５が、外部で定義されていないメモリ領域を使用する最初のコードとなる。ステップＳ１０の判定結果が肯定的となりこのメモリ領域については共有が発生していないため、ステップＳ４０の判定結果が否定的となる。このため、ステップＳ１１では、プログラム変換装置５０´は、当該コードｃｄ５の直前にメモリ領域を確保するコードとして「a=new auto_ptr_t<int>;」というコードｃｄ６を追加する。この時に、プログラム変換装置５０´は、変数「a」についてメモリ領域の解放を可であることを示す解放可否情報を記憶装置に記憶させる。
【００４２】
次に、「b=*a+2;」というコードｃｄ７が、解放が可であることを示す解放可否情報が記憶装置に対応付けられて記憶されているメモリ領域を使用する最後のコードとなる。このため、ステップＳ１４の判定結果が肯定的となるが、このコードｃｄ７はサブプログラム呼び出しではないため、ステップＳ１６の判定結果は否定的となる。このため、ステップＳ１９´では、プログラム変換装置５０´は、当該コードｃｄ７の直後に、デクリメントコード及び条件解放コードとして、上述のテンプレートクラス「auto_ptr_t」を用いた「a->dec_and_check();」というコードｃｄ８を追加する。最後にプログラム変換装置５０´は、コードｃｄ５，ｃｄ６の変数「*a」を、メモリ領域とカウンタの値を記憶する領域とを含む領域の中から当該メモリ領域を指すコードに置き換える。即ち、プログラム変換装置５０´は、コードｃｄ５，ｃｄ６の変数「*a」について、「a->instance」に変更して、メモリ領域を正しく指し示すようにして、コードｃｄ５´，ｃｄ６´に各々変更する。
【００４３】
図８は、関数「f」について記述されたサブプログラムと、関数「main」について記述されたサブプログラムとが示されている例である。関数「main」について記述されたサブプログラムは、図７に示される関数「f」について記述されたサブプログラムとほぼ同様である。このため、図８においても、図７のコードｃｄ５の直前に追加された「a=new auto_ptr_t<int>;」というコードが追加され、変数「a」についてメモリ領域の解放を可であることを示す解放可否情報が記憶装置に記憶される。但し、「b=f(a);」というコードｃｄ１０については、プログラム変換装置５０´は、メモリ領域を使用する最後のコードではないサブプログラム呼び出しであるために、ステップＳ１４の判定結果が否定的及びステップＳ１７の判定結果が肯定的となる。このため、ステップＳ２０では、プログラム変換装置５０´は、当該コードｃｄ１０に対してメモリ領域の解放が不可であることを示す解放可否情報（ここでは、「false」である）を追加して、「b=f(false,a);」というコードｃｄ１０´に変更する。このコードｃｄ１０´により、解放可否情報が呼び出し先のサブプログラムに渡されることになる。
【００４４】
「b+=f(a);」というコードｃｄ１１については、メモリ領域の解放を可であることを示す解放可否情報が記憶装置に対応付けられて記憶されるメモリ領域を使用する最後のコードでありサブプログラム呼び出しである。従って、ステップＳ１４の判定結果が肯定的及びステップＳ１６の判定結果が肯定的となる。このため、ステップＳ１８´では、プログラム変換装置５０´は、当該コードｃｄ１１に対してメモリ領域の解放が可であることを示す解放可否情報（ここでは、「true」である）を追加して、「b+=f(true,a);」というコードｃｄ１１´に変更する。このコードｃｄ１１´により、解放可否情報が呼び出し先のサブプログラムに渡されることになる。
【００４５】
また、関数「f」について記述されたサブプログラムについては、入力として、呼び出し元のメモリ領域を使用する。このため、プログラム変換装置５０´は、ステップＳ３２では、関数の外部から入力されるメモリ領域を指す変数「*c」について、当該メモリ領域の解放の可否を示す解放可否情報「c_final」を追加し、「int f(int *c)」というコードｃｄ１２を「int f(bool c_final,int *c)」というコードｃｄ１２´に変更することにより、関数の入力の定義を変更する。「d+= *c + 3;」というコードｃｄ１４は、メモリ領域を使用する最後のコードでありサブプログラム呼び出しではないため、ステップＳ１４の判定結果が肯定的及びステップＳ１６の判定結果が否定的となる。また、ここでは、メモリ領域の可否は、処理対象のサブプログラムを呼び出しているサブプログラム（呼び出し元）から渡される解放可否情報によって示されるため、ここでは判定することができない。このため、ステップＳ１９´では、プログラム変換装置５０´は、このコードｃｄ１４の直後に、デクリメントコードと共に、呼び出し元から渡される解放可否情報に応じてメモリ領域を解放する条件解放コードを追加することになる。ここでは、プログラム変換装置５０´は、デクリメントコード及び条件解放コードとして、メモリ領域の解放の可否を条件とするif文により表される「if(c_final)c->dec_and_check();」というコードｃｄ１５を追加する。最後にプログラム変換装置５０´は、コードｃｄ１３，ｃｄ１４の変数「* c」を、メモリ領域とカウンタの値を記憶する領域とを含む領域の中から当該メモリ領域を指すコードに置き換える。即ち、プログラム変換装置５０´は、コードｃｄ１３，ｃｄ１４の変数「* c」について、「c->instance」に変更して、メモリ領域を正しく指し示すようにして、コードｃｄ１３´，ｃｄ１４´に各々変更する。
【００４６】
図９は、関数「f」について記述されたサブプログラムと、関数「g」について記述されたサブプログラムとが示されている例である。関数「f」について記述されたサブプログラムは、図８に示される関数「main」について記述されたサブプログラムとほぼ同様である。但し、「c=g(a);」というコードｃｄ２０については、メモリ領域を使用する最後のコードでありサブプログラム呼び出しであるため、ステップＳ１４の判定結果が肯定的及びステップＳ１６の判定結果が肯定的となる。また、ここでは、当該メモリ領域の解放の可否は、当該サブプログラムを呼び出しているサブプログラムからサブプログラム（呼び出し元）から渡される解放可否情報によって示されるため、ここでは判定することができない。このため、ステップＳ１８´では、プログラム変換装置５０´は、呼び出し元から渡される解放可否情報に応じてメモリ領域の解放が可であることを示す解放可否情報を追加してコードｃｄ２０を変更する。具体的には、プログラム変換装置５０´は、メモリ領域の解放の可否を条件とするif文によって表される
「if(a_final)
c=g(true,a);
else
c=g(false,a);」
というコードにコードｃｄ２０を変更することになる。このコードは、「c=g(a_final,a)」というコードと等しいため、プログラム変換装置５０´は、最終的に、コードｃｄ２０を「c=g(a_final,a);」というコードｃｄ２０´に変更する。このコード２０´により、解放可否情報が呼び出し先のサブプログラムに渡されることになる。
【００４７】
また、関数「g」について記述されたサブプログラムにおいては、「b=a;」というコードｃｄ２１が、共有の発生する対象のメモリ領域を新たな変数に対応付けるコードとなっている。このため、ステップＳ４１では、プログラム変換装置５０´は、このコードｃｄ２１の直前でカウンタを「１」増加させるインクリメントコードとして「a->inc();」というコードｃｄ２２を追加する。
【００４８】
以上のような構成によれば、C++言語において、入力されたプログラムを、必要な期間のみメモリ領域を確保するようなメモリ領域の管理を行うためのコードが追加されたプログラムに変換することができる。
【００４９】
[変形例]
なお、本発明は前記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、前記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。また、以下に例示するような種々の変形が可能である。
【００５０】
上述した各実施の形態において、プログラム変換装置５０，プログラム変換装置５０´で各々実行される各種プログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成しても良い。また当該各種プログラムを、インストール可能な形式又は実行可能な形式のファイルでＣＤ−ＲＯＭ、フレキシブルディスク（ＦＤ）、ＣＤ−Ｒ、ＤＶＤ（Digital Versatile Disk）等のコンピュータで読み取り可能な記録媒体に記録して提供するように構成しても良い。
【００５１】
上述した第２の実施の形態において、メモリ領域解放可否情報生成部６３は、カウンタの値を格納する領域を、例えば、当該カウンタの対象のメモリ領域の直前又は直後に確保してインクリメントコードやデクリメントコードを追加するようにしても良い。
【図面の簡単な説明】
【００５２】
【図１】第１の実施の形態にかかるプログラム変換装置５０の機能的構成を例示する図である。
【図２】同実施の形態にかかるプログラム変換装置５０の行うプログラム変換処理の手順を示すフローチャートである。
【図３】同実施の形態にかかる各コードに対して行う処理の詳細な手順を示すフローチャートである。
【図４】第２の実施の形態にかかるプログラム変換装置５０´の機能的構成を示す図である。
【図５】同実施の形態にかかるプログラム変換装置５０´の行うプログラム変換処理の手順を示すフローチャートである。
【図６】同実施の形態にかかる各コードに対して行う処理の詳細な手順を示すフローチャートである。
【図７】同実施の形態にかかるメモリ領域に確保するint型の変数を用いた各プログラムについて、変換例を模式的に示す図である。
【図８】同実施の形態にかかるメモリ領域に確保するint型の変数を用いた各プログラムについて、変換例を模式的に示す図である。
【図９】同実施の形態にかかるメモリ領域に確保するint型の変数を用いた各プログラムについて、変換例を模式的に示す図である。
【符号の説明】
【００５３】
５０，５０´  プログラム変換装置
５１  サブプログラム解析部
５２  サブプログラム変更部
５３  サブプログラム抽出部
５４  使用メモリ領域抽出部
５５  コード解析部
５６  メモリ解放可否判定部
５７  サブプログラム呼び出しコード変更部
５８  メモリ領域確保コード追加部
５９  メモリ領域解放コード追加部
６０  サブプログラム再構成部
６１  サブプログラム入出力変更部
６２  メモリ領域解放可否情報入力付加部
６３  メモリ領域解放可否情報生成部
【図１】
2010118025.tif 000003
【図２】
2010118025.tif 000004
【図３】
2010118025.tif 000005
【図４】
2010118025.tif 000006
【図５】
2010118025.tif 000007
【図６】
2010118025.tif 000008
【図７】
2010118025.tif 000009
【図８】
2010118025.tif 000010
【図９】
2010118025.tif 000011