(57)【特許請求の範囲】
【請求項１】
初期化手続きを持つ複数のクラスから構成されるプログラムをコンパイルするコンパイル処理装置において、
他のクラスに影響を及ぼす初期化手続きの持つ属性情報を記憶する記憶手段と、
コンパイル対象のステートメントが初期化手続きを必要とするときに、該初期化手続きを特定する特定手段と、
上記記憶手段の記憶する属性情報を持つか持たないかをチェックすることで、上記特定手段の特定した初期化手続きが他のクラスに影響を及ぼさないとみなしてよいものに該当するのかを判断する判断手段と、
上記判断手段が該当する初期化手続きであることを判断するときに、上記ステートメントを該初期化手続きを呼び出さない形に変更するとともに、該初期化手続きを持つクラスに対して、クラスの実行に入る前に該初期化手続きを１回だけ起動することを指示する情報を記録する変更手段とを備えることを、
特徴とするコンパイル処理装置。
【請求項２】
請求項１に記載のコンパイル処理装置において、
上記記憶手段は、属性情報に対応付けて他のクラスへの影響度合いを示すレベル情報を記憶し、
上記判断手段は、指定されるレベル情報の規定する属性情報を使ってチェック処理を実行することを、
特徴とするコンパイル処理装置。
【請求項３】
請求項１又は２に記載のコンパイル処理装置において、
対話処理に従って、上記記憶手段にデータを登録する登録手段を備えることを、
特徴とするコンパイル処理装置。
【請求項４】
請求項１ないし３のいずれか１項に記載のコンパイル処理装置において、
初期化手続きの実行回数情報を入手する入手手段と、
上記入手手段の入手した実行回数情報に従って、上記特定手段の特定した初期化手続きが実行の可能性の少ないものであると判断されるときに、該初期化手続きを上記判断手段の処理対象から外す除外手段とを備えることを、
特徴とするコンパイル処理装置。
【請求項５】
初期化手続きを持つ複数のクラスから構成されるプログラムをコンパイルするコンパイル処理装置の実現に用いられるプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
コンピュータを、
他のクラスに影響を及ぼす初期化手続きの持つ属性情報を記憶する記憶手段の記憶情報を参照する参照手段と、
コンパイル対象のステートメントが初期化手続きを必要とするときに、該初期化手続きを特定する特定手段と、
上記記憶手段の記憶する属性情報を持つか持たないかをチェックすることで、上記特定手段の特定した初期化手続きが他のクラスに影響を及ぼさないとみなしてよいものに該当するのかを判断する判断手段と、
上記判断手段が該当する初期化手続きであることを判断するときに、上記ステートメントを該初期化手続きを呼び出さない形に変更するとともに、該初期化手続きを持つクラスに対して、クラスの実行に入る前に該初期化手続きを１回だけ起動することを指示する情報を記録する変更手段として機能させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、初期化手続きを持つ複数のクラスから構成されるプログラムをコンパイルするコンパイル処理装置と、そのコンパイル処理装置を実現するプログラムを記録したコンピュータ読取可能な記録媒体とに関する。
【０００２】
近年のコンピュータシステムのプログラミングの複雑化に伴って、言語仕様として、初期化を義務ずけるものが多くなってきている。これは、プログラマが初期化を意識しなくても、初期化処理が行われることによって、プログラムの誤りを減らそうという意図からきている。
【０００３】
この初期化処理は、最初の一度だけ行えばよいものであるが、それを保証するための機構によりプログラムの実行速度が遅くなることが起こるので、この問題点の解決を図ってプログラムの実行速度の向上を実現していく必要がある。
【０００４】
【従来の技術】
オブジェクト指向プログラムなどのプログラムでは、データと手続きとを備えるカプセル化された複数のクラスからプログラムが構成されている。
【０００５】
このクラスは、メッセージ通信によりデータ処理を実行するものであり、相互に、データの参照と手続きの呼び出しとが可能になっている。
更に、このクラスは、クラスイニシャライザと呼ばれる初期化手続きを有しており、このクラスイニシャライザは、それに係るデータが最初にアクセスされる前や、それに係る手続きが最初に呼び出される前に、一度だけ起動されて初期化処理を実行する。
【０００６】
このクラスイニシャライザの一度だけの起動を保証するために、従来のコンパイラでは、クラスイニシャライザを必要とするステートメントをコンパイルするときに、そのクラスイニシャライザが既に起動済みであるのか否かをチェックするＩＦ文を挿入する構成を採って、そのＩＦ文により、既に起動されていることを判断するときには、そのクラスイニシャライザを呼び出さないように処理し、未だ起動されていないことを判断するときには、そのクラスイニシャライザを呼び出すとともに、そのクラスイニシャライザを持つクラスに起動済みを示すフラグを立てるように処理していた。
【０００７】
また、別の従来技術として、プログラム実行中にクラスイニシャライザを含まない形にプログラムを書き換えることで、クラスイニシャライザの一度だけの起動の保証を実現するという方法を採るものもあった。
【０００８】
【発明が解決しようとする課題】
しかしながら、ＩＦ文を挿入することで、クラスイニシャライザの一度だけの起動を保証するという前者の従来技術に従っていると、クラスイニシャライザの呼び出し回数の可能性が多いときには、その呼び出し毎に、ＩＦ文によるチェック処理が行われることから、プログラムの実行速度が遅くなるという問題点があった。
【０００９】
また、プログラム実行中にクラスイニシャライザを含まない形にプログラムを書き換えることで、クラスイニシャライザの一度だけの起動を保証するという後者の従来技術に従っていると、インタプリンタのように翻訳処理と実行処理とを同時に行うような処理方式の場合には有効であるものの、翻訳処理と実行処理とを分離する処理方式の場合には、プログラムの中に自分自身を書き換える仕組みを入れなければならないとともに、その実行に要する時間によりプログラムの実行速度が遅くなるという問題点があった。
【００１０】
本発明はかかる事情に鑑みてなされたものであって、初期化手続きを持つ複数のクラスから構成されるプログラムをコンパイルする構成を採るときにあって、プログラムの実行速度の向上を実現する新たなコンパイル処理装置の提供と、そのコンパイル処理装置を実現するプログラムを記録した新たなコンピュータ読み取り可能な記録媒体の提供とを目的とする。
【００１１】
【課題を解決するための手段】
この目的を達成するために、本発明のコンパイル処理装置は、初期化手続きを持つ複数のクラスから構成されるプログラムをコンパイルするために、（１）他のクラスに影響を及ぼす初期化手続きの持つ属性情報を記憶する記憶手段と、（２）コンパイル対象のステートメントが初期化手続きを必要とするときに、その初期化手続きを特定する特定手段と、（３）記憶手段の記憶する属性情報を持つか持たないかをチェックすることで、特定手段の特定した初期化手続きが他のクラスに影響を及ぼさないとみなしてよいものに該当するのかを判断する判断手段と、（４）判断手段が該当する初期化手続きであることを判断するときに、コンパイル対象のステートメントをその初期化手続きを呼び出さない形に変更するとともに、その初期化手続きを持つクラスに対して、クラスの実行に入る前にその初期化手続きを１回だけ起動することを指示する情報を記録する変更手段とを備えるように構成する。
次に、図１及び図２を使って、本発明のコンパイル処理装置について説明する。
図１に、本発明のコンパイル処理装置１０の原理構成を図示し、図２に、本発明のコンパイル処理装置１０のコンパイルしたプログラムを実行する本発明に関連するプログラム実行装置３０の装置構成を図示する。
【００１２】
本発明のコンパイル処理装置１０は、初期化手続きを持つ複数のクラスから構成されるプログラムをコンパイルするものである。
【００１３】
本発明のコンパイル処理装置１０は、ソースプログラムを中間テキストに変換するフロントエンド部１１と、フロントエンド部１１の後段に展開されて、初期化手続きを必要とするステートメントについての変更処理を実行する初期化処理部１２と、初期化処理部１２の後段に展開されて、コンパイル処理の最適化を行う最適化部１３と、最適化部１３の後段に展開されて、オブジェクトコードを生成するコード生成部１４とを備える。
【００１４】
この初期化処理部１２は、取出手段１５と、特定手段１６と、判断手段１７と、変更手段１８と、管理手段２０と、登録手段２１と、入手手段２２と、除外手段２３とを備える。さらに、本発明に関連する技術を実現するために記録手段１９を備えることもある。
【００１５】
取出手段１５は、中間テキストに変換されたコンパイル対象のステートメントを１つずつ順番に取り出す。特定手段１６は、取出手段１５の取り出すステートメントの必要とする初期化手続きを特定する。判断手段１７は、特定手段１６の特定する初期化手続きが副作用を持つのか否かを判断する。
【００１６】
変更手段１８は、判断手段１７が副作用を持たない初期化手続きであることを判断するときに、その初期化手続きを必要とするステートメントがその初期化手続きを呼び出さない形になるようにとそのステートメントを変更するとともに、その初期化手続きを持つクラスに対して、クラスの実行に入る前にその初期化手続きを１回だけ起動することを指示する情報を記録する。
【００１７】
記録手段１９は、変更手段１８に代わり、各初期化手続きが他のクラスに影響を及ぼさないとみなしてよいのかを判断して、みなしてよいと判断する初期化手続きを持つクラスに対して、クラスの実行に入る前にその初期化手続きを１回だけ起動することを指示する情報を記録する。
【００１８】
管理手段２０は、副作用を持つ初期化手続きの属性情報を管理（記憶）する。登録手段２１は、対話処理に従って、管理手段２０にデータを登録する。入手手段２２は、初期化手続きの実行回数情報を入手する。除外手段２３は、規定の初期化手続きを判断手段１７の処理対象から外す。
【００１９】
ここで、本発明のコンパイル処理装置１０の持つ機能は具体的にはプログラムで実現されるものであり、このプログラムは、フロッピィディスクなどに記憶されたり、サーバなどのディスクなどに記憶され、それらからコンパイル処理装置１０にインストールされてメモリ上で動作することで、本発明を実現することになる。
【００２０】
一方、本発明に関連するプログラム実行装置３０は、本発明のコンパイル処理装置１０のコンパイルしたプログラム（複数のクラスから構成される）を展開するメモリ３１と、メモリ３１に展開されるクラスの管理を実行するクラス管理機構３２とを備える。
【００２１】
このクラス管理機構３２は、判断手段３３と、起動手段３４とを備える。
判断手段３３は、メモリ３１に展開される各クラスに、本発明のコンパイル処理装置１０の記録する情報（変更手段１８や記録手段１９の記録する情報）が記録されているのか否かを判断する。起動手段３４は、プログラムの実行に先立って、クラスの持つ初期化手続きを起動する。
【００２２】
ここで、本発明に関連するプログラム実行装置３０の持つ機能は具体的にはプログラムで実現されるものであり、このプログラムは、フロッピィディスクなどに記憶されたり、サーバなどのディスクなどに記憶され、それらからプログラム実行装置３０にインストールされてメモリ上で動作することで、本発明に関連する技術を実現することになる。
【００２３】
このように構成される本発明のコンパイル処理装置１０では、取出手段１５がコンパイル対象のステートメントを１つ取り出すと、特定手段１６は、その取り出されたステートメントがクラスの持つ初期化手続きを必要とするのか否かをチェックして、必要とするときには、その初期化手続きを特定する。
【００２４】
この特定手段１６の特定結果を受けて、判断手段１７は、管理手段２０の管理する属性情報を持つか持たないかをチェックすることで、その特定された初期化手続きが他のクラスに影響を及ぼさないとみなしてよいものに該当するのかを判断する。これに該当する初期化手続きは、副作用を持たないものとして扱われることになる。
【００２５】
この判断手段１７の判断結果を受けて、変更手段１８は、副作用を持たない初期化手続きであることを判断されるものについては、その初期化手続きを必要とするステートメントがその初期化手続きを呼び出さない形になるようにとそのステートメントを変更するとともに、その初期化手続きを持つクラスに対して、クラスの実行に入る前にその初期化手続きを１回だけ起動することを指示する情報を記録する。
【００２６】
このとき、除外手段２３は、入手手段２２の入手する実行回数情報に従って、特定手段１６の特定する初期化手続きが実行の可能性の少ないものであると判断されるときには、本発明の処理対象とするまでもないので、その初期化手続きを判断手段１７の処理対象から外す。
【００２７】
一方、このように構成される本発明に関連するプログラム実行装置３０では、メモリ３１に展開されるプログラムの実行が指示されると、判断手段３３は、メモリ３１に展開される各クラスに、本発明のコンパイル処理装置１０の記録する情報（クラスの実行に入る前に初期化手続きを１回だけ起動することを指示する情報）が記録されているのか否かを判断して、記録されていることを判断するときには、その記録されている初期化手続きの実行が指示されていると判断する。
【００２８】
この判断手段３３の判断結果を受けて、起動手段３４は、プログラムの実行に先立って、判断手段３３により初期化手続きの実行を指示する情報が記録されていると判断されるクラスの持つ初期化手続きを起動対象として、プログラムの実行に先立って、それらの初期化手続きを起動する。
【００２９】
このように、本発明では、クラスの持つ初期化手続きの内、副作用のないものについては、プログラムの実行に先立って起動してしまう構成を採るとともに、その副作用のない初期化手続きを必要とするステートメントがその初期化手続きを呼び出さないようにする構成を採ることで、ＩＦ文を使わずに、クラスの持つ初期化手続きの一度だけの起動を保証することを実現する。これによりプログラムの実行速度を向上できるようになる。
【００３０】
【発明の実施の形態】
以下、実施の形態に従って本発明を詳細に説明する。
図３に、本発明のコンパイル処理装置１０の一実施例を図示する。
【００３１】
この実施例に示すように、本発明のコンパイル処理装置１０は、ソースファイル４３に格納されるソースプログラムをコンパイルしてオブジェクトファイル４４に格納するコンパイラ４０と、コンパイラ４０のコンパイル処理に必要となる情報を管理する副作用判断テーブル４１と、端末４５を介してプログラマと対話することで、副作用判断テーブル４１に情報を登録するテーブルデータ登録プログラム４２とを備える。
【００３２】
このコンパイラ４０のコンパイル対象となるプログラムは、図４に示すように、複数のクラス５０から構成され、これらの各クラス５０は、データと手続きとを有してカプセル化され、相互に、データの参照と手続きの呼び出しとが可能になっている。そして、各クラス５０は、クラスイニシャライザ５１と呼ばれる初期化手続きを有している。このクラスイニシャライザ５１は、それに係るデータが最初にアクセスされる前や、それに係る手続きが最初に呼び出される前に、一度だけ起動されて初期化処理を実行する。
【００３３】
これらのクラス５０の中のいずれかのクラス５０に、メインプログラム５２が展開され、このメインプログラム５２は、必要に応じて他のクラス５０に処理要求のメッセージを送信するとともに、その処理結果を受け取ることで規定のデータ処理を実行する。
【００３４】
クラス５０に展開されるクラスイニシャライザ５１は、他のクラス５０に影響を及ぼす場合と、影響を及ぼさない場合とがあり、副作用判断テーブル４１は、他のクラス５０に影響を及ぼすクラスイニシャライザ５１の持つ属性情報を管理する。
【００３５】
例えば、クラスイニシャライザ５１が外部へのポインタを使用している場合や、外部変数を使用している場合や、外部呼び出しを行っている場合には、他のクラス５０に影響を及ぼすことになる。副作用判断テーブル４１は、このような属性情報を管理するのである。
【００３６】
この実施例では、コンパイラ４０のコンパイル対象となるプログラムとして、Java（Sun Microsystems,Incの開発したプログラム言語）を想定している。これから、副作用判断テーブル４１は、図５に示すように、自クラス５０以外のクラス５０の持つデータをアクセスしている場合には、他のクラス５０に影響を及ぼすクラスイニシャライザ５１であり、自クラス５０以外のクラス５０の持つ手続きを呼び出している場合には、他のクラス５０に影響を及ぼすクラスイニシャライザ５１であるというような属性情報を管理することになる。
【００３７】
後述することから分かるように、この副作用判断テーブル４１に登録されていない属性情報を持つクラスイニシャライザ５１は、たとえ、他のクラス５０に影響を及ぼすものであっても、他のクラス５０に影響を及ぼさないものとして扱われることになる。
【００３８】
これから、テーブルデータ登録プログラム４２は、プログラマと対話することで、副作用判断テーブル４１に属性情報を登録するときに、他のクラス５０に影響を及ぼす可能性があっても、その可能性が極めて小さいものとなる属性情報については、その登録を省略することで、その属性情報を持つクラスイニシャライザ５１については、他のクラス５０に影響を及ぼさないものとして扱うようにすることが可能である。
【００３９】
また、後述することから分かるように、他のクラス５０に影響を及ぼす可能性があるクラスイニシャライザ５１を影響のないものとして扱う構成を採ると、プログラムエラーが発生する可能性はあるものの、プログラムの実行速度が向上することになる。
【００４０】
この点を考慮して、テーブルデータ登録プログラム４２は、図６に示すように、副作用判断テーブル４１に対して、属性情報に対応付けて他のクラス５０への影響度合いを示すレベル情報を登録することで、プログラムエラーの発生とプログラムの実行速度の向上との兼ね合いを図る構成を採ることがある。
【００４１】
図７及び図８に、本発明を実現するためにコンパイラ４０が実行する処理フローの一実施例を図示する。次に、この処理フローに従って、本発明のコンパイル処理装置１０の実行する処理について詳細に説明する。
【００４２】
コンパイラ４０は、ソースファイル４３に格納されるソースプログラムのコンパイル要求があると、そのプログラムを構成するクラスを順番に１つずつ選択して、図７及び図８の処理フローを実行することでコンパイル処理を実行する。
【００４３】
すなわち、コンパイラ４０は、コンパイル対象のクラスを選択すると、図７及び図８の処理フローに示すように、先ず最初に、ステップ１で、そのクラスのソースプログラム（Javaで言うバイトコード）をソースファイル４３から読み出して中間テキストに変換する。
【００４４】
続いて、ステップ２で、先頭からの順番に従って未処理の中間テキストを１つ取り出し、続くステップ３で、全ての中間テキストの取り出しを終了したのか否かを判断する。
【００４５】
このステップ３で、全ての中間テキストの取り出しを終了していないことを判断するとき、すなわち、ステップ２で未処理の中間テキストを選択できたことを判断するときには、ステップ４に進んで、その中間テキストがクラスイニシャライザ５１を必要としているのか否かを判断する。この判断処理は、中間テキストの種別を判断することで行われる。
【００４６】
例えば、Javaの「getstatic 」や「putstatic 」といった命令は、クラスイニシャライザ５１の動く可能性のあることが文法で決められているので、この命令を持つ中間テキストについては、クラスイニシャライザ５１を必要としていると判断することになる。
【００４７】
このステップ４で、中間テキストがクラスイニシャライザ５１を必要としていないことを判断するときには、次の中間テキストの処理に進むべく、ステップ２に戻る。
【００４８】
一方、ステップ４で、中間テキストがクラスイニシャライザ５１を必要としていることを判断するときには、ステップ５に進んで、必要としているクラスイニシャライザ５１がどのクラス５０のものであるのかを見つける。この特定処理は、コンパイラ４０の持つシンボルテーブルを参照することで実行される。
【００４９】
Javaのバイトコードのオペランドには、そのシンボルテーブルのエントリー位置を指すインデックスが入っているので、このインデックスを使ってシンボルテーブルを参照することで、必要としているクラスイニシャライザ５１を持つクラス５０を見つけることができる。例えば、「getstatic ＃８」の指すシンボルテーブルのエントリー位置から、必要としているクラスイニシャライザ５１がクラスａ（a.class)の持つクラスイニシャライザ５１であることを見つけるのである。
【００５０】
ステップ５で、中間テキストの必要としているクラスイニシャライザ５１を持つクラス５０を見つけると、続いて、ステップ６で、そのクラス５０に、そのクラスイニシャライザ５１の副作用の有無情報が記録されているのか否かをチェックする。この副作用の有無情報の記録は、後述するステップ８／ステップ１０で記録するものであるが、既に、別のクラス５０をコンパイルするときや、同一のクラス５０の別の中間テキストをコンパイルするときに記録している可能性があるので、このステップ６では、既に記録しているのか否かをチェックするのである。
【００５１】
このステップ６で、副作用の有無情報が記録されていないことを判断するときには、ステップ７に進んで、中間テキストの必要としているクラスイニシャライザ５１が副作用を持つのか否かを判断する。この判断処理は、副作用判断テーブル４１を参照することで行う。
【００５２】
すなわち、副作用判断テーブル４１には、他のクラス５０に影響を及ぼすクラスイニシャライザ５１の持つ属性情報が管理されているので、この属性情報を持つクラスイニシャライザ５１であるのか否かを判断して、属性情報を持つことを判断するときには、副作用を持つクラスイニシャライザ５１と判断し、属性情報を持たないことを判断するときには、副作用を持たないクラスイニシャライザ５１と判断することで行う。
【００５３】
このとき、副作用判断テーブル４１が、図６に示すように、属性情報に対応付けて他のクラス５０への影響度合いを示すレベル情報を管理することがあり、このとき、プログラマから、レベル情報が指定されることがあるので、そのときには、指定されるレベル情報の規定する属性情報（最も副作用の大きいレベルから指定されるレベルまでの属性情報）を使って判断処理を実行することになる。
【００５４】
このステップ７で、中間テキストの必要としているクラスイニシャライザ５１が副作用を持たないことを判断するときには、ステップ８に進んで、そのクラスイニシャライザ５１を持つクラス５０に、自クラス５０の持つクラスイニシャライザ５１が副作用を持たないことを記録し、続くステップ９で、その中間テキストがそのクラスイニシャライザ５１を呼び出さない形になるようにとその中間テキストのコードを変更する。そして、次の中間テキストの処理に進むべく、ステップ２に戻る。
【００５５】
一方、ステップ７で、中間テキストの必要としているクラスイニシャライザ５１が副作用を持つことを判断するときには、ステップ１０に進んで、そのクラスイニシャライザ５１を持つクラス５０に、自クラス５０の持つクラスイニシャライザ５１が副作用を持つことを記録してから、そのまま、次の中間テキストの処理に進むべく、ステップ２に戻る。
【００５６】
一方、ステップ６で、中間テキストの必要としているクラスイニシャライザ５１を持つクラス５０に、副作用の有無情報が記録されていることを判断するときには、ステップ７の判断処理を実行するまでもないので、ステップ１１に進んで、その記録される副作用の有無情報から、そのクラスイニシャライザ５１が副作用を持つのか否かを判断する。
【００５７】
そして、このステップ１１で、中間テキストの必要としているクラスイニシャライザ５１が副作用を持たないことを判断するときには、ステップ１２（図８の処理フロー）に進んで、その中間テキストがそのクラスイニシャライザ５１を呼び出さない形になるようにとその中間テキストのコードを変更してから、次の中間テキストの処理に進むべくステップ２に戻り、一方、副作用を持つことを判断するときには、そのまま、次の中間テキストの処理に進むべくステップ２に戻る。
【００５８】
このようにして、必要に応じて中間コードの変更処理を実行していくことで、ステップ３で、コンパイル対象のクラス５０の持つ全中間テキストについての処理終了を判断すると、ステップ１３（図８の処理フロー）に進んで、そのコンパイル対象のクラス５０に、そのクラス５０の持つクラスイニシャライザ５１の副作用の有無情報が記録されているのか否かをチェックする。
【００５９】
このステップ１３で、副作用の有無情報が記録されていないことを判断するときには、ステップ１４に進んで、上述したステップ７と同一の処理を実行することで、コンパイル対象のクラス５０の持つクラスイニシャライザ５１が副作用を持つのか否かを判断して、副作用を持たないことを判断するときには、ステップ１５に進んで、そのクラス５０に、自クラス５０の持つクラスイニシャライザ５１が副作用を持たないことを記録し、一方、副作用を持つことを判断するときには、ステップ１６に進んで、そのクラス５０に、自クラス５０の持つクラスイニシャライザ５１が副作用を持つことを記録する。
【００６０】
そして、ステップ１５／ステップ１６の処理を終了するか、ステップ１３で、副作用の有無情報が記録されていることを判断すると、ステップ１７に進んで、コンパイルの最適化処理を行い、続くステップ１８で、コード生成処理を行うことで、コンパイル対象のクラス５０のオブジェクトコードを生成して処理を終了する。
【００６１】
コンパイラ４０は、各クラス５０に対して、この図７及び図８の処理フローを実行することでコンパイル処理を実行する。
このようにして、本発明のコンパイラ４０は、副作用を持たないクラスイニシャライザ５１を必要とする中間テキストについては、その中間テキストがそのクラスイニシャライザ５１を呼び出さない形になるようにとその中間テキストのコードを変更していくとともに、そのクラスイニシャライザ５１を持つクラス５０に、そのクラスイニシャライザ５１が副作用を持たない旨の情報を記録していくように処理するのである。
【００６２】
ここで、図７及び図８の処理フローでは、コンパイラ４０は、クラスイニシャライザ５１が副作用を持つのか否かを検出し、その検出結果に応じて中間テキストの変更処理を実行していくときに、それと同期をとって、その検出結果をクラス５０に記録していく構成を採ったが、中間テキストの変更処理とは全く切り離して、その変更処理の前あるいは後に、各クラス５０の持つクラスイニシャライザ５１が副作用を持つのか否かを検出して、それをクラス５０に記録していく構成を採ることも可能である。
【００６３】
次に、本発明のコンパイル処理装置１０のコンパイルしたプログラムを実行する、本発明に関連するプログラム実行装置３０の一例について説明する。
図９に、この本発明に関連するプログラム実行装置３０の一例を図示する。
【００６４】
この図に示すように、本発明に関連するプログラム実行装置３０は、本発明のコンパイル処理装置１０のコンパイルしたプログラムを入手して主記憶６１に格納する入手プログラム６０と、主記憶６１に格納される複数のクラス５０で構成されるプログラムの管理処理を実行するクラス管理プログラム６２とを備える。
【００６５】
このクラス管理プログラム６２は、Mainから開始されるプログラムを制御することでデータ処理を実行するクラス制御プログラム６３と、クラス５０の持つクラスイニシャライザ５１の起動処理を実行するクラスイニシャライザ起動プログラム６４とを備える。
【００６６】
図１０に、クラスイニシャライザ起動プログラム６４の実行する処理フローの一例を図示する。次に、この処理フローに従って、本発明に関連するプログラム実行装置３０の実行する処理について詳細に説明する。
【００６７】
クラスイニシャライザ起動プログラム６４は、クラス制御プログラム６３に対してプログラムの起動要求が発行されると、図１０の処理フローに示すように、先ず最初に、ステップ１で、主記憶６１に格納されるクラス５０の中から未処理のものを１つ取り出し、続くステップ２で、全てのクラス５０の取り出しを終了したのか否かを判断する。
【００６８】
このステップ２で、全てのクラス５０の取り出しを終了していないことを判断するとき、すなわち、ステップ１で未処理のクラス５０を選択できたことを判断するときには、ステップ３に進んで、その取り出したクラス５０に記録される副作用の有無情報を読み出す。すなわち、上述したように、本発明のコンパイル処理装置１０によりコンパイルされると、クラスイニシャライザ５１が副作用を持つのか否かを示す情報がクラス５０に記録されることになるので、この副作用の有無情報を読み出すのである。
【００６９】
続いて、ステップ４で、ステップ３で読み出した副作用の有無情報が副作用無しを表示しているのか否かを判断し、副作用の有りを表示していることを判断するときには、次のクラス５０の処理に進むべくステップ１に戻り、副作用の無しを表示していることを判断するときには、ステップ５に進んで、ステップ１で取り出したクラス５０の持つクラスイニシャライザ５１を起動してから、次のクラス５０の処理に進むべくステップ１に戻る。
【００７０】
そして、ステップ２で、全てのクラス５０の取り出しの終了を判断すると、ステップ６に進んで、クラス制御プログラム６３に制御を渡すことでMainに制御を渡して処理を終了する。
【００７１】
このようにして、クラスイニシャライザ起動プログラム６４は、本発明のコンパイル処理装置１０により検出される副作用を持たないクラスイニシャライザ５１については、プログラムの実行に先立って起動してしまうように処理するのである。
【００７２】
このように、本発明では、クラスイニシャライザ５１の内、副作用のないものについては、プログラムの実行に先立って起動してしまう構成を採るとともに、その副作用のないクラスイニシャライザ５１を必要とするプログラム部分がそのクラスイニシャライザ５１を呼び出さないようにする構成を採ることで、ＩＦ文を使わずに、クラスイニシャライザ５１の一度だけの起動の保証を実現するのである。
【００７３】
次に、具体的なJavaのプログラムに従って、本発明について更に詳細に説明する。
図１１に示すようなクラスａとクラスｂとで構成されるプログラムを想定する。
【００７４】
このクラスａは、Mainのプログラム部分で、クラスｂで定義する変数ｉの値の１つインクリメントして、それをクラスｂに書き戻すという処理を行う。また、”ＳＴＡＲＴ”という文字列を表示するというクラスイニシャライザ５１（ＣＩ）を持っている。
【００７５】
一方、クラスｂは、変数ｉは他のクラス５０から参照可能な変数であることを定義するとともに、変数ｉをプリントするという処理を行う。また、変数ｉをゼロにリセットするというクラスイニシャライザ５１（ＣＩ）を持っている。
【００７６】
なお、「static（）」という名前がクラスイニシャライザ５１であることを示している。
このプログラムを受け取ると、コンパイラ４０は、図１２に示すようなクラスａの中間テキストを生成するとともに、図１３に示すようなクラスｂの中間テキストを生成する。
【００７７】
図１２に示すクラスａの中間テキストについて説明するならば、「getstatic ＃８」を使ってシンボルテーブルにアクセスすることで、クラスｂから変数ｉの値を取り込めばよいことが分かる。また、「putstatic ＃８」を使ってシンボルテーブルにアクセスすることで、クラスｂの変数ｉに値を書き込めばよいことが分かる。また、「invokestatic＃10」を使ってシンボルテーブルにアクセスすることで、「print （）」という手続きの詳細を得ることができる。また、「getstatic ＃９」を使ってシンボルテーブルにアクセスすることで、出力先がどこであるかが分かる。また、「ldc ＃１」を使ってシンボルテーブルにアクセスすることで、出力する文字列が分かる。また、「invokevirtual ＃11」を使ってシンボルテーブルにアクセスすることで、「println （）」という手続きの詳細を得ることができる。
【００７８】
また、図１３に示すクラスｂの中間テキストについて説明するならば、「getstatic ＃７」を使ってシンボルテーブルにアクセスすることで、出力先がどこになるかが分かる。また、「getstatic ＃６」を使ってシンボルテーブルにアクセスすることで、変数ｉの値を取り込めばよいことが分かる。また、「invokevirtual ＃８」を使ってシンボルテーブルにアクセスすることで、「println （）」という手続きの詳細を得ることができる。また、「putstatic ＃６」を使ってシンボルテーブルにアクセスすることで、変数ｉにゼロを書き込めばよいことが分かる。
【００７９】
コンパイル４０は、各クラス５０の持つクラスイニシャライザ５１が副作用を持つか否かを判断する。
クラスａの持つクラスイニシャライザ５１については、「invokevirtual ＃11」という中間テキストを持ち、この「invokevirtual 」は他のクラス５０をアクセスする可能性があるので、副作用を持つと判断する。一方、クラスｂの持つクラスイニシャライザ５１については、副作用を持たない「iconst ０」／「return」という中間テキストと、自クラスａをアクセスすることで副作用を持たない「putstatic 」という中間テキストとを持つので、副作用を持たないと判断する。
【００８０】
コンパイラ４０は、中間テキストをコンパイルしていくときに、副作用を持たないクラスイニシャライザ５１を必要とする中間テキストが見つかると、その中間テキストがそのクラスイニシャライザ５１を呼び出さない形になるようにとその中間テキストのコードを変更する。
【００８１】
この具体例の場合、クラスａがクラスｂの変数ｉを必要とし、変数ｉの値をゼロにリセットする処理を行うクラスｂのクラスイニシャライザ５１は副作用を持たないことから、変数ｉを必要とするクラスａの持つ中間テキストがクラスｂのクラスイニシャライザ５１を呼び出さない形になるようにと、その中間テキストのコードを変更する。この変更に従って、図１２に示したクラスａの中間テキストは、クラスイニシャライザ５１の呼び出しを行わないことを指示する「quick 」を使って、図１４の矢印に示すものに変更されることになる。
【００８２】
このようにして、図１１に示したクラスａとクラスｂのソースプログラムは、図１５に示すようなオブジェクトコードにコンパイルされることになる。ここで、図中に示す「a.Init flg ＝ＯＦＦ」は、クラスａのクラスイニシャライザ５１が副作用を持つことを示し、「b.Init flg ＝ＯＮ」は、クラスｂのクラスイニシャライザ５１が副作用を持たないことを示している。
【００８３】
図中のα部分のプログラムは、クラスイニシャライザ起動プログラム６４の実行用に生成されるプログラムであり、クラスイニシャライザ起動プログラム６４は、このプログラムに従って、クラスａの持つ「a.Init＿flg 」に副作用を持つ旨を示すＯＦＦが設定されているときには、プログラムの実行に入ってから、クラスａの持つクラスイニシャライザ５１を起動する。一方、クラスｂの持つ「b.Init＿flg 」に副作用を持たない旨を示すＯＮが設定されているときには、プログラムの実行前に、クラスｂの持つクラスイニシャライザ５１を起動する。この起動処理に従って、クラスｂの持つクラスイニシャライザ５１がプログラムの実行前に起動されることになる。
【００８４】
このようにして、本発明によれば、ＩＦ文を使わずに、クラス５０の持つクラスイニシャライザ５１の一度だけの起動を保証できるようになる。
これに対して、従来技術では、図１６に示すように、ＩＦ文を使うことで、クラスイニシャライザ５１が既に起動済みであるのか否かをチェックする構成を採って、既に起動されていることを判断するときには、そのクラスイニシャライザ５１を呼び出さないように処理し、未だ起動されていないことを判断するときには、そのクラスイニシャライザ５１を呼び出すとともに、そのクラスイニシャライザ５１に起動済みを示すフラグを立てるように処理するという構成を採っているので、その都度ＩＦ文によるチェック処理が行われることで、プログラムの実行速度が遅くなるという問題点があった。
【００８５】
以上に説明した実施例では、基本的に、全てのクラスイニシャライザ５１を処理対象とする構成を採ったが、実行の可能性の少ないクラスイニシャライザ５１については処理対象から外すことで、コンパイル時間の短縮を図る方法を採ることも可能である。
【００８６】
例えば、プロファイル結果などを参考にして、実行の可能性の少ないクラスイニシャライザ５１を特定し、それを処理対象から外すと、コンパイル時間の短縮が図られることになる。実行の可能性の少ないクラスイニシャライザ５１については、実行される可能性が少ないので、ＩＦ文を挿入する従来技術に従ってもプログラムの実行速度に与える影響が殆どなく、実質的に問題とならないからである。
【００８７】
図示実施例に従って本発明を説明したが、本発明はこれに限定されるものではない。例えば、実施例に言うクラスとは、オブジェクト指向プログラムに言うクラスに限られるものではなくて、広い意味でのカプセル化されたものを言うものである。
【００８８】
【発明の効果】
以上説明したように、本発明では、クラスイニシャライザを持つ複数のクラスから構成されるプログラムを使ってデータ処理を実行する構成を採るときにあって、クラスの持つクラスイニシャライザの内、副作用のないものについては、プログラムの実行に先立って起動してしまう構成を採るとともに、その副作用のないクラスイニシャライザを必要とするプログラム部分がそのクラスイニシャライザを呼び出さないようにする構成を採ることで、ＩＦ文を使わずに、クラスイニシャライザの一度だけの起動を保証できるようになる。これによりプログラムの実行速度を向上できるようになる。
【図面の簡単な説明】
【図１】  本発明のコンパイル処理装置の原理構成図である。
【図２】  本発明に関連するプログラム実行装置の装置構成図である。
【図３】  本発明の一実施例である。
【図４】  コンパイル対象のプログラムの説明図である。
【図５】  副作用判断テーブルの説明図である。
【図６】  副作用判断テーブルの説明図である。
【図７】  コンパイラの実行する処理フローである。
【図８】  コンパイラの実行する処理フローである。
【図９】  本発明に関連するプログラム実行装置の一例である。
【図１０】  クラスイニシャライザ起動プログラムの実行する処理フローである。
【図１１】  本発明の処理説明図である。
【図１２】  本発明の処理説明図である。
【図１３】  本発明の処理説明図である。
【図１４】  本発明の処理説明図である。
【図１５】  本発明の処理説明図である。
【図１６】  従来技術の説明図である。
【符号の説明】
１０  コンパイル処理装置
１１  フロントエンド部
１２  初期化処理部
１３  最適化部
１４  コード生成部
１５  取出手段
１６  特定手段
１７  判断手段
１８  変更手段
１９  記録手段
２０  管理手段
２１  登録手段
２２  入手手段
２３  除外手段
３０  プログラム実行装置
３１  メモリ
３２  クラス管理機構
３３  判断手段
３４  起動手段
【図１】
0003910701.tif 000002
【図２】
0003910701.tif 000003
【図３】
0003910701.tif 000004
【図４】
0003910701.tif 000005
【図５】
0003910701.tif 000006
【図６】
0003910701.tif 000007
【図７】
0003910701.tif 000008
【図８】
0003910701.tif 000009
【図９】
0003910701.tif 000010
【図１０】
0003910701.tif 000011
【図１１】
0003910701.tif 000012
【図１２】
0003910701.tif 000013
【図１３】
0003910701.tif 000014
【図１４】
0003910701.tif 000015
【図１５】
0003910701.tif 000016
【図１６】
0003910701.tif 000017