"プロセッサに読み込まれたプログラム中の関数間の呼び出し関係を、プロセッサが抽出する工程と、前記関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから2度目の呼出しまでの間に経由した関数群を再帰呼出し部とする再帰呼出し抽出工程と、前記再帰呼出し部を表す前記プログラムに含まれるコードを、供給される電圧状態を独立して切替可能なメモリバンクに、前記プロセッサが、割り当てるコード割当工程と、を備えることを特徴とするプログラムに含まれるコードをメモリ領域に割り当てる割当方法。前記コード割当工程において、前記プロセッサは、前記再帰呼出し部を表す前記プログラムに含まれるコードを、一体として、一つの前記メモリバンクに割り当てることを特徴とする、プログラムに含まれるコードをメモリ領域に割り当てる請求項1記載の割当方法。前記コード割当工程において、前記プロセッサは、前記再帰呼出し部を表す前記プログラムに含まれるコードを、一体として、アドレスが連続する2以上の前記メモリバンクに割り当てることを特徴とする、プログラムに含まれるコードをメモリ領域に割り当てる請求項1記載の割当方法。関数を表すコードを含むプログラムを読込むことによって、動作可能なプロセッサと、前記プロセッサからの制御によって、供給される電圧状態を独立して切替可能なメモリバンクと、を備え、前記プロセッサは前記プロセッサに読み込まれた前記プログラム中の関数間の呼び出し関係を抽出する機能と、前記関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから2度目の呼出しまでの間に経由した関数群を再帰呼出し部とする機能と、前記再帰呼出し部を表す前記プログラムに含まれるコードを、供給される電圧状態を独立して切替可能なメモリバンクに、前記プロセッサが、割り当てる機能と、を有することを特徴とするメモリシステム。前記メモリバンクの電圧状態を、前記プロセッサからの命令を受けて、設定する制御レジスタと、前記制御レジスタからの信号を受けて、前記メモリバンクの電圧状態を制御する電源制御回路と、をさらに備えることを特徴とする請求項4記載のメモリシステム。記憶領域の電力状態の制御により消費電力削減をさせ得る、プログラムコードの記憶領域への割り当て状態を実現する方法及びその方法を実行するメモリシステムを提供することを目的とする。上記を解決するため、本発明の一側面によれば、プロセッサに読み込まれたプログラム中の関数間の呼び出し関係を、プロセッサが抽出する工程と、関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから2度目の呼出しまでの間に経由した関数群を再帰呼出し部とする再帰呼出し抽出工程と、再帰呼出し部を表すプログラムに含まれるコードを、供給される電圧状態を独立して切替可能なメモリバンクに、プロセッサが、割り当てるコード割当工程と、を備えることを特徴とするプログラムに含まれるコードをメモリ領域に割り当てる割当方法を提供する。本発明によれば、プログラムに含まれるコードを記憶領域に割り当てる方法であって、その方法により実現された、記憶領域におけるコードの割当状態に応じて、記憶領域を構成するデバイスの電力状態を制御した場合、消費電力削減を実現させ得る方法及びその方法を実行するメモリシステムを提供することができる。本発明は、以下に説明する実施例に対し、当業者が想到可能な、設計上の変更が加えられたもの、及び、実施例に現れた構成要素の組み換えが行われたものも含む。また、本発明は、その構成要素が同一の作用効果を及ぼす他の構成要素へ置き換えられたもの等も含み、以下の実施例に限定されない。図1は、実施例1のメモリシステム50を示す図である。メモリシステム50はメモリユニット10、プロセッサ20、制御レジスタ群30、バス40、電源線45、電源制御装置46を含む。特願2009-9065、特願2009-266575、特願2010-9269参照プロセッサ20はメモリコントローラを内蔵し、メモリユニット10に含まれるメモリバンク11、12、13、14、15へのデータ又は命令コードの書込又は読出をコントロールする。さらに、メモリバンク11、12、13、14、15の電源制御を行うための電源制御信号を制御レジスタ群30に出力する。制御レジスタ群30は、CPUからの電源制御信号に応じて、メモリバンク11、12、13、14、15の電源制御状態を記憶するレジスタ群である。そこで、例えば、制御レジスタ群30は、8個のレジスタからなり、00000101とデジットが設定されると、メモリバンク11とメモリバンク13の電源がオンする。電源制御装置46は、電源線45と各メモリバンク11、12、13、14、15間に配置され、各メモリバンク11、12、13、14、15の電源状態を、制御レジスタ群30からの信号に応じて制御する。なお、電源状態とは、電源線45から各メモリバンク11、12、13、14、15への接続を切断している電源切断状態、電源線45からの電源を、電圧を低下させて各メモリバンク11、12、13、14、15へ供給する省電力供給状態、電源線45からの電源を電圧を保持しながら各メモリバンク11、12、13、14、15へ供給する通常電力供給状態を含む。メモリユニット10は命令コード用メモリ16とデータ用メモリ17を含む。命令コード用メモリ16は、メモリバンク11、12、13、14を含む。また、データ用メモリ17は複数のメモリバンク15を含む。各メモリバンク11、12、13、14、15の電源状態は電源制御装置46によって制御されることはいうまでもない。なお、電源切断状態においては、各メモリバンク11、12、13、14、15は、データの保持もできないし、読出及び書込もできない。省電力供給状態においては、各メモリバンク11、12、13、14、15は、データ保持はできるが、読出及び書込を正常に行えない。通常電力供給状態においては、各メモリバンク11、12、13、14、15は、データ保持もできるし、読出及び書込を正常に行える。なお、メモリバンク11はメモリユニット10において、0x0000番地から0x0fff番地までの領域を占める。メモリバンク12はメモリユニット10において、0x1000番地から0x1fff番地までの領域を占める。メモリバンク13はメモリユニット10において、0x2000番地から0x2fff番地までの領域を占める。メモリバンク14はメモリユニット10において、0x3000番地から0x3fff番地までの領域を占める。メモリバンク15はデータ用メモリ17において、0x4000番地以降のメモリ領域を占める。従って、読出及び書込動作が発生しないときに、各メモリバンク11、12、13、14、15を省電力供給状態とすることができる。そうすると、少数のメモリバンクに読出及び書込を集中させるほど、メモリシステム50全体の電力を大きく削減することができる。図2はソースプログラムの例及びソースプログラムの命令コードに対するメモリ領域の割り当ての例を示す図である。図2によれば、メモリバンク11にメインプログラムが割り当てられ、メモリバンク12に関数func_A1を特定するプログラムが割り当てられ、メモリバンク13に関数func_A2を特定するプログラムが割り当てられている。メインプログラムにおける、メモリバンク12Sleep解除コード片は、メモリバンク12を、省電力供給状態から通常電力供給状態へ移行させる命令コード片である。次いで、callFunc_A1はメモリバンクに割り当てられているFunc_A1という関数を呼び出す命令コードである。次いで、メモリバンク12Sleepコード片は、メモリバンク12を、通常電力供給状態から省電力供給状態へ移行させる命令コード片である。メインプログラムにおける、メモリバンク13Sleep解除コード片は、メモリバンク13を、省電力供給状態から通常電力供給状態へ移行させる命令コード片である。次いで、callFunc_A2はメモリバンクに割り当てられているFunc_A2という関数を呼び出す命令コードである。次いで、メモリバンク13Sleepコード片は、メモリバンク13を、通常電力供給状態から省電力供給状態へ移行させる命令コード片である。このように、メインプログラム中に関数を呼び出す命令コードがあると、関数を表す命令コードが割り当てられているメモリバンクは省電力供給状態から通常電力供給状態へ移行され、関数結果をメインプログラムに引き渡すと、そのメモリバンクは通常電力供給状態から省電力供給状態へ戻される。図3は、プログラムに含まれるコードに記憶領域を割り当てる割当方法を示す。なお、その割当方法を実行することによって、記憶領域の電力状態の制御により消費電力を削減させ得る、記憶領域の割り当て状態を実現することができる。コードを記憶領域に割り当てる割当方法は、図1のプロセッサ20によって実行され、呼出し関係抽出工程S31、再帰呼出抽出工程S32A、再帰呼出処理済み静的コールグラフ作成工程S32B、再帰縮退工程S33、及び、メモリ割当工程S34を含む。呼出し関係抽出工程S31はプログラム62のソースコード、アセンブリまたはオブジェクトを走査し、静的コールグラフを作成するステップである。静的コールグラフとは、ソースコード、アセンブリコード、またはオブジェクトコード上において、親関数又は関数間の呼出し関係を表現するものである。従って、静的コールグラフを作成するに先立ち、プロセッサ20は、読み込まれたプログラム中の関数間の呼び出し関係を抽出することとなる。静的コールグラフについて、図4を用いてさらに説明する。再帰呼出抽出工程S32Aは呼出し関係抽出工程S31の呼出し関係に基づいて、親関数又は関数間の再帰呼出し部を抽出するステップである。再帰呼出し部を抽出した場合、再帰呼出し部の縮退を行うため再帰縮退工程S33に進む。一方、再帰縮退工程S33から戻ってきたときに、さらに再帰呼出し部を抽出しないときには、再帰読出処理済み静的コールグラフ作成工程S32Bに進む。ここで、再帰呼出しとは、呼出しに応じた関数又はその関数からさらに呼び出しを受けた関数を含む、呼び出し連鎖中の関数が、呼出し関係の元となった関数を呼び出すことをいう。また、再帰呼出し部を抽出するとは、関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから2度目の呼出しまでの間に経由した関数群を再帰呼出し部とするとすることである。再帰呼出し部の抽出について、図5、6、7を用いてさらに説明する。再帰呼出処理済み静的コールグラフ作成工程S32B:再帰呼出抽出工程S32A及び再帰縮退工程S33を繰り返し行い、すべてのソースコードに対して、再帰呼出部の抽出と、再帰呼出部に対する再帰縮退が終了した時に、再帰呼出処理済み静的コールグラフ作成工程S32Bにおいて、すべてのソースコードに対する、再帰呼出処理済み静的コールグラフ63、再帰呼出済み関数サイズ情報64、関数縮退情報65が、作成される。再帰縮退工程S33は再帰呼出抽出工程S32Aにおいて、再帰呼出し部を抽出した場合、再帰呼出し部をまとめる再帰縮退を行う。再帰縮退を行った結果、ひとまとまりとなった再帰呼出し部は一つの関数と見立てられる。一つと見立てられた関数の記憶サイズは、関数サイズ情報61から得られる、元の関数サイズに応じて、計算によって求められる。再帰縮退について、図8、図9、図10を用いてさらに、説明する。再帰読出処理済み静的コールグラフ作成工程S32Bはすべての再帰読出部の検出と、その再帰縮退が終了した場合、与えられたソースコード全体について、再帰読出処理済み後の静的コールグラフ、再帰呼出し処理済み後の関数サイズ情報、関数縮退情報を作成する。メモリ割当工程S34は一つと見立てられた関数を表すプログラム中のコードについて、一体としてメモリ領域の同一のメモリバンクに割り振る工程である。すなわち、一つと見立てられた関数は、同一メモリバンクに格納される。ここで、一つと見立てられた関数が割り振られたメモリバンクは、図1に示すメモリバンク11、12、13、14、15のように、電力供給状態が切替可能な、メモリバンクである。図4は呼出関係抽出ステップ工程S31に関する、フローチャート、静的コールグラフ、及び、呼出し関係抽出後の出力データ表を図示する。図4の静的コールグラフは、例として与えられた、ソースコード上での関数の呼出し関係を表現している。すなわち、図4の静的コールグラフにおいては、メイン関数f_MAINから子関数f_A2を経由して子関数f_B2を呼び出す経路と、メイン関数f_MAINから子関数f_A3を経由して子関数f_B2を呼び出す経路と、メイン関数f_MAINから子関数f_A3を経由して子関数f_B3を呼び出す経路と、子関数f_B2から子関数f_B3を呼び出す経路と、子関数f_B2から子関数f_A3を呼び出す経路と、が記載されている。図4の呼出し関係抽出工程S31の出力データ表は、図4の静的コールグラフに対応する出力データ表である。図4の出力データ表の第1列は呼出し元の関数が記載され、第2列は呼出し先の関数が記載されている。図4の出力データ表によれば、メイン関数f_MAINは子関数f_A2と、子関数f_A3を呼び出す。子関数f_A2及び子関数f_A3は子関数f_B2を呼び出す。子関数f_A3及び子関数f_B2は子関数f_B3を呼び出す。子関数f_B2は子関数f_A3を呼び出す。図4のフローチャートによれば、呼出関係抽出工程S31は、関数開始記述抽出工程S311と、関数呼出し記述検出および出力データ表への追加工程S312を行うステップとを含む。関数開始記述抽出工程S311は与えられたソースコードより関数の開始となる記述を抽出し、呼出し元の関数名を得る工程である。関数呼出し記述検出および出力表への追加工程S312は、与えられたソースコード中の関数呼出し記述を検出し、呼出し元関数と呼出し先関数を表形式で追加して行く工程である。例えば、図4の出力データ表に示すデータの作成が行われる。図5は再帰呼出抽出工程S32Aを説明するメインフローチャート及びサブルーチンS321を説明するサブルーチンフローチャートを示す。再帰呼出抽出工程S32Aを説明するメインフローチャートは初期化工程S3201、サブルーチン実行工程S3202、フラッグ判定工程S3203を含む。初期化工程S3201:再帰呼出抽出工程S32Aにおいて使用する変数visitedをすべてfalseに設定する。また、データPATHを空にする。さらに、変数flagをfalseに設定する。サブルーチン実行工程S3202:サブルーチンS321中の対象関数を示す変数fにメイン関数f_MAINを設定して、サブルーチンS321を実行する工程である。フラッグ判定工程S3203:変数flagの真偽をチェックし、真であるときには初期化工程S3201に戻る。また、偽であるときには、再帰呼出抽出S32Aを終了する。ここで、変数flagが真であるときには、サブルーチンS321を行ったことにより再帰呼出部が見つかったことを意味する。また、再帰縮退工程S33を行うことによって、ここで見つけた再帰呼出部は一つの関数と見立てられたことを意味する。サブルーチンS321を説明するサブルーチンフローチャートは、PATH追加工程S32101、サブルーチン実行工程S32102、PATH削除工程S32103を含む。PATH追加工程S32101はメイン関数から呼び出されるすべての子関数について、メイン関数に引き続いてPATHの変数に設定する工程である。なお、親関数から呼び出される子関数が複数あった場合、関数の呼出し連鎖からなるPATHが複数存在することになる。そこで、サブルーチン実行工程S32102に進み、そのPATHそれぞれにおいて、サブルーチンS322を行うことにより再帰呼出部を検出し、その再帰呼出部を一つと見立てる関数とする。その後、PATH削除工程S32103に進む。PATH削除工程S32103はPATHの変数から末尾の関数を削除する工程である。PATH削除工程S32103が終了した後、メインフローチャートへ戻る。図6はサブルーチンS322及びサブルーチンS322と再帰縮退工程S33との関係を示すフローチャートである。サブルーチンS322のフローチャートは、変数flagの真偽をチェックする工程S32201、PATHに加えた関数に対して、呼出しが行われたか否かを示す変数visitedの真偽をチェックする工程S32202、変数visited設定工程S32203、サブルーチン実行工程S32204、変数visited設定工程S32205、再帰呼出部設定工程S32206、再帰縮退工程S33を行う工程32207、変数flag設定工程S32208を含む。変数flagの真偽をチェックする工程S32201:変数flagが真のときにはサブルーチンS322の終了ステージに進む。変数flagが偽のときには呼出しが行われたか否かを示す変数visitedの真偽をチェックする工程S32202へ進む。変数visitedの真偽をチェックする工程S32202:変数visitedが真のときには再帰呼出部設定工程S32206へ進む。変数visitedが偽のときには変数visited設定工程S32203へ進む。変数visited設定工程S32203:呼出しが行われた関数の変数visitedを真に設定する。サブルーチン実行工程S32204:呼出しが行われた関数をサブルーチンS321中の対象関数を示す変数fに設定し、サブルーチンS321を行う。変数visited設定工程S32205:呼出しを行った関数に対する変数visitedを偽とする工程である。再帰呼出部設定工程S32206:サブルーチンS322を実行する際に、PATHの変数に追加されていた関数の内、変数visitedが真となった関数とそれ以降の関数を再帰呼出部とする工程である。再帰縮退工程S33を行う工程32207:再帰呼出部設定工程S32206において再帰呼出部とされた関数連鎖について再帰縮退工程S33を行う工程である。変数flag設定工程S32208:呼出しが行われた関数の変数visitedを真とする工程である。図7は再帰呼出抽出工程S32Aにおける、再帰読出部の検出について説明する図である。図7によれば、再帰読出部を検出するため、ステージ1から5までがある。ステージ1:ステージ1は図5、図6に示すフローチャートにおけるサブルーチン実行工程S32102の1度目の開始時点を表すステージである。この状態に至るまでに、初期化工程S3201、サブルーチン実行工程S3202およびPATH追加工程S32101を実行している。PATH追加工程S32101にて、PATHの末尾に追加する関数は、サブルーチン実行工程S3202にて関数fに設定した、親関数f_MAINであるため、PATHの関数は、親関数f_MAINのみで構成されている。ここからまず、関数f_MAINの呼出し先の関数であるf_A2およびf_A3について、サブルーチンS322を開始する。以下では、先に関数f_A2について、サブルーチンS322を開始した場合を示す。ここで、関数f_A2に対する変数flagと変数visitedは偽である。初期化工程S3201を行ったときから、今回の呼出しが、最初の子関数f_A2の呼び出し、及び、訪問となるからである。そうすると、変数flagの真偽をチェックする工程S32201と、変数visitedの真偽をチェックする工程S32202を経て、変数visited設定工程S32203を行う。その結果、子関数f_A2の変数visitedは真に設定された後、サブルーチン実行工程S32204へ進む。サブルーチン実行工程S32204は、関数fを子関数f_A2と設定した状態で、サブルーチンS321の実行を開始する。そして、PATH追加工程S32101にて、サブルーチン実行工程S32204により関数fに設定した、子関数f_A2をPATHの末尾に追加する。その結果、PATHの関数は、親関数f_MAINと、子関数f_A2とから構成される。なお、この子関数f_A2はステージ1にて処理対象とした関数である。ステージ2:ステージ2は図5、図6に示すフローチャートにおけるサブルーチン実行工程S32102の2度目の開始時点を表すステージである。この状態から、関数f_A2の呼び出し先関数f_B2について、サブルーチンS322を開始する。ここで、関数f_B2に対する変数flagと変数visitedは偽である。初期化工程S3201を行ったときから、今回の呼出しが、最初の子関数f_B2の呼び出し、及び、訪問となるからである。そうすると、変数flagの真偽をチェックする工程S32201と、変数visitedの真偽をチェックする工程S32202を経て、変数visited設定工程S32203を行う。その結果、子関数f_B2の変数visitedは真に設定された後、サブルーチン実行工程S32204へ進む。サブルーチン実行工程S32204により、関数fを子関数f_B2と設定した状態で、さらにサブルーチンS321の実行を開始する。PATH追加工程S3210では、サブルーチン実行工程S32204により関数fに設定した、子関数f_B2をPATHの末尾に追加し、PATHは親関数f_MAIN、親関数f_MAINから呼び出された子関数f_A2、子関数f_A2から呼び出された子関数f_B2となる。ステージ3:ステージ3は図5、図6の示すフローチャートにおけるサブルーチン実行工程S32102の3度目の開始時点を表すステージである。ここから、子関数f_B2の呼び出し先関数である子関数f_A3と子関数f_B3について、サブルーチンS322を開始する。ここでは、先に子関数f_A3について、サブルーチンS322を開始した場合を示している。ここで、関数f_A3に対する変数flagと変数visitedは偽である。初期化工程S3201を行ったときから、今回の呼出しが、最初の子関数f_A3の呼び出し、及び、訪問となるからである。そうすると、変数flagの真偽をチェックする工程S32201と、変数visitedの真偽をチェックする工程S32202を経て、変数visited設定工程S32203を行う。その結果、子関数f_A3の変数visitedは真に設定された後、サブルーチン実行工程S32204へ進む。サブルーチン実行工程S32204により、関数fを子関数f_A3と設定した状態で、さらにサブルーチンS321の実行を開始する。PATH追加工程S3210では、サブルーチン実行工程S32204により関数fに設定した、子関数f_A3をPATHの末尾に追加する。すなわち、PATHは、親関数f_MAIN、親関数f_MAINから呼び出された子関数f_A2、子関数f_A2から呼び出された子関数f_B2、子関数f_B2から呼び出された子関数f_A3である。ステージ4:ステージ4は図5、図6の示すフローチャートにおけるサブルーチン実行工程S32102の4度目の開始時点を表すステージである。この状態から、関数f_A3の呼び出し先関数である子関数f_B2と子関数f_B3について、サブルーチンS322を開始する。ここでは、先に子関数f_B2について、サブルーチンS322を開始する場合を示す。ステージ5:ステージ5は図5、図6の示すフローチャートにおける呼出しが行われたか否かを示す変数visitedの真偽をチェックする工程S32202のステージ4直後の開始時点を表すステージである。ここで、子関数f_B2に対する変数visitedは真であり、変数flagは偽である。ステージ5の前ステージで、子関数f_B2に対して変数visited設定工程S32203を行い、子関数f_B2の変数visitedを真に設定したからである。その結果、再帰呼出部設定工程S32206へ進み、子関数f_B2と子関数f_A3とを再帰呼出部として抽出し、CYCLE=f_B2,f_A3を得る。次いで、再帰縮退工程S33を行うステップ32207へ進み、CYCLE=f_B2,f_A3を引数に、再帰縮退工程S33を行うことにより、子関数f_B2と子関数f_A3とを一つの関数と見立てた静的コールグラフを得る。次いで、変数flag設定工程S32208に進み、変数flagを真に設定する。そして、子関数f_A3の呼び出し先としての子関数f_B2についてのサブルーチンS322を終了する。すると、ステージ4のサブルーチンS322を開始したところに戻ってくる。続いて、子関数f_A3の呼び出し先関数としての子関数f_B3について、サブルーチンS322を開始するが、先ほど変数flag設定工程S32208にて変数flagを真と設定したため、変数flagの真偽をチェックする工程S32201にて、サブルーチンS322を終了する。以降、初期化工程S3201を再び実行し、変数flagを偽に戻さない限り、サブルーチンS322を新たに実行する場合は、何もしないサブルーチンとなる。続いて、PATH削除工程S32103に進む。PATH削除工程S32103では、これまでのPATHは、親関数f_MAIN、親関数f_MAINから呼び出された子関数f_A2、子関数f_A2から呼び出された子関数f_B2、子関数f_B2から呼び出された子関数f_A3であるところ、PATHの末尾の子関数f_A3を削除して、PATHを親関数f_MAIN、親関数f_MAINから呼び出された子関数f_A2、子関数f_A2から呼び出された子関数f_B2とする。そして、ステージ4におけるサブルーチンS321を終了すると、変数visited設定工程S32205により、子関数f_A3に関する変数visitedは偽に戻され、サブルーチンS322は終了する。すると、ステージ3においてサブルーチンS322を開始したサブルーチン実行工程S32102に戻ってくる。サブルーチン実行工程S32102では子関数f_A3から呼び出される、もうひとつの子関数f_B2についても、サブルーチンS322を新たに実行するが、変数flagを真であるため、何もせず終了する。続いて、PATH削除工程S32103にて、これまでのPATHは、親関数f_MAIN、親関数f_MAINから呼び出された子関数f_A2、子関数f_A2から呼び出された子関数f_B2であるところ、PATHの末尾の子関数f_B2を削除して、PATHを親関数f_MAIN、親関数f_MAINから呼び出された子関数f_A2とし、ステージ3におけるサブルーチンS321を終了する。そして、ステージ3におけるサブルーチンS321を終了すると、変数visited設定工程S32205により、子関数f_B2に関する変数visitedは偽に戻され、サブルーチンS322は終了する。すると、ステージ2においてサブルーチンS322を開始したサブルーチン実行工程S32102に戻ってくる。サブルーチン実行工程S32102では、子関数f_B2以外に子関数f_A2から呼び出される子関数が存在しないため、PATH削除工程S32103に進む。PATH削除工程S32103では、これまでのPATHは、親関数f_MAIN、親関数f_MAINから呼び出された子関数f_A2であるところ、PATHの末尾の子関数f_A2を削除して、PATHを親関数f_MAINとし、ステージ2におけるサブルーチンS321を終了する。そして、ステージ2におけるサブルーチンS321を終了すると、変数visited設定工程S32205により、子関数f_A2に関する変数visitedは偽に戻され、サブルーチンS322は終了し、ステージ2においてサブルーチンS322を開始したサブルーチン実行工程S32102に戻ってくる。サブルーチン実行工程S32102では子関数f_MAINから呼び出される、もうひとつの子関数f_A3についても、サブルーチンS322を新たに実行するが、変数flagを真であるため、何もせず終了する。そして、PATH削除工程S32103では、これまでのPATHは、親関数f_MAINであるところ、PATHの末尾の子関数f_MAINを削除して、PATHを空とし、ステージ1におけるサブルーチンS321を終了する。そして、ステージ1におけるサブルーチンS321を終了すると、フラッグ判定工程S3203に進む。フラッグ判定工程S3203では、変数flag設定工程S32208にて変数flagが真に設定されているため、初期化工程S3201に戻る。以降、ほかの再帰呼出部を検出するために、再帰縮退工程S33を行うステップ32207にて得た静的コールグラフに対して、再びサブルーチン実行工程S3202以降を実行する。しかし、このコールグラフには再帰呼出部は存在しないため、すべての子関数について、呼出しが行われたか否かを示す変数visitedの真偽をチェックする工程S32202において、すべて変数visited設定工程S32203側へ進み、再帰読出部を検出するための再帰呼出工程S32Aが終了する。図8は、再帰縮退工程S33を説明するための図である。再帰縮退工程S33は、呼出し関係抽出工程S31からの出力と、再帰呼出部設定工程S32206からの出力と、関数サイズ情報3304を受けて、工程S3301、工程S3302、工程S3303を実行するルーチンである。その結果、再帰縮退工程S33は、再帰呼出し処理済み静的コールグラフ3305、関数縮退情報3306、再帰呼出し処理済関数サイズ情報3307を出力する。呼出し関係抽出S31からの出力及び再帰呼出部設定工程S32206からの出力については、図4、図6に対する説明文において説明済みである。関数サイズ情報3304は、親関数f_MAIN及び子関数f_A2、f_A3等を定義するソースコードのデータサイズである。工程S3301は、呼出し関数抽出工程S31からの出力としての静的コールグラフにおいて、検出した再帰呼出しに関係している各関数を同一の関数名に置き換える置換動作を行う。このときの置き換えルールを関数縮退情報3306として記憶する。なお、置き換えルールは、上記置換動作で使用した同一の関数名の情報を含む。そして、工程S3301の終了後、上記の関数縮退情報3306は、工程S3302、工程S3303のために出力される。工程S3301の置き換え処理について、図9において具体例を示す。工程S3302は、関数縮退情報3306を用いて、関数呼出し関係エントリの削除及び統合を行う工程である。すなわち、工程S3301の置換動作の結果、呼出し元の関数と呼出し先の関数が同一となった関数呼出し関係エントリが生じた場合は、その関数呼出し関係は静的コールグラフより削除される。また、呼出し元の関数と呼出し先の関数が複数の関数呼出し関係エントリにおいて同一となり、重複する関数呼出し関係が生じたときは、静的コールグラフにおいて、複数の関数呼出し関係エントリは一つに統合される。その結果、再帰呼出しに関連する関数は、静的コールグラフ上において、一つと見立てた関数として記述される。そして、工程S3302が終了すると、関数呼出し関係エントリの削除及び統合が行われた後の静的コールグラフを再帰呼出し処理済み静的コールグラフ3305が出力される。関数呼出し関係エントリの削除及び統合についても、図9において具体例を示す。工程S3303は、関数縮退情報3306を用いて、再帰呼出し処理済み関数サイズ情報を作成する工程である。すなわち、関数サイズ情報3304に基づいて、一つと見立てた関数の関数サイズを見積もる。そして、工程S3303において、関数サイズ情報3304に一つと見立てた関数の関数サイズを追加して再帰呼出し処理済み関数サイズ情報3307を作成する。工程S3303の処理について、図9において具体例を示す。図9は、再帰縮退工程S33における具体的な処理動作の例を示す。図9は、呼出し関係出力S31の出力、再帰呼出部設定工程S32206の出力、工程S3301の出力、関数サイズ情報3304、及び、再帰縮退工程S33の出力を図示する。呼出し関係出力工程S31の出力において、親関数f_MAINは子関数f_A2、子関数f_A3を呼び出す関係にあり、子関数f_A2は子関数f_B2を呼び出す関係にあり、子関数f_A3は子関数f_B2、子関数f_B3を呼び出す関係にあり、子関数f_B2は子関数f_A3、子関数f_B3を呼び出す関係にあることが記載されている。再帰呼出部設定工程S32203の出力において、子関数f_B2と子関数f_A3は再帰呼出の関係にあることが記載されている。そこで、工程S3301においては、呼出し関係出力工程S31の出力に対して、子関数f_B2と子関数f_A3とを一つと見立てた関数f_B2f_A3に、子関数f_A2及び子関数f_B2が置き換えられる。そして、関数縮退情報3306として、一つと見立てた関数f_B2f_A3は{f_B2,f_A3}である旨が記憶される。再帰縮退工程S33の出力は、工程S3302の出力と、工程S3301の出力の一部と、工程S3303の出力を含む。ここで、工程S3301の出力の一部は、関数縮退情報3306である。工程S3302において、工程S3301の出力の内、関数の呼出し関係について、一つと見立てた関数f_B2f_A3から一つと見立てた関数f_B2f_A3を呼び出す関係が複数あるため、それらの内一つを残して削除する。また、工程S3302において、一つと見立てた関数f_B2f_A3から子関数f_B3を呼び出す関数も複数あるため、一つに統合する。その結果、再帰呼出し処理済み静的コールグラフ3305が形成される。工程S3303において、関数サイズ情報3304に基づいて、再帰呼出し処理済み静的コールグラフ3305中に存在する、親関数、子関数、一つと見立てた関数f_B2f_A3を表しデータのデータサイズを見積もる。その結果、再帰呼出し処理済み関数サイズ情報3307が形成される。図10はメモリ割当工程34を説明するフローチャートである。メモリ割当工程34は親関数配置工程S3401、合計コードサイズ計算工程S3402、電力制御を伴うメモリへの割当工程S3403、アドレス計算工程S3404を含む。なお、メモリ割当工程34を実行するには、再帰縮退工程S33から出力された、bと表示した再帰処理済み静的コールグラフ、cと表示した再帰処理済み関数サイズ情報、dと表示した関数縮退情報を含む情報3407を使用する。また、メモリ割当工程34を実行するには、aと表示したメモリ構造情報3408を使用する。さらに、メモリ割当工程34を実行するには、eと表示した静的コールグラフ、fと表示した関数サイズ情報を含む情報3409を使用する。なお、情報3407及び情報3409はソースコード、オブジェクト、又は、アセンブリ3411から得られる情報である。親関数選択工程S3401において、親関数に関するコードに対し、メモリ領域を割り当てる。メモリ領域を割り当てるにあたり、aと表示したメモリ構造情報、bと表示した再帰処理済み静的コールグラフ、cと表示した再帰処理済み関数サイズ情報を使用する。合計コードサイズの計算工程S3402において、メモリ領域の確保のため、すべての関数に対してコードサイズを計算する。コードサイズを計算するにあたり、cと表示した再帰呼出済み関数サイズ情報を使用する。さらに、一つの関数と見立てた関数に対するコードサイズを把握する。コードサイズの把握にあたり、cと表示した再帰呼出済み関数サイズ情報を使用する。電力制御を伴うメモリへの割当工程S3403において、一つの関数と見立てた関数のコードサイズと、aと表示したメモリ構造情報から、一つの関数と見立てた関数が、単一のメモリバンクに割り当てられるように、メモリ領域を一つの関数と見立てた関数について割り当てる。メモリ領域を一つの関数と見立てた関数について割り当てる際に、aと表示したメモリ構造情報と、合計コードサイズの計算工程S3402の結果を使用する。アドレス計算工程S3404において、すべての関数についてメモリ領域に割当るととこに、メモリ領域と、そのメモリ領域に割り当てた関数についてメモリマップ情報を作成する。なお、メモリ領域に関数を割り当てる際に、図10中のeで示す静的グラフ、fで示す関数サイズ情報を使用する。eで示す静的グラフ、fで示す関数サイズ情報は、呼び出し関係抽出工程S31で求めたものを使用することが望ましい。図11は関数に関するプログラムソースコードの割当状況を示す図である。図11によって、メモリバンク11aからメモリバンク16aまで、メモリバンク11bからメモリバンク16bについて、関数に関するプログラムソースコードの割当状況が示される。図11の上段は、プログラムソースコードに対して、本実施例に係わる記憶領域の割当方法を適用しない場合の割当状況である。なお、図11の上段中において、例示部分と表示した点線領域は、図4で説明した静的コールグラフに表した関数の呼出状況に対応している。本実施例1に係わる記憶領域の割当方法を適用しない場合には、以下の順番で割当を行う。プログラムソースコード中において、親関数から直接呼出しがかかる第1階層の関数を、アドレス順にメモリバンクに配置する。ついで、第1階層の関数からさらに呼出しがかかる第2階層の関数を第1階層の関数と同一のメモリバンクに配置できるときには配置する。ただし、再帰呼出しについては考慮されない。従って、点線図形で囲った例示部分において、第1階層の子関数f_A2と、子関数f_A2から呼び出される第2階層の子関数f_B2はメモリバンク13aに割り当てられている。また、第1階層の子関数f_A3と、子関数f_A3から呼び出される第2階層の子関数f_B3はメモリバンク14aに割り当てられている。なお、子関数f_A1、子関数f_C1はメモリバンク12aに割り当てられている。子関数f_B1、子関数f_D1はメモリバンク13aに割り当てられている。子関数f_A4、子関数f_B4はメモリバンク15aに割り当てられている。子関数f_A5、子関数f_B5、子関数f_C2はメモリバンク16aに割り当てられている。親関数f_MAINはメモリバンク11aに割り当てられている。一方、図11の下段は、プログラムソースコードに対して、本実施例1に係わる記憶領域の割当方法を行った場合の割当状況である。本実施例1に係わる記憶領域の割当方法を適用する場合には、以下のように割当が行われる。図11上段の例示部分に対応する、下段の点線図形で囲った例示部分において、第1階層の子関数f_A2はメモリバンク13bに割り当てられる。また、一つに見立てられた関数f_B2f_A3は、第1階層の子関数としてメモリバンク14bに割り当てられる。ここで、図11上段では、子関数f_B3は単独の子関数であったが、本実施例1に係わる記憶領域の割当方法を適用することにより、子関数f_B3は一つと見立てられた子関数f_B3f_B4f_B5f_C2の構成要素となった。その結果、図11下段の第2階層の子関数f_B3f_B4f_B5f_C2の一部として、子関数f_B3はメモリバンク15bに配置されている。なお、子関数f_A1、子関数f_C1はメモリバンク12bに割り当てられている。子関数f_B1、子関数f_D1はメモリバンク13bに割り当てられている。子関数f_A4はメモリバンク15bに割り当てられている。子関数f_A5はメモリバンク16bに割り当てられている。親関数f_MAINはメモリバンク11bに割り当てられている。図11の上段に示す、子関数f_A3と子関数f_B2とは、再帰呼出関係にあるが、子関数f_A3と子関数f_B2とは異なるメモリバンクに配置されている。そうすると、CPUは、メモリバンク13aとメモリバンク14aは、同時に通常電力供給状態とすることになる。メモリバンク13a又はメモリバンク14aの内の一方が、省電力供給状態であり、他方が通常電力供給状態であるとすると、相互に再帰呼出を行えないからである。一方、図11の下段に示す、子関数f_A3と子関数f_B2とは、一つと見立てられた子関数f_B2f_A3として、同一のメモリバンク14bに配置されている。従って、一つと見立てられた子関数f_B2f_A3に関する呼出動作を行うにはメモリバンク14bのみを通常供給状態とすればよく、メモリバンク13bは省電力供給状態のまま維持することができる。従って、実施例1のメモリシステム50において、実施例1のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施し、メモリシステム50に含まれるCPUによって、関数の呼出状態に応じて、メモリバンクの電源状態を制御すれば、通常電力供給状態とするメモリバンク数を減少させることができる。その結果、実施例1のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施によって、メモリシステム50の消費電力を削減することができる。なお、上記の説明において、各メモリバンクの電源状態のコントロールを、CPUがメモリバンクに割り当てた関数に関するソースプログラムコードの割当状態に応じて、行うこととした。しかし、図12に示す方法によって、CPUがソースプログラムから、電源制御入り実行プログラムを生成し、電源制御入り実行プログラムによる制御によって、CPUがメモリバンクの電源状態をコントロールすることとしても、メモリシステムの消費電力を削減することができる。図12は、実施例1の変形例であるメモリシステム120及びそのメモリシステム120において生成される電源制御入り実行プログラムの生成方法に対するフローチャートを示す。図12の左半分は電源制御入り実行プログラムの生成方法を説明するためのフローチャートであり、右半分は実施例1の変形例であるメモリシステム120を示す。図12のフローチャートにより示す実行プログラムの生成方法は、コンパイル工程S1、制御位置算出工程S2、メモリマップ決定工程S3、制御パラメータ決定制御コード挿入工程S4、アセンブルリンク工程S5を含む。コンパイル工程S1において、ソースプログラムは、CPU110内のプロセッサに読み込まれ、アセンブリコード又はオブジェクトに変換される。制御位置算出工程S2において、CPU110内のプロセッサはメモリバンクのオンオフを制御するアセンブリコード又はオブジェクトを検出する。メモリマップレイアウト決定工程S3において、呼出し関係抽出工程S31からメモリ割当工程S34までを行いメモリマップを決定し、メモリマップ情報を出力する。ここで、メモリマップとは、再帰呼出し部を表すアセンブリコード又はオブジェクトと、アセンブリコード又はオブジェクトを格納した場所を示すメモリバンクのアドレスとの対応を示すマップである。また、メモリマップ情報は、メモリマップをコードで表したデータから構成されている。制御パラメータ決定制御コード挿入工程S4において、メモリマップ情報に基づいてメモリバンクのオンオフを制御するアセンブリコード又はオブジェクトの位置を修正する。アセンブルリンク工程S5において、メモリバンクのオンオフを制御するアセンブリコード又はオブジェクトの位置が修正されたプログラムを、電力制御入り実行プログラムとしてプログラム記憶領域に記憶する。図12の右半分の図はメモリシステム120を示す。メモリシステム120は、CPU110、制御レジスタ群30、電源線45、電源制御装置46、メモリユニット10、及び、バス40を含む。図1の説明において、制御レジスタ群30、電源線45、電源制御装置46、メモリユニット10、バス40の説明をしたため、説明を省略する。CPU110は、プロセッサと、メモリコントローラと、ソースプログラム格納領域と、電源制御入り実行プログラム格納領域を含む。図1の説明において、メモリコントローラについては説明済みなため、説明を省略する。ソースプログラム格納領域は、外部から与えられたソースプログラムを記憶する領域である。電源制御入り実行プログラム格納領域は、CPU110自身が、ソースプログラムから生成した電源制御入り実行プログラムを格納する領域である。以上より、メモリシステム120は、図1に示したメモリシステム50と比較し、CPU内に、ソースプログラムから生成した電源制御入り実行プログラムを保持することになり、メモリユニット10の制御を容易に行うことができる。図13は、実施例2に係わる、プログラムに含まれるコードに記憶領域を割り当てる割当方法を説明する図である。実施例2に係わる、プログラムに含まれるコードに記憶領域を割り当てる割当方法は、呼出関係抽出工程S35、再帰呼出抽出工程S32A、再帰読出処理済み静的コールグラフ作成工程S32B、再帰呼出縮退工程S36、及び、メモリ割当工程S37を含む。再帰呼出抽出工程S32A及び再帰読出処理済み静的コールグラフ作成工程S32Bは、図3に示す同様な符号を付したステップと同様なものであり、その説明を省略する。呼出関係抽出工程S35において、プログラムのソースコード、アセンブリまたはオブジェクトを走査し、出現する関数それぞれに対し、関数呼出回数をカウントする。次いで、カウントに応じて関数呼出しに重みを付加し、重み情報付きの静的コールグラフを作成する。再帰呼出抽出工程S32について、図14を用いてさらに説明を加える。再帰縮退工程S36において、再帰呼出抽出工程S32Aにおいて再帰呼出部を検出した場合、再帰呼出部をまとめる再帰縮退を行う。すなわち、再帰呼出部に関連する関数を、重み付け情報を有する一つと見立てられた関数とする。なお、再帰縮退工程S36において、関数サイズ情報81が使用される。なお、再帰縮退工程S36について、図15、図16を用いてさらに説明を加える。メモリ割当工程S37において、重み付けされた一つと見立てられた関数について、一体としてメモリ領域を割り振る。すなわち、一つと見立てられた関数は、同一メモリバンクに格納される。なお、一つと見立てられた関数は、ソースコード、アセンブリ、又はオブジェクト82から得られるコードから抽出されるものである。図14は呼出関係抽出工程S35に関する、フローチャート、静的コールグラフ、及び、呼出抽出後の出力データ表を図示する。図14の重み情報付き静的コールグラフは、図4の静的コールグラフと、例として上げられている関数及びその呼出関係において同様である。ただし、関数の呼出関係において呼出回数に応じた重み付けがされている点で異なる。図14の呼出関係抽出工程S35の出力データ表は、図14の重み情報付き静的コールグラフに対応する出力データ表である。図4の出力データ表に記載されている項目に加えて、第3列に関数の呼出関係に対する重みの数値が記載されている点で異なる。図14のフローチャートによれば、呼出関係抽出工程S35は、関数別呼出回数カウント工程S351、重み付け工程S352、重み情報付き静的コールグラフの作成工程S353、静的コールグラフに関するデータ作成工程S354を含む。関数別呼出回数カウント工程S351は、アセンブリ及びオブジェクトと、関数の呼出履歴を受けて、呼出元の関数から呼出先の関数への呼出回数をカウントする工程である。重み付け工程S352は、関数別呼出回数カウント工程S351における呼出回数に基づいて、呼出元となる関数と、呼出先となる関数との呼出関係について重み付けを付与するステップである。ここで、プログラムソースコード、アセンブリまたはオブジェクトにおける呼出し関係に基づいて、親関数f_MAINが行う子関数の呼出しの回数を、ソースコード呼出し回数とする。また、プログラムを実行する際に、親関数f_MAINの関数形式に基づいて、すなわち、引数等に基づいて、親関数f_MAINが行う子関数の呼出しの回数を、関数依存呼出し回数とする。ソースコード呼出し回数は、プログラムソースコード、アセンブリまたはオブジェクトにより、一義的にきまるため、静的な呼出し回数といえる。一方、関数依存呼出し回数は、入力された引数等によりその回数が増減するため、動的な呼出し回数といえる。そこで、関数依存呼出し回数を、ソースコード呼出し回数に対する重み付けとし、ソースコード呼出し回数を、関数依存呼出し回数とする。ここで、関数依存呼出し回数をX=A11A12A1mA21A22A2m、ソースコード呼出し回数をY=Y1Y2とする。ここで、プログラムコード中における、親関数f_MAINからの子関数f_A1のソースコード呼出し回数はY1であり、さらに、ソースコード中の各呼出しについて、親関数の関数形式に依存した子関数の関数依存呼出し回数は、A11、A12、A1mmは正の整数である。また、プログラムコード中における、親関数f_MAINに対応する子関数f_A2のソースコード呼出し回数はY2であり、さらに、ソースコード中に各呼出しについて、親関数の関数形式に依存した子関数の関数依存呼出し回数はA21、A22、A2mmは正の整数である。そうすると、重みは以下のように表される。重みPf_MAIN,f_A1=Y1×XA11×YA12×YA1m×Y重みPf_MAIN,f_A2=Y2×XA21×YA22×YA2m×Y例えば、親関数f_MAINに対応するプログラムコード中に子関数f_A1を3回、子関数f_A2を2回呼び出しているとするならば、親関数f_MAINから子関数f_A2への重みが3とされ、親関数f_MAINから数f_A2への重みが2とされる。また、親関数f_MAINから子関数f_A1へ10回、子関数f_A2へ20回の呼出し履歴と、親関数f_MAINから子関数f_A2へ10回、親関数f_MAINから子関数f_A3へ40回の呼出しがあったとする。重みPf_MAIN,f_A1=3×805×105×10=340重みPf_MAIN,f_A2=2×805×205×40=460となる。重み情報付き静的コールグラフの作成工程S353は、重み情報を付加された静的コールグラフを作成し、その静的コールグラフに関するデータを作成する工程である。図15は再帰縮退工程S36を説明するための図である。再帰縮退工程S36は、呼出し関係抽出工程S35からの出力と、再帰呼出設定工程S32206からの出力と、関数サイズ情報3604を受けて、工程S3601、工程S3602、工程S3603を実行するルーチンである。その結果、再帰縮退工程S36は、再帰呼出処理済み静的コールグラフ3605、関数縮退情報3606、再帰呼出処理済関数サイズ情報3607を出力する。工程S3601は、呼出関数抽出S31からの出力としての静的コールグラフにおいて、検出した再帰呼出しに関係している各関数を同一の関数名に置き換える置換動作を行う。このときの置き換えルールを関数縮退情報3606として記憶する。なお、置き換えルールは、上記置換動作で使用した同一の関数名の情報を含む。そして、工程S3301の終了後、上記の関数縮退情報3606は、工程S3602、工程S3603のために出力される。ステップS3601の置き換え処理について、図16において具体例を示す。工程S3602は、関数縮退情報3606を用いて、関数呼出関係の削除及び統合を行うステップである。すなわち、工程S3301の置換動作の結果、呼出元の関数と呼出先の関数が同一となった関数呼出し関係が生じた場合は、その関数呼出関数は静的コールグラフより削除される。また、呼出元の関数と呼出先の関数が複数の関数呼出関係において同一となり、重複する関数呼出し関係が生じたときは、静的コールグラフにおいて、複数の関数呼出し関係を一つに統合される。その結果、再帰呼出しに関連する関数は、静的コールグラフ上において、一つと見立てた関数として記述される。そして、工程S3602が終了すると、関数呼出し関係の削除及び統合が行われた後の静的コールグラフを再帰呼出し処理済静的コールグラフ3605が出力される。関数呼出し関係の削除及び統合についても、図16において具体例を示す。工程S3603は、関数縮退情報3606を用いて、再帰呼出処理済み関数サイズ情報を作成する工程である。すなわち、関数サイズ情報3604の基づいて、一つと見立てた関数の関数サイズを見積もる。また、一つと見立てた関数の重みは、再帰呼出しに関連する関数の重みを加算したものである。そして、工程S3603はにおいて、関数サイズ情報3604に一つと見立てた関数の関数サイズを追加して再帰呼出処理済み関数サイズ情報3607を作成する。工程S3603の処理について、図16において具体例を示す。図16は、再帰縮退工程S36における具体的な処理動作の例を示す。図16は、呼出関係出力工程S35の出力、再帰呼出設定工程S32206の出力、工程S3601の出力、関数サイズ情報3304、及び、再帰縮退工程S36の出力を図示する。呼出関係抽出工程S35の出力は、呼出関係出力工程S31の出力に加え、呼出し関係の重み付けを表示する欄を含む。呼出し関係の重みを表示する欄において、親関数f_MAINから子関数f_A2への呼出し関係に対する重みは150、親関数f_MAINから子関数f_A3への呼出し関係に対する重みは450、親関係f_A2から子関係f_B2の呼出し関係の重みは200、親関数f_A2から子関数f_A3への呼出し関係に対する重みは100、親関数f_A3から子関数f_B3への呼出し関係に対する重みは330、親関数f_B2から子関数f_A3への呼出し関係に対する重みは300、親関数f_B2から子関数f_B3への呼出し関係に対する重みは50である。なお、図16のS35中の重みの例は、図14に示した例とは異なる例である。再帰縮退工程S36の出力は、工程S3602と、工程S3601の出力の一部と、工程S3603の出力を含む。ここで、工程S3601の出力の一部は、関数縮退情報3606である。工程S3602において、工程S3601の出力の内、関数の呼出し関係について、一つの見立てた関数f_B2f_A3について、工程S3302と同様に、削除と統合を行う。ただし、一つの見立てた関数f_B2f_A3について、重み付けが付加される点では、工程S3602は工程S3302とは異なる。その結果、再帰呼出し処理済静的コールグラフ3605が形成される。工程S3603において、親関数、子関数、一つと見立てた関数f_B2f_A3のコードサイズを見積もる。その結果、再帰呼出し処理済関数のサイズ情報3607が形成される。図17は、実施例のメモリ割当工程S37を説明するフローチャートである。メモリ割当工程S37は親関数選択工程S3701、電力制御無しメモリ割当工程S3702、合計コードサイズ計算工程S3703、呼出頻度算出工程S3704、電力制御を伴うメモリへの割当工程S3705、アドレス計算工程S3706を含む。なお、メモリ割当工程S37を実行するには、再帰縮退工程S36から出力された、bと表示した再帰処理済み静的コールグラフ、cと表示した再帰処理済み関数サイズ情報、dと表示した関数縮退情報を含む情報3707を使用する。また、メモリ割当工程37を実行するには、aと表示したメモリ構造情報3708を使用する。さらに、メモリ割当工程S37を実行するには、eと表示した静的コールグラフ、fと表示した関数サイズ情報を含む情報3709を使用する。なお、情報3707及び情報3709はソースコード、オブジェクト、又は、アセンブリ3711から得られる情報である。親関数選択工程S3701において、メイン関数を除くすべての関数について、呼出し頻度が最も高い呼出し元関数を、その関数の親関数として選択する。親関数の選択にあたり、bと表示した再帰処理済み静的コールグラフ、ソースコード、オブジェクト、又は、アセンブリ3711を使用する。この工程により、メイン関数を頂点とした親子関係の階層が特定される。電力制御無しメモリ割当工程S3702において、親関数選択工程S3701にて特定したメイン関数を頂点とした親子関係の階層にて、メイン関数から一定の呼出し階層内の関数を選択しこの詳細は特許文献5にて開示、選択した関数を電力制御を行わないメモリバンクに割り当てる。メモリバンクに選択した関数を割り当てるために、aと表示したメモリ構造情報3708、cと表示した再帰呼出処理済み関数サイズ情報を使用する。合計コードサイズ計算工程S3703において、電力制御を行わないメモリバンクに割り当てた関数の、親子関係の階層における直下の階層に属する各関数につき、各関数を代表関数とする関数群を作成し、その関数群の合計コードサイズを、その関数群を構成するコードサイズの合計により、計算する。この結果は、合計コードサイズテーブルとして保存される。なお、各関数を代表関数とする関数群は、代表関数および親子関係の階層における代表関数の子孫関数呼出し先関数、呼出し先関数の呼出し先関数、呼出し先関数の呼出し先関数の呼出し先関数すべてを指すにより構成される。合計コードサイズを計算するにあたり、cと表示した再帰処理済み関数サイズ情報を使用する。また、電力制御無しメモリ割当工程S3702で用いた、呼出し階層数の情報を合計コードサイズ計算工程S3703でも用いる。呼出し頻度算出工程S3704において、bと表示した再帰呼出処理済み静的コールグラフを用いて、合計コードサイズ計算工程S3703において構成した関数群の間の呼出し頻度を算出する。この結果は関数群間の呼出頻度表として保存される。電力制御を伴うメモリへの割当工程S3405において、電力制御無しメモリに割り当てられた関数以外の関数について、メモリ領域を割当てる。メモリ領域を関数に割り当てるにあたり、aと表示したメモリ構造情報、合計コードサイズ計算工程S3703にて計算した合計コードサイズテーブル、および、呼出し頻度算出工程S3704にて算出した関数群間の呼出頻度表を使用する。合計コードサイズ計算工程S3703にて構成した関数群ごとに割り当てることにより、呼出し元の関数から一番呼出し頻度が高い呼出し先の関数を、呼出し元の関数と同一のメモリバンクに、また、呼出し頻度算出工程S3704の結果を用いることで二番目以降に呼出し頻度が関数についてもできるだけ呼出し元の関数と同一のメモリバンクに、割り当てることができる。アドレス計算工程S3706において、電力制御無しメモリ割当工程S3702および電力制御を伴うメモリへの割当工程S3705において割り当てた各関数のうち再帰縮退工程S36によって一つにまとめられた関数は元の関数に復元し、その後、各関数について開始アドレスを算出し、メモリマップ情報を作成する。開始アドレスを算出とメモリマップ情報作成にあたり、aと表示したメモリ構造情報、dと表示した関数縮退情報、eと表示した静的コールグラフ、fと表示した関数サイズ情報を使用する。また、電力制御無しメモリ割当工程S3702における割り当て結果、および電力制御を伴うメモリへの割当工程S3705における割り当て結果を用いる。以上より、実施例1のメモリシステム50において、実施例2のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施し、メモリシステム50に含まれるCPUによって、関数の呼出し状態に応じて、メモリバンクの電源状態を制御すれば、通常電力供給状態とするメモリバンク数を減少させることができる。ここで、実施例2のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施すると、呼出し元の子関数に対して、呼出し頻度の高い、呼出し先の子関数を選択して、同一バンクに割り当てることができる。そうすると、実施例1の割当方法により、子関数をメモリ領域に割り当てる場合に比較し、実施例2の割当方法により、子関数をメモリ領域に割り当てる方が、より通常電力供給状態とするメモリバンク数を減少させることができる。呼出し元の子関数について、呼出し先の子関数が複数ある場合、呼出し頻度の低い子関数を同一バンクに割り当てる一方で、呼出し頻度の高い子関数を他のメモリバンクに割り当てる場合、複数のメモリバンクを通常電力供給状態とする頻度が高くなるからである。実施例2において、呼び出し頻度の高い、呼出し先の子関数を同一のメモリバンクに割り当てようとするが、割り当て先のメモリバンクの記憶容量が小さく、呼出し先の子関数すべてを同一のメモリバンクに割り当てられない場合が想定される。その場合に、メモリシステム50において、以下に示す実施例3のプログラムを実行すると、同一のメモリバンクに割当られなかった関数は所定のメモリバンクに割り当てられる。ここで、実施例3のメモリ割当工程は、実施例2のメモリ割当工程S37中の電力制御有りメモリ割当部S3705に代えて、以下に示す電力制御有りメモリ割当部S4005を含む工程である。図18A、及び18Bは実施例3に係わる電力制御有りメモリ割当部S4005を示す。実施例3のメモリ割当工程は、親関数選択工程S3701、電力制御無しメモリ割当工程S3702、合計コードサイズ計算工程S3703、呼出頻度算出工程S3704、電力制御を伴うメモリへの割当工程S4005、アドレス計算工程S3706を含む。このうち、親関数選択工程S3701、電力制御無しメモリ割当工程S3702、合計コードサイズ計算工程S3703、呼出し頻度算出工程S3704、アドレス計算工程S3406は実施例2と同一である。実施例3の電力制御を伴うメモリへの割当工程S4005の実行は、スタート以下、次の工程を実行することとなる。まず、残りメモリサイズ変数初期化工程S400501を行う。残りメモリ領域サイズ変数初期化工程S400501は残りメモリ領域サイズを記憶する変数m_restの値を初期化する工程である。すなわち、電力制御無しメモリ割当工程S3702において割り当てた電力制御を行わないメモリバンクMに対しては、m_restm_rest[M]の値を0、それ以外のメモリバンクMに対するm_restの値m_rest[M]をメモリバンクMの容量と初期化する。次いで、合計コードサイズ最大の関数群を選択する工程S400502を行う。合計コードサイズ最大の関数群を選択する工程S400502は、合計コードサイズテーブルを走査し、現時点でメモリバンクへ割り当てていない関数群のうちコードサイズ最大の関数群を選び最大関数群F_Maxとして設定する。なお、実施例3および後述の実施例4において、関数群とは合計コードサイズ計算工程S3703において構成した関数群のことを意味している。次いで、最大関数群を配置判断する工程S400503を行う。最大関数群を配置判断する工程S400503は最大関数群F_Maxが配置できるメモリバンクを検出できるかを判断する工程である。最大関数群F_Maxが配置できるメモリバンクを検出できた場合には、残りメモリサイズ変数を更新する工程S400504へ進む。一方、最大関数群F_Maxが配置できるメモリバンクを検出できなかった場合には、最大関数群F_Max配置ルーチンメモリバンク認識工程S400513から残りメモリバンク更新工程S400516を含むに進む。残りメモリサイズ変数を更新する工程S400504は、コードサイズ最大の関数群F_Maxのコード量sFMaxを、最大関数群を配置判断する工程S400503にて検出したメモリバンクの残りメモリ領域サイズm_rest[M]から差し引いて、最大関数群F_Max配置後のメモリバンクの残りメモリ領域サイズm_rest[M]を更新する工程である。次いで、呼び出し頻度認識により集合Γを生成する工程S400505を行う。呼び出し頻度認識工程により集合Γを生成するS400505は最大関数群F_Maxから呼び出し関係にあり、かつ、メモリバンクへ未割り当ての関数群Fからなる集合Γを生成する工程である。なお、最大関数群F_Maxから呼び出し関係にあることの判定は、最大関数群F_Maxからの呼び出し頻度QF_Max,Fが0より真に大きいことにより行う。呼び出し頻度QF_Max,Fは関数群F_Maxに含まれる関数φ及び関数群Fに含まれる関数ψの組合せについて、重みPφ,ψと重みPψ,φの合算値を、すべての組合せについて計算し、計算した合算値すべてについて和をとって得られるものである。ただし、関数群F_Maxに含まれる関数は割り当て済みであり、呼び出し頻度QF_Max,F_Maxは上記のとおりに計算しても集合Γから除外されるので、呼び出し頻度QF_Max,F_Maxの値は0とする。すなわち、呼び出し頻度QF_Max,Fは以下の式で表される。数1QF_Max,F=0F=F_MaxのときΣPφ,ψPψ,φF≠F_Maxのときφ∈F_Maxψ∈Fここで、φは関数群F_Maxに含まれる関数を示す。ψは関数群Fに含まれる関数を示す。次いで、集合Γが空集合か否かを判断する工程S400506を行う。集合Γが空集合であるときは、メモリ割当が終了したかを判断する工程S400512に進む。一方、集合Γが空集合でないときは、メモリ領域割り当てルーチンS400507へ進む。メモリ領域割り当てルーチンS400507は最大関数群F_Max以外の関数であって、集合Γに属する関数についてメモリ領域を割り当てるルーチンであり、図18Bを用いて説明する。メモリバンク認識工程S400513は残りのメモリ領域が存在するメモリバンクを認識し、残りメモリ領域サイズが大きい順にM1、M2、、Mnnは正の整数と名付ける工程である。なお、残りメモリ領域サイズが同一値であるメモリバンクが存在する場合は、同一値であるメモリバンク同士、同一値であるメモリバンクの次に残りメモリ領域サイズが多いメモリバンク、および、同一値であるメモリバンクの次に残りメモリ領域サイズが少ないメモリバンクが、可能な限りアドレスが連続するように名付けると、後述する理由により望ましい結果となる。次いで、最大関数を割り当て可能なメモリバンクを認識する工程S400514を行う。最大関数を割り当て可能なメモリバンクを認識する工程S400514では、残りのメモリ領域を大きい順に加えていき、加算された残りのメモリ領域が最大関数群F_Maxのコードサイズ以上となるときが何番目のメモリバンクにあたるかを検出する。すなわち、m_rest[M1]m_rest[M2]m_rest[Mm]≧smはn以下の正の整数となるmを検出することとなる。ここで、sF_Maxは最大関数群F_Maxのコードサイズを表す。次いで、メモリ領域割当工程S400515を行う。メモリ領域割当工程S400515はM1からMmまでの複数のメモリバンクに、最大関数群F_Maxを割り当てる工程である。なお、メモリバンクM1からMmまで、アドレスが連続しているとより望ましい結果となる。例えば、後に図19Dに示すように、アドレスが連続しているメモリバンク400521とメモリバンク400522が、最大関数群F_Maxを割り当てるメモリ領域として選択されることと望ましい結果となる。アドレスが連続するメモリバンクを選択すれば、メモリバンク間を移動するための分岐命令を省くことができ、プロセッサの消費電力を削減できるからである。次いで、残りメモリ領域サイズ更新工程S400516を行う。残りメモリ領域サイズ更新工程S400516は、次の操作をする工程である。まず、m_rest[Mi]=0i=1、、m-1とした後、m_rest[Mm]=m_rest[M1]m_rest[M2]m_rest[Mn]-sF_Maxとする。ここで、sF_Maxは最大関数群F_Maxのコード量を表す。すなわち、1からm-1番目までのメモリバンクの残りメモリ領域サイズを0にするとともに、最大関数群F_Maxの内、1からm-1番目までのメモリバンクに配置しきれなかった部分のサイズを、m番目のメモリバンクの元のメモリ領域サイズから、差し引き、m番目のメモリバンクの残りメモリ領域サイズを求める。残りのメモリ領域の更新工程S400516が終了すると、呼び出し頻度認識工程S400505へ進む。メモリ割当が終了したかを判断する工程S400512は、合計コードサイズテーブル中の関数群のすべてについて、メモリ領域を割り当てたかを判断する工程である。すなわち、最大関数群F_Maxに含まれる関数及び最大関数群F_Maxと呼び出し関係にある関数群に含まれる関数をメモリ領域に割当てた後、さらに合計コードサイズテーブル中に、メモリ領域に割り当てられていない他の関数群が存在するか否かを判断する工程である。ここで、合計コードサイズテーブル中に他の関数群が存在し、その関数群について、メモリ領域の割当が終了していないと判断する場合、合計メモリサイズ最大の関数群を選択する工程S400502に進む。一方、メモリ領域の割り当てが終了していると判断する場合、実施例3のメモリ割当工程を終了する。図18Bは、メモリ領域割り当てルーチンS400507について説明するフローチャートである。メモリ領域割当ルーチンS400507は、呼出し頻度最大の関数群F_Relを選択する工程S400508と、残りメモリ領域サイズm_rest[M]の判断工程S400509と、関数をメモリ領域の残りに割り当てる工程S400510と、集合Γ更新工程S400511とを含む。呼出し頻度最大の関数群F_Relを選択する工程S400508は、集合Γに含まれる関数群Fの内、最大関数群F_Maxとの呼出し頻度最大の関数を選び関数群F_Relとして設定する工程である。但し、同一呼出し頻度の関数が複数存在する場合は、呼出し回数最大関数群F_Relの候補となる関数群の内、コードサイズが最大となる関数を選択する。残りメモリ領域サイズ判断工程S400509は、メモリバンクMの残りメモリ領域サイズm_rest[M]が呼出し頻度最大の関数群F_Relのコード量以上であるかを判断する工程である。ただし、前記メモリバンクMは、最大関数群を配置判断する工程S400503にて割り当てたメモリバンク、あるいはメモリ領域割当工程S400515におけるメモリバンクMmを指している。どちらを指すかは最大関数群を配置判断する工程S400503の判断結果に依存する。残りメモリ領域サイズm_rest[M]が関数群F_Relのコード量sF_Rel以上である場合には、関数群F_Relを残りメモリ領域に割り当てる工程S400510に進み、残りメモリ領域サイズm_rest[M]が関数群F_Relのコード量sF_Relより真に小さい場合には、集合Γ更新工程S400511へ進む。集合Γ更新工程S400511は、最大関数群F_Maxから呼び出し関係にある関数群の集合Γから、関数群F_Relを取り除いて、集合Γを更新する工程である。この工程は、残りメモリ領域サイズ判断工程S400509の結果によらず行われる。なお、メモリバンクMの残りメモリ領域サイズm_rest[M]より呼出し頻度最大関数群F_Relが大きい場合には、その関数群については、メモリ領域への割当が行われないが、メモリ割当が終了したかを判断する工程S400512を経由して、メモリバンク認識工程S400513から残りメモリ領域サイズ更新工程S400516によってメモリ領域への割当が行われる。以上より、関数群F_Maxから呼び出し関係にある関数群Fの集合Γが空でない場合、メモリ領域割り当てルーチンS400507にエントリし、集合Γを更新する工程S400511を終了すると、フローチャートの集合Γが空集合か否かを判断する工程S400506に進む。図19は、第3実施例に係わるメモリ割当工程S4005により関数を各メモリバンクに割り当てる具体例を示す。図19Aから図19Cは、第3実施例に係わるメモリ割当工程S4005を開始するにあたり、合計コードサイズ計算工程S3703、呼出し頻度計算工程S3704を行った結果をそれぞれ示す。図19Aにおいて、呼出し元の関数を親関数として列挙し、それらに対する呼び出し先の関数と、呼出し回数に基づいた重み付けを列挙した左表を示す。また、一つの呼び出し先の関数に対し、呼出し元の関数が2以上ある場合に、重み付けに基づいて呼出し元の関数を一つに選択した状態の親関数と、その呼出し先の関数を列挙した右表を示す。左表と、右表を比較してみると、関数B4は、親関数A2、A3双方の呼出し先の関数となっているが、重み付けに従って、親関数A2が関数B4の親関数として選択したことがわかる。図19Bにおいて、関数群名F_A1、F_A2、F_A3及び関数群それぞれの代表関数A1B1C1D1、代表関数A2、代表関数A3が記載された表が示されている。関数A1B1C1D1は再帰呼び出し関係にあるため、一つの関数と見なされた関数である。なお、図19Bに示す表には、さらに、代表関数から子孫関係にある関数代表関数からの呼び出し先の関数及びそれらからさらに呼び出される関数と、代表関数とその子孫関数の合計コードサイズとが、記載されている。図19Cは呼出し頻度算出工程S3704により計算された関数群間の呼出し頻度を示す表である。呼出し頻度は2つの異なる関数群については、片方の関数群に属する関数が呼び出し元となり、もう一方の関数群に属する関数が呼び出し先となる呼出しが発生する頻度を表す。そこで、関数群F_A1、F_A2、F_A3から呼出し関係にある関数群F_A1、F_A2、F_A3に対する呼出し頻度を表した結果が、図19Cに示されている。関数群F_A1に属する関数が呼出し元あるいは呼出し先となる呼出しの、それぞれ呼出し先、呼出し元は、メイン関数または関数群F_A1に属する関数であるため、関数群F_A1と関数群F_A1、F_A2、F_A3との呼出し頻度は0である。一方、関数群F_A2に属する関数が呼出し元あるいは呼出し先となる呼出しにおいては、関数A3関数群F_A3に属するが関数B4関数群A2に属するを頻度20で呼び出しており、それ以外については呼出し先または呼出し元は、メイン関数または関数群F_A2に属する関数であるため、関数群F_A2と関数群F_A1、F_A2との呼出し頻度は0であるが、関数群F_A3との呼出し頻度は20である。同様に、関数群F_A3と関数群F_A1、F_A3に属する関数を呼出し頻度は0であるが、関数群F_A2との呼出し頻度は20である。図19Dは電力制御有りメモリ割当工程S4005を行った結果を示す。図19Dにおいて、メイン関数400517、関数A1を含む一つとみなされた関数関数A1B1C1D1を代表関数とする関数群F_A1400518、関数A2を代表関数とする関数群F_A2400519、関数A3を代表関数とする関数群F_A3400520、メモリバンク400521、メモリバンク400522、メモリバンク400523、及び、メモリバンク400524を示す。メモリバンク400521、400522、400523の容量は4KBであり、電力制御ありのメモリバンクである。また、メモリバンク400521、400522、400523のメモリ領域は、アクセスするためのアドレスが連続している。メイン関数400517は、関数A1、関数A2、関数A3を呼び出す関数である。また、関数の出入りで電力を制御する方式では電力削減効果が減少するため、メイン関数400517は、電力制御無しのメモリバンク400524へ割り当てられている。以下、図19Dに示す電力制御有りメモリ割当工程S4005を行った結果が得られるまで、図18A、Bのフローチャートにそって各工程の具体例を示す。まず、残りメモリサイズ変数初期化工程S400501を行う。メモリサイズ変数初期化の対象は、メモリバンク400521、400522、400523、400524であり、初期化の結果それぞれのメモリバンクの残りメモリ領域サイズm_rest[M]は、4KB、4KB、4KB、0KBとなる。すでに、メモリバンク400524にはメイン関数400517が配置され、電力制御なしのメモリバンクとして使用することが決定してているため、メモリバンク400524の残りメモリ領域サイズは0である。関数A1を含む一つとみなされた関数関数A1B1C1D1を代表関数とする関数群F_A1400518は、関数A1B1C1D1、関数C2を含む。関数群F_A1400518の合計コードサイズは5KBである。関数A2を代表関数とする関数群F_A2400519は、関数A2、関数B2、関数B3、関数B4を含む。関数群F_A2400519の合計コードサイズは4KBである。関数A3を代表関数とする関数群F_A3400520は、関数A3、関数B5、関数B6を含む。関数群F_A3400520は3KBである。次いで、合計コードサイズ最大の関数群を選択する工程S400502を行う。その結果、関数群F_A1400518が関数群F_Maxとして選択される。次いで、最大関数群を配置判断する工程S400503を行う。その結果、関数群F_A1400518は5KBであるため、どのメモリバンクにも配置できないと判断される。次いで、メモリバンク認識工程S400513を行う。その結果、各メモリバンクの残り容量、残りメモリ領域サイズm_rest[M]は4KB、4KB、4KB、0KBであると認識するとともに、メモリバンク400521、400522、400523、400524の順に並べ、M1、M2、M3、M4と名付ける。次いで、最大関数を割当可能なメモリバンクを認識する工程S400514を行う。その結果、M1の残りメモリサイズm_rest[M1]、M2の残りメモリ領域サイズm_rest[M2]を加算すると8KBとなり、関数群F_A1400518の容量sF_Max以上となるため、最小のmは2である。次いで、メモリ領域割当工程S400515を行う。その結果、関数群F_A1400518の内、4KB分は、メモリバンク400521に割り当てられ、残りの1KB分はメモリバンク400522に割り当てられる。次いで、残りメモリ領域サイズ更新工程S400516を行う。メモリバンク400521、400522、400523、400524の残りのメモリ容量は0KB、3KB、4KB、0KBと更新される。次いで、呼び出し頻度認識により集合Γを生成する工程S400505を行う。その結果、関数群F_Maxから呼び出し頻度が0以上の関数群Fの集合Γは、図19Cより空となる。次いで、集合Γが空集合か否かを判断する工程S400506を行う。その結果、集合Γは空であるから、メモリ割当が終了したかを判断する工程S400512に進む。その結果、関数群F_A2400519、関数群F_A3400520の割当が未了なため、最大コードサイズの関数群を選択する工程S400502に進む。次いで、最大コードサイズの関数群を選択する工程S400502を行う。その結果、関数群F_A2400519が関数群F_Maxとして選択される。次いで、最大コードサイズの関数群を配置判断する工程S400503を行う。その結果、関数群F_A2400519の合計コードサイズと、メモリバンク400523のメモリ領域は4KBと同一であり、関数群F_A2400519はメモリバンク400523からはみ出すことなく割り当てられる。そこで、残りメモリサイズ変数を更新する工程S400504へ進む。次いで、残りメモリサイズ変数を更新する工程S400504を行う。その結果、メモリバンク400521、400522、400523、400524の残りメモリ領域サイズm_rest[M]は、0KB、3KB、0KB、0KBと更新される。次いで、呼び出し頻度認識により集合Γを生成する工程S400505を行う。関数群F_A2400519をF_Maxとした場合、現時点で最大関数群F_Maxから呼び出し頻度が0でない関数群Fあって、メモリバンク領域に割り当てられていない関数群Fとして関数群F_A3が存在するため、関数群F_A3を含む集合Γを生成する。次いで、集合Γが空集合か否かを判断する工程S400506を行う。呼び出し頻度が0でない関数が集合Γに存在するので、メモリ領域割当ルーチンS400507へ進む。次いで、メモリ領域割当ルーチンS400507中の呼出し頻度最大の関数F_Relを選択する工程S400508を行う。その結果、関数群F_A3を関数群F_Relと設定する。次いで、残りメモリ領域サイズ判断工程S400509を行う。メモリバンク400523の残りメモリ領域サイズ3KBが関数群F_Relの合計コードサイズ3KB以上であるので、残りメモリ領域に割り当てる工程S400510に進む。次いで、集合Γ更新工程S400511を行う。集合Γから、関数群F_Fel、すなわち、関数群F_A3を除く。次いで、メモリ領域割当ルーチンS400507を抜けて、集合Γが空集合か否かを判断する工程S400506を行う。その結果、集合Γは空であるため、メモリ割当が終了したかを判断する工程S400512に進む。その結果、関数群関数群F_A3400520がメモリバンクに割当られていないため、最大コードサイズの関数群を選択する工程S400502に進む。次いで、最大コードサイズの関数群を選択する工程S400502を行う。その結果、関数群F_A3400520が関数群F_Maxとして選択される。次いで、最大コードサイズの関数群を配置判断する工程S400503を行う。その結果、関数群F_A3400520の合計コードサイズは3KB、メモリバンク400522の残りメモリ領域は3KBなので、関数群F_A3400520はメモリバンク400523からはみ出すことなく割り当てられる。そこで、残りメモリサイズ変数を更新する工程S400504へ進む。次いで、残りメモリサイズ変数を更新する工程S400504を行う。その結果、メモリバンク400521、400522、400523、400524の残りメモリ領域サイズm_rest[M]は、0KB、0KB、0KB、0KBと更新される。次いで、呼び出し頻度認識により集合Γを生成する工程S400505を行う。関数群F_A3400520をF_Maxとした場合、現時点で関数群F_Maxからの呼び出し頻度が0でない関数群Fであって、メモリバンク領域に割り当てられていない関数群Fはないので、集合Γは空に設定される。次いで、集合Γが空集合か否かを判断する工程S400506を行う。集合Γは空であるため、メモリ割当が終了したかを判断する工程S400512に進む。次いで、メモリ割当が終了したかを判断する工程S400512を行う。メモリ領域に割り当てられていない関数群が、合計コードサイズテーブル中に存在しないため、実施例3のメモリ割当工程S4005を終了する。以上より、メモリシステム50において、実施例3のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施した場合、関数A1B1C1D1を代表関数とする関数群F_A1400518はメモリバンク400521のメモリ領域より大きいため、メモリバンク400521とメモリバンク400522の2つのメモリバンクに集中して割り当てられる。また、関数A2を代表関数とする関数群F_A2の合計コードサイズ量は、メモリバンク400523のメモリ領域より小さいため、その関数群F_A2に含まれる関数は、一つのメモリバンク400523に集中して配置される。さらに、関数A3を代表関数とする関数群F_A3の合計コードサイズ量は、メモリバンク400522の残りのメモリ領域より小さいため、その関数群F_A3に含まれる関数は、メモリバンク400523に集中して配置される。そこで、メモリシステム50に含まれるCPUによって、関数の呼出し状態に応じて、メモリバンクの電源状態を制御すれば、通常電力供給状態とするメモリバンク数を減少させることができる。実施例3で示したプログラムは、最大関数群をメモリバンクに割り当てた後、新たなメモリバンクを使用しない範囲で、呼出し関係のある関数群最大関数群との呼出し頻度が0より真に大きい関数群を割り当てる方式に基づくものである。この方式は、複数のメモリバンクに割り当てられる関数群を削減できるという利点があるものの、この方式によりいくつかの関数群を割り当てた結果、各メモリバンクとも残りメモリ領域サイズは少量となり、残りの関数群が多数のメモリバンクに割り当てられるという状況が発生しうる。この状況となり、かつその関数群が少数の関数で構成されておりそのため、該当関数群の各関数に割り当てられるメモリバンク数も多くなる、それらの関数の実行時間がほかの関数に比べて長い場合には、消費電力の削減効果が減少する場合もあり得る。図20は実施例3に示したプログラムを実施した場合に、消費電力の削減効果が減少する例を示す。メモリ割当工程S4005を実行するにあたり、合計コードサイズ計算工程S3703、呼出し頻度計算工程S3704において、図19Aから図19Cに示すような結果が得られているとする。ただし、図19Bに示す関数群F_A1の合計コードサイズは2.5KB、関数群F_A2の合計コードサイズは7KB、関数群F_A3の合計コードサイズは3KBであるとする。また、図19Dに示されている実施例3のメモリシステム50の構成要素に加えて、メモリシステム50の構成要素として、メモリ容量1KBのメモリバンク400525が追加されている。さらに、図20に係わるメモリシステム50においては、メモリバンク400525にはメイン関数400517が配置されており、メモリバンク400524はメモリバンク400523とアドレスが連続したメモリ領域を有している。メイン関数400517、関数群F_A1400518、関数群F_A2400519、関数群F_A3400520、メモリバンク400521、メモリバンク400522、及び、メモリバンク400523については、図19Dと同様なものであるので、説明を省略する。図20に係わるメモリシステム50において、実施例3にメモリ割り当て工程S4005を行うと、まず、最大関数群として関数群F_A2400519が設定され、メモリバンク400521、400522に割り当てられる。このとき、メモリバンク400521、400522の残りメモリ領域サイズm_rest[M]はそれぞれ、0KB、1KBとなる。最大関数群F_Max=関数群F_A2から呼び出し頻度が0でない関数群であって、メモリバンク領域に割り当てられていない関数群として、関数群F_A3400520が存在するが、メモリバンク400522の残りメモリ領域サイズm_rest[M]は1KBであり、関数群F_A3400520の合計コードサイズ3KBより小さいため、関数群F_A3はこの時点ではメモリバンクに割り当てられない。続いて、最大関数群として関数群F_A3400520が設定され、メモリバンク400523に割り当てられる。このときのメモリバンク400523の残りメモリ領域サイズm_rest[M]は1KBとなる。最大関数群F_Max=関数群F_A3から呼び出し頻度が0でない関数群であって、メモリバンク領域に割り当てられていない関数群は存在しないため、再び最大関数群の選択を実行する。続いて、最大関数群として関数群F_A1400518が設定されるが、この時点でのメモリバンク400521、400522、400523、400524の残りメモリ領域サイズm_rest[M]はそれぞれ、0KB、1KB、1KB、1KBである。したがって、関数群F_A1400518は、メモリバンク400522、400523、400524にわたって配置されることとなる。ここでもし、関数群F_A1400518の関数を実行している間、メモリバンク400522、400523、400524が通常電力供給状態となってしまうと、通常電力供給状態のメモリバンクが多くなるため、関数群F_A1400518の関数実行中の消費電力は高くなる。さらに、関数群F_A1400518の全プログラム中における実行時間の比率が高いと、プログラム全体の消費電力も高くなる。このように、実施例1のメモリシステム50において、以下に示す実施例4のプログラムを実行して、メモリバンクに空きが発生しないように割り当てることが考えられる。実施例4において示すメモリ割当工程S4105を、実施例2のメモリ割当工程S37中の電力制御有りメモリ割当部S3705に代えて、実行することにより、実施例3のプログラムの場合、多数のメモリバンクに割り当てられ、かつその多数のメモリバンクに割り当てられた関数群の実行時間が長くなる場合に、消費電力を削減することができる。図21Aは、実施例4に係わるメモリ割当工程S4105を示す。実施例4のメモリ割当工程S4105の実行は、スタート以下、次の工程を行うことにより実行される。まず、残りメモリ領域サイズ変数初期化工程S410521を行う。残りメモリ領域サイズ変数初期化工程S410521は残りメモリ領域サイズを記憶する変数m_restの値を初期化する工程である。すなわち、電力制御を行わないメモリバンクMに対しては、m_restm_rest[M]の値を0、それ以外のメモリバンクMに対するm_restの値m_rest[M]をメモリバンクMの容量と初期化する。次いで、合計コードサイズ最大の関数群を選択する工程S410522を行う。合計コードサイズ最大の関数群を選択する工程S410522は、合計コードサイズテーブルを走査し、合計コードサイズ最大の関数群を選び、最大関数群F_Maxとして設定する。次いで、メモリバンク認識工程S410523を行う。メモリバンク認識工程S410523は残りメモリ領域サイズが大きい順にM1、M2、、Mnnは正の整数と名付ける工程である。なお、残りメモリ領域サイズが同一値であるメモリバンクが存在する場合は、同一値であるメモリバンク同士、同一値であるメモリバンクの次に残りメモリ領域サイズが多いメモリバンク、および、同一値であるメモリバンクの次に残りメモリ領域サイズが少ないメモリバンクが、可能な限りアドレスが連続するように名付けると、より望ましい結果となる。次いで、最大関数群F_Maxをメモリバンクに割り当てるルーチンS410524を行う。なお、最大関数群F_Maxをメモリバンクに割り当てるルーチンS410524は、図21を用いて別途説明する。次いで、呼び出し頻度認識により集合Γを生成する工程S410525を行う。呼び出し頻度認識により集合Γを生成する工程S410525は最大関数群F_Maxから呼び出し関係にあり、かつ、メモリバンクへ未割り当ての関数群Fを集合Γとする工程である。なお、最大関数群F_Maxから呼び出し関係にあることの判定は、最大関数群F_Maxからの呼び出し頻度QF_Max,Fが0より真に大きいことにより行う。次いで、集合Γが空集合か否かを判断する工程S400526を行う。集合Γが空であるときは、メモリ割当が終了したかを判断する工程S410527に進む。一方、集合Γが空でないときは、呼出し頻度最大の関数群F_Relを選択する工程S410528へ進む。次いで、呼出し頻度最大の関数群F_Relを選択する工程S410528を行う。呼出し頻度最大の関数群F_Relを選択する工程S410528は、集合Γに含まれる関数の内、最大関数群F_Maxとの呼出し頻度最大の関数群を選び関数群F_Relとして設定する工程である。但し、同一呼出し頻度の関数群が複数存在する場合は、呼出し回数最大関数群F_Relの候補となる関数群の内、コードサイズが最大となる関数群を選択する。次いで、関数群F_Relについてメモリバンクに割り当てるルーチンS410529を行う。なお、関数群F_Relをメモリバンクに割り当てるルーチンS410529は、図21Bを用いて別途説明する。次いで、集合Γ更新工程S410530を行う。集合Γ更新工程S410530は、最大関数群F_Maxから呼び出し関係にある関数群の集合Γから、関数群F_Relを除いて、集合Γを更新する工程である。次いで、集合Γが空集合か否かを判断する工程S410526に戻る。集合Γが空になるまで、呼出し頻度最大の関数群F_Relを選択する工程S410528から集合Γ更新工程S410530までの工程を繰り返す。次いで、集合Γが空になると、メモリ割当が終了したかを判断する工程S410527へ進む。メモリ割当が終了したかを判断する工程S410527は、最大関数群F_Maxに含まれる関数及び最大関数群F_Maxと呼び出し関係にある関数群に含まれる関数をメモリ領域に割り当てた後、さらに合計コードサイズテーブル中にメモリ領域に割り当てられていない他の関数群が存在するか否かを判断する工程である。ここで、合計コードサイズテーブル中にさらに関数群が存在し、その関数群について、メモリ領域の割当が終了していないと判断する場合は、合計コードサイズ最大の関数群を選択する工程S410522を行う。一方、合計コードサイズテーブル中に関数が存在しない場合は、実施例4に係わるメモリ割当工程S4105を終了する。図21Bは、最大関数群F_Maxをメモリバンクに割り当てるルーチンS410524を説明する図である。最大関数群F_Maxをメモリバンクに割り当てるルーチンS410524は以下の工程を含む。まず、関数群すべてを割り当て可能であるメモリバンクを認識する工程S410524aを行う。関数群すべてを割り当て可能であるメモリバンクを認識する工程S410524aは、メモリバンク認識工程S410523により認識された、アドレスが連続するM1、M2、、Mnについて、1番目からm番目mはn≧mとなる正の整数までのメモリ領域を加算した結果得られるメモリ領域が、最大関数群F_Maxのコードサイズ以上となる最小のmを検出する工程である。次いで、メモリ領域割当工程S410524bを行う。メモリ領域割当工程S410524bはM1からMmまでのメモリバンクに、最大関数群F_Maxを割り当てる工程である。次いで、残りメモリ領域サイズ更新工程S410524cを行う。残りメモリ領域サイズ更新工程S410524cは、m_rest[Mi]=0i=1、、m-1とするとともに、m_rest[Mm]=m_rest[M1]m_rest[M2]m_rest[Mm]-sF_Maxとする工程である。なお、上記の最大関数群F_Maxをメモリバンクに割り当てるルーチンS410524は、最大関数群F_Maxについて処理をするルーチンであったが、関数群F_Relをメモリバンクに割り当てるルーチンS410529は、最大関数群F_Maxのかわりに、関数群F_Relについて、関数群F_Maxをメモリバンクに割り当てるルーチンS410524と同様の工程を行うルーチンである。図22は、実施例4に係わるメモリ割当工程S4105により関数を各メモリバンクに割り当てる具体例を示す。メモリ割当工程S4105を実行するにあたり、合計コードサイズ計算工程S3703、呼出し頻度計算工程S3704において、図19Aから図19Cに示すような結果が得られているとする。ただし、図19Bに示す関数群F_A1の合計コードサイズは2.5KB、関数群F_A2の合計コードサイズは7KB、関数群F_A3の合計コードサイズは3KBであるとする。また、図19Dに示されている実施例3のメモリシステム50の構成要素に加えて、メモリシステム50の構成要素として、メモリ容量1KBのメモリバンク400525が追加されている。さらに、実施例4に係わるメモリシステム50においては、メモリバンク400525にはメイン関数400517が配置されており、メモリバンク400524はメモリバンク400523とアドレスが連続したメモリ領域を有している。メイン関数400517、関数群F_A1400518、関数群F_A2400519、関数群F_A3400520、メモリバンク400521、メモリバンク400522、及び、メモリバンク400523については、図19Dと同様なものであるので、説明を省略する。上記のメモリシステム50において、実施例4に係わるメモリ割当工程S4105を行うと、合計コードサイズ最大の関数群を選択する工程S410522の実行により、まず、関数群F_A2が合計コードサイズ最大の関数群F_Maxとして選択される。次いで、最大関数群F_Maxをメモリバンクに割り当てるルーチンS410524が実行されると、メモリバンク400521、400522のメモリ容量を加算した結果、最大関数群F_Maxのコードサイズを超えることが検出される関数群すべてを割当可能であるメモリバンクを認識する工程S410524a。次いで、メモリバンク400521、400522、400523、400524の残りメモリ領域サイズが更新される残りのメモリ領域の更新工程S410524c。次いで、呼び出し頻度認識工程S410525を行う。その結果、未だメモリバンクへの割当が行われておらず、関数群F_Max現時点で関数群F_A2から呼び出し頻度が0でない、関数群F_A3400520を含む集合Γが設定される。次いで、集合Γが空集合か否かを判断する工程S400526を行う。集合Γは空でないので、呼出し頻度最大の関数群F_Relを選択する工程S410528を実行し、関数群F_A3を関数群F_Relとし、メモリバンクに割り当てるルーチンS410529を行う。その結果、関数群F_A3はメモリバンク400523に割当られる。次いで、再び、集合Γが空集合か否かを判断する工程S400526を行う。集合Γは空なので、関数群はすべて割当済かを判断する工程S410527を実行する。メモリバンクに割り当てられていない関数群F_A1400518が存在するので、合計コードサイズ最大の関数群を選択する工程S410522に進む。次いで、合計コードサイズ最大の関数群を選択する工程S410522を行い関数群F_A1400518を関数群F_Maxとして選択する。次いで、メモリバンク認識工程S410523、関数群F_Maxをメモリバンクに割り当てるルーチンS410524を行い、メモリバンク400523、400524に現時点での関数群F_Maxである関数群F_A1400518が割り当てられる。次いで、呼び出し頻度認識工程S410525を行う。合計コードサイズ最大の関数群F_Maxを関数群F_A1とする場合、図19Cより、集合Γは空となる。次いで、再び、集合Fが空集合か否かを判断する工程S400526を行う。集合Fは空なので、関数群はすべて割当済かを判断する工程S410527を実行する。すべての関数群はメモリバンクに割当られていると判断されるので、実施例4のメモリ割当工程S4105は終了する。以上より、メモリシステム50において、実施例4のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施した場合、以下のような動作が行われる。まず、最大関数群未だメモリバンクへの割当が行われていない関数群のうち合計コードサイズ量が最大であるものと、その最大関数から呼び出し関係にある未だメモリバンクへの割当が行われていない関数群の合計コードサイズ量より、メモリ領域が大きくなる複数のメモリバンクを検出する。その後、順次、最大関数群と、その最大関数群から呼び出し関係にある未だメモリバンクへの割当が行われていない関数群が、上記で検出した複数のメモリバンクに配置される。そうすると、メモリシステム50に含まれるCPUによって、最大関数及びその最大関数から呼出される関係にある関数について処理が行われる場合、通常電力供給状態とするメモリバンクを容易に特定することができる。その結果、余分なメモリバンクを通常電力状態とすることがなくなるため、通常電力供給状態とするメモリバンク数を減少させることができる。従って、メモリバンクが消費する電力を削減することができる。また、アドレスが連続していないメモリ領域に配置されていると、通常電力供給状態と、そうでない状態とを切り替える場合に、CPUは、数回の命令を必要とする。しかし、最大関数及びその最大関数から呼出される関係にある関数が、アドレスが連続しているメモリ領域に配置されている場合は、通常電力供給状態と、そうでない状態とを切り替える場合に、CPUは、一括して1回の命令で行える。従って、アドレスが連続している場合は、CPUの負荷を軽減でき、CPUの消費電力を削減することができる。以下に本発明の特徴を付記する。付記1プロセッサに読み込まれたプログラム中の関数間の呼び出し関係を、プロセッサが抽出する工程と、前記関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから2度目の呼出しまでの間に経由した関数群を再帰呼出し部とする再帰呼出し抽出工程と、前記再帰呼出し部を表す前記プログラムに含まれるコードを、供給される電圧状態を独立して切替可能なメモリバンクに、前記プロセッサが、割り当てるコード割当工程と、を備えることを特徴とするプログラムに含まれるコードをメモリ領域に割り当てる割当方法。付記2前記コード割当工程において、前記プロセッサは、前記再帰呼出し部を表す前記プログラムに含まれるコードを、一体として、一つの前記メモリバンクに割り当てることを特徴とする、プログラムに含まれるコードをメモリ領域に割り当てる付記1記載の割当方法。付記3前記コード割当工程において、前記プロセッサは、前記再帰呼出し部を表す前記プログラムに含まれるコードを、一体として、アドレスが連続する2以上の前記メモリバンクに割り当てることを特徴とする、プログラムに含まれるコードをメモリ領域に割り当てる付記1記載の割当方法。付記4関数を表すコードを含むプログラムを読込むことによって、動作可能なプロセッサと、前記プロセッサからの制御によって、供給される電圧状態を独立して切替可能なメモリバンクと、を備え、前記プロセッサは前記プロセッサに読み込まれた前記プログラム中の関数間の呼び出し関係を抽出する機能と、前記関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから2度目の呼出しまでの間に経由した関数群を再帰呼出し部とする機能と、前記再帰呼出し部を表す前記プログラムに含まれるコードを、供給される電圧状態を独立して切替可能なメモリバンクに、前記プロセッサが、割り当てる機能と、を有することを特徴とするメモリシステム。付記5前記メモリバンクの電圧状態を、前記プロセッサからの命令を受けて、設定する制御レジスタと、前記制御レジスタからの信号を受けて、前記メモリバンクの電圧状態を制御する電源制御回路と、をさらに備えることを特徴とする付記4記載のメモリシステム。付記6プロセッサとメモリバンクを備えるメモリシステムにおいて、ソースプログラムを前記プロセッサに読み込みこませ、前記ソースプログラムをアセンブリコード又はオブジェクトに変換するコンパイル工程と、メモリバンクのオンオフを制御するアセンブリコード又はオブジェクトを前記プロセッサが検出する制御位置算出工程と制御位置算出工程S2、前記プロセッサに読み込まれたプログラム中の関数間の呼び出し関係を、プロセッサが抽出する工程と、前記関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから2度目の呼出しまでの間に経由した関数群を再帰呼出し部とする再帰呼出し抽出工程と、前記プロセッサが、前記プログラムに含まれる、前記再帰呼出し部を表すアセンブリコード又はオブジェクトを、供給される電圧状態を独立して切替可能な前記メモリバンクに割り当て、前記再帰呼出し部を表すアセンブリコード又はオブジェクトを格納した場所を示す前記メモリバンクのアドレスをメモリマップ情報として出力するコード割当工程と、前記メモリマップ情報に基づいて前記メモリバンクのオンオフを制御するアセンブリコード又はオブジェクトの位置を修正する工程と、を備えることを特徴とする電源制御入り実行プログラムの生成方法。"