(57)【特許請求の範囲】
【請求項１】
ソースプログラムに含まれる１又は複数の変数のうち、コンパイル時に定数として取り扱うことが可能な変数を特定する特定部と、
特定された前記変数をコンパイル時に定数として取り扱うことを宣言する指定子を、前記ソースプログラムに追加する追加部と、
前記指定子が追加された前記ソースプログラムをオブジェクトプログラムに変換する変換部と、
を有する情報処理装置。
【請求項２】
前記特定部は、
前記ソースプログラムに含まれる１又は複数の変数の各々について、当該変数を左辺に含む式を特定し、
前記ソースプログラムに含まれる１又は複数の変数のうち、特定された前記式の右辺が定数であるという条件を満たす変数を特定する、
請求項１記載の情報処理装置。
【請求項３】
前記ソースプログラムにおける式の左辺が複数の同じ変数を含む場合、当該複数の同じ変数の各々に異なる変数名を割り当て、当該変数名の割り当てに従い前記ソースプログラムを修正する修正部
をさらに有する請求項１又は２記載の情報処理装置。
【請求項４】
前記指定子が追加された前記ソースプログラムを出力する出力部
をさらに有する請求項１乃至３のいずれか１つ記載の情報処理装置。
【請求項５】
ソースプログラムに含まれる１又は複数の変数のうち、コンパイル時に定数として取り扱うことが可能な変数を特定し、
特定された前記変数をコンパイル時に定数として取り扱うことを宣言する指定子を、前記ソースプログラムに追加し、
前記指定子が追加された前記ソースプログラムをオブジェクトプログラムに変換する、
処理をコンピュータが実行するコンパイル方法。
【請求項６】
ソースプログラムに含まれる１又は複数の変数のうち、コンパイル時に定数として取り扱うことが可能な変数を特定し、
特定された前記変数をコンパイル時に定数として取り扱うことを宣言する指定子を、前記ソースプログラムに追加し、
前記指定子が追加された前記ソースプログラムをオブジェクトプログラムに変換する、
処理をコンピュータに実行させるためのコンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル技術に関する。
【背景技術】
【０００２】
言語プロセッサであるコンパイラは、ユーザが作成したソースプログラムをコンパイルし、実行可能なアプリケーション（オブジェクトプログラムとも呼ばれる）を生成する。ユーザは、例えば最適化オプションを指定しつつソースプログラムを記述することで、コンパイラに最適化を行わせ、アプリケーションの性能を向上させることができる。特にＨＰＣ（High Performance Computing）の分野においては、プログラムの実行時間を短縮することが重要であり、コンパイラによる最適化（コンパイラ最適化と呼ばれる）が注目されている。
【０００３】
コンパイラ最適化として、定数伝播という技術が知られている。定数伝播とは、コンパイル時に数式内の変数等を定数に置き換える技術である。通常、定数伝播に基づく定数計算は、コンパイラのうちミドルエンド或いはバックエンドにおいて実行される。これに対し、フロントエンドにおいては極めて簡単な定数計算が実行される。定数伝播に基づく定数計算の機能がフロントエンドに実装されることもあるが、コンパイル時間の増加につながることがあり、また処理系依存の機能であるため好まれない。
【０００４】
一方、２０１１年にＣ＋＋１１という規格が策定され、ｃｏｎｓｔｅｘｐｒ（generalized CONSTant EXPRessions）という指定子が導入された。ユーザは、ソースプログラム内の変数、関数、及びクラスにｃｏｎｓｔｅｘｐｒを付加し、コンパイラのフロントエンドにこれらの定数計算を実行させることができる。上記の定数伝播の場合、最適化機能の適用の度に定数計算を行うことになるが、ｃｏｎｓｔｅｘｐｒの場合には定数計算を一括して行えるため、コンパイル時間を短縮することができる。
【０００５】
但し、Ｃ＋＋１１のｃｏｎｓｔｅｘｐｒには言語仕様上の様々な制約があるため、一般のユーザがｃｏｎｓｔｅｘｐｒを使いこなしソースプログラムを作成するのは難しいという問題がある。従来技術においては、このような問題には着目されていない。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平０９−００６６２７号公報
【特許文献２】特表平０６−５０１５７９号公報
【特許文献３】特開平１０−４０１１４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
従って、本発明の目的は、１つの側面では、プログラムの実行時間を短縮するための技術を提供することである。
【課題を解決するための手段】
【０００８】
本発明に係る情報処理装置は、ソースプログラムに含まれる１又は複数の変数のうち、コンパイル時に定数として取り扱うことが可能な変数を特定する特定部と、特定された変数をコンパイル時に定数として取り扱うことを宣言する指定子を、ソースプログラムに追加する追加部と、指定子が追加されたソースプログラムをオブジェクトプログラムに変換する変換部とを有する。
【発明の効果】
【０００９】
１つの側面では、プログラムの実行時間を短縮できるようになる。
【図面の簡単な説明】
【００１０】
【図１】図１は、ｃｏｎｓｔｅｘｐｒについて説明するための図である。
【図２】図２は、ｃｏｎｓｔｅｘｐｒについて説明するための図である。
【図３】図３は、ｃｏｎｓｔｅｘｐｒについて説明するための図である。
【図４】図４は、情報処理装置の機能ブロック図である。
【図５】図５は、配置表を生成する処理の処理フローを示す図である。
【図６】図６は、ソースプログラムの一例を示す図である。
【図７】図７は、構文木の一例を示す図である。
【図８】図８は、配置表の一例を示す図である。
【図９】図９は、記号表の一例を示す図である。
【図１０】図１０は、メインの処理フローを示す図である。
【図１１】図１１は、記号表の一例を示す図である。
【図１２】図１２は、メインの処理フローを示す図である。
【図１３】図１３は、記号表の一例を示す図である。
【図１４】図１４は、修正後の構文木の一例を示す図である。
【図１５】図１５は、配置表の一例を示す図である。
【図１６】図１６は、記号表の一例を示す図である。
【図１７】図１７は、修正後のソースプログラムの一例を示す図である。
【図１８】図１８は、本実施の形態の方法と他の方法との違いを説明するための図である。
【図１９】図１９は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１１】
図１乃至図３を用いて、ｃｏｎｓｔｅｘｐｒについて説明する。
【００１２】
図１に、ｃｏｎｓｔｅｘｐｒを使用して記述されたソースプログラムの一例を示す。図１の例は、円の面積を計算する例であり、変数ｒ、変数ｐｉ、及び変数ａｒｅａにｃｏｎｓｔｅｘｐｒが付加されている。これにより、定数計算をコンパイル時に実行することが可能になる。なお、Ｃ＋＋１１より前の規格においても、実行時定数の整数であればコンパイル時定数として取り扱うことができるが、浮動小数点、関数、及びクラスをコンパイル時定数として取り扱うことは規格上不可能である。コンパイル時定数とは、コンパイル時に値が計算される定数であり、実行時定数とは実行時に値が計算される定数である。
【００１３】
但し、上で述べたように、Ｃ＋＋１１のｃｏｎｓｔｅｘｐｒには言語仕様上の様々な制約があるため、ユーザはｃｏｎｓｔｅｘｐｒを単純に追加すればよいというわけではない。図２に、単純にソースプログラムにｃｏｎｓｔｅｘｐｒを追加するとエラーが発生する例を示す。図２の例においては、変数ａに変数ｂを加算した結果を返す例が示されている。図２に示したソースプログラムに対して単純にｃｏｎｓｔｅｘｐｒを追加すると、図３に示すようなプログラムになる。図３に示したプログラムにおいては、変数ａ及び変数ｂにｃｏｎｓｔｅｘｐｒが付加されている。図３に示したプログラムの場合、「ａ＋＝ｂ；」というコードより前のコードには問題は無いが、ａはｃｏｎｓｔ（定数）であるのでａを更新することができず、「ａ＋＝ｂ；」というコードにおいてエラーが発生する。
【００１４】
また、ソースプログラムに無理にｃｏｎｓｔｅｘｐｒを追加した場合、ソースプログラムが読みにくくなったり、本来意図しないソースプログラムを記述することになることがある。さらに、ＳＴＬ（Standard Template Library）或いはユーザが明示的に作成したｃｏｎｓｔｅｘｐｒ関数が存在していても、渡される引数がｃｏｎｓｔｅｘｐｒ宣言された変数或いはリテラルでなければ、コンパイル時に計算されることはない。
【００１５】
以上の点に鑑み、本実施の形態においては、以下のような方法によってソースプログラムにｃｏｎｓｔｅｘｐｒを追加する。
【００１６】
図４に、本実施の形態における情報処理装置１の機能ブロック図を示す。情報処理装置１は、ソースプログラム格納部１０１と、字句解析部１０２と、構文解析部１０３と、構文木格納部１０４と、配置表格納部１０５と、記号表格納部１０６と、リテラルチェッカー１０８を含む意味解析部１０７と、出力部１０９と、中間コード格納部１１０と、最適化部１１１と、生成部１１２と、オブジェクトプログラム格納部１１３とを含む。
【００１７】
ソースプログラム格納部１０１は、ユーザが作成したソースプログラムを格納する。字句解析部１０２は、ソースプログラム格納部１０１に格納されたソースプログラムをトークンに分割する処理等を実行し、処理結果を構文解析部１０３に出力する。構文解析部１０３は、字句解析部１０２から受け取った処理結果に基づき、構文木を生成する処理を実行し、処理結果である構文木のデータを構文木格納部１０４に格納する。また、構文解析部１０３は、字句解析部１０２から受け取った処理結果に基づき配置表及び記号表を生成する処理を実行し、配置表を配置表格納部１０５に格納し、記号表を記号表格納部１０６に格納する。リテラルチェッカー１０８は、構文木格納部１０４に格納されたデータに基づき処理を実行し、処理結果に基づき、配置表格納部１０５に格納された配置表及び記号表格納部１０６に格納された記号表を更新する。出力部１０９は、構文木格納部１０４に格納された構文木のデータ及び記号表格納部１０６に格納された記号表に基づきソースプログラムを修正し、修正後のソースプログラムを表示装置（例えばディスプレイ）に表示させる。意味解析部１０７は、構文木格納部１０４に格納された構文木のデータに基づきコンパイルエラーが有るか否か判断する処理等を実行し、中間言語のコード（すなわち中間コード）を生成して中間コード格納部１１０に格納する。最適化部１１１は、中間コード格納部１１０に格納された中間コードに対してコンパイラ最適化を実行し、実行結果であるコードを生成部１１２に出力する。生成部１１２は、最適化部１１１から受け取ったコードからオブジェクトプログラムを生成し、オブジェクトプログラム格納部１１３に格納する。
【００１８】
本実施の形態においては、字句解析部１０２、構文解析部１０３、及び意味解析部１０７がフロントエンドに相当し、最適化部１１１がミドルエンドに相当し、生成部１１２がバックエンドに相当する。なお、意味解析部１０７、中間コード格納部１１０、最適化部１１１、生成部１１２、及びオブジェクトプログラム格納部１１３は、本実施の形態の主要な部分とは関係が無いので、詳細な説明を省略する。
【００１９】
次に、図５乃至図１８を用いて、情報処理装置１が実行する処理について説明する。処理の開始時、構文木格納部１０４に格納された構文木のデータ、配置表格納部１０５に格納された配置表、及び記号表格納部１０６に格納された記号表は初期化される。
【００２０】
まず、情報処理装置１のソースプログラム格納部１０１にソースプログラムが格納されたとする。本実施の形態においては、図６に示すソースプログラムがソースプログラム格納部１０１に格納されたとする。そして、字句解析部１０２は、ソースプログラム格納部１０１に格納されたソースプログラムをトークンに分割する処理を実行し、処理結果を構文解析部１０３に出力する。
【００２１】
構文解析部１０３は、字句解析部１０２から受け取った処理結果から構文木を生成し（図５：ステップＳ１）、生成した構文木のデータを構文木格納部１０４に格納する。図７に、構文木の一例を示す。図７の例では、トークンに網掛けが付されている。構文木を生成する処理はよく知られているので、ここでは詳細な説明を省略する。
【００２２】
構文解析部１０３は、生成した構文木に未処理のトークンが有るか判断する（ステップＳ３）。未処理のトークンが有る場合（ステップＳ３：Ｙｅｓルート）、構文解析部１０３は、未処理のトークンを１つ特定する（ステップＳ５）。
【００２３】
構文解析部１０３は、ステップＳ５において特定したトークンは変数であるか判定する（ステップＳ７）。本実施の形態においては、構文木において「Ｖａｒｉａｂｌｅ」と示されたトークンが変数である。図７の例では、ａ及びｂが変数である。トークンが変数ではない場合（ステップＳ７：Ｎｏルート）、次のトークンについて処理するため、ステップＳ３の処理に戻る。
【００２４】
一方、トークンが変数である場合（ステップＳ７：Ｙｅｓルート）、構文解析部１０３は、トークンが式の左辺に含まれるか判断する（ステップＳ９）。図７の例では、トークンが、「Ｌｉｎｅ２」における「Ｉｄｘ  ０」のトークンである場合又は「Ｌｉｎｅ４」における「Ｉｄｘ  ０」又は「Ｌｉｎｅ５」における「Ｉｄｘ  ０」のトークンである場合、式の左辺に含まれると判断される。
【００２５】
トークンが式の左辺に含まれる場合（ステップＳ９：Ｙｅｓルート）、構文解析部１０３は、変数名及び左辺値を含む新規のエントリを配置表格納部１０５に格納された配置表に追加する（ステップＳ１１）。そしてステップＳ３の処理に戻る。本実施の形態において、左辺値は（ｘ）の形式で表され、右辺値は（ｘ，ｙ）の形式で表される。ｘは行番号であり、ｙはインデックス番号である。
【００２６】
トークンが式の左辺に含まれない場合（ステップＳ９：Ｎｏルート）、構文解析部１０３は、配置表格納部１０５に格納された配置表の既存エントリに右辺値を追加する（ステップＳ１３）。そしてステップＳ３の処理に戻る。
【００２７】
図８に、配置表格納部１０５に格納される配置表の一例を示す。図８の例では、変数名と、左辺値と、右辺値とが格納される。
【００２８】
一方、未処理のトークンが無い場合（ステップＳ３：Ｎｏルート）、構文解析部１０３は、ソースプログラムについて記号表を生成して記号表格納部１０６に格納し、処理を終了する。
【００２９】
図９に、記号表の一例を示す。図９の例では、変数の型と、変数名と、属性とが格納される。本処理の時点では、属性の欄にはデータが格納されない。
【００３０】
次に、リテラルチェッカー１０８が実行する処理について説明する。配置表及び記号表の生成が完了すると、リテラルチェッカー１０８は、配置表格納部１０５に格納された配置表において未処理の変数を探索する（図１０：ステップＳ２１）。
【００３１】
リテラルチェッカー１０８は、配置表格納部１０５において未処理の変数が有るか判断する（ステップＳ２３）。未処理の変数が有る場合（ステップＳ２３：Ｙｅｓルート）、リテラルチェッカー１０８は、未処理の変数を配置表から１つ特定する（ステップＳ２９）。
【００３２】
リテラルチェッカー１０８は、ステップＳ２９において特定した変数の左辺値の行番号によって特定される式の右辺はコンパイル時定数であるか判断する（ステップＳ３１）。本実施の形態においては、右辺が例えば「１０」或いは「２０」等の定数であればコンパイル時定数であると判断することとする。また、たとえ右辺が変数を含むとしても、その変数の属性がｃｏｎｓｔｅｘｐｒである場合には、コンパイル時定数であると判断することとする。すなわち、ステップＳ３１においては、式の右辺がリテラルであるか否かがリテラルチェッカー１０８によって判断される。
【００３３】
右辺がコンパイル時定数ではない場合（ステップＳ３１：Ｎｏルート）、ステップＳ２１の処理に戻る。一方、右辺がコンパイル時定数である場合（ステップＳ３１：Ｙｅｓルート）、リテラルチェッカー１０８は、変数の属性は記号表において既に「ｃｏｎｓｔｅｘｐｒ」に設定されているか判断する（ステップＳ３３）。
【００３４】
変数の属性は記号表において既に「ｃｏｎｓｔｅｘｐｒ」に設定されている場合（ステップＳ３３：Ｙｅｓルート）、ステップＳ２１の処理に戻る。一方、変数の属性は記号表において未だ「ｃｏｎｓｔｅｘｐｒ」に設定されていない場合（ステップＳ３３：Ｎｏルート）、リテラルチェッカー１０８は、ステップＳ２９において特定した変数の属性を「ｃｏｎｓｔｅｘｐｒ」に設定する（ステップＳ３５）。処理は端子Ａを介して図１２のステップＳ３７の処理に移行する。
【００３５】
図１１に、ステップＳ３５の処理後に記号表に格納されるデータの一例を示す。図１１の例では、変数ａの属性が「ｃｏｎｓｔｅｘｐｒ」に設定されている。
【００３６】
図１２の説明に移行し、リテラルチェッカー１０８は、ステップＳ２９において特定した変数の変数名と同じ変数名のエントリが配置表に未だ存在するか判断する（図１２：ステップＳ３７）。同じ変数名のエントリが配置表に存在しない場合（ステップＳ３７：Ｎｏルート）、処理は端子Ｂを介してステップＳ２１の処理に戻る。
【００３７】
一方、同じ変数名のエントリが配置表に未だ存在する場合（ステップＳ３７：Ｙｅｓルート）、リテラルチェッカー１０８は、同じ変数名を有する変数を１つ特定する（ステップＳ３８）。そして、リテラルチェッカー１０８は、ステップＳ３８において特定した変数の変数名を変更する（ステップＳ３９）。ステップＳ３９においては、例えばＳＳＡ形式（Static Single Assignment form）の新変数名が割り当てられる。
【００３８】
リテラルチェッカー１０８は、新変数名を記号表に登録する（ステップＳ４１）。図１３に、ステップＳ４１の処理後に記号表に格納されるデータの一例を示す。図１３の例では、新変数名「ａ２」が新たに記号表に登録されている。
【００３９】
リテラルチェッカー１０８は、新変数名に変更された変数について、構文木における変数名及び配置表における変数名を更新する（ステップＳ４３）。そしてステップＳ３７の処理に戻る。
【００４０】
図１４に、ステップＳ４３の処理後における構文木の一例を示す。図１４の例では、黒色の矢印が付された、「Ｌｉｎｅ５」における「Ｉｄｘ  ０」のトークンの変数名と、「Ｌｉｎｅ６」における「Ｉｄｘ  ０」のトークンの変数名とが、「ａ」から「ａ２」に変更されている。
【００４１】
図１５に、ステップＳ４３の処理後における配置表の一例を示す。図１５の例では、３行目のエントリにおける変数名が「ａ」から「ａ２」に変更されている。
【００４２】
図１０の説明に戻り、未処理の変数が無い場合（ステップＳ２３：Ｎｏルート）、リテラルチェッカー１０８は、出力部１０９に解析が完了したことを通知する。これに応じ、出力部１０９は、修正したソースプログラムを、構文木格納部１０４に格納された構文木のデータ及び記号表格納部１０６に格納された記号表に基づき生成する（ステップＳ２５）。
【００４３】
図１６に、ステップＳ２５の処理時点において記号表に格納されるデータの一例を示す。図１６の例では、変数ａ、変数ｂ、及び変数ａ２のいずれに対しても、属性「ｃｏｎｓｔｅｘｐｒ」が設定されている。このような状態において、出力部１０９は、例えば図１７に示すようにソースプログラムを修正する。すなわち、出力部１０９は、記号表において属性「ｃｏｎｓｔｅｘｐｒ」が設定されている変数の宣言文に、指定子「ｃｏｎｓｔｅｘｐｒ」を追加する。ここで、変数ａ２については、構文木のデータに基づき「ａ＋＝ｂ；」というコードを「ａ２＝ａ＋ｂ」というコードに書き換える。
【００４４】
出力部１０９は、修正されたソースプログラムを表示装置に表示させる（ステップＳ２７）。そして処理を終了する。これにより、ユーザは、修正後のソースコードの内容を確認し、今後のプログラム開発の参考にすることができるようになる。
【００４５】
以上のようにすれば、実行時ではなくコンパイル時に定数計算が実行されるようになるので、実行時間の短縮が可能になる。また、通常の最適化部１１１は中間コードに対して最適化を実行するため、ソースコード全容を把握できず、変数の有効範囲等がわからないため、実行できない最適化が生じることがある。しかし、本実施の形態においてはフロントエンドにおいても最適化を実行するので、最適化部１１１のみにおいて最適化を実行するよりも広範囲の最適化を行うことができるようになる。
【００４６】
また、ｃｏｎｓｔｅｘｐｒはソースコードに自動的に付加されるので、ユーザの知識や技術が不足している場合においても、ソースレベルの最適化が可能になる。
【００４７】
また、上で述べたような配置表を利用し、構文木内のトークンのうち変数名の変更の影響を受けるトークンのみを置換することで、高速な置換が可能になる。
【００４８】
また、既存のｃｏｎｓｔｅｘｐｒ関数或いはクラスに渡す引数がコンパイル時定数になる可能性が高くなるため、ｃｏｎｓｔｅｘｐｒの適用範囲を拡大することができるようになる。その結果として、さらに実行時間を短縮することが可能になる。
【００４９】
また、フロントエンドにおいて計算可能な部分が計算されてから最適化部１１１において最適化を実行することになるため、最適化部１１１が実行すべき処理を少なくすることができるようになる。
【００５０】
また、言語規格に準拠するようにｃｏｎｓｔｅｘｐｒを付加するため、修正後のソースコードのコンパイルを他のコンパイラに実行させることも可能である。また、本実施の形態の方法はアーキテクチャに依存しない。
【００５１】
図１８を用いて、本実施の形態の方法（以下、本方法と呼ぶ）と他の方法との違いを説明する。ここでは、処理系への依存、コンパイル時間、実行時間、及び利便性という４つの観点から各方法を比較している。
【００５２】
まず、本方法及び人手によってｃｏｎｓｔｅｘｐｒを付加する方法は、Ｃ＋＋１１をサポートするコンパイラであれば適用可能である。一方、定数伝播（すなわち、ミドルエンド或いはバックエンドによる最適化）は、コンパイラの最適化部１１１の作りこみを要するため、他のコンパイラではその最適化部１１１の機能を使用することができない。すなわち、定数伝播は処理系に依存する。
【００５３】
また、本方法及び人手によってｃｏｎｓｔｅｘｐｒを付加する方法によれば、定数計算を一括して実行できるため、コンパイル時間を短縮することができる。一方、定数伝播の場合、最適化部１１１において最適化機能を適用する度に定数伝播が行われるため、本方法と比較してコンパイル時間が長い。
【００５４】
また、本方法においては機械的に漏れなくｃｏｎｓｔｅｘｐｒを付加するため、人手によってｃｏｎｓｔｅｘｐｒを付加する方法と比較すると、実行性能が向上し、実行時間の短縮につながる。
【００５５】
また、本方法においてはユーザがｃｏｎｓｔｅｘｐｒの使用方法を理解しなくてもよいため、利便性を向上させることができる。また、Ｃ＋＋１１の言語仕様に則っているため、他の処理系に修正後のソースプログラムをコンパイルさせることもできる。一方、人手によってｃｏｎｓｔｅｘｐｒを付加する方法は、ユーザがｃｏｎｓｔｅｘｐｒの使用方法を理解しなければならないため、本方法と比較して利便性は低い。
【００５６】
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上で説明した情報処理装置１の機能ブロック構成は実際のプログラムモジュール構成に一致しない場合もある。
【００５７】
また、上で説明したデータ保持の構成は一例であって、上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
【００５８】
また、修正後のソースコードと元のソースコードとを並べて表示するようにしてもよい。また、修正後のソースコードを表示装置に表示させる例を示したが、修正後のソースコードが記載された用紙をプリンタ等から印刷するようにしてもよい。また、
【００５９】
なお、上で述べた情報処理装置１は、コンピュータ装置であって、図１９に示すように、メモリ２５０１とＣＰＵ（Central Processing Unit）２５０３とハードディスク・ドライブ（ＨＤＤ：Hard Disk Drive）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。ＣＰＵ２５０３は、アプリケーション・プログラムの処理内容に応じて表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ２５０１に格納されるが、ＨＤＤ２５０５に格納されるようにしてもよい。本発明の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【００６０】
以上述べた本発明の実施の形態をまとめると、以下のようになる。
【００６１】
本実施の形態の第１の態様に係る情報処理装置は、（Ａ）ソースプログラムに含まれる１又は複数の変数のうち、コンパイル時に定数として取り扱うことが可能な変数を特定する特定部と、（Ｂ）特定された変数をコンパイル時に定数として取り扱うことを宣言する指定子を、ソースプログラムに追加する追加部と、（Ｃ）指定子が追加されたソースプログラムをオブジェクトプログラムに変換する変換部とを有する。
【００６２】
このようにすれば、実行時に行われる計算をコンパイル時に行うことが可能になるので、実行に要する時間を短縮できるようになる。
【００６３】
また、上で述べた特定部は、（ａ１）ソースプログラムに含まれる１又は複数の変数の各々について、当該変数を左辺に含む式を特定し、（ａ２）ソースプログラムに含まれる１又は複数の変数のうち、特定された式の右辺が定数であるという条件を満たす変数を特定してもよい。このようにすれば、コンパイル時に定数として取り扱うことが可能な変数を適切に特定できるようになる。
【００６４】
また、本情報処理装置は、（Ｄ）ソースプログラムにおける式の左辺が複数の同じ変数を含む場合、当該複数の同じ変数の各々に異なる変数名を割り当て、当該変数名の割り当てに従いソースプログラムを修正する修正部をさらに有してもよい。このようにすれば、値が更新される変数が存在する場合にも対処できるようになる。
【００６５】
また、本情報処理装置は、（Ｅ）指定子が追加されたソースプログラムを出力する出力部をさらに有してもよい。このようにすれば、ソースプログラムの作成者等が、実行時間の短縮に有効な記述方法を確認できるようになる。
【００６６】
本実施の形態の第２の態様に係るコンパイル方法は、（Ｆ）ソースプログラムに含まれる１又は複数の変数のうち、コンパイル時に定数として取り扱うことが可能な変数を特定し、（Ｇ）特定された変数をコンパイル時に定数として取り扱うことを宣言する指定子を、ソースプログラムに追加し、（Ｈ）指定子が追加されたソースプログラムをオブジェクトプログラムに変換する処理を含む。
【００６７】
なお、上記方法による処理をコンピュータに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
【００６８】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【００６９】
（付記１）
ソースプログラムに含まれる１又は複数の変数のうち、コンパイル時に定数として取り扱うことが可能な変数を特定する特定部と、
特定された前記変数をコンパイル時に定数として取り扱うことを宣言する指定子を、前記ソースプログラムに追加する追加部と、
前記指定子が追加された前記ソースプログラムをオブジェクトプログラムに変換する変換部と、
を有する情報処理装置。
【００７０】
（付記２）
前記特定部は、
前記ソースプログラムに含まれる１又は複数の変数の各々について、当該変数を左辺に含む式を特定し、
前記ソースプログラムに含まれる１又は複数の変数のうち、特定された前記式の右辺が定数であるという条件を満たす変数を特定する、
付記１記載の情報処理装置。
【００７１】
（付記３）
前記ソースプログラムにおける式の左辺が複数の同じ変数を含む場合、当該複数の同じ変数の各々に異なる変数名を割り当て、当該変数名の割り当てに従い前記ソースプログラムを修正する修正部
をさらに有する付記１又は２記載の情報処理装置。
【００７２】
（付記４）
前記指定子が追加された前記ソースプログラムを出力する出力部
をさらに有する付記１乃至３のいずれか１つ記載の情報処理装置。
【００７３】
（付記５）
ソースプログラムに含まれる１又は複数の変数のうち、コンパイル時に定数として取り扱うことが可能な変数を特定し、
特定された前記変数をコンパイル時に定数として取り扱うことを宣言する指定子を、前記ソースプログラムに追加し、
前記指定子が追加された前記ソースプログラムをオブジェクトプログラムに変換する、
処理をコンピュータが実行するコンパイル方法。
【００７４】
（付記６）
ソースプログラムに含まれる１又は複数の変数のうち、コンパイル時に定数として取り扱うことが可能な変数を特定し、
特定された前記変数をコンパイル時に定数として取り扱うことを宣言する指定子を、前記ソースプログラムに追加し、
前記指定子が追加された前記ソースプログラムをオブジェクトプログラムに変換する、
処理をコンピュータに実行させるためのコンパイラプログラム。
【符号の説明】
【００７５】
１  情報処理装置    １０１  ソースプログラム格納部
１０２  字句解析部    １０３  構文解析部
１０４  構文木格納部    １０５  配置表格納部
１０６  記号表格納部    １０７  意味解析部
１０８  リテラルチェッカー    １０９  出力部
１１０  中間コード格納部    １１１  最適化部
１１２  生成部    １１３  オブジェクトプログラム格納部
【図１】
0006481515.tif 000002
【図２】
0006481515.tif 000003
【図３】
0006481515.tif 000004
【図４】
0006481515.tif 000005
【図５】
0006481515.tif 000006
【図６】
0006481515.tif 000007
【図７】
0006481515.tif 000008
【図８】
0006481515.tif 000009
【図９】
0006481515.tif 000010
【図１０】
0006481515.tif 000011
【図１１】
0006481515.tif 000012
【図１２】
0006481515.tif 000013
【図１３】
0006481515.tif 000014
【図１４】
0006481515.tif 000015
【図１５】
0006481515.tif 000016
【図１６】
0006481515.tif 000017
【図１７】
0006481515.tif 000018
【図１８】
0006481515.tif 000019
【図１９】
0006481515.tif 000020