(57)【要約】【課題】キャッシュヒット率の低下を抑制することを可能とするオブジェクトコードを生成することを可能とする情報処理装置、コンパイラプログラム及びコンパイル方法を提供する。【解決手段】ソースコードのコンパイルを実行してオブジェクトコードを生成する情報処理装置は、Ｎ（Ｎは２以上の整数）次元の可変長配列に対する特定データの格納を行う命令がソースコードに含まれている場合、Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対して特定データを格納するように、オブジェクトコードを生成する格納先変更部と、Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令がソースコードに含まれている場合、Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納するように、オブジェクトコードを生成するアクセス先変更部と、を有する。【選択図】図６
2019219912.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードのコンパイルを実行してオブジェクトコードを生成する情報処理装置であって、
Ｎ（Ｎは２以上の整数）次元の可変長配列に対する特定データの格納を行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対して前記特定データを格納するように、前記オブジェクトコードを生成する格納先変更部と、
前記Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納するように、前記オブジェクトコードを生成するアクセス先変更部と、を有する、
ことを特徴とする情報処理装置。
【請求項２】
請求項１において、さらに、
前記特定データの格納先のアドレスを示すアドレス情報を記憶する記憶部と、を有し、
前記アクセス先変更部は、前記アドレス情報が記憶された前記記憶部を参照し、前記Ｎ次元の固定長配列に格納されているデータのそれぞれの格納位置を特定し、特定した前記格納位置に格納されたデータのそれぞれを前記１次元の固定長配列に連続して格納するように、前記オブジェクトコードを生成する、
ことを特徴とする情報処理装置。
【請求項３】
請求項２において、
前記アクセス先変更部は、前記アドレス情報が記憶された前記記憶部を参照し、前記Ｎ次元の固定長配列に格納されているデータのデータ長の合計値を算出し、前記Ｎ次元の固定長配列に格納されているデータのそれぞれを格納する前に、前記１次元の固定長配列に対応する領域として、算出した前記合計値に対応する領域を確保するように、前記オブジェクトコードを生成する、
ことを特徴とする情報処理装置。
【請求項４】
請求項２において、
前記アドレス情報は、前記Ｎ次元の固定長配列に対応する領域において、連続する領域に格納された複数の前記特定データが格納された領域の先頭アドレスを示す先頭アドレス情報と、連続する領域に格納された複数の前記特定データごとに、前記特定データの数を示す情報を示すデータ数情報とを含む、
ことを特徴とする情報処理装置。
【請求項５】
請求項１において、
前記アクセス先変更部は、前記Ｎ次元の固定長配列に格納されているデータのそれぞれを前記１次元の固定長配列に対して格納した後、前記Ｎ次元の新たな固定長配列を生成し、生成した前記新たな固定長配列における前記Ｎ次元のうち、１次元目からＮ−１次元目のそれぞれに対応する領域に、２次元目からＮ次元目に対応する領域の先頭アドレスを示すデータを格納し、前記新たな固定長配列における前記Ｎ次元のうち、Ｎ次元目に対応する領域に、前記１次元の固定長配列に格納されたデータのそれぞれを格納し、前記新たな固定長配列に格納されたデータのそれぞれに対して順にアクセスが行われるように、前記オブジェクトコードを生成する、
ことを特徴とする情報処理装置。
【請求項６】
ソースコードのコンパイルを実行してオブジェクトコードを生成する処理をコンピュータに実行させるコンパイラプログラムであって、
Ｎ次元の可変長配列に対する特定データの格納を行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対して前記特定データを格納するように、前記オブジェクトコードを生成し、
前記Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納するように、前記オブジェクトコードを生成する、
ことを特徴とするコンパイラプログラム。
【請求項７】
ソースコードのコンパイルを実行してオブジェクトコードを生成するコンパイル方法であって、
Ｎ次元の可変長配列に対する特定データの格納を行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対して前記特定データを格納するように、前記オブジェクトコードを生成し、
前記Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納するように、前記オブジェクトコードを生成する、
ことを特徴とするコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、コンパイラプログラム及びコンパイル方法に関する。
【背景技術】
【０００２】
例えば、Ｃ＋＋によって記述されたソースコードのコンパイルを行うコンパイラ（以下、コンパイルプログラムとも呼ぶ）は、指定されたソースコードを入力とすることによってオブジェクトコードの生成を行う。具体的に、コンパイラは、例えば、ソースコードに含まれる構文や意味の解析を行うことによって、指定されたソースコードから中間言語の生成を行う。そして、コンパイラは、例えば、生成された中間言語の最適化を行い、最適化された中間言語からオブジェクトコードの生成を行う。これにより、コンパイルは、オブジェクトコードの実行時間の短縮や実行時における使用リソースの削減等を図ることが可能になる（例えば、特許文献１乃至３参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００８−２１７１３４号公報
【特許文献２】特開２００７−３２８６９２号公報
【特許文献３】特開２００４−３６２２１６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ここで、上記のようなソースコードには、例えば、不連続なメモリ領域に格納されたデータ（例えば、２次元以上の可変長配列に格納されたデータ）に対するアクセスを行う命令が含まれている場合がある。そして、このようなソースコードから生成されたオブジェクトコードが実行される場合、ＣＰＵでは、キャッシュミスが頻発して命令の実行効率が低下する可能性がある。
【０００５】
そのため、上記のようなコンパイラは、不連続なメモリ領域に格納されたデータのそれぞれに対するアクセスを要する命令が含まれているソースコードであっても、キャッシュヒット率の低下を抑制することを可能とするオブジェクトコードを生成することが好ましい。
【０００６】
そこで、一つの側面では、本発明は、キャッシュヒット率の低下を抑制することを可能とするオブジェクトコードを生成することを可能とする情報処理装置、コンパイラプログラム及びコンパイル方法を提供することを目的とする。
【課題を解決するための手段】
【０００７】
実施の形態の一態様では、ソースコードのコンパイルを実行してオブジェクトコードを生成する情報処理装置は、Ｎ（Ｎは２以上の整数）次元の可変長配列に対する特定データの格納を行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対して前記特定データを格納するように、前記オブジェクトコードを生成する格納先変更部と、前記Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納するように、前記オブジェクトコードを生成するアクセス先変更部と、を有する。
【発明の効果】
【０００８】
一つの側面によれば、キャッシュヒット率の低下を抑制することを可能とするオブジェクトコードを生成することを可能とする。
【図面の簡単な説明】
【０００９】
【図１】図１は、情報処理システム１０の構成を示す図である。
【図２】図２は、情報処理システム１０の構成を示す図である。
【図３】図３は、情報処理システム１０の構成を示す図である。
【図４】図４は、情報処理装置１のハードウエア構成を説明する図である。
【図５】図５は、情報処理装置１の機能のブロック図である。
【図６】図６は、第１の実施の形態におけるコンパイル処理の概略を説明するフローチャート図である。
【図７】図７は、第１の実施の形態におけるコンパイル処理の概略を説明する図である。
【図８】図８は、第１の実施の形態におけるコンパイル処理の概略を説明する図である。
【図９】図９は、２次元の可変長配列の具体例を説明する図である。
【図１０】図１０は、２次元の固定長配列の具体例を説明する図である。
【図１１】図１１は、１次元の固定長配列の具体例を説明する図である。
【図１２】図１２は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１３】図１３は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１４】図１４は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１５】図１５は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１６】図１６は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１７】図１７は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１８】図１８は、ソースコード１３１ｂの具体例を説明する具体例である。
【図１９】図１９は、Ｓ２５の処理で更新された命令の実行時における具体例について説明する図である。
【図２０】図２０は、Ｓ２５の処理で更新された命令の実行時における具体例について説明する図である。
【図２１】図２１は、アドレス情報１３５の具体例について説明する図である。
【図２２】図２２は、Ｓ３２の処理で更新された命令の実行時における具体例について説明する図である。
【図２３】図２３は、Ｓ３２の処理で更新された命令の実行時における具体例について説明する図である。
【図２４】図２４は、Ｓ３２の処理で更新された命令の実行時における具体例について説明する図である。
【発明を実施するための形態】
【００１０】
［情報処理システムの構成］
図１から図３は、情報処理システム１０の構成を示す図である。図１から図３に示す情報処理システム１０は、情報処理装置１と、操作端末３とを有する。
【００１１】
情報処理装置１では、例えば、ＣＰＵ（図示しない）と各種プログラムとが有機的に協働することにより、コンパイラ１１と、リンカ１２とを含む各種機能を実現する。
【００１２】
コンパイラ１１は、例えば、情報格納領域１３０に記憶されたソースコード１３１からオブジェクトコード１３３を生成する。コンパイラ１１は、例えば、ソースコード１３１に含まれる構文や字句の意味を解析することによって、ソースコード１３１から中間言語１３２を生成する解析部１１ａと、解析部１１ａが生成した中間言語１３２の最適化を行う最適化部１１ｂと、最適化部１１ｂが最適化を行った中間言語１３２からオブジェクトコード１３３を生成するコード生成部１１ｃとを有する。
【００１３】
具体的に、解析部１１ａは、例えば、図１に示すように、ライブラリのソースコード１３１（以下、ソースコード１３１ａとも呼ぶ）からライブラリの中間言語１３２（以下、中間言語１３２ａとも呼ぶ）を生成する。そして、コード生成部１１ｃは、最適化部１１ｂが最適化を行った中間言語１３２ａからライブラリのオブジェクトコード１３３（以下、オブジェクトコード１３３ａとも呼ぶ）を生成して情報格納領域１３０に記憶する。
【００１４】
また、解析部１１ａは、例えば、図２に示すように、アプリケーションのソースコード１３１（以下、ソースコード１３１ｂとも呼ぶ）からアプリケーションの中間言語１３２（以下、中間言語１３２ｂ）を生成する。そして、コード生成部１１ｃは、最適化部１１ｂが最適化を行った中間言語１３２ｂからアプリケーションのオブジェクトコード１３３（以下、オブジェクトコード１３３ｂとも呼ぶ）を生成して情報格納領域１３０に記憶する。
【００１５】
リンカ１２は、例えば、図３に示すように、ソースコード１３１ａから生成されたオブジェクトコード１３３ａと、ソースコード１３１ｂから生成されたオブジェクトコード１３３ｂとをリンクさせることにより、実行ファイル１３４を生成する。
【００１６】
ここで、上記のようなソースコード１３１ｂには、例えば、不連続なメモリ領域に格納されたデータ（例えば、２次元以上の可変長配列に格納されたデータ）に対するアクセスを行う命令が含まれている場合がある。そして、このようなソースコード１３１ｂから生成されたオブジェクトコード１３３ｂが実行される場合、情報処理装置１のＣＰＵ（図示しない）では、キャッシュミスが頻発して命令の実行効率が低下する可能性がある。
【００１７】
そのため、上記のようなコンパイラ１１は、不連続なメモリ領域に格納されたデータのそれぞれに対するアクセスを要する命令が含まれているソースコード１３１ｂであっても、キャッシュヒット率の低下を抑制することを可能とするオブジェクトコード１３３ｂを生成することが好ましい。
【００１８】
そこで、本実施の形態におけるコンパイラ１１は、ソースコード１３１ｂのコンパイル時において、Ｎ（Ｎは２以上の整数）次元の可変長配列に対するデータ（以下、特定データとも呼ぶ）の格納を行う命令がソースコード１３１ｂに含まれている場合、Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対して特定データを格納するように、オブジェクトコード１３３ｂを生成する。
【００１９】
また、コンパイラ１１は、ソースコード１３１ｂのコンパイル時において、Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令がソースコード１３１ｂに含まれている場合、Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納し、１次元の固定長配列に格納されたデータに対して順にアクセスが行われるように、オブジェクトコード１３３ｂを生成する。
【００２０】
すなわち、本実施の形態におけるコンパイラ１１は、Ｎ次元の可変長配列に対してデータを格納する旨の命令がソースコード１３１に含まれている場合、Ｎ次元の可変長配列に対してデータを格納する旨の命令を、１次元の固定長配列に対して連続してデータを格納する旨の命令に変換してオブジェクトコード１３３を生成する。
【００２１】
これにより、コンパイラ１１は、不連続なメモリ領域に格納されたデータに対するアクセスの発生を抑制したオブジェクトコード１３３ｂを生成することが可能になる。そのため、コンパイラ１１は、実行時におけるキャッシュヒット率が高いオブジェクトコード１３３ｂを生成することが可能になる。
【００２２】
［情報処理システムのハードウエア構成］
次に、情報処理システム１０のハードウエア構成について説明する。図４は、情報処理装置１のハードウエア構成を説明する図である。
【００２３】
情報処理装置１は、プロセッサであるＣＰＵ１０１と、メモリ１０２と、外部インターフェース（Ｉ／Ｏユニット）１０３と、記憶媒体１０４とを有する。各部は、バス１０５を介して互いに接続される。
【００２４】
記憶媒体１０４は、例えば、ソースコード１３１のコンパイルを行う処理（以下、コンパイル処理とも呼ぶ）を行うためのプログラム１１０を記憶するプログラム格納領域（図示しない）を有する。また、記憶媒体１０４は、例えば、コンパイル処理を行う際に用いられる情報を記憶する情報格納領域１３０（以下、記憶部１３０とも呼ぶ）を有する。なお、記憶媒体１０４は、例えば、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）であってよい。
【００２５】
ＣＰＵ１０１は、記憶媒体１０４からメモリ１０２にロードされたプログラム１１０を実行してコンパイル処理を行う。
【００２６】
また、外部インターフェース１０３は、例えば、操作端末３と通信を行う。
【００２７】
［情報処理システムの機能］
次に、情報処理システム１０の機能について説明を行う。図５は、情報処理装置１の機能のブロック図である。
【００２８】
情報処理装置１は、図５に示すように、ＣＰＵ１０１やメモリ１０２等のハードウエアとプログラム１１０とが有機的に協働することにより、コンパイラ１１の解析部１１ａの機能として、配列特定部１１１を実現する。また、情報処理装置１は、図５に示すように、ＣＰＵ１０１やメモリ１０２等のハードウエアとプログラム１１０とが有機的に協働することにより、コンパイラ１１の最適化部１１ｂの機能として、型変換部１１２と、格納先変更部１１３と、アクセス先変更部１１４を実現する。
【００２９】
さらに、情報処理装置１は、図５に示すように、ソースコード１３１と、中間言語１３２と、オブジェクトコード１３３と、実行ファイル１３４と、アドレス情報１３５とを情報格納領域１３０に記憶する。なお、以下、ソースコード１３１には、図１等で説明したソースコード１３１ａ及びソースコード１３１ｂが含まれ、中間言語１３２には、図１等で説明した中間言語１３２ａ及び中間言語１３２ｂが含まれ、オブジェクトコード１３３には、図１等で説明したオブジェクトコード１３３ａ及びオブジェクトコード１３３ｂが含まれるものとして説明を行う。
【００３０】
解析部１１ａの配列特定部１１１は、情報格納領域１３０に記憶されたソースコード１３１ｂの記述から、Ｎ次元の可変長配列の宣言と、Ｎ次元の可変長配列に対するデータの格納を行う命令と、Ｎ次元の可変長配列に格納されているデータに対して順にアクセスを行う命令とを特定する。
【００３１】
最適化部１１ｂの型変換部１１２は、配列特定部１１１がＮ次元の可変長配列の宣言等を特定した場合、解析部１１ａがソースコード１３１ｂから生成した中間言語１３２ｂに含まれるＮ次元の可変長配列を、Ｎ次元の固定長配列に変換する。
【００３２】
最適化部１１ｂの格納先変更部１１３は、配列特定部１１１がＮ次元の可変長配列の宣言等を特定した場合、Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対してデータを格納するように、解析部１１ａが生成した中間言語１３２ｂの更新を行う。
【００３３】
最適化部１１ｂのアクセス先変更部１１４は、配列特定部１１１がＮ次元の可変長配列の宣言等を特定した場合、Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納し、１次元の固定長配列に格納されたデータに対して順にアクセスが行われるように、解析部１１ａが生成した中間言語１３２ｂの更新を行う。アドレス情報１３５についての説明は後述する。
【００３４】
［第１の実施の形態の概略］
次に、第１の実施の形態の概略について説明する。図６は、第１の実施の形態におけるコンパイル処理の概略を説明するフローチャート図である。また、図７及び図８は、第１の実施の形態におけるコンパイル処理の概略を説明する図である。
【００３５】
コンパイラ１１は、図６に示すように、ソースコード１３１ｂのコンパイルの開始タイミングになるまで待機する（Ｓ１のＮＯ）。具体的に、コンパイラ１１は、例えば、コンパイルを行う担当者（以下、単に担当者とも呼ぶ）が操作端末３を介してソースコード１３１ｂのコンパイルを行う旨の指示を入力するまで待機する。
【００３６】
そして、ソースコード１３１ｂのコンパイルの開始タイミングになった場合（Ｓ１のＹＥＳ）、コンパイラ１１は、Ｎ次元の可変長配列に対する特定データの格納を行う命令がソースコード１３１ｂ（中間言語１３２ｂ）に含まれているか否かを判定する（Ｓ２）。
【００３７】
その結果、Ｎ次元の可変長配列に対する特定データの格納を行う命令が含まれていると判定した場合（Ｓ３のＹＥＳ）、コンパイラ１１は、Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対して特定データを格納するように、ソースコード１３１ｂ（中間言語１３２ｂ）からオブジェクトコード１３３ｂを生成する（Ｓ４）。
【００３８】
続いて、コンパイラ１１は、Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令がソースコード１３１ｂに含まれているか否かを判定する（Ｓ５）。
【００３９】
その結果、Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令が含まれていると判定した場合（Ｓ６のＹＥＳ）、コンパイラ１１は、Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納し、１次元の固定長配列に格納されたデータに対して順にアクセスが行われるように、オブジェクトコード１３３ｂを生成する（Ｓ７）。
【００４０】
すなわち、コンパイラ１１の最適化部１１ｂは、図７に示すように、コンパイラ１１の解析部１１ａが生成した中間言語１３２ｂに、Ｎ次元の可変長配列に対する特定データの格納を行う命令が含まれている場合、Ｎ次元の固定長配列に対して特定データを格納するように、中間言語１３２ｂを更新する。
【００４１】
また、最適化部１１ｂは、図８に示すように、解析部１１ａが生成した中間言語１３２ｂに、Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令が含まれている場合、Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納し、１次元の固定長配列に格納されたデータに対して順にアクセスが行われるように、中間言語１３２ｂを更新する。
【００４２】
さらに、最適化部１１ｂは、解析部１１ａが生成した中間言語１３２ｂに対し、その他の必要な最適化を行う。その後、コード生成部１１ｃは、最適化部１１ｂが最適化を行った中間言語１３２ｂからオブジェクトコード１３３ｂを生成する。
【００４３】
［Ｓ４の処理の具体例］
次に、Ｓ４の処理の具体例について説明を行う。
【００４４】
図９は、２次元の可変長配列の具体例を説明する図である。また、図１０は、２次元の固定長配列の具体例を説明する図である。具体的に、図９は、Ｃ＋＋におけるｖｅｃｔｏｒ＜ｖｅｃｔｏｒ＜ｃｌａｓｓＴ＞＞クラステンプレートの２次元の可変長配列である配列ｖを説明する図である。また、図１０は、Ｃ＋＋におけるＡｒｒａｙ＜Ａｒｒａｙ＜ｃｌａｓｓＴ＞＞クラステンプレートの２次元の固定長配列である配列ｄａｔａ［１００］［１００］を説明する図である。
【００４５】
なお、図９及び図１０に示す例において、配列ｖ及び配列ｄａｔａ［１００］［１００］には、それぞれ同じデータが格納されている。また、配列ｄａｔａの大きさは、例えば、担当者によって予め決定される。
【００４６】
初めに、図９に示す配列ｖについて説明を行う。図９に示す配列ｖは、配列ｉｖ１、配列ｉｖ２及び配列ｉｖ３をそれぞれ有している。
【００４７】
そして、図９に示す配列ｉｖ１は、アドレス０ｘ０１００に対応する領域に格納されたＤａｔａ１−１と、アドレス０ｘ０１０８に対応する領域に格納されたＤａｔａ１−２と、アドレス０ｘ０１１６に対応する領域に格納されたＤａｔａ１−３と、アドレス０ｘ０１２４に対応する領域に格納されたＤａｔａ１−４とを有している。
【００４８】
また、図９に示す配列ｉｖ２は、アドレス０ｘ０２００に対応する領域に格納されたＤａｔａ２−１と、アドレス０ｘ０２０８に対応する領域に格納されたＤａｔａ２−２とを有している。
【００４９】
さらに、図９に示す配列ｉｖ３は、アドレス０ｘ０３００に対応する領域に格納されたＤａｔａ３−１と、アドレス０ｘ０３０８に対応する領域に格納されたＤａｔａ３−２と、アドレス０ｘ０３１６に対応する領域に格納されたＤａｔａ３−３とを有している。
【００５０】
次に、図１０に示す配列ｄａｔａについて説明を行う。図１０に示す配列ｄａｔａは、１次元目の要素として、アドレス０ｘ０１００に対応する領域に格納されたＤａｔａ１−１と、アドレス０ｘ０１０８に対応する領域に格納されたＤａｔａ１−２と、アドレス０ｘ０１１６に対応する領域に格納されたＤａｔａ１−３と、アドレス０ｘ０１２４に対応する領域に格納されたＤａｔａ１−４とを有している。なお、図１０に示す配列ｄａｔａの１次元目の要素が格納される領域のうち、アドレス０ｘ０１３２以降に対応する各領域には、要素が格納されていない。
【００５１】
また、図１０に示す配列ｄａｔａは、２次元目の要素として、アドレス０ｘ０２００に対応する領域に格納されたＤａｔａ２−１と、アドレス０ｘ０２０８に対応する領域に格納されたＤａｔａ２−２とを有している。なお、図１０に示す配列ｄａｔａの２次元目の要素が格納される領域のうち、アドレス０ｘ０２１６以降に対応する各領域には、要素が格納されていない。
【００５２】
さらに、図１０に示す配列ｄａｔａは、３次元目の要素として、アドレス０ｘ０３００に対応する領域に格納されたＤａｔａ３−１と、アドレス０ｘ０３０８に対応する領域に格納されたＤａｔａ３−２と、アドレス０ｘ０３１６に対応する領域に格納されたＤａｔａ３−３とを有している。なお、図１０に示す配列ｄａｔａの３次元目の要素が格納される領域のうち、アドレス０ｘ０３２４に対応する領域には、要素が格納されていない。また、図１０に示す配列ｄａｔａの４次元目以降の要素が格納される領域には、要素が格納されていない。
【００５３】
そして、コンパイラ１１は、例えば、配列ｖに対するデータの格納を行う旨の命令がソースコード１３１ｂに含まれている場合、配列ｖに対するデータの格納（図９で説明したデータの格納）を行わずに、配列ｄａｔａに対するデータの格納（図１０で説明したデータの格納）を行うように、中間言語１３２ｂの更新を行う（Ｓ４）。
【００５４】
［Ｓ７の処理の具体例］
次に、Ｓ７の処理の具体例について説明を行う。
【００５５】
図１１は、１次元の固定長配列の具体例を説明する図である。図１１は、Ｃ＋＋におけるＡｒｒａｙ＜ｃｌａｓｓＴ＞クラステンプレートの１次元の固定長配列である配列ｄａｔａ２［８］を説明する図である。なお、配列ｄａｔａ２の大きさは、例えば、図１０で配列ｄａｔａに格納された要素の数に対応して決定される。
【００５６】
コンパイラ１１は、例えば、配列ｖに格納されたデータに対して順にアクセスを行う命令がソースコード１３１ｂに含まれている場合、図１１に示すように、２次元の固定長配列である配列ｄａｔａに格納されたデータ（図１０で説明したデータの格納）を、１次元の固定長配列である配列ｄａｔａ２に対して順に格納する。そして、コンパイラ１１は、配列ｄａｔａ２に格納されたデータに対して順にアクセスを行う（Ｓ７）。
【００５７】
すなわち、本実施の形態におけるコンパイラ１１は、Ｎ次元の可変長配列に対してデータを格納する旨の命令がソースコード１３１に含まれている場合、Ｎ次元の可変長配列に対してデータを格納する旨の命令を、１次元の固定長配列に対して連続してデータを格納する旨の命令に変換してオブジェクトコード１３３を生成する。
【００５８】
これにより、コンパイラ１１は、不連続なメモリ領域に格納されたデータに対するアクセスの発生を抑制したオブジェクトコード１３３ｂを生成することが可能になる。そのため、コンパイラ１１は、実行時におけるキャッシュヒット率が高いオブジェクトコード１３３ｂを生成することが可能になる。
【００５９】
［第１の実施の形態の詳細］
次に、第１の実施の形態の詳細について説明する。図１２から図１７は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。また、図１８から図２４は、第１の実施の形態におけるコンパイル処理の詳細を説明する図である。
【００６０】
［コンパイラの解析部におけるコンパイル処理］
初めに、コンパイラ１１の解析部１１ａにおけるコンパイル処理について説明を行う。図１２は、解析部１１ａにおけるコンパイル処理を説明するフローチャート図である。
【００６１】
解析部１１ａは、図１２に示すように、ソースコード１３１ｂのコンパイルの開始タイミングになるまで待機する（Ｓ１１のＮＯ）。
【００６２】
そして、コンパイルの開始タイミングになった場合（Ｓ１１のＹＥＳ）、解析部１１ａの配列特定部１１１は、Ｓ１１の処理でコンパイルを開始したソースコード１３１ｂの記述から、Ｎ次元の可変長配列の宣言と、Ｎ次元の可変長配列に対するデータの格納を行う命令と、Ｎ次元の可変長配列に格納されているデータに対して順にアクセスを行う命令とを特定する（Ｓ１２）。以下、Ｓ１２の処理の具体例について説明を行う。
【００６３】
［Ｓ１２の処理の具体例］
図１８は、ソースコード１３１ｂの具体例を説明する具体例である。
【００６４】
図１８に示すソースコード１３１ｂにおけるＣＯＤＥ１には、Ｃ＋＋におけるｖｅｃｔｏｒ＜ｖｅｃｔｏｒ＜ｃｌａｓｓＴ＞＞クラステンプレートの２次元の可変長配列である配列ｖの宣言の記述である「ｖｅｃｔｏｒ＜ｖｅｃｔｏｒ＜ｄｏｕｂｌｅ＞＞  ｖ」が含まれている。また、図１８に示すソースコード１３１ｂにおけるＣＯＤＥ２には、Ｎ次元の可変長配列に対する特定データの格納を行う命令の記述である「ｖ［ｉ］．ｐｕｓｈ＿ｂａｃｋ（＜ｄｏｕｂｌｅ＞ｊ＊１．５）；」が含まれている。さらに、図１８に示すソースコード１３１ｂにおけるＣＯＤＥ３には、Ｎ次元の可変長配列に格納されているデータに対して順にアクセスを行う命令の宣言の記述である「ｖｅｃｔｏｒ＜ｖｅｃｔｏｒ＞：：ｉｔｅｒａｔｏｒ  ｉｎｎｅｒ＿ｖ；」が含まれている。そのため、配列特定部１１１は、この場合、Ｓ１２の処理において、Ｎ次元の可変長配列の宣言と、Ｎ次元の可変長配列に対するデータの格納を行う命令と、Ｎ次元の可変長配列に格納されているデータに対して順にアクセスを行う命令との特定を行う。以下、Ｓ１２の処理において、Ｎ次元の可変長配列等の全てが特定されたものとして説明を行う。
【００６５】
図１２に戻り、解析部１１ａは、Ｓ１１の処理でコンパイルを開始したソースコード１３１ｂから中間言語１３２ｂを生成する（Ｓ１３）。
【００６６】
［コンパイラの最適化部におけるコンパイル処理］
次に、コンパイラ１１の最適化部１１ｂにおけるコンパイル処理について説明を行う。図１３は、最適化部１１ｂにおけるコンパイル処理を説明するフローチャート図である。
【００６７】
最適化部１１ｂは、図１３に示すように、解析部１１ａによって中間言語１３２ｂの生成が完了するまで待機する（Ｓ２１のＮＯ）。
【００６８】
そして、中間言語１３２ｂの生成が完了した場合（Ｓ２１のＹＥＳ）、最適化部１１ｂは、Ｓ１２の処理において、Ｎ次元の可変長配列の宣言と、Ｎ次元の可変長配列に対するデータの格納を行う命令と、Ｎ次元の可変長配列に格納されているデータに対して順にアクセスを行う命令との全てが特定されたか否かを判定する（Ｓ２２）。
【００６９】
その結果、Ｎ次元の可変長配列等の全てが特定されたと判定した場合（Ｓ２３のＹＥＳ）、最適化部１１ｂの型変換部１１２は、Ｓ１３の処理で生成した中間言語１３２ｂに含まれるＮ次元の可変長配列の宣言をＮ次元の固定長配列の宣言に変換するように、Ｓ１３の処理で生成した中間言語１３２ｂを更新する（Ｓ２４）。
【００７０】
具体的に、型変換部１１２は、図１８で説明したソースコード１３１ｂの記述のうち、ｖｅｃｔｏｒ＜ｖｅｃｔｏｒ＜ｃｌａｓｓＴ＞＞クラステンプレートの配列ｖの宣言（ＣＯＤＥ１に含まれる記述）を、Ａｒｒａｙ＜Ａｒｒａｙ＜ｃｌａｓｓＴ＞＞クラステンプレートの配列ｄａｔａ［１００］［１００］の宣言に変換するように、中間言語１３２ｂの更新を行う。
【００７１】
続いて、最適化部１１ｂの格納先変更部１１３は、Ｓ１３の処理で生成した中間言語１３２ｂに含まれる命令のうち、Ｎ次元の可変長配列に対するデータの格納を行う命令を、Ｎ次元の固定長配列に対するデータの格納を行う命令と、Ｎ次元の固定長配列に格納されるデータのアドレスを示すアドレス情報１３５を生成する命令とに変換するように、Ｓ１３の処理で生成した中間言語１３２ｂを更新する（Ｓ２５）。アドレス情報１３５の具体例については後述する。
【００７２】
ここで、Ｓ２４の処理において、Ｓ１３の処理で生成した中間言語１３２ｂに含まれる配列ｖ（Ｎ次元の可変長配列）の宣言が配列ｄａｔａ（Ｎ次元の固定長配列）の宣言に変換されることによって、中間言語１３２ｂから生成されるオブジェクトコード１３３ｂの実行時において呼び出される関数であるｐｕｓｈ＿ｂａｃｋ（図１８で説明したソースコード１３１ｂのＣＯＤＥ２に含まれる関数）は、ｖｅｃｔｏｒクラスのｐｕｓｈ＿ｂａｃｋからＡｒｒａｙクラスのｐｕｓｈ＿ｂａｃｋに変更される。
【００７３】
そのため、担当者は、例えば、本実施の形態におけるコンパイル処理を行う前に、ＳＴＬ（Ｓｔａｎｄａｒｄ  Ｔｅｍｐｌａｔｅ  Ｌｉｂｒａｒｙ）のＡｒｒａｙクラスを継承したＡｒｒａｙＥｘｔｅｎｄクラスを生成し、配列ｄａｔａ（Ｎ次元の固定長配列）に対するデータの格納を行う命令と、配列ｄａｔａに格納されるデータのアドレスを示すアドレス情報１３５を生成する命令とを含む新たなメンバ関数であるＡｒｒａｙクラスのｐｕｓｈ＿ｂａｃｋを予め追加することにより、Ｓ１３の処理で生成した中間言語１３２ｂに含まれるＣＯＤＥ２に対応する部分を変更することなく、最適化部１１ｂにＳ２５の処理を行わせることが可能になる。
【００７４】
そして、最適化部１１ｂのアクセス先変更部１１４は、図１４に示すように、Ｓ２５の処理で生成したアドレス情報１３５を参照し、Ｎ次元の固定長配列に格納されたデータのそれぞれを連続して格納する１次元の固定長配列に対応する領域をメモリ１０２上に確保するように、Ｓ１３の処理で生成した中間言語１３２ｂを更新する（Ｓ３１）。
【００７５】
具体的に、アクセス先変更部１１４は、図１１で説明したように、例えば、配列ｄａｔａ２に対応する領域として、配列ｄａｔａに格納されているデータのそれぞれが格納可能な大きさ領域を確保するように、中間言語１３２ｂの更新を行う。
【００７６】
ここで、担当者は、例えば、本実施の形態におけるコンパイル処理を行う前に、Ａｒｒａｙクラスを継承したＡｒｒａｙＥｘｔｅｎｄクラスを生成し、アドレス情報１３５を参照してＳ３１以降の処理を行う新たな関数を新たなメンバ関数として予め追加するものであってよい。具体的に、担当者は、例えば、オブジェクトコード１３３ｂの実行時においてＡｒｒａｙクラスのメンバ関数であるｂｅｇｉｎ（図１８で説明したソースコード１３１ｂのＣＯＤＥ３に含まれる関数）が呼び出された場合、アドレス情報１３５が生成済であることを条件として、ｂｅｇｉｎの代わりに呼び出され、かつ、ｂｅｇｉｎの呼び出しについても行う関数を、新たなメンバ関数としてＡｒｒａｙＥｘｔｅｎｄクラスに追加する。
【００７７】
これにより、担当者は、例えば、Ｓ１３の処理で生成した中間言語１３２ｂに含まれるＣＯＤＥ３のうち、ループで囲まれた部分についての変更を行うことなく、最適化部１１ｂにＳ３１以降の処理を行わせることが可能になる。
【００７８】
続いて、アクセス先変更部１１４は、Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納するように、Ｓ１３の処理で生成した中間言語１３２ｂを更新する（Ｓ３２）。
【００７９】
具体的に、アクセス先変更部１１４は、例えば、配列ｄａｔａに格納されているデータのそれぞれを配列ｄａｔａ２に連続して格納するように、中間言語１３２ｂの更新を行う。
【００８０】
以下、中間言語１３２ｂから生成されたオブジェクトコード１３３ｂの実行に伴って行われる処理（以下、オブジェクト実行処理とも呼ぶ）のうち、Ｓ３２の処理で更新された中間言語１３２ｂに対応する部分の処理について説明を行う。
【００８１】
［オブジェクト実行処理］
図１５から図１７は、オブジェクト実行処理の一部を説明するフローチャート図である。なお、以下、オブジェクトコード１３３ｂが情報処理装置１（ＣＰＵ１０１）によって実行される場合について説明を行う。
【００８２】
ＣＰＵ１０１は、図１５に示すように、例えば、変数ｉ、変数ｊ及び変数ｃｏｕｎｔｅｒのそれぞれに、初期値として０を設定する（Ｓ４１）。
【００８３】
そして、ＣＰＵ１０１は、Ｎ次元の固定長配列における添え字が変数ｉ及び変数ｊの値に対応する領域に格納されたデータを、１次元の固定長配列における添え字が変数ｃｏｕｎｔｅｒの値に対応する領域に格納する（Ｓ４２）。
【００８４】
続いて、ＣＰＵ１０１は、情報格納領域１３０に格納したアドレス情報１３５のうち、ｖｅｃｔｏｒカウントに設定された値の最大値が変数ｉ＋１の値と等しく、かつ、ｖｅｃｔｏｒカウントに設定された値が変数ｉの値と等しい情報のデータ数が、変数ｊ＋１の値と等しいか否かを判定する（Ｓ４３）。
【００８５】
その結果、各値の全てが等しくないと判定した場合（Ｓ４４のＮＯ）、ＣＰＵ１０１は、情報格納領域１３０に格納したアドレス情報１３５のうち、ｖｅｃｔｏｒカウントに設定された値が変数ｉの値と等しい情報のデータ数が、変数ｊ＋１の値と等しいか否かを判定する（Ｓ４４）。
【００８６】
そして、図１８に示すように、各値の全てが等しいと判定した場合（Ｓ５１のＹＥＳ）、ＣＰＵ１０１は、変数ｉの値及び変数ｃｏｕｎｔｅｒの値に１を加算し、変数ｊの値を０に更新する（Ｓ５２）。一方、各値の全てが等しくないと判定した場合（Ｓ５１のＮＯ）、ＣＰＵ１０１は、変数ｊの値及び変数ｃｏｕｎｔｅｒの値に１を加算する（Ｓ５３）。その後、ＣＰＵ１０１は、Ｓ４２以降の処理を再度行う。
【００８７】
また、Ｓ４４の処理において、各値の全てが等しいと判定した場合（Ｓ４４のＹＥＳ）、ＣＰＵ１０１は、図１７に示すように、新たなＮ次元の固定長配列を生成する（Ｓ６１）。
【００８８】
そして、ＣＰＵ１０１は、新たなＮ次元の固定長配列のうちのＮ次元目に、１次元の固定長配列に格納されているデータを格納し、新たなＮ次元の固定長配列のうちの１からＮ−１次元目に、それぞれの次元よりも１つ大きい次元に対応する領域の先頭アドレスを格納する（Ｓ６２）。
【００８９】
その後、ＣＰＵ１０１は、新たなＮ次元の固定長配列に格納されたデータをアクセス先のデータとして設定する（Ｓ６３）。
【００９０】
すなわち、ＣＰＵ１０１は、Ｓ４２の処理においてデータが格納された１次元の固定長配列に代えて、Ｓ６１の処理において生成された新たなＮ次元の固定長配列に格納されたデータをアクセス先のデータとして設定する。
【００９１】
これにより、担当者は、例えば、Ｓ１３の処理で生成した中間言語１３２ｂに含まれるＣＯＤＥ３のうち、ループで囲まれた部分についての変更を行う必要がなくなる。
【００９２】
図１４に戻り、最適化部１１ｂは、Ｓ１３の処理で生成した中間言語１３２ｂに対し、その他の必要な最適化を行う（Ｓ３３）。そして、最適化部１１ｂは、Ｓ１３の処理で生成した中間言語１３２ｂの最適化を終了する。
【００９３】
なお、最適化部１１ｂは、Ｓ２２の処理において、Ｎ次元の可変長配列等のうちの少なくとも１つが特定されなかったと判定した場合（Ｓ２３のＮＯ）についても同様に、中間言語１３２ｂの最適化を終了する。
【００９４】
［Ｓ２５の処理で更新された命令の実行時における具体例（１）］
次に、Ｓ２５の処理で中間言語１３２ｂが更新された命令のうち、Ｎ次元の固定長配列に対するデータの格納を行う命令の実行時（オブジェクトコード１３３ｂの実行時）における具体例について説明を行う。図１９及び図２０は、Ｓ２５の処理で中間言語１３２ｂが更新された命令の実行時における具体例について説明する図である。
【００９５】
初めに、配列ｖの具体例について説明を行う。図１９は、配列ｖの具体例を説明する図である。
【００９６】
図１９に示す配列ｖは、配列ｉｖ１、配列ｉｖ２及び配列ｉｖ３をそれぞれ有している。そして、図１９に示す配列ｉｖ１は、アドレス０ｘ０１００に対応する領域に格納された「０」と、アドレス０ｘ０１０８に対応する領域に格納された「１．５」と、アドレス０ｘ０１１６に対応する領域に格納された「３．０」と、アドレス０ｘ０１２４に対応する領域に格納された「４．５」とを有している。図１９に含まれる他の情報についての説明は省略する。
【００９７】
次に、配列ｄａｔａの具体例について説明を行う。図２０は、配列ｄａｔａの具体例を説明する図である。
【００９８】
図２０に示す配列ｄａｔａは、１次元目の要素として、アドレス０ｘ０１００に対応する領域に格納された「０」と、アドレス０ｘ０１０８に対応する領域に格納された「１．５」と、アドレス０ｘ０１１６に対応する領域に格納された「３」と、アドレス０ｘ０１２４に対応する領域に格納された「４．５」とを有している。なお、図２０に示す配列ｄａｔａの１次元目の要素が格納される領域のうち、アドレス０ｘ０１３２以降に対応する各領域には、要素が格納されていない。図２０に含まれる他の情報についての説明は省略する。
【００９９】
そして、例えば、オブジェクトコード１３３ｂを実行するＣＰＵ１０１（以下、単にＣＰＵ１０１とも呼ぶ）は、Ｓ２５の処理で更新された命令を実行する場合、図２０に示すように、配列ｖに対するデータの格納（図１９で説明したデータの格納）に代えて、配列ｄａｔａに対するデータの格納（図２０で説明したデータの格納）を行う。
【０１００】
［Ｓ２５の処理で更新された命令の実行時における具体例（２）］
次に、Ｓ２５の処理で中間言語１３２ｂが更新された命令のうち、アドレス情報１３５を生成する命令の実行時（ソースコード１３１ｂから生成されたオブジェクトコード１３３ｂの実行時）における具体例について説明を行う。図２１は、アドレス情報１３５の具体例について説明する図である。
【０１０１】
図２１に示すアドレス情報１３５は、各データに対応する配列ｖに含まれる配列を示す情報が設定される「ｖｅｃｔｏｒカウント」と、各データの格納が行われる連続領域の先頭アドレスが設定される「アドレス」と、各データの格納が行われる連続領域に格納されたデータの数が設定される「データ数」とを項目として有する。「ｖｅｃｔｏｒカウント」には、例えば、図１９で説明した配列ｖのうち、配列ｖｉ１、配列ｖｉ２及び配列ｖｉ３のそれぞれに対応する「１」、「２」及び「３」のいずれかが設定される。
【０１０２】
具体的に、図２０に示す配列ｄａｔａには、１次元目の要素（配列ｖｉ１に対応する次元の要素）として、アドレス０ｘ０１００を先頭アドレスとする領域に格納された４つの要素が含まれており、２次元目の要素（配列ｖｉ２に対応する次元の要素）として、アドレス０ｘ０２００を先頭アドレスとする領域に格納された２つの要素が含まれており、３次元目の要素（配列ｖｉ３に対応する次元の要素）として、アドレス０ｘ０３００を先頭アドレスとする領域に格納された３つの要素が含まれている。
【０１０３】
そのため、ＣＰＵ１０１は、図２１に示すように、「項番」が「１」である情報の「ｖｅｃｔｏｒカウント」として「１」を設定し、「アドレス」として「０ｘ０１００」を設定し、「データ数」として「４」を設定する。
【０１０４】
また、ＣＰＵ１０１は、「項番」が「２」である情報の「ｖｅｃｔｏｒカウント」として「２」を設定し、「アドレス」として「０ｘ０２００」を設定し、「データ数」として「２」を設定する。
【０１０５】
さらに、ＣＰＵ１０１は、「項番」が「３」である情報の「ｖｅｃｔｏｒカウント」として「３」を設定し、「アドレス」として「０ｘ０３００」を設定し、「データ数」として「３」を設定する。
【０１０６】
［Ｓ３１の処理で更新された命令の実行時における具体例］
次に、Ｓ３１の処理で更新された命令の実行時（ソースコード１３１ｂから生成されたオブジェクトコード１３３ｂの実行時）における具体例について説明を行う。
【０１０７】
図２１で説明したアドレス情報１３５には、「ｖｅｃｔｏｒカウント」として「１」、「２」及び「３」が設定されており、「データ数」として「４」、「２」及び「３」が設定されている。そのため、ＣＰＵ１０１は、例えば、「データ数」に設定された値の合計値である「９」と、各データ（例えば、ｄｏｕｂｌｅ型のデータ）のサイズである「８（バイト）」とを乗算した値である「７２（バイト）」を算出する。そのため、ＣＰＵ１０１は、配列ｄａｔａ２に対応する領域として「７２（バイト）」の領域を確保する。
【０１０８】
［Ｓ３２の処理で更新された命令の実行時における具体例］
次に、Ｓ３２の処理で更新された命令の実行時（ソースコード１３１ｂから生成されたオブジェクトコード１３３ｂの実行時）における具体例について説明を行う。図２２から図２４は、Ｓ３２の処理で追加された命令の実行時における具体例について説明する図である。
【０１０９】
図２０で説明した配列ｄａｔａには、１次元目の要素として、アドレス０ｘ０１００に対応する領域に格納された「０」と、アドレス０ｘ０１０８に対応する領域に格納された「１．５」と、アドレス０ｘ０１１６に対応する領域に格納された「３」と、アドレス０ｘ０１２４に対応する領域に格納された「４．５」とが含まれている。
【０１１０】
そのため、変数ｉの値が「０」、変数ｊの値が「０」及び変数ｃｏｕｎｔｅｒの値が「０」である場合、ＣＰＵ１０１は、図２２に示すように、配列ｄａｔａ［０］［０］に格納されている「０」を、配列ｄａｔａ２［０］に格納する（１回目のＳ４２）。続いて、変数ｉの値が「０」、変数ｊの値が「１」及び変数ｃｏｕｎｔｅｒの値が「１」である場合、ＣＰＵ１０１は、図２２に示すように、配列ｄａｔａ［０］［１］に格納されている「１．５」を、配列ｄａｔａ２［１］に格納する（２回目のＳ４２）。そして、変数ｉの値が「０」、変数ｊの値が「２」及び変数ｃｏｕｎｔｅｒの値が「２」である場合、ＣＰＵ１０１は、図２２に示すように、配列ｄａｔａ［０］［２］に格納されている「３．０」を、配列ｄａｔａ２［２］に格納する（３回目のＳ４２）。さらに、変数ｉの値が「０」、変数ｊの値が「３」及び変数ｃｏｕｎｔｅｒの値が「３」である場合、ＣＰＵ１０１は、図２２に示すように、配列ｄａｔａ［０］［３］に格納されている「４．５」を、配列ｄａｔａ２［３］に格納する（４回目のＳ４２）。
【０１１１】
ここで、図２１で説明したアドレス情報１３５における「ｖｅｃｔｏｒカウント」が「１」である情報（「項番」が「１」である情報）の「データ数」には、現在の変数ｊの値と同じ値である「３」に「１」を加算した値である「４」が設定されている（Ｓ４４のＮＯ、Ｓ５１のＹＥＳ）。そのため、ＣＰＵ１０１は、変数ｉの値を「１」に更新し、変数ｃｏｕｎｔｅｒの値を「４」に更新し、変数ｊの値を「０」に更新する（Ｓ５２）。
【０１１２】
そして、ＣＰＵ１０１は、Ｓ４２等の処理を繰り返し行うことにより、図２２に示すように、図２１で説明した配列ｄａｔａに格納されたデータのそれぞれを、配列ｄａｔａ２に格納する。
【０１１３】
その後、ＣＰＵ１０１は、Ｓ１２の処理で特定された可変長配列が２次元の配列であるため、新たな２次元の固定長配列である配列ｄａｔａ２＿ｂｏｘを生成する（Ｓ６１）。
【０１１４】
そして、ＣＰＵ１０１は、図２３に示すように、配列ｄａｔａ２＿ｂｏｘの２次元目に、Ｓ４２の処理で配列ｄａｔａ２に格納されたデータのそれぞれを再格納する。また、ＣＰＵ１０１は、この場合、配列ｄａｔａ２＿ｂｏｘの１次元目に、配列ｄａｔａ２＿ｂｏｘの２次元目に対応する領域の先頭アドレスである「０ｘ３０００」を格納する（Ｓ６２）。
【０１１５】
なお、ＣＰＵ１０１は、Ｓ１２の処理で特定された可変長配列が３次元以上の配列である場合、新たな３次元以上の固定長配列である配列ｄａｔａＮ＿ｂｏｘを生成するものであってよい。
【０１１６】
具体的に、ＣＰＵ１０１は、例えば、Ｓ１２の処理で特定された可変長配列が３次元の配列である場合、新たな３次元の固定長配列である配列ｄａｔａ３＿ｂｏｘを生成する。そして、ＣＰＵ１０１は、図２４に示すように、配列ｄａｔａ３＿ｂｏｘの３次元目に、Ｓ４２の処理で配列ｄａｔａ２に格納されたデータのそれぞれを再格納する。また、ＣＰＵ１０１は、この場合、配列ｄａｔａ３＿ｂｏｘの２次元目に、配列ｄａｔａ３＿ｂｏｘの３次元目に対応する領域の先頭アドレスである「０ｘ４０００」を格納し、配列ｄａｔａ３＿ｂｏｘの１次元目に、配列ｄａｔａ３＿ｂｏｘの２次元目に対応する領域の先頭アドレスである「０ｘ３０００」を格納する。
【０１１７】
このように、本実施の形態におけるコンパイラ１１は、ソースコード１３１ｂのコンパイル時において、Ｎ次元の可変長配列に対する特定データの格納を行う命令がソースコード１３１ｂに含まれている場合、Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対して特定データを格納するように、オブジェクトコード１３３ｂを生成する。
【０１１８】
また、コンパイラ１１は、ソースコード１３１ｂのコンパイル時において、Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令がソースコード１３１ｂに含まれている場合、Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納し、１次元の固定長配列に格納されたデータに対して順にアクセスが行われるように、オブジェクトコード１３３ｂを生成する。
【０１１９】
すなわち、本実施の形態におけるコンパイラ１１は、Ｎ次元の可変長配列に対してデータを格納する旨の命令がソースコード１３１に含まれている場合、Ｎ次元の可変長配列に対してデータを格納する旨の命令を、１次元の固定長配列に対して連続してデータを格納する旨の命令に変換してオブジェクトコード１３３を生成する。
【０１２０】
これにより、コンパイラ１１は、不連続なメモリ領域に格納されたデータに対するアクセスの発生を抑制したオブジェクトコード１３３ｂを生成することが可能になる。そのため、コンパイラ１１は、実行時におけるキャッシュヒット率が高いオブジェクトコード１３３ｂを生成することが可能になる。
【０１２１】
以上の実施の形態をまとめると、以下の付記のとおりである。
【０１２２】
（付記１）
ソースコードのコンパイルを実行してオブジェクトコードを生成する情報処理装置であって、
Ｎ（Ｎは２以上の整数）次元の可変長配列に対する特定データの格納を行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対して前記特定データを格納するように、前記オブジェクトコードを生成する格納先変更部と、
前記Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納するように、前記オブジェクトコードを生成するアクセス先変更部と、を有する、
ことを特徴とする情報処理装置。
【０１２３】
（付記２）
付記１において、さらに、
前記特定データの格納先のアドレスを示すアドレス情報を記憶する記憶部と、を有し、
前記アクセス先変更部は、前記アドレス情報が記憶された前記記憶部を参照し、前記Ｎ次元の固定長配列に格納されているデータのそれぞれの格納位置を特定し、特定した前記格納位置に格納されたデータのそれぞれを前記１次元の固定長配列に連続して格納するように、前記オブジェクトコードを生成する、
ことを特徴とする情報処理装置。
【０１２４】
（付記３）
付記２において、
前記アクセス先変更部は、前記アドレス情報が記憶された前記記憶部を参照し、前記Ｎ次元の固定長配列に格納されているデータのデータ長の合計値を算出し、前記Ｎ次元の固定長配列に格納されているデータのそれぞれを格納する前に、前記１次元の固定長配列に対応する領域として、算出した前記合計値に対応する領域を確保するように、前記オブジェクトコードを生成する、
ことを特徴とする情報処理装置。
【０１２５】
（付記４）
付記２において、
前記アドレス情報は、前記Ｎ次元の固定長配列に対応する領域において、連続する領域に格納された複数の前記特定データが格納された領域の先頭アドレスを示す先頭アドレス情報と、連続する領域に格納された複数の前記特定データごとに、前記特定データの数を示す情報を示すデータ数情報とを含む、
ことを特徴とする情報処理装置。
【０１２６】
（付記５）
付記１において、
前記アクセス先変更部は、前記Ｎ次元の固定長配列に格納されているデータのそれぞれを前記１次元の固定長配列に対して格納した後、前記Ｎ次元の新たな固定長配列を生成し、生成した前記新たな固定長配列における前記Ｎ次元のうち、１次元目からＮ−１次元目のそれぞれに対応する領域に、２次元目からＮ次元目に対応する領域の先頭アドレスを示すデータを格納し、前記新たな固定長配列における前記Ｎ次元のうち、Ｎ次元目に対応する領域に、前記１次元の固定長配列に格納されたデータのそれぞれを格納し、前記新たな固定長配列に格納されたデータのそれぞれに対して順にアクセスが行われるように、前記オブジェクトコードを生成する、
ことを特徴とする情報処理装置。
【０１２７】
（付記６）
ソースコードのコンパイルを実行してオブジェクトコードを生成する処理をコンピュータに実行させるコンパイラプログラムであって、
Ｎ次元の可変長配列に対する特定データの格納を行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対して前記特定データを格納するように、前記オブジェクトコードを生成し、
前記Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納するように、前記オブジェクトコードを生成する、
ことを特徴とするコンパイラプログラム。
【０１２８】
（付記７）
付記６において、さらに、
前記特定データの格納先のアドレスを示すアドレス情報を記憶部に記憶する、
処理をコンピュータに実行させ、
前記１次元の固定長配列に格納されたデータに対して順にアクセスが行われるようにオブジェクトコードを生成する処理では、前記アドレス情報が記憶された前記記憶部を参照し、前記Ｎ次元の固定長配列に格納されているデータのそれぞれの格納位置を特定し、特定した前記格納位置に格納されたデータのそれぞれを前記１次元の固定長配列に連続して格納するように、前記オブジェクトコードを生成する、
ことを特徴とするコンパイラプログラム。
【０１２９】
（付記８）
ソースコードのコンパイルを実行してオブジェクトコードを生成するコンパイル方法であって、
Ｎ次元の可変長配列に対する特定データの格納を行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の可変長配列に代えて、Ｎ次元の固定長配列に対して前記特定データを格納するように、前記オブジェクトコードを生成し、
前記Ｎ次元の可変長配列に格納されたデータに対して順にアクセスを行う命令が前記ソースコードに含まれている場合、前記Ｎ次元の固定長配列に格納されているデータのそれぞれを１次元の固定長配列に連続して格納するように、前記オブジェクトコードを生成する、
ことを特徴とするコンパイル方法。
【０１３０】
（付記９）
付記８において、さらに、
前記特定データの格納先のアドレスを示すアドレス情報を記憶部に記憶し、
前記１次元の固定長配列に格納されたデータに対して順にアクセスが行われるようにオブジェクトコードを生成する工程では、前記アドレス情報が記憶された前記記憶部を参照し、前記Ｎ次元の固定長配列に格納されているデータのそれぞれの格納位置を特定し、特定した前記格納位置に格納されたデータのそれぞれを前記１次元の固定長配列に連続して格納するように、前記オブジェクトコードを生成する、
ことを特徴とするコンパイル方法。
【符号の説明】
【０１３１】
１：情報処理装置              ３：操作端末
１１：コンパイラ              １１ａ：解析部
１１ｂ：最適化部              １１ｃ：コード生成部
１２：リンカ                  １３０：情報格納領域
１３１：ソースコード          １３２：中間言語
１３３：オブジェクトコード    １３４：実行ファイル
【図１】
2019219912.tif 000003
【図２】
2019219912.tif 000004
【図３】
2019219912.tif 000005
【図４】
2019219912.tif 000006
【図５】
2019219912.tif 000007
【図６】
2019219912.tif 000008
【図７】
2019219912.tif 000009
【図８】
2019219912.tif 000010
【図９】
2019219912.tif 000011
【図１０】
2019219912.tif 000012
【図１１】
2019219912.tif 000013
【図１２】
2019219912.tif 000014
【図１３】
2019219912.tif 000015
【図１４】
2019219912.tif 000016
【図１５】
2019219912.tif 000017
【図１６】
2019219912.tif 000018
【図１７】
2019219912.tif 000019
【図１８】
2019219912.tif 000020
【図１９】
2019219912.tif 000021
【図２０】
2019219912.tif 000022
【図２１】
2019219912.tif 000023
【図２２】
2019219912.tif 000024
【図２３】
2019219912.tif 000025
【図２４】
2019219912.tif 000026