(57)【要約】【課題】ユーザープログラムにおけるライブラリ手続き呼び出しコードに対して、ライブラリがライブラリの個々の手続きの処理内容に依存する付加処理を提供することが可能なプログラム処理装置を提供する。【解決手段】ライブラリと共に提供される、ライブラリが有する手続きの呼び出し命令を含むコードに対する処理を行う実行可能プログラムであるプラグインを特定し、呼び出し命令を含むユーザープログラムの第１のコードを取得し、特定したプラグインの実行を指示するユーザープログラム処理手段と、第１のコードを処理対象に指定して、実行を指示されたプラグインを起動するプラグイン起動手段とを備える。【選択図】      図１
2015148856.tif 000002
【特許請求の範囲】
【請求項１】
ライブラリと共に提供される、前記ライブラリが有する手続きの呼び出し命令を含むコードに対する処理を行う実行可能プログラムであるプラグインを特定し、前記呼び出し命令を含むユーザープログラムの第１のコードを取得し、前記特定した前記プラグインの実行を指示するユーザープログラム処理手段と、
前記第１のコードを処理対象に指定して、前記実行を指示された前記プラグインを起動するプラグイン起動手段と、
を備えることを特徴とするプログラム処理装置。
【請求項２】
前記ユーザープログラム処理手段は、前記ライブラリと共に提供される、前記手続きに前記プラグインを対応付ける情報を含む前記手続きのリストに基づいて、前記第１のコードを処理すべき、前記プラグインを特定する
ことを特徴とする請求項１に記載のプログラム処理装置。
【請求項３】
前記ユーザープログラム処理手段は、前記リストに基づいて、前記第１のコードにおいて、前記呼び出し命令を含む第１の部分コードを検索し、前記リストに基づいて前記第１の部分コードを処理すべき、前記プラグインを特定し、前記特定した前記プラグインの実行を指示する
ことを特徴とする請求項２に記載のプログラム処理装置。
【請求項４】
前記プラグイン起動手段は、前記プラグインを起動する際に、前記プラグインに前記ライブラリに含まれるライブラリプログラムとリンクすることが可能な前記第１のコードを渡す
ことを特徴とする請求項１乃至３のいずれか１項に記載のプログラム処理装置。
【請求項５】
前記第１のコードは、ソースコード又は前記ソースコードが変換された中間コードである
ことを特徴とする請求項１乃至４のいずれか１項に記載のプログラム処理装置。
【請求項６】
前記プラグインは、前記呼び出し命令部分の最適化を行った結果である第２のコードを生成する
ことを特徴とする請求項１乃至５のいずれか１項に記載のプログラム処理装置。
【請求項７】
前記リストは、前記ライブラリが有するヘッダーファイルであり、前記プラグインの実行を指示する指示文を含み、
前記ユーザープログラム処理手段は、前記指示文に従って、前記プラグインの実行を前記プラグイン起動手段に指示する
ことを特徴とする請求項１乃至６のいずれか１項に記載のプログラム処理装置。
【請求項８】
前記リストは、コマンドラインオプション、環境変数、又はファイルとして前記ユーザープログラム処理手段に与えられる
ことを特徴とする請求項１乃至６のいずれか１項に記載のプログラム処理装置。
【請求項９】
ライブラリと共に提供される、前記ライブラリが有する手続きの呼び出し命令を含むコードに対する処理を行う実行可能プログラムであるプラグインを特定し、
前記呼び出し命令を含むユーザープログラムの第１のコードを取得し、
前記特定した前記プラグインの実行を指示し、
前記第１のコードを処理対象に指定して、前記実行を指示された前記プラグインを起動する
ことを特徴とするプログラム処理方法。
【請求項１０】
プログラム処理装置が備えるコンピュータを、
ライブラリと共に提供される、前記ライブラリが有する手続きの呼び出し命令を含むコードに対する処理を行う実行可能プログラムであるプラグインを特定し、前記呼び出し命令を含むユーザープログラムの第１のコードを取得し、前記特定した前記プラグインの実行を指示するユーザープログラム処理手段と、
前記第１のコードを処理対象に指定して、前記実行を指示された前記プラグインを起動するプラグイン起動手段、
として機能させるためのプログラム処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの、ソースコードまたは中間コードに対する処理を行うことが可能な、プログラム処理装置、プログラム処理方法、及びプログラム処理プログラムに関する。
【背景技術】
【０００２】
プログラムをより効率的に実行できるように、プログラムを別のプログラムや、中間コード、実行ファイル等に変換することは、プログラム最適化（以下、単に「最適化」ともいう。）と呼ばれる。例えば、プログラマが、プログラムを書き換えることによって、最適化を行うことがある。
【０００３】
一方、プログラムのソースコードを計算機で実行可能なオブジェクトコードに変換するコンパイラは、プログラムを、より効率的に実行できるオブジェクトコードに変換する最適化機能を備えていることが多い。また、ソースコードを読み込み、最適化されたソースコードを出力する変換ツールも存在する。このようなコンパイラや変換ツールによる最適化は、プログラマによる最適化を不要にすることにより、プログラムの開発効率を向上させるために重要である。以下の説明では、コンパイラや変換ツール等による最適化等、プログラムに対して所定の処理を行うツールまたは装置を総称して、「プログラム処理ツール」または「プログラム処理装置」と呼ぶ。
【０００４】
最適化の中には、プログラム中の複数の手続き（関数等）にまたがる最適化がある。複数の手続きにまたがる最適化は、「手続き間最適化」と呼ばれる。例えば、ある関数から呼び出される別の関数内で行われる処理に関する情報を用いて、呼び出し元の関数の最適化を行うといった最適化がある。
【０００５】
手続き間最適化について、定数伝搬を行う最適化の例を用いて説明する。なお、「定数伝搬」とは、コンパイル時等、プログラム起動前の準備段階に、定数と判断される変数を定数に置き換える最適化である。図１５（ａ）のプログラムＴは、２つの引数の乗算結果を返す関数ｍｕｌと、ｍｕｌを呼び出す関数ｍａｉｎとを含む。関数ｍｕｌの呼び出し時にｍｕｌに渡される引数が定数であるため、これを伝搬することで関数ｍｕｌが実行される前に、関数の戻り値が６であることが分かる。したがって、図１５（ｂ）に示すように、プログラム処理ツールは、関数ｍａｉｎ中の関数ｍｕｌの呼び出しを、乗算結果である６に置き換えることにより、実行時に関数ｍｕｌを呼び出して乗算を行うことを不要にする最適化を行う。
【０００６】
通常、コンパイラはソースコードを１つのファイル毎にコンパイルする。１つのファイル中に、手続き間最適化の対象である関数の、呼び出す側及び呼び出される側の両方の関数定義が存在する場合には、コンパイラは、関数定義を解析して得られる情報を用いて、呼び出す側の関数の最適化を行うことができる。しかしながら、手続き間最適化の対象である関数の、呼び出す側及び呼び出される側の関数定義の各々が別々のファイルに記述されている場合には、コンパイラは、呼び出す側の関数の最適化を行う際に、呼び出される側の関数定義等の関数の情報（例えば、関数の処理内容に関する情報）を用いることができない。そのため、コンパイラは、十分な最適化を行うことができないという問題がある。
【０００７】
例えば、図１６の例では、関数ｍｕｌが別のファイル“source1.c”、“source2.c”に記述されている。したがって、コンパイラは、ユーザープログラムＶのコンパイル時には、ライブラリプログラムＷに記述された「関数ｍｕｌが引数に対する乗算結果を返す処理である」という情報を利用することができない。そのため、コンパイラは、複数の関数にまたがる定数伝搬を行うことができない。
【０００８】
このような問題を解決するため、コンパイラの中には、生成するオブジェクトコード中にソースコードを解析して得られた情報の一部を埋め込む機能を備えるものがある。また、リンカの中には、オブジェクトコードをリンクする際に、オブジェクトコードに埋め込まれた情報を利用して最適化を行うものがある。
【０００９】
オブジェクトコード中に埋め込まれた、ソースコードの解析情報を利用して手続き間最適化を行う技術の一例が、特許文献１に開示されている。
【００１０】
特許文献１のシステムは、以下のように動作する。
【００１１】
特許文献１のコンパイラは、ソースファイルからグローバルレジスタ情報を含むオブジェクトファイルを生成する。「グローバルレジスタ情報」とは、ソースファイル内で定義または参照されるグローバルシンボルを、グローバルレジスタに関連付ける情報である。「グローバルシンボル」とは、あるモジュール（例えば、１つのソースファイル）内で定義され、別のモジュールから参照されるシンボル（変数等）である。「グローバルレジスタ」とは、任意の手続き（関数等）からアクセス可能なレジスタである。
【００１２】
特許文献１のリンカは、コンパイラが生成した複数のオブジェクトファイルに含まれるグローバルレジスタ情報を利用して、レジスタ割り付けを行った上で、オブジェクトファイルをリンクし、実行可能ファイルを生成する。「レジスタ割り付け」とは、プログラム内の多数の変数をＣＰＵの少数のレジスタに多重化する最適化である。
【００１３】
以上の動作の結果、特許文献１のシステムでは、オブジェクトファイルに埋め込まれたソースコードの解析情報を利用することによって、複数の関数にまたがる手続き間最適化が行われる。
【００１４】
オブジェクトコード中に情報が埋め込まれるとオブジェクトコードのサイズが増大する等理由から、埋め込まれた情報はソースコードを解析して得られる情報よりも情報が少ないものに制限されることがある。そのため、オブジェクトコード中に解析情報が埋め込まれる場合には、十分な最適化が困難であるという問題がある。また、オブジェクトコード中に解析情報が埋め込まれない場合には、オブジェクトコードを最適化することができないという問題もある。
【００１５】
ところで、プログラムはライブラリを利用して開発されることが多い。「ライブラリ」とは、特定の処理を行うプログラムのソースコードがあらかじめコンパイルされたオブジェクトコードである。また、ライブラリは、ライブラリが備える特定の処理（以下、「ライブラリ手続き」という。）に対応したヘッダーファイルを備えることもある。ライブラリを利用するユーザープログラム（ライブラリ手続きを呼び出す、ライブラリに含まれないプログラム）は、ライブラリのオブジェクトコードとリンクされることによって、ライブラリ手続きを利用することができる。なお、ある手続きがライブラリ手続きであるか否かの情報は、ライブラリのヘッダーファイル等の、ライブラリ手続きのリスト情報（以下、「手続きリスト」という。）から得ることができる場合がある。
【００１６】
ライブラリはオブジェクトコードとして提供されるため、ユーザープログラムのコンパイル時には、コンパイラはライブラリのソースコードを利用することができない。このため、ユーザープログラムの関数とライブラリの関数との間では、前述のように十分な最適化を実行することができないという問題がある。オブジェクトコード中に埋め込まれた解析情報を最適化に用いるためには、ライブラリのコンパイル時に解析情報が埋め込まれる必要がある。ところが、一般にライブラリはユーザープログラムの開発者とは異なる開発者によって開発される。さらに、ユーザープログラムのリンクに使われるコンパイラやリンカはライブラリのコンパイル時には不明であることや、異なるユーザープログラムに対しては異なるコンパイラやリンカが利用されることが多い。そのため、ライブラリの開発者が、個別のコンパイラや個別のリンカに対応した解析情報をライブラリのオブジェクトコードに埋め込むことは困難であるという問題がある。また前述のようにオブジェクトコード中に埋め込まれた解析情報では十分な最適化をすることができないという問題もある。
【００１７】
また、コンパイラの中には、プラグイン機能を備えるものがある。「プラグイン機能」とは、あるプログラムが、一定の仕様を満たした別のプログラム（プラグイン）を起動する機能である。プラグインを用いることによって、プログラムに元々実装された機能を拡張することが可能である。プラグイン機能をサポートするコンパイラにはＧＮＵのｇｃｃ等がある。コンパイラのプラグインを利用することにより、コンパイラ自身を変更することなく、コンパイラに新たな機能を導入することができる。
【先行技術文献】
【特許文献】
【００１８】
【特許文献１】特開２０００−１０７９１号公報（第４−６ページ、図１、１０）
【発明の概要】
【発明が解決しようとする課題】
【００１９】
特許文献１のコンパイラは、ソースコードを解析して、レジスタ割り付けのための情報を埋め込んだオブジェクトコードを生成する。レジスタ割り付けのための情報は、ソースコードに一般的に内在するコンパクトな情報である。
【００２０】
ところが、ユーザープログラム中でライブラリ関数を呼び出す場合の手続き間最適化等では、例えば、呼び出されるライブラリ関数の処理内容に基づいて、ライブラリ手続き（関数等）を呼び出すコードの部分（以下、「ライブラリ手続き呼び出しコード」という。）を最適化されたコードに置き換えることがある。ライブラリ手続き呼び出しコードを最適化されたコードに置き換える操作は、ライブラリ手続きの個別の処理内容に依存するので、最適化のための情報をコンパクトに表現することは困難である。つまり、ライブラリとユーザープログラムとの間での手続き間最適化等の、ユーザープログラムにおけるライブラリ手続き呼び出しコードに対する付加処理のための情報を、オブジェクトコードに埋め込むことは困難である。
【００２１】
従って、特許文献１の技術には、ライブラリとユーザープログラムとの間での高度な手続き間最適化等の付加処理を提供すること、つまり、ユーザープログラムにおけるライブラリ手続き呼び出しコードに対して、ライブラリがライブラリの個々の手続きの処理内容に依存する付加処理を提供することが困難であるという問題がある。
（発明の目的）
本発明の目的は、ユーザープログラムにおけるライブラリ手続き呼び出しコードに対して、ライブラリがライブラリの個々の手続きの処理内容に依存する付加処理を提供することが可能な、プログラム処理装置、プログラム処理方法、及びプログラム処理プログラムを提供することにある。
【課題を解決するための手段】
【００２２】
本発明のプログラム処理装置は、ライブラリと共に提供される、ライブラリが有する手続きの呼び出し命令を含むコードに対する処理を行う実行可能プログラムであるプラグインを特定し、呼び出し命令を含むユーザープログラムの第１のコードを取得し、特定したプラグインの実行を指示するユーザープログラム処理手段と、第１のコードを処理対象に指定して、実行を指示されたプラグインを起動するプラグイン起動手段とを備えることを特徴とする。
【００２３】
本発明のプログラム処理方法は、ライブラリと共に提供される、ライブラリが有する手続きの呼び出し命令を含むコードに対する処理を行う実行可能プログラムであるプラグインを特定し、呼び出し命令を含むユーザープログラムの第１のコードを取得し、特定したプラグインの実行を指示し、第１のコードを処理対象に指定して、実行を指示されたプラグインを起動することを特徴とする。
【００２４】
本発明のプログラム処理プログラムは、プログラム処理装置が備えるコンピュータを、ライブラリと共に提供される、ライブラリが有する手続きの呼び出し命令を含むコードに対する処理を行う実行可能プログラムであるプラグインを特定し、呼び出し命令を含むユーザープログラムの第１のコードを取得し、特定したプラグインの実行を指示するユーザープログラム処理手段と、第１のコードを処理対象に指定して、実行を指示されたプラグインを起動するプラグイン起動手段として機能させることを特徴とする。
【発明の効果】
【００２５】
本発明によれば、ユーザープログラムにおけるライブラリ手続き呼び出しコードに対して、ライブラリがライブラリの個々の手続きの処理内容に依存する付加処理を提供することが可能であるという効果がある。
【図面の簡単な説明】
【００２６】
【図１】本発明の第１の実施形態におけるプログラム処理装置の構成の一例を示すブロック図である。
【図２】本発明の第１の実施形態におけるプログラム処理装置が具体的な装置である場合のハードウェア構成の一例を示すブロック図である。
【図３】本発明の第１の実施形態におけるプログラム処理装置のユーザープログラム処理手段の動作を示すフローチャートである。
【図４】本発明の第１の実施形態におけるプログラム処理装置の処理手順の具体例を説明するための図である。
【図５】本発明の第２の実施形態におけるプログラム処理装置の構成の一例を示すブロック図である。
【図６】本発明の第２の実施形態におけるプログラム処理装置のユーザープログラム処理手段の動作を示すフローチャートである。
【図７】本発明の第２の実施形態におけるプログラム処理装置の処理手順の具体例を説明するための図である。
【図８】本発明の第３の実施形態におけるプログラム処理装置の構成の一例を示すブロック図である。
【図９】本発明の第３の実施形態におけるプログラム処理装置の動作を示す図である。
【図１０】本発明の第３の実施形態におけるプログラム処理装置の処理手順の具体例を説明するための図である。
【図１１】本発明の第３の実施形態におけるプログラム処理装置の処理手順の別の具体例におけるユーザープログラムとライブラリプログラムを説明するための図である。
【図１２】本発明の第３の実施形態におけるプログラム処理装置の処理手順の別の具体例における最適化されないプログラムと最適化されたプログラムを説明するための図である。
【図１３】本発明の第４の実施形態におけるプログラム処理装置の構成の一例を示すブロック図である。
【図１４】本発明の第５の実施形態におけるプログラム処理装置の構成の一例を示すブロック図である。
【図１５】手続き間最適化の具体例を説明するための図である。
【図１６】手続き間最適化の問題点を説明するための図である。
【発明を実施するための形態】
【００２７】
以下、本発明の実施形態について図面を参照して詳細に説明する。尚、すべての図面において、同等の構成要素には同じ符号を付し、適宜説明を省略する。
（第１の実施形態）
本実施形態における構成について説明する。
【００２８】
図１は、本実施形態におけるプログラム処理装置１００の構成の一例を示すブロック図である。
【００２９】
本実施形態におけるプログラム処理装置１００は、ライブラリ２００を利用する。
【００３０】
ライブラリ２００は、手続きコード２２０と、プラグイン２１０とを含む。
【００３１】
ライブラリ２００は、ヘッダーファイル２３０を更に含んでもよい。手続きコード２２０は、ライブラリ２００が提供する手続き（関数等。以下、「ライブラリ手続き」という。）のコードである。ライブラリ手続きのコードは、例えば、オブジェクトコードまたはソースコードである。
【００３２】
ヘッダーファイル２３０は、ライブラリ手続きや外部変数の型宣言等を含むファイルである。
【００３３】
プラグイン２１０は、特定のインターフェース仕様にしたがった記述された、プログラム処理装置１００から起動可能なプログラムである。プラグイン２１０は、例えば、単独で実行可能なプログラムや、プログラムに動的リンクされて呼び出されるダイナミックリンクライブラリである。プラグイン２１０は、特定の形態をもつものには限定されず、プログラム処理装置１００から起動可能な、ライブラリ手続きを呼び出すユーザープログラムのコードに対する処理を行う任意のプログラムである。
【００３４】
プログラム処理装置１００は、ライブラリ手続きを呼び出す、ソースコード、またはソースコードが変換された中間コード（以下では、簡単のためにソースコードおよび中間コードを「ソースコード」と総称する）を指定して、プラグイン２１０を起動する。プラグイン２１０は、プログラム処理装置１００から渡されたソースコードに対して所定の処理を行う。プラグイン２１０が実行する所定の処理は、ソースコードに対する、変換、最適化、検証等の処理を含むが、それらには限定されない任意の処理である。プラグイン２１０は、処理の結果をプログラム処理装置１００に返してもよい。
【００３５】
プラグイン２１０は、手続き呼び出しコード処理手段２４０を含む。手続き呼び出しコード処理手段２４０は、渡されたソースコードの情報、およびライブラリの処理内容に関する情報を利用して、ソースコード中のライブラリ手続き呼び出しを含むコードに対する処理を行う。手続き呼び出しコード処理手段２４０が実行する処理は、ソースコード中のライブラリ手続き呼び出しコードに対する、変換、最適化、検証等の処理を含むが、それらには限定されない任意の処理である。
【００３６】
本実施形態におけるプログラム処理装置１００は、例えば、コンパイラ、コンパイラのコンポーネント、または単独のツール、すなわち所定の変換処理を行うプログラムである。あるいは、プログラム処理装置１００は、コンパイルを含む変換処理を行うコンピュータ等の装置であってもよい。本実施形態においては、プログラム処理装置１００が実現する機能に特徴があるのであって、無形のプログラムであるか、有形の装置であるかは本質的問題ではない。
【００３７】
プログラム処理装置１００は、特定の種類のツールに限定されない。プログラム処理装置１００は、ユーザープログラム処理手段１２０と、プラグイン起動手段１１０とを含む。
【００３８】
ユーザープログラム処理手段１２０は、プラグイン２１０を識別するための名称、およびユーザープログラムのソースコードを読み込む。ユーザープログラムとは、ライブラリ手続きを呼び出すプログラムである。ユーザープログラム処理手段１２０は、読み込んだソースコードに対して、読み込んだプラグイン２１０の名称に基づいて、ライブラリ手続きに対応するプラグイン２１０を起動するように、プラグイン起動手段１１０に指示する。
【００３９】
プラグイン起動手段１１０は、指定されたプラグイン２１０にユーザープログラムのソースコードを渡し、プラグイン２１０を起動する。
【００４０】
図２は、本実施形態におけるプログラム処理装置１００が具体的な装置である場合のハードウェア構成の一例を示すブロック図である。
【００４１】
プログラム処理装置１１は、記憶装置１２と、ＣＰＵ（Central Processing Unit）１３と、キーボード１４と、モニタ１５と、Ｉ／Ｏ（Input/Output）１８とを備え、これらが内部バス１６で接続されている。記憶装置１２は、プラグイン起動手段１１０等のＣＰＵ１３の動作プログラムを格納する。ＣＰＵ１３は、プログラム処理装置１１全体を制御し、記憶装置１２に格納された動作プログラムを実行し、Ｉ／Ｏ１８を介してプラグイン起動手段１１０等のプログラムの実行やデータの送受信を行なう。なお、上記のプログラム処理装置１１の内部構成は一例である。プログラム処理装置１１は、ＣＰＵ１３、記憶装置１２、及びＩ／Ｏ１８のみを備え、外部に備えられた、キーボード１４、及びモニタ１５を用いて動作してもよい。
【００４２】
次に、本実施形態における動作について説明する。
【００４３】
図３は、本実施形態におけるプログラム処理装置１００のユーザープログラム処理手段１２０の動作を説明するためのフローチャートである。
【００４４】
ユーザープログラム処理手段１２０は、ライブラリ２００のプラグイン２１０の名称を読み込む（ステップＳ１１）。
【００４５】
ユーザープログラム処理手段１２０は、ユーザープログラムのソースコードを読み込む（ステップＳ１２）。なお、ステップＳ１１とステップＳ１２の実行順序は、一例であり、これに限定されない。例えば、ステップＳ１２の処理の開始後に、ステップＳ１１の処理が開始されてもよいし、ステップＳ１１の処理とステップＳ１２の処理とが並行して実行されてもよい。
【００４６】
ユーザープログラム処理手段１２０は、読み込んだソースコードに対して、名称を読み込んだプラグイン２１０を起動するように、プラグイン起動手段１１０に指示する（ステップＳ１４）。
【００４７】
次に、本実施形態における処理手順の具体例について説明する。
【００４８】
図４は、本実施形態におけるプログラム処理装置１００の処理手順の具体例を説明するための図である。
【００４９】
図４（ａ）に本実施例におけるユーザープログラムのソースコード（”source.c”：以下、「ユーザープログラムＡ」）を、図４（ｂ）に本実施例におけるプログラム処理装置１００を起動するコマンドラインを、図４（ｃ）に本実施例におけるライブラリ２００の手続きコード２２０であるソースコード(“library_source.c”：以下、「ライブラリプログラムＣ」)を、図４（ｄ）に本実施例におけるプラグイン２１０の実行結果であるエラーメッセージを示す。
【００５０】
まず、本実施形態における処理手順の具体例を説明するにあたっての前提について説明する。
【００５１】
ライブラリ２００の提供するプラグイン２１０は、ユーザープログラムＡを読み込み、ユーザープログラムＡ中のライブラリ手続き呼び出しコードの引数の正常性を確認し、異常があればエラーメッセージを出力する実行可能プログラムである。
【００５２】
「ｄｉｖ」は、ライブラリ２００が提供する手続きコード２２０に含まれる手続き名である。ライブラリ手続き「ｄｉｖ」は、整数である第１引数を、整数である第２引数で除算する関数である。「arg-verification」は、ライブラリ２００が提供するプラグイン２１０のファイル名である。プラグイン「arg-verification」は、ライブラリ２００のライブラリ手続きを呼び出すコードの引数の正常性を確認する。
【００５３】
なお、上述のライブラリ手続きとプラグインの機能との対応関係は一例であり、これに限定されない。特定のライブラリに対して、そのライブラリ手続きを呼び出すコードに対する付加処理を行うプラグインが特定されればよい。例えば、ライブラリ２００により提供される任意のライブラリ手続きを呼び出すコードに対して、１つのプラグイン「arg-verification」が、各ライブラリ手続きに応じて、引数の正常性確認に限られない個別の処理を実行してもよい。
【００５４】
ユーザープログラムＡの３行目において、ライブラリ手続き「div(2,0)」が呼び出される。
【００５５】
以上が、以下の処理手順における前提である。次に、処理手順について説明する。
【００５６】
ユーザープログラム処理手段１２０は、プログラム処理装置１００の起動時のコマンドライン（図４（ｂ））を読み込み、コマンドライン中の“-plugin”オプションの引数を取得することにより、プラグイン２１０の名称を取得する（ステップＳ１１）。ユーザープログラム処理手段１２０は、プラグイン「arg-verification」が、ライブラリ２００のプラグインであることを記憶する。
【００５７】
ユーザープログラム処理手段１２０は、ユーザープログラムのソースコードを読み込む（ステップＳ１２）。
【００５８】
ユーザープログラム処理手段１２０は、ライブラリ２００のプラグイン２１０「arg-verification」を起動するように、プラグイン起動手段１１０に指示する（ステップＳ１４）。
【００５９】
プラグイン起動手段１１０は、指定されたプラグイン「arg-verification」にユーザープログラムＡのソースコードを渡し、プラグイン「arg-verification」を起動する。
【００６０】
プラグイン「arg-verification」は、渡されたユーザープログラムＡを読み込み、ユーザープログラムＡ中のライブラリ手続き呼び出しコード「div(2,0)」の引数の正常性を確認し、異常があればエラーメッセージを出力する。具体的には、整数である第１引数を、整数である第２引数で除算することができないので、プラグイン「arg-verification」は、異常があると判定し、エラーメッセージ「Error: Illegal arguments: div(2,0)」を出力する。
【００６１】
以上説明したように、本実施形態におけるプログラム処理装置１００は、プログラム処理装置１００起動時のコマンドラインにより指定されたプラグイン２１０に、ライブラリ２００のライブラリ手続き呼び出しコードを含むユーザープログラムのソースコードを渡し、プラグイン２１０を起動する。つまり、プラグイン２１０は、ライブラリ手続きの処理内容に関する情報を利用して、ユーザープログラム中のライブラリ手続き呼び出しコードを処理することができる。したがって、本実施形態におけるプログラム処理装置１００では、ユーザープログラムにおけるライブラリ手続き呼び出しコードに対して、ライブラリがライブラリの個々の手続きの処理内容に依存する付加処理を提供することが可能であるという効果がある。
【００６２】
なお、本実施形態では、プラグインの名称がプログラム処理装置１００を起動するコマンドラインオプションとして指定される場合について説明した。しかしながら、本実施形態におけるプラグインの名称は、必ずしもコマンドライン中に指定される必要はない。本実施形態におけるプラグインの名称は、コマンドラインとは別の情報源（ファイル、特定フォルダ配下のファイル、環境変数等）に指定されてもよい。プラグインの名称がコマンドラインとは別の情報源に記述されている場合には、プログラム処理装置１００は別の情報源からプラグインの名称を取得してもよい。
（第２の実施形態）
本実施形態における構成について説明する。
【００６３】
図５は、本実施形態におけるプログラム処理装置１０４の構成の一例を示すブロック図である。
【００６４】
本実施形態におけるプログラム処理装置１０４は、ライブラリ２０４を利用する。
【００６５】
ライブラリ２０４は、手続きコード２２０と、手続きリスト２３４と、プラグイン２１０とを含む。
【００６６】
手続きリスト２３４は、ライブラリ手続きのリストである。手続きリスト２３４は、ライブラリ手続きに関する付加処理を行うプラグイン２１０を特定する情報を更に含む。特定のライブラリ手続きに対して特定のプラグインが対応する場合には、手続きリスト２３４は、特定のライブラリ手続きに対して特定のプラグインを対応付ける情報を更に含んでもよい。手続きリスト２３４は、例えば、ライブラリのヘッダーファイルである。しかしながら、手続きリスト２３４はライブラリのヘッダーファイルに限定されない。手続きリスト２３４は、ライブラリ手続き、及びライブラリ手続きに対するプラグイン、を特定する情報を保持する任意の情報源（ファイル、特定フォルダ配下のファイル、コマンドラインオプション、環境変数等）であってよい。なお、手続きリスト２３４の内容は、複数の情報源（ファイル、特定フォルダ配下のファイル、コマンドラインオプション、環境変数等）に分散されて保持されてもよい。
【００６７】
プログラム処理装置１０４は、ライブラリ手続きを呼び出す、ソースコードを指定して、プラグイン２１０を起動する。プラグイン２１０は、プログラム処理装置１０４から渡されたソースコードに対して所定の処理を行う。
【００６８】
プログラム処理装置１０４は、ユーザープログラム処理手段１２４と、プラグイン起動手段１１０とを含む。
【００６９】
ユーザープログラム処理手段１２４は、手続きリスト２３４、およびユーザープログラムのソースコードを読み込み、ユーザープログラム中のライブラリ手続き呼び出しを含むコードを検索する。ユーザープログラム処理手段１２４は、ライブラリ手続き呼び出しを含む未処理のコードに対して、読み込んだ手続きリスト２３４中のプラグイン２１０の情報に基づいて、ライブラリ手続きに対応するプラグイン２１０を起動するように、プラグイン起動手段１１０に指示する。
【００７０】
その他の構成要素については、第１の実施形態と同じである。
【００７１】
次に、本実施形態における動作について説明する。
【００７２】
図６は、本実施形態におけるプログラム処理装置１０４のユーザープログラム処理手段１２４の動作を説明するためのフローチャートである。
【００７３】
ユーザープログラム処理手段１２４は、ライブラリ２０４の手続きリスト２３４を読み込む（ステップＳ２１）。
【００７４】
ユーザープログラム処理手段１２４は、ユーザープログラムのソースコードを読み込み、ユーザープログラム中のライブラリ手続き呼び出しを含む未処理のコードを検索する（ステップＳ２２）。なお、ステップＳ２１とステップＳ２２の実行順序は、一例であり、これに限定されない。ステップＳ２２において、あるライブラリ手続きの呼び出しを含むコードを検索する前に、そのライブラリ手続きを含む手続きリストが読み込まれればよい。例えば、ステップＳ２２の処理の開始後に、ステップＳ２１の処理が開始されてもよいし、ステップＳ２１の処理とステップＳ２２の処理とが並行して実行されてもよい。
【００７５】
ユーザープログラム処理手段１２４は、ユーザープログラム中のライブラリ手続き呼び出しを含む未処理のコードの有無を判定する（ステップＳ２３）。
【００７６】
ユーザープログラム中のライブラリ手続き呼び出しを含む未処理のコードが存在しないと（ステップＳ２３：Ｎｏ）、ユーザープログラム処理手段１２４は、処理を終了する。
【００７７】
ユーザープログラム中のライブラリ手続き呼び出しを含む未処理のコードを発見すると（ステップＳ２３：Ｙｅｓ）、ユーザープログラム処理手段１２４は、読み込んだ手続きリスト２３４中で指定された、ライブラリ手続き呼び出しを含む未処理のコードに対応するプラグイン２１０を起動するように、プラグイン起動手段１１０に指示する（ステップＳ２４）。
【００７８】
次に、本実施形態における処理手順の具体例について説明する。
【００７９】
図７は、本実施形態におけるプログラム処理装置１０４の処理手順の具体例を説明するための図である。
【００８０】
図７（ａ）に本実施例におけるユーザープログラムのソースコード（”source.c”：以下、「ユーザープログラムＡ」）を、図７（ｂ）に本実施例におけるライブラリ２０４の手続きリスト２３４であるヘッダーファイルのソースコード(“library_header.h”：以下、「ヘッダーファイルＢ」)を、図７（ｃ）に本実施例におけるライブラリ２０４の手続きコード２２０であるソースコード(“library_source.c”：以下、「ライブラリプログラムＣ」)を、図７（ｄ）に本実施例におけるプラグイン２１０の実行結果であるエラーメッセージを示す。
【００８１】
まず、本実施形態における処理手順の具体例を説明するにあたっての前提について説明する。
【００８２】
ユーザープログラムＡ中には、手続きリストであるヘッダーファイルＢのインクルードを指示する指示文として、以下が記述されている。
【００８３】
#include <library_header.h>
ライブラリ２０４の提供するプラグイン２１０は、ユーザープログラムＡを読み込み、ユーザープログラムＡ中のライブラリ手続き呼び出しコードの引数の正常性を確認し、異常があればエラーメッセージを出力する実行可能プログラムである。
【００８４】
ライブラリ２０４が提供するヘッダーファイルＢ中には、手続きリスト２３４として、以下が記述されている。
【００８５】
#pragma plugin div-verification div
「ｄｉｖ」は、ライブラリ２０４が提供する手続きコード２２０に含まれる手続き名である。ライブラリ手続き「ｄｉｖ」は、整数である第１引数を、整数である第２引数で除算する関数である。「div-verification」は、ライブラリ２０４が提供するプラグイン２１０のファイル名である。上記の記述は、プラグイン「div-verification」が、ライブラリ手続き「ｄｉｖ」に対応することを示す。プラグイン「div-verification」は、対応するライブラリ手続き「ｄｉｖ」の引数の正常性を確認する。
【００８６】
なお、上述のライブラリ手続きとプラグインとの対応付けは一例であり、これに限定されない。特定のライブラリ手続きに対して、その手続きの処理を行うプラグインが特定されればよい。例えば、ヘッダーファイルＢ中で関数宣言されたすべてのライブラリ手続きに対して、１つのプラグインが対応付けられ、１つのプラグインが各ライブラリ手続きに応じた個別の処理を実行してもよい。
【００８７】
ユーザープログラムＡの３行目において、ライブラリ手続き「div(2,0)」が呼び出される。
【００８８】
以上が、以下の処理手順における前提である。次に、処理手順について説明する。
【００８９】
ユーザープログラム処理手段１２４は、ユーザープログラムＡを読み込み、ユーザープログラムＡ中のインクルード指示文を処理することにより、ライブラリ２０４の手続きリスト２３４であるヘッダーファイルＢを読み込む（ステップＳ２１）。ユーザープログラム処理手段１２４は、ライブラリ２０４のヘッダーファイルＢを読み込むと、ヘッダーファイルＢ中の「#pragma plugin」指示文を見つけ、プラグイン「div-verification」が、ライブラリ手続き「ｄｉｖ」に対応することを記憶する。
【００９０】
ユーザープログラム処理手段１２４は、ユーザープログラムのソースコードを読み込み、ユーザープログラム中のライブラリ手続き「ｄｉｖ」の呼び出しを含む未処理のコードを検索する（ステップＳ２２）。
【００９１】
ユーザープログラム中にライブラリ手続き「ｄｉｖ」の呼び出しを含む未処理のコードが発見されるので（ステップＳ２３：Ｙｅｓ）、ユーザープログラム処理手段１２４は、ライブラリ手続き「ｄｉｖ」に対応するプラグイン「div-verification」を起動するように、プラグイン起動手段１１０に指示する（ステップＳ２４）。なお、ヘッダーファイルＢ中で関数宣言されたすべてのライブラリ手続きに対して、１つのプラグインが対応付けられる場合には、１つのプラグインが各ライブラリ手続きに応じた個別の処理を実行してもよい。
【００９２】
プラグイン起動手段１１０は、指定されたプラグイン「div-verification」にユーザープログラムＡのソースコードを渡し、プラグイン「div-verification」を起動する。
【００９３】
プラグイン「div-verification」は、渡されたユーザープログラムＡを読み込み、ユーザープログラムＡ中のライブラリ手続き呼び出しコード「div(2,0)」の引数の正常性を確認し、異常があればエラーメッセージを出力する。具体的には、整数である第１引数を、整数である第２引数で除算することができないので、プラグイン「div-verification」は、異常があると判定し、エラーメッセージ「Error: Illegal arguments: div(2,0)」を出力する。
【００９４】
以上説明したように、本実施形態におけるプログラム処理装置１０４は、ユーザープログラム中に、ライブラリ２０４のライブラリ手続き呼び出しコードが存在すると、手続きリスト２３４中でライブラリ手続きに対応付けられたプラグイン２１０にユーザープログラムのソースコードを渡し、プラグイン２１０を起動する。つまり、プラグイン２１０は、ライブラリ手続きの処理内容に関する情報を利用して、ユーザープログラムのソースコードを処理することができる。したがって、本実施形態におけるプログラム処理装置１０４では、ユーザープログラムにおけるライブラリ手続き呼び出しコードに対して、ライブラリがライブラリの個々の手続きの処理内容に依存する付加処理を提供することが可能であるという効果がある。
【００９５】
なお、本実施形態では、手続きリストがライブラリの提供するヘッダーファイル中に記述されている場合について説明した。しかしながら、本実施形態における手続きリストは、必ずしもヘッダーファイル中に記述されている必要はない。本実施形態における手続きリストは、ヘッダーファイルとは別の情報源（ファイル、特定フォルダ配下のファイル、コマンドラインオプション、環境変数等）に記述されてもよい。手続きリストがヘッダーファイルとは別の情報源に記述されている場合には、プログラム処理装置１０４は別の情報源から手続きリストを読み込んでもよい。
（第３の実施形態）
本発明による「処理」の例として、ソースコードからオブジェクトコードへの「変換」であるコンパイルを行うプログラム変換装置の例を第３の実施形態として示す。
【００９６】
図８は、本実施形態におけるプログラム変換装置１０５の構成の一例を示すブロック図である。
【００９７】
本実施形態におけるプログラム変換装置１０５は、ライブラリ２０５を利用する。
【００９８】
ライブラリ２０５は、オブジェクトコード２２５と、ヘッダーファイル２３５と、プラグイン２１５とを含む。
【００９９】
ヘッダーファイル２３５は、プラグイン２１５の起動を指示する指示文２５５を含む。
【０１００】
プラグイン２１５は、コンパイラが定めるインターフェース仕様にしたがった記述された、コンパイラから起動可能なプログラムである。プラグイン２１５は、例えば、単独で実行可能なプログラムや、プログラムに動的リンクされて呼び出されるダイナミックリンクライブラリである。プラグイン２１５は、特定の形態をもつものには限定されず、コンパイラから起動可能な任意のプログラムである。
【０１０１】
コンパイラは、ソースコード、またはソースコードを指定して、プラグイン２１５を起動する。プラグイン２１５は、コンパイラから渡されたソースコードに対して最適化を行い、最適化の結果をコンパイラに返す。
【０１０２】
プラグイン２１５は、最適化手段２４５を含む。最適化手段２４５は、渡されたソースコードの情報およびライブラリの処理内容に関する情報を利用して、ソースコード中のライブラリ手続き呼び出しコードの最適化を行う。
【０１０３】
指示文２５５は、ライブラリプログラム中に記述された、コンパイラへ指示を与える文である。ヘッダーファイル２３５中の指示文２５５は、コンパイラに対して、ライブラリ２０５が提供するプラグイン２１５を起動することを指示する。
【０１０４】
本実施形態におけるプログラム変換装置１０５は、例えば、コンパイラ、コンパイラのコンポーネント、または単独のツール、すなわち所定の変換処理を行うプログラムである。あるいは、プログラム変換装置１０５は、コンパイルを含む変換処理を行うコンピュータ等の装置であってもよい。本実施形態においては、プログラム変換装置１０５が実現する機能に特徴があるのであって、無形のプログラムであるか、有形の装置であるかは本質的問題ではない。
【０１０５】
プログラム変換装置１０５は、指示文処理手段１２５と、プラグイン起動手段１１５とを含む。プログラム変換装置１０５は、その他のコンパイラの一般的な構成要素を更に含んでもよい。
【０１０６】
指示文処理手段１２５は、ソースコード（例えば、ヘッダーファイル２３５）中の指示文（例えば、指示文２５５）を読み込み、指示文で指定される処理を行う。指示文は、例えば、Ｃ言語のインクルード指示文である。指示文処理手段１２５は、一般的なコンパイラが有する指示文を処理する機能を有してもよい。指示文処理手段１２５は、プラグイン２１５の起動を指示する指示文２５５を読み込み、指示文２５５で指定されたプラグイン２１５を起動するように、プラグイン起動手段１１５に指示する。指示文処理手段１２５は、その他の指示文を処理する機能を有してもよい。
【０１０７】
プラグイン起動手段１１５は、指定されたプラグイン２１５にソースコードを渡し、プラグイン２１５を起動する。プラグイン起動手段１１５は、プラグイン２１５から返却される最適化された、ソースコードまたは中間コードを受け取る。プラグイン起動手段１１５は、ソースコードに加えて、コンパイラが解析した情報（例えば、変数の依存関係に関する情報）をプラグイン２１５に渡してもよい。
【０１０８】
なお、コンパイラは、一般にソースコードをオブジェクトコードに変換するプログラムを指すが、ソースコードを別のソースコードに変換するプログラムをコンパイラと呼ぶこともある。ソースコードを別のソースコードに変換するプログラムは、ソースツーソースコンパイラまたはプリプロセッサと呼ばれることがある。プログラム変換装置１０５は、ソースツーソースコンパイラであってもよい。
【０１０９】
次に、本実施形態における動作について説明する。
【０１１０】
図９は、本実施形態におけるプログラム変換装置１０５の動作を説明するための図である。
【０１１１】
本実施形態におけるユーザープログラム３０５のソースコードは、ライブラリ２０５を利用するために、ライブラリ２０５が提供するヘッダーファイル２３５をインクルードする。「インクルードする」とは、例えば、プログラム中のインクルード指示文によって、ライブラリ２０５のヘッダーファイル２３５があたかもユーザープログラム３０５のソースコード中に含まれるかのように、プログラム変換装置１０５により取り扱われることである。
【０１１２】
プログラム変換装置１０５の指示文処理手段１２５は、まず、ユーザープログラム３０５中のインクルード指示文を処理する。指示文処理手段１２５は、ライブラリ２０５のヘッダーファイル２３５を読み込む。次に、指示文処理手段１２５は、読み込んだヘッダーファイル２３５中の指示文２５５を処理する。前述のように、ヘッダーファイル２３５中には、プラグイン２１５の起動を指示する指示文２５５が記述されている。指示文処理手段１２５は、指示文２５５に対する処理として、プラグイン起動手段１１５に、指示文２５５で指定されたプラグイン２１５を起動するように指示する。
【０１１３】
プラグイン起動手段１１５は、コンパイラ（プログラム変換装置１０５）のプラグイン仕様にしたがって、プラグイン２１５を起動する。
【０１１４】
プログラム変換装置１０５は、プラグイン２１５から返却されたソースコード（または中間コード）を用いて、コンパイラとしての処理を継続する。プログラム変換装置１０５は、オブジェクトコード４０５を生成し、生成したオブジェクトコード４０５と、ライブラリ２０５が提供するオブジェクトコード２２５とをリンクし、実行プログラム６０５を生成する。
【０１１５】
次に、本実施形態における処理手順の具体例について説明する。
【０１１６】
図１０は、本実施形態におけるプログラム変換装置１０５の処理手順の具体例を説明するための図である。
【０１１７】
図１０（ａ）に本実施例におけるユーザープログラム３０５のソースコード（”source.c”：以下、「ユーザープログラムＥ」）を、図１０（ｂ）に本実施例におけるライブラリ２０５のヘッダーファイル２３５のソースコード(“library_header.h”：以下、「ヘッダーファイルＦ」)を、図１０（ｃ）に本実施例におけるライブラリ２０５のソースコード(“library_source.c”：以下、「ライブラリプログラムＧ」)を、図１０（ｄ）に本実施例におけるユーザープログラムＥが最適化されたプログラムのソースコード(図示しない。以下、「プログラムＨ」)を示す。
【０１１８】
まず、本実施形態における処理手順の具体例を説明するにあたっての前提について説明する。
【０１１９】
ユーザープログラムＥ中には、ヘッダーファイルＦのインクルードを指示する指示文として、以下が記述されている。
【０１２０】
#include <library_header.h>
ライブラリ２０５の提供するプラグイン２１５は、ユーザープログラムＥを読み込み最適化後のプログラムＨを出力する実行可能プログラムである。
【０１２１】
ライブラリ２０５が提供するヘッダーファイルＦ中には、プラグイン２１５の実行を指示する指示文２５５として、以下が記述されている。
【０１２２】
#pragma plugin mulexpanshion
「mulexpansion」は、ライブラリ２０５が提供するプラグイン２１５のファイル名である。
【０１２３】
以上が、以下の処理手順における前提である。次に、処理手順について説明する。
【０１２４】
指示文処理手段１２５は、ユーザープログラムＥを読み込み、ユーザープログラムＥ中のインクルード指示文を処理することにより、ライブラリ２０５のヘッダーファイルＦを読み込む。
【０１２５】
指示文処理手段１２５は、ライブラリ２０５のヘッダーファイルＦを読み込むと、ヘッダーファイルＦ中の「#pragma plugin」指示文を見つける。指示文処理手段１２５は、「#pragma plugin」指示文を見つけると、プラグイン起動手段１１５にプラグイン２１５（mulexpansion）を起動するように指示する。
【０１２６】
プラグイン起動手段１１５は、実行パス中に「mulexpansion」という実行ファイルがあるか否かを検索し、見つかった場合には、プラグインmulexpansionを以下のような引数で起動する。
【０１２７】
mulexpansion “source.c” “tmp.c”
ここで、第１引数はソースファイル（ユーザープログラムＥ）の名前、第２引数はプラグイン２１５が最適化の結果（プログラムＨ）を格納するファイル名である。
【０１２８】
プラグインmulexpansionは、渡されたソースコード（ユーザープログラムＥ）を解析して、「mul(2,3)」という形でライブラリ関数ｍｕｌが呼び出されていることを認識する。プラグインmulexpansionは、ライブラリ関数ｍｕｌは渡された引数の乗算を行う関数であることを利用して定数伝搬を行い、最適化後のプログラムＨ（”tmp.c”）を出力する（”tmp.c”中の本実施例に無関係な部分は省略されている）。プラグインmulexpansionは、ライブラリ開発者によって作成される。そのため、プラグインmulexpansionは、ライブラリ関数ｍｕｌが引数の乗算を行う関数であることを利用した最適化が可能であることは明らかである。プラグイン２１５による最適化の実施方法の詳細は本発明とは直接関係しないので説明を省略する。
【０１２９】
プログラム変換装置１０５は、プラグインmulexpansionが出力した”tmp.c”を用いてコンパイル処理を継続する。
【０１３０】
なお、プログラム変換装置１０５は、プラグイン２１５を連続的に起動する場合には、後続のプラグイン２１５の起動では、先行するプラグイン２１５の出力ファイル（プログラムＨ）を更に渡してもよい。
【０１３１】
プラグインmulexpansionが実行された結果、「x = mul(2,3)」というユーザープログラムＥ中にあるライブラリ手続き呼び出しコードは、代入文「x = 6」に置き換えられる。すなわち、ユーザープログラムＥの実行時には、ライブラリ関数ｍｕｌによる乗算処理は行われず代入処理のみが行われる。そのため、プログラム変換装置１０５は、演算量を削減することで、最適化が行われなかった場合に比べてプログラムの実行を高速化する実行プログラム６０５を生成するためのオブジェクトコード４０５を生成する。
【０１３２】
一方、ライブラリの提供するプラグインを用いることなくコンパイラが最適化を行う場合には、ライブラリはオブジェクトコードで提供されるため、コンパイラがライブラリ関数ｍｕｌの処理内容に関する情報を得ることは困難である。ライブラリ関数の処理内容に関する情報を用いることができない場合には、ライブラリ手続き呼び出しコード「x = mul(2,3)」を代入文「x = 6」に置き換えることは不可能である。したがって、コンパイラは、ライブラリ関数ｍｕｌを呼び出すコードを生成する。そのため、実行プログラムの実行時には、ライブラリ関数ｍｕｌによる乗算が実行される。
【０１３３】
次に、本実施形態における処理手順の別の具体例について説明する。
【０１３４】
図１１は、本実施形態におけるプログラム処理装置１０５の処理手順の別の具体例におけるユーザープログラムとライブラリプログラムを説明するための図である。
【０１３５】
図１２は、本実施形態におけるプログラム変換装置１０５の処理手順の別の具体例における最適化されないプログラムと最適化されたプログラムを説明するための図である。
【０１３６】
図１１（ａ）に本実施例におけるユーザープログラム３０５のソースコード（以下、「ユーザープログラムＪ」）を、図１１（ｂ）に本実施例におけるライブラリ２０５のソースコード(以下、「ライブラリプログラムＫ」)を示す。
【０１３７】
まず、本実施形態における処理手順の具体例を説明するにあたっての前提について説明する。
【０１３８】
以上が、以下の処理手順における前提である。次に、処理手順について説明する。
【０１３９】
次に、本実施形態における処理手順の別の具体例について説明する。本実施例はライブラリ２０５が行列演算機能を提供する場合の例である。ライブラリ２０５は、Ｃ＋＋のクラスライブラリであり、行列クラスＭａｔを提供する。
【０１４０】
図１１（ａ）に、本実施例における３０５のソースコード（以下、「ユーザープログラムＪ」）を示す。ユーザープログラムＪでは、行列クラス型Ｍａｔの４つのデータＡ、Ｂ、Ｃ、Ｄに対して、「Ａ＝Ｂ＋Ｃ−Ｄ」という演算を行う。図１１（ｂ）に、本実施例におけるライブラリ２０５のソースコード(以下、「ライブラリプログラムＫ」)を示す。ライブラリプログラムＫでは、行列クラスの３つの演算子“＋”、“−”、“＝”が定義される。なお、ユーザープログラムＪおよびライブラリプログラムＫのプログラム例は処理内容を模式的に表したものである。
【０１４１】
ユーザープログラムＪを通常のコンパイル方法でコンパイルする場合、コンパイラの最適化部はライブラリ関数（すなわち行列クラスの演算子）の処理内容に関する情報を有しないため、コンパイラは手続き間最適化を実行せずにライブラリ関数を呼び出すオブジェクトコードを生成する。図１２（ａ）に、ユーザープログラムＪが手続き間最適化されない場合の、ライブラリ関数の呼び出し側のオブジェクトコードに対応するソースコードを模式的に示す。図１２（ａ）に示すように、３つの各演算子“＋”、“−”、“＝”に対応する３つのライブラリ関数が順次、呼び出される。各演算子“＋”、“−”、“＝”に対応する処理内容は、図１１（ｂ）に示すように、それぞれ、行列の各要素に対する加算、減算、代入を繰り返し実行するものである。したがって、「Ａ＝Ｂ＋Ｃ−Ｄ」という式に対しては、演算子毎に１回、合計３回の繰り返し処理が行われる。また、最適化されないプログラムＬでは、「Ａ＝Ｂ＋Ｃ−Ｄ」という式に対して、３つの一時行列（ｔｍｐ１、ｔｍｐ２、ｔｍｐ）を用いた演算が行われる。
【０１４２】
一方、プログラム変換装置１０５がユーザープログラムＪを変換する場合は、プラグイン２１５はライブラリプログラムＫの開発者により提供されるので、プラグイン２１５はライブラリ関数の処理内容に関する情報を利用可能である。そのため、プラグイン２１５は、図１２（ｂ）に示すように、「Ａ＝Ｂ＋Ｃ−Ｄ」という演算を１回の繰り返し処理に変換することができる。また、最適化後のプログラムＭでは、「Ａ＝Ｂ＋Ｃ−Ｄ」という式に対して、演算の実行に一時行列が不要である。最適化後のプログラムＭでは、最適化されないプログラムＬに比べ、演算時間および利用メモリ量を削減することができる。
【０１４３】
以上説明したように、本実施形態におけるプログラム変換装置１０５は、ライブラリが提供するヘッダーファイル中で、ライブラリが提供するプラグインの起動が指示されると、プラグインを起動する。つまり、プログラム変換装置１０５は、ライブラリを利用するユーザープログラムを変更することなく、プラグインを起動することができる。プラグインにはユーザープログラムのソースコード（またはソースコードに対応する中間コード）が渡されるため、プラグインはソースコードを解析してユーザープログラムに関する情報を得ることができる。プラグインはライブラリ提供者によって作成されるため、ライブラリ提供者はライブラリの処理内容に関する情報を利用して、プラグインを作成することができる。つまり、プラグインは、ユーザープログラムおよびライブラリの情報を利用して手続き間最適化を行うことが可能である。したがって、本実施形態におけるプログラム変換装置１０５では、ライブラリとユーザープログラムとの間で手続き間最適化を行うことが可能であるという効果がある。
【０１４４】
なお、本実施形態では、プラグインを起動する指示文がライブラリの提供するヘッダーファイル中に記述されている場合について説明した。しかしながら、本実施形態における指示文は、必ずしもヘッダーファイル中に記述されている必要はない。本実施形態における指示文は、ユーザープログラム中に記述されてもよい。指示文がユーザープログラム中に記述されている場合には、ユーザープログラムの開発者がユーザープログラムを書き換える必要があるが、プラグインを起動するかどうかをユーザープログラムの開発者が制御することができるという効果がある。
【０１４５】
本実施形態の説明から明らかなように、本実施形態におけるプログラム変換装置１０５の効果は、特定のコンパイラの定めるプラグインのインターフェース仕様や、プラグインにより実行される最適化の内容とは独立したものである。
（第４の実施形態）
本実施形態における構成について説明する。
【０１４６】
図１３は、本実施形態におけるプログラム変換装置１０６の構成の一例を示すブロック図である。
【０１４７】
本実施形態におけるライブラリ２０６は、ヘッダーファイル２３６と、プラグイン２１６と、オブジェクトコード２２６とを含む。
【０１４８】
ヘッダーファイル２３６は、プラグイン２１６の起動を指示する指示文を含まない。
【０１４９】
本実施形態におけるプログラム変換装置１０６は、コンパイラである。コンパイラ１０６は、プラグイン起動手段１１６と、オプション処理手段１２６とを含む。
【０１５０】
オプション処理手段１２６は、まず、コンパイラ１０６が起動されるときに指定された実行条件（コマンドラインオプション、環境変数等。以下、「オプション」という。）を解析する。オプション処理手段１２６は、続いて、実行条件に含まれる、プラグイン２１６の実行条件を指示するオプションにしたがい、プラグイン起動手段１１６に、プラグインの実行を指示する。
【０１５１】
その他の構成要素については、第３の実施形態と同じである。
【０１５２】
次に、本実施形態における動作について説明する。
【０１５３】
ユーザープログラムの開発者がコンパイラ１０６を起動するときに、ユーザープログラムの開発者はライブラリ２０６が提供するプラグイン２１６を起動するように、オプションを指定する。
【０１５４】
オプション処理手段１２６は、指定されたオプションにしたがって、ライブラリ２０６の提供するプラグイン２１６を起動する。オプションの指定方法は、ライブラリ２０６に付属の文書等によって説明されることが望ましい。
【０１５５】
プラグイン起動手段１１６の動作は、第３の実施形態におけるプラグイン起動手段１１５動作と同じである。
【０１５６】
なお、ユーザープログラムの開発者が直接コンパイラ１０６を起動するのではなく、ユーザープログラムの開発者は開発ツール等を介して間接的にコンパイラ１０６を起動してもよい。
【０１５７】
本実施形態におけるプログラム変換装置１０６では、第３の実施形態におけるプログラム変換装置１０５と同様に、ユーザープログラムとライブラリとの間で手続き間最適化が可能である。
【０１５８】
本実施形態におけるプログラム変換装置１０６では、第３の実施形態におけるプログラム変換装置１０５の効果に加えて、手続き間最適化を行うかどうかを、ユーザープログラムの開発者が指定可能であるという効果がある。本効果により、例えば、ユーザープログラムの開発者は、ユーザープログラムのデバッグ時には、手続き間最適化を行わないという使い方が可能である。
【０１５９】
なお、本実施形態では、ユーザープログラムの開発者がコンパイラの起動時にプラグインの実行条件を指定する場合について説明した。しかしながら、本実施形態におけるプラグインの実行条件は、必ずしもユーザープログラムの開発者により指定される必要はない。本実施形態におけるプラグインの実行条件は、ライブラリのインストール時等に、ライブラリの提供するプラグインが特定のディレクトリに格納されることにより設定されてもよい。つまり、本実施形態におけるコンパイラ１０６は、特定のディレクトリに保存されたプラグインを自動的に起動してもよい。したがって、特定のディレクトリに保存されたプラグインを自動的に起動する本実施形態におけるプログラム変換装置１０６では、ユーザープログラムの開発者は、コンパイル時にオプションとして、手続き間最適化の実行条件を指定する必要がないという効果がある。
（第５の実施形態）
本実施形態における構成について説明する。
【０１６０】
図１４は、本実施形態におけるプログラム変換装置１０７の構成の一例を示すブロック図である。
【０１６１】
本実施形態におけるプログラム変換装置１０７は、指示文処理手段１２７と、プラグイン起動手段１１７と、コンパイラ起動手段１３７とを含む。ただし、プログラム変換装置１０７は、コンパイラとしての機能を含まない。
【０１６２】
指示文処理手段１２７、プラグイン起動手段１１７の機能は、それぞれ、第３の実施形態における指示文処理手段１２５、プラグイン起動手段１１５の機能と同じである。だだし、プラグイン起動手段１１７は、最適化後のユーザープログラムを、コンパイラ起動手段１３７に渡す機能を更に有する。
【０１６３】
コンパイラ起動手段１３７は、最適化後のユーザープログラムを指定して、コンパイラ７０７を起動する機能を備える。
【０１６４】
コンパイラ７０７は、与えられたソースコードをオブジェクトコードに変換する、一般的なコンパイラである。
【０１６５】
その他の構成要素については、第３の実施形態と同じである。
【０１６６】
次に、本実施形態における動作について説明する。
【０１６７】
本実施形態では、ユーザープログラムの開発者は、コンパイラ７０７ではなく、プログラム変換装置１０７を起動する。
【０１６８】
プログラム変換装置１０７は、第２の実施の形態におけるプログラム変換装置１０５と同様に、ヘッダーファイル２３７中の指示文２５７にしたがって、ライブラリ２０７の提供するプラグイン２１７を起動する。プラグイン２１７の実行後、プログラム変換装置１０７は、プラグイン２１７によって最適化されたユーザープログラムのソースコード（またはコンパイラが読み込み可能な中間コード）を指定してコンパイラ７０７を起動する。
【０１６９】
コンパイラ７０７は、指定されたソースコードを読み込み、オブジェクトコードに変換する。コンパイラ７０７は、プラグイン２１７を起動するための指示文２５７を処理する指示文処理機能やプラグイン起動機能を有しなくてもよい。
【０１７０】
プログラム変換装置１０７のその他の動作は、第３の実施形態におけるプログラム変換装置１０５の動作と同じである。
【０１７１】
なお、プログラム変換装置１０７は、コンパイラ７０７が受け取り可能なオプションを含むオプションを受け取り、コンパイラ起動時に、コンパイラ７０７が受け取り可能なオプションをコンパイラ７０７に渡してもよい。
【０１７２】
本実施形態におけるプログラム変換装置１０７では、第３の実施形態におけるプログラム変換装置１０５と同様に、ライブラリとユーザープログラムとの間で手続き間最適化が可能である。
【０１７３】
本実施形態におけるプログラム変換装置１０７では、第３の実施形態におけるプログラム変換装置１０５の効果に加えて、コンパイラが、プラグイン起動機能、またはプラグインの実行を指示するための指示文を処理する指示文処理機能を有しない場合にも利用可能であるという効果がある。
【０１７４】
なお、プログラム変換装置１０７が、コンパイラが受け取り可能なオプションを含むオプションを受け取り、コンパイラ起動時に、コンパイラが受け取り可能なオプションをコンパイラに渡す場合には、ユーザープログラムの開発者は、コンパイラのオプションと同様なオプションを指定して、プログラム変換装置１０７を利用することが可能である。
【０１７５】
また、本実施形態におけるプログラム変換装置１０７は、第４の実施形態におけるプログラム変換装置１０６のように、オプションによってプラグイン起動手段１１７に対するプラグイン２１７の起動指示を受けとってもよい。
【０１７６】
尚、図３、６のプログラム処理装置の各処理は、ソフトウェアによって実行されてもよい。すなわち、各処理を行うためのコンピュータプログラムが、プログラム処理装置が備えるＣＰＵ（図２：１３）によって読み込まれ、実行されてもよい。プログラムを用いて各処理を行っても、上述の実施形態の処理と同内容の処理を行うことができる。そして、上記のプログラムは、ＲＯＭ（Read Only Memory）、ＲＡＭ（Random Access Memory）、フラッシュメモリ等の半導体記憶装置、光ディスク、磁気ディスク、光磁気ディスク等、非一時的な媒体に格納されてもよい。
【０１７７】
あるいは、各処理は、個別の回路等の構成要素によって実行されてもよい。
【０１７８】
尚、本願発明は、上述の実施形態に限定されるものではなく、本願発明の要旨を逸脱しない範囲で種々変更、変形して実施することができる。
【０１７９】
上記の実施形態の一部または全部は、以下の付記のようにも記載されうるが、以下には限られない。
（付記１）
ライブラリと共に提供される、前記ライブラリが有する手続きの呼び出し命令を含むコードに対する処理を行う実行可能プログラムであるプラグインを特定し、前記呼び出し命令を含むユーザープログラムの第１のコードを取得し、前記特定した前記プラグインの実行を指示するユーザープログラム処理手段と、
前記第１のコードを処理対象に指定して、前記実行を指示された前記プラグインを起動するプラグイン起動手段と、
を備えることを特徴とするプログラム処理装置。
（付記２）
前記ユーザープログラム処理手段は、前記ライブラリと共に提供される、前記手続きに前記プラグインを対応付ける情報を含む前記手続きのリストに基づいて、前記第１のコードを処理すべき、前記プラグインを特定する
ことを特徴とする付記１に記載のプログラム処理装置。
（付記３）
前記ユーザープログラム処理手段は、前記リストに基づいて、前記第１のコードにおいて、前記呼び出し命令を含む第１の部分コードを検索し、前記リストに基づいて前記第１の部分コードを処理すべき、前記プラグインを特定し、前記特定した前記プラグインの実行を指示する
ことを特徴とする付記２に記載のプログラム処理装置。
（付記４）
前記プラグイン起動手段は、前記プラグインを起動する際に、前記プラグインに前記ライブラリに含まれるライブラリプログラムとリンクすることが可能な前記第１のコードを渡す
ことを特徴とする付記１乃至３のいずれか１項に記載のプログラム処理装置。
（付記５）
前記第１のコードは、ソースコード又は前記ソースコードが変換された中間コードである
ことを特徴とする付記１乃至４のいずれか１項に記載のプログラム処理装置。
（付記６）
前記プラグインは、前記呼び出し命令部分の最適化を行った結果である第２のコードを生成する
ことを特徴とする付記１乃至５のいずれか１項に記載のプログラム処理装置。
（付記７）
前記リストは、前記ライブラリが有するヘッダーファイルであり、前記プラグインの実行を指示する指示文を含み、
前記ユーザープログラム処理手段は、前記指示文に従って、前記プラグインの実行を前記プラグイン起動手段に指示する
ことを特徴とする付記１乃至６のいずれか１項に記載のプログラム処理装置。
（付記８）
前記リストは、コマンドラインオプション、環境変数、又はファイルとして前記ユーザープログラム処理手段に与えられる
ことを特徴とする付記１乃至６のいずれか１項に記載のプログラム処理装置。
（付記９）
前記第２のコードに対するコンパイル処理を起動する際に、前記コンパイル処理に前記第２のコードを渡すコンパイラ起動手段を更に備える
ことを特徴とする付記６に記載のプログラム処理装置。
（付記１０）
前記プラグインは、単独で実行可能なプログラムである
ことを特徴とする付記１乃至９のいずれか１項に記載のプログラム処理装置。
（付記１１）
ライブラリと共に提供される、前記ライブラリが有する手続きの呼び出し命令を含むコードに対する処理を行う実行可能プログラムであるプラグインを特定し、
前記呼び出し命令を含むユーザープログラムの第１のコードを取得し、
前記特定した前記プラグインの実行を指示し、
前記第１のコードを処理対象に指定して、前記実行を指示された前記プラグインを起動する
ことを特徴とするプログラム処理方法。
（付記１２）
プログラム処理装置が備えるコンピュータを、
ライブラリと共に提供される、前記ライブラリが有する手続きの呼び出し命令を含むコードに対する処理を行う実行可能プログラムであるプラグインを特定し、前記呼び出し命令を含むユーザープログラムの第１のコードを取得し、前記特定した前記プラグインの実行を指示するユーザープログラム処理手段と、
前記第１のコードを処理対象に指定して、前記実行を指示された前記プラグインを起動するプラグイン起動手段、
として機能させるためのプログラム処理プログラム。
【産業上の利用可能性】
【０１８０】
本発明におけるプログラム処理装置は、例えば、ライブラリ開発者が、ライブラリの処理内容とユーザープログラムの処理内容を用いた手続き間最適化を行うプラグインを開発するために利用可能である。
【０１８１】
また、本発明におけるプログラム処理装置は、例えば、行列計算または画像処理等に関する、手続き間最適化が可能なライブラリを提供するために利用可能である。
【図１】
2015148856.tif 000003
【図２】
2015148856.tif 000004
【図３】
2015148856.tif 000005
【図４】
2015148856.tif 000006
【図５】
2015148856.tif 000007
【図６】
2015148856.tif 000008
【図７】
2015148856.tif 000009
【図８】
2015148856.tif 000010
【図９】
2015148856.tif 000011
【図１０】
2015148856.tif 000012
【図１１】
2015148856.tif 000013
【図１２】
2015148856.tif 000014
【図１３】
2015148856.tif 000015
【図１４】
2015148856.tif 000016
【図１５】
2015148856.tif 000017
【図１６】
2015148856.tif 000018