(57)【要約】【課題】ソフトウェアの実行性能の向上を図ること。【解決手段】情報処理装置１００は、ソースコード１０１を解析し、中間コード１０２を生成する。情報処理装置１００は、中間コード１０２においてｓｗｉｔｃｈ−ｃａｓｅ文を含む関数Ｘを特定する。情報処理装置１００は、関数Ｘに含まれるｃａｓｅ文の処理内容を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定する。情報処理装置１００は、受け渡し可能であると判定した場合、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数Ｘを変換し、受け渡し可能ではないと判定した場合、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数Ｘを変換しない。情報処理装置１００は、中間コード１０２に対して最適化を実行し、オブジェクトコードを生成し、実行可能ファイルを生成する。【選択図】図１
2019003437.tif 000002
【特許請求の範囲】
【請求項１】
プログラムコードにおいて分岐命令を含む関数を特定し、
特定した前記関数に含まれる前記分岐命令のいずれかの分岐先で参照される引数の個数に基づいて、前記いずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定し、
受け渡し可能であると判定した場合、前記分岐命令のそれぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換し、受け渡し可能ではないと判定した場合、特定した前記関数を変換しない、
制御部を有することを特徴とする情報処理装置。
【請求項２】
前記制御部は、
特定した前記関数に含まれる前記分岐命令のそれぞれの分岐先で参照される引数の個数に基づいて、前記それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定し、
前記それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であると判定した場合、前記それぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換し、前記分岐命令のいずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能ではないと判定した場合、特定した前記関数を変換しない、ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
特定した前記関数は、前記それぞれの分岐先で参照されず前記分岐命令の分岐判定で参照される引数が存在する関数である、ことを特徴とする請求項１または２に記載の情報処理装置。
【請求項４】
特定した前記関数は、呼出元が同一翻訳単位内に存在する関数である、ことを特徴とする請求項１〜３のいずれか一つに記載の情報処理装置。
【請求項５】
特定した前記関数は、再帰呼び出しがされない関数である、ことを特徴とする請求項１〜４のいずれか一つに記載の情報処理装置。
【請求項６】
特定した前記関数は、利用者定義の関数を呼び出さない関数である、ことを特徴とする請求項１〜５のいずれか一つに記載の情報処理装置。
【請求項７】
特定した前記関数は、例外処理を有さない関数である、ことを特徴とする請求項１〜６のいずれか一つに記載の情報処理装置。
【請求項８】
特定した前記関数は、命令数が閾値以下の関数である、ことを特徴とする請求項１〜７のいずれか一つに記載の情報処理装置。
【請求項９】
特定した前記関数は、少なくとも一部の引数をスタック経由で受け渡しされる関数である、ことを特徴とする請求項１〜８のいずれか一つに記載の情報処理装置。
【請求項１０】
前記制御部は、
前記プログラムコードに基づくオブジェクトコードのサイズから、前記それぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換した場合における、前記プログラムコードに基づくオブジェクトコードのサイズへの増加度合いを示す指標値を算出し、
算出した前記指標値が閾値以上である場合、特定した前記関数を変換しない、ことを特徴とする請求項１〜９のいずれか一つに記載の情報処理装置。
【請求項１１】
前記制御部は、
前記プログラムコードにおいて分岐命令を含む、複数の関数を特定し、
特定した前記複数の関数を、ループ処理内で呼び出される関数が先に、ループ処理内で呼び出されない関数が後になるように、順に選択し、
選択の都度、前記プログラムコードに基づくオブジェクトコードのサイズから、選択した前記関数に含まれる分岐命令のそれぞれの分岐先を関数化した関数を用いて、選択した前記関数を変換した場合における、前記プログラムコードに基づくオブジェクトコードのサイズへの増加度合いを示す指標値を算出し、
特定した前記複数の関数のうち、算出した前記指標値が閾値以上である関数を変換しない、ことを特徴とする請求項１〜１０のいずれか一つに記載の情報処理装置。
【請求項１２】
前記制御部は、
特定した前記複数の関数を、引数に指定された定数の個数が大きい関数から順に選択する、ことを特徴とする請求項１１のいずれか一つに記載の情報処理装置。
【請求項１３】
前記制御部は、
特定した前記関数ごとに、当該関数に含まれる分岐命令のそれぞれの分岐先を関数化した関数を用いて、当該関数を変換した場合における、前記プログラムコードに基づくオブジェクトコードのサイズの増加量を算出し、
特定した前記複数の関数を、算出した前記増加量が少ない関数から順に選択する、ことを特徴とする請求項１１または１２に記載の情報処理装置。
【請求項１４】
コンピュータが、
プログラムコードにおいて分岐命令を含む関数を特定し、
特定した前記関数に含まれる前記分岐命令のそれぞれの分岐先で参照される引数の個数に基づいて、前記それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定し、
受け渡し可能であると判定した場合、前記それぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換する、
処理を実行することを特徴とするコンパイラ方法。
【請求項１５】
コンピュータに、
プログラムコードにおいて分岐命令を含む関数を特定し、
特定した前記関数に含まれる前記分岐命令のそれぞれの分岐先で参照される引数の個数に基づいて、前記それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定し、
受け渡し可能であると判定した場合、前記それぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換する、
処理を実行させることを特徴とするコンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、コンパイラ方法、およびコンパイラプログラムに関する。
【背景技術】
【０００２】
プログラミング言語によりソフトウェアの処理内容が記述されたソースコードに基づいて、コンピュータが実行可能な形式のオブジェクトコードを生成し、ソフトウェアを実現する実行可能ファイルを生成するコンパイルの技術がある。コンパイルの際、ソフトウェアの機能が変更されない範囲で、ソースコードに記述された処理内容を変更してからオブジェクトコードを生成し、ソフトウェアの実行性能の向上を図る最適化の技術がある。
【０００３】
先行技術としては、例えば、インライン展開の対象関数の引数が最適化の結果定数であると評価された場合、最適化された引数の値を用いて最適化した対象関数のコストが対象関数をコールするコストよりも小さい場合、対象関数をインライン展開するものがある。また、例えば、モジュールの構成、構造および変数などを解析し、モジュールの構成、構造および変数などを変換または再構成する技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平１０−３１２２９１号公報
【特許文献２】特開平４−２７８６３２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術では、ソフトウェアの実行性能の向上を図ることが難しい場合がある。例えば、最適化の際にｃａｓｅ文の処理内容が関数化された場合、引数をスタック上で扱うことになり、引数へのアクセス時間の増大化を招くことがある。
【０００６】
１つの側面では、本発明は、ソフトウェアの実行性能の向上を図ることができる情報処理装置、コンパイラ方法、およびコンパイラプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
１つの実施態様によれば、プログラムコードにおいて分岐命令を含む関数を特定し、特定した前記関数に含まれる前記分岐命令のいずれかの分岐先で参照される引数の個数に基づいて、前記いずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定し、受け渡し可能であると判定した場合、前記分岐命令のそれぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換し、受け渡し可能ではないと判定した場合、特定した前記関数を変換しない情報処理装置、コンパイラ方法、およびコンパイラプログラムが提案される。
【発明の効果】
【０００８】
一態様によれば、ソフトウェアの実行性能の向上を図ることが可能になる。
【図面の簡単な説明】
【０００９】
【図１】図１は、実施の形態にかかるコンパイラ方法の一実施例を示す説明図である。
【図２】図２は、情報処理装置１００のハードウェア構成例を示すブロック図である。
【図３】図３は、情報処理装置１００の機能的構成例を示すブロック図である。
【図４】図４は、関数情報４００のデータ構造の一例を示す説明図である。
【図５】図５は、引数情報５００のデータ構造の一例を示す説明図である。
【図６】図６は、ｃａｓｅ文情報６００のデータ構造の一例を示す説明図である。
【図７】図７は、プログラムコード７００の一例を示す説明図である。
【図８】図８は、プログラムコード７００を変換する流れを示す説明図（その１）である。
【図９】図９は、プログラムコード７００を変換する流れを示す説明図（その２）である。
【図１０】図１０は、プログラムコード７００を変換する流れを示す説明図（その３）である。
【図１１】図１１は、プログラムコード７００を変換する流れを示す説明図（その４）である。
【図１２】図１２は、変換されたプログラムコード１２００の一例を示す説明図である。
【図１３】図１３は、コンパイル処理手順の一例を示すフローチャートである。
【図１４】図１４は、関数情報リスト作成処理手順の一例を示すフローチャートである。
【図１５】図１５は、サイズ算出処理手順の一例を示すフローチャートである。
【図１６】図１６は、サイズ算出処理手順の別の例を示すフローチャートである。
【図１７】図１７は、関数化処理手順の一例を示すフローチャートである。
【図１８】図１８は、スタック使用判定処理手順の一例を示すフローチャートである。
【図１９】図１９は、サブ判定処理手順の一例を示すフローチャートである。
【図２０】図２０は、関数作成処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下に、図面を参照して、本発明にかかる情報処理装置、コンパイラ方法、およびコンパイラプログラムの実施の形態を詳細に説明する。
【００１１】
（実施の形態にかかるコンパイラ方法の一実施例）
図１は、実施の形態にかかるコンパイラ方法の一実施例を示す説明図である。情報処理装置１００は、ソースコードをコンパイルし、オブジェクトコードを生成するコンピュータである。情報処理装置１００は、例えば、サーバ、ＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）、ノートＰＣ、タブレット端末、スマートフォン、ウェアラブル端末などである。
【００１２】
ソースコードは、プログラミング言語によりソフトウェアの処理内容が記述されたファイルである。プログラミング言語は、例えば、Ｃ言語やＣ＋＋などである。プログラミング言語は、例えば、Ｃ言語やＣ＋＋以外であってもよい。ソースコードには、ｓｗｉｔｃｈ−ｃａｓｅ文やｉｆ−ｅｌｓｅ文などの分岐命令が記述されることがある。オブジェクトコードは、コンピュータが実行可能な形式のファイルである。
【００１３】
また、コンパイルの際、最適化が実行されることがある。最適化は、ソフトウェアの機能が変更されない範囲で、ソースコードに記述された処理内容を変更してからオブジェクトコードを生成し、ソフトウェアの実行性能の向上を図る技術である。例えば、最適化の際、ｃａｓｅ文の処理内容を関数化し、データの依存解析の容易化を図ることにより、ソフトウェアの実行性能の向上を図ることがある。
【００１４】
しかしながら、最適化の際、ソフトウェアの実行性能の向上を図ることが難しい場合がある。例えば、最適化の際、ｃａｓｅ文の処理内容を関数化した場合、引数をレジスタ上ではなく、メモリ内のスタック上で扱うことになることがある。このため、ソフトウェアの実行時、レジスタよりもアクセス効率が悪いメモリ内のスタックに、引数を書き込んだり読み出したりすることになり、引数へのアクセス時間の増大化を招き、ソフトウェアの実行性能の向上を図ることが難しいことがある。
【００１５】
また、最適化の結果、オブジェクトコードのサイズの増大化を招いてしまう場合がある。例えば、最適化の際、ｃａｓｅ文の処理内容を関数化した関数が、ｃａｓｅ文の数に比例する数だけ作成されることになり、最適化後に生成されるオブジェクトコードのサイズの増大化を招いてしまう場合がある。
【００１６】
また、最適化しても、ソフトウェアが使用する記憶リソースを削減することが難しい場合がある。例えば、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数のいずれかの引数ｘが、あるｃａｓｅ文の処理内容Ａでは参照されるが、他のｃａｓｅ文の処理内容Ｂでは参照されない場合がある。この場合、関数を呼び出す際、処理内容Ａが実行されないとしても、引数ｘの受け渡しに記憶リソースが消費されてしまう。
【００１７】
そこで、本実施の形態では、最適化の際、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数を、選択的に、ｓｗｉｔｃｈ−ｃａｓｅ文と、ｃａｓｅ文の処理内容を関数化した関数とに置き換え、ソフトウェアの実行性能の向上を図るコンパイラ方法について説明する。
【００１８】
図１の例では、情報処理装置１００は、ソースコード１０１を取得する。ソースコード１０１は、例えば、分岐命令を含む関数が記述されている。分岐命令は、例えば、ｓｗｉｔｃｈ−ｃａｓｅ文やｉｆ−ｅｌｓｅ文などである。
【００１９】
ｓｗｉｔｃｈ−ｃａｓｅ文は、分岐判定を記述するｓｗｉｔｃｈ文と、分岐先の処理内容を記述するｃａｓｅ文とを含む。また、ｓｗｉｔｃｈ−ｃａｓｅ文は、さらに共通処理部を含んでもよい。図１の例では、説明の簡略化のため、ｓｗｉｔｃｈ−ｃａｓｅ文は、共通処理部を含んでいないものとする。
【００２０】
（１−１）情報処理装置１００は、ソースコード１０１を解析し、中間コード１０２を生成する。中間コード１０２は、ソースコード１０１と同様に、分岐命令を含む関数が記述されている。分岐命令は、例えば、ｓｗｉｔｃｈ−ｃａｓｅ文やｉｆ−ｅｌｓｅ文などである。
【００２１】
（１−２）情報処理装置１００は、生成した中間コード１０２において分岐命令を含む関数を選択的に変換する。まず、情報処理装置１００は、例えば、中間コード１０２において分岐命令を含む関数を特定する。情報処理装置１００は、具体的には、中間コード１０２においてｓｗｉｔｃｈ−ｃａｓｅ文を含む関数Ｘを特定する。これにより、情報処理装置１００は、変換候補である関数を特定し、変換するか否かを判定可能にする。
【００２２】
ここでは、情報処理装置１００が、分岐命令を含む関数を特定する場合について説明したが、これに限らない。例えば、情報処理装置１００が、分岐命令を含み、かつ、所定条件を満たす関数を特定する場合があってもよい。情報処理装置１００が、分岐命令を含み、かつ、所定条件を満たす関数を特定する具体例については、図７〜図１２の実施例を用いて後述する。
【００２３】
次に、情報処理装置１００は、例えば、特定した関数に含まれる分岐命令のそれぞれの分岐先で参照される引数の個数に基づいて、それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定する。情報処理装置１００は、具体的には、関数Ｘに含まれるｓｗｉｔｃｈ−ｃａｓｅ文のそれぞれのｃａｓｅ文の処理内容を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定する。
【００２４】
そして、情報処理装置１００は、例えば、それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であると判定した場合、それぞれの分岐先を関数化した関数を用いて、特定した関数を変換し、中間コード１０３を取得する。情報処理装置１００は、具体的には、それぞれのｃａｓｅ文の処理内容を関数化した関数の引数をレジスタ経由で受け渡し可能であると判定した場合、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数Ｘを変換し、中間コード１０３を取得する。ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数Ｘは、例えば、ｓｗｉｔｃｈ−ｃａｓｅ文と、ｃａｓｅ文の処理内容を関数化した関数とに置き換えることにより変換される。
【００２５】
一方で、情報処理装置１００は、例えば、いずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能ではないと判定した場合、特定した関数を変換しないようにし、中間コード１０４を取得する。情報処理装置１００は、具体的には、いずれかのｃａｓｅ文の処理内容を関数化した関数の引数をレジスタ経由で受け渡し可能ではないと判定した場合、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数Ｘを変換しないようにし、中間コード１０４を取得する。これにより、情報処理装置１００は、中間コード１０３または中間コード１０４に対して最適化を実行可能にする。
【００２６】
ここでは、情報処理装置１００が、それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であると判定した場合、特定した関数を変換する場合について説明したが、これに限らない。例えば、情報処理装置１００が、少なくともいずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であると判定した場合、特定した関数を変換する場合があってもよい。具体的には、情報処理装置１００は、所定数以上の分岐先のそれぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であると判定した場合、特定した関数を変換する。この場合、情報処理装置１００は、いずれの分岐先を関数化した関数の引数もレジスタ経由で受け渡し可能ではないと判定した場合、特定した関数を変換しないようにしてもよい。
【００２７】
ここでは、情報処理装置１００が、いずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能ではないと判定した場合、特定した関数を変換しないようにする場合について説明したが、これに限らない。例えば、情報処理装置１００が、特定した関数を変換すると、オブジェクトコードのサイズが一定以上増大してしまうと判定した場合、特定した関数を変換しないようにする場合があってもよい。情報処理装置１００が、オブジェクトコードのサイズが一定以上増大してしまうと判定した場合、特定した関数を変換しないようにする具体例については、図７〜図１２の実施例を用いて後述する。
【００２８】
（１−３）情報処理装置１００は、中間コード１０３または中間コード１０４に対して最適化を実行する。
【００２９】
（１−４）情報処理装置１００は、最適化後の中間コード１０３または中間コード１０４に基づいてアセンブラコードを生成する。
【００３０】
（１−５）情報処理装置１００は、生成したアセンブラコードに基づいてオブジェクトコードを生成する。
【００３１】
（１−６）情報処理装置１００は、リンカにより、生成したオブジェクトコードに基づいて実行可能ファイル１０５を生成する。これにより、情報処理装置１００は、オブジェクトコードのサイズの増大化を抑制し、結果として実行可能ファイル１０５のサイズの増大化を抑制しつつ、実行可能ファイル１０５によるソフトウェアの実行性能の向上を図ることができる。
【００３２】
情報処理装置１００は、例えば、実行可能ファイル１０５によるソフトウェアの実行時、レジスタよりもアクセス効率が悪いメモリ内のスタックに、引数を書き込んだり読み出したりする回数の増大化を抑制することができる。このため、情報処理装置１００は、引数へのアクセス時間の増大化を抑制し、ソフトウェアの実行性能の向上を図ることができる。
【００３３】
また、情報処理装置１００は、受け渡し可能ではないと判定した場合、特定した関数を変換しないため、オブジェクトコードのサイズの増大化を抑制し、オブジェクトコードを基に生成する実行可能ファイル１０５のサイズの増大化を抑制することができる。
【００３４】
また、情報処理装置１００は、分岐命令を含む関数では参照されるが、いずれかの分岐先では参照されない仮引数を、いずれかの分岐先を関数化した関数では参照しないようにすることができ、引数の受け渡しに用いられる記憶リソースを削減することができる。仮引数は、関数定義時に使用される引数である。これに対し、関数呼出時に使用される引数は、実引数と呼ばれる。
【００３５】
また、情報処理装置１００は、それぞれの分岐先を関数化した関数に、分岐命令が含まれないようにすることができる。このため、情報処理装置１００は、それぞれの分岐先を関数化した関数において、データの依存解析の容易化を図ることができ、最適化によりソフトウェアの実行性能が向上しやすくすることができる。
【００３６】
また、情報処理装置１００は、複数の分岐先ではなく、複数の分岐先のうちの所定数の分岐先のそれぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能である場合、特定した関数を変換することもできる。このため、情報処理装置１００は、引数をレジスタ経由で受け渡し可能な分岐先に遷移する回数が、引数をレジスタ経由で受け渡し可能ではない分岐先に遷移する回数より多い場合に、ソフトウェアの実行性能が向上しやすくすることができる。
【００３７】
図１の例では、情報処理装置１００が、ソースコード１０１を取得する場合について説明したが、これに限らない。例えば、情報処理装置１００が、他のコンピュータから中間コード１０２を取得し、中間コード１０２において分岐命令を含む関数を選択的に変換する場合があってもよい。
【００３８】
図１の例では、情報処理装置１００が、中間コード１０２からオブジェクトコードや実行可能ファイル１０５を生成する場合について説明したが、これに限らない。例えば、情報処理装置１００が、中間コード１０２を他のコンピュータに出力し、他のコンピュータに中間コード１０２からオブジェクトコードや実行可能ファイル１０５を作成させる場合があってもよい。
【００３９】
図１の例では、情報処理装置１００が、中間コード１０２において分岐命令を含む関数を選択的に変換する場合について説明したが、これに限らない。例えば、情報処理装置１００が、ソースコード１０１を中間コード１０２に変換する前に、ソースコード１０１において分岐命令を含む関数を選択的に変換する場合があってもよい。
【００４０】
（情報処理装置１００のハードウェア構成例）
次に、図２を用いて、情報処理装置１００のハードウェア構成例について説明する。
【００４１】
図２は、情報処理装置１００のハードウェア構成例を示すブロック図である。図２において、情報処理装置１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）２０１と、メモリ２０２と、ネットワークＩ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０３と、記録媒体Ｉ／Ｆ２０４と、記録媒体２０５とを有する。また、各構成部は、バス２００によってそれぞれ接続される。
【００４２】
ここで、ＣＰＵ２０１は、情報処理装置１００の全体の制御を司る。メモリ２０２は、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）およびフラッシュＲＯＭなどを有する。具体的には、例えば、フラッシュＲＯＭやＲＯＭが各種プログラムを記憶し、ＲＡＭがＣＰＵ２０１のワークエリアとして使用される。メモリ２０２に記憶されるプログラムは、ＣＰＵ２０１にロードされることで、コーディングされている処理をＣＰＵ２０１に実行させる。
【００４３】
ネットワークＩ／Ｆ２０３は、通信回線を通じてネットワーク２１０に接続され、ネットワーク２１０を介して他のコンピュータに接続される。そして、ネットワークＩ／Ｆ２０３は、ネットワーク２１０と内部のインターフェースを司り、他のコンピュータからのデータの入出力を制御する。ネットワークＩ／Ｆ２０３には、例えば、モデムやＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）アダプタなどを採用することができる。
【００４４】
記録媒体Ｉ／Ｆ２０４は、ＣＰＵ２０１の制御にしたがって記録媒体２０５に対するデータのリード／ライトを制御する。記録媒体Ｉ／Ｆ２０４は、例えば、ディスクドライブ、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）ポートなどである。記録媒体２０５は、記録媒体Ｉ／Ｆ２０４の制御で書き込まれたデータを記憶する不揮発メモリである。記録媒体２０５は、例えば、ディスク、半導体メモリ、ＵＳＢメモリなどである。記録媒体２０５は、情報処理装置１００から着脱可能であってもよい。
【００４５】
情報処理装置１００は、上述した構成部のほか、例えば、キーボード、マウス、ディスプレイ、プリンタ、スキャナ、マイク、スピーカーなどを有してもよい。また、情報処理装置１００は、記録媒体Ｉ／Ｆ２０４や記録媒体２０５を有していなくてもよい。
【００４６】
（情報処理装置１００の機能的構成例）
次に、図３を用いて、情報処理装置１００の機能的構成例について説明する。
【００４７】
図３は、情報処理装置１００の機能的構成例を示すブロック図である。情報処理装置１００は、記憶部３００と、取得部３０１と、特定部３０２と、判定部３０３と、変換部３０４と、出力部３０５とを含む。
【００４８】
記憶部３００は、例えば、図２に示したメモリ２０２や記録媒体２０５などの記憶領域によって実現される。取得部３０１〜出力部３０５は、制御部となる機能である。取得部３０１〜出力部３０５は、具体的には、例えば、図２に示したメモリ２０２や記録媒体２０５などの記憶領域に記憶されたプログラムをＣＰＵ２０１に実行させることにより、または、ネットワークＩ／Ｆ２０３により、その機能を実現する。各機能部の処理結果は、例えば、図２に示したメモリ２０２や記録媒体２０５などの記憶領域に記憶される。
【００４９】
記憶部３００は、特定部３０２が関数を特定する際に用いる第１条件〜第７条件を記憶する。記憶部３００は、図４に後述する関数情報、図５に後述する引数情報、図６に後述するｃａｓｅ文情報を記憶する。これにより、記憶部３００は、第１条件〜第７条件、図４に後述する関数情報、図５に後述する引数情報、図６に後述するｃａｓｅ文情報などを、各機能部が参照可能にすることができる。
【００５０】
取得部３０１は、プログラムコードを取得する。プログラムコードは、例えば、ソフトウェアの処理内容が記述されたファイルである。プログラムコードは、例えば、ソースコードに基づいて生成された中間コードである。取得部３０１は、利用者の操作入力に基づいて、ソースコードに基づいて生成された中間コードを取得する。これにより、取得部３０１は、各機能部がプログラムコードを参照可能にすることができる。
【００５１】
特定部３０２は、取得部３０１が取得したプログラムコードにおいて分岐命令を含む、１以上の関数を特定する。特定部３０２は、例えば、中間コードにおいて、ｓｗｉｔｃｈ−ｃａｓｅ文を含む、１以上の関数を特定する。これにより、特定部３０２は、変換候補である関数を、判定部３０３に参照させることができる。
【００５２】
特定部３０２は、取得部３０１が取得したプログラムコードにおいて分岐命令を含み、かつ、所定条件を満たす関数を特定してもよい。所定条件は、例えば、ソフトウェアの実行性能の向上に関わる関数であるか否かの観点に基づいて、利用者によって設定される条件を含む。
【００５３】
所定条件は、例えば、変換部３０４において関数を変換した結果、オブジェクトコードのサイズが一定以上増大するか否かの観点に基づいて、利用者によって設定される条件を含む。所定条件は、例えば、プログラム言語の仕様上、変換部３０４において関数を変換可能であるか否かの観点に基づいて、利用者によって設定される条件を含む。所定条件は、例えば、下記第１条件〜第７条件の少なくともいずれかを含む。
【００５４】
第１条件は、例えば、関数に含まれる分岐命令のそれぞれの分岐先で参照されず、関数に含まれる分岐命令の分岐判定で参照される引数が存在することである。第１条件は、第１条件を満たす関数の引数の個数より、第１条件を満たす関数に含まれるそれぞれの分岐先を関数化した関数の引数の個数が小さくなることを示す。このため、第１条件は、第１条件を満たす関数を変換部３０４において変換した場合に、ソフトウェアが使用する記憶リソースの節約を図ることができ、ソフトウェアの実行性能の向上を図ることができることを示す。また、第１条件は、第１条件を満たさず、ソフトウェアの実行性能の向上への関わりが少ないと判断される関数を、変換候補である関数として判定部３０３に参照させてしまい、判定部３０３の処理量を増大させてしまうことを防止するために用いることができる。
【００５５】
第１条件は、例えば、関数に含まれる分岐命令のそれぞれの分岐先で参照されず、関数の共通処理部で参照されず、関数に含まれる分岐命令の分岐判定で参照される引数が存在することであってもよい。
【００５６】
第２条件は、例えば、関数の呼出元が同一翻訳単位内に存在することである。翻訳単位は、ファイル単位である。翻訳単位は、例えば、中間コード単位である。第２条件は、プログラム言語の仕様上、ｉｐｏが利用されない場合でも、第２条件を満たす関数であれば変換部３０４において変換可能であることを示す。このため、第２条件は、第２条件を満たさず、変換部３０４において変換することができない関数を、変換候補である関数として判定部３０３に参照させてしまい、判定部３０３の処理量を増大させてしまうことを防止するために用いることができる。
【００５７】
第３条件は、例えば、関数が再帰呼び出しされないことである。第３条件は、プログラム言語の仕様上、第３条件を満たす関数を変換部３０４において変換可能であることを示す。このため、第３条件は、第３条件を満たさず、変換部３０４において変換することができない関数を、変換候補である関数として判定部３０３に参照させてしまい、判定部３０３の処理量を増大させてしまうことを防止するために用いることができる。
【００５８】
第４条件は、関数が利用者定義の他の関数を呼び出さないことである。第４条件は、プログラム言語の仕様上、第４条件を満たす関数を変換部３０４において変換可能であることを示す。このため、第４条件は、第４条件を満たさず、変換部３０４において変換することができない関数を、変換候補である関数として判定部３０３に参照させてしまい、判定部３０３の処理量を増大させてしまうことを防止するために用いることができる。
【００５９】
第５条件は、関数が例外処理を有さないことである。第５条件は、プログラム言語の仕様上、第３条件を満たす関数を変換部３０４において変換可能であることを示す。このため、第５条件は、第５条件を満たさず、変換部３０４において変換することができない関数を、変換候補である関数として判定部３０３に参照させてしまい、判定部３０３の処理量を増大させてしまうことを防止するために用いることができる。
【００６０】
第６条件は、関数に含まれる命令数が閾値以下であることである。第６条件は、第６条件を満たす関数を変換部３０４において変換した結果、オブジェクトコードのサイズが一定以上は増大しないと判断されることを示す。このため、第６条件は、第６条件を満たさない関数を変換部３０４において変換してしまい、オブジェクトコードのサイズが一定以上増大してしまうことを防止するために用いることができる。また、第６条件は、第６条件を満たさず、変換部３０４において変換するとオブジェクトコードのサイズを一定以上増大させてしまうと判断される関数を、変換候補である関数として判定部３０３に参照させてしまうことを防止するために用いることができる。このため、第６条件は、判定部３０３の処理量を増大させてしまうことを防止するために用いることができる。
【００６１】
第７条件は、関数の少なくとも一部の引数がスタック経由で受け渡しされることである。第７条件は、第７条件を満たす関数を変換部３０４において変換し、一部の引数をスタック経由からレジスタ経由にすることができれば、一部の引数へのアクセス時間の増大化を抑制し、ソフトウェアの実行性能の向上を図ることができることを示す。また、第７条件は、第７条件を満たさず、ソフトウェアの実行性能の向上への関わりが少ないと判断される関数を、変換候補である関数として判定部３０３に参照させてしまい、判定部３０３の処理量を増大させてしまうことを防止するために用いることができる。
【００６２】
特定部３０２は、例えば、第１条件を満たす関数を特定する。特定部３０２は、具体的には、ｃａｓｅ文で参照されず、共通処理部で参照されず、ｓｗｉｔｃｈ文で参照される引数が存在する関数を特定する。これにより、特定部３０２は、ソフトウェアの実行性能の向上に関わる関数を変換候補として特定し、判定部３０３に参照させることができ、ソフトウェアの実行性能の向上への関わりが少ないと判断される関数を変換候補として特定しないようにすることができる。
【００６３】
結果として、特定部３０２は、ソフトウェアの実行性能の向上に関わる関数を変換候補として判定部３０３に参照させ、ソフトウェアの実行性能の向上を図ることができる。一方で、特定部３０２は、ソフトウェアの実行性能の向上への関わりが少ないと判断される関数を変換候補として判定部３０３に参照させてしまい、判定部３０３の処理量を増大させてしまうことを防止することができる。
【００６４】
特定部３０２は、例えば、第２条件を満たす関数を特定する。特定部３０２は、具体的には、呼出元が同一翻訳単位内に存在する関数を特定する。これにより、特定部３０２は、変換部３０４において変換することができない関数を、変換候補である関数として判定部３０３に参照させてしまい、判定部３０３の処理量を増大させてしまうことを防止することができる。
【００６５】
特定部３０２は、例えば、第３条件を満たす関数を特定する。特定部３０２は、具体的には、再帰呼び出しがされない関数を特定する。これにより、特定部３０２は、変換部３０４において変換することができない関数を、変換候補である関数として判定部３０３に参照させてしまい、判定部３０３の処理量を増大させてしまうことを防止することができる。
【００６６】
特定部３０２は、例えば、第４条件を満たす関数を特定する。特定部３０２は、具体的には、利用者定義の関数を呼び出さない関数を特定する。これにより、特定部３０２は、変換部３０４において変換することができない関数を、変換候補である関数として判定部３０３に参照させてしまい、判定部３０３の処理量を増大させてしまうことを防止することができる。
【００６７】
特定部３０２は、例えば、第５条件を満たす関数を特定する。特定部３０２は、具体的には、例外処理を有さない関数を特定する。これにより、特定部３０２は、変換部３０４において変換することができない関数を、変換候補である関数として判定部３０３に参照させてしまい、判定部３０３の処理量を増大させてしまうことを防止することができる。
【００６８】
特定部３０２は、例えば、第６条件を満たす関数を特定する。特定部３０２は、具体的には、命令数が閾値以下の関数を特定する。これにより、特定部３０２は、命令数が閾値より大きい関数を変換部３０４において変換してしまい、オブジェクトコードのサイズが一定以上増大してしまうことを防止することができる。また、特定部３０２は、変換部３０４において変換するとオブジェクトコードのサイズを一定以上増大させてしまうと判断される関数を、変換候補である関数として判定部３０３に参照させてしまうことを防止することができる。このため、特定部３０２は、判定部３０３の処理量を増大させてしまうことを防止することができる。
【００６９】
特定部３０２は、例えば、第７条件を満たす関数を特定する。特定部３０２は、具体的には、少なくとも一部の引数をスタック経由で受け渡しされる関数を特定する。これにより、特定部３０２は、一部の引数をスタック経由で受け渡しされる関数を変換部３０４において変換し、一部の引数をスタック経由からレジスタ経由にし、一部の引数へのアクセス時間の増大化を抑制し、ソフトウェアの実行性能の向上を図ることができる。また、特定部３０２は、一部の引数をレジスタ経由で受け渡しされ、ソフトウェアの実行性能の向上への関わりが少ないと判断される関数を、変換候補である関数として判定部３０３に参照させてしまうことを防止することができる。このため、特定部３０２は、判定部３０３の処理量を増大させてしまうことを防止することができる。特定部３０２は、特定した結果を、図４に後述する関数情報などを用いて記憶部３００に記憶する。
【００７０】
判定部３０３は、特定部３０２が特定した関数に含まれる分岐命令の少なくともいずれかの分岐先で参照される引数の個数に基づいて、少なくともいずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定する。判定部３０３は、例えば、図５に後述する引数情報、図６に後述するｃａｓｅ文情報などを収集する。判定部３０３は、特定した関数に含まれるｓｗｉｔｃｈ−ｃａｓｅ文の少なくともいずれかのｃａｓｅ文の処理内容で参照される、定数引数を除いた引数の個数が、レジスタ経由で受け渡し可能な上限以下である場合に、受け渡し可能であると判定する。これにより、判定部３０３は、分岐命令を含む関数を変換部３０４において変換した場合に、ソフトウェアの実行性能の向上を図ることができるか否かを判定することができる。
【００７１】
判定部３０３は、特定部３０２が特定した関数に含まれる分岐命令のそれぞれの分岐先で参照される引数の個数に基づいて、それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定する。判定部３０３は、例えば、図５に後述する引数情報、図６に後述するｃａｓｅ文情報などを収集する。判定部３０３は、特定した関数に含まれるｓｗｉｔｃｈ−ｃａｓｅ文のそれぞれのｃａｓｅ文の処理内容で参照される、定数引数を除いた引数の個数が、レジスタ経由で受け渡し可能な上限以下である場合に、受け渡し可能であると判定する。これにより、判定部３０３は、分岐命令を含む関数を変換部３０４において変換した場合に、ソフトウェアの実行性能の向上を図ることができるか否かを判定することができる。
【００７２】
変換部３０４は、少なくともいずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であると判定部３０３が判定した場合、それぞれの分岐先を関数化した関数を用いて、特定部３０２が特定した関数を変換する。一方で、変換部３０４は、いずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能ではないと判定部３０３が判定した場合、特定部３０２が特定した関数を変換しない。
【００７３】
変換部３０４は、例えば、図５に後述する引数情報、図６に後述するｃａｓｅ文情報などを収集する。変換部３０４は、少なくともいずれかのｃａｓｅ文についてレジスタ受け渡し可能であると判定した場合、ｓｗｉｔｃｈ−ｃａｓｅ文のそれぞれのｃａｓｅ文の処理内容を関数化した関数を用いて、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数を変換する。一方で、変換部３０４は、いずれかのｃａｓｅ文についてレジスタ受け渡し可能ではないと判定した場合、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数を変換しないようにする。変換部３０４は、例えば、それぞれのｃａｓｅ文についてレジスタ受け渡し可能ではないと判定した場合、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数を変換しないようにしてもよい。これにより、変換部３０４は、ソフトウェアの実行性能が向上しうる場合に、分岐命令を含む関数を変換することができる。
【００７４】
変換部３０４は、それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であると判定部３０３が判定した場合、それぞれの分岐先を関数化した関数を用いて、特定部３０２が特定した関数を変換する。一方で、変換部３０４は、いずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能ではないと判定部３０３が判定した場合、特定部３０２が特定した関数を変換しない。
【００７５】
変換部３０４は、例えば、図５に後述する引数情報、図６に後述するｃａｓｅ文情報などを収集する。変換部３０４は、それぞれのｃａｓｅ文についてレジスタ受け渡し可能であると判定した場合、ｓｗｉｔｃｈ−ｃａｓｅ文のそれぞれのｃａｓｅ文の処理内容を関数化した関数を用いて、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数を変換する。一方で、変換部３０４は、例えば、いずれかのｃａｓｅ文についてレジスタ受け渡し可能ではないと判定した場合、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数を変換しないようにする。これにより、変換部３０４は、ソフトウェアの実行性能が向上しうる場合に、分岐命令を含む関数を変換することができる。
【００７６】
変換部３０４は、プログラムコードに基づくオブジェクトコードのサイズから、特定した関数を変換した場合におけるプログラムコードに基づくオブジェクトコードのサイズへの増加度合いを示す指標値を算出する。変換部３０４は、例えば、変換前のプログラムコードに基づくオブジェクトコードのサイズに対する、変換後のプログラムコードに基づくオブジェクトコードのサイズの増加割合を、指標値として算出する。これにより、変換部３０４は、特定した関数を変換した場合に、オブジェクトコードのサイズを一定以上増加させてしまう可能性の大きさを評価することができる。
【００７７】
変換部３０４は、特定部３０２が特定した関数ごとに、当該関数に含まれる分岐命令のそれぞれの分岐先を関数化した関数を用いて、当該関数を変換した場合における、プログラムコードに基づくオブジェクトコードのサイズの増加量を算出する。これにより、変換部３０４は、特定した関数を変換した場合に、オブジェクトコードのサイズをどのくらい増加させてしまうかを評価することができる。
【００７８】
変換部３０４は、算出した指標値が閾値以上である場合、特定した関数を変換しないようにしてもよい。これにより、変換部３０４は、オブジェクトコードのサイズの増大化を抑制することができる。
【００７９】
変換部３０４は、特定部３０２が特定した複数の関数を所定規則にしたがって選択し、選択の都度、指標値を算出し、特定部３０２が特定した複数の関数のうち、算出した指標値が閾値以上である関数を変換しないようにしてもよい。
【００８０】
変換部３０４は、例えば、特定部３０２が特定した複数の関数を、ループ処理内で呼び出される関数が先に、ループ処理内で呼び出されない関数が後になるように、順に選択する。これにより、変換部３０４は、ソフトウェアの実行性能の向上への関わりが大きい関数から順に、オブジェクトコードのサイズの増大化を抑制しながら、変換するか否かを決定し、ソフトウェアの実行性能の向上を効率よく図ることができる。
【００８１】
変換部３０４は、例えば、特定部３０２が特定した複数の関数を、引数に指定された定数の個数が大きい関数から順に選択する。これにより、変換部３０４は、ソフトウェアの実行性能の向上への関わりが大きい関数から順に、オブジェクトコードのサイズの増大化を抑制しながら、変換するか否かを決定し、ソフトウェアの実行性能の向上を効率よく図ることができる。
【００８２】
変換部３０４は、例えば、特定部３０２が特定した複数の関数を、算出した増加量が少ない関数から順に選択する。これにより、変換部３０４は、オブジェクトコードのサイズの増大化を抑制しやすい関数から順に変換するか否かを決定し、オブジェクトコードのサイズの増大化を効率よく抑制することができる。
【００８３】
変換部３０４は、それぞれの分岐先を関数化した関数を用いて、特定した関数を変換した場合におけるプログラムコードに基づくオブジェクトコードのサイズが閾値以上である場合に、特定した関数を変換しないようにする。これにより、変換部３０４は、オブジェクトコードのサイズの増大化を抑制することができる。
【００８４】
判定部３０３は、変換部３０４が関数を変換しないようにする場合、それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定しないようにしてもよい。これにより、判定部３０３は、処理量の低減化を図ることができる。
【００８５】
出力部３０５は、変換部３０４の変換結果を出力する。出力部３０５は、各機能部の処理結果を出力してもよい。出力形式は、例えば、ディスプレイへの表示、プリンタへの印刷出力、ネットワークＩ／Ｆ２０３による外部装置への送信、または、メモリ２０２や記録媒体２０５などの記憶領域への記憶である。
【００８６】
（関数情報４００のデータ構造の一例）
次に、図４を用いて、関数情報４００のデータ構造の一例について説明する。関数情報４００は、例えば、図２に示した情報処理装置１００のメモリ２０２や記録媒体２０５などの記憶領域により実現される。
【００８７】
図４は、関数情報４００のデータ構造の一例を示す説明図である。図４に示すように、関数情報４００は、ｆｕｎｃ＿ｄｅｆと、ｃａｌｌｅｒ＿ｐｏｉｎｔと、ｃａｌｌｅｄ＿ｉｎ＿ｌｏｏｐと、ｃｏｎｓｔ＿ａｒｇ＿ｎｕｍと、ｉｎｃｒｅａｓｅ＿ｏｂｊ＿ｓｉｚｅと、ｎｅｘｔとのフィールドを有する。
【００８８】
ｆｕｎｃ＿ｄｅｆは、関数定義情報である。ｃａｌｌｅｒ＿ｐｏｉｎｔは、関数の呼出元を識別する識別情報である。ｃａｌｌｅｄ＿ｉｎ＿ｌｏｏｐは、関数がループ処理内で呼び出されているか否かを示すフラグ情報である。ｃｏｎｓｔ＿ａｒｇ＿ｎｕｍは、関数の実引数として指定された定数の個数である。ｉｎｃｒｅａｓｅ＿ｏｂｊ＿ｓｉｚｅは、関数に含まれるｃａｓｅ文の処理内容を関数化した場合における、オブジェクトコードのサイズの増加量である。ｎｅｘｔは、次の関数情報４００へのポインタである。
【００８９】
（引数情報５００のデータ構造の一例）
次に、図５を用いて、引数情報５００のデータ構造の一例について説明する。引数情報５００は、例えば、図２に示した情報処理装置１００のメモリ２０２や記録媒体２０５などの記憶領域により実現される。
【００９０】
図５は、引数情報５００のデータ構造の一例を示す説明図である。図５に示すように、引数情報５００は、ｓｗｉｔｃｈ＿ａｒｇと、ｃｏｍ＿ａｒｇ＿ｎｕｍと、ｃｏｍ＿ａｒｇ＿ｌｉｓｔと、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅとのフィールドを有する。
【００９１】
ｓｗｉｔｃｈ＿ａｒｇは、ｓｗｉｔｃｈ文で参照される引数のインデックスである。ｃｏｍ＿ａｒｇ＿ｎｕｍは、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数における共通処理部でのみ参照される引数の個数である。ｃｏｍ＿ａｒｇ＿ｌｉｓｔは、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数における共通処理部でのみ参照される引数のインデックスリストである。ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅは、ｃａｓｅ文内で参照される引数についてのｃａｓｅ文情報６００へのポインタである。
【００９２】
（ｃａｓｅ文情報６００のデータ構造の一例）
次に、図６を用いて、ｃａｓｅ文情報６００のデータ構造の一例について説明する。ｃａｓｅ文情報６００は、例えば、図２に示した情報処理装置１００のメモリ２０２や記録媒体２０５などの記憶領域により実現される。
【００９３】
図６は、ｃａｓｅ文情報６００のデータ構造の一例を示す説明図である。図６に示すように、ｃａｓｅ文情報６００は、ｃａｓｅ＿ｖａｌｕｅと、ｃａｓｅ＿ａｒｇ＿ｎｕｍと、ｃａｓｅ＿ａｒｇ＿ｌｉｓｔと、ｎｅｘｔとのフィールドを有する。
【００９４】
ｃａｓｅ＿ｖａｌｕｅは、ｃａｓｅ文を識別するｃａｓｅ文の値である。ｃａｓｅ＿ａｒｇ＿ｎｕｍは、ｃａｓｅ文の処理内容でのみ参照される引数の個数である。ｃａｓｅ＿ａｒｇ＿ｌｉｓｔは、ｃａｓｅ文の処理内容でのみ参照される引数のインデックスリストである。ｎｅｘｔは、次のｃａｓｅ情報へのポインタである。
【００９５】
（プログラムコード７００をコンパイルする実施例）
次に、図７〜図１２を用いて、実行可能ファイルを生成する実施例について説明する。まず、図７を用いて、コンパイルされるプログラムコード７００の一例について説明する。
【００９６】
図７は、プログラムコード７００の一例を示す説明図である。図７に示すように、プログラムコード７００は、例えば、ｍａｉｎ関数が記述されている。ｍａｉｎ関数は、３つの関数ｓｕｂ１、ｓｕｂ２、ｓｕｂ３を呼び出している。
【００９７】
ｓｕｂ１は、ｓｗｉｔｃｈ−ｃａｓｅ文が記述されていない。ｓｕｂ２、ｓｕｂ３は、ｓｗｉｔｃｈ−ｃａｓｅ文が記述されている。また、ｓｕｂ１の呼出元、２回目のｓｕｂ２の呼出元は、ループ処理内に存在しない。また、１回目のｓｕｂ２の呼出元、ｓｕｂ３の呼出元は、ループ処理内に存在する。
【００９８】
以下の説明では、ｓｕｂ１の呼出元を「ｃａｌｌｅｒ＿ｓｕｂ１」と表記する場合がある。以下の説明では、１回目のｓｕｂ２の呼出元を「ｃａｌｌｅｒ＿ｓｕｂ２＿Ａ」と表記し、２回目のｓｕｂ２の呼出元を「ｃａｌｌｅｒ＿ｓｕｂ２＿Ｂ」と表記する場合がある。以下の説明では、ｓｕｂ３の呼出元を「ｃａｌｌｅｒ＿ｓｕｂ３」と表記する場合がある。
【００９９】
そして、ｓｕｂ２の仮引数ｘ、ｙ、ｚ、ｗ、ｖについて、ｘはｃａｓｅ１の処理、ｙはｃａｓｅ３の処理、ｚはｃａｓｅ５の処理のみで参照され、ｖは共通処理部のみで参照されており、ｗはｓｗｉｔｃｈ文でのみ参照されている。
【０１００】
図８〜図１１は、プログラムコード７００を変換する流れを示す説明図である。図８において、まず、情報処理装置１００は、プログラムコード７００においてｓｗｉｔｃｈ−ｃａｓｅ文を含む関数が存在するか検索し、存在する場合は、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数の関数名を、関数候補リストｃａｎｄｉｄａｔｅｓに登録する。
【０１０１】
ここで、関数ｓｕｂ１はｓｗｉｔｃｈ−ｃａｓｅ文を含んでいないが、関数ｓｕｂ２、ｓｕｂ３はｓｗｉｔｃｈ−ｃａｓｅ文を含んでいる。このため、情報処理装置１００は、ｓｕｂ２、ｓｕｂ３をｃａｎｄｉｄａｔｅｓに登録し、ｃａｎｄｉｄａｔｅｓ＝｛ｓｕｂ２，ｓｕｂ３｝とする。
【０１０２】
次に、情報処理装置１００は、ｃａｎｄｉｄａｔｅｓに関数名を登録した関数に対して、上述した第１条件〜第７条件を満たすか否かを判定する。関数の引数が、レジスタ経由になるか、または、スタック経由になるかの基準は、ＡＢＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｂｉｎａｒｙ  Ｉｎｔｅｒｆａｃｅ）により異なる。ここでは、引数が４個未満であればレジスタ経由、４個以上であればスタック経由になるものとする。また、ここでは、ｃａｎｄｉｄａｔｅｓに関数名を登録したそれぞれの関数の命令数は、閾値以下であるとする。この場合、情報処理装置１００は、ｃａｎｄｉｄａｔｅｓに関数名を登録したｓｕｂ２、ｓｕｂ３が第１条件〜第７条件を満たすと判定し、ｃａｎｄｉｄａｔｅｓから削除しない。
【０１０３】
そして、情報処理装置１００は、ｃａｎｄｉｄａｔｅｓに基づいて、関数情報リストｉｎｆｏ＿ｌｉｓｔを生成する。図８の例では、関数情報リストｉｎｆｏ＿ｌｉｓｔは、関数情報ｉｎｆｏとして、関数情報８０１〜８０３を含む。
【０１０４】
情報処理装置１００は、例えば、ｃａｎｄｉｄａｔｅｓに関数名を登録した関数へのポインタｆを用意し、ｆの呼出元へのポインタｐを用意する。まず、情報処理装置１００は、関数へのポインタｆにｓｕｂ２を設定し、ｓｕｂ２の呼出元へのポインタｐにｃａｌｌｅｒ＿ｓｕｂ２＿Ａを設定する。情報処理装置１００は、ｓｕｂ２について関数情報８０１を用意する。
【０１０５】
情報処理装置１００は、関数情報８０１において、ｆｕｎｃ＿ｄｅｆにｓｕｂ２の定義情報を設定し、ｃａｌｌｅｒ＿ｐｏｉｎｔにｓｕｂ２の呼出元へのポインタｐが示すｃａｌｌｅｒ＿ｓｕｂ２＿Ａを設定する。ここで、ｃａｌｌｅｒ＿ｓｕｂ２＿Ａはループ処理内で呼び出されており、引数に定数が１つ指定されている。このため、情報処理装置１００は、関数情報８０１において、ｃａｌｌｅｄ＿ｉｎ＿ｌｏｏｐにｔｒｕｅを設定し、ｃｏｎｓｔ＿ａｒｇ＿ｎｕｍに１を設定する。
【０１０６】
次に、情報処理装置１００は、ｓｕｂ２の呼出元へのポインタｐに、ｃａｌｌｅｒ＿ｓｕｂ２＿Ｂを設定する。情報処理装置１００は、ｓｕｂ２についての関数情報８０２を用意し、ｓｕｂ２についての関数情報８０１のｎｅｘｔに、用意した関数情報８０２へのポインタを設定する。
【０１０７】
情報処理装置１００は、関数情報８０２において、ｆｕｎｃ＿ｄｅｆにｓｕｂ２の定義情報を設定し、ｃａｌｌｅｒ＿ｐｏｉｎｔにｓｕｂ２の呼出元へのポインタｐが示すｃａｌｌｅｒ＿ｓｕｂ２＿Ｂを設定する。ここで、ｃａｌｌｅｒ＿ｓｕｂ２＿Ｂはループ処理内で呼び出されておらず、引数に定数が指定されていない。このため、情報処理装置１００は、関数情報８０２において、ｃａｌｌｅｄ＿ｉｎ＿ｌｏｏｐにｆａｌｓｅを設定し、ｃｏｎｓｔ＿ａｒｇ＿ｎｕｍに０を設定する。
【０１０８】
そして、情報処理装置１００は、ｃａｌｌｅｒ＿ｓｕｂ２＿Ａ、ｃａｌｌｅｒ＿ｓｕｂ２＿Ｂ以外に、ｓｕｂ２の呼出元が存在しないため、関数へのポインタｆをｓｕｂ３に更新し、ｓｕｂ３の呼出元へのポインタｐにｃａｌｌｅｒ＿ｓｕｂ３を設定する。情報処理装置１００は、ｓｕｂ３について関数情報８０３を用意し、ｓｕｂ２についての関数情報８０２のｎｅｘｔに、用意した関数情報８０３へのポインタを設定する。
【０１０９】
情報処理装置１００は、関数情報８０３において、ｆｕｎｃ＿ｄｅｆにｓｕｂ３の定義情報を設定し、ｃａｌｌｅｒ＿ｐｏｉｎｔにｓｕｂ３の呼出元へのポインタｐが示すｃａｌｌｅｒ＿ｓｕｂ３を設定する。ここで、ｃａｌｌｅｒ＿ｓｕｂ３はループ処理内で呼び出されており、引数に定数が１つ指定されている。このため、情報処理装置１００は、関数情報８０３において、ｃａｌｌｅｄ＿ｉｎ＿ｌｏｏｐにｔｒｕｅを設定し、ｃｏｎｓｔ＿ａｒｇ＿ｎｕｍに１を設定する。
【０１１０】
ここでは、情報処理装置１００は、ｉｎｃｒｅａｓｅ＿ｏｂｊ＿ｓｉｚｅはソースコードに依存するため、ソースコードを解析し、ｓｕｂ２のｉｎｃｒｅａｓｅ＿ｏｂｊ＿ｓｉｚｅを３０とし、ｓｕｂ３のｉｎｃｒｅａｓｅ＿ｏｂｊ＿ｓｉｚｅを６０と設定する。
【０１１１】
情報処理装置１００は、具体的には、ＲＩＳＣ（Ｒｅｄｕｃｅｄ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒ）の場合であれば、ＲＩＳＣは命令語長が固定であるため、関数にかかるオブジェクトコードのサイズの増加量＝（命令語長）×（関数内の総命令数）により算出する。また、情報処理装置１００は、具体的には、ＣＩＳＣ（Ｃｏｍｐｌｅｘ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒ）の場合であれば、ＣＩＳＣは命令語長が可変であるため、関数内の各命令の命令語長を足し合わせていくことにより、関数にかかるオブジェクトコードのサイズの増加量を算出する。次に、図９の説明に移行する。
【０１１２】
図９において、情報処理装置１００は、所定規則にしたがってｉｎｆｏ＿ｌｉｓｔを並び替える。所定規則は、例えば、ループ処理内で呼び出されている関数の関数情報ｉｎｆｏのグループＡを、ループ処理内で呼び出されていない関数の関数情報ｉｎｆｏのグループＢよりも前に並べる規則を含む。所定規則は、さらに、グループＡ、Ｂの中で、実引数に指定されている定数の個数が大きい順に並べる規則を含む。所定規則は、さらに、グループＡ、Ｂの中で、実引数に指定されている定数の個数が同じ関数があれば、オブジェクトコードのサイズの増加量が小さい順に並べる規則を含む。
【０１１３】
ここで、ｉｎｆｏ＿ｌｉｓｔにおいて、ｃａｌｌｅｄ＿ｉｎ＿ｌｏｏｐがｔｒｕｅである関数情報ｉｎｆｏは、関数情報８０１，８０３である。このため、情報処理装置１００は、関数情報８０１，８０３を、グループＡに登録する。一方で、ｃａｌｌｅｄ＿ｉｎ＿ｌｏｏｐがｆａｌｓｅである関数情報ｉｎｆｏは、関数情報８０２である。このため、情報処理装置１００は、関数情報８０２を、グループＢに登録する。
【０１１４】
次に、情報処理装置１００は、ｃｏｎｓｔ＿ａｒｇ＿ｎｕｍが大きい順に、グループＡ、Ｂに登録された関数情報ｉｎｆｏを並び替える。ここで、グループＡに登録された関数情報８０１，８０３のｃｏｎｓｔ＿ａｒｇ＿ｎｕｍは等しい。このため、情報処理装置１００は、グループＡを並び替えなくてよい。一方で、グループＢに登録された関数情報８０２は、１つである。このため、情報処理装置１００は、グループＢを並べ替えなくてよい。
【０１１５】
そして、情報処理装置１００は、ｉｎｃｒｅａｓｅ＿ｏｂｊ＿ｓｉｚｅが小さい順に、グループＡ、Ｂに登録された関数情報ｉｎｆｏを並び替える。ここで、グループＡにおいて、関数情報８０１のｉｎｃｒｅａｓｅ＿ｏｂｊ＿ｓｉｚｅが、関数情報８０３のｉｎｃｒｅａｓｅ＿ｏｂｊ＿ｓｉｚｅより小さい。このため、情報処理装置１００は、グループＡを並び替えなくてよい。一方で、グループＢに登録された関数情報８０２は、１つである。このため、情報処理装置１００は、グループＢを並べ替えなくてよい。
【０１１６】
次に、情報処理装置１００は、グループＡに登録されている関数情報ｉｎｆｏを先頭の関数情報ｉｎｆｏから順に、新しい関数情報リストｏｒｄｅｒｅｄ＿ｉｎｆｏ＿ｌｉｓｔに追加する。その後、情報処理装置１００は、グループＢに登録されている関数情報ｉｎｆｏを先頭の関数情報ｉｎｆｏから順に、新しい関数情報リストｏｒｄｅｒｅｄ＿ｉｎｆｏ＿ｌｉｓｔに追加する。
【０１１７】
これにより、情報処理装置１００は、関数を変換した場合に、ソフトウェアの実行性能の向上に関わりが大きく、かつ、オブジェクトコードのサイズを増大化させづらいと判断される関数を優先して、変換候補として用いることができる。次に、図１０の説明に移行する。
【０１１８】
図１０において、情報処理装置１００は、ｏｒｄｅｒｅｄ＿ｉｎｆｏ＿ｌｉｓｔに基づいて、関数化処理を実行する。ここでは、関数化処理が実行される前のオブジェクトコードのサイズｂｅｆｏｒｅを２００とする。情報処理装置１００は、オブジェクトコードのサイズの増大化を抑制するための閾値として１．２を設定する。
【０１１９】
まず、情報処理装置１００は、いずれかの関数を変換した場合のオブジェクトコードのサイズの増加量を設定する変数ｓｕｍを用意し、いずれかの関数を変換した場合のオブジェクトコードのサイズを設定する変数ａｆｔｅｒを用意する。情報処理装置１００は、ｏｒｄｅｒｅｄ＿ｉｎｆｏ＿ｌｉｓｔの先頭の関数情報８０１を取得する。情報処理装置１００は、関数情報８０１に基づいて、ｓｕｂ２に対して関数化処理を実行する。
【０１２０】
ここで、情報処理装置１００は、関数情報８０１に基づいて「ｓｕｍ＝３０」と設定する。次に、情報処理装置１００は、「ａｆｔｅｒ＝ｂｅｆｏｒｅ＋ｓｕｍ＝２００＋３０＝２３０」と設定する。そして、情報処理装置１００は、「ｒａｔｉｏ＝ａｆｔｅｒ／ｂｅｆｏｒｅ＝２３０／２００＝１．１５」を算出する。ここで、情報処理装置１００は、「ｒａｔｉｏ＜＝閾値」と判定する。これにより、情報処理装置１００は、ｓｕｂ２を変換しても、オブジェクトコードのサイズの増大化は抑制可能であると判断する。
【０１２１】
次に、情報処理装置１００は、ｓｕｂ２の引数情報１０００を収集する。ここでは、引数が４個未満であれば、引数をレジスタ経由で受け渡し可能である。このため、情報処理装置１００は、受け渡し可能な引数の上限として「ｍａｘ＿ａｒｇ＿ｎｕｍ＝３」を設定する。
【０１２２】
次に、情報処理装置１００は、ｓｕｂ２の引数は５個であることから、「ａｒｇ＿ｎｕｍ＿ｗｏ＿ｓｗｉｔｃｈ＝５−１＝４」と設定する。そして、情報処理装置１００は、「ａｒｇ＿ｎｕｍ＿ｗｏ＿ｓｗｉｔｃｈ＞ｍａｘ＿ａｒｇ＿ｎｕｍ」と判定する。これにより、情報処理装置１００は、「ａｒｇ＿ｎｕｍ＿ｗｏ＿ｓｗｉｔｃｈ＞ｍａｘ＿ａｒｇ＿ｎｕｍ」であれば、ｓｕｂ２について変換することが好ましい可能性があると判定する。
【０１２３】
ここでは、情報処理装置１００は、ｓｕｂ２について変換することが好ましい可能性があると判定する。そして、情報処理装置１００は、ｓｕｂ２のそれぞれのｃａｓｅ文の処理内容を関数化しても、引数をスタック経由ではなくレジスタ経由で受け渡し可能であるか否かを判定する判定処理を実行する。
【０１２４】
まず、情報処理装置１００は、ｃｏｍ＿ａｒｇ＿ｎｕｍに１を設定し、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅにｃａｓｅ文情報１０１０へのポインタを設定する。このとき、情報処理装置１００は、「ｃａｓｅ＿ａｒｇ＿ｎｕｍ＝１」であるため、「ｎｅｅｄ＿ａｒｇ＿ｎｕｍ＝１＋１＝２」と設定し、「ｎｅｅｄ＿ａｒｇ＿ｎｕｍ＜＝ｍａｘ＿ａｒｇ＿ｎｕｍ」と判定する。これにより、情報処理装置１００は、「ｎｅｅｄ＿ａｒｇ＿ｎｕｍ＜＝ｍａｘ＿ａｒｇ＿ｎｕｍ」であれば、ｃａｓｅ文１の引数についてレジスタ経由で受け渡し可能であると判定する。
【０１２５】
次に、情報処理装置１００は、ｃａｓｅ文情報１０１０のｎｅｘｔに基づいてｃａｓｅ文情報１０１１を参照し、同様に「ｎｅｅｄ＿ａｒｇ＿ｎｕｍ＜＝ｍａｘ＿ａｒｇ＿ｎｕｍ」と判定する。これにより、情報処理装置１００は、「ｎｅｅｄ＿ａｒｇ＿ｎｕｍ＜＝ｍａｘ＿ａｒｇ＿ｎｕｍ」であれば、ｃａｓｅ文３の引数についてレジスタ経由で受け渡し可能であると判定する。
【０１２６】
そして、情報処理装置１００は、ｃａｓｅ文情報１０１１のｎｅｘｔに基づいてｃａｓｅ文情報１０１２を参照し、同様に「ｎｅｅｄ＿ａｒｇ＿ｎｕｍ＜＝ｍａｘ＿ａｒｇ＿ｎｕｍ」と判定する。これにより、情報処理装置１００は、「ｎｅｅｄ＿ａｒｇ＿ｎｕｍ＜＝ｍａｘ＿ａｒｇ＿ｎｕｍ」であれば、ｃａｓｅ文５の引数についてレジスタ経由で受け渡し可能であると判定する。
【０１２７】
以上により、情報処理装置１００は、ｓｕｂ２のそれぞれのｃａｓｅ文の処理内容を関数化しても、引数をスタック経由ではなくレジスタ経由で受け渡し可能であると判定する。このため、情報処理装置１００は、判定処理の返り値にｔｒｕｅを設定する。次に、図１１の説明に移行する。
【０１２８】
図１１において、情報処理装置１００は、判定処理の返り値がｔｒｕｅであるため、ｓｕｂ２−ｃａｌｌｅｒ＿ｓｕｂ２＿Ａに対して、関数作成処理を実行する。ｓｕｂ２−ｃａｌｌｅｒ＿ｓｕｂ２＿Ａは、ｓｕｂ２と、ｓｕｂ２の呼出元ｃａｌｌｅｒ＿ｓｕｂ２＿Ａの組み合わせを示す。
【０１２９】
まず、情報処理装置１００は、関数作成対象がｓｕｂ２−ｃａｌｌｅｒ＿ｓｕｂ２＿Ａであるため、ｄｅｆにｓｕｂ２の定義情報を設定し、ｃａｌｌｅｒ＿ｐｏｉｎｔにｃａｌｌｅｒ＿ｓｕｂ２＿Ａを設定する。また、情報処理装置１００は、ｃｏｍ＿ａｒｇ＿ｌｉｓｔにＮＵＬＬを設定し、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅにｃａｓｅ文情報１０１１を設定する。
【０１３０】
ここで、情報処理装置１００は、ｎｅｗ＿ｆｕｎｃ＿ｌｉｓｔを用意する。ｎｅｗ＿ｆｕｎｃ＿ｌｉｓｔは、関数作成処理により作成されたｃａｓｅ文に対応する関数を保持するリストであり、初期値は空である。
【０１３１】
次に、情報処理装置１００は、ｄｅｆと、ｃｏｍ＿ａｒｇ＿ｌｉｓｔと、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅから得られるｃａｓｅ＿ａｒｇ＿ｌｉｓｔとに基づいて、ｓｕｂ２の共通処理部と、それぞれのｃａｓｅ文の処理内容とをまとめて関数化する。そして、情報処理装置１００は、作成された関数を、ｎｅｗ＿ｆｕｎｃ＿ｌｉｓｔに追加する。図１１の例では、ｎｅｗ＿ｆｕｎｃ＿ｌｉｓｔは、符号１１００の関数群を示すようになる。
【０１３２】
情報処理装置１００は、関数作成処理を終了すると、ｄｅｆと、ｃａｌｌｅｒ＿ｐｏｉｎｔとに基づいて、ｃａｌｌｅｒ＿ｓｕｂ２＿Ａをｓｗｉｔｃｈ−ｃａｓｅ文に置き換える。そして、情報処理装置１００は、ｎｅｗ＿ｆｕｎｃ＿ｌｉｓｔに基づいて、置き換えたｃａｓｅ文の処理内容として、ｓｕｂ２のそれぞれのｃａｓｅ文の処理内容を関数化した関数の呼出命令に置き換える。
【０１３３】
そして、情報処理装置１００は、次のｃａｓｅ文情報１０１１を参照し、ｓｕｂ３−ｃａｌｌｅｒ＿ｓｕｂ３に対して、同様に、「ｓｕｍ＝３０＋６０＝９０」と設定し、「ａｆｔｅｒ＝２００＋９０＝２９０」と設定する。そして、情報処理装置１００は、「ｒａｔｉｏ＝２９０／２００＝１．４５」を算出する。このため、情報処理装置１００は、「ｒａｔｉｏ＞閾値」であるため、ｓｕｂ３−ｃａｌｌｅｒ＿ｓｕｂ３について、関数を変換しない。
【０１３４】
また、情報処理装置１００は、次のｃａｓｅ文情報１０１２を参照し、ｓｕｂ２−ｃａｌｌｅｒ＿ｓｕｂ２＿Ｂに対して、同様に、「ｒａｔｉｏ＝２６０／２００＝１．３」を算出する。このため、情報処理装置１００は、「ｒａｔｉｏ＞閾値」であるため、ｓｕｂ２−ｃａｌｌｅｒ＿ｓｕｂ２＿Ｂについて、関数を変換しない。これにより、情報処理装置１００は、プログラムコード７００を変換することができる。次に、図１２の説明に移行する。
【０１３５】
図１２は、変換されたプログラムコード１２００の一例を示す説明図である。情報処理装置１００は、図７に示したプログラムコード７００を、図１２に示したプログラムコード１２００に変換する。ここで、仮に、プログラムコード７００のすべてのｃａｓｅ文を関数化した場合、生成されるオブジェクトコードのサイズの増加量は「３０＋３０＋６０＝１２０」となる。一方で、プログラムコード７００をプログラムコード１２００に変換した場合、生成させるオブジェクトコードのサイズの増加量は「３０」となる。このため、情報処理装置１００は、生成されるオブジェクトコードのサイズの増大化を抑制することができる。
【０１３６】
また、情報処理装置１００は、プログラムコード１２００において、引数をレジスタ経由で受け渡しすることにより、引数へのアクセス性能の向上を図り、ソフトウェアの実行性能の向上を図ることができる。また、情報処理装置１００は、ｃａｓｅ文で参照されていない仮引数を、ｃａｓｅ文の処理内容を関数化する際に削除することができ、引数の受け渡しがされる際に使用される記憶リソースの削減を図ることができる。
【０１３７】
また、情報処理装置１００は、ｃａｓｅ文の処理内容を関数化した関数において、ｓｗｉｔｃｈ−ｃａｓｅ文の分岐処理が削除されるため、データの依存解析の容易化を図ることができる。このため、情報処理装置１００は、最適化の効率化を図ることができ、ソフトウェアの実行性能が向上しやすくすることができる。情報処理装置１００は、変換後のプログラムコードで呼び出されない関数があれば、その関数を削除してもよい。情報処理装置１００は、最適化によって、変換後のプログラムコードで呼び出されない関数があれば、その関数を削除してもよい。
【０１３８】
（コンパイル処理手順の一例）
次に、図１３を用いて、コンパイル処理手順の一例について説明する。
【０１３９】
図１３は、コンパイル処理手順の一例を示すフローチャートである。図１３において、まず、情報処理装置１００は、ソースコードを取得する（ステップＳ１３０１）。
【０１４０】
次に、情報処理装置１００は、取得したソースコードを解析し、コンパイラ特有の中間コードを生成する（ステップＳ１３０２）。そして、情報処理装置１００は、生成した中間コードを走査し、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数を検索し、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数を関数候補リストに登録する（ステップＳ１３０３）。
【０１４１】
次に、情報処理装置１００は、関数候補リストが空であるか否かを判定する（ステップＳ１３０４）。ここで、空である場合（ステップＳ１３０４：Ｙｅｓ）、情報処理装置１００は、ステップＳ１３１０の処理に移行する。
【０１４２】
一方で、空ではない場合（ステップＳ１３０４：Ｎｏ）、情報処理装置１００は、関数候補リストに登録された関数が複数の条件を満たすか否かを判定し、少なくともいずれかの条件を満たさない関数を関数候補リストから削除する（ステップＳ１３０５）。複数の条件は、例えば、上述した第１条件〜第７条件である。
【０１４３】
次に、情報処理装置１００は、関数候補リストが空であるか否かを判定する（ステップＳ１３０６）。ここで、空である場合（ステップＳ１３０６：Ｙｅｓ）、情報処理装置１００は、ステップＳ１３１０の処理に移行する。
【０１４４】
一方で、空ではない場合（ステップＳ１３０６：Ｎｏ）、情報処理装置１００は、図１４に後述する関数情報リスト作成処理を実行し、関数候補リストに登録された関数についての各種情報を関数情報リストに追加する（ステップＳ１３０７）。各種情報は、関数の呼出元、関数がループ処理内で呼び出されているか否か、関数の実引数に指定された定数の個数、関数に含まれるｃａｓｅ文の処理内容を関数化した場合におけるオブジェクトコードのサイズの増加量などの情報である。
【０１４５】
次に、情報処理装置１００は、所定規則にしたがって、関数情報リストをソートする（ステップＳ１３０８）。所定規則は、例えば、ループ処理内で呼び出されている関数の関数情報のグループＡを、ループ処理内で呼び出されていない関数の関数情報のグループＢよりも前に並べる規則を含む。所定規則は、さらに、グループＡ、Ｂの中で、実引数に指定されている定数の個数が大きい順に並べる規則を含む。所定規則は、さらに、グループＡ、Ｂの中で、実引数に指定されている定数の個数が同じ関数があれば、オブジェクトコードのサイズの増加量が小さい順に並べる規則を含む。
【０１４６】
そして、情報処理装置１００は、関数情報リストの先頭の関数から順に、図１７に後述する関数化処理を実行する（ステップＳ１３０９）。図１７に後述する関数化処理は、生成されるオブジェクトコードのサイズの増大化を抑制しつつ、ｓｗｉｔｃｈ−ｃａｓｅ文を含む関数を変換し、ソフトウェアの実行性能の向上を図る。
【０１４７】
次に、情報処理装置１００は、中間コードに対して最適化を実行する（ステップＳ１３１０）。そして、情報処理装置１００は、最適化後の中間コードに基づいてアセンブラコードを生成する（ステップＳ１３１１）。
【０１４８】
次に、情報処理装置１００は、リンカにより、生成したアセンブラコードに基づいてオブジェクトコードを生成する（ステップＳ１３１２）。そして、情報処理装置１００は、生成したオブジェクトコードに基づいて実行可能ファイルを生成する（ステップＳ１３１３）。その後、情報処理装置１００は、コンパイル処理を終了する。
【０１４９】
（関数情報リスト作成処理手順の一例）
次に、図１４を用いて、関数情報リスト作成処理手順の一例について説明する。
【０１５０】
図１４は、関数情報リスト作成処理手順の一例を示すフローチャートである。図１４において、情報処理装置１００は、ｆ←関数候補リストの先頭の関数とする（ステップＳ１４０１）。
【０１５１】
次に、情報処理装置１００は、ｐ←ｆの呼出元とする（ステップＳ１４０２）。そして、情報処理装置１００は、ｐ＝＝ＮＵＬＬであるか否かを判定する（ステップＳ１４０３）。ここで、ｐ＝＝ＮＵＬＬである場合（ステップＳ１４０３：Ｙｅｓ）、情報処理装置１００は、ステップＳ１４１１の処理に移行する。
【０１５２】
一方で、ｐ＝＝ＮＵＬＬではない場合（ステップＳ１４０３：Ｎｏ）、情報処理装置１００は、関数情報リストｉｎｆｏ．ｌｉｓｔに登録する関数情報ｉｎｆｏを生成する（ステップＳ１４０４）。
【０１５３】
次に、情報処理装置１００は、ｐがループ処理内であるか否かを判定する（ステップＳ１４０５）。ここで、ループ処理内である場合（ステップＳ１４０５：Ｙｅｓ）、情報処理装置１００は、ｉｎｆｏ．ｃａｌｌｅｄ＿ｉｎ＿ｌｏｏｐ←ｔｒｕｅとする（ステップＳ１４０６）。そして、情報処理装置１００は、ステップＳ１４０８の処理に移行する。
【０１５４】
一方で、ループ処理内ではない場合（ステップＳ１４０５：Ｎｏ）、情報処理装置１００は、ｉｎｆｏ．ｃａｌｌｅｄ＿ｉｎ＿ｌｏｏｐ←ｆａｌｓｅとする（ステップＳ１４０７）。そして、情報処理装置１００は、ステップＳ１４０８の処理に移行する。
【０１５５】
ステップＳ１４０８では、情報処理装置１００は、図１５または図１６に後述するサイズ算出処理を利用し、関数化によるオブジェクトコードのサイズの増加量を算出する。情報処理装置１００は、ｉｎｆｏ．ｃｏｎｓｔ＿ａｒｇ＿ｎｕｍ←ｐによって指定された定数引数の個数とし、ｉｎｆｏ．ｉｎｃｒｅａｓｅ＿ｏｂｊ＿ｓｉｚｅ←関数化によるオブジェクトコードのサイズの増加量とする（ステップＳ１４０８）。
【０１５６】
次に、情報処理装置１００は、ｐ←ｐの次の呼出元とする（ステップＳ１４０９）。そして、情報処理装置１００は、関数情報リストｉｎｆｏ．ｌｉｓｔに、関数情報ｉｎｆｏを追加する（ステップＳ１４１０）。その後、情報処理装置１００は、ステップＳ１４０３の処理に戻る。
【０１５７】
ステップＳ１４１１では、情報処理装置１００は、ｆ←ｆの次の関数とする（ステップＳ１４１１）。次に、情報処理装置１００は、ｆ＝＝ＮＵＬＬであるか否かを判定する（ステップＳ１４１２）。ここで、ｆ＝＝ＮＵＬＬではない場合（ステップＳ１４１２：Ｎｏ）、情報処理装置１００は、ステップＳ１４０２の処理に戻る。
【０１５８】
一方で、ｆ＝＝ＮＵＬＬである場合（ステップＳ１４１２：Ｙｅｓ）、情報処理装置１００は、関数情報リスト作成処理を終了する。
【０１５９】
（サイズ算出処理手順の一例）
次に、図１５を用いて、サイズ算出処理手順の一例について説明する。
【０１６０】
図１５は、サイズ算出処理手順の一例を示すフローチャートである。図１５において、情報処理装置１００は、ｉｎｓｔ←関数の先頭の命令とし、ｉｎｓｔ＿ｎｕｍ←０とする（ステップＳ１５０１）。
【０１６１】
次に、情報処理装置１００は、ｉｎｓｔ＝＝ＮＵＬＬであるか否かを判定する（ステップＳ１５０２）。ここで、ｉｎｓｔ＝＝ＮＵＬＬではない場合（ステップＳ１５０２：Ｎｏ）、情報処理装置１００は、ｉｎｓｔ＿ｎｕｍ←ｉｎｓｔ＿ｎｕｍ＋１とする（ステップＳ１５０３）。次に、情報処理装置１００は、ｉｎｓｔ←ｉｎｓｔの次の命令とする（ステップＳ１５０４）。そして、情報処理装置１００は、ステップＳ１５０２の処理に戻る。
【０１６２】
一方で、ｉｎｓｔ＝＝ＮＵＬＬである場合（ステップＳ１５０２：Ｙｅｓ）、情報処理装置１００は、ｏｂｊ＿ｃｏｄｅ＿ｓｉｚｅ←（命令語長）＊ｉｎｓｔ＿ｎｕｍとする（ステップＳ１５０５）。そして、情報処理装置１００は、サイズ算出処理を終了する。
【０１６３】
（サイズ算出処理手順の別の例）
次に、図１６を用いて、サイズ算出処理手順の別の例について説明する。
【０１６４】
図１６は、サイズ算出処理手順の別の例を示すフローチャートである。図１６において、情報処理装置１００は、ｉｎｓｔ←関数の先頭の命令とし、ｏｂｊ＿ｃｏｄｅ＿ｓｉｚｅ←０とする（ステップＳ１６０１）。
【０１６５】
次に、情報処理装置１００は、ｉｎｓｔ＝＝ＮＵＬＬであるか否かを判定する（ステップＳ１６０２）。ここで、ｉｎｓｔ＝＝ＮＵＬＬではない場合（ステップＳ１６０２：Ｎｏ）、情報処理装置１００は、ｏｂｊ＿ｃｏｄｅ＿ｓｉｚｅ←ｏｂｊ＿ｃｏｄｅ＿ｓｉｚｅ＋ｉｎｓｔの命令語長とする（ステップＳ１６０３）。次に、情報処理装置１００は、ｉｎｓｔ←ｉｎｓｔの次の命令とする（ステップＳ１６０４）。そして、情報処理装置１００は、ステップＳ１６０２の処理に戻る。
【０１６６】
一方で、ｉｎｓｔ＝＝ＮＵＬＬである場合（ステップＳ１６０２：Ｙｅｓ）、情報処理装置１００は、サイズ算出処理を終了する。
【０１６７】
（関数化処理手順の一例）
次に、図１７を用いて、関数化処理手順の一例について説明する。
【０１６８】
図１７は、関数化処理手順の一例を示すフローチャートである。図１７において、情報処理装置１００は、ｉｎｆｏ←関数情報リストの先頭の関数情報とし、ｂｅｆｏｒｅ←関数化前のオブジェクトコードのサイズとし、ｓｕｍ←０とする（ステップＳ１７０１）。
【０１６９】
次に、情報処理装置１００は、ｓｕｍ←ｓｕｍ＋ｉｎｃｒｅａｓｅ＿ｏｂｊ＿ｓｉｚｅとし、ｒａｔｉｏ←（ｂｅｆｏｒｅ＋ｓｕｍ）／ｂｅｆｏｒｅとする（ステップＳ１７０２）。そして、情報処理装置１００は、ｒａｔｉｏ＜＝閾値であるか否かを判定する（ステップＳ１７０３）。ここで、ｒａｔｉｏ＜＝閾値ではない場合（ステップＳ１７０３：Ｎｏ）、情報処理装置１００は、ステップＳ１７０８の処理に移行する。
【０１７０】
一方で、ｒａｔｉｏ＜＝閾値である場合（ステップＳ１７０３：Ｙｅｓ）、情報処理装置１００は、ｉｎｆｏに対応する引数情報を取得し、ａｒｇ＿ｉｎｆｏ←ｉｎｆｏに対応する引数情報とする（ステップＳ１７０４）。
【０１７１】
次に、情報処理装置１００は、図１８に後述するスタック使用判定処理を実行し、ｒｅｓ←判定結果（ｉｎｆｏ，ａｒｇ＿ｉｎｆｏ）とする（ステップＳ１７０５）。そして、情報処理装置１００は、ｒｅｓ＝＝ｔｒｕｅであるか否かを判定する（ステップＳ１７０６）。ここで、ｒｅｓ＝＝ｔｒｕｅである場合（ステップＳ１７０６：Ｙｅｓ）、情報処理装置１００は、図２０に後述する関数作成処理を実行する（ステップＳ１７０７）。そして、情報処理装置１００は、ステップＳ１７０９の処理に移行する。
【０１７２】
一方で、ｒｅｓ＝＝ｔｒｕｅではない場合（ステップＳ１７０６：Ｎｏ）、情報処理装置１００は、ｓｕｍ←ｓｕｍ−ｉｎｃｒｅａｓｅ＿ｏｂｊ＿ｓｉｚｅとする（ステップＳ１７０８）。そして、情報処理装置１００は、ステップＳ１７０９の処理に移行する。
【０１７３】
ステップＳ１７０９では、情報処理装置１００は、ｉｎｆｏ←ｉｎｆｏのｎｅｘｔが示す次のｉｎｆｏとする（ステップＳ１７０９）。次に、情報処理装置１００は、ｉｎｆｏ＝＝ＮＵＬＬであるか否かを判定する（ステップＳ１７１０）。ここで、ｉｎｆｏ＝＝ＮＵＬＬではない場合（ステップＳ１７１０：Ｎｏ）、情報処理装置１００は、ステップＳ１７０２の処理に戻る。
【０１７４】
一方で、ｉｎｆｏ＝＝ＮＵＬＬである場合（ステップＳ１７１０：Ｙｅｓ）、情報処理装置１００は、関数化処理を終了する。
【０１７５】
（スタック使用判定処理手順の一例）
次に、図１８を用いて、スタック使用判定処理手順の一例について説明する。
【０１７６】
図１８は、スタック使用判定処理手順の一例を示すフローチャートである。図１８において、情報処理装置１００は、ｄｅｆ←ｉｎｆｏ−＞ｆｕｎｃ＿ｄｅｆとし、ｍａｘ＿ａｒｇ＿ｎｕｍ←レジスタ経由で受け渡し可能な引数の個数の最大値とし、ａｒｇ＿ｎｕｍ＿ｗｏ＿ｓｗｉｔｃｈ←ｄｅｆの引数の総数−１とする（ステップＳ１８０１）。
【０１７７】
次に、情報処理装置１００は、ａｒｇ＿ｎｕｍ＿ｗｏ＿ｓｗｉｔｃｈ＜＝ｍａｘ＿ａｒｇ＿ｎｕｍであるか否かを判定する（ステップＳ１８０２）。ここで、ａｒｇ＿ｎｕｍ＿ｗｏ＿ｓｗｉｔｃｈ＜＝ｍａｘ＿ａｒｇ＿ｎｕｍである場合（ステップＳ１８０２：Ｙｅｓ）、情報処理装置１００は、ステップＳ１８０５の処理に移行する。
【０１７８】
一方で、ａｒｇ＿ｎｕｍ＿ｗｏ＿ｓｗｉｔｃｈ＜＝ｍａｘ＿ａｒｇ＿ｎｕｍではない場合（ステップＳ１８０２：Ｎｏ）、情報処理装置１００は、図１９に後述するサブ判定処理を実行する。情報処理装置１００は、ｒｅｓ←判定結果（ｄｅｆ，ａｒｇ＿ｉｎｆｏ，ｍａｘ＿ａｒｇ＿ｎｕｍ）とする（ステップＳ１８０３）。
【０１７９】
次に、情報処理装置１００は、ｒｅｓ＝＝ｔｒｕｅであるか否かを判定する（ステップＳ１８０４）。ここで、ｒｅｓ＝＝ｔｒｕｅである場合（ステップＳ１８０４：Ｙｅｓ）、情報処理装置１００は、ｔｒｕｅを返り値とする（ステップＳ１８０５）。そして、情報処理装置１００は、スタック使用判定処理を終了する。
【０１８０】
一方で、ｒｅｓ＝＝ｔｒｕｅではない場合（ステップＳ１８０４：Ｎｏ）、情報処理装置１００は、ｆａｌｓｅを返り値とする（ステップＳ１８０６）。そして、情報処理装置１００は、スタック使用判定処理を終了する。
【０１８１】
（サブ判定処理手順の一例）
次に、図１９を用いて、サブ判定処理手順の一例について説明する。
【０１８２】
図１９は、サブ判定処理手順の一例を示すフローチャートである。図１９において、情報処理装置１００は、ｃｏｍ＿ａｒｇ＿ｎｕｍ←ａｒｇ＿ｉｎｆｏ−＞ｃｏｍ＿ａｒｇ＿ｎｕｍとする（ステップＳ１９０１）。
【０１８３】
次に、情報処理装置１００は、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ←ａｒｇ＿ｉｎｆｏ−＞ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅとする（ステップＳ１９０２）。そして、情報処理装置１００は、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ＝＝ＮＵＬＬであるか否かを判定する（ステップＳ１９０３）。ここで、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ＝＝ＮＵＬＬである場合（ステップＳ１９０３：Ｙｅｓ）、情報処理装置１００は、ステップＳ１９０８の処理に移行する。
【０１８４】
一方で、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ＝＝ＮＵＬＬではない場合（ステップＳ１９０３：Ｎｏ）、情報処理装置１００は、ｃａｓｅ＿ａｒｇ＿ｎｕｍ←ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ−＞ｃａｓｅ＿ａｒｇ＿ｎｕｍとし、ｎｅｅｄ＿ａｒｇ＿ｎｕｍ←ｃｏｍ＿ａｒｇ＿ｎｕｍ＋ｃａｓｅ＿ａｒｇ＿ｎｕｍとする（ステップＳ１９０４）。
【０１８５】
次に、情報処理装置１００は、ｎｅｅｄ＿ａｒｇ＿ｎｕｍ＞ｍａｘ＿ａｒｇ＿ｎｕｍであるか否かを判定する（ステップＳ１９０５）。ここで、ｎｅｅｄ＿ａｒｇ＿ｎｕｍ＞ｍａｘ＿ａｒｇ＿ｎｕｍである場合（ステップＳ１９０５：Ｙｅｓ）、情報処理装置１００は、ステップＳ１９０７の処理に移行する。
【０１８６】
一方で、ｎｅｅｄ＿ａｒｇ＿ｎｕｍ＞ｍａｘ＿ａｒｇ＿ｎｕｍではない場合（ステップＳ１９０５：Ｎｏ）、情報処理装置１００は、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ←ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ−＞ｎｅｘｔとする（ステップＳ１９０６）。そして、情報処理装置１００は、ステップＳ１９０３の処理に戻る。
【０１８７】
ステップＳ１９０７では、情報処理装置１００は、ｆａｌｓｅを返り値とする（ステップＳ１９０７）。そして、情報処理装置１００は、サブ判定処理を終了する。
【０１８８】
ステップＳ１９０８では、情報処理装置１００は、ｔｒｕｅを返り値とする（ステップＳ１９０８）。そして、情報処理装置１００は、サブ判定処理を終了する。
【０１８９】
（関数作成処理手順の一例）
次に、図２０を用いて、関数作成処理手順の一例について説明する。
【０１９０】
図２０は、関数作成処理手順の一例を示すフローチャートである。図２０において、情報処理装置１００は、ｄｅｆ←ｉｎｆｏ−＞ｆｕｎｃ＿ｄｅｆとし、ｃａｌｌｅｒ＿ｐｏｉｎｔ←ｄｅｆ−＞ｃａｌｌｅｒ＿ｐｏｉｎｔとし、ｎｅｗ＿ｆｕｎｃ＿ｌｉｓｔ←関数リストとする（ステップＳ２００１）。
【０１９１】
次に、情報処理装置１００は、ｃｏｍ＿ａｒｇ＿ｌｉｓｔ←ａｒｇ＿ｉｎｆｏ−＞ｃｏｍ＿ａｒｇ＿ｌｉｓｔとし、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ←ａｒｇ＿ｉｎｆｏ−＞ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅとする（ステップＳ２００２）。
【０１９２】
そして、情報処理装置１００は、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ＝＝ＮＵＬＬであるか否かを判定する（ステップＳ２００３）。ここで、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ＝＝ＮＵＬＬである場合（ステップＳ２００３：Ｙｅｓ）、情報処理装置１００は、ステップＳ２００７の処理に移行する。
【０１９３】
一方で、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ＝＝ＮＵＬＬではない場合（ステップＳ２００３：Ｎｏ）、情報処理装置１００は、ｃａｓｅ＿ａｒｇ＿ｌｉｓｔ←ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ−＞ｃａｓｅ＿ａｒｇ＿ｌｉｓｔとする（ステップＳ２００４）。
【０１９４】
次に、情報処理装置１００は、ｄｅｆ、ｃｏｍ＿ａｒｇ＿ｌｉｓｔ、ｃａｓｅ＿ａｒｇ＿ｌｉｓｔに基づいて関数化を実行し、関数化によって作成された関数情報をｎｅｗ＿ｆｕｎｃ＿ｌｉｓｔに追加する（ステップＳ２００５）。
【０１９５】
そして、情報処理装置１００は、ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ←ａｒｇ＿ｉｎｆｏ＿ｉｎ＿ｃａｓｅ−＞ｎｅｘｔとする（ステップＳ２００６）。その後、情報処理装置１００は、ステップＳ２００３の処理に戻る。
【０１９６】
ステップＳ２００７では、情報処理装置１００は、ｄｅｆ、ｃａｌｌｅｒ＿ｐｏｉｎｔ、ｎｅｗ＿ｆｕｎｃ＿ｌｉｓｔに基づいて、呼出元をｓｗｉｔｃｈ−ｃａｓｅ文に置き換える（ステップＳ２００７）。そして、情報処理装置１００は、関数作成処理を終了する。
【０１９７】
以上説明したように、情報処理装置１００によれば、プログラムコードにおいて分岐命令を含む関数を特定することができる。また、情報処理装置１００によれば、特定した関数に含まれる分岐命令のいずれかの分岐先で参照される引数の個数に基づいて、いずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定することができる。また、情報処理装置１００によれば、受け渡し可能であると判定した場合、分岐命令のそれぞれの分岐先を関数化した関数を用いて、特定した関数を変換し、受け渡し可能ではないと判定した場合、特定した関数を変換しないようにすることができる。これにより、情報処理装置１００は、ソフトウェアの実行性能の向上を図ることができる。
【０１９８】
情報処理装置１００によれば、プログラムコードにおいて分岐命令を含む関数を特定することができる。また、情報処理装置１００によれば、特定した関数に含まれる分岐命令のそれぞれの分岐先で参照される引数の個数に基づいて、それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定することができる。また、情報処理装置１００によれば、受け渡し可能であると判定した場合、それぞれの分岐先を関数化した関数を用いて、特定した関数を変換し、受け渡し可能ではないと判定した場合、特定した関数を変換しないようにすることができる。これにより、情報処理装置１００は、ソフトウェアの実行性能の向上を図ることができる。
【０１９９】
情報処理装置１００によれば、それぞれの分岐先で参照されず分岐命令の分岐判定で参照される引数が存在する関数を特定することができる。これにより、情報処理装置１００は、ソフトウェアの実行性能の向上に関わる関数を変換候補として、ソフトウェアの実行性能の向上を図ることができる。一方で、情報処理装置１００は、ソフトウェアの実行性能の向上への関わりが少ないと判断される関数を変換候補としてしまい、処理量を増大させてしまうことを防止することができる。
【０２００】
情報処理装置１００によれば、呼出元が同一翻訳単位内に存在する関数を特定することができる。これにより、情報処理装置１００は、変換することができない関数を、変換候補である関数としてしまい、処理量を増大させてしまうことを防止することができる。
【０２０１】
情報処理装置１００によれば、再帰呼び出しがされない関数を特定することができる。これにより、情報処理装置１００は、変換することができない関数を、変換候補である関数としてしまい、処理量を増大させてしまうことを防止することができる。
【０２０２】
情報処理装置１００によれば、利用者定義の関数を呼び出さない関数を特定することができる。これにより、情報処理装置１００は、変換することができない関数を、変換候補である関数としてしまい、処理量を増大させてしまうことを防止することができる。
【０２０３】
情報処理装置１００によれば、例外処理を有さない関数を特定することができる。これにより、情報処理装置１００は、変換することができない関数を、変換候補である関数としてしまい、処理量を増大させてしまうことを防止することができる。
【０２０４】
情報処理装置１００によれば、命令数が閾値以下の関数を特定することができる。これにより、情報処理装置１００は、命令数が閾値より大きい関数を変換してしまい、オブジェクトコードのサイズが一定以上増大してしまうことを防止することができる。また、情報処理装置１００は、変換するとオブジェクトコードのサイズを一定以上増大させてしまうと判断される関数を、変換候補である関数としてしまい、処理量を増大させてしまうことを防止することができる。
【０２０５】
情報処理装置１００によれば、少なくとも一部の引数をスタック経由で受け渡しされる関数を特定することができる。これにより、情報処理装置１００は、一部の引数をスタック経由で受け渡しされる関数を変換し、一部の引数をスタック経由からレジスタ経由にし、一部の引数へのアクセス時間の増大化を抑制し、ソフトウェアの実行性能の向上を図ることができる。また、情報処理装置１００は、引数をレジスタ経由で受け渡しされ、ソフトウェアの実行性能の向上への関わりが少ないと判断される関数を、変換候補である関数としてしまい、処理量を増大させてしまうことを防止することができる。
【０２０６】
情報処理装置１００によれば、プログラムコードに基づくオブジェクトコードのサイズから、特定した関数を変換した場合における、プログラムコードに基づくオブジェクトコードのサイズへの増加度合いを示す指標値を算出することができる。また、情報処理装置１００によれば、算出した指標値が閾値以上である場合、特定した関数を変換しないようにすることができる。これにより、情報処理装置１００は、オブジェクトコードのサイズの増大化を抑制することができる。
【０２０７】
情報処理装置１００によれば、プログラムコードにおいて分岐命令を含む、複数の関数を特定することができる。また、情報処理装置１００によれば、特定した複数の関数を、ループ処理内で呼び出される関数が先に、ループ処理内で呼び出されない関数が後になるように、順に選択することができる。また、情報処理装置１００によれば、選択の都度、プログラムコードに基づくオブジェクトコードのサイズから、選択した関数を変換した場合における、プログラムコードに基づくオブジェクトコードのサイズへの増加度合いを示す指標値を算出することができる。また、情報処理装置１００によれば、特定した複数の関数のうち、算出した指標値が閾値以上である関数を変換しないようにすることができる。これにより、情報処理装置１００は、ソフトウェアの実行性能の向上への関わりが大きい関数から順に、オブジェクトコードのサイズの増大化を抑制しながら、変換するか否かを決定し、ソフトウェアの実行性能の向上を効率よく図ることができる。
【０２０８】
情報処理装置１００によれば、特定した複数の関数を、引数に指定された定数の個数が大きい関数から順に選択することができる。これにより、情報処理装置１００は、ソフトウェアの実行性能の向上への関わりが大きい関数から順に、オブジェクトコードのサイズの増大化を抑制しながら、変換するか否かを決定し、ソフトウェアの実行性能の向上を効率よく図ることができる。
【０２０９】
情報処理装置１００によれば、特定した関数ごとに、当該関数に含まれる分岐命令のそれぞれの分岐先を関数化した関数を用いて、当該関数を変換した場合における、プログラムコードに基づくオブジェクトコードのサイズの増加量を算出することができる。また、情報処理装置１００によれば、特定した複数の関数を、算出した増加量が少ない関数から順に選択することができる。これにより、情報処理装置１００は、オブジェクトコードのサイズの増大化を抑制しやすい関数から順に変換するか否かを決定し、オブジェクトコードのサイズの増大化を効率よく抑制することができる。
【０２１０】
情報処理装置１００によれば、それぞれの分岐先を関数化した関数を用いて、特定した関数を変換した場合におけるプログラムコードに基づくオブジェクトコードのサイズが閾値以上である場合に、特定した関数を変換しないようにすることができる。これにより、情報処理装置１００は、オブジェクトコードのサイズの増大化を抑制することができる。
【０２１１】
なお、本実施の形態で説明したコンパイラ方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本実施の形態で説明したコンパイラプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本実施の形態で説明したコンパイラプログラムは、インターネット等のネットワークを介して配布してもよい。
【０２１２】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０２１３】
（付記１）プログラムコードにおいて分岐命令を含む関数を特定し、
特定した前記関数に含まれる前記分岐命令のいずれかの分岐先で参照される引数の個数に基づいて、前記いずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定し、
受け渡し可能であると判定した場合、前記分岐命令のそれぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換し、受け渡し可能ではないと判定した場合、特定した前記関数を変換しない、
制御部を有することを特徴とする情報処理装置。
【０２１４】
（付記２）前記制御部は、
特定した前記関数に含まれる前記分岐命令のそれぞれの分岐先で参照される引数の個数に基づいて、前記それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定し、
前記それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であると判定した場合、前記それぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換し、前記分岐命令のいずれかの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能ではないと判定した場合、特定した前記関数を変換しない、ことを特徴とする付記１に記載の情報処理装置。
【０２１５】
（付記３）特定した前記関数は、前記それぞれの分岐先で参照されず前記分岐命令の分岐判定で参照される引数が存在する関数である、ことを特徴とする付記１または２に記載の情報処理装置。
【０２１６】
（付記４）特定した前記関数は、呼出元が同一翻訳単位内に存在する関数である、ことを特徴とする付記１〜３のいずれか一つに記載の情報処理装置。
【０２１７】
（付記５）特定した前記関数は、再帰呼び出しがされない関数である、ことを特徴とする付記１〜４のいずれか一つに記載の情報処理装置。
【０２１８】
（付記６）特定した前記関数は、利用者定義の関数を呼び出さない関数である、ことを特徴とする付記１〜５のいずれか一つに記載の情報処理装置。
【０２１９】
（付記７）特定した前記関数は、例外処理を有さない関数である、ことを特徴とする付記１〜６のいずれか一つに記載の情報処理装置。
【０２２０】
（付記８）特定した前記関数は、命令数が閾値以下の関数である、ことを特徴とする付記１〜７のいずれか一つに記載の情報処理装置。
【０２２１】
（付記９）特定した前記関数は、少なくとも一部の引数をスタック経由で受け渡しされる関数である、ことを特徴とする付記１〜８のいずれか一つに記載の情報処理装置。
【０２２２】
（付記１０）前記制御部は、
前記プログラムコードに基づくオブジェクトコードのサイズから、前記それぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換した場合における、前記プログラムコードに基づくオブジェクトコードのサイズへの増加度合いを示す指標値を算出し、
算出した前記指標値が閾値以上である場合、特定した前記関数を変換しない、ことを特徴とする付記１〜９のいずれか一つに記載の情報処理装置。
【０２２３】
（付記１１）前記制御部は、
前記プログラムコードにおいて分岐命令を含む、複数の関数を特定し、
特定した前記複数の関数を、ループ処理内で呼び出される関数が先に、ループ処理内で呼び出されない関数が後になるように、順に選択し、
選択の都度、前記プログラムコードに基づくオブジェクトコードのサイズから、選択した前記関数に含まれる分岐命令のそれぞれの分岐先を関数化した関数を用いて、選択した前記関数を変換した場合における、前記プログラムコードに基づくオブジェクトコードのサイズへの増加度合いを示す指標値を算出し、
特定した前記複数の関数のうち、算出した前記指標値が閾値以上である関数を変換しない、ことを特徴とする付記１〜１０のいずれか一つに記載の情報処理装置。
【０２２４】
（付記１２）前記制御部は、
特定した前記複数の関数を、引数に指定された定数の個数が大きい関数から順に選択する、ことを特徴とする付記１１のいずれか一つに記載の情報処理装置。
【０２２５】
（付記１３）前記制御部は、
特定した前記関数ごとに、当該関数に含まれる分岐命令のそれぞれの分岐先を関数化した関数を用いて、当該関数を変換した場合における、前記プログラムコードに基づくオブジェクトコードのサイズの増加量を算出し、
特定した前記複数の関数を、算出した前記増加量が少ない関数から順に選択する、ことを特徴とする付記１１または１２に記載の情報処理装置。
【０２２６】
（付記１４）前記制御部は、
前記それぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換した場合における前記プログラムコードに基づくオブジェクトコードのサイズが閾値以上である場合に、特定した前記関数を変換しない、ことを特徴とする付記１〜１３のいずれか一つに記載の情報処理装置。
【０２２７】
（付記１５）コンピュータが、
プログラムコードにおいて分岐命令を含む関数を特定し、
特定した前記関数に含まれる前記分岐命令のそれぞれの分岐先で参照される引数の個数に基づいて、前記それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定し、
受け渡し可能であると判定した場合、前記それぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換する、
処理を実行することを特徴とするコンパイラ方法。
【０２２８】
（付記１６）コンピュータに、
プログラムコードにおいて分岐命令を含む関数を特定し、
特定した前記関数に含まれる前記分岐命令のそれぞれの分岐先で参照される引数の個数に基づいて、前記それぞれの分岐先を関数化した関数の引数をレジスタ経由で受け渡し可能であるか否かを判定し、
受け渡し可能であると判定した場合、前記それぞれの分岐先を関数化した関数を用いて、特定した前記関数を変換する、
処理を実行させることを特徴とするコンパイラプログラム。
【符号の説明】
【０２２９】
１００  情報処理装置
１０１  ソースコード
１０２〜１０４  中間コード
１０５  実行可能ファイル
２００  バス
２０１  ＣＰＵ
２０２  メモリ
２０３  ネットワークＩ／Ｆ
２０４  記録媒体Ｉ／Ｆ
２０５  記録媒体
２１０  ネットワーク
３００  記憶部
３０１  取得部
３０２  特定部
３０３  判定部
３０４  変換部
３０５  出力部
４００，８０１〜８０３  関数情報
５００，１０００  引数情報
６００，１０１０〜１０１２  ｃａｓｅ文情報
７００，１２００  プログラムコード
【図１】
2019003437.tif 000003
【図２】
2019003437.tif 000004
【図３】
2019003437.tif 000005
【図４】
2019003437.tif 000006
【図５】
2019003437.tif 000007
【図６】
2019003437.tif 000008
【図７】
2019003437.tif 000009
【図８】
2019003437.tif 000010
【図９】
2019003437.tif 000011
【図１０】
2019003437.tif 000012
【図１１】
2019003437.tif 000013
【図１２】
2019003437.tif 000014
【図１３】
2019003437.tif 000015
【図１４】
2019003437.tif 000016
【図１５】
2019003437.tif 000017
【図１６】
2019003437.tif 000018
【図１７】
2019003437.tif 000019
【図１８】
2019003437.tif 000020
【図１９】
2019003437.tif 000021
【図２０】
2019003437.tif 000022