(57)【特許請求の範囲】
【請求項１】
ソースコードから、別のループ処理に含まれるループ処理内でアクセス対象となるメンバを有する構造体または配列を検出する検出部と、
前記別のループ処理内で前記構造体または前記配列のアドレスが変化しない場合、ポインタ変数を宣言する第１のコード、及び、前記構造体または前記配列のアドレスを前記ポインタ変数にセットする第２のコードを、前記ソースコードの前記別のループ処理の前に挿入し、前記ループ処理内の、前記メンバにアクセスするコードを、前記ポインタ変数に基づいて前記メンバにアクセスする第３のコードに置換し、前記ループ処理内で前記構造体または前記配列のアドレスが変化し、かつ、前記別のループ処理内であって前記ループ処理の外で前記構造体または前記配列のアドレスが変化しない場合、前記第２のコードが前記別のループ処理内に挿入されるように、前記第１のコード及び前記第２のコードを前記ループ処理の前に挿入し、前記ループ処理内の、前記メンバにアクセスするコードを、前記第３のコードに置換する編集部と、
を有するソースコード最適化装置。
【請求項２】
請求項１において、
前記編集部は、前記ループ処理の度に前記アドレスが変化しない前記構造体または前記配列のアドレスを、前記ポインタ変数にセットする第２のコードを挿入する、
ソースコード最適化装置。
【請求項３】
請求項１または２において、
前記検出部は、ループ回数が所定値を超える前記ループ処理内でアクセス対象となる、前記メンバを有する前記構造体または前記配列を検出する、
ソースコード最適化装置。
【請求項４】
ソースコードから、別のループ処理に含まれるループ処理内でアクセス対象となるメンバを有する構造体または配列を検出し、
前記別のループ処理内で前記構造体または前記配列のアドレスが変化しない場合、ポインタ変数を宣言する第１のコード、及び、前記構造体または前記配列のアドレスを前記ポインタ変数にセットする第２のコードを、前記ソースコードの前記別のループ処理の前に挿入し、前記ループ処理内の、前記メンバにアクセスするコードを、前記ポインタ変数に基づいて前記メンバにアクセスする第３のコードに置換し、前記ループ処理内で前記構造体または前記配列のアドレスが変化し、かつ、前記別のループ処理内であって前記ループ処理の外で前記構造体または前記配列のアドレスが変化しない場合、前記第２のコードが前記別のループ処理内に挿入されるように、前記第１のコード及び前記第２のコードを前記ループ処理の前に挿入し、前記ループ処理内の、前記メンバにアクセスするコードを、前記第３のコードに置換する、
ことを実行させることを特徴とするソースコード最適化プログラム。
【請求項５】
処理部が、ソースコードから、別のループ処理に含まれるループ処理内でアクセス対象となるメンバを有する構造体または配列を検出し、
処理部が、前記別のループ処理内で前記構造体または前記配列のアドレスが変化しない場合、ポインタ変数を宣言する第１のコード、及び、前記構造体または前記配列のアドレスを前記ポインタ変数にセットする第２のコードを、前記ソースコードの前記別のループ処理の前に挿入し、前記ループ処理内の、前記メンバにアクセスするコードを、前記ポインタ変数に基づいて前記メンバにアクセスする第３のコードに置換し、前記ループ処理内で前記構造体または前記配列のアドレスが変化し、かつ、前記別のループ処理内であって前記ループ処理の外で前記構造体または前記配列のアドレスが変化しない場合、前記第２のコードが前記別のループ処理内に挿入されるように、前記第１のコード及び前記第２のコードを前記ループ処理の前に挿入し、前記ループ処理内の、前記メンバにアクセスするコードを、前記第３のコードに置換し、
処理部が、前記挿入及び前記置換後のソースコードをコンパイルする、
オブジェクトコード生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコード最適化装置、ソースコード最適化プログラム及びオブジェクトコード生成方法に関する。 
【背景技術】
【０００２】
近年、ソフトウェア（プログラム）が動作する情報処理システムは、ユーザ数や機能の増加に伴い、大規模化している。情報システムの大規模化にしたがって、ソフトウェアに求められる性能水準も高くなっている。
【０００３】
コンパイラは、Ｃ言語等のプログラミング言語にしたがって記述されたソースプログラムをコンパイルし、オブジェクトコードを生成する。また、コンパイラは、ソフトウェアの性能を向上する、最適化機能（Optionレベル）を有する。開発者は、例えば、最適化機能を使用して、ソースコードやアセンブラのコードを最適化する。そして、最適化した、ソースコードやアセンブラのコードに基づいてオブジェクトコードを生成することによって、ソフトウェアの性能向上を図る。
【０００４】
ソースコードの最適化に関する技術は、例えば、特許文献１、２に記載される。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平６−７５９８７号公報
【特許文献２】特表２００６−５０５０５８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、最適化機能を使用して最適化したソースコードやアセンブラのコードの可読性は低い傾向にある。可読性の低下に伴って、ソフトウェアの仕様変更や障害対応等の際の工数が多くなり、ソフトウェアの保守性が低下する。
【０００７】
一方、ソースコードやアセンブラのコードの可読性を向上するために、ソフトウェアの性能改善を行う選任技術者にソースコードの最適化を依頼して、性能を向上する方法があるが、選任技術者に依頼を行うことによりコストや工数が生じる。
【０００８】
このように、ソフトウェアの保守性を考慮しながら、性能の向上を図ることは容易ではない。
【０００９】
１つの側面では、本発明は、ソースコード最適化装置、ソースコード最適化プログラム及びオブジェクトコード生成方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
第１の態様によれば、ソースコードから、ループ処理内でアクセス対象となるメンバを有する構造体または配列を検出する検出部と、ポインタ変数を宣言する第１のコード、及び、前記構造体または前記配列のアドレスを前記ポインタ変数にセットする第２のコードを、前記ソースコードの前記ループ処理の前に挿入し、前記ループ処理内の、前記メンバにアクセスするコードを、前記ポインタ変数に基づいて前記メンバにアクセスする第３のコードに置換する編集部と、を有する。
【発明の効果】
【００１１】
１つの側面では、プログラムの性能を向上する。
【図面の簡単な説明】
【００１２】
【図１】最適化対象となるソースファイルｃａに記述されたソースコードの一例を示す図である。
【図２】図１のソースコードに示す、変数「Class[2][8]」の構成を示す図である。
【図３】本実施の形態における情報処理装置が、図１に示すソースコードを最適化した後の、最適化後のソースコードの一例を示す。
【図４】本実施の形態における情報処理装置の、ソースコードの最適化処理を説明するフローチャート図である。
【図５】図１のソースファイルｃａに対応するプログラムの命令と、図３の最適化後ソースファイルｃｂに対応するプログラムの命令とを表す図である。
【図６】図１のソースファイルｃａに対応するプログラムの実行にかかるサイクル数と、図３の最適化後ソースファイルｃｂに対応するプログラムの実行にかかるサイクル数を表す図である。
【図７】本実施の形態における情報処理装置（プログラムの最適化装置）１００のハードウェア構成図である。
【図８】図７に示したコンパイルプログラム１２０のソフトウェアブロックの構成図である。
【図９】図８で説明したコンパイルプログラム１２０の処理の詳細を説明するフローチャート図である。
【図１０】図９で説明した工程Ｓ２１の処理の詳細を説明する第１のフローチャート図である。
【図１１】ループ文検知テーブル１３１の一例を示す図である。
【図１２】図９で説明した工程Ｓ２１の処理を説明する第２のフローチャート図である。
【図１３】構造体検知テーブル１３２の一例を示す図である。
【図１４】図１２で説明した工程Ｓ４６の構造体解析処理を説明するフローチャート図である。
【図１５】最適化構造体テーブル１３３の一例を示す図である。
【図１６】図９で説明した工程Ｓ２２の処理を説明するフローチャート図である。
【図１７】図１６で説明した工程Ｓ１０１の処理の詳細を説明するフローチャート図である。
【図１８】変更最適化構造体テーブル１３４の一例を示す図である。
【図１９】図１６で説明した工程Ｓ１０２の処理の詳細を説明するフローチャート図である。
【図２０】図１６で説明した工程Ｓ１０３の処理の詳細を説明するフローチャート図である。
【図２１】図１６で説明した工程Ｓ１０４の処理の詳細を説明するフローチャート図である。
【図２２】別の最適化対象のソースコードを含むソースファイルｃａ−１の例を示す図である。
【図２３】本実施の形態における情報処理装置が、図２２に示すソースファイルｃａ−１を最適化した後の、ソースファイルｃｂ−１の例を示す。
【図２４】ソースファイルｃａ−１（図２２）に対応するプログラムの実行にかかるサイクル数と、最適化後ソースファイルｃｂ−１（図２３）に対応するプログラムの実行にかかるサイクル数を表す図である。
【図２５】別の最適化対象のソースコードを含むソースファイルｃａ−２の例を示す図である。
【図２６】本実施の形態における情報処理装置１００が、図２５に示すソースファイルｃａ−２を最適化した後の、ソースファイルｃｂ−２の例を示す。
【図２７】別の最適化対象のソースコードを含むソースファイルｃａ−３の例を示す図である。
【図２８】本実施の形態における情報処理装置が、図２７に示すソースファイルｃａ−３を最適化した後の、ソースファイルｃｂ−３の例を示す。
【発明を実施するための形態】
【００１３】
以下、図面にしたがって本発明の実施の形態について説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
【００１４】
［ソースコードの最適化］
ソースコードの最適化処理は、例えば、実行ファイルを効率化し、実行時間やメモリ使用量などを最小化するために、ソースコードを修正する処理を示す。ソースコードの最適化によって、プログラムの実行時間の減少や、使用するメモリ量の減少が実現する。最適化処理は、例えば、外部メモリへのアクセス回数の削減や、ループ処理内の判定処理の削減、除算の削減等の処理を含む。コンパイルプログラムは、最適化後ソースファイルを入力として、オブジェクトコードを生成する。
【００１５】
初めに、本実施の形態におけるソースコードの一例を説明する。
【００１６】
［ソースコード］
図１は、最適化対象となるソースファイルｃａに記述されたソースコードの一例を示す図である。図１に示すソースコードは、ループ処理を含み、ループ処理内で構造体が有するメンバにアクセスする処理を含む。
【００１７】
図１に示すコードｃｄ１は、多次元構造体「members」を定義するコードである。多次元構造体「members」は、メンバとして、構造体「subject」型の構造体を４０個有する構造体配列（members[40]）と、リザーブ領域（reserve[2]）とを有する。多次元構造体「members」は、例えば、生徒４０人分の、各科目の得点に関する情報を有する構造体である。
【００１８】
構造体配列（members[40]）の各構造体「members」は、subject型の構造体である。コードｃｄ２によると、subject型の構造体は、メンバとして、char型の変数「math」と、char型の変数「eng」と、リザーブ領域「reserve[7]」とを有する。変数「math」は、例えば、数学の得点を格納する変数であって、変数「eng」は、例えば、英語の得点を格納する変数である。このように、構造体配列（members[40]）は、例えば、生徒４０人分の、数学及び英語の得点の情報を有する。
【００１９】
また、図１に示すコードｃｄ３は、８個の多次元構造体「members」を２セット分、メモリ上の領域に確保することを指示するコードである。変数「Class[2][8]」は、メモリ上に確保した、８個の多次元構造体「members」の２セット分の領域を示す。
【００２０】
また、図１に示すソースコードは、処理として３つのループ処理ｌｐ１〜ｌｐ３を有する。第１のループ処理ｌｐ１は、カウンタ変数「i」がループ毎にインクリメントされ、値「０」から値「１」に達するまで、括弧（｛｝）内の処理を繰り返すループ処理である。即ち、第１のループ処理ｌｐ１は、括弧（｛｝）内の処理を、２回繰り返す。
【００２１】
第２のループ処理ｌｐ２は、カウンタ変数「c」がインクリメントされ、値「０」から値「７」に達するまで、括弧（｛｝）内の処理を８回、繰り返すループ処理である。ただし、第２のループ処理ｌｐ２は、第１のループ処理ｌｐ１に含まれる。したがって、プログラムの実行時、ＣＰＵは、第２のループ処理ｌｐ２を、計１６（＝２×８）回、実行する。
【００２２】
第３のループ処理ｌｐ３は、カウンタ変数「m」がループ毎にインクリメントされ、値「０」から値「４０」に達するまで、括弧（｛｝）内の処理を４０回、繰り返すループ処理である。ただし、第３のループ処理ｌｐ３は、第１、第２のループ処理ｌｐ１、ｌｐ２に含まれる。したがって、プログラムの実行時、ＣＰＵは、第３のループ処理ｌｐ３を、計「６４０（＝１６×４０）」回、実行する。
【００２３】
また、第３のループ処理ｌｐ３は、変数「Class[i][c].members[m]」のメンバmath及びメンバengに、値「０」をセットするコードｃｄ４、ｃｄ５を含む。具体的に、コード「Class[i][c].members[m].math = 0;」ｃｄ４は、iセット目、ｃ個目の多次元構造体「members」が有する構造体配列members[40]のうち、ｍ番目の構造体「members」のメンバmathに、値「０」をセットする処理を示す。コードｃｄ５についても同様にして、iセット目、ｃ個目の多次元構造体「members」が有する構造体配列members[40]のうち、ｍ番目の構造体「members」のメンバengに、値「０」をセットする処理を示す。
【００２４】
[多次元構造体]
図２は、図１のソースコードに示す、変数「Class[2][8]」の構成を示す図である。図１で前述したとおり、変数「Class[2][8]」は、２セット分の、８個の多次元構造体「members」を示す。したがって、図２は、１セット目の８個の多次元構造体「members」を示す構造体「Class[0][0]〜Class[0][7]」、及び、２セット目の８個の多次元構造体「members」を示す、構造体「Class[1][0]〜Class[1][7]」を表わす。
【００２５】
また、図２に示すように、図１で前述したとおり、構造体「Class[0][0]〜Class[1][7]」のそれぞれは、メンバ（構造体配列members[40]）を有する。メンバ（構造体配列members[40]）は、４０個分のsubject型の構造体「members」を有する。
【００２６】
図２に示す矢印ｐ０は、変数「Class[2][8]」の先頭アドレスを示す。また、矢印ｐ１は、構造体「Class[0][0]」のアドレスを示し、矢印ｐ０が示すアドレスと同様である。また、矢印ｐ２は、構造体「Class[0][1]」のアドレスを示す。同様にして、矢印ｐ３は構造体「Class[0][2]」のアドレスを示し、矢印ｐ４は構造体「Class[0][7]」のアドレスを示す。
【００２７】
また、図２に示す矢印ｐ１１は、構造体「Class[1][0]」のアドレスを示し、矢印ｐ１２は、構造体「Class[1][1]」のアドレスを示す。同様にして、矢印ｐ１３は構造体「Class[1][2]」のアドレスを示し、矢印ｐ１４は構造体「Class[1][7]」のアドレスを示す。
【００２８】
矢印ｐ２１は、構造体「Class[0][0]」が有する構造体配列「members[40]」の、１個目の構造体「members[0]」のアドレスを示し、矢印ｐ０、ｐ１と同様のアドレスを示す。矢印ｐ２２は、構造体「Class[0][0]」が有する構造体配列「members[40]」の、２個目の構造体「members[1]」のアドレスを示す。
【００２９】
同様にして、矢印ｐ２３は構造体「Class[0][0]」が有する構造体配列「members[40]」の、３個目の構造体「members[2]」のアドレスを示し、矢印ｐ２４は４０個目の構造体「members[39]」のアドレスを示す。
【００３０】
コードｃｄ４に示す、変数「Class[i][c].members[m]」のメンバmathに値「０」をセットする処理は、図２に示すアドレスｐ２１〜ｐ２４が指す各構造体「members」のメンバmathに、値「０」をセットする処理を示す。
【００３１】
コードｃｄ４に示す処理は、変数「Class[i][c].members[m].math」のアドレスの算出工程を含む。当該算出工程は、変数「Class[i][c]」のアドレスｐ１〜ｐ１４の算出工程と、アドレスｐ１〜ｐ１４からmembers[m]のメンバmathのアドレスｐ２１〜ｐ２４までの差分アドレスを算出する工程と、アドレスｐ１〜ｐ１４に差分アドレスを加算する工程を含む。
【００３２】
なお、アドレスｐ１〜ｐ１４の算出工程は、変数「Class[0][0]」のアドレスｐ０の取得工程と、アドレスｐ０から変数「Class[i][c]」のアドレスｐ１〜ｐ１４までの差分アドレスを算出する工程と、アドレスｐ０に差分アドレスを加算する工程とを含む。例えば、ＣＰＵ（Central Processing Unit：ＣＰＵ）は、メモリ管理ユニット等を介して、変数「Class[0][0]」のアドレスを取得する。
【００３３】
このように、構造体が有するメンバ（図１の例では、math、eng）にアクセスする場合、構造体のアドレスの算出工程が生じる。即ち、ＣＰＵは、図１に示すソースファイルｃａに対応するプログラムを実行する際に、コードｃｄ４の処理を行う毎に、アドレスｐ１〜ｐ１４の算出工程を行う。図１のコードｃｄ１５に示す処理も同様である。また、図１に図示していないが、配列が有するメンバにアクセスする場合についても、同様である。
【００３４】
また、図１で前述したとおり、プログラムを実行する際、ＣＰＵは、第３のループ処理ｌｐ３を、合計「６４０（＝２×８×４０）回」、実行する。したがって、ループ回数の多いループ処理内で、構造体または配列が有するメンバにアクセスする処理を行う場合、多量のアドレス算出工程が生じる。これにより、プログラムの実行にかかるサイクル数が増加し、プログラムの性能（実行時間）が、所定値を満たせない場合がある。
【００３５】
［本実施の形態の概要］
したがって、本実施の形態における情報処理装置（プログラムの最適化装置）は、ソースコードから、ループ処理内でアクセス対象となるメンバを有する構造体または配列を検出する。また、情報処理装置は、ポインタ変数を宣言する第１のコード、及び、構造体または配列のアドレスを、ポインタ変数にセットする第２のコードを、ソースコードのループ処理の前に挿入する。また、情報処理装置は、ループ処理内の、メンバにアクセスするコードを、ポインタ変数に基づいてメンバにアクセスする第３のコードに置換する。
【００３６】
なお、ソースコードにおけるコードの記述順と、ソースコードに対応するプログラムの実行時の、コードの実行順とは異なる場合がある。具体的に、ソースコード上で、所定コードの後に記述されているコードであっても、プログラムの実行時には、所定コードの前に実行される場合がある。第２のコードをループ処理の前に挿入することは、ループ処理の実行前に第２のコードを実行することを示す。
【００３７】
図３は、本実施の形態における情報処理装置が、図１に示すソースコードを最適化した後の、最適化後のソースコードの一例を示す。
【００３８】
図１の例によると、情報処理装置は、図１に示すソースコードから、ループ処理ｌｐ３内でアクセス対象となるメンバ「math、eng」を有する構造体または配列として、構造体「Class[i][c]」を検出する。
【００３９】
そして、情報処理装置は、ポインタ変数「members_p」を宣言するコードｃｄ１１、及び、構造体「Class[i][c]」のアドレスｐ１〜ｐ１４（図２）をポインタ変数にセットするコードｃｄ１２を、ループ処理ｌｐ３の前に挿入する。また、情報処理装置は、ループ処理ｌｐ３内の、メンバにアクセスするコードｃｄ４、ｃｄ５を、ポインタ変数に基づいてメンバにアクセスするコードｃｄ１３、ｃｄ１４に置換する。
【００４０】
図３に示すコードｃｄ１１は、ポインタ変数「members_p」を宣言するコードを示す。ポインタ変数は、アドレスを保持する変数を示す。なお、コードｃｄ１１における、値「restrict」は、コンパイラプログラムの最適化処理のための値を示し、エイリアスが存在しないと仮定した最適化を許可する旨を示す。図３の例では、値「restrict」を付加しているが、値「restrict」は、付加されていなくてもよい。
【００４１】
コードｃｄ１２は、ポインタ変数「members_p」に、変数「Class[i][c]」のアドレス「&Class[i][c]」ｐ１〜ｐ１４をセットするコードを示す。コードｃｄ１３、ｃｄ１４は、ポインタ変数「members_p」に基づいて、変数「Class[i][c].members[m]」の各メンバにアクセスし、値「０」をセットする処理を示す。
【００４２】
コードｃｄ１３、ｃｄ１４は、アドレスｐ１〜ｐ１４を有するポインタ変数「members_p」に基づいてメンバにアクセスするコードを示す。これにより、コードｃｄ１３、ｃｄ１４の実行時に、変数「Class[i][c]」のアドレスｐ１〜ｐ１４の算出工程が生じない。つまり、ポインタ変数に基づくアクセス処理に置換することによって、構造体（または配列）のアドレス算出工程を省略可能になる。
【００４３】
つまり、コードｃｄ１３、ｃｄ１４の実行時に、図２に示すアドレスｐ０を取得する工程、アドレスｐ０からアドレスｐ１〜ｐ１４までの差分アドレスを算出する工程、アドレスｐ０と差分アドレスとを加算する工程が生じない。また、図３のソースコードによると、第２のループ処理ｌｐ２は、新たに、アドレスｐ１〜ｐ１４の算出工程を行うコードｃｄ１２を有する。
【００４４】
ただし、第２のループ処理ｌｐ２の総ループ回数「１６（＝２×８）」は、第３のループ処理ｌｐ３の総ループ回数「６４０（＝１６×４０）」に対して大幅に少ない。したがって、アドレスｐ１〜ｐ１４の算出工程が、第３のループ処理ｌｐ３の外に移動することによって、アドレスｐ１〜ｐ１４の算出工程の回数を大幅に削減可能になる。
【００４５】
このように、本実施の形態における情報処理装置は、ループ処理内でアクセス対象となるメンバを有する構造体のアドレスの算出工程を、当該ループ処理の外に移動することによって、ループ処理内の構造体のアドレスの演算処理（算出工程）を抑制する。これにより、情報処理装置は、値「アドレス計算処理×総ループ回数」のサイクル数の削減を実現できる。
【００４６】
このように、繰り返し行うループ処理内の、アドレスの演算処理の回数を抑制することにより、プログラム実行時の処理量が大幅に減少し、プログラムの実行にかかるサイクル数を大幅に削減可能になる。これにより、プログラムの実行時間の高速化が実現可能になる。
【００４７】
また、情報処理装置は、ループのネストが深く、アクセス処理を含むループ処理のループ回数が多い程、アドレスの演算処理の抑制度合いを向上できる。また、情報処理装置は、ループ処理内のアクセス処理のコード（図１のコードｃｄ４、ｃｄ５）の数が多い程、アドレスの演算処理の抑制度合いを向上できる。また、情報処理装置は、アドレスの演算処理を移動する対象の構造体や配列の階層が深い程、アドレスの演算処理の抑制度合いを向上できる。
【００４８】
また、本実施の形態における最適化処理によると、アクセス処理におけるアドレス算出工程が抑制されるため、使用するアドレスレジスタの数を抑制することが可能になる。これにより、アドレスレジスタの不足によってスタックポインタにメモリ転送による退避を行う頻度が減少するため、処理のレイテンシを抑制可能になる。
【００４９】
また、本実施の形態における情報処理装置は、選任の技術者に最適化処理を依頼することなく、簡易に、ソースコードの最適化処理を実現することができる。これにより、最適化処理にかかるコストや工数を抑制可能になる。また、情報処理装置は、最適化処理にしたがってソースコードを複雑化しない。したがって、情報処理装置は、ソースコードの可読性を低下せずに、プログラムの保守性を維持できる。
【００５０】
図４は、本実施の形態における情報処理装置の、ソースコードの最適化処理を説明するフローチャート図である。
【００５１】
Ｓ１１：情報処理装置は、ソースファイルｃａからソースコードを読み出し、ループ処理内でアクセス対象となるメンバを有する構造体または配列を検出する。図１のソースコードによると、情報処理装置は、第３のループ処理内のコードｃｄ１４、ｃｄ１５に基づいて、構造体「Class[i][c].members[m]」を検出する。
【００５２】
Ｓ１２：情報処理装置は、ポインタ変数を宣言する第１のコード、及び、構造体または配列のアドレスを、ポインタ変数にセットする第２のコードをループ処理の前に挿入する。図３の例によると、情報処理装置は、ポインタ変数「members_p」を宣言する第１のコードｃｄ１１、ポインタ変数「members_p」に構造体「Class[i][c]」のアドレスをセットする第２のコードｃｄ１２を、第３のループ処理ｌｐ３の前に挿入する。
【００５３】
Ｓ１３：情報処理装置は、ループ処理内の、メンバにアクセスするコードを、ポインタ変数に基づいてメンバにアクセスするコードに置換する。
【００５４】
図３の例によると、情報処理装置は、図１のソースコードに示すコード「Class[i][c].members[m].math=0;」ｃｄ４を、ポインタ変数「members_p」に基づくコード「members_p->members[m].math=0」ｃｄ１３に置換する。同様にして、情報処理装置は、図１のソースコードに示すコード「Class[i][c].members[m].eng=0;」ｃｄ５を、ポインタ変数「members_p」に基づくコード「members_p->members[m].eng=0」ｃｄ１４に置換する。
【００５５】
図５は、図１のソースファイルｃａに対応するプログラムの命令と、図３の最適化後ソースファイルｃｂに対応するプログラムの命令とを表す図である。図５の左図は、図１のソースファイルｃａに対応するプログラムの命令を示し、図５の右図は、図３の最適化後ソースファイルｃｂに対応するプログラムの命令を示す。
【００５６】
初めに、図１のソースファイルｃａに対応するプログラムの命令を説明する。図５の左図の、１７行〜３７行の命令は第３のループ処理ｌｐ３を示す。また、１４行〜３８行の命令は第２のループ処理ｌｐ２を示し、１１行〜３９行の命令は第１のループ処理ｌｐ１を示す。
【００５７】
第３のループ処理ｌｐ３に対応する１７行〜３７行のうち、２０行〜２７行は変数「Class[i][c].members[m].math」に値「０」をセットする処理（ｃｄ４）を示す。また、２８行〜３６行は、変数「Class[i][c].members[m].eng」に値「０」をセットする処理（ｃｄ５）を示す。
【００５８】
また、コードｃｄ４に対応する２０行〜２７行のうち、２３行〜２５行は、構造体「Class[i][c]」のアドレスｐ１〜ｐ１４の算出工程を示す。具体的に、２３行は構造体「Class[0][0]」のアドレスｐ０の取得処理を、２４行は、アドレスｐ０から構造体「Class[i][c]」のアドレスｐ１〜ｐ１４までの差分アドレスの算出処理を示す。また、２５行は、アドレスｐ０と差分アドレスとの加算処理を示す。
【００５９】
同様にして、コードｃｄ５に対応する２８行〜３６行のうち、３１行〜３３行は、構造体「Class[i][c]」のアドレスｐ１〜ｐ１４の算出工程を示す。３１行〜３３行の処理の詳細は、２３行〜２５行と同様である。
【００６０】
次に、図３の最適化後ソースファイルｃｂ（図３）に対応するプログラムの命令を説明する。図５の右図の、２０行〜３４行の命令は第３のループ処理ｌｐ３を示す。また、１４行〜３２行の命令は第２のループ処理ｌｐ２を示し、１１行〜３３行の命令は第１のループ処理ｌｐ１を示す。
【００６１】
図３の例によると、第２のループ処理ｌｐ２は、ポインタ変数「members_p」に、変数「Class[i][c]」のアドレスをセットする処理（ｃｄ１２）を有する。第２のループ処理ｌｐ２に対応する１４行〜３２行のうち、１５行〜１７行はコードｃｄ１２の処理を示す。なお、１５行〜１７行の各処理は、図５の左図に示す、２３行〜２５行、及び、３１行〜３３行の処理と同様である。
【００６２】
また、第３のループ処理ｌｐ３に対応する２０行〜３４行のうち、２３行〜２７行は、変数「members_p->members[m].math」に値「０」をセットする処理（コードｃｄ１３）を示す。また、２８行〜３３行は、変数「members_p->members[m].eng」に値「０」をセットする処理（コードｃｄ１４）を示す。図５の左図によると、第３のループ処理ｌｐ３は、変数「Class[i][c]」のアドレスの算出工程（１５行〜１７行）を有しない。このように、コードｃｄ１３、ｃｄ１４の実行の度に、１５行〜１７行に示す３つの命令を省略可能になるため、処理サイクルを削減可能になる。
【００６３】
（サイクル数）
図６は、図１のソースファイルｃａに対応するプログラムの実行にかかるサイクル数と、図３の最適化後ソースファイルｃｂに対応するプログラムの実行にかかるサイクル数を表す図である。
【００６４】
初めに、図１のソースファイルｃａに対応するプログラムの実行にかかるサイクル数を説明する。図１のソースファイルｃａに対応するプログラムによると、例えば、第３のループ処理ｌｐ３の実行にかかるサイクル数は、１８サイクルである。また、第１のループ処理ｌｐ１のループ回数は２回、第２のループ処理ｌｐ２のループ回数は８回、第３のループ処理ｌｐ３のループ回数は４０回である。
【００６５】
したがって、図１のソースファイルｃａに対応するプログラムの実行にかかるサイクル数は、例えば、式「１３＋２＊｛４＋｛８＊（４＋（４０＊１８））｝｝」にしたがって算出した値「１１６０５Cycle」となる。
【００６６】
一方、図３のソースファイルｃｂに対応するプログラムによると、コードｃｄ１３、ｃｄ１４毎に、３命令分、処理が減少する。したがって、第３のループ処理ｌｐ３毎に、６命令文の処理が減少する。したがって、第３のループ処理ｌｐ３の実行にかかるサイクル数は、例えば、１２サイクルとなる。一方、第２のループ処理ｌｐ２毎に、３命令文の処理が増加する。
【００６７】
したがって、最適後のソースファイルｃａに対応するプログラムの実行にかかるサイクル数は、例えば、式「１３＋２＊｛４＋｛８＊（３＋（４＋（４０＊１２）））｝｝」にしたがって算出した値「７８１３Cycle」となる。このように、ソースコードの最適化処理によって、サイクル数は「０．６７３（≒７８１３／１１６０５）」となり、サイクル数が約６８％に減少する。
【００６８】
なお、図１、図３の例はメンバを有する構造体の例を示すが、本実施の形態における最適化処理は、メンバを有する配列に関しても有効である。配列に適用する例を、図２７、図２８にしたがって後述する。
【００６９】
次に、図７、図８にしたがって、本実施の形態における情報処理装置のハードウェア構成、及び、ソフトウェアブロック図を説明する。
【００７０】
［情報処理装置１００のハードウェア構成］
図７は、本実施の形態における情報処理装置（プログラムの最適化装置）１００のハードウェア構成図である。情報処理装置１００は、例えば、ＣＰＵ（Central Processing Unit：ＣＰＵ）１０１、メインメモリ２０１や補助記憶装置１１１等を備えるメモリ１０２、通信インタフェース部１０３、外部インタフェース部１０４を有する。各部は、バス１０６を介して相互に接続する。
【００７１】
ＣＰＵ１０１は、バス１０６を介してメモリ１０２等と接続するとともに、情報処理装置１００全体の制御を行う。通信インタフェース部１０３は、インターネット等を介して、他の機器（図示せず）と接続し、ネットワークに対するアクセスを行う。ＲＡＭ（Random Access Memory：ＲＡＭ）等を示すメインメモリ２０１は、ＣＰＵ１０１が処理を行うデータ等を記憶する。また、外部インタフェース部１０４は、ストレージ装置ＳＤ等と接続する。
【００７２】
補助記憶装置１１１は、ＣＰＵ１０１が実行するオペレーションシステムのプログラムを格納する領域（図示せず）を備える。また、補助記憶装置１１１は、コンパイルプログラム格納領域１２０、テーブル群格納領域１３０を備える。また、補助記憶装置１１１は、ソースファイル格納領域ｃａ、最適化後ソースファイル格納領域ｃｂ、オブジェクトファイル格納領域ｏｂを有する。補助記憶装置１１１は、ＨＤＤ（Hard disk drive：ＨＤＤ）、不揮発性半導体メモリ等を示す。
【００７３】
コンパイルプログラム格納領域１２０のコンパイルプログラム（以下、コンパイルプログラム１２０と称する）は、ＣＰＵ１０１の実行によって、コンパイルプログラム（最適化プログラム）１２０の処理を実現する。テーブル群格納領域１３０のテーブル群（以下、テーブル群１３０と称する）は、コンパイルプログラム１２０が生成するテーブルである。テーブル群１３０が有する各テーブルは、図８にしたがって後述する。
【００７４】
ソースファイル格納領域ｃａのソースファイル（以下、ソースファイルｃａと称する）は、コンパイルプログラム１２０の入力となるファイルであって、最適化処理の対象となるソースファイルｃａを示す。最適化後ソースファイル格納領域ｃｂの最適化後ソースファイル（以下、最適化後ソースファイルｃｂと称する）は、コンパイルプログラム１２０が最適化処理を行って生成するファイルであって、コンパイル対象となるファイルを示す。
【００７５】
オブジェクトファイル格納領域ｏｂのオブジェクトファイル（以下、オブジェクトファイルｏｂと称する）は、コンパイルプログラム１２０が、最適化後ソースファイルｃｂを入力としてコンパイル処理を行って生成するファイルを示す。
【００７６】
［情報処理装置１００のソフトウェアブロック］
図８は、図７に示したコンパイルプログラム１２０のソフトウェアブロックの構成図である。コンパイルプログラム１２０は、最適化モジュール１２１と、コンパイルモジュール１２５とを有する。最適化モジュール１２１は、例えば、検出モジュール１２２、構造体解析モジュール１２３、コード修正モジュール１２４を有する。
【００７７】
最適化モジュール１２１は、ソースファイルｃａを入力として、最適化後ソースファイルｃｂを生成する。また、最適化モジュール１２１は、テーブル群１３０（図７）を生成する。コンパイルモジュール１２５は、最適化後ソースファイルｃｂを入力としてコンパイル処理を行い、オブジェクトファイルｏｂを生成する。
【００７８】
また、テーブル群１３０は、ループ文検知テーブル１３１、構造体検知テーブル１３２、最適化構造体テーブル１３３、変更最適化構造体テーブル１３４を有する。
【００７９】
ループ文検知テーブル１３１は、ソースファイルｃａに記述されたソースコード内のループ処理の情報を保持するテーブルである。ループ文検知テーブル１３１の詳細は、図１１にしたがって後述する。構造体検知テーブル１３２は、ループ処理内でアクセス対象となるメンバを有する構造体の構成に関する情報を有するテーブルである。構造体検知テーブル１３２の詳細は、図１３にしたがって後述する。
【００８０】
最適化構造体テーブル１３３は、構造体検知テーブル１３２に記憶された構造体のアドレスの、ループ処理毎の値の変更の有無に関する情報を、構造体の階層毎に有するテーブルである。最適化構造体テーブル１３３の詳細は、図１５にしたがって後述する。変更最適化構造体テーブル１３４は、構造体検知テーブル１３２に格納された構造体の、ポインタ変数に関する情報を有するテーブルである。変更最適化構造体テーブル１３４の詳細は、図１８にしたがって後述する。
【００８１】
検出モジュール１２２は、ソースファイルｃａを入力として、ソースファイルｃａに記述されたコードのうちループ処理に対応するコードを検出し、ループ文検知テーブル１３１に記憶する。また、検出モジュール１２２は、ループ文検知テーブル１３１を参照し、構造体の構成を解析し、構造体の構成に関する情報を構造体検知テーブル１３２を生成する。構造体解析モジュール１２３は、構造体検知テーブル１３２を参照し、検出した構造体の、ループ処理内のアクセス処理を解析し、最適化構造体テーブル１３３を生成する。
【００８２】
コード修正モジュール１２４は、最適化構造体テーブル１３３を参照して、ポインタ変数にセットする構造体の型に基づいてポインタ変数の名前を生成し、変更最適化構造体テーブル１３４に記憶する。また、コード修正モジュール１２４は、ソースファイルｃａを複写し最適化後ソースファイルｃｂを生成するとともに、変更最適化構造体テーブル１３４を参照し、最適化後ソースファイルｃｂのソースコードを修正する。
【００８３】
［コンパイルプログラム１２０の処理の流れ］
次に、図９のフローチャート図にしたがって、図８で説明したコンパイルプログラム１２０の処理の詳細を説明する。
【００８４】
図９は、図８で説明したコンパイルプログラム１２０の処理の詳細を説明するフローチャート図である。
【００８５】
Ｓ２１：検出モジュール１２２は、ソースファイルｃａを入力として、ループ文及び構造体の検知処理を行う。また、構造体解析モジュール１２３は、構造体検知テーブル１３２を参照し、構造体の構成の解析処理を行う。工程Ｓ２１の処理の詳細は、図１０〜図１５にしたがって後述する。
【００８６】
具体的に、図８で前述したとおり、検出モジュール１２２は、ループ処理に対応するコードを検出し、ループ文検知テーブル１３１に記憶する。また、検出モジュール１２２は、ループ処理に対応するコードに、構造体のメンバへのアクセス処理が含まれている場合に、構造体検知テーブル１３２に記憶する。また、構造体解析モジュール１２３は、構造体検知テーブル１３２を参照して構造体の構成の解析処理を行い、最適化構造体テーブル１３３に記憶する。
【００８７】
Ｓ２２：コード修正モジュール１２４は、構造体の解析結果に基づいて、ポインタ変数の型を決定し、最適化後ソースファイルｃｂに対するコードの修正処理を行う。工程Ｓ２２の処理の詳細は、図１６にしたがって後述する。
【００８８】
具体的に、コード修正モジュール１２４は、最適化構造体テーブル１３３を参照し、ループ処理の度にアドレスが変化しない構造体または配列のアドレスを、ポインタ変数にセットする。つまり、コード修正モジュール１２４は、メンバを有する構造体（配列）のアドレスが、ループ処理の外で一定である場合に、当該構造体のアドレスのセットをループ処理の外に移動する。これにより、コード修正モジュール１２４は、ループ処理の外でアドレスに変更が生じない構造体（配列）を適切に検出することができる。
【００８９】
また、コード修正モジュール１２４は、ポインタ変数の名前を決定し、決定したポインタ変数の名前を、変更最適化構造体テーブル１３４に記憶する。また、コード修正モジュール１２４は、ポインタ変数の名前に基づいて、最適化後ソースファイルｃｂに対し、コードの挿入、及び、コードの置換処理を行う。コード修正モジュール１２４は、コードの挿入、及び、置換にしたがって、検出した構造体（配列）のアドレスの演算処理をループ処理の外に移動する。
【００９０】
Ｓ２３：コンパイルモジュール１２５は、最適化後ソースファイルｃｂを入力としてコンパイル処理を行い、オブジェクトファイルｏｂを生成する。また、図示していないが、リンカモジュールは、１つまたは複数のオブジェクトファイルｏｂを入力として、実行プログラムを生成する。
【００９１】
なお、本実施の形態における最適化処理の実行の可否を、ユーザに選択可能にしてもよい。これにより、デバッグ時に開発者の意図するデバッグ処理を可能にし、デバッグの完了後に、最適化処理を行うことで、開発効率を低下させずに性能を向上させることが可能になる。
【００９２】
（工程Ｓ２１の処理）
図１０は、図９で説明した工程Ｓ２１の処理の詳細を説明する第１のフローチャート図である。
【００９３】
Ｓ３１：検出モジュール１２２は、ソースファイルｃａから、コードを１行読み出す。
【００９４】
Ｓ３２：検出モジュール１２２は、ソースファイルｃａの末尾（End Of File：ＥＯＦ）を検知したか否かを判定する。ソースファイルｃａの末尾を検知した場合（Ｓ３２のＹｅｓ）、検出モジュール１２２は、処理Ａ１に遷移する。処理Ａ１は、図１２のフローチャート図で後述する。
【００９５】
Ｓ３３：ソースファイルｃａの末尾を検知しない場合（Ｓ３２のＮｏ）、検出モジュール１２２は、読み出したコードが、ｆｏｒ文を含んでいるか否かを判定する。ｆｏｒ文を含んでいない場合（Ｓ３３のＮｏ）、検出モジュール１２２は、工程Ｓ３１の処理に遷移し、再び、ソースファイルｃａから、コードを１行読み出す。
【００９６】
Ｓ３４：一方、読み出したコードがｆｏｒ文を含む場合（Ｓ３３のＹｅｓ）、検出モジュール１２２は、読み出したコードをループ文検知テーブル１３１に書き込む。ループ文検知テーブル１３１については、図１１にしたがって後述する。
【００９７】
Ｓ３５：検出モジュール１２２は、ｆｏｒ文の検出に応答して、ループ階層（ネスト）を示すカウンタを、カウントアップする。
【００９８】
Ｓ３６：検出モジュール１２２は、ソースファイルｃａから、さらに、コードを１行読み出す。
【００９９】
Ｓ３７：検出モジュール１２２は、読み出したコードがｆｏｒ文を含むか否かを判定する。読み出したコードがｆｏｒ文を含む場合（Ｓ３７のＹｅｓ）、検出モジュール１２２は、工程Ｓ３４の処理に遷移し、読み出したコードを、ループ文検知テーブル１３１に書き込む。
【０１００】
Ｓ３８：一方、読み出したコードがｆｏｒ文を含んでいない場合（Ｓ３７のＮｏ）、検出モジュール１２２は、読み出したコードが文字”｝”を含み、ループ階層の数に対応した文字”｝”を検出したか否かを判定する。
【０１０１】
Ｓ３９：読み出したコードが文字”｝”を含んでいない場合（Ｓ３８のＮｏ）、または、文字”｝”を含むものの、ループ階層の数に対応した文字”｝”を検出していない場合（Ｓ３８のＮｏ）、検出モジュール１２２は、読み出したコードをループ文検知テーブル１３１に書き込む。そして、検出モジュール１２２は、工程Ｓ３６に遷移し、ソースファイルｃａから、さらに、コードを１行読み出す。
【０１０２】
一方、読み出したコードが文字”｝”を含み、ループ階層の数に対応した文字”｝”を検出した場合（Ｓ３８のＹｅｓ）、検出モジュール１２２は、処理Ａ２に遷移する。処理Ａ２は、図１２のフローチャート図で後述する。
【０１０３】
（ループ文検知テーブル１３１）
図１１は、ループ文検知テーブル１３１の一例を示す図である。ループ文検知テーブル１３１は、例えば、項目「ＮＯ」、項目「ループ構成」、項目「ループ内変数」、項目「値」、項目「コードカウンタ」を有する。項目「ＮＯ」は、各コードの識別情報を示す。
【０１０４】
項目「ループ構成」は、ソースファイルｃａから読み出した、ｆｏｒ文に対応するコードを示す。ｆｏｒ文に対応するコードは、ｆｏｒ文から文字”｝”までのコードを示す。図１１に示すように、ｆｏｒ文が多階層のループ処理である場合、ループ文検知テーブル１３１は、多階層のループ処理に対応するコードを有する。
【０１０５】
項目「ループ内変数」はｆｏｒ文のカウンタ変数の名前を示し、項目「値」はカウンタ変数の条件継続式（例えば、「i < 2」）における最大値を有する。したがって、第１のループ処理ｌｐ１のカウンタ変数は、変数「ｉ」であって値は「２」である。同様にして、第２のループ処理ｌｐ２のカウンタ変数は、変数「ｃ」であって値は「８」であり、第３のループ処理ｌｐ３のカウンタ変数は、変数「ｍ」であって値は「４０」である。
【０１０６】
また、項目「コードカウンタ」は、ｆｏｒ文内の、構造体のメンバへのアクセス処理を行うコードの数を示す。図１１の例によると、第３のループ処理ｌｐ３は、構造体のメンバへのアクセス処理を行うコードを２つ有する。したがって、第３のループ処理ｌｐ３に対応するコードカウンタは、値「２」となる。
【０１０７】
図１２は、図９で説明した工程Ｓ２１の処理を説明する第２のフローチャート図である。
【０１０８】
Ｓ４１：検出モジュール１２２は、図１０のフローチャート図の処理Ａ２として、ループ文検知テーブル１３１（図１１）を読み出す。
【０１０９】
Ｓ４２：検出モジュール１２２は、ループ文検知テーブル１３１の項目「ループ構成」から、文字”．”を検出したか否かを判定する。
【０１１０】
Ｓ４３：文字”．”を検知した場合（Ｓ４２のＹｅｓ）、ループ処理内に、構造体のメンバへのアクセス処理を行うコードが存在することを示す。したがって、検出モジュール１２２は、コードカウンタをインクリメントし、ループ文検知テーブル１３１に記憶する。具体的に、図１１のループ文検知テーブル１３１によると、検出モジュール１２２は、文字”．”を含む、コード「Class[i][c].members[m].math=0;」及びコード「Class[i][c].members[m].eng=0;」を検出するため、コードカウンタを値「２」に設定する。
【０１１１】
一方、文字”．”を検知しない場合（Ｓ４２のＮｏ）、ループ処理内に、構造体のメンバへのアクセス処理を行うコードが存在しないことを示す。したがって、検出モジュール１２２は、図１０のフローチャート図の処理Ａ３に遷移し、ソースファイルｃａからコードを１行読み出す。これにより、検出モジュール１２２は、別のループ処理を検出し、ループ文検知テーブル１３１に記憶する。
【０１１２】
Ｓ４４：検出モジュール１２２は、検出したコードから文字”．”を抽出することによって、構造体を分解する。そして、検出モジュール１２２は、分解した構造体の構成を、構造体検知テーブル１３２に記憶する。構造体検知テーブル１３２の詳細は、図１３にしたがって後述する。
【０１１３】
図１１のループ文検知テーブル１３１によると、検出モジュール１２２は、コード「Class[i][c].members[m].math=0;」に基づいて、構造体「Class[i][c]」、構造体「members[m]」と、メンバ「math」に分解し、構造体検知テーブル１３２に記憶する。同様にして、検出モジュール１２２は、コード「Class[i][c].members[m].eng=0;」に基づいて、構造体「Class[i][c]」、構造体「members[m]」と、メンバ「eng」に分解し、構造体検知テーブル１３２に記憶する。
【０１１４】
構造体を分解すると、検出モジュール１２２は、図１０のフローチャート図の処理Ａ３に遷移してソースファイルｃａからコードを１行読み出し、別のループ処理を検出する。
【０１１５】
Ｓ４５：また、検出モジュール１２２は、図１０のフローチャート図の処理Ａ１として、コードカウンタが値「１」以上のループ処理の、総ループ回数が閾値を超えるか否かを判定する。即ち、検出モジュール１２２は、ソースファイルｃａの末尾を検知した場合（図１０のＳ３２のＹｅｓ）、第３のループ処理ｌｐ３の総ループ回数が閾値を超えるか否かを判定する。閾値は、検証等にしたがって予め設定される値である。本実施の形態において、閾値は、例えば、値「１０」である。
【０１１６】
ループが多階層のループである場合、即ち、対象のループ処理ｌｐ３が別のループ処理ｌｐ２に含まれる場合、総ループ回数は、ループ処理ｌｐ３の第１のループ回数と、別のループ処理ｌｐ２の第２のループ回数との積を示す。例えば、図１の例によると、第３のループ処理ｌｐ３の総ループ回数は、値「６４０（＝２×８×４０）」である。
【０１１７】
Ｓ４６：総ループ回数が閾値を超える場合（Ｓ４５のＹｅｓ）、構造体解析モジュール１２３は、図１４に後述する、構造体解析処理を行う。一方、総ループ回数が閾値を超えない場合（Ｓ４５のＮｏ）、構造体解析モジュール１２３は、構造体解析処理を行わない。即ち、構造体解析モジュール１２３は、総ループ回数が閾値を超えないループ処理に関しては、最適化処理の対象としない。
【０１１８】
総ループ回数が閾値を超えない場合（Ｓ４５のＮｏ）、ループ処理が、構造体のメンバに対するアクセス処理を含んでいてもアクセス処理の回数は多くないため、アドレスの演算処理の回数も多くない。したがって、構造体のアドレスの演算処理を、ループ処理の外に遷移したとしても、サイクル数の削減率が大きくならない場合がある。
【０１１９】
したがって、本実施の形態における検出モジュール１２２は、総ループ回数が所定値を超えるループ処理内でアクセス対象となる、メンバを有する構造体または配列を検出する。つまり、検出モジュール１２２は、総ループ回数が閾値を超えないループ処理に含まれるアクセス処理を、最適化対象外にすることにより、サイクル数を大幅に向上可能にする構造体または配列を検出できる。
【０１２０】
（構造体検知テーブル１３２）
図１３は、構造体検知テーブル１３２の一例を示す図である。構造体検知テーブル１３２は、例えば、項目「ＮＯ」、項目「ループ構成」、項目「多次元階層」を有する。項目「ＮＯ」は、図１１のループ文検知テーブル１３１で説明したとおりである。
【０１２１】
図１３に示す構造体検知テーブル１３２における項目「ループ構成」は、さらに、構造体の階層を示す項目「Ｓ１」「Ｓ２」「Ｓ３」を有する。
【０１２２】
図１２のフローチャート図の工程Ｓ４４で前述したとおり、構造体検知テーブル１３２は、コード「Class[i][c].members[m].math=0;」に基づいて、値「Class[i][c]」（Ｓ１）、値「members[m]」（Ｓ２）、値「math」（Ｓ３）を有する。同様にして、構造体検知テーブル１３２は、コード「Class[i][c].members[m].eng=0;」に基づいて、値「Class[i][c]」（Ｓ１）、値「members[m]」（Ｓ２）、値「eng」（Ｓ３）を有する。
【０１２３】
また、項目「多次元階層」は、構造体の階層を示す。例えば、構造体「Class[i][c]」は、二次元構造体である。したがって、各コードに対応する項目「多次元階層」の値は、値「２」である。
【０１２４】
（Ｓ４６：構造体解析処理）
図１４は、図１２で説明した工程Ｓ４６の構造体解析処理を説明するフローチャート図である。
【０１２５】
Ｓ５１：構造体解析モジュール１２３は、ループ文検知テーブル１３１が有する、対象のループ処理のコードカウンタ分、工程Ｓ５２〜Ｓ５９の処理を行う。つまり、構造体解析モジュール１２３は、図１３の構造体検知テーブル１３２によると、ＮＯ「７」、ＮＯ「８」に関して、工程Ｓ５２〜Ｓ５９の処理を行う。
【０１２６】
Ｓ５２：構造体解析モジュール１２３は、構造体検知テーブル１３２が有する、多次元階層分、工程Ｓ５３〜Ｓ５８の処理を行う。つまり、構造体解析モジュール１２３は、図１３の構造体検知テーブル１３２によると、各ＮＯを対象として、工程Ｓ５３〜Ｓ５８の処理を２回ずつ行う。
【０１２７】
Ｓ５３：構造体解析モジュール１２３は、ループ文検知テーブル１３１を参照し、項目「ループ構成」の情報を読み出す。
【０１２８】
Ｓ５４：構造体解析モジュール１２３は、構造体検知テーブル１３２の項目「ループ構成」（Ｓ１〜Ｓ３）のうち、構造体の最下層の添え字を取得する。図１３の構造体検知テーブル１３２によると、構造体解析モジュール１２３は、値「members[m]」の添え字「m」を取得する。
【０１２９】
Ｓ５５：構造体解析モジュール１２３は、添え字に文字”=”を付与し、ループ文検知テーブル１３１の項目「ループ構成」の対象のループ処理から、コード「添え字＋”=”」を検索する。即ち、構造体解析モジュール１２３は、コード「m=」を検索する。なお、コード「m=」は、コード「m++」やコード「m--」を含む。
【０１３０】
Ｓ５６：構造体解析モジュール１２３は、文字列「添え字＋”=”」を検出したか否かを判定する。
【０１３１】
Ｓ５７：検出しなかった場合（Ｓ５６のＮｏ）、対象のループ処理内で、変数「m」の値が変化しないことを示す。したがって、構造体解析モジュール１２３は、最適化構造体テーブル１３３のポインタフラグに値「０（Constant：一定）」を記憶する。そして、構造体解析モジュール１２３は、工程Ｓ５３の遷移し、次の上位の階層の情報を読み出す。
【０１３２】
Ｓ５８：一方、文字列「添え字＋”=”」を検出した場合（Ｓ５６のＹｅｓ）、対象のループ処理内で、変数「m」の値が変化することを示す。したがって、構造体解析モジュール１２３は、最適化構造体テーブル１３３のポインタフラグに値「１（Variable：変化）」を記憶する。
【０１３３】
図１１のループ文検知テーブル１３１の例によると、第３のループ処理ｌｐ３は、コード「m++」を含む。したがって、構造体解析モジュール１２３は、最適化構造体テーブル１３３の、値「members[m]」に対応する階層Ｓ２のポインタフラグに値「１」を記憶する。
【０１３４】
Ｓ５９：多次元階層分、ループ処理を行うと、構造体解析モジュール１２３は、工程Ｓ６０に遷移する。
【０１３５】
したがって、構造体解析モジュール１２３は、コード「c=」を検索する。第３のループ処理ｌｐ３は、コード「c++」を含まない。同様にして、構造体解析モジュール１２３は、コード「i=」を検索するが、第３のループ処理ｌｐ３はコード「i++」を含まない。したがって、構造体解析モジュール１２３は、最適化構造体テーブル１３３の、値「Class[i][c]」に対応する階層Ｓ１のポインタフラグに値「０」を記憶する。
【０１３６】
Ｓ６０：コードカウンタの値分、ループ処理を行うと、構造体解析モジュール１２３は、処理を終了する。図１３の構造体検知テーブル１３２の例によると、構造体解析モジュール１２３は、構造体検知テーブル１３２のＮＯ「８」に関しても同様の処理を行い、同様のポインタフラグをセットする。
【０１３７】
（最適化構造体テーブル１３３）
図１５は、最適化構造体テーブル１３３の一例を示す図である。最適化構造体テーブル１３３は、例えば、項目「ＮＯ」、項目「ポインタフラグ」を有する。項目「ＮＯ」は、図１１のループ文検知テーブル１３１で説明したとおりである。
【０１３８】
項目「ポインタフラグ」は、各階層（Ｓ１〜Ｓ３）の構造体のアドレスが、対象のループ処理毎に変化するか否かを示すフラグである。項目「ポインタフラグ」は、ポインタフラグが値「０（Constant）」である場合、ループ処理の度に、当該階層の構造体のアドレスが変化しないことを示す。一方、ポインタフラグが値「１（Variable）」である場合、ループ処理の度に、当該階層の構造体のアドレスが変化することを示す。
【０１３９】
図１４の工程Ｓ５８で前述したとおり、値「Class[i][c]」は第３のループ処理ｌｐ３毎に変化しないため、項目「Ｓ１」は値「０（Constant）」を有する。また、値「members[m]」）は、第３のループ処理ｌｐ３毎に変化するため、項目「Ｓ２」は値「１（Variable）」を有する。
【０１４０】
（工程Ｓ２２）
図１６は、図９で説明した工程Ｓ２２の処理を説明するフローチャート図である。
【０１４１】
Ｓ１０１：コード修正モジュール１２４は、最適化構造体テーブル１３３を参照して検出した構造体の型を検出し、ポインタ変数の名前を決定する。そして、コード修正モジュール１２４は決定したポインタ変数の名前を、変更最適化構造体テーブル１３４に記憶する。工程Ｓ１０１の処理の詳細は、図１７のフローチャート図にしたがって後述する。
【０１４２】
Ｓ１０２：コード修正モジュール１２４は、変更最適化構造体テーブル１３４を参照してポインタ変数の名前を取得し、ポインタ変数を宣言するコードを、最適化後ソースファイルｃｂに挿入する。工程Ｓ１０２の処理の詳細は、図１９のフローチャート図にしたがって後述する。
【０１４３】
Ｓ１０３：コード修正モジュール１２４は、ポインタ変数に、構造体のアドレスをセットするコードを、最適化後ソースファイルｃｂにおける対象のループ処理前に挿入する。工程Ｓ１０３の処理の詳細は、図２０のフローチャート図にしたがって後述する。
【０１４４】
Ｓ１０４：コード修正モジュール１２４は、最適化後ソースファイルｃｂにおける、対象のループ処理内の、メンバにアクセスするコードを、ポインタ変数に基づいてアクセスするコードに置換する。工程Ｓ１０４の処理の詳細は、図２１のフローチャート図にしたがって後述する。
【０１４５】
（工程Ｓ１０１の処理）
図１７は、図１６で説明した工程Ｓ１０１の処理の詳細を説明するフローチャート図である。
【０１４６】
Ｓ６１：コード修正モジュール１２４は、ソースファイルｃａを複写して、最適化後ソースファイルｃｂを生成する。
【０１４７】
Ｓ６２：コード修正モジュール１２４は、ループ文検知テーブル１３１のコードカウンタ分、工程Ｓ６３〜Ｓ６７の処理を行う。つまり、コード修正モジュール１２４は、構造体検知テーブル１３２のＮＯ「７」、ＮＯ「８」に関して、工程Ｓ６３〜Ｓ６７の処理を行う。
【０１４８】
Ｓ６３：コード修正モジュール１２４は、構造体検知テーブル１３２、及び、最適化構造体テーブル１３３を読み出す。
【０１４９】
Ｓ６４：コード修正モジュール１２４は、最適化構造体テーブル１３３を参照し、ポインタフラグが値「０（Constant）」の階層があるか否かを検索する。
【０１５０】
Ｓ６５：ポインタフラグが値「０」の階層を検出した場合（Ｓ６４のＹｅｓ）、コード修正モジュール１２４は、ポインタフラグが値「１（Variable）」の階層の上位の構造体であって、ポインタフラグが値「０」の階層の構造体（配列）を抽出する。
【０１５１】
図１５の最適化構造体テーブル１３３によると、階層「Ｓ１」のポインタフラグが値「０」であって、階層「Ｓ２」のポインタフラグが値「１」である。したがって、コード修正モジュール１２４は、構造体検知テーブル１３２を参照し、階層「Ｓ１」の構造体を示す値「Class[i][c]」を抽出する。
【０１５２】
このように、コード修正モジュール１２４は、ポインタフラグが値「０（Constant）」の階層の、構造体（配列）のアドレスがあるか否かを判定する。これにより、コード修正モジュール１２４は、ループ処理ｌｐ３内でアドレスが変化しない、構造体（配列）のアドレス（この例では、値「Class[i][c]」のアドレス）を抽出する。つまり、コード修正モジュール１２４は、ループ処理ｌｐ３の度に、アドレスが変化しない構造体または配列のアドレスを、適切に検出できる。
【０１５３】
Ｓ６６：一方、ポインタフラグが値「０」の階層を検出しない場合（Ｓ６４のＮｏ）、ループ処理ｌｐ３内で、アドレスが変化しない、構造体（配列）のアドレスが存在しないことを示す。したがって、コード修正モジュール１２４は、対象のＮＯのコードを最適化の対象外とする。
【０１５４】
Ｓ６７：コード修正モジュール１２４は、検出した構造体の型をソースコードから検索する。コード修正モジュール１２４は、ソースコードから、検出した構造体の変数を宣言しているコードを検出することによって、構造体の型（タグ名）を取得する。そして、コード修正モジュール１２４は、取得したタグ名に、"_p"を付与したポインタ変数を生成し、変更最適化構造体テーブル１３４に記憶する。
【０１５５】
図１のソースコードによると、値「Class[i][c]」の宣言を行うコードは、コード「struct members Class[2][8];」である。したがって、コード修正モジュール１２４は、値「Class[i][c]」の型がmembers型であることを検出し、検出した型の名前「members」に"_p"を付与したポインタ変数の名前を生成する。これにより、コード修正モジュール１２４は、ポインタ変数の名前「members_p」を生成し、変更最適化構造体テーブル１３４に更新する。
【０１５６】
Ｓ６８：コードカウンタの値分、ループ処理を行うと、工程Ｓ１０１の処理を終了する。
【０１５７】
（変更最適化構造体テーブル１３４）
図１８は、変更最適化構造体テーブル１３４の一例を示す図である。変更最適化構造体テーブル１３４は、構造体検知テーブル１３２（図１３）と同様にして、例えば、項目「ＮＯ」、項目「ループ構成」、項目「多次元階層」を有する。
【０１５８】
図１８に示す変更最適化構造体テーブル１３４は、図１３の構造体検知テーブル１３２に対して、ポインタ変数の名前を有する。図１７のフローチャート図の工程Ｓ６７で説明したとおり、変更最適化構造体テーブル１３４は、値「Class[i][c]」の代わりに、ポインタ変数の名前「members_p」を有する。
【０１５９】
（工程Ｓ１０２の処理）
図１９は、図１６で説明した工程Ｓ１０２の処理の詳細を説明するフローチャート図である。
【０１６０】
Ｓ７１：コード修正モジュール１２４は、ループ文検知テーブル１３１のコードカウンタ分、工程Ｓ７２〜Ｓ７４の処理を行う。
【０１６１】
Ｓ７２：コード修正モジュール１２４は、変更最適化構造体テーブル１３４を読み出す。
【０１６２】
Ｓ７３：コード修正モジュール１２４は、変更最適化構造体テーブル１３４が保持するポインタ変数名を取得する。つまり、コード修正モジュール１２４は、ポインタ変数の名前「members_p」を取得する。
【０１６３】
Ｓ７４：コード修正モジュール１２４は、変換後構造体テーブルのポインタ変数と、構造体のタグ名に基づいて、ポインタ変数を宣言するコードｃｄ１１を生成し、最適化後ソースファイルｃｂに書き込む。
【０１６４】
具体的に、コード修正モジュール１２４は、検出した型の名前「members」に"_t"を付与したタグ名を生成する。そして、コード修正モジュール１２４は、「”タグ名” *restrict “ポインタ変数”;」に基づくコード「members_t  *restrict  members_p;」ｃｄ１１を生成し、最適化後ソースファイルｃｂに書き込む。
【０１６５】
Ｓ７５：コードカウンタの値分、ループ処理を行うと、工程Ｓ１０２の処理を終了する。
【０１６６】
（工程Ｓ１０３の処理）
図２０は、図１６で説明した工程Ｓ１０３の処理の詳細を説明するフローチャート図である。
【０１６７】
Ｓ８１：コード修正モジュール１２４は、生成したポインタ変数に、構造体検知テーブル１３２の対応する構造体または配列のアドレスをセットするコードｃｄ１２を生成する。
【０１６８】
図１５の最適化構造体テーブル１３３によると、コード修正モジュール１２４は、階層「Ｓ２」の上位の階層「Ｓ１」の構造体の変数名「Class[i][c]」を抽出する。そして、コード修正モジュール１２４は、抽出した構造体「Class[i][c]」のアドレスを、ポインタ変数「members_p」にセットするコードｃｄ１２を生成する。
【０１６９】
Ｓ８２：コード修正モジュール１２４は、アクセス処理を有するループ処理がネストループに含まれるループ処理であるか否かを判定する。
【０１７０】
Ｓ８３：ネストループに含まれる場合（Ｓ８２のＹｅｓ）、コード修正モジュール１２４は、上位のループ処理内で、ポインタ変数にセットしたアドレスが変化するか否かを判定する。つまり、コード修正モジュール１２４は、第２のループ処理ｌｐ２内で、アドレス「& Class[i][c]」が変化するか否かを判定する。
【０１７１】
Ｓ８４：上位のループ処理でアドレスが変化する場合（Ｓ８３のＹｅｓ）、コード修正モジュール１２４は、アクセス処理を含むループ処理の前であって、上位のループ処理内に、コードｃｄ１２を挿入する。
【０１７２】
図１のソースコードによると、アドレス「& Class[i][c]」は、第２のループ処理ｌｐ２内で変化する。したがって、コード修正モジュール１２４は、図３に示すように、コードｃｄ１２を、アクセス処理を含む第３のループ処理ｌｐ３の前であって、第２のループ処理ｌｐ２内に挿入する。
【０１７３】
Ｓ８５：一方、上位のループ処理でアドレスが変化しない場合（Ｓ８３のＮｏ）、アクセス処理を含むループ処理の前であって、上位のループ処理の前に、コードｃｄ１２を挿入する。
【０１７４】
図２５、図２６にしたがって後述するが、例えば、アドレス「& Class[i][c]」が第２のループ処理ｌｐ２内で変化しない場合、コード修正モジュール１２４は、コードｃｄ１２を、第２、第３のループ処理ｌｐ２、ｌｐ３の前に挿入する。
【０１７５】
第１のループ処理ｌｐ１のループ回数は、第２のループ処理ｌｐ２のループ回数に対して少ない。したがって、アドレスの演算処理を行うコードｃｄ１２を、さらに、第２のループ処理ｌｐ２の外に移動することにより、アドレスｐ１〜ｐ１４の演算処理の回数をさらに削減可能になる。
【０１７６】
このように、コード修正モジュール１２４は、ループ処理が別のループ処理に含まれ、当該別のループ処理内で構造体または配列のアドレスが変化する場合に、第１、第２のコードｃｄ１１、ｃｄ１２を、ループ処理の前であって別のループ処理内に挿入する。また、コード修正モジュール１２４は、別のループ処理内でアドレスが変化しない場合に、第１、第２のコードｃｄ１１、ｃｄ１２を、ループ処理及び別のループ処理の前に挿入する。これにより、コード修正モジュール１２４は、最適化後のソースコードに対応するプログラムのサイクル数を、さらに、削減できる。
【０１７７】
Ｓ８６：一方、ネストループに含まれない場合（Ｓ８２のＮｏ）、コード修正モジュール１２４は、アクセス処理を含むループ処理の前に、生成したコードを挿入する。即ち、コード修正モジュール１２４は、コードｃｄ１２を、アクセス処理を含む第３のループ処理ｌｐ３の前に挿入する。
【０１７８】
（工程Ｓ１０４の処理）
図２１は、図１６で説明した工程Ｓ１０４の処理の詳細を説明するフローチャート図である。
【０１７９】
Ｓ９１：コード修正モジュール１２４は、ループ文検知テーブル１３１のコードカウンタ分、工程Ｓ９２〜Ｓ９４の処理を行う。
【０１８０】
Ｓ９２：コード修正モジュール１２４は、最適化後のソースコードから、対象ループ処理内の、ポインタ変数にアドレスをセットした構造体または配列にアクセスするコードを検出する。即ち、コード修正モジュール１２４は、置換対象のアクセス処理のコードを検出する。具体的に、コード修正モジュール１２４は、ＮＯ「７」に関して、コード「Class[i][c].members[m].math=0;」を検出する。また、コード修正モジュール１２４は、ＮＯ「８」に関して、コード「Class[i][c].members[m].eng=0;」を検出する。
【０１８１】
Ｓ９３：コード修正モジュール１２４は、生成したポインタ変数に”->”を付加する。つまり、コード修正モジュール１２４は、コード「p_members->」を生成する。
【０１８２】
Ｓ９４：コード修正モジュール１２４は、最適化後ソースファイルｃｂの、工程Ｓ９２で検出したコードに関して、文字列「”構造体または配列の値”＋"."」を、コード「p_members->」に置換する。
【０１８３】
Ｓ９５：コード修正モジュール１２４は、コードカウンタの値分、ループ処理を行うと、コード修正モジュール１２４は、工程Ｓ９６に遷移する。
【０１８４】
Ｓ９６：コード修正モジュール１２４は、修正した最適化後ソースファイルｃｂを補助記憶装置１１１等に記憶する。
【０１８５】
［別のソースコードの例１］
図２２は、別の最適化対象のソースコードを含むソースファイルｃａ−１の例を示す図である。図１は、アクセス対象のメンバ「Class[i][c].members[m].math」、「Class[i][c].members[m].eng」のアドレスが、第３のループ処理ｌｐ３の毎に変化する場合を例示した。これに対し、図２２のソースファイルｃａ−１は、アクセス対象のメンバのアドレスが、第３のループ処理ｌｐ３の毎に変化しない例を示す。
【０１８６】
図２２は、図１のソースコードに対して、コードｃｄ２１〜ｃｄ２３が異なる。コードｃｄ２１は、変数「temp」に値「０」をセットする処理を示す。図２２の例において、変数「temp」の値は固定値「０」である。したがって、第３のループ処理ｌｐ３の度に、値「members[temp]」のアドレスが変化しない。コードｃｄ２３についても同様である。
【０１８７】
図２３は、本実施の形態における情報処理装置が、図２２に示すソースファイルｃａ−１を最適化した後の、ソースファイルｃｂ−１の例を示す。情報処理装置１００は、コードｃｄ３１、ｃｄ３２をソースコードに挿入するともに、コードｃｄ２２、ｃｄ２３（図２２）を、コードｃｄ３３、ｃｄ３４に置換する。コードｃｄ３１、ｃｄ３２は、図３の例と同様である。
【０１８８】
コードｃｄ３３、ｃｄ３４は、ポインタ変数「members_p」に基づいて、メンバ「members[temp].math」「members[temp].eng」にアクセスするコードである。図３の例と同様にして、図２３に示すソースコードによると、コードｃｄ３３、ｃｄ３４は、変数「Class[i][c]」のアドレスｐ１〜ｐ１４の算出工程を有しない。したがって、第３のループ処理ｌｐ３における、アドレスｐ１〜ｐ１４の算出工程を省略可能になり、アドレスの演算処理が大幅に減少する。これにより、プログラムの実行にかかるサイクル数が、大幅に向上する。
【０１８９】
なお、アクセス対象のメンバのアドレスが、第３のループ処理ｌｐ３の毎に変化しない場合、情報処理装置１００は、メンバmathの上位のsubject構造体のアドレスｐ２１〜ｐ２４の演算処理を、第３のループ処理ｌｐ３の外に移動してもよい。
【０１９０】
この場合、情報処理装置１００は、コードｃｄ３２として、コード「subject_p = (subject_t*)&Class[i][c].members[temp];」を挿入する。そして、情報処理装置１００は、コードｃｄ２２（図２２）をコード「subject_p->math = 0;」に置換し、コードｃｄ２３（図２２）をコード「subject_p->eng = 0;」に置換する。
【０１９１】
この場合についても同様にして、第３のループ処理ｌｐ３における、アドレスｐ２１〜ｐ２４の算出工程を省略可能になり、アドレスの演算処理を大幅に抑制することが可能になる。
【０１９２】
（サイクル数）
図２４は、ソースファイルｃａ−１（図２２）に対応するプログラムの実行にかかるサイクル数と、最適化後ソースファイルｃｂ−１（図２３）に対応するプログラムの実行にかかるサイクル数を表す図である。
【０１９３】
図２４に示すように、図２２に示すソースファイルｃａに対応するプログラムの実行にかかるサイクル数は、例えば、式「１３＋２＊｛４＋｛８＊（４＋（４０＊１３））｝｝」にしたがって算出した値「８４０５Cycle」となる。一方、図２３に示す、最適後のソースファイルｃａに対応するプログラムの実行にかかるサイクル数は、例えば、式「１３＋２＊｛４＋｛８＊（３＋（４＋（４０＊７）））｝｝」にしたがって算出した値「４６１３Cycle」となる。
【０１９４】
このように、図３と同様にして、アクセス処理を含むループ処理ｌｐ３内でメンバを有する構造体のアドレスが変化しない場合についても、サイクル数は大幅に減少する。
【０１９５】
［別のソースコードの例２］
図２５は、別の最適化対象のソースコードを含むソースファイルｃａ−２の例を示す図である。図１は、図２０のフローチャート図の工程Ｓ８３において、値「Class[i][c]」のアドレス（&Class[i][c]）が、第２のループ処理ｌｐ２毎に変化する場合を例示した。これに対し、図２５は、アドレス「&Class[i][c]」が、第２のループ処理ｌｐ２の毎に変化しない場合を例示する。
【０１９６】
図２５のソースコードのコードｃｄ４１によると、第２のループ処理ｌｐ２のカウンタ変数は、変数「ｘ」である。したがって、第２のループ処理ｌｐ２の度に、値「ｃ」は変化しないため、アドレス「&Class[i][c]」も変化しない。
【０１９７】
図２６は、本実施の形態における情報処理装置１００が、図２５に示すソースファイルｃａ−２を最適化した後の、ソースファイルｃｂ−２の例を示す。情報処理装置１００は、コードｃｄ５１、ｃｄ５２をソースコードに挿入するともに、コードｃｄ４２、ｃｄ４３（図２５）を、コードｃｄ５３、ｃｄ５４に置換する。コードｃｄ５１〜ｃｄ５４は、図３に示すコードｃｄ１１〜ｃｄ１４と同様である。
【０１９８】
図２６の例によると、情報処理装置１００は、ポインタ変数にアドレス「&Class[i][c]」をセットするコードｃｄ５２を、第２、第３のループ処理ｌｐ２、ｌｐ３の前に挿入する。つまり、情報処理装置１００は、アドレスｐ１〜ｐ１４の演算処理を、第３のループ処理ｌｐ３に加えて、第２のループ処理ｌｐ２の外に移動する。
【０１９９】
第１のループ処理ｌｐ１のループ回数は、第２のループ処理ｌｐ２のループ回数に対して少ない。したがって、アドレスの演算処理を行うコードｃｄ５２を、さらに、第２のループ処理ｌｐ２の外に移動することにより、アドレスの演算処理の回数をさらに削減可能になる。これにより、これにより、コード修正モジュール１２４は、最適化後のソースコードに対応するプログラムのサイクル数を、さらに、削減することができる。
【０２００】
［別のソースコードの例３］
上記の実施の形態では、メンバを有する構造体のアドレス計算を省略する場合を例示した。本実施の形態における最適化処理は、複数のメンバを有する配列に対しても適用可能である。
【０２０１】
図２７は、別の最適化対象のソースコードを含むソースファイルｃａ−３の例を示す図である。図１は、構造体のメンバにアクセスする処理を有するソースファイルｃａを例示した。これに対し、図２７は、配列のメンバにアクセスする処理を有するソースファイルｃａ−３を例示する。
【０２０２】
図２７に示すコードｃｄ６１は、二次元配列「members[i][c]」のメンバに値「０」をセットする処理を示す。コードｃｄ６１の処理は、値「members[i][0]」のアドレスの算出工程を有する。
【０２０３】
図２８は、本実施の形態における情報処理装置が、図２７に示すソースファイルｃａ−３を最適化した後の、ソースファイルｃｂ−３の例を示す。情報処理装置１００は、コードｃｄ７１、ｃｄ７２をソースコードに挿入するともに、コードｃｄ６１を、コードｃｄ７３に置換する。
【０２０４】
コードｃｄ７１は、ポインタ変数「plist」を宣言する処理を示し、コードｃｄ７２は、ポインタ変数「plist」に、値「members[i][0]」のアドレスをセットする処理を示す。また、コードｃｄ７３は、ポインタ変数「plist」に基づいて、メンバ「members[i][c]」にアクセスするコードを示す。
【０２０５】
図２８に示すソースコードによると、コードｃｄ７３の実行の度に、値「members[i][0]」のアドレスの算出工程を省略可能になる。繰り返し行うループ処理内の、アドレスの演算処理の発生を抑制することにより、プログラム実行時の処理量が大幅に減少し、プログラムの実行にかかるサイクル数を大幅に削減可能になる。このように、本実施の形態における最適化処理は、メンバを有する配列に対しても適用可能である。
【０２０６】
なお、本実施の形態では、ループ処理として、ｆｏｒ文を例示している。ただし、この例に限定されるものではない。ループ処理は、ｗｈｉｌｅ文やｄｏ文等の別のループ処理を含んでいてもよい。本実施の形態における最適化処理は、ｆｏｒ文以外のループ処理に対しても適用可能である。
【０２０７】
以上の実施の形態をまとめると、次の付記のとおりである。
【０２０８】
（付記１）
ソースコードから、ループ処理内でアクセス対象となるメンバを有する構造体または配列を検出する検出部と、
ポインタ変数を宣言する第１のコード、及び、前記構造体または前記配列のアドレスを前記ポインタ変数にセットする第２のコードを、前記ソースコードの前記ループ処理の前に挿入し、前記ループ処理内の、前記メンバにアクセスするコードを、前記ポインタ変数に基づいて前記メンバにアクセスする第３のコードに置換する編集部と、
を有するプログラムの最適化装置。
【０２０９】
（付記２）
付記１において、
前記編集部は、前記ループ処理の度に前記アドレスが変化しない前記構造体または前記配列のアドレスを、前記ポインタ変数にセットする第２のコードを挿入する、
プログラムの最適化装置。
【０２１０】
（付記３）
付記１または２において、
前記編集部は、前記ループ処理が別のループ処理に含まれ、当該別のループ処理内で前記構造体または前記配列の前記アドレスが変化する場合に、前記第１、第２のコードを、前記ループ処理の前であって前記別のループ処理内に挿入し、前記別のループ処理内で前記アドレスが変化しない場合に、前記第１、第２のコードを、前記ループ処理及び前記別のループ処理の前に挿入する、
プログラムの最適化装置。
【０２１１】
（付記４）
付記１乃至３のいずれかにおいて、
前記検出部は、ループ回数が所定値を超える前記ループ処理内でアクセス対象となる、前記メンバを有する前記構造体または前記配列を検出する、
プログラムの最適化装置。
【０２１２】
（付記５）
付記４において、
前記ループ回数は、前記ループ処理が別のループ処理に含まれる場合、前記ループ処理の第１のループ回数と、前記別のループ処理の第２のループ回数との積を示す、
プログラムの最適化装置。
【０２１３】
（付記６）
付記１乃至５のいずれかにおいて、
前記構造体は、多次元構造体を含む、
プログラムの最適化装置。
【０２１４】
（付記７）
付記１乃至５のいずれかにおいて、
前記配列は、二次配列を含む、
プログラムの最適化装置。
【０２１５】
（付記８）
ソースコードから、ループ処理内でアクセス対象となるメンバを有する構造体または配列を検出し、
ポインタ変数を宣言する第１のコード、及び、前記構造体または前記配列のアドレスを前記ポインタ変数にセットする第２のコードを、前記ソースコードの前記ループ処理の前に挿入し、
前記ループ処理内の、前記メンバにアクセスするコードを、前記ポインタ変数に基づいて前記メンバにアクセスする第３のコードに置換する、
ことを実行させることを特徴とする最適化プログラム。
【０２１６】
（付記９）
付記８において、
前記挿入は、前記ループ処理の度に前記アドレスが変化しない前記構造体または前記配列のアドレスを、前記ポインタ変数にセットする第２のコードを挿入する、
最適化プログラム。
【０２１７】
（付記１０）
付記８または９において、
前記挿入は、前記ループ処理が別のループ処理に含まれ、当該別のループ処理内で前記構造体または前記配列の前記アドレスが変化する場合に、前記第１、第２のコードを、前記ループ処理の前であって前記別のループ処理内に挿入し、前記別のループ処理内で前記アドレスが変化しない場合に、前記第１、第２のコードを、前記ループ処理及び前記別のループ処理の前に挿入する、
最適化プログラム。
【０２１８】
（付記１１）
付記８乃至１０のいずれかにおいて、
前記検出は、ループ回数が所定値を超える前記ループ処理内でアクセス対象となる、前記メンバを有する前記構造体または前記配列を検出する、
最適化プログラム。
【０２１９】
（付記１２）
付記１１において、
前記ループ回数は、前記ループ処理が別のループ処理に含まれる場合、前記ループ処理の第１のループ回数と、前記別のループ処理の第２のループ回数との積を示す、
最適化プログラム。
【０２２０】
（付記１３）
付記８乃至１２のいずれかにおいて、
前記構造体は、多次元構造体を含む、
最適化プログラム。
【０２２１】
（付記１４）
付記８乃至１２のいずれかにおいて、
前記配列は、二次配列を含む、
最適化プログラム。
【０２２２】
（付記１５）
処理部が、ソースコードから、ループ処理内でアクセス対象となるメンバを有する構造体または配列を検出し、
処理部が、ポインタ変数を宣言する第１のコード、及び、前記構造体または前記配列のアドレスを、前記ポインタ変数にセットする第２のコードを前記ソースコードの前記ループ処理の前に挿入し、前記ループ処理内の、前記メンバにアクセスするコードを、前記ポインタ変数に基づいて前記メンバにアクセスする第３のコードに置換し、
処理部が、前記挿入及び前記置換後のソースコードをコンパイルする、
最適化されたプログラムの製造方法。
【０２２３】
（付記１６）
付記１５において、
前記挿入は、前記ループ処理の度に前記アドレスが変化しない前記構造体または前記配列のアドレスを、前記ポインタ変数にセットする第２のコードを挿入する、
最適化されたプログラムの製造方法。
【０２２４】
（付記１７）
付記１５または１６において、
前記挿入は、前記ループ処理が別のループ処理に含まれ、当該別のループ処理内で前記構造体または前記配列の前記アドレスが変化する場合に、前記第１、第２のコードを、前記ループ処理の前であって前記別のループ処理内に挿入し、前記別のループ処理内で前記アドレスが変化しない場合に、前記第１、第２のコードを、前記ループ処理及び前記別のループ処理の前に挿入する、
最適化されたプログラムの製造方法。
【０２２５】
（付記１８）
付記１５乃至１７のいずれかにおいて、
前記検出は、ループ回数が所定値を超える前記ループ処理内でアクセス対象となる、前記メンバを有する前記構造体または前記配列を検出する、
最適化されたプログラムの製造方法。
【０２２６】
（付記１９）
付記１８において、
前記ループ回数は、前記ループ処理が別のループ処理に含まれる場合、前記ループ処理の第１のループ回数と、前記別のループ処理の第２のループ回数との積を示す、
最適化されたプログラムの製造方法。
【０２２７】
（付記２０）
付記１５乃至１９のいずれかにおいて、
前記構造体は、多次元構造体を含む、
最適化されたプログラムの製造方法。
【０２２８】
（付記２１）
付記１５乃至１９のいずれかにおいて、
前記配列は、二次配列を含む、
最適化されたプログラムの製造方法。
【符号の説明】
【０２２９】
１００：情報処理装置、１０１：ＣＰＵ、１０２：メモリ、１０３：通信インタフェース部、１０４：外部インタフェース部、１２０：コンパイルプログラム、ｃａ：ソースファイル、ｃｂ：最適化後ソースファイル
【図１】
0006547477.tif 000002
【図２】
0006547477.tif 000003
【図３】
0006547477.tif 000004
【図４】
0006547477.tif 000005
【図５】
0006547477.tif 000006
【図６】
0006547477.tif 000007
【図７】
0006547477.tif 000008
【図８】
0006547477.tif 000009
【図９】
0006547477.tif 000010
【図１０】
0006547477.tif 000011
【図１１】
0006547477.tif 000012
【図１２】
0006547477.tif 000013
【図１３】
0006547477.tif 000014
【図１４】
0006547477.tif 000015
【図１５】
0006547477.tif 000016
【図１６】
0006547477.tif 000017
【図１７】
0006547477.tif 000018
【図１８】
0006547477.tif 000019
【図１９】
0006547477.tif 000020
【図２０】
0006547477.tif 000021
【図２１】
0006547477.tif 000022
【図２２】
0006547477.tif 000023
【図２３】
0006547477.tif 000024
【図２４】
0006547477.tif 000025
【図２５】
0006547477.tif 000026
【図２６】
0006547477.tif 000027
【図２７】
0006547477.tif 000028
【図２８】
0006547477.tif 000029