(57)【要約】      （修正有）【課題】効率的な実行が可能なオブジェクトコードの生成を行う。【解決手段】第１ソースコードに含まれる関数のそれぞれが例外の送出を行う第１関数であるか否かを示す関数情報を記憶し、第２ソースコードに含まれる関数のそれぞれが第１ソースコードに含まれる関数を呼び出すか否かを判定し、第１ソースコードに含まれる関数を呼び出す関数が第２ソースコードに含まれると判定した場合、関数情報を記憶した記憶部を参照し、第２ソースコードに含まれる関数のうち、第１ソースコードに含まれる関数を呼び出すと判定された関数のそれぞれが、第１関数を呼び出す関数であるか否かを判定し、第２ソースコードに含まれる関数のうち、第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す第１関数から例外が送出された場合に実行される後続処理をオブジェクトコードに追加する。【選択図】図７
2019212100.tif 000002
【特許請求の範囲】
【請求項１】
第１ソースコードのコンパイルの実行に応じて、前記第１ソースコードに含まれる関数のそれぞれが例外の送出を行う第１関数であるか否かを示す関数情報を記憶する記憶部と、
前記第１ソースコードと異なる第２ソースコードのコンパイルの実行に応じて、前記第２ソースコードに含まれる関数のそれぞれが前記第１ソースコードに含まれる関数を呼び出すか否かを判定する第１判定部と、
前記第１ソースコードに含まれる関数を呼び出す関数が前記第２ソースコードに含まれると判定した場合、前記関数情報を記憶した記憶部を参照し、前記第２ソースコードに含まれる関数のうち、前記第１ソースコードに含まれる関数を呼び出すと判定された関数のそれぞれが、前記第１関数を呼び出す関数であるか否かを判定する第２判定部と、
前記第２ソースコードに含まれる関数のうち、前記第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す前記第１関数から例外が送出された場合に実行される後続処理を、前記第２ソースコードのコンパイルを実行することによって生成されるオブジェクトコードに追加するコード生成部と、を有する、
ことを特徴とする情報処理装置。
【請求項２】
請求項１において、
前記コード生成部は、前記第２ソースコードに含まれる関数のうち、前記第１関数を呼び出さないと判定された関数のそれぞれについては、前記後続処理の追加を行わない、
ことを特徴とする情報処理装置。
【請求項３】
請求項１において、
前記後続処理は、各関数が呼び出す前記第１関数から送出された例外を受け付ける処理である、
ことを特徴とする情報処理装置。
【請求項４】
請求項１において、
前記コード生成部は、前記第２ソースコードに含まれる関数であって前記第１関数を呼び出すと判定された関数のうち、前記後続処理を実行する旨の記述が前記第２ソースコードに含まれていない関数のそれぞれについて、前記後続処理の追加を行う、
ことを特徴とする情報処理装置。
【請求項５】
請求項１において、
前記第２判定部は、
前記第１ソースコードに含まれる関数を呼び出す関数が前記第２ソースコードに含まれると判定した場合、前記第２ソースコードに含まれると判定された関数によって呼び出される関数のそれぞれが前記第１関数であるか否かを示す情報が、前記第１ソースコードまたは前記第２ソースコードに含まれているか否かを判定し、
前記第２ソースコードに含まれる関数によって呼び出される関数のうち、前記第１関数であるか否かを示す情報が前記第１ソースコードまたは前記ソースコードに含まれていないと判定された関数のそれぞれが、前記第１関数を呼び出す関数であるか否かを判定する、
ことを特徴とする情報処理装置。
【請求項６】
第１ソースコードのコンパイルの実行に応じて、前記第１ソースコードに含まれる関数のそれぞれが例外の送出を行う第１関数であるか否かを示す関数情報を記憶部に記憶し、
前記第１ソースコードと異なる第２ソースコードのコンパイルの実行に応じて、前記第２ソースコードに含まれる関数のそれぞれが前記第１ソースコードに含まれる関数を呼び出すか否かを判定し、
前記第１ソースコードに含まれる関数を呼び出す関数が前記第２ソースコードに含まれると判定した場合、前記関数情報を記憶した記憶部を参照し、前記第２ソースコードに含まれる関数のうち、前記第１ソースコードに含まれる関数を呼び出すと判定された関数のそれぞれが、前記第１関数を呼び出す関数であるか否かを判定し、
前記第２ソースコードに含まれる関数のうち、前記第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す前記第１関数から例外が送出された場合に実行される後続処理を、前記第２ソースコードのコンパイルを実行することによって生成されるオブジェクトコードに追加する、
処理をコンピュータに実行させることを特徴とするコンパイラプログラム。
【請求項７】
第１ソースコードのコンパイルの実行に応じて、前記第１ソースコードに含まれる関数のそれぞれが例外の送出を行う第１関数であるか否かを示す関数情報を記憶部に記憶し、
前記第１ソースコードと異なる第２ソースコードのコンパイルの実行に応じて、前記第２ソースコードに含まれる関数のそれぞれが前記第１ソースコードに含まれる関数を呼び出すか否かを判定し、
前記第１ソースコードに含まれる関数を呼び出す関数が前記第２ソースコードに含まれると判定した場合、前記関数情報を記憶した記憶部を参照し、前記第２ソースコードに含まれる関数のうち、前記第１ソースコードに含まれる関数を呼び出すと判定された関数のそれぞれが、前記第１関数を呼び出す関数であるか否かを判定し、
前記第２ソースコードに含まれる関数のうち、前記第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す前記第１関数から例外が送出された場合に実行される後続処理を、前記第２ソースコードのコンパイルを実行することによって生成されるオブジェクトコードに追加する、
ことを特徴とするコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、コンパイラプログラム及びコンパイル方法に関する。
【背景技術】
【０００２】
例えば、Ｃ＋＋言語によって記述されたソースコードのコンパイルを行うコンパイラ（以下、コンパイラプログラムとも呼ぶ）は、指定されたソースコードを入力とすることによってオブジェクトコードの生成を行う。具体的に、コンパイラは、例えば、ソースコードに含まれる構文や意味の解析を行うことによって、指定されたソースコードから中間言語の生成を行う。そして、コンパイラは、例えば、生成された中間言語の最適化を行い、最適化された中間言語からオブジェクトコードの生成を行う。これにより、コンパイルは、オブジェクトコードの実行時間の短縮や実行時における使用リソースの削減等を図ることが可能になる（例えば、特許文献１及び２参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特表２００８−５０５４２３号公報
【特許文献２】特開２０００−１１２７７２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
上記のように生成される中間言語には、例えば、例外の送出を行う関数の呼び出しを行う関数が含まれている場合がある。そして、コンパイラは、この場合、例外の送出が行われた際に実行する必要がある後続処理を追加したオブジェクトコードの生成を行う。
【０００５】
しかしながら、ライブラリ等の他のオブジェクトコードに含まれる関数の呼び出しが行われる場合、コンパイラ等の外部プログラムは、呼び出し先の関数が例外の送出を行う関数であるか否かについての判定を行うことができない。そのため、コンパイラは、例えば、ライブラリ等の他のオブジェクトコードに含まれる関数の呼び出しを行う場合、これらの関数の全てが例外の送出を行うものであると仮定してオブジェクトコードの生成を行う。したがって、コンパイラは、効率的な実行が可能なオブジェクトコードの生成を行うことができない場合がある。
【０００６】
そこで、一つの側面では、本発明は、効率的な実行が可能なオブジェクトコードの生成を行うことを可能とする情報処理装置、コンパイラプログラム及びコンパイル方法を提供することを目的とする。
【課題を解決するための手段】
【０００７】
実施の形態の一態様では、情報処理装置は、第１ソースコードのコンパイルの実行に応じて、前記第１ソースコードに含まれる関数のそれぞれが例外の送出を行う第１関数であるか否かを示す関数情報を記憶する記憶部と、前記第１ソースコードと異なる第２ソースコードのコンパイルの実行に応じて、前記第２ソースコードに含まれる関数のそれぞれが前記第１ソースコードに含まれる関数を呼び出すか否かを判定する第１判定部と、前記第１ソースコードに含まれる関数を呼び出す関数が前記第２ソースコードに含まれると判定した場合、前記関数情報を記憶した記憶部を参照し、前記第２ソースコードに含まれる関数のうち、前記第１ソースコードに含まれる関数を呼び出すと判定された関数のそれぞれが、前記第１関数を呼び出す関数であるか否かを判定する第２判定部と、前記第２ソースコードに含まれる関数のうち、前記第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す前記第１関数から例外が送出された場合に実行される後続処理を、前記第２ソースコードのコンパイルを実行することによって生成されるオブジェクトコードに追加するコード生成部と、を有する。
【発明の効果】
【０００８】
一つの側面によれば、効率的な実行が可能なオブジェクトコードの生成を行う。
【図面の簡単な説明】
【０００９】
【図１】図１は、情報処理システム１０の構成を示す図である。
【図２】図２は、情報処理システム１０の構成を示す図である。
【図３】図３は、情報処理システム１０の構成を示す図である。
【図４】図４は、情報処理装置１のハードウエア構成を説明する図である。
【図５】図５は、情報処理装置１の機能のブロック図である。
【図６】図６は、第１の実施の形態におけるコンパイル処理の概略を説明するフローチャート図である。
【図７】図７は、第１の実施の形態におけるコンパイル処理の概略を説明するフローチャート図である。
【図８】図８は、第１の実施の形態におけるコンパイル処理の概略を説明する図である。
【図９】図９は、第１の実施の形態におけるコンパイル処理の概略を説明する図である。
【図１０】図１０は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１１】図１１は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１２】図１２は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１３】図１３は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１４】図１４は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１５】図１５は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１６】図１６は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１７】図１７は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１８】図１８は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１９】図１９は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図２０】図２０は、ソースコード１３１ａの具体例について説明する図である。
【図２１】図２１は、関数情報１３６の具体例について説明する図である。
【図２２】図２２は、ソースコード１３１ｂの具体例について説明する図である。
【図２３】図２３は、ソースコード１３１ａのヘッダの具体例について説明する図である。
【発明を実施するための形態】
【００１０】
［情報処理システムの構成］
図１から図３は、情報処理システム１０の構成を示す図である。図１から図３に示す情報処理システム１０は、情報処理装置１と、操作端末３とを有する。
【００１１】
情報処理装置１では、例えば、ＣＰＵ（図示しない）と各種プログラムとが有機的に協働することにより、コンパイラ１１と、ＬＴＯ（Ｌｉｎｋ  Ｔｉｍｅ  Ｏｐｔｉｍｉｚａｔｉｏｎ）１２と、リンカ１３とを含む各種機能を実現する。
【００１２】
コンパイラ１１は、例えば、情報格納領域１３０に記憶されたソースコード１３１からオブジェクトコード１３３を生成する。コンパイラ１１は、例えば、ソースコード１３１に含まれる構文や字句の意味を解析することによってソースコード１３１から中間言語１３２を生成する解析部１１ａと、解析部１１ａが生成した中間言語１３２の最適化を行う最適化部１１ｂと、最適化部１１ｂが最適化を行った中間言語１３２からオブジェクトコード１３３を生成するコード生成部１１ｃとを有する。
【００１３】
具体的に、解析部１１ａは、例えば、図１に示すように、ライブラリのソースコード１３１（以下、ソースコード１３１ａとも呼ぶ）からライブラリの中間言語１３２（以下、中間言語１３２ａとも呼ぶ）を生成する。そして、コード生成部１１ｃは、最適化部１１ｂが最適化を行った中間言語１３２ａからライブラリのオブジェクトコード１３３（以下、オブジェクトコード１３３ａとも呼ぶ）を生成して情報格納領域１３０に記憶する。
【００１４】
また、解析部１１ａは、例えば、図２に示すように、アプリケーションのソースコード１３１（以下、ソースコード１３１ｂとも呼ぶ）からアプリケーションの中間言語１３２（以下、中間言語１３２ｂ）を生成する。そして、コード生成部１１ｃは、最適化部１１ｂが最適化を行った中間言語１３２ｂからアプリケーションのオブジェクトコード１３３（以下、オブジェクトコード１３３ｂとも呼ぶ）を生成して情報格納領域１３０に記憶する。なお、コード生成部１１ｃは、後述するようにＬＴＯ１２を動作させる場合、最適化部１１ｂが最適化を行った中間言語１３２ｂをオブジェクトコード１３３ｂに埋め込む。
【００１５】
ＬＴＯ１２は、例えば、コンパイラ１１が生成したオブジェクトコード１３３ｂが複数存在しており、複数のオブジェクトコード１３３ｂ間において関数の呼び出しが行われる場合、図２に示すように、関数の呼び出しが行われる複数のオブジェクトコード１３３ｂをより最適化したオブジェクトコード１３４（以下、最適化後コード１３４とも呼ぶ）を生成する。
【００１６】
具体的に、ＬＴＯ１２は、この場合、各オブジェクトコード１３３ｂに埋め込まれた中間言語１３２ｂをそれぞれ取得し、取得した中間言語１３２ｂをマージする。そして、ＬＴＯ１２は、マージした中間言語１３２ｂ（１つの中間言語１３２ｂ）からオブジェクトコード１３３ｂを再度生成する旨の指示をコンパイラ１１に行うことによって、最適化後コード１３４を生成する。
【００１７】
リンカ１３は、例えば、図３に示すように、ソースコード１３１ａから生成されたオブジェクトコード１３３ａと、ソースコード１３１ｂから生成されたオブジェクトコード１３３ｂ（最適化後コード１３４）とをリンクさせることにより、実行ファイル１３５を生成する。
【００１８】
ここで、ソースコード１３１ｂから生成される中間言語１３２ｂには、例えば、例外の送出を行う関数の呼び出しを行う関数が含まれている場合がある。そして、コンパイラ１１は、この場合、例外の送出が行われた際に実行する必要がある後続処理を追加したオブジェクトコード１３３ｂの生成を行う。
【００１９】
しかしながら、他のオブジェクトコード１３３（例えば、オブジェクトコード１３３ａ）に含まれる関数の呼び出しが行われる場合、コンパイラ１１やＬＴＯ１２等の外部プログラムは、呼び出し先の関数が例外の送出を行う関数であるか否かについての判定を行うことができない。そのため、コンパイラ１１は、例えば、他のオブジェクトコード１３３に含まれる関数の呼び出しを行う場合、これらの関数の全てが例外の送出を行うものであると仮定してオブジェクトコード１３３ｂの生成を行う。したがって、コンパイラ１１は、効率的な実行が可能なオブジェクトコード１３３ｂの生成を行うことができない場合がある。
【００２０】
そこで、本実施の形態におけるコンパイラ１１は、ソースコード１３１ａ（以下、第１ソースコード１３１ａとも呼ぶ）のコンパイルの実行に応じて、ソースコード１３１ａに含まれる関数のそれぞれが例外の送出を行う関数（以下、第１関数とも呼ぶ）であるか否かを示す関数情報を情報格納領域１３０に記憶する。
【００２１】
そして、ＬＴＯ１２は、ソースコード１３１ａと異なるソースコード１３１ｂ（以下、第２ソースコード１３１ｂとも呼ぶ）のコンパイルの実行に応じて、ソースコード１３１ｂに含まれる関数のそれぞれがソースコード１３１ａに含まれる関数を呼び出すか否かを判定する。その結果、ソースコード１３１ａに含まれる関数を呼び出す関数がソースコード１３１ｂに含まれると判定した場合、関数情報を記憶した情報格納領域１３０を参照し、ソースコード１３１ｂに含まれる関数のうち、ソースコード１３１ａに含まれる関数を呼び出すと判定された関数のそれぞれが、第１関数を呼び出す関数であるか否かを判定する。
【００２２】
その後、コンパイラ１１は、ソースコード１３１ｂに含まれる関数のうち、第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す第１関数から例外が送出された場合に実行される後続処理をオブジェクトコード１３３ｂに追加する。
【００２３】
すなわち、コンパイラ１１は、ソースコード１３１ａのコンパイル時においては、ソースコード１３１ａに含まれる関数のそれぞれが例外を送出するか否か（第１関数であるか否か）を判定することが可能である。そのため、コンパイラ１１は、ソースコード１３１ａのコンパイル時において関数情報の生成を行う。
【００２４】
これにより、コンパイラ１１は、ソースコード１３１ｂのコンパイル時に関数情報を参照することが可能になり、ソースコード１３１ａに含まれる関数が例外を送出するか否かを判定することが可能になる。そのため、コンパイラ１１は、ソースコード１３１ｂのコンパイル時における後続処理の追加頻度を抑制することが可能になる。したがって、コンパイラ１１は、ソースコード１３１ｂのコンパイルに要する時間及びオブジェクトコード１３３の実行に要する時間の短縮や、オブジェクトコード１３３による使用リソースの削減等を図ることが可能になる。
【００２５】
［情報処理システムのハードウエア構成］
次に、情報処理システム１０のハードウエア構成について説明する。図４は、情報処理装置１のハードウエア構成を説明する図である。
【００２６】
情報処理装置１は、プロセッサであるＣＰＵ１０１と、メモリ１０２と、外部インターフェース（Ｉ／Ｏユニット）１０３と、記憶媒体１０４とを有する。各部は、バス１０５を介して互いに接続される。
【００２７】
記憶媒体１０４は、例えば、ソースコード１３１のコンパイルを行う処理（以下、コンパイル処理とも呼ぶ）を行うためのプログラム１１０を記憶するプログラム格納領域（図示しない）を有する。また、記憶媒体１０４は、例えば、コンパイル処理を行う際に用いられる情報を記憶する情報格納領域１３０（以下、記憶部１３０とも呼ぶ）を有する。なお、記憶媒体１０４は、例えば、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）であってよい。
【００２８】
ＣＰＵ１０１は、記憶媒体１０４からメモリ１０２にロードされたプログラム１１０を実行してコンパイル処理を行う。
【００２９】
また、外部インターフェース１０３は、例えば、操作端末３と通信を行う。
【００３０】
［情報処理システムの機能］
次に、情報処理システム１０の機能について説明を行う。図５は、情報処理装置１の機能のブロック図である。
【００３１】
情報処理装置１は、図５に示すように、ＣＰＵ１０１やメモリ１０２等のハードウエアとプログラム１１０とが有機的に協働することにより、コンパイラ１１の最適化部１１ｂの機能として情報生成部１１１を実現し、コンパイラ１１のコード生成部１１ｃの機能として情報追加部１１２を実現する。
【００３２】
また、情報処理装置１は、図５に示すように、ＣＰＵ１０１やメモリ１０２等のハードウエアとプログラム１１０とが有機的に協働することにより、ＬＴＯ１２の機能として、第１判定部１１３と、第２判定部１１４と、処理追加部１１５と、コンパイル指示部１１６とを実現する。
【００３３】
さらに、情報処理装置１は、図５に示すように、ソースコード１３１と、中間言語１３２と、オブジェクトコード１３３と、最適化後コード１３４と、実行ファイル１３５と、関数情報１３６とを情報格納領域１３０に記憶する。なお、以下、ソースコード１３１には、図１等で説明したソースコード１３１ａ及びソースコード１３１ｂが含まれ、中間言語１３２には、図１等で説明した中間言語１３２ａ及び中間言語１３２ｂが含まれ、オブジェクトコード１３３には、図１等で説明したオブジェクトコード１３３ａ及びオブジェクトコード１３３ｂが含まれるものとして説明を行う。
【００３４】
最適化部１１ｂの情報生成部１１１は、例えば、解析部１１ａが生成した中間言語１３２ａの最適化が行われる際に、ソースコード１３１ａ（中間言語１３２ａ）に含まれる関数のそれぞれが例外の送出を行う第１関数であるか否かを示す関数情報１３６の生成を行う。そして、情報生成部１１１は、生成した関数情報１３６を情報格納領域１３０に記憶する。関数情報１３６の具体例については後述する。
【００３５】
コード生成部１１ｃの情報追加部１１２は、例えば、最適化部１１ｂによって最適化された中間言語１３２ｂからオブジェクトコード１３３ｂの生成を行う際に、情報格納領域１３０に記憶された関数情報１３６と、最適化部１１ｂによって最適化された中間言語１３２ｂとを、オブジェクトコード１３３ｂに埋め込む。
【００３６】
ＬＴＯ１２の第１判定部１１３は、ソースコード１３１ｂのコンパイルの実行に応じて、ソースコード１３１ｂに含まれる関数のそれぞれが、ソースコード１３１ａに含まれる関数を呼び出すか否かを判定する。
【００３７】
ＬＴＯ１２の第２判定部１１４は、ソースコード１３１ａに含まれる関数を呼び出す関数がソースコード１３１ｂに含まれると第１判定部１１３が判定した場合、情報格納領域１３０に記憶された関数情報１３６を参照し、ソースコード１３１ｂに含まれる関数のうち、ソースコード１３１ａに含まれる関数を呼び出すと判定された関数のそれぞれが、第１関数を呼び出す関数であるか否かを判定する。
【００３８】
なお、第２判定部１１４は、この場合、情報追加部１１２によってオブジェクトコード１３３ａに埋め込まれた関数情報１３６を参照することによって、第１関数を呼び出す関数であるか否かの判定を行うものであってもよい。
【００３９】
ＬＴＯ１２の処理追加部１１５は、ソースコード１３１ｂに含まれる関数のうち、第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す第１関数から例外が送出された場合に実行される後続処理が追加されるように、中間言語１３２を更新する。具体的に、処理追加部１１５は、コード生成部１１ｃが生成したオブジェクトコード１３３ｂに埋め込まれている中間言語１３２ｂを取得し、取得した中間言語１３２ｂについて更新を行う。
【００４０】
ＬＴＯ１２のコンパイル指示部１１６は、処理追加部１１５等によって中間言語１３２ｂの更新が行われた場合、更新された中間言語１３２ｂのコンパイルをコンパイラ１１に指示する。
【００４１】
［第１の実施の形態の概略］
次に、第１の実施の形態の概略について説明する。図６及び図７は、第１の実施の形態におけるコンパイル処理の概略を説明するフローチャート図である。また、図８及び図９は、第１の実施の形態におけるコンパイル処理の概略を説明する図である。
【００４２】
コンパイラ１１は、図６に示すように、ソースコード１３１ａのコンパイルの開始タイミングになるまで待機する（Ｓ１のＮＯ）。具体的に、コンパイラ１１は、例えば、コンパイルを行う担当者（以下、単に担当者とも呼ぶ）が操作端末３を介してソースコード１３１ａのコンパイルを行う旨の指示を入力するまで待機する。
【００４３】
そして、ソースコード１３１ａのコンパイルの開始タイミングになった場合（Ｓ１のＹＥＳ）、コンパイラ１１は、図８に示すように、ソースコード１３１ａに含まれる関数のそれぞれが例外の送出を行う第１関数であるか否かを示す関数情報１３６を生成する（Ｓ２）。さらに、コンパイラ１１は、Ｓ２の処理で生成した関数情報１３６を情報格納領域１３０に記憶する（Ｓ３）。
【００４４】
その後、ＬＴＯ１２は、図７に示すように、コンパイラ１１によってソースコード１３１ｂのコンパイルが完了するまで待機する（Ｓ１１のＮＯ）。
【００４５】
そして、ソースコード１３１ｂのコンパイルが完了した場合（Ｓ１１のＹＥＳ）、ＬＴＯ１２は、ソースコード１３１ｂに含まれる関数のそれぞれが、ソースコード１３１ａに含まれる関数を呼び出すか否かを判定する（Ｓ１２）。
【００４６】
その結果、ソースコード１３１ａに含まれる関数を呼び出す関数がソースコード１３１ｂに含まれると判定した場合（Ｓ１３のＹＥＳ）、ＬＴＯ１２は、関数情報１３６を記憶した情報格納領域１３０を参照し、ソースコード１３１ｂに含まれる関数のうち、Ｓ１２の処理でソースコード１３１ａに含まれる関数を呼び出すと判定された関数のそれぞれが、第１関数を呼び出す関数であるか否かを判定する（Ｓ１４）。
【００４７】
そして、ＬＴＯ１２は、図９に示すように、ソースコード１３１ｂに含まれる関数のうち、Ｓ１４の処理で第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す第１関数から例外が送出された場合に実行される後続処理を、ソースコード１３１ｂのコンパイルを実行することによって生成されるオブジェクトコード１３３ｂに追加する（Ｓ１５）。
【００４８】
具体的に、ＬＴＯ１２は、この場合、ソースコード１３１ｂに含まれる関数のうち、Ｓ１４の処理で第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す第１関数から例外が送出された場合に実行される後続処理が追加されるように、ソースコード１３１ｂから生成された中間言語１３２ｂを更新する。そして、ＬＴＯ１２は、更新した中間言語１３２ｂからオブジェクトコード１３３ｂを生成する旨の指示をコンパイラ１１に対して行う。
【００４９】
一方、ソースコード１３１ａに含まれる関数を呼び出す関数がソースコード１３１ｂに含まれると判定した場合（Ｓ１３のＮＯ）、ＬＴＯ１２は、Ｓ１４及びＳ１５の処理を行わない。
【００５０】
すなわち、コンパイラ１１は、ソースコード１３１ａのコンパイル時においては、ソースコード１３１ａに含まれる関数のそれぞれが例外を送出するか否か（第１関数であるか否か）を判定することが可能である。そのため、コンパイラ１１は、ソースコード１３１ａのコンパイル時において関数情報１３６の生成を行う。
【００５１】
これにより、コンパイラ１１は、ソースコード１３１ｂのコンパイル時に関数情報１３６を参照することが可能になり、ソースコード１３１ａに含まれる関数が例外を送出するか否かを判定することが可能になる。そのため、コンパイラ１１は、ソースコード１３１ｂのコンパイル時における後続処理の追加頻度を抑制することが可能になる。したがって、コンパイラ１１は、ソースコード１３１ｂのコンパイルに要する時間及びオブジェクトコード１３３の実行に要する時間の短縮や、オブジェクトコード１３３による使用リソースの削減等を図ることが可能になる。
【００５２】
［第１の実施の形態の詳細］
次に、第１の実施の形態の詳細について説明する。図１０から図１９は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。また、図２０から図２３は、第１の実施の形態におけるコンパイル処理の詳細を説明する図である。
【００５３】
［ライブラリのソースコードについてのコンパイル処理］
初めに、ライブラリのソースコード１３１（ソースコード１３１ａ）についてのコンパイル処理の具体例について説明を行う。
【００５４】
コンパイラ１１の解析部１１ａは、図１０に示すように、ソースコード１３１ａのコンパイルを行う旨の指示を受け付けるまで待機する（Ｓ２１のＮＯ）。具体的に、解析部１１ａは、例えば、担当者が操作端末３を介してソースコード１３１ａのコンパイルを行う旨の指示を入力するまで待機する。以下、ソースコード１３１ａの具体例について説明を行う。
【００５５】
［ライブラリのソースコードの具体例］
図２０は、ソースコード１３１ａの具体例について説明する図である。
【００５６】
図２０に示すソースコード１３１ａには、関数名がｌｉｂ＿ｆｕｎｃ１、ｌｉｂ＿ｆｕｎｃ２及びｌｉｂ＿ｆｕｎｃ３である関数（以下、それぞれ単にｌｉｂ＿ｆｕｎｃ１、ｌｉｂ＿ｆｕｎｃ２及びｌｉｂ＿ｆｕｎｃ３とも呼ぶ）がそれぞれ含まれている。そして、図２０に示す例において、ｌｉｂ＿ｆｕｎｃ３には、例外を送出する式である「ｔｈｒｏｗ  １；」が含まれている。
【００５７】
図１１に戻り、ソースコード１３１ａのコンパイルを行う旨の指示を受け付けた場合（Ｓ２１のＹＥＳ）、解析部１１ａは、Ｓ２１の処理で指示を受け付けたソースコード１３１ａの構文解析及び意味解析を行うことによって中間言語１３２ａを生成する（Ｓ２２）。
【００５８】
一方、コンパイラ１１の最適化部１１ｂは、図１１に示すように、解析部１１ａによる中間言語１３２ａの生成が完了するまで待機する（Ｓ３１のＮＯ）。
【００５９】
そして、中間言語１３２ａの生成が完了した場合（Ｓ３１のＹＥＳ）、最適化部１１ｂの情報生成部１１１は、Ｓ３１の処理で生成が完了した中間言語１３２ａに含まれる関数のうちの１つを特定する（Ｓ３２）。
【００６０】
続いて、情報生成部１１１は、Ｓ３２の処理で特定した関数の本体に、例外の送出を行う記述が含まれているか否かを判定する（Ｓ３３）。具体的に、例外の送出を行う記述は、ソースコード１３１ａがＣ＋＋によって記述されている場合、例えば、ｔｈｒｏｗ式、ｄｙｎａｍｉｃ＿ｃａｓｔ演算式、ｔｙｐｅｉｄ演算式、または、ｎｅｗ式である。
【００６１】
その結果、例外の送出を行う記述が含まれていないと判定した場合（Ｓ３４のＮＯ）、情報生成部１１１は、Ｓ３２の処理で特定した関数が例外の送出を行わない関数であることを示す情報を、情報格納領域１３０に記憶された関数情報１３６に追加する（Ｓ３５）。
【００６２】
一方、例外の送出を行う記述が含まれていると判定した場合（Ｓ３４のＹＥＳ）、情報生成部１１１は、Ｓ３５の処理を行わない。
【００６３】
具体的に、図２０で説明したソースコード１３１ａに含まれるｌｉｂ＿ｆｕｎｃ３には、例外の送出を行う記述である「ｔｈｒｏｗ  １；」が含まれている。そのため、Ｓ３２の処理で特定した関数がｌｉｂ＿ｆｕｎｃ３である場合、情報生成部１１１は、ｌｉｂ＿ｆｕｎｃ３を示す情報を関数情報１３６に追加しない。一方、図２０で説明したソースコード１３１ａに含まれるｌｉｂ＿ｆｕｎｃ１及びｌｉｂ＿ｆｕｎｃ２に例外の送出を行う記述が含まれていない場合において、Ｓ３２の処理で特定した関数がｌｉｂ＿ｆｕｎｃ１またはｌｉｂ＿ｆｕｎｃ２である場合、情報生成部１１１は、ｌｉｂ＿ｆｕｎｃ１またはｌｉｂ＿ｆｕｎｃ２を示す情報を関数情報１３６に追加する。以下、Ｓ３２の処理においてソースコード１３１ａに含まれる全ての関数が特定された後の関数情報１３６の具体例について説明を行う。
【００６４】
［関数情報の具体例］
図２１は、関数情報１３６の具体例について説明する図である。
【００６５】
図２１に示す関数情報１３６には、関数情報１３６に含まれる各情報を識別する「項番」と、各関数を識別する関数名が設定される「関数名」とを項目として有している。
【００６６】
具体的に、図２１に示す関数情報１３６において、「項番」が「１」である情報の「関数名」には、「ｌｉｂ＿ｆｕｎｃ１」が設定されている。また、図２１に示す関数情報１３６において、「項番」が「２」である情報の「関数名」には、「ｌｉｂ＿ｆｕｎｃ２」が設定されている。
【００６７】
図１１に戻り、情報生成部１１１は、Ｓ３２の処理において全ての関数を特定しているか否かを判定する（Ｓ３６）。
【００６８】
その結果、全ての関数を特定していないと判定した場合（Ｓ３６のＮＯ）、情報生成部１１１は、Ｓ３２以降の処理を行う。
【００６９】
一方、全ての関数を特定していると判定した場合（Ｓ３６のＹＥＳ）、最適化部１１ｂは、Ｓ３１の処理で生成が完了した中間言語１３２ａについての最適化のうち、残りの処理を実行する（Ｓ３７）。そして、最適化部１１ｂは、Ｓ３１の処理で生成が完了した中間言語１３２ａについての最適化を終了する。
【００７０】
また、コンパイラ１１のコード生成部１１ｃは、図１２に示すように、最適化部１１ｂによる中間言語１３２ａの最適化が完了するまで待機する（Ｓ４１のＮＯ）。
【００７１】
そして、中間言語１３２ａの最適化が完了した場合（Ｓ４１のＹＥＳ）、コード生成部１１ｃの情報追加部１１２は、情報格納領域１３０に記憶された関数情報１３６と、Ｓ４１の処理で最適化が完了した中間言語１３２ａとが埋め込まれるように、Ｓ４１の処理で最適化が完了した中間言語１３２ａからオブジェクトコード１３３ａを生成する（Ｓ４２）。
【００７２】
［アプリケーションのソースコードについてのコンパイル処理］
次に、アプリケーションのソースコード１３１（ソースコード１３１ｂ）についてのコンパイル処理の具体例について説明を行う。
【００７３】
解析部１１ａは、図１３に示すように、ソースコード１３１ｂのコンパイルを行う旨の指示を受け付けるまで待機する（Ｓ２１のＮＯ）。具体的に、解析部１１ａは、例えば、担当者が操作端末３を介してソースコード１３１ｂのコンパイルを行う旨の指示を入力するまで待機する。以下、ソースコード１３１ｂの具体例について説明を行う。
【００７４】
［アプリケーションのソースコードの具体例］
図２２は、ソースコード１３１ｂの具体例について説明する図である。
【００７５】
図２２に示すソースコード１３１ｂの本体には、ソースコード１３１ａに含まれる関数であるｌｉｂ＿ｆｕｎｃ１を呼び出す関数であるｆｕｎｃ１と、ｆｕｎｃ１を呼び出す関数であるｆｕｎｃ２と、ｆｕｎｃ２を呼び出す関数であるｆｕｎｃ３とが含まれている。
【００７６】
図１３に戻り、ソースコード１３１ａのコンパイルを行う旨の指示を受け付けた場合（Ｓ５１のＹＥＳ）、解析部１１ａは、Ｓ５１の処理で指示を受け付けたソースコード１３１ａの構文解析及び意味解析を行うことによって中間言語１３２ｂを生成する（Ｓ５２）。
【００７７】
一方、最適化部１１ｂは、図１４に示すように、解析部１１ａによる中間言語１３２ｂの生成が完了するまで待機する（Ｓ６１のＮＯ）。
【００７８】
そして、中間言語１３２ｂの生成が完了した場合（Ｓ６１のＹＥＳ）、最適化部１１ｂは、Ｓ６１の処理で生成が完了した中間言語１３２ｂについての最適化を行う（Ｓ６２）。
【００７９】
なお、最適化部１１ｂは、中間言語１３２ａ以外の中間言語１３２（例えば、中間言語１３２ｂ）を最適化する場合においても、図１１で説明したように、関数情報１３６の生成を行うものであってもよい。
【００８０】
また、コード生成部１１ｃは、図１５に示すように、最適化部１１ｂによる中間言語１３２ｂの最適化が完了するまで待機する（Ｓ７１のＮＯ）。
【００８１】
そして、中間言語１３２ｂの最適化が完了した場合（Ｓ７１のＹＥＳ）、情報追加部１１２は、情報格納領域１３０に記憶された関数情報１３６と、Ｓ７１の処理で最適化が完了した中間言語１３２ｂとが埋め込まれるように、Ｓ７１の処理で最適化が完了した中間言語１３２ｂからオブジェクトコード１３３ｂを生成する（Ｓ７２）。
【００８２】
さらに、ＬＴＯ１２は、図１６に示すように、コード生成部１１ｃによってオブジェクトコード１３３ｂの生成が完了するまで待機する（Ｓ８１のＮＯ）。
【００８３】
そして、オブジェクトコード１３３ｂの生成が完了した場合（Ｓ８１のＹＥＳ）、ＬＴＯ１２の第１判定部１１３は、Ｓ８１の処理で生成が完了したオブジェクトコード１３３ｂに埋め込まれている中間言語１３２ｂに含まれる関数のうちの１つを特定する（Ｓ８２）。
【００８４】
具体的に、第１判定部１１３は、例えば、図２２で説明したソースコード１３１ｂに含まれる関数であるｆｕｎｃ１に対応する中間言語を特定する。
【００８５】
続いて、第１判定部１１３は、Ｓ８２の処理で特定した関数の関数定義に、Ｓ８２の処理で特定した関数が例外を送出しないことを示す情報が含まれているか否かを判定する（Ｓ８３）。
【００８６】
具体的に、図２２で説明したソースコード１３１ｂにおけるｆｕｎｃ１の関数定義には、ｆｕｎｃ１が例外を送出しないことを示す情報についての記述が含まれていない。そのため、第１判定部１１３は、Ｓ８２の処理においてｆｕｎｃ１に対応する中間言語を特定している場合、ｆｕｎｃ１の関数定義に、ｆｕｎｃ１が例外を送出しないことを示す情報が含まれていないと判定する。なお、例外を送出しないことを示す情報についての記述は、ソースコード１３１ｂがＣ＋＋によって記述されている場合、例えば、ｎｏｅｘｃｅｐｔ指定子である。
【００８７】
そして、Ｓ８２の処理で特定した関数の関数定義に、Ｓ８２の処理で特定した関数が例外を送出しないことを示す情報が含まれていないと判定した場合（Ｓ８４のＮＯ）、第１判定部１１３は、Ｓ８２の処理で特定した関数の本体に、Ｓ８２の処理で特定した関数が例外の送出を行う記述が含まれているか否かを判定する（Ｓ８５）。
【００８８】
具体的に、図２２で説明したソースコード１３１ｂにおけるｆｕｎｃ１の本体には、ｆｕｎｃ１が例外の送出を行う記述（例えば、ｔｈｒｏｗ式）が含まれていない。そのため、第１判定部１１３は、Ｓ８２の処理においてｆｕｎｃ１に対応する中間言語を特定している場合、ｆｕｎｃ１の本体に、ｆｕｎｃ１が例外の送出を行う記述が含まれていないと判定する。
【００８９】
さらに、Ｓ８２の処理で特定した関数の本体に、Ｓ８２の処理で特定した関数が例外の送出を行う記述が含まれていないと判定した場合（Ｓ８６のＮＯ）、第１判定部１１３は、図１７に示すように、Ｓ８２の処理で特定した関数が他の関数を呼び出す関数であるか否かを判定する（Ｓ９１）。
【００９０】
具体的に、図２２で説明したソースコード１３１ｂに含まれる関数であるｆｕｎｃ１は、ソースコード１３１ａに含まれる関数であるｌｉｂ＿ｆｕｎｃ１の呼び出しを行う。そのため、第１判定部１１３は、Ｓ８２の処理においてｆｕｎｃ１に対応する中間言語を特定している場合、Ｓ８２の処理で特定した関数が他の関数を呼び出すものであると判定する。
【００９１】
その結果、Ｓ８２の処理で特定した関数が他の関数を呼び出すと判定した場合（Ｓ９２のＹＥＳ）、ＬＴＯ１２の第２判定部１１４は、Ｓ８２の処理で特定した関数が呼び出す他の関数のヘッダに、Ｓ８２の処理で特定した関数によって呼び出される他の関数が例外の送出を行わない関数であることを示す情報が含まれているか否かを判定する（Ｓ９３）。以下、ソースコード１３１ａのヘッダの具体例について説明を行う。
【００９２】
［ライブラリのソースコードのヘッダの具体例］
図２３は、ソースコード１３１ａのヘッダの具体例について説明する図である。
【００９３】
図２３に示すソースコード１３１ａのヘッダには、ｌｉｂ＿ｆｕｎｃ１、ｌｉｂ＿ｆｕｎｃ２及びｌｉｂ＿ｆｕｎｃ３についての情報が含まれているが、ｌｉｂ＿ｆｕｎｃ１、ｌｉｂ＿ｆｕｎｃ２及びｌｉｂ＿ｆｕｎｃ３のそれぞれが例外の送出を行わない関数であることを示す情報については含まれていない。
【００９４】
そのため、第２判定部１１４は、Ｓ８２の処理においてｆｕｎｃ１に対応する中間言語を特定している場合、Ｓ８２の処理で特定した関数が呼び出す他の関数のヘッダに、Ｓ８２の処理で特定した関数によって呼び出される他の関数が例外の送出を行わない関数であることを示す情報が含まれていないと判定する。
【００９５】
そして、Ｓ８２の処理で特定した関数によって呼び出される他の関数が例外の送出を行わない関数であることを示す情報が含まれていないと判定した場合（Ｓ９４のＮＯ）、第２判定部１１４は、Ｓ８１の処理で生成が完了したオブジェクトコード１３３ｂに埋め込まれた関数情報１３６に、Ｓ８２の処理で特定した関数によって呼び出される他の関数が例外の送出を行わないことを示す情報が含まれているか否かを判定する（Ｓ９５）。
【００９６】
すなわち、Ｓ８２の処理で特定した関数の関数定義または本体に、Ｓ８２の処理で特定した関数が例外を送出しないことを示す情報が含まれていないと判定され、Ｓ８２の処理で特定した関数が他の関数を呼び出すと判定され、さらに、Ｓ８２の処理で特定した関数が呼び出す他の関数のヘッダに、Ｓ８２の処理で特定した関数によって呼び出される他の関数が例外を送出する関数であることを示す情報が含まれていないと判定された場合、第２判定部１１４は、各ソースコード１３１（例えば、ソースコード１３１ａ及びソースコード１３１ｂ）や中間言語１３２（例えば、中間言語１３２ａ及び中間言語１３２ｂ）を確認することによって、Ｓ８２の処理で特定した関数が例外の送出を行う関数であるか否かの判定を行うことができないと判定する。そのため、第２判定部１１４は、この場合、関数情報１３６を参照することにより、Ｓ８２の処理で特定した関数が例外の送出を行う関数であるか否かの判定を行う。
【００９７】
その結果、図１８に示すように、Ｓ８２の処理で特定した関数によって呼び出される他の関数が例外の送出を行わないことを示す情報が関数情報１３６に含まれていると判定した場合（Ｓ１０１のＹＥＳ）、ＬＴＯ１２の処理追加部１１５は、Ｓ８２の処理で特定した関数の関数定義に、Ｓ８２の処理で特定した関数が例外を送出しないことを示す情報が追加されるように、Ｓ８２の処理で特定した関数の中間言語１３２ｂを更新する（Ｓ１０２）。
【００９８】
具体的に、図２１で説明した関数情報１３６には、ｌｉｂ＿ｆｕｎｃ１が例外を送出しない関数であることを示す情報が含まれている。そのため、処理追加部１１５は、例えば、Ｓ８２の処理で特定した関数がｆｕｎｃ１（ｌｉｂ＿ｆｕｎｃ１の呼び出しを行う関数）である場合、ｆｕｎｃ１が例外を送出しない関数であることを示す情報を中間言語１３２ｂに追加する。
【００９９】
その後、ＬＴＯ１２は、Ｓ８２の処理において全ての関数を特定しているか否かを判定する（Ｓ１０３）。
【０１００】
その結果、全ての関数を特定していると判定した場合（Ｓ１０３のＹＥＳ）、ＬＴＯ１２は、必要に応じて、Ｓ８２の処理で特定した関数の中間言語１３２ｂ、または、Ｓ１０２の処理で更新した中間言語１３２ｂのさらなる更新を行う（Ｓ１０４）。すなわち、ＬＴＯ１２は、例えば、Ｓ８２の処理で特定した関数が例外の送出を行う関数以外の関数の呼び出しを行っている場合、Ｓ８２の処理で特定した関数の中間言語１３２ｂ、または、Ｓ１０２の処理で更新した中間言語１３２ｂの最適化をさらに行う。
【０１０１】
その後、ＬＴＯ１２のコンパイル指示部１１６は、Ｓ１０２の処理またはＳ１０４の処理において中間言語１３２ｂの更新が行われたか否かを判定する（Ｓ１０５）。
【０１０２】
その結果、中間言語１３２ｂの更新が行われたと判定した場合（Ｓ１０５のＹＥＳ）、コンパイル指示部１１６は、Ｓ１０２の処理またはＳ１０４の処理で更新した中間言語１３２ｂからの最適化後コード１３４の生成をコンパイラ１１に指示する（Ｓ１０６）。
【０１０３】
また、中間言語１３２ｂの更新が行われていないと判定した場合（Ｓ１０５のＮＯ）、コンパイル指示部１１６は、Ｓ１０６の処理を行わない。すなわち、コンパイル指示部１１６は、この場合、中間言語１３２ｂの更新が行われなかったため、最適化後コード１３４の生成を行う必要がないものと判定する。
【０１０４】
なお、Ｓ８４の処理において、Ｓ８２の処理で特定した関数の関数定義に、Ｓ８２の処理で特定した関数が例外を送出しないことを示す情報が含まれていると判定した場合（Ｓ８４のＹＥＳ）、ＬＴＯ１２は、Ｓ１０３以降の処理を行う。また、Ｓ８６の処理において、Ｓ８２の処理で特定した関数の本体に、Ｓ８２の処理で特定した関数が例外の送出を行う記述が含まれていると判定した場合についても同様に（Ｓ８６のＹＥＳ）、Ｓ１０３以降の処理を行う。また、Ｓ９２の処理において、Ｓ８２の処理で特定した関数が他の関数を呼び出さないと判定した場合についても同様に（Ｓ９２のＮＯ）、Ｓ１０３以降の処理を行う。また、Ｓ９４の処理において、Ｓ８２の処理で特定した関数によって呼び出される他の関数が例外の送出を行わない関数であることを示す情報が含まれていると判定した場合についても同様に（Ｓ９４のＹＥＳ）、Ｓ１０３以降の処理を行う。さらに、Ｓ１０１の処理において、Ｓ８２の処理で特定した関数によって呼び出される他の関数が例外の送出を行わないことを示す情報が関数情報１３６に含まれていないと判定した場合についても同様に（Ｓ１０１のＮＯ）、Ｓ１０３以降の処理を行う。
【０１０５】
すなわち、これらの場合、コンパイラ１１は、各ソースコード１３１や中間言語１３２の内容から、Ｓ８２の処理で特定した関数によって呼び出される関数が例外の送出を行う関数であるか否かの判定が可能である。そのため、コンパイルは、これらの場合、Ｓ１０２の処理を行わない。
【０１０６】
一方、コンパイラ１１のコード生成部１１ｃは、図１９に示すように、ＬＴＯ１２からのコンパイル指示を受け付けるまで待機する（Ｓ１１１のＮＯ）。すなわち、コード生成部１１ｃは、Ｓ８１の処理で生成が完了したオブジェクトコード１３３ｂに埋め込まれている中間言語１３２ｂが更新されるまで待機する。
【０１０７】
そして、ＬＴＯ１２からコンパイル指示を受け付けた場合（Ｓ１１１のＹＥＳ）、コード生成部１１ｃは、呼び出し先の関数（例えば、オブジェクトコード１３３ａに含まれる関数）から例外が送出された場合に実行される後続処理が追加されるように、Ｓ１０２の処理で更新した中間言語１３２ｂから最適化後コード１３４を生成する（Ｓ１１２）。
【０１０８】
なお、Ｓ１０２の処理で更新された中間言語１３２ｂに、呼び出し先の関数から例外が送出された場合に後続処理を実行する旨が既に含まれている場合、コード生成部１１ｃは、後続処理の追加を行わないものであってよい。
【０１０９】
このように、本実施の形態におけるコンパイラ１１は、ソースコード１３１ａのコンパイルの実行に応じて、ソースコード１３１ａに含まれる関数のそれぞれが例外の送出を行う第１関数であるか否かを示す関数情報１３６を情報格納領域１３０に記憶する。
【０１１０】
そして、ＬＴＯ１２は、ソースコード１３１ａと異なるソースコード１３１ｂのコンパイルの実行に応じて、ソースコード１３１ｂに含まれる関数のそれぞれがソースコード１３１ａに含まれる関数を呼び出すか否かを判定する。その結果、ソースコード１３１ａに含まれる関数を呼び出す関数がソースコード１３１ｂに含まれると判定した場合、関数情報１３６を記憶した情報格納領域１３０を参照し、ソースコード１３１ｂに含まれる関数のうち、ソースコード１３１ａに含まれる関数を呼び出すと判定された関数のそれぞれが、第１関数を呼び出す関数であるか否かを判定する。
【０１１１】
その後、コンパイラ１１は、ソースコード１３１ｂに含まれる関数のうち、第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す第１関数から例外が送出された場合に実行される後続処理をオブジェクトコード１３３ｂに追加する。
【０１１２】
すなわち、コンパイラ１１は、ソースコード１３１ａのコンパイル時においては、ソースコード１３１ａに含まれる関数のそれぞれが例外を送出するか否か（第１関数であるか否か）を判定することが可能である。そのため、コンパイラ１１は、ソースコード１３１ａのコンパイル時において関数情報１３６の生成を行う。
【０１１３】
これにより、コンパイラ１１は、ソースコード１３１ｂのコンパイル時に関数情報１３６を参照することが可能になり、ソースコード１３１ａに含まれる関数が例外を送出するか否かを判定することが可能になる。そのため、コンパイラ１１は、ソースコード１３１ｂのコンパイル時における後続処理の追加頻度を抑制することが可能になる。したがって、コンパイラ１１は、ソースコード１３１ｂのコンパイルに要する時間及びオブジェクトコード１３３の実行に要する時間の短縮や、オブジェクトコード１３３による使用リソースの削減等を図ることが可能になる。
【０１１４】
以上の実施の形態をまとめると、以下の付記のとおりである。
【０１１５】
（付記１）
第１ソースコードのコンパイルの実行に応じて、前記第１ソースコードに含まれる関数のそれぞれが例外の送出を行う第１関数であるか否かを示す関数情報を記憶する記憶部と、
前記第１ソースコードと異なる第２ソースコードのコンパイルの実行に応じて、前記第２ソースコードに含まれる関数のそれぞれが前記第１ソースコードに含まれる関数を呼び出すか否かを判定する第１判定部と、
前記第１ソースコードに含まれる関数を呼び出す関数が前記第２ソースコードに含まれると判定した場合、前記関数情報を記憶した記憶部を参照し、前記第２ソースコードに含まれる関数のうち、前記第１ソースコードに含まれる関数を呼び出すと判定された関数のそれぞれが、前記第１関数を呼び出す関数であるか否かを判定する第２判定部と、
前記第２ソースコードに含まれる関数のうち、前記第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す前記第１関数から例外が送出された場合に実行される後続処理を、前記第２ソースコードのコンパイルを実行することによって生成されるオブジェクトコードに追加するコード生成部と、を有する、
ことを特徴とする情報処理装置。
【０１１６】
（付記２）
付記１において、
前記コード生成部は、前記第２ソースコードに含まれる関数のうち、前記第１関数を呼び出さないと判定された関数のそれぞれについては、前記後続処理の追加を行わない、
ことを特徴とする情報処理装置。
【０１１７】
（付記３）
付記１において、
前記後続処理は、各関数が呼び出す前記第１関数から送出された例外を受け付ける処理である、
ことを特徴とする情報処理装置。
【０１１８】
（付記４）
付記１において、
前記コード生成部は、前記第２ソースコードに含まれる関数であって前記第１関数を呼び出すと判定された関数のうち、前記後続処理を実行する旨の記述が前記第２ソースコードに含まれていない関数のそれぞれについて、前記後続処理の追加を行う、
ことを特徴とする情報処理装置。
【０１１９】
（付記５）
付記１において、
前記第２判定部は、
前記第１ソースコードに含まれる関数を呼び出す関数が前記第２ソースコードに含まれると判定した場合、前記第２ソースコードに含まれると判定された関数によって呼び出される関数のそれぞれが前記第１関数であるか否かを示す情報が、前記第１ソースコードまたは前記第２ソースコードに含まれているか否かを判定し、
前記第２ソースコードに含まれる関数によって呼び出される関数のうち、前記第１関数であるか否かを示す情報が前記第１ソースコードまたは前記ソースコードに含まれていないと判定された関数のそれぞれが、前記第１関数を呼び出す関数であるか否かを判定する、
ことを特徴とする情報処理装置。
【０１２０】
（付記６）
付記１において、
前記第１ソースコード及び前記第２ソースコードは、Ｃ＋＋言語によって記述されたソースコードである、
ことを特徴とする情報処理装置。
【０１２１】
（付記７）
第１ソースコードのコンパイルの実行に応じて、前記第１ソースコードに含まれる関数のそれぞれが例外の送出を行う第１関数であるか否かを示す関数情報を記憶部に記憶し、
前記第１ソースコードと異なる第２ソースコードのコンパイルの実行に応じて、前記第２ソースコードに含まれる関数のそれぞれが前記第１ソースコードに含まれる関数を呼び出すか否かを判定し、
前記第１ソースコードに含まれる関数を呼び出す関数が前記第２ソースコードに含まれると判定した場合、前記関数情報を記憶した記憶部を参照し、前記第２ソースコードに含まれる関数のうち、前記第１ソースコードに含まれる関数を呼び出すと判定された関数のそれぞれが、前記第１関数を呼び出す関数であるか否かを判定し、
前記第２ソースコードに含まれる関数のうち、前記第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す前記第１関数から例外が送出された場合に実行される後続処理を、前記第２ソースコードのコンパイルを実行することによって生成されるオブジェクトコードに追加する、
処理をコンピュータに実行させることを特徴とするコンパイラプログラム。
【０１２２】
（付記８）
付記７において、
前記追加する処理では、前記第２ソースコードに含まれる関数のうち、前記第１関数を呼び出さないと判定された関数のそれぞれについては、前記後続処理の追加を行わない、
ことを特徴とするコンパイラプログラム。
【０１２３】
（付記９）
第１ソースコードのコンパイルの実行に応じて、前記第１ソースコードに含まれる関数のそれぞれが例外の送出を行う第１関数であるか否かを示す関数情報を記憶部に記憶し、
前記第１ソースコードと異なる第２ソースコードのコンパイルの実行に応じて、前記第２ソースコードに含まれる関数のそれぞれが前記第１ソースコードに含まれる関数を呼び出すか否かを判定し、
前記第１ソースコードに含まれる関数を呼び出す関数が前記第２ソースコードに含まれると判定した場合、前記関数情報を記憶した記憶部を参照し、前記第２ソースコードに含まれる関数のうち、前記第１ソースコードに含まれる関数を呼び出すと判定された関数のそれぞれが、前記第１関数を呼び出す関数であるか否かを判定し、
前記第２ソースコードに含まれる関数のうち、前記第１関数を呼び出すと判定された関数のそれぞれについて、各関数が呼び出す前記第１関数から例外が送出された場合に実行される後続処理を、前記第２ソースコードのコンパイルを実行することによって生成されるオブジェクトコードに追加する、
ことを特徴とするコンパイル方法。
【０１２４】
（付記１０）
付記９において、
前記追加する工程では、前記第２ソースコードに含まれる関数のうち、前記第１関数を呼び出さないと判定された関数のそれぞれについては、前記後続処理の追加を行わない、
ことを特徴とするコンパイル方法。
【符号の説明】
【０１２５】
１：情報処理装置              ３：操作端末
１１：コンパイラ              １１ａ：解析部
１１ｂ：最適化部              １１ｃ：コード生成部
１２：ＬＴＯ                  １３：リンカ
１３０：情報格納領域          １３１：ソースコード
１３２：中間言語              １３３：オブジェクトコード
１３４：最適化後コード        １３５：実行ファイル
【図１】
2019212100.tif 000003
【図２】
2019212100.tif 000004
【図３】
2019212100.tif 000005
【図４】
2019212100.tif 000006
【図５】
2019212100.tif 000007
【図６】
2019212100.tif 000008
【図７】
2019212100.tif 000009
【図８】
2019212100.tif 000010
【図９】
2019212100.tif 000011
【図１０】
2019212100.tif 000012
【図１１】
2019212100.tif 000013
【図１２】
2019212100.tif 000014
【図１３】
2019212100.tif 000015
【図１４】
2019212100.tif 000016
【図１５】
2019212100.tif 000017
【図１６】
2019212100.tif 000018
【図１７】
2019212100.tif 000019
【図１８】
2019212100.tif 000020
【図１９】
2019212100.tif 000021
【図２０】
2019212100.tif 000022
【図２１】
2019212100.tif 000023
【図２２】
2019212100.tif 000024
【図２３】
2019212100.tif 000025