(57)【要約】【課題】ソースプログラムをコンパイルしたプログラムのアクセス性能を向上させること。【解決手段】計算機１０１は、部分オブジェクトｏ２のアクセス回数に、メンバｍ２１、ｍ２２のアクセス回数を加算するとともに、部分オブジェクトｏ３のアクセス回数に、メンバｍ３１、ｍ３２のアクセス回数を加算する。次に、計算機１０１は、加算した加算後の部分オブジェクトｏ２、ｏ３のアクセス回数に基づいて、ターゲットの記憶領域に配置する際の部分オブジェクトｏ２、ｏ３の順序を決定する。具体的には、図１の（ｂ）で示すように、計算機１０１は、アクセス回数が多い順に、部分オブジェクトｏ３を１番目、部分オブジェクトｏ２を２番目に決定する。これにより、アクセス回数が多い部分オブジェクトｏ３がキャッシュメモリに記憶されやすくなるため、オブジェクトｏ１へのアクセス性能が向上することになる。【選択図】図１
2017010123.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
制御部を有することを特徴とするコンパイルを行う計算機。
【請求項２】
前記制御部は、
決定した前記各々のデータの順序と前記各々のデータのサイズとに基づいて、前記記憶領域に配置する際の前記オブジェクトの先頭アドレスからの前記各々のデータのオフセット値を決定することを特徴とする請求項１に記載のコンパイルを行う計算機。
【請求項３】
前記制御部は、
決定した前記各々のデータのオフセット値を、前記ソースプログラムに含まれる前記各々のデータのオフセット値を取得する命令の算出結果に設定することを特徴とする請求項２に記載のコンパイルを行う計算機。
【請求項４】
コンピュータが、
ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
処理を実行することを特徴とするコンパイラ方法。
【請求項５】
コンピュータに、
ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
処理を実行させることを特徴とするコンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラムに関する。
【背景技術】
【０００２】
従来、ソースプログラムをコンパイルして、コンピュータが実行可能なプログラムを生成する技術がある。また、プログラムのアクセス性能を向上させるために、プログラムの一部のデータをキャッシュメモリに記憶させる技術がある。関連する先行技術として、例えば、入力プログラムの解析結果からメモリアクセスする命令を解析し、構造体要素の配列上の配置、アクセス回数、アクセス順序を含むアクセスパターンに基づいて、構造体の要素の配列上の配置を変更するものがある。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１０−００３０３１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、従来技術によれば、ソースプログラムに規定されたオブジェクトに含まれるいずれかのデータに他のデータが含まれるという入れ子構造があると、ソースプログラムをコンパイルして得られるプログラムのアクセス性能を向上させることが困難である。具体的には、例えば、ソースプログラムから、入れ子構造の外側のデータが表記された回数を入れ子構造の外側のデータのアクセス回数としても、正確なアクセス回数とはならない場合がある。そして、正確でないアクセス回数に従ってデータの配置を変更しても、プログラムのアクセス性能が向上するとは限らない。また、アクセス回数が多いデータの配置を入れ子構造を無視して変更すると、プログラムが正しく動作しない場合がある。
【０００５】
１つの側面では、本発明は、ソースプログラムをコンパイルしたプログラムのアクセス性能を向上させることができるコンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明の一側面によれば、ソースプログラムに基づき計数したソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、ソースプログラムに基づき計数した各々のデータに含まれるデータへのアクセス回数を加算し、加算した加算後の各々のデータへのアクセス回数に基づいて、ソースプログラムをコンパイルして記憶領域に配置する際の各々のデータの順序を決定するコンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラムが提案される。
【発明の効果】
【０００７】
本発明の一態様によれば、ソースプログラムをコンパイルしたプログラムのアクセス性能を向上させることができるという効果を奏する。
【図面の簡単な説明】
【０００８】
【図１】図１は、計算機１０１の動作例を示す説明図である。
【図２】図２は、計算機１０１のハードウェア構成例を示す説明図である。
【図３】図３は、計算機１０１の機能構成例を示す説明図である。
【図４】図４は、Ｃ＋＋言語で記載されたソースプログラム１１１の一例を示す説明図である。
【図５】図５は、ソースチューニング前における中間言語１情報３２１の型情報の一例を示す説明図である。
【図６】図６は、ソースチューニング前におけるデータ構造の一例を示す説明図である。
【図７】図７は、ソースチューニング前における中間言語１情報３２１の式情報の一例を示す説明図である。
【図８】図８は、コンパイル処理手順の一例を示すフローチャートである。
【図９】図９は、チューニング情報３２２の記憶内容の一例を示す説明図である。
【図１０】図１０は、アクセス回数収集処理手順の一例を示すフローチャート（その１）である。
【図１１】図１１は、アクセス回数収集処理手順の一例を示すフローチャート（その２）である。
【図１２】図１２は、アクセス回数収集処理手順の一例を示すフローチャート（その３）である。
【図１３】図１３は、部分オブジェクトアクセス回数更新処理手順の一例を示すフローチャートである。
【図１４】図１４は、メンバ情報配置場所決定処理手順の一例を示すフローチャート（その１）である。
【図１５】図１５は、メンバ情報配置場所決定処理手順の一例を示すフローチャート（その２）である。
【図１６】図１６は、メンバ情報配置場所反映処理手順の一例を示すフローチャート（その１）である。
【図１７】図１７は、メンバ情報配置場所反映処理手順の一例を示すフローチャート（その２）である。
【図１８】図１８は、ソースチューニング後における中間言語１情報３２３の型情報の一例を示す説明図である。
【図１９】図１９は、ソースチューニング後におけるデータ構造の一例を示す説明図である。
【図２０】図２０は、データ構造の変更結果を示す説明図である。
【発明を実施するための形態】
【０００９】
以下に図面を参照して、開示のコンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラムの実施の形態を詳細に説明する。
【００１０】
図１は、計算機１０１の動作例を示す説明図である。図１に示す計算機１０１は、コンパイルを行う計算機である。計算機１０１は、例えば、自動計算機、すなわちコンピュータである。例えば、計算機１０１は、利用者が用意したソースプログラムをコンパイルして、実行可能なプログラムを作成する。以下、実行可能なプログラムを、「オブジェクトプログラム」と称する。ここで、作成したオブジェクトプログラムは、計算機１０１をターゲットとするものでもよいし、他のコンピュータをターゲットとするものでもよい。また、計算機１０１は、例えば、ハイ・パフォーマンス・コンピューティング（ＨＰＣ：Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｃｏｍｐｕｔｉｎｇ）分野で使用されるコンピュータである。
【００１１】
利用者が用意したソースプログラムは、プログラム言語に従って記述される。そして、作成されたオブジェクトプログラムを高性能にするためには、性能を意識したプログラミングが行われていることが要求される。
【００１２】
ここで、性能を向上させる技術としては、例えば、与えられたソースプログラムを、コンパイラの最適化オプションを指定してコンパイルし、性能評価するものがある。また、さらに性能を向上させたい場合には、複数の最適化オプションを組み合わせて指定することによるオプションチューニングを行うことも考えられる。加えて、チューニングツールによりボトルネックである処理を抽出し、ソースプログラムを理解した上で、ソースレベルのチューニング作業を行うことも考えられる。チューニング作業の例としては、ソースプログラム中のループ構造を変更したり、最適化を指示する制御行を挿入したり、アクセス頻度の高い変数に最適化を適用しやすくする属性を記述したりするという作業である。
【００１３】
しかしながら、ソースレベルのチューニング作業はノウハウが要求される場合が多く、一般の利用者には困難な場合がある。また、経験豊かなチューニング担当者であっても、チューニングにかかる時間が多くなる場合がある。
【００１４】
また、プログラム言語の観点からも、チューニングを困難にする要因がある。ここで、コンパイルの工程には、字句解析、構文解析、意味解析を行うフロントエンドと、最適化処理やコード生成を行うバックエンドとがある。フロントエンドは、プログラム言語の仕様に依存する処理であり、ターゲットのアーキテクチャには依存しない。一方、バックエンドは、プログラム言語の仕様には依存せず、ターゲットのアーキテクチャに依存する処理である。
【００１５】
フロントエンドは、元のソースプログラムから、ソースプログラム内の宣言、文、式等の情報が保持された中間言語１情報を生成する。そして、フロントエンドは、中間言語１情報から、アーキテクチャに近い情報に変換された中間言語２情報に変換する。そして、バックエンドは、中間言語２情報に対して最適化を行い、コード生成を行う。従って、元となるソースプログラムの内容によっては、利用者が期待したほどの最適化が行われない場合がある。
【００１６】
最適化の一例として、ＦｏｒｔｒａｎやＣ言語といったプログラム言語において、構造体の中のアクセスが多いデータを、データの先頭側に移動することにより、実行時にターゲットのキャッシュメモリに格納しやすくして、アクセス性能の向上を図る技術がある。
【００１７】
しかしながら、ソースプログラムに規定されたオブジェクトに含まれるいずれかのデータに他のデータが含まれるという入れ子構造があると、ソースプログラムをコンパイルして得られるオブジェクトプログラムのアクセス性能を向上させることが困難である。具体的には、例えば、ソースプログラムから、入れ子構造の外側のデータが表記された回数を入れ子構造の外側のデータのアクセス回数としても、入れ子構造の内側のデータが考慮されていないため、正確なアクセス回数とはならない場合がある。そして、正確でないアクセス回数に従ってデータの配置を変更しても、オブジェクトプログラムのアクセス性能が向上するとは限らない。また、アクセス回数が多いデータの配置を入れ子構造を無視して変更すると、オブジェクトプログラムが正しく動作しない場合がある。
【００１８】
特に、Ｃ＋＋言語のようなオブジェクト指向言語では、複数の階層のオブジェクトのそれぞれにアクセスする際に、全て同一のアドレスでアクセスする可能性がある。従って、要素別のアクセス頻度を参照するだけでは、アクセス頻度の高いアドレスの正確な検出が困難である。例えば、Ｃ＋＋言語において、派生クラスのオブジェクトの先頭アドレスと、派生クラス内の基底クラスのデータの先頭アドレスとは同一となる。ここで、派生クラス内の基底クラスのデータを、部分オブジェクトと称する。
【００１９】
そして、Ｃ＋＋言語では、部分オブジェクトの単位で処理する式が記述される場合が多く、さらにＣ＋＋言語の処理論理上、処理系が部分オブジェクトへのアクセスを内部生成する場合がある。部分オブジェクトのデータ構造は、入れ子構造と同様のデータ構造になるため、基底クラス内のアクセス回数が多いメンバだけをデータ構造変更の対象にすることができない。さらに、バックエンドでは、メンバへのアクセスを、「データの先頭アドレス＋メンバのオフセット＋メンバのサイズ」で処理する。従って、バックエンドでは、派生クラス内の部分オブジェクトの情報は失われているため、バックエンドでデータ構造変更を行おうとする場合、対象のメンバが含まれる部分オブジェクトを含む派生クラスのアクセス状況をチェックすることができない。
【００２０】
そこで、本実施の形態では、コンパイル時に、オブジェクト内の各データのアクセス回数に、各データに含まれるデータのアクセス回数を加えた各値に基づいて、各データの配置順序を決定する方法について説明する。以下の例では、ソースプログラムがＣ＋＋言語で記載された例を用いて説明する。Ｃ＋＋言語では、オブジェクトの中に、データとしてメンバを有する。また、オブジェクトが派生クラスであれば、オブジェクトの中に、データとして部分オブジェクトを有する。
【００２１】
図１を用いて、計算機１０１の動作について説明する。図１の（ａ）に示すソースプログラム１１１は、オブジェクトｏ１を規定する。そして、オブジェクトｏ１は、部分オブジェクトｏ２、ｏ３を有する。部分オブジェクトｏ２は、メンバｍ２１、ｍ２２を有する。また、部分オブジェクトｏ３は、メンバｍ３１、ｍ３２を有する。そして、オブジェクトｏ２自身のアクセス回数は、２回である。そして、メンバｍ２１、ｍ２２のアクセス回数は、それぞれ、２回、１回である。また、オブジェクトｏ３自身のアクセス回数は、１回である。そして、メンバｍ３１、ｍ３２のアクセス回数は、それぞれ、４回、２回である。ここで、図１の（ａ）におけるオブジェクトｏ１〜ｏ３、メンバｍ２１〜ｍ３２のそれぞれのアクセス回数は、中間言語１情報に含まれる式情報に表記された回数から計数することにより得られたものである。中間言語１情報に含まれる式情報の具体例については、図７で示す。
【００２２】
計算機１０１は、部分オブジェクトｏ２のアクセス回数に、メンバｍ２１、ｍ２２のアクセス回数を加算するとともに、部分オブジェクトｏ３のアクセス回数に、メンバｍ３１、ｍ３２のアクセス回数を加算する。図１の（ａ）の例では、計算機１０１は、部分オブジェクトｏ２のアクセス回数である２にメンバｍ２１、ｍ２２のアクセス回数２、１を加算し、５を得る。同様に、計算機１０１は、部分オブジェクトｏ３のアクセス回数である１にメンバｍ３１、ｍ３２のアクセス回数４、２を加算し、７を得る。
【００２３】
次に、計算機１０１は、加算した加算後の部分オブジェクトｏ２、ｏ３のアクセス回数に基づいて、ターゲットの記憶領域に配置する際の部分オブジェクトｏ２、ｏ３の順序を決定する。具体的には、図１の（ｂ）で示すように、計算機１０１は、アクセス回数が多い順に、部分オブジェクトｏ３を１番目、部分オブジェクトｏ２を２番目に決定する。
【００２４】
図１の（ｃ）では、コンパイル後のオブジェクトプログラムを実行した際の例である。図１の（ｃ）におけるハッチを付与した領域は、ターゲットのキャッシュメモリに記憶された領域を示す。このように、アクセス回数が多い部分オブジェクトｏ３がキャッシュメモリに記憶されるため、オブジェクトｏ１へのアクセス性能が向上することになる。
【００２５】
なお、本実施の形態では、プログラム言語の例としてＣ＋＋言語を用いて説明したが、Ｊａｖａ（登録商標）等の他のオブジェクト指向言語に対しても適用可能である。次に、計算機１０１のハードウェア構成について、図２を用いて説明する。
【００２６】
図２は、計算機１０１のハードウェア構成例を示す説明図である。図２において、計算機１０１は、ＣＰＵ２０１と、ＲＯＭ（Ｒｅａｄ−Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、を含む。また、計算機１０１は、ディスクドライブ２０４およびディスク２０５と、通信インターフェース２０６と、を含む。また、ＣＰＵ２０１〜ディスクドライブ２０４、通信インターフェース２０６はバス２０７によってそれぞれ接続される。
【００２７】
ＣＰＵ２０１は、計算機１０１の全体の制御を司る演算処理装置である。また、計算機１０１は、複数のＣＰＵを有してもよい。ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。ＲＡＭ２０３は、ＣＰＵ２０１のワークエリアとして使用される揮発性メモリである。
【００２８】
ディスクドライブ２０４は、ＣＰＵ２０１の制御に従ってディスク２０５に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ２０４には、例えばディスクドライブ、光ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク２０５は、ディスクドライブ２０４の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ２０４が磁気ディスクドライブである場合、ディスク２０５には、磁気ディスクを採用することができる。また、ディスクドライブ２０４が光ディスクドライブである場合、ディスク２０５には、光ディスクを採用することができる。また、ディスクドライブ２０４がソリッドステートドライブである場合、ディスク２０５には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
【００２９】
通信インターフェース２０６は、ネットワークと内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース２０６は、通信回線を通じてネットワークを介して計算機１０１を利用する利用者端末等の他の装置に接続される。通信インターフェース２０６には、例えば、モデムやＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）アダプタなどを採用することができる。
【００３０】
また、計算機１０１の管理者が、計算機１０１を直接操作する場合、計算機１０１は、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。
【００３１】
（計算機１０１の機能構成例）
図３は、計算機１０１の機能構成例を示す説明図である。計算機１０１は、制御部を有する。制御部は、意味解析部３０１と、ソースチューニング部３０２と、中間言語変換部３０３と、最適化・コード生成部３０４とを有する。ここで、意味解析部３０１〜中間言語変換部３０３が、図１で説明したフロントエンドに相当する。また、最適化・コード生成部３０４が、図１で説明したバックエンドに相当する。
【００３２】
ソースチューニング部３０２は、加算部３１１と、決定部３１２と、設定部３１３とを含む。制御部は、記憶装置に記憶されたプログラムをＣＰＵ２０１が実行することにより、各部の機能を実現する。記憶装置とは、具体的には、例えば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、ディスク２０５などである。また、各部の処理結果は、ＣＰＵ２０１のレジスタや、ＣＰＵ２０１のキャッシュメモリ等に格納される。
【００３３】
意味解析部３０１は、ソースプログラム１１１を読み込んで、意味解析を行い、中間言語１情報３２１を生成する。ソースプログラム１１１の具体例を、図４で示す。中間言語１情報３２１には、型情報と式情報とが含まれる。中間言語１情報３２１の型情報の具体例を、図５で示す。また、中間言語１情報３２１の式情報の具体例を、図７で示す。
【００３４】
ソースチューニング部３０２は、チューニング情報３２２を用いながら中間言語１情報３２１のソースチューニングを行い、チューニング実施後の中間言語１情報３２３を生成する。具体的には、ソースチューニング部３０２は、下記３つのフェーズによりソースチューニングを行う。
【００３５】
１つ目のフェーズは、アクセス回数を収集する処理である。具体的には、ソースチューニング部３０２は、中間言語１情報３２１を走査し、メンバおよび単独でアクセスされる部分オブジェクトのアクセス回数を収集する。収集した情報を、型情報の単位でチューニング情報３２２に記録する。ここで、ソースチューニング部３０２に含まれる加算部３１１は、部分オブジェクト自身のアクセス回数に、所有する部分オブジェクトやメンバのアクセス回数を加算する。そして、加算部３１１は、加算した値を、部分オブジェクトのアクセス回数とする。これにより、アクセス回数が多いメンバが含まれる部分オブジェクトは、並び替え時の移動の優先度が高くなる。チューニング情報３２２の具体例を、図９で示す。また、アクセス回数を収集する処理のフローチャートを、図１０〜図１２で示す。
【００３６】
２つ目のフェーズは、メンバや部分オブジェクトの配置場所を決定する処理である。ソースチューニング部３０２に含まれる決定部３１２は、チューニング情報３２２に記録されたメンバおよび部分オブジェクトのアクセス回数に基づいて、メンバおよび部分オブジェクトの順序を決定する。例えば、決定部３１２は、アクセス回数が多いメンバおよび部分オブジェクトを優先して先頭になるように順序を決定する。また、決定部３１２は、アクセス回数が少ないメンバおよび部分オブジェクトが末尾になるように順序を決定してもよい。
【００３７】
また、決定部３１２は、アクセス回数が同一であるメンバおよび部分オブジェクトについて、メンバおよび部分オブジェクトのサイズの小さい順を、メンバおよび部分オブジェクトの順序として決定してもよい。
【００３８】
また、決定部３１２は、決定したメンバおよび部分オブジェクトの順序と、中間言語１情報３２１の型情報から得られるメンバおよび部分オブジェクトのサイズとに基づいて、メンバおよび部分オブジェクトのオフセット値を決定する。
【００３９】
例えば、あるオブジェクトに３つの部分オブジェクトがあり、順序が決定したとする。この場合、決定部３１２は、１番目に決定した部分オブジェクトのオフセット値を０に決定する。また、決定部３１２は、２番目に決定した部分オブジェクトのオフセット値を、１番目に決定した部分オブジェクトのサイズに決定する。さらに、決定部３１２は、３番目に決定した部分オブジェクトのオフセット値を、１番目と２番目に決定した部分オブジェクトのサイズの合計に設定する。また、決定部３１２は、コンパイラオプション等により４バイト境界、８バイト境界等のアライメントが設定されているならば、決定した順序に従い、かつ、アライメントに従ってメンバおよび部分オブジェクトのオフセット値を決定する。
【００４０】
２つ目のフェーズとなる、メンバや部分オブジェクトの配置場所を決定する処理のフローチャートを、図１４、図１５で示す。
【００４１】
３つ目のフェーズは、決定したオフセット値を反映する処理である。具体的には、ソースチューニング部３０２は、決定したオフセット値を使用して、中間言語１情報３２１に対してデータ構造変更を行い、中間言語１情報３２３を得る。このとき、ソースチューニング部３０２に含まれる設定部３１３は、決定したオフセット値を、メンバおよび部分オブジェクトのオフセット値を取得する命令の算出結果に設定する。メンバおよび部分オブジェクトのオフセット値を取得する命令の一例は、図７で示す。
【００４２】
中間言語変換部３０３は、中間言語１情報３２３から、中間言語２情報３２４を生成する。最適化・コード生成部３０４は、中間言語２情報３２４からオブジェクトプログラム３２５を生成する。
【００４３】
図４は、Ｃ＋＋言語で記載されたソースプログラム１１１の一例を示す説明図である。図４に示すソースプログラム１１１は、クラスＣ１〜Ｃ４と、ｇｅｔ＿ｓｕｂｏｂｊ（）関数とを定義する。
【００４４】
クラスＣ１は、メンバ変数ｍｅｍ１１とｍｅｍ１２とを有し、メンバ関数ａｄｄ（）と、ａｃｃｅｓｓ（）と、ｍｅｍ１２＿ｏｆｓ（）とを有する。クラスＣ２は、メンバ変数ｍｅｍ２１とｍｅｍ２２とを有する。
【００４５】
クラスＣ３は、クラスＣ１を基底クラスとした派生クラスである。さらに、クラスＣ３は、メンバ変数ｍｅｍ３１とｍｅｍ３２とを有する。
【００４６】
クラスＣ４は、クラスＣ２とクラスＣ３とを基底クラスとした派生クラスである。さらに、クラスＣ４は、メンバ変数ｍｅｍ４１とｍｅｍ４２とを有する。
【００４７】
ｇｅｔ＿ｓｕｂｏｂｊ（）関数は、クラスＣ４のオブジェクトｃ４ｏｂｊとクラスＣ１のオブジェクトｃ１ｏｂｊとをローカル変数として確保し、オブジェクトｃ４ｏｂｊのメンバ変数ｍｅｍ４２に０を代入する。そして、ｇｅｔ＿ｓｕｂｏｂｊ（）関数は、ｃ４ｏｂｊ内にあるクラスＣ１の部分オブジェクトを取り出してｃ１ｏｂｊに代入する。このとき、クラスＣ１の個々のメンバにはアクセスされず、クラスＣ１をひとまとめにしたアクセスが行われる。
【００４８】
図５は、ソースチューニング前における中間言語１情報３２１の型情報の一例を示す説明図である。型情報は、メンバまたは部分オブジェクトを１以上有する。図５では、ソースプログラム１１１の意味解析によって得られた中間言語１情報３２１の型情報５０１〜５０４を示す。ここで、部分オブジェクトとは、派生クラス内の基底クラスのデータのことである。また、部分オブジェクトの名称を、「ｓｕｂｏｂｊ＿派生クラス＿基底クラス」と呼称する。また、派生クラス１からさらに派生した派生クラス２の部分オブジェクトの名称を、「ｓｕｂｏｂｊ＿派生クラス２＿派生クラス１＿基底クラス」と呼称する。
【００４９】
また、型情報が有するメンバは、メンバの名称と、メンバのオフセット値と、メンバのサイズとを有する。メンバのオフセット値には、メンバが配置される先頭アドレスを、型情報が示すクラスのオブジェクトが配置される先頭アドレスからのオフセット値が格納される。また、メンバのサイズには、メンバのサイズが格納される。
【００５０】
また、型情報が有する部分オブジェクトは、部分オブジェクトの名称と、部分オブジェクトのオフセット値と、部分オブジェクトの型情報と、部分オブジェクトのサイズとを有する。メンバのオフセット値には、部分オブジェクトが配置される先頭アドレスを、型情報が示すクラスのオブジェクトが配置される先頭アドレスからのオフセット値が格納される。部分オブジェクトの型情報には、部分オブジェクトの型情報が格納される。また、部分オブジェクトのサイズには、部分オブジェクトのサイズが格納される。
【００５１】
以下、図示された型情報が有するメンバを、メンバの名称を符号として付与して示す。同様に、図示された型情報が有する部分オブジェクトを、部分オブジェクトの名称を符号として付与して示す。
【００５２】
例えば、型情報５０１となるクラスＣ１の型情報は、メンバｍｅｍ１１とメンバｍｅｍ１２とを有する。そして、メンバｍｅｍ１１は、オフセット値が０、すなわち、クラスＣ１のオブジェクトが配置される先頭アドレスに配置され、サイズが４であることを示す。また、メンバｍｅｍ１２は、オフセット値が４、すなわち、クラスＣ１のオブジェクトが配置される先頭アドレスに４加えたアドレスに配置され、サイズが４であることを示す。
【００５３】
また、型情報５０２となるクラスＣ２の型情報は、メンバｍｅｍ２１とメンバｍｅｍ２２とを有する。
【００５４】
また、型情報５０３となるクラスＣ３の型情報は、部分オブジェクトｓｕｂｏｂｊ＿Ｃ３＿Ｃ１とメンバｍｅｍ３１とメンバｍｅｍ３２とを有する。そして、例えば、部分オブジェクトｓｕｂｏｂｊ＿Ｃ３＿Ｃ１は、オフセット値が０、すなわち、クラスＣ３のオブジェクトが配置される先頭アドレスに配置され、型情報がＣ１であり、サイズが８であることを示す。
【００５５】
また、型情報５０４となるクラスＣ４の型情報は、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ２と部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３とメンバｍｅｍ４１とメンバｍｅｍ４２とを有する。そして、例えば、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ２は、オフセット値が０、すなわち、クラスＣ４のオブジェクトが配置される先頭アドレスに配置され、型情報がＣ２であり、サイズが８であることを示す。また、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３は、オフセット値が８、すなわち、クラスＣ４のオブジェクトが配置される先頭アドレスに８加えたアドレスに配置され、型情報がＣ２であり、サイズが８であることを示す。
【００５６】
図６は、ソースチューニング前におけるデータ構造の一例を示す説明図である。図６では、図５で示したクラスＣ４の型情報に従った場合における図４で示したｇｅｔ＿ｓｕｂｏｂｊ（）関数内のｃ４ｏｂｊのデータ構造を示す。
【００５７】
ｃ４ｏｂｊのデータ構造は、型情報５０４となるクラスＣ４の型情報に従って、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ２、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３、メンバｍｅｍ４１、メンバｍｅｍ４２の順で記憶領域上に配置される構造となる。
【００５８】
また、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ２のデータ構造は、型情報５０２となるクラスＣ２の型情報に従って、メンバｍｅｍ２１、メンバｍｅｍ２２の順で記憶領域上に配置される構造となる。
【００５９】
また、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３のデータ構造は、型情報５０３となるクラスＣ３の型情報に従って、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１、メンバｍｅｍ３１、メンバｍｅｍ３２の順で記憶領域上に配置される構造となる。さらに、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１のデータ構造は、型情報５０１となるクラスＣ１の型情報に従って、メンバｍｅｍ１１、メンバｍｅｍ１２の順で記憶領域上に配置される構造となる。
【００６０】
図７は、ソースチューニング前における中間言語１情報３２１の式情報の一例を示す説明図である。図７では、ソースプログラム１１１の意味解析によって得られた中間言語１情報の式情報７０１〜７０６を示す。
【００６１】
例えば、式情報７０１は、演算子が「＋」であり、「＋」演算子を実行することによりアクセスされるメンバがメンバｍｅｍ１１とメンバｍｅｍ１２とであることを示す。次に、計算機１０１が行うコンパイル処理を、図８を用いて説明する。
【００６２】
また、図３で説明した、メンバおよび部分オブジェクトのオフセット値を取得する命令の一例が、式情報７０５である。式情報７０５は、メンバｍｅｍ１２のオフセット値を取得する命令である。ソースチューニング前では、メンバｍｅｍ１２のオフセット値は、型情報５０１が示すように、４となる。
【００６３】
また、式情報７０６は、ソースプログラム１１１では「ｃ１ｏｂｊ＝ｃ４ｏｂｊ」という単純な代入文であるが、ｃ４ｏｂｊ内の一部分であるＣ１を有する。従って、計算機１０１は、中間言語１情報３２１生成時において、「ｃ１ｏｂｊ＝ｃ４ｏｂｊ」の代わりに、「ｃ１ｏｂｊ＝ｃ４ｏｂｊ．ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１」という式を自動生成する。
【００６４】
次に、図８〜図１５を用いて、計算機１０１が実行するフローチャートを示す。
【００６５】
図８は、コンパイル処理手順の一例を示すフローチャートである。コンパイル処理は、ソースプログラム１１１をコンパイルする処理である。計算機１０１は、ソースプログラムを読み込んで、意味解析を実行する（ステップＳ８０１）。次に、計算機１０１は、解析結果から、中間言語１情報３２１を生成する（ステップＳ８０２）。そして、計算機１０１は、コンパイル時のチューニングオプションを確認する（ステップＳ８０３）。チューニングオプションがありの場合（ステップＳ８０３：あり）、計算機１０１は、アクセス回数収集処理を実行する（ステップＳ８０４）。アクセス回数収集処理は、図１０〜図１２で説明する。
【００６６】
次に、計算機１０１は、メンバ情報配置場所決定処理を実行する（ステップＳ８０５）。メンバ情報配置場所決定処理は、図１４で説明する。そして、計算機１０１は、メンバ情報配置場所反映処理を実行する（ステップＳ８０６）。
【００６７】
ステップＳ８０６の処理終了後、または、チューニングオプションがなしの場合（ステップＳ８０３：なし）、計算機１０１は、中間言語１情報３２１、またはチューニング実施後の中間言語１情報３２３から中間言語２情報３２４を生成する（ステップＳ８０７）。そして、計算機１０１は、中間言語２情報３２４からオブジェクトプログラム３２５を生成する（ステップＳ８０８）。ステップＳ８０８の処理終了後、計算機１０１は、コンパイル処理を終了する。コンパイル処理を実行することにより、計算機１０１は、クラスを使用したプログラムにおいても、データ構造を変更したオブジェクトプログラムを生成することができる。
【００６８】
次に、コンパイル処理により生成したチューニング情報３２２を、図９を用いて説明する。
【００６９】
図９は、チューニング情報３２２の記憶内容の一例を示す説明図である。チューニング情報３２２は、型情報テーブル９０１と、メンバ情報とを有する。型情報テーブル９０１は、符号化されたクラスの型情報を記憶するテーブルである。ここで、符号化されたクラスの型情報は、派生クラスから基底クラスへのアクセス状況が判るように符号化された型情報である。
【００７０】
図９に示す型情報テーブル９０１は、Ｃ１、Ｃ２、Ｃ３、Ｃ３：：Ｃ１、Ｃ４、Ｃ４：：Ｃ２、Ｃ４：：Ｃ３、Ｃ４：：Ｃ３：：Ｃ１という８つの符号化された型情報を有する。そして、各符号化された型情報は、メンバ情報に対応付けられる。以下、符号化された型情報に対応付けられたメンバ情報を、「符号化された型情報＿メンバ名」の符号を付与して示す。
【００７１】
符号化された型情報に対応付けられたメンバ情報は、種類と、アクセス回数と、オフセット値という項目を有する。種類項目は、メンバ情報の種類を示す。具体的には、種類項目には、「メンバ」識別子か、「部分オブジェクト」識別子かのいずれかが格納される。アクセス回数は、メンバ情報が示すメンバまたは部分オブジェクトへのアクセス回数を示す。オフセット値は、符号化された型情報のオブジェクトの先頭アドレスからのオフセット値を示す。ここで、図９で示したオフセット値のうち、矢印によって値が更新しているものは、矢印の左の値が、アクセス回数収集処理が終了した時点での値を示す。また、矢印の右の値が、メンバ情報配置場所決定処理が終了した時点での値を示す。また、種類項目が「部分オブジェクト」識別子であるメンバ情報は、さらに、符号化されたクラスの型情報という項目を有する。符号化されたクラスの型情報は、部分オブジェクトの符号化されたクラスの型情報を示す。
【００７２】
例えば、符号化された型情報Ｃ１は、メンバ情報Ｃ１＿ｍｅｍ１１と、Ｃ１＿ｍｅｍ１２とを有する。例えば、メンバ情報Ｃ１＿ｍｅｍ１２は、種類がメンバであり、アクセス回数が０回であり、オフセット値が４であることを示す。アクセス回数やオフセット値の具体的な更新例は、アクセス回数収集処理や、メンバ情報配置場所決定処理内の各処理を用いて説明する。
【００７３】
図１０は、アクセス回数収集処理手順の一例を示すフローチャート（その１）である。また、図１１は、アクセス回数収集処理手順の一例を示すフローチャート（その２）である。また、図１２は、アクセス回数収集処理手順の一例を示すフローチャート（その３）である。アクセス回数収集処理は、アクセス回数を計数する処理である。
【００７４】
計算機１０１は、中間言語１情報３２１内の型情報を走査する（ステップＳ１００１）。以下、走査する処理について、計算機１０１は、対象を検出した後、次に走査を開始する際には、対象を検出した個所の次の個所から走査を開始する。
【００７５】
走査した結果、計算機１０１は、中間言語１情報３２１内に、型情報があるか否かを判断する（ステップＳ１００２）。型情報がある場合（ステップＳ１００２：Ｙｅｓ）、計算機１０１は、型情報が有するメンバおよび部分オブジェクトを走査する（ステップＳ１００３）。そして、走査した結果、計算機１０１は、メンバまたは部分オブジェクトがあるか否かを判断する（ステップＳ１００４）。メンバおよび部分オブジェクトがない場合（ステップＳ１００４：Ｎｏ）、計算機１０１は、別の型情報を走査すべく、ステップＳ１００１の処理に移行する。
【００７６】
一方、メンバまたは部分オブジェクトがある場合（ステップＳ１００４：Ｙｅｓ）、計算機１０１は、メンバまたは部分オブジェクトの登録として、符号化されたクラスの型情報をキーにして、クラスが保持するメンバおよび部分オブジェクトをチューニング情報３２２に登録する（ステップＳ１００５）。このとき、計算機１０１は、メンバ情報を作成して、型情報テーブル９０１から指標させる。具体的には、例えば、計算機１０１は、作成したメンバ情報の先頭アドレスと、符号化されたクラスの型情報とを一つのレコードとして型情報テーブル９０１に格納する。また、計算機１０１は、作成したメンバ情報のアクセス回数を０に設定する。また、計算機１０１は、作成したメンバ情報のオフセット値を、中間言語１情報３２１の型情報のオフセット値と同一の値に設定する。
【００７７】
次に、計算機１０１は、部分オブジェクトの登録中か否かを判断する（ステップＳ１００６）。部分オブジェクトの登録中である場合（ステップＳ１００６：Ｙｅｓ）、計算機１０１は、部分オブジェクトの型情報をキーにして、部分オブジェクトが有するメンバまたは子の部分オブジェクトをチューニング情報３２２に登録する（ステップＳ１００７）。ここで、チューニング情報３２２を登録する際には、部分オブジェクトが有するメンバまたは子の部分オブジェクトに対して、ステップＳ１００３の処理、ステップＳ１００５の処理を適用する。また、子の部分オブジェクトがさらに部分オブジェクトを有する場合には、計算機１０１は、ステップＳ１００３の処理、ステップＳ１００５の処理を再帰的に繰り返す。
【００７８】
ステップＳ１００７、または、部分オブジェクトの登録中でない場合（ステップＳ１００６：Ｎｏ）、計算機１０１は、ステップＳ１００３の処理に移行する。また、型情報がない場合（ステップＳ１００２：Ｎｏ）、計算機１０１は、チューニング情報３２２の全てのメンバ情報を登録し終えたことになる。そして、計算機１０１は、中間言語１情報３２１内の式情報を走査する（ステップＳ１１０１）。
【００７９】
走査した結果、計算機１０１は、式情報があるか否かを判断する（ステップＳ１１０２）。式情報がある場合（ステップＳ１１０２：Ｙｅｓ）、計算機１０１は、メンバまたは部分オブジェクトのアクセス式が見つかったか否かを判断する（ステップＳ１１０３）。ここで、メンバまたは部分オブジェクトのアクセス式を見つける処理として、計算機１０１は、式情報のメンバまたは部分オブジェクトに、メンバまたは部分オブジェクトの名称が含まれていれば、メンバまたは部分オブジェクトのアクセス式が見つかったとする。
【００８０】
メンバまたは部分オブジェクトのアクセス式が見つかった場合（ステップＳ１１０３：Ｙｅｓ）、計算機１０１は、見つかったメンバまたは部分オブジェクトが含まれる派生クラスの型情報をキーにして、チューニング情報３２２から対象となるメンバおよび部分オブジェクトを取得する（ステップＳ１１０４）。そして、計算機１０１は、取得したメンバおよび部分オブジェクトのアクセス回数をインクリメントする（ステップＳ１１０５）。
【００８１】
具体的には、例えば、ステップＳ１１０２において、式情報７０１があるとする。この場合、式情報７０１には、メンバとして、ｍｅｍ１１とｍｅｍ１２があるため、ステップＳ１１０４において、計算機１０１は、見つかったメンバｍｅｍ１１、ｍｅｍ１２が含まれる派生クラスをキーとする。そして、計算機１０１は、チューニング情報３２２から、メンバ情報Ｃ３：：Ｃ１＿ｍｅｍ１１、Ｃ３：：Ｃ１＿ｍｅｍ１２、メンバ情報Ｃ３：：Ｃ１＿ｍｅｍ１１、Ｃ３：：Ｃ１＿ｍｅｍ１２を取得し、それぞれのアクセス回数をインクリメントする。なお、メンバ情報Ｃ１＿ｍｅｍ１１と、Ｃ１＿ｍｅｍ１２とは、基底クラスの型情報のメンバ情報であるため、インクリメントしなくてよい。
【００８２】
ステップＳ１１０５の処理終了後、または、メンバおよび部分オブジェクトのアクセス式が見つからなかった場合（ステップＳ１１０３：Ｎｏ）、別の式情報を走査すべく、計算機１０１は、ステップＳ１１０１の処理に移行する。
【００８３】
式情報がない場合（ステップＳ１１０２：Ｎｏ）、計算機１０１は、チューニング情報３２２のメンバ情報における直接のアクセス回数を計数し終えたことになる。ステップＳ１１０２：Ｎｏとなった段階において、１以上のアクセス回数となっているのは下記のメンバ情報である。メンバ情報と、メンバ情報のアクセス回数とを併せて下記に示す。
【００８４】
メンバ情報Ｃ３：：Ｃ１＿ｍｅｍ１１  アクセス回数：２
メンバ情報Ｃ３：：Ｃ１＿ｍｅｍ１２  アクセス回数：４
メンバ情報Ｃ４＿ｍｅｍ４２  アクセス回数：１
メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１  アクセス回数：１
メンバ情報Ｃ４：：Ｃ３：：Ｃ１＿ｍｅｍ１１  アクセス回数：２
メンバ情報Ｃ４：：Ｃ３：：Ｃ１＿ｍｅｍ１２  アクセス回数：４
【００８５】
なお、メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１のアクセス回数が、図９で示す値と異なるが、これは、この段階では、メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１自身のアクセス回数を示しているためである。以降に示す、部分オブジェクトアクセス回数更新処理を実行することにより、メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１のアクセス回数が図９で示す値となる。
【００８６】
ステップＳ１１０２：Ｎｏとなった場合、計算機１０１は、チューニング情報３２２のメンバ情報を走査する（ステップＳ１２０１）。走査した結果、計算機１０１は、部分オブジェクトのメンバ情報が見つかったか否かを判断する（ステップＳ１２０２）。部分オブジェクトのメンバ情報が見つかった場合（ステップＳ１２０２：Ｙｅｓ）、計算機１０１は、見つかった部分オブジェクトを引数として、部分オブジェクトアクセス回数更新処理を実行する（ステップＳ１２０３）。部分オブジェクトアクセス回数更新処理については、図１３で説明する。
【００８７】
一方、部分オブジェクトのメンバ情報が見つからなかった場合（ステップＳ１２０２：Ｎｏ）、計算機１０１は、アクセス回数収集処理を終了する。アクセス回数収集処理を実行することにより、計算機１０１は、チューニング情報３２２の正確なアクセス回数を得ることができる。
【００８８】
図１３は、部分オブジェクトアクセス回数更新処理手順の一例を示すフローチャートである。部分オブジェクトアクセス回数更新処理は、部分オブジェクトとなる各メンバ情報へのアクセス回数を更新する処理である。
【００８９】
計算機１０１は、引数として入力された部分オブジェクトのメンバ情報に登録されている符号化されたクラスの型情報を取得する（ステップＳ１３０１）。次に、計算機１０１は、取得した型情報を型情報テーブル９０１から探索する（ステップＳ１３０２）。そして、計算機１０１は、探索して見つかった型情報に登録されているメンバ情報を取り出して順番に走査する（ステップＳ１３０３）。
【００９０】
走査した結果、計算機１０１は、部分オブジェクトのメンバ情報が見つかったか否かを判断する（ステップＳ１３０４）。部分オブジェクトのメンバ情報が見つかった場合（ステップＳ１３０４：Ｙｅｓ）、計算機１０１は、見つかった部分オブジェクトを引数として、部分オブジェクトアクセス回数更新処理を実行する（ステップＳ１３０５）。そして、計算機１０１は、ステップＳ１３０４の処理に移行する。
【００９１】
一方、部分オブジェクトのメンバ情報が見つからなかった場合（ステップＳ１３０４：Ｎｏ）、計算機１０１は、見つかった型情報を再度取り出して順番に走査する（ステップＳ１３０６）。そして、計算機１０１は、部分オブジェクトアクセス回数更新処理で用いるローカル変数である、アクセス回数の合計変数に０を代入する（ステップＳ１３０７）。
【００９２】
走査した結果、計算機１０１は、型情報に、種類がメンバであるメンバ情報があるか否かを判断する（ステップＳ１３０８）。種類がメンバであるメンバ情報がある場合（ステップＳ１３０８：Ｙｅｓ）、計算機１０１は、アクセス回数の合計変数に、メンバ情報に登録されているアクセス回数の値を加算する（ステップＳ１３０９）。そして、計算機１０１は、ステップＳ１３０８の処理に移行する。
【００９３】
一方、種類がメンバであるメンバ情報がない場合（ステップＳ１３０８：Ｎｏ）、計算機１０１は、引数として入力された部分オブジェクトのメンバ情報のアクセス回数に、アクセス回数の合計変数の値を加算する（ステップＳ１３１０）。ステップＳ１３１０の処理終了後、計算機１０１は、部分オブジェクトアクセス回数更新処理を終了する。
【００９４】
ここで、メンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３の例を用いて、部分オブジェクトアクセス回数更新処理を説明する。計算機１０１は、ステップＳ１２０２の処理において、メンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３が部分オブジェクトのメンバ情報であるため、メンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３を引数として部分オブジェクトアクセス回数更新処理を呼び出す。
【００９５】
そして、計算機１０１は、ステップＳ１３０１の処理において、引数として入力されたメンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３の符号化されたクラスの型情報Ｃ４：：Ｃ３を取得する。次に、計算機１０１は、符号化されたクラスの型情報Ｃ４：：Ｃ３からメンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ３＿Ｃ１を見つけ、メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１を引数として部分オブジェクトアクセス回数更新処理を再び呼び出す。
【００９６】
計算機１０１は、ステップＳ１３０１の処理において、引数として入力されたメンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１の符号化されたクラスの型情報Ｃ４：：Ｃ３：：Ｃ１を取得する。次に、計算機１０１は、ステップＳ１３０９の処理において、符号化されたクラスの型情報Ｃ４：：Ｃ３：：Ｃ１のメンバ情報Ｃ４：：Ｃ３：：Ｃ１＿ｍｅｍ１１、ｍｅｍ１２のアクセス回数の値となる２、４を、それぞれ、アクセス回数の合計変数に加算する。そして、計算機１０１は、ステップＳ１３１０の処理において、引数として入力されたメンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１のアクセス回数に、アクセス回数の合計変数の値を加算する。この時点で、メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１のアクセス回数は、１＋（２＋４）＝７となる。
【００９７】
そして、計算機１０１は、１回目の部分オブジェクトアクセス回数更新処理に戻る。次に、計算機１０１は、ステップＳ１３１０の処理において、メンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ３＿Ｃ１のアクセス回数を、メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１のアクセス回数を加えて７にする。
【００９８】
部分オブジェクトアクセス回数更新処理を実行することにより、計算機１０１は、各メンバ情報自身へのアクセス回数と、各メンバ情報に含まれるメンバ情報へのアクセス回数とを考慮して、各メンバ情報への正確なアクセス回数を得ることができる。
【００９９】
図１４は、メンバ情報配置場所決定処理手順の一例を示すフローチャート（その１）である。また、図１５は、メンバ情報配置場所決定処理手順の一例を示すフローチャート（その２）である。計算機１０１は、チューニング情報３２２を走査する（ステップＳ１４０１）。
【０１００】
走査した結果、計算機１０１は、アクセス回数が１以上の部分オブジェクトがあるか否かを判断する（ステップＳ１４０２）。アクセス回数が１以上の部分オブジェクトがある場合（ステップＳ１４０２：Ｙｅｓ）、計算機１０１は、見つかった部分オブジェクトのメンバ情報に設定されている型情報を型情報テーブル９０１から探索する（ステップＳ１４０３）。そして、計算機１０１は、探索して見つかった型情報に登録されているメンバ情報を、アクセス回数が多い順、サイズが小さい順になるように各メンバ情報の順序を決定する（ステップＳ１４０４）。そして、計算機１０１は、決定したメンバ情報の順序と、メンバ情報のサイズとに基づいて、メンバ情報のオフセット値を決定する（ステップＳ１４０５）。次に、計算機１０１は、決定したメンバ情報のオフセット値をチューニング情報のメンバ情報に登録する（ステップＳ１４０６）。
【０１０１】
ここで、部分オブジェクトが子の部分オブジェクトを有する場合には、計算機１０１は、子の部分オブジェクトに対して、ステップＳ１４０２〜ステップＳ１４０６の処理を適用する。
【０１０２】
具体的な例を用いて、ステップＳ１４０２〜ステップＳ１４０６の処理について説明する。計算機１０１は、チューニング情報３２２を走査して、ステップＳ１４０２の処理において、符号化されたクラスの型情報Ｃ４に、アクセス回数が１以上の部分オブジェクトがあるか否かを判断する。この場合、条件を満たすメンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３があるため、計算機１０１は、ステップＳ１４０３の処理において、見つかった部分オブジェクトのメンバ情報に設定されている型情報Ｃ４：：Ｃ３を型情報テーブル９０１から探索する。
【０１０３】
そして、計算機１０１は、ステップＳ１４０４の処理において、メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１、ｍｅｍ３１、ｍｅｍ３２をアクセス回数が多い順、サイズが小さい順になるように各メンバ情報の順序を決定する。この場合、メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１のアクセス回数が最も多いため、計算機１０１は、メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１を１番目に決定する。メンバ情報Ｃ４：：Ｃ３＿ｍｅｍ３１、ｍｅｍ３２については、アクセス回数もサイズも同一であるから、計算機１０１は、そのままの順序として、メンバ情報Ｃ４：：Ｃ３＿ｍｅｍ３１を２番目、メンバ情報Ｃ４：：Ｃ３＿ｍｅｍ３２を３番目に決定する。
【０１０４】
そして、計算機１０１は、ステップＳ１４０５の処理において、決定したメンバ情報の順序となるメンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１、ｍｅｍ３１、ｍｅｍ３２と、メンバ情報のサイズとに基づいて、メンバ情報のオフセット値を決定する。この場合、結果的に順序は代わっていないため、メンバ情報のオフセット値もそのままとなる。
【０１０５】
また、メンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３は、メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１を有する。従って、計算機１０１は、メンバ情報Ｃ４：：Ｃ３＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１に対して、ステップＳ１４０２〜ステップＳ１４０６の処理を適用する。計算機１０１は、ステップＳ１４０４の処理において、符号化されたクラスの型情報Ｃ４＿Ｃ３＿Ｃ１が有するメンバ情報Ｃ４＿Ｃ３＿Ｃ１＿ｍｅｍ１１、ｍｅｍ１２をアクセス回数が多い順、サイズが小さい順になるように各メンバ情報の順序を決定する。この場合、メンバ情報Ｃ４＿Ｃ３＿Ｃ１＿ｍｅｍ１２がアクセス回数が最も高いため、計算機１０１は、メンバ情報Ｃ４＿Ｃ３＿Ｃ１＿ｍｅｍ１２を１番目、メンバ情報Ｃ４＿Ｃ３＿Ｃ１＿ｍｅｍ１１を２番目に決定する。
【０１０６】
そして、計算機１０１は、ステップＳ１４０５の処理において、決定したメンバ情報の順序となるメンバ情報Ｃ４＿Ｃ３＿Ｃ１＿ｍｅｍ１２、ｍｅｍ１１と、メンバ情報のサイズとに基づいて、メンバ情報のオフセット値を決定する。この場合、計算機１０１は、１番目に決定したメンバ情報Ｃ４＿Ｃ３＿Ｃ１＿ｍｅｍ１２のオフセット値を０に決定する。さらに、計算機１０１は、２番目に決定したメンバ情報Ｃ４＿Ｃ３＿Ｃ１＿ｍｅｍ１１のオフセット値を、メンバ情報Ｃ４＿Ｃ３＿Ｃ１＿ｍｅｍ１１のサイズ＝４に決定する。
【０１０７】
アクセス回数が１以上の部分オブジェクトがない場合（ステップＳ１４０２：Ｎｏ）、計算機１０１は、オフセット値が決まっていないアクセス回数１以上のメンバおよび部分オブジェクトを収集し、最外の派生クラスとなる型情報を型情報テーブル９０１から探索する（ステップＳ１５０１）。
【０１０８】
次に、計算機１０１は、最外の派生クラスとなる型情報から、収集したメンバおよび部分オブジェクトを要素とする単方向のリストを生成する（ステップＳ１５０２）。
【０１０９】
次に、計算機１０１は、リストの各要素を、アクセス回数が多い順、サイズが小さい順になるように並び替える（ステップＳ１５０３）。そして、計算機１０１は、並び替えたリストの各要素の順序と、各要素に対応するメンバ情報のサイズとに基づいて、メンバ情報のオフセット値を決定する（ステップＳ１５０４）。次に、計算機１０１は、決定したメンバ情報のオフセット値をチューニング情報３２２のメンバ情報に登録する（ステップＳ１５０５）。ステップＳ１５０５の処理終了後、計算機１０１は、メンバ情報配置場所決定処理を終了する。
【０１１０】
具体的な例を用いて、ステップＳ１５０１〜ステップＳ１５０４の処理について説明する。ステップＳ１４０２：Ｎｏの時点で、オフセット値が決まっていないアクセス回数１以上のメンバおよび部分オブジェクトは、メンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３、ｍｅｍ４２である。計算機１０１は、ステップＳ１５０１の処理において、メンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３、ｍｅｍ４２の最外の派生クラスとなる型情報Ｃ４を型情報テーブル９０１から探索する。
【０１１１】
そして、計算機１０１は、ステップＳ１５０２の処理において、型情報Ｃ４から、メンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３、Ｃ４＿ｍｅｍ４２を要素とする単方向のリストを生成する。生成したリストの先頭の要素は、メンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３を示すアドレスと、次の要素を示すアドレスを有する。生成したリストの２番目の要素は、メンバ情報Ｃ４＿ｍｅｍ４２を有する。
【０１１２】
次に、計算機１０１は、ステップＳ１５０３の処理において、生成したリストを、アクセス回数が多い順、サイズが小さい順になるように並び替える（ステップＳ１５０３）。この例では、メンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３のアクセス回数が最も多いので、計算機１０１は、順序を変えずこのままとする。
【０１１３】
そして、計算機１０１は、ステップＳ１５０４の処理において、リストの１番目の要素に対応するメンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３のオフセット値を０に決定する。また、計算機１０１は、リストの１番目の要素に対応するメンバ情報Ｃ４＿ｍｅｍ４２のオフセット値を、メンバ情報Ｃ４＿ｓｕｂｏｂｊ＿Ｃ４＿Ｃ３のサイズである１６に決定する。
【０１１４】
図１６は、メンバ情報配置場所反映処理手順の一例を示すフローチャート（その１）である。図１７は、メンバ情報配置場所反映処理手順の一例を示すフローチャート（その２）である。メンバ情報配置場所反映処理は、決定したオフセット値をチューニング実施後の中間言語１情報３２３へ反映する処理である。ここで、メンバ情報配置場所反映処理は、中間言語１情報３２１を更新することにより、チューニング実施後の中間言語１情報３２３を生成する。
【０１１５】
計算機１０１は、中間言語１情報３２１内の型情報を走査する（ステップＳ１６０１）。走査した結果、計算機１０１は、型情報があるか否かを判断する（ステップＳ１６０２）。型情報がある場合（ステップＳ１６０２：Ｙｅｓ）、計算機１０１は、チューニング情報３２２から、中間言語１情報３２１内の型情報に対応する型情報を抽出する（ステップＳ１６０３）。そして、計算機１０１は、抽出した型情報に対応するリストを生成したか否かを判断する（ステップＳ１６０４）。
【０１１６】
抽出した型情報に対応するリストを生成した場合（ステップＳ１６０４：Ｙｅｓ）、計算機１０１は、中間言語１情報３２１から、リストに登録されているメンバ情報に対応するメンバおよび部分オブジェクトを探索する（ステップＳ１６０５）。そして、計算機１０１は、探索して見つかったメンバおよび部分オブジェクトのオフセット値を、リストで決定したオフセット値に設定する（ステップＳ１６０６）。次に、計算機１０１は、探索して見つかったメンバおよび部分オブジェクトをオフセット値順に並び替えて、中間言語１情報３２１の型情報に設定する（ステップＳ１６０７）。ここで、計算機１０１は、中間言語１情報３２１の型情報に元々設定されていたメンバおよび部分オブジェクトを、並び替えたメンバおよび部分オブジェクトに継続するように登録し、オフセット値を更新する。また、中間言語１情報３２１において、計算機１０１は、並び替えたメンバおよび部分オブジェクトが元々存在していた個所を取り除く。ステップＳ１６０７の処理終了後、計算機１０１は、ステップＳ１６０１の処理に移行する。
【０１１７】
具体的な例を用いて、ステップＳ１６０７の処理について説明する。計算機１０１は、中間言語１情報３２１内の型情報５０４となるクラスＣ４の型情報について設定し、リストで決定したように、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３のオフセット値を０、メンバｍｅｍ４２のオフセット値を１６に設定する。そして、計算機１０１は、メンバｍｅｍ４２に継続するように、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ２のオフセット値を２０に設定し、メンバｍｅｍ４１のオフセット値を２８に設定する。
【０１１８】
一方、抽出した型情報に対応するリストを生成していない場合（ステップＳ１６０４：Ｎｏ）、計算機１０１は、チューニング情報３２２の型情報からメンバおよび部分オブジェクトを取得し、登録されているオフセット値を中間言語１情報３２１の型情報に設定する（ステップＳ１６０８）。次に、計算機１０１は、中間言語１情報の型情報が有するメンバおよび部分オブジェクトを、設定されたオフセット値順に並び替える（ステップＳ１６０９）。ステップＳ１６０９の処理終了後、計算機１０１は、ステップＳ１６０１の処理に移行する。
【０１１９】
走査した結果、型情報がない場合（ステップＳ１６０２：Ｎｏ）、計算機１０１は、中間言語１情報内の式情報を走査する（ステップＳ１７０１）。走査した結果、計算機１０１は、式情報があるか否かを判断する（ステップＳ１７０２）。式情報がある場合（ステップＳ１７０２：Ｙｅｓ）、計算機１０１は、メンバまたは部分オブジェクトのアクセス式が見つかったか否かを判断する（ステップＳ１７０３）。メンバまたは部分オブジェクトのアクセス式が見つかった場合（ステップＳ１７０３：Ｙｅｓ）、計算機１０１は、決定したメンバまたは部分オブジェクトのオフセット値を、メンバまたは部分オブジェクトのオフセット値を取得する命令の算出結果に設定する（ステップＳ１７０４）。ここで、メンバまたは部分オブジェクトのオフセット値を取得する命令を既に計算済であれば、計算機１０１は、再計算を行うことになる。
【０１２０】
具体的な例を用いて、ステップＳ１７０３、ステップＳ１７０４の処理について説明する。計算機１０１は、ステップＳ１７０３において、メンバまたは部分オブジェクトのアクセス式として、式情報７０５を見つける。そして、計算機１０１は、ステップＳ１７０４において、メンバｍｅｍ１２のオフセット値を取得する命令の算出結果を０に設定する。
【０１２１】
ステップＳ１７０４の処理終了後、または、メンバまたは部分オブジェクトのアクセス式が見つからなかった場合（ステップＳ１７０３：Ｎｏ）、計算機１０１は、ステップＳ１７０１の処理に移行する。一方、式情報がない場合（ステップＳ１７０２：Ｎｏ）、計算機１０１は、メンバ情報配置場所反映処理を終了する。メンバ情報配置場所反映処理を実行することにより、計算機１０１は、チューニング情報３２２の内容を反映した中間言語１情報３２１を生成することができる。
【０１２２】
次に、ソースチューニングを行ったソースチューニング後における中間言語１情報３２３の型情報、データ構造について、図１８、図１９を用いて説明する。
【０１２３】
図１８は、ソースチューニング後における中間言語１情報３２３の型情報の一例を示す説明図である。図１８では、ソースチューニングが行われた中間言語１情報３２３の型情報１８０１〜１８０４を示す。図１８において、ハッチを付与した領域は、図５に示す型情報５０１〜５０４から変更した箇所を示す。
【０１２４】
具体的には、型情報１８０１となるクラスＣ１の型情報は、型情報５０１となるクラスＣ１の型情報から、メンバｍｅｍ１１、ｍｅｍ１２の順序が変更されており、かつ、メンバｍｅｍ１１、ｍｅｍ１２のオフセット値が変更されている。型情報１８０２となるクラスＣ２の型情報は、型情報５０２となるクラスＣ２の型情報と同一である。また、型情報１８０３となるクラスＣ３の型情報は、型情報５０３となるクラスＣ３の型情報と同一である。
【０１２５】
型情報１８０４となるクラスＣ４の型情報は、型情報５０４となるクラスＣ４の型情報から、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３、メンバｍｅｍ４２、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ２、メンバｍｅｍ４１の順に順序が変更されている。さらに、型情報１８０４となるクラスＣ４の型情報は、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３、メンバｍｅｍ４２、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ２、メンバｍｅｍ４１のオフセット値が変更されている。
【０１２６】
図１９は、ソースチューニング後におけるデータ構造の一例を示す説明図である。図１９では、図１８で示したクラスＣ４の型情報に従った場合における図４で示したｇｅｔ＿ｓｕｂｏｂｊ（）関数内のｃ４ｏｂｊのデータ構造を示す。
【０１２７】
ｃ４ｏｂｊのデータ構造は、型情報１８０４となるクラスＣ４の型情報に従って、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３、メンバｍｅｍ４２、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ２、メンバｍｅｍ４１の順で記憶領域上に配置される構造となる。
【０１２８】
また、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３のデータ構造は、型情報１８０３となるクラスＣ３の型情報に従って、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１、メンバｍｅｍ３１、メンバｍｅｍ３２の順で記憶領域上に配置される構造となる。さらに、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ３＿Ｃ１のデータ構造は、型情報１８０１となるクラスＣ１の型情報に従って、メンバｍｅｍ１２、メンバｍｅｍ１１の順で記憶領域上に配置される構造となる。
【０１２９】
また、部分オブジェクトｓｕｂｏｂｊ＿Ｃ４＿Ｃ２のデータ構造は、型情報１８０２となるクラスＣ２の型情報に従って、メンバｍｅｍ２１、メンバｍｅｍ２２の順で記憶領域上に配置される構造となる。次に、ソースチューニング前後のデータ構造について、図２０を用いて説明する。
【０１３０】
図２０は、データ構造の変更結果を示す説明図である。図２０では、図２０の（ａ）では図６で示したｃ４ｏｂｊのデータ構造を示し、図２０の（ｂ）では図１９で示したｃ４ｏｂｊのデータ構造を示す。ここで、図２０において、二重線の枠は、部分オブジェクトを示す。
【０１３１】
図２０の（ａ）、（ｂ）で示すように、計算機１０１は、左斜線のハッチを付与したクラスＣ１の部分オブジェクトだけでなく、クラスＣ１の部分オブジェクトをメンバとして有するクラスＣ３の部分オブジェクト単位で再配置する。また、アクセスがないクラスＣ２の部分オブジェクトについて、計算機１０１は、クラスＣ３の部分オブジェクトとクラスＣ２の部分オブジェクトの順番を入れ替える。入れ替えた結果、クラスＣ２の部分オブジェクトは、クラスＣ４のオブジェクトの中で下位側に移動することになる。
【０１３２】
図２０で示すように、計算機１０１は、アクセス回数が多いＣ１をキャッシュメモリに記憶させやすくすることができる。さらに、計算機１０１は、クラスＣ１の部分オブジェクトをメンバとして有するクラスＣ３の部分オブジェクト単位で移動することにより、クラスＣ３の部分オブジェクトを一括して処理する式にも対応することができる。
【０１３３】
以上説明したように、計算機１０１は、コンパイル時に、オブジェクト内の部分オブジェクトのアクセス回数に、部分オブジェクト内のメンバまたは部分オブジェクトのアクセス回数を加えた各値に基づいて、各メンバおよび部分オブジェクトの配置順序を決定する。これにより、計算機１０１は、入れ子構造を考慮したアクセス回数を基に配置でき、オブジェクトプログラムのアクセス性能を向上させることができる。また、計算機１０１は、入れ子構造を考慮して配置を変更するため、入れ子構造の外側となる部分オブジェクトを一括して処理する式があっても、正しく動作させることができる。
【０１３４】
また、計算機１０１は、決定した各メンバおよび部分オブジェクトの配置順序と、各メンバおよび部分オブジェクトのサイズに基づいて、各メンバおよび部分オブジェクトのオフセット値を決定してもよい。これにより、計算機１０１は、ターゲットの記憶領域における各メンバおよび部分オブジェクトの配置場所を得ることができる。
【０１３５】
また、計算機１０１は、決定したメンバおよび部分オブジェクトのオフセット値を、ソースプログラム１１１に含まれるメンバおよび部分オブジェクトのオフセット値を取得する命令の算出結果に設定してもよい。これにより、生成されたオブジェクトプログラム３２５は、メンバおよび部分オブジェクトを並び替えた後でも、メンバおよび部分オブジェクトのオフセット値を取得する命令を正しく動作することができる。
【０１３６】
また、計算機１０１は、アクセス回数が同一であるメンバまたは部分オブジェクトについて、メンバおよび部分オブジェクトのサイズの小さい順を、メンバまたは部分オブジェクトの順序に決定してもよい。これにより、サイズの小さいメンバまたは部分オブジェクトが優先してターゲットのキャッシュメモリに記憶されるようになる。従って、サイズの大きいメンバまたは部分オブジェクトが優先してターゲットのキャッシュメモリに記憶される場合に比べて、より多くのメンバまたは部分オブジェクトがキャッシュメモリに記憶されるようになり、アクセス性能を向上させることができる。
【０１３７】
また、本実施の形態は、プログラム言語がＣ言語であっても適用可能である。この場合には、オブジェクトを構造体とし、ある構造体に含まれる別の構造体自身へのアクセス回数に、別の構造体に含まれるデータへのアクセス回数を加算し、加算した値に基づいて、ある構造体に含まれる要素の順序を決定すればよい。
【０１３８】
なお、本実施の形態で説明したコンパイラ方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本コンパイラプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本コンパイラプログラムは、インターネット等のネットワークを介して配布してもよい。
【０１３９】
上述した実施の形に関し、さらに以下の付記を開示する。
【０１４０】
（付記１）ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
制御部を有することを特徴とするコンパイルを行う計算機。
【０１４１】
（付記２）前記制御部は、
決定した前記各々のデータの順序と前記各々のデータのサイズとに基づいて、前記記憶領域に配置する際の前記オブジェクトの先頭アドレスからの前記各々のデータのオフセット値を決定することを特徴とする付記１に記載のコンパイルを行う計算機。
【０１４２】
（付記３）前記制御部は、
決定した前記各々のデータのオフセット値を、前記ソースプログラムに含まれる前記各々のデータのオフセット値を取得する命令の算出結果に設定することを特徴とする付記２に記載のコンパイルを行う計算機。
【０１４３】
（付記４）前記制御部は、
アクセス回数が同一である前記各々のデータについて、前記各々のデータのサイズの小さい順を、前記記憶領域に配置する際の前記各々のデータの順序として決定することを特徴とする付記１〜３のいずれか一つに記載のコンパイルを行う計算機。
【０１４４】
（付記５）コンピュータが、
ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
処理を実行することを特徴とするコンパイラ方法。
【０１４５】
（付記６）コンピュータに、
ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
処理を実行させることを特徴とするコンパイラプログラム。
【符号の説明】
【０１４６】
１０１  計算機
１１１  ソースプログラム
３０１  意味解析部
３０２  ソースチューニング部
３０３  中間言語変換部
３０４  最適化・コード生成部
３１１  加算部
３１２  決定部
３１３  設定部
３２１、３２３  中間言語１情報
３２２  チューニング情報
３２４  中間言語２情報
３２５  オブジェクトプログラム
【図１】
2017010123.tif 000003
【図２】
2017010123.tif 000004
【図３】
2017010123.tif 000005
【図４】
2017010123.tif 000006
【図５】
2017010123.tif 000007
【図６】
2017010123.tif 000008
【図７】
2017010123.tif 000009
【図８】
2017010123.tif 000010
【図９】
2017010123.tif 000011
【図１０】
2017010123.tif 000012
【図１１】
2017010123.tif 000013
【図１２】
2017010123.tif 000014
【図１３】
2017010123.tif 000015
【図１４】
2017010123.tif 000016
【図１５】
2017010123.tif 000017
【図１６】
2017010123.tif 000018
【図１７】
2017010123.tif 000019
【図１８】
2017010123.tif 000020
【図１９】
2017010123.tif 000021
【図２０】
2017010123.tif 000022