(57)【要約】【課題】特にマルチコア環境において、静的解析結果と動的解析結果を組合わせて利用し、精度良く重要度の高いプログラムブロック（ＰＢ）の事前コンパイルを行い、プログラムを高速化する技術を提供する。【解決手段】プログラム実行担当のタスクで、中間コードもしくはネイティブコードを入力してプログラムを実行し、ＰＢ毎の「ループ繰返し回数」と「ＰＢ実行回数」から成る「動的情報」を抽出する。次に、プログラムの事前コンパイル担当のタスクで、中間コードを入力して静的解析の結果抽出した「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」、および「当該ＰＢに含まれる全ループの重みの合計」と「当該ＰＢ実行回数」の積から成る「ＰＢ重み」と、前記動的情報を組合わせてＰＢ毎の重要度を決定し、この実行時に遂次更新する重要度順に従って事前コンパイルしてネイティブコードを出力し、これをプログラム実行担当のタスクで活用する。【選択図】図１
2007334643.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムから変換された中間コードを入力し、プログラム実行を担当するタスクとプログラムの事前コンパイルを担当するタスクを割当てる第１のステップと、
中間コードもしくはネイティブコードを入力してプログラムを実行し、プログラムブロック毎の「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を抽出する第２のステップと、
中間コードを入力し、静的解析の結果抽出した「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」、および「当該プログラムブロックに含まれる全ループの重みの合計」と「当該プログラムブロック実行回数」の積から成る「プログラムブロック重み」と、前記「動的情報」を組合わせてプログラムブロック毎の重要度を決定し、この実行時に遂次更新する重要度順に従って事前コンパイルしてネイティブコードを出力する第３のステップとを有することを特徴とするプログラム実行方法。
【請求項２】
請求項１記載のプログラム実行方法において、
前記第３のステップは、プログラムブロック毎の重要度順をベースに動的情報として検出する項目の範囲を決定するステップを有し、
上記第２のステップは、前記動的情報の検出範囲に従って検出する動的情報の範囲を変更するステップを有することを特徴とするプログラム実行方法。
【請求項３】
ソースプログラムから変換された中間コードを入力し、プログラム実行を担当するタスクとプログラムの事前コンパイルを担当するタスクを割当てる第１のステップと、
中間コードもしくはネイティブコードを入力してプログラムを実行し、プログラムブロック毎の「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を抽出する第２のステップと、
中間コードを入力し、静的解析の結果抽出した「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」、および「当該プログラムブロックに含まれる全ループの重みの合計」と「当該プログラムブロック実行回数」の積から成る「プログラムブロック重み」と、前記「動的情報」を組合わせてプログラムブロック毎の重要度を決定し、この実行時に遂次更新する重要度順に従って事前コンパイルしてネイティブコードを出力する第３のステップとを計算機に実行させることを特徴とするプログラム。
【請求項４】
請求項３記載のプログラムにおいて、
前記第３のステップは、プログラムブロック毎の重要度順をベースに動的情報として検出する項目の範囲を決定するステップを前記計算機に実行させ、
上記第２のステップは、前記動的情報の検出範囲に従って検出する動的情報の範囲を変更するステップを前記計算機に実行させることを特徴とするプログラム。
【請求項５】
ソースプログラムから変換された中間コードを入力し、プログラム実行を担当するタスクとプログラムの事前コンパイルを担当するタスクを割当てる第１の手段と、
中間コードもしくはネイティブコードを入力してプログラムを実行し、プログラムブロック毎の「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を抽出する第２の手段と、
中間コードを入力し、静的解析の結果抽出した「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」、および「当該プログラムブロックに含まれる全ループの重みの合計」と「当該プログラムブロック実行回数」の積から成る「プログラムブロック重み」と、前記「動的情報」を組合わせてプログラムブロック毎の重要度を決定し、この実行時に遂次更新する重要度順に従って事前コンパイルしてネイティブコードを出力する第３の手段とを有することを特徴とするプログラム実行システム。
【請求項６】
請求項５記載のプログラム実行システムにおいて、
前記第３の手段は、プログラムブロック毎の重要度順をベースに動的情報として検出する項目の範囲を決定する手段を有し、
上記第２の手段は、前記動的情報の検出範囲に従って検出する動的情報の範囲を変更する手段を有することを特徴とするプログラム実行システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム実行技術に関し、特に、重要度ベース事前コンパイルプログラム実行方法、プログラム、およびプログラム実行システムに適用して有効な技術に関する。
【背景技術】
【０００２】
中間コードを高速に実行させるプログラム実行方法として、例えばＪａｖａ（登録商標）の場合、実行時にメソッドの実行回数をカウントし、閾値を超えた際にコンパイルし、以降コンパイル結果であるネイティブコードを利用することで高速化するＪＩＴと呼ばれる方法が存在する。さらに特許文献１に記載の方法では、ＪＩＴコンパイラのコンパイル部分を事前のアイドル時間を利用して、１つだけコンパイルして利用する。これにより、コンパイル時間なしにネイティブコードが利用できコンパイル時間分高速化できる。
【０００３】
また、特許文献２に記載の方法では、実行用タスク、コンパイル用タスクを設け、前者を優先して処理し、コンパイル対象箇所の１回目の実行はインタプリタ処理、２回目以降はコンパイル結果を利用して処理する。これにより、「コンパイル時間＋ネイティブコード実行時間−インタプリタ処理時間」分高速化される。
【０００４】
また、特許文献３に記載の方法では、静的解析によりプログラム中の実行回数の多い部分を見積り、これをベースに優先順位を付けて事前コンパイルする。これにより、実行時にネイティブコードが準備されている場合、コンパイル時間分高速化される。
【特許文献１】特開平１１−２３７９８９号公報
【特許文献２】特開２００４−３５５２７７号公報
【特許文献３】特開２００４−３２６７６０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
一般にマルチコア環境では、シングルコア環境に比べてＣＰＵパワーを多く利用できる。上記従来技術では、マルチコア環境を想定しておらず、実行時に積極的にコンパイルする戦略を取っていない。よって、どの従来技術も事前コンパイルによる高速化の効果は限定的である。特許文献３に記載の方法は、他の２件に比べて効果が大きいと考えられるが、静的な解析によるループネスト数でプログラムブロック毎の優先順位を決定しているため、精度が不十分であり、高速化に関して大きな効果を得ることができない。また、静的解析による起動時間の増大が予想され、十分な高速化が得られない可能性がある。
【０００６】
そこで、本発明は、上記事情に鑑みてなされたものであり、その目的は、特にマルチコア環境において、プログラム実行用コア（ＣＰＵ）とは別のコアで、静的解析結果と動的解析結果を組合わせて利用し、精度良く重要度の高いプログラムブロックの事前コンパイルを行い、プログラムを高速化することにある。
【０００７】
本発明の前記ならびにその他の目的と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【０００８】
本願において開示される発明のうち、代表的なものの概要を簡単に説明すれば、次のとおりである。
【０００９】
本発明は上記課題を解決すべく、プログラム実行を担当するタスクで、中間コードもしくはネイティブコードを入力してプログラムを実行し、プログラムブロック毎の「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を抽出する。次に、プログラムの事前コンパイルを担当するタスクで、中間コードを入力して静的解析の結果抽出した「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」、および「当該プログラムブロックに含まれる全ループの重みの合計」と「当該プログラムブロック実行回数」の積から成る「プログラムブロック重み」と、前記動的情報を組合わせてプログラムブロック毎の重要度を決定し、この実行時に遂次更新する重要度順に従って事前コンパイルしてネイティブコードを出力し、このネイティブコードをプログラム実行を担当するタスクで活用する。
【発明の効果】
【００１０】
本願において開示される発明のうち、代表的なものによって得られる効果を簡単に説明すれば以下のとおりである。
【００１１】
本発明によれば、特にマルチコア環境において、静的解析によって抽出される「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」と、「当該プログラムブロックに含まれるループ重みの合計」と「当該プログラムブロックの実行回数」の積から成る「プログラムブロック重み」と、「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を組合わせてプログラムブロック毎の重要度を精度良く決定し、これに従った事前コンパイル結果を利用することにより、プログラムの高速実行が可能となる。
【００１２】
また、前記重要度からプログラムブロック毎の動的情報として取得する項目の範囲を分類し、重要度が低いプログラムブロックの取得すべき動的情報項目を限定することで、プログラム実行時の重要度が低いプログラムブロックの動的情報取得コストを低減させることにより、さらなるプログラムの高速実行が可能となる。
【発明を実施するための最良の形態】
【００１３】
以下、本発明の実施の形態を図面に基づいて詳細に説明する。なお、これにより本発明が限定されるものではない。
【００１４】
本発明の実施の形態では、プログラム実行システムについて述べる。
【００１５】
図１は、本実施の形態のプログラム実行システムの概要を示すブロック図である。本発明は、計算機上で実施され、静的情報と動的情報を組合わせて精度良くプログラムブロックの重要度を見積もり、これを基に積極的に事前コンパイルを実施してプログラム実行を高速化する方法である。
【００１６】
図１において、仮想マシン２は、高級言語で記述されたソースプログラムを変換した中間コード１を入力し実行する。仮想マシン２は、中間コード１の実行を担当するタスクと事前コンパイルを担当するタスクをマルチコア環境において任意のコア（ＣＰＵ）に割当てるタスク割当部３と、中間コード１の実行を制御する実行制御部４と、中間コード１の事前コンパイルを制御する事前コンパイル制御部６と、「ループ繰返し回数」と「プログラムブロック実行回数」から成る動的情報２１と、プログラムブロック毎の「重要度順位」と「プログラムブロック名称」と「重要度ポイント」と「コンパイル済みフラグ」と「動的情報解析範囲コード」から成るプログラムブロック重要度情報２２と、中間コード１のコンパイル結果であるネイティブコード２３から構成される。
【００１７】
また、実行制御部４は動的情報の検出を行う動的情報検出部５を含み、事前コンパイル制御部６は中間コード１を入力し静的解析を行ってプログラムブロック重要度情報２２を出力する静的解析部７と、プログラムブロック重要度情報２２と動的情報２１と中間コード１を入力しコンパイルしてネイティブコード２３を出力するコンパイル部８から構成される。さらにコンパイル部８は中間コード１と動的情報２１とプログラムブロック重要度情報２２を入力して動的解析を行いプログラムブロック重要度情報２２を更新して出力する動的解析部９と、プログラムブロック重要度情報２２を入力して動的情報検出範囲の決定を行い結果をプログラムブロック重要度情報２２に反映させて出力する動的情報検出範囲決定部１０から構成される。なお、各図において、プログラムブロックはＰＢと図示する。
【００１８】
図２〜図１６により、本発明の重要度ベース事前コンパイルプログラム実行方法の第一実施例を説明する。
【００１９】
図２は、図１におけるタスク割当部３の動作フローチャートである。図２を用いて、仮想マシン２起動後実施されるタスク割当処理の流れを説明する。
【００２０】
まず、処理ステップ３１で動的情報更新フラグに“ＦＡＬＳＥ”を設定する。次に、処理ステップ３２でコア番号を判定し、“１”の場合、処理ステップ３４へ進み中間コード１の実行処理を実施し、その後本タスク割当処理を終了する。処理ステップ３２でコア番号が“１”以外の場合、処理ステップ３３に進む。次に、処理ステップ３３でコア番号を判定し“２”の場合、処理ステップ３５へ進み中間コード１の事前コンパイル処理を実施し、その後本タスク割当処理を終了する。処理ステップ３３でコア番号が“２”以外の場合、本タスク割当処理を終了する。
【００２１】
図３は、図１における実行制御部４の動作フローチャートである。図３を用いて、中間コード１の実行制御処理の流れを説明する。
【００２２】
まず、処理ステップ４１で中間コード１を入力する。次に、処理ステップ４２で動的情報として「ループ繰返し回数」と「プログラムブロック実行回数」を検出する。なお、本実施例では動的情報として上記２件を例に挙げて説明するが、これに限定するものではなく「ＩＦ文分岐確率」やＪａｖａ（登録商標）仕様でいう「仮想メソッドの割当て」や「例外発生回数」など様々な項目の適用が考えられる。処理ステップ４２の詳細は、図９を用いて後述する。次に、処理ステップ４３でプログラムブロック重要度情報を入力する。次に、処理ステップ４４で当該プログラムブロックがコンパイル済みか否か判定し、コンパイル済みの場合、処理ステップ４５へ進みコンパイル済みネイティブコードを実行する。
【００２３】
次に、処理ステップ４６で他にプログラムブロックが存在するか否か判定する。存在する場合、処理ステップ４２に戻る。上記処理を繰り返す。処理ステップ４６で存在しない場合、本実行制御処理を終了する。処理ステップ４４でコンパイル済みでない場合、処理ステップ４７に進む。処理ステップ４７では当該プログラムブロックの実行回数が閾値以上か否か判定し、閾値以上の場合、処理ステップ４８に進み当該プログラムブロックのコンパイルを行う。その後処理ステップ４５に進む。処理ステップ４７で閾値未満の場合、処理ステップ４９に進みインタープリタで解釈、実行する。その後処理ステップ４６に進む。
【００２４】
図４は、図１における事前コンパイル制御部６の動作フローチャートである。図４を用いて、中間コード１の事前コンパイル制御処理の流れを説明する。
【００２５】
まず、処理ステップ６１で中間コード１を入力する。次に、処理ステップ６２で中間コード１の静的解析を行う。ここでは、プログラムブロック毎の重みの見積もり、プログラムブロック重みを利用した重要度順位の決定を行う。「プログラムブロック重み」とは、「当該プログラムブロックに含まれる全ループの重み」と「当該プログラムブロックの実行回数（暫定値は１とする）」の積であり、「ループ重み」とは、「ループ本体演算量」と「ループ繰返し回数（暫定値は１０とする）」の積である。なお、処理ステップ６２の詳細は、図５を用いて後述する。
【００２６】
次に、処理ステップ６３でプログラムブロック重要度順にプログラムブロックのコンパイルを実施する。ここでは、動的情報が取得できた場合、プログラムブロック重要度の再見積もり、重要度順位の再決定を行う。また、動的情報検出範囲の決定を行う。処理ステップ６３の詳細は、図１２を用いて後述する。次に、処理ステップ６４において中間コード１の実行中であるか否かを判定し、実行中の場合、処理ステップ６３に戻り、上記処理を繰り返す。処理ステップ６４において実行が完了している場合、本事前コンパイル制御処理を終了する。
【００２７】
図５は、図１における静的解析部７の動作フローチャートである。図５を用いて、静的解析処理の流れを説明する。
【００２８】
まず、処理ステップ７０１で中間コード１を入力する。本実施例では、図６に示すＪａｖａ（登録商標）言語で記述されたソースプログラムから変換された中間コードが入力された場合を想定して説明する。なお、Ｊａｖａ（登録商標）では、中間コードに相当するコードをバイトコードと呼んでいる。Ｊａｖａ（登録商標）ソースプログラムからバイトコードへ変換する方法については、サン・マイクロシステムズ社などから公開された周知の技術であるため、本明細書では説明を割愛する。次に、処理ステップ７０２で中間コード１中からプログラムブロックを検出し、その有無を判定する。本実施例で用いるプログラムブロックは、Ｊａｖａ（登録商標）ではメソッドと呼ばれる。バイトコード中からメソッド、ループ、ループ繰返し範囲を抽出する技術は、デコンパイル技術などで広く知られた周知の技術であるため、本明細書では説明を割愛する。例えば、情報処理学会論文誌（Ｖｏｌ．４０  Ｎｏ．ＳＩＧ１０（ＰＲＯ５）ｐｐ．３４−５０）丸山冬彦他「Ｊａｖａ（登録商標）バイトコードをデコンパイルするための効果的なアルゴリズム」で示されている。
【００２９】
処理ステップ７０２でプログラムブロックとして図６で示す“ｍｅｔｈｏｄ１”が検出されるため、処理ステップ７０３へ進む。処理ステップ７０２でプログラムブロックが検出されない場合は、処理ステップ７１６へ進む。処理ステップ７０３では、プログラムブロック重みに値“０”を設定する。次に、処理ステップ７０４でループの検出を行い、図６の１０６行目“ｆｏｒ（ｉ＝０；ｉ＜１００；ｉ＋＋）”にループが存在するため、処理ステップ７０５へ進む。処理ステップ７０４でループが検出されない場合は、処理ステップ７１５へ進む。処理ステップ７０５では、ループ重みに値“０”を設定する。次に、処理ステップ７０６でループ繰返し回数“１００”の検出を行う。次に、処理ステップ７０７でループ繰返し回数が静的に未確定か否か判定し、確定であるため、処理ステップ７０９へ進む。処理ステップ７０９では、図６の１０６行目のループのループ本体の演算量、すなわちバイトコード数を検出する。本実施例では、“１０００”であったと仮定する。なお、ループ本体には、他のループがネストしていたり、他のメソッドへの呼出しが含まれている場合があるが、その場合は全ての演算量を加算する。ループがネストしている場合やメソッド呼出しがネストする場合の解析方法は、広く知られた周知の技術であるため、本明細書では説明を割愛する。例えば、特許文献３にも記載がある。
【００３０】
次に、処理ステップ７１０でループ繰返し回数“１００”とループ本体の演算量“１０００”の積であるループ重み“１０００００”を算出する。次に、処理ステップ７１１でプログラムブロック重み“１０００００”を算出する（プログラムブロック重み“０”＋ループ重み“１０００００”）。次に、処理ステップ７１２で当該プログラムブロック内に他にループが存在するか否かを判定し、存在しないため処理ステップ７１３へ進む。処理ステップ７１３では、プログラムブロック重要度テーブル２２０６を生成する。図７に例を示す。プログラムブロック重要度テーブルは、項目“重要度順位”２２０１、“プログラムブロック名称”２２０２、“重要度ポイント”２２０３、“コンパイル済フラグ”２２０４、“動的情報解析範囲コード”２２０５から構成される。各々の項目は初期値として“ＮＵＬＬ”、“ＮＵＬＬ”、“ＮＵＬＬ”、“ＦＬＡＳＥ”、“１”が設定される。次に、処理ステップ７１４でプログラムブロック重要度テーブル２２０６に、プログラムブロック名称“ｍｅｔｈｏｄ１”、重要度ポイントとしてプログラムブロック重み“１０００００”を登録する。次に、処理ステップ７１５で他にプログラムブロックが存在するか否かを判定し、図６の１１０行目“ｍｅｔｈｏｄ２”が存在するため、処理ステップ７０３へ戻り、上記処理を繰り返す。
【００３１】
処理ステップ７０３では、プログラムブロック重みに値“０”を設定する。次に、処理ステップ７０４でループの検出を行い、図６の１１２行目“ｆｏｒ（ｉ＝０；ｉ＜ｘ；ｉ＋＋）”にループが存在するため、処理ステップ７０５へ進む。処理ステップ７０５では、ループ重みに値“０”を設定する。次に、処理ステップ７０６でループ繰返し回数“ｘ”の検出を行う。次に、処理ステップ７０７でループ繰返し回数が静的に未確定か否か判定し、未確定であるため、処理ステップ７０８へ進む。処理ステップ７０８では、ループ繰返し回数として暫定値“１０”を設定する。次に、処理ステップ７０９で、図６の１１２行目のループのループ本体の演算量、すなわちバイトコード数を検出する。本実施例では、“３０００”であったと仮定する。次に、処理ステップ７１０でループ繰返し回数“１０”とループ本体の演算量“３０００”の積であるループ重み“３００００”を算出する。次に、処理ステップ７１１でプログラムブロック重み“３００００”を算出する（プログラムブロック重み“０”＋ループ重み“３００００”）。次に、処理ステップ７１２で当該プログラムブロック内に他にループが存在するか否かを判定し、存在しないため処理ステップ７１３へ進む。処理ステップ７１３では、図７に示すプログラムブロック重要度テーブル２２０７を生成する。次に、処理ステップ７１４でプログラムブロック重要度テーブル２２０７に、プログラムブロック名称“ｍｅｔｈｏｄ２”、重要度ポイントとしてプログラムブロック重み“３００００”を登録する。次に、処理ステップ７１５で他にプログラムブロックが存在するか否かを判定し、図６の１１６行目“ｍｅｔｈｏｄ３”が存在するため、処理ステップ７０３へ戻り、上記処理を繰り返す。
【００３２】
処理ステップ７０３では、プログラムブロック重みに値“０”を設定する。次に、処理ステップ７０４でループの検出を行い、図６の１１８行目“ｆｏｒ（ｉ＝０；ｉ＜ｙ１；ｉ＋＋）”にループが存在するため、処理ステップ７０５へ進む。処理ステップ７０５では、ループ重みに値“０”を設定する。次に、処理ステップ７０６でループ繰返し回数“ｙ１”の検出を行う。次に、処理ステップ７０７でループ繰返し回数が静的に未確定か否か判定し、未確定であるため、処理ステップ７０８へ進む。処理ステップ７０８では、ループ繰返し回数として暫定値“１０”を設定する。次に、処理ステップ７０９で、図６の１１８行目のループのループ本体の演算量、すなわちバイトコード数を検出する。本実施例では、“１０００”であったと仮定する。次に、処理ステップ７１０でループ繰返し回数“１０”とループ本体の演算量“１０００”の積であるループ重み“１００００”を算出する。次に、処理ステップ７１１でプログラムブロック重み“１００００”を算出する（プログラムブロック重み“０”＋ループ重み“１００００”）。次に、処理ステップ７１２で当該プログラムブロック内に他にループが存在するか否かを判定し、図６の１２１行目“ｆｏｒ（ｉ＝０；ｉ＜ｙ２；ｉ＋＋）”にループが存在するため、処理ステップ７０５へ進む。
【００３３】
処理ステップ７０５では、ループ重みに値“０”を設定する。次に、処理ステップ７０６でループ繰返し回数“ｙ２”の検出を行う。次に、処理ステップ７０７でループ繰返し回数が静的に未確定か否か判定し、未確定であるため、処理ステップ７０８へ進む。処理ステップ７０８では、ループ繰返し回数として暫定値“１０”を設定する。次に、処理ステップ７０９で、図６の１２１行目のループのループ本体の演算量、すなわちバイトコード数を検出する。本実施例では、“２０００”であったと仮定する。次に、処理ステップ７１０でループ繰返し回数“１０”とループ本体の演算量“２０００”の積であるループ重み“２００００”を算出する。次に、処理ステップ７１１でプログラムブロック重み“３００００”を算出する（プログラムブロック重み“１００００”＋ループ重み“２００００”）。次に、処理ステップ７１２で当該プログラムブロック内に他にループが存在するか否かを判定し、図６の１２４行目“ｆｏｒ（ｉ＝０；ｉ＜ｙ３；ｉ＋＋）”にループが存在するため、処理ステップ７０５へ進む。
【００３４】
処理ステップ７０５では、ループ重みに値“０”を設定する。次に、処理ステップ７０６でループ繰返し回数“ｙ３”の検出を行う。次に、処理ステップ７０７でループ繰返し回数が静的に未確定か否か判定し、未確定であるため、処理ステップ７０８へ進む。処理ステップ７０８では、ループ繰返し回数として暫定値“１０”を設定する。次に、処理ステップ７０９で、図６の１２４行目のループのループ本体の演算量、すなわちバイトコード数を検出する。本実施例では、“１５００”であったと仮定する。次に、処理ステップ７１０でループ繰返し回数“１０”とループ本体の演算量“１５００”の積であるループ重み“１５０００”を算出する。次に、処理ステップ７１１でプログラムブロック重み“４５０００”を算出する（プログラムブロック重み“３００００”＋ループ重み“１５０００”）。次に、処理ステップ７１２で当該プログラムブロック内に他にループが存在するか否かを判定し、存在しないため処理ステップ７１３へ進む。
【００３５】
処理ステップ７１３では、図７に示すプログラムブロック重要度テーブル２２０８を生成する。次に、処理ステップ７１４でプログラムブロック重要度テーブル２２０８に、プログラムブロック名称“ｍｅｔｈｏｄ３”、重要度ポイントとしてプログラムブロック重み“４５０００”を登録する。次に、処理ステップ７１５で他にプログラムブロックが存在するか否かを判定し、存在しないため処理ステップ７１６へ進む。処理ステップ７１６では、プログラムブロック重要度テーブル２２０６、２２０７、２２０８を項目“重要度ポイント”の昇順にソートし、各々のテーブルの項目“重要度順位”を設定する。例を図８（“重要度順位”２２１１、“プログラムブロック名称”２２１２、“重要度ポイント”２２１３、“コンパイル済フラグ”２２１４、“動的情報解析範囲コード”２２１５、プログラムブロック重要度テーブル２２１６、２２１７、２２１８）に示す。以上のステップで本静的解析処理を終了する。
【００３６】
図９は、図１における動的情報検出部５の動作フローチャートである。図９を用いて、動的情報検出処理の流れを説明する。
【００３７】
まず、処理ステップ５０１で中間コードを入力する。次に、処理ステップ５０２でプログラムブロック重要度テーブル２２１６、２２１７、２２１８を入力する。次に、処理ステップ５０３で実行されたプログラムブロックの検出を行い、プログラムブロックの有無を判定する。本実施例では、図６で示す“ｍｅｔｈｏｄ１”が実行されたと仮定すると、処理ステップ５１７へ進む。処理ステップ５０３で実行されたプログラムブロックが検出されない場合は、本動的情報検出処理を終了する。処理ステップ５１７では、動的情報更新フラグに値“ＴＲＵＥ”を設定する。次に、処理ステップ５０４で、前動的ループテーブルポインタに“ＮＵＬＬ”を設定する。次に、処理ステップ５０５では、動的プログラムブロックテーブル２１０６を生成する。図１０に例を示す。動的プログラムブロックテーブルは、項目“プログラムブロック名称”２１０１、“実行回数”２１０２、“コンパイル済フラグ”２１０３、“動的ループテーブルＩＤ”２１０４から構成される。各々の項目は初期値として“ＮＵＬＬ”、“０”、“ＦＡＬＳＥ”、“ＮＵＬＬ”が設定される。
【００３８】
次に、処理ステップ５０６で動的プログラムブロックテーブル２１０６にプログラムブロック名称“ｍｅｔｈｏｄ１”、実行回数“１”を登録する。次に、処理ステップ５０７で当該プログラムブロックがコンパイル済みか否かを判定して、本実施例ではコンパイル対象とする実行回数の閾値を１００と設定すると、コンパイル済みでないため、処理ステップ５０９へ進む。処理ステップ５０７でコンパイル済みの場合、処理ステップ５０８へ進み、当該動的プログラムブロックテーブルの項目コンパイル済フラグに“ＴＲＵＥ”を設定し、その後処理ステップ５０９へ進む。処理ステップ５０９では、当該プログラムブロックとプログラムブロック名称の一致するプログラムブロック重要度テーブル２２１６を検出する。次に、処理ステップ５１０で、当該プログラムブロック重要度テーブル２２１６の項目“動的情報解析範囲コード”の値“１”を検出する。
【００３９】
次に、処理ステップ５１１で動的情報解析範囲コードが１か否かの判定を行い、１であるため、処理ステップ５１２に進む。処理ステップ５１２では、図６で示す“ｍｅｔｈｏｄ１”内にループが存在するか否かを判定し、図６の１０６行目“ｆｏｒ（ｉ＝０；ｉ＜１００；ｉ＋＋）”にループが存在するため、処理ステップ５１３へ進む。処理ステップ５１３では、静的に未確定なループ繰返し回数が存在し、それが動的に確定したか否かを判定し、当該ループは、ループ繰返し回数“１００”が静的に確定しているため、処理ステップ５１５へ進む。次に、処理ステップ５１５では、当該プログラムブロック、すなわち“ｍｅｔｈｏｄ１”中に他のループが存在するか否かを判定し、存在しないため、処理ステップ５１６へ進む。処理ステップ５１６では、他に実行されたプログラムブロックが存在するか否かを判定し、本実施例では、図６の１１０行目“ｍｅｔｈｏｄ２”が実行されたと仮定すると、処理ステップ５０４へ戻り、上記処理を繰り返す。処理ステップ５１６で実行された他のプログラムブロックが検出されない場合は、本動的情報検出処理を終了する。
【００４０】
処理ステップ５０４では、前動的ループテーブルポインタに“ＮＵＬＬ”を設定する。次に、処理ステップ５０５では、動的プログラムブロックテーブル２１０７を生成する。図１０に例を示す。次に、処理ステップ５０６で動的プログラムブロックテーブル２１０７にプログラムブロック名称“ｍｅｔｈｏｄ２”、実行回数“１”を登録する。次に、処理ステップ５０７で当該プログラムブロックがコンパイル済みか否かを判定して、本実施例ではコンパイル対象とする実行回数の閾値を１００と設定すると、コンパイル済みでないため、処理ステップ５０９へ進む。処理ステップ５０９では、当該プログラムブロックとプログラムブロック名称の一致するプログラムブロック重要度テーブル２２１７を検出する。次に、処理ステップ５１０で、当該プログラムブロック重要度テーブル２２１７の項目“動的情報解析範囲コード”の値“１”を検出する。次に、処理ステップ５１１で動的情報解析範囲コードが１か否かの判定を行い、１であるため、処理ステップ５１２に進む。処理ステップ５１２では、図６で示す“ｍｅｔｈｏｄ２”内にループが存在するか否かを判定し、図６の１１２行目“ｆｏｒ（ｉ＝０；ｉ＜ｘ；ｉ＋＋）”にループが存在するため、処理ステップ５１３へ進む。処理ステップ５１３では、静的に未確定なループ繰返し回数が存在し、それが動的に確定したか否かを判定し、本実施例では、ループ繰返し回数が“ｘ”で静的に未確定であるが動的解析で“１００００”に確定したと仮定すると、処理ステップ５１４へ進む。
【００４１】
処理ステップ５１４では、動的ループテーブル２１１６を生成する。図１１に例を示す。動的ループテーブルは、項目“テーブルＩＤ”２１１１、“ループ行番号”２１１２、“ループ繰返し回数”２１１３、“ＮｅｘｔテーブルＩＤ”２１１４から構成される。各々の項目は初期値として“０”、“０”、“０”、“ＮＵＬＬ”が設定される。次に、当該動的ループテーブル２１１６の項目“テーブルＩＤ”に固有のＩＤ番号として“１００”を、項目“ループ行番号”に“１１２”を、項目“ループ繰返し回数”に“１００００”を設定する。次に、項目“ＮｅｘｔテーブルＩＤ”へ前動的ループテーブルポインタの値“ＮＵＬＬ”を設定する。次に、前動的ループテーブルポインタへ当該動的ループテーブル２１１６の項目“テーブルＩＤ”の値“１００”を設定する。次に、当該動的プログラムブロックテーブル２１０７の項目“動的ループテーブルＩＤ”へ当該動的ループテーブル２１１６の項目“テーブルＩＤ”の値“１００”を設定する。次に、処理ステップ５１５へ進む。処理ステップ５１５では、当該プログラムブロック、すなわち“ｍｅｔｈｏｄ２”中に他のループが存在するか否かを判定し、存在しないため、処理ステップ５１６へ進む。処理ステップ５１６では、他に実行されたプログラムブロックが存在するか否かを判定し、本実施例では、図６の１１６行目“ｍｅｔｈｏｄ３”が実行されたと仮定すると、処理ステップ５０４へ戻り、上記処理を繰り返す。
【００４２】
処理ステップ５０４では、前動的ループテーブルポインタに“ＮＵＬＬ”を設定する。次に、処理ステップ５０５では、動的プログラムブロックテーブル２１０８を生成する。図１０に例を示す。次に、処理ステップ５０６で動的プログラムブロックテーブル２１０８にプログラムブロック名称“ｍｅｔｈｏｄ３”、実行回数“１”を登録する。次に、処理ステップ５０７で当該プログラムブロックがコンパイル済みか否かを判定して、本実施例ではコンパイル対象とする実行回数の閾値を１００と設定すると、コンパイル済みでないため、処理ステップ５０９へ進む。処理ステップ５０９では、当該プログラムブロックとプログラムブロック名称の一致するプログラムブロック重要度テーブル２２１８を検出する。次に、処理ステップ５１０で、当該プログラムブロック重要度テーブル２２１８の項目“動的情報解析範囲コード”の値“１”を検出する。次に、処理ステップ５１１で動的情報解析範囲コードが１か否かの判定を行い、１であるため、処理ステップ５１２に進む。処理ステップ５１２では、図６で示す“ｍｅｔｈｏｄ３”内にループが存在するか否かを判定し、図６の１１８行目“ｆｏｒ（ｉ＝０；ｉ＜ｙ１；ｉ＋＋）”にループが存在するため、処理ステップ５１３へ進む。処理ステップ５１３では、静的に未確定なループ繰返し回数が存在し、それが動的に確定したか否かを判定し、本実施例では、ループ繰返し回数が“ｙ１”で静的に未確定であるが動的解析で“１００”に確定したと仮定すると、処理ステップ５１４へ進む。
【００４３】
処理ステップ５１４では、動的ループテーブル２１１７を生成する。図１１に例を示す。次に、当該動的ループテーブル２１１７の項目“テーブルＩＤ”に固有のＩＤ番号として“１１０”を、項目“ループ行番号”に“１１８”を、項目“ループ繰返し回数”に“１００”を設定する。次に、項目“ＮｅｘｔテーブルＩＤ”へ前動的ループテーブルポインタの値“ＮＵＬＬ”を設定する。次に、前動的ループテーブルポインタへ当該動的ループテーブル２１１７の項目“テーブルＩＤ”の値“１１０”を設定する。次に、当該動的プログラムブロックテーブル２１０８の項目“動的ループテーブルＩＤ”へ当該動的ループテーブル２１１７の項目“テーブルＩＤ”の値“１１０”を設定する。次に、処理ステップ５１５へ進む。処理ステップ５１５では、当該プログラムブロック、すなわち“ｍｅｔｈｏｄ３”中に他のループが存在するか否かを判定し、図６の１２１行目“ｆｏｒ（ｉ＝０；ｉ＜ｙ２；ｉ＋＋）”にループが存在するため、処理ステップ５１３へ進む。処理ステップ５１３では、静的に未確定なループ繰返し回数が存在し、それが動的に確定したか否かを判定し、本実施例では、ループ繰返し回数が“ｙ２”で静的に未確定であるが動的解析で“１００”に確定したと仮定すると、処理ステップ５１４へ進む。
【００４４】
処理ステップ５１４では、動的ループテーブル２１１８を生成する。図１１に例を示す。次に、当該動的ループテーブル２１１８の項目“テーブルＩＤ”に固有のＩＤ番号として“１１１”を、項目“ループ行番号”に“１２１”を、項目“ループ繰返し回数”に“１００”を設定する。次に、項目“ＮｅｘｔテーブルＩＤ”へ前動的ループテーブルポインタの値“１１０”を設定する。次に、前動的ループテーブルポインタへ当該動的ループテーブル２１１８の項目“テーブルＩＤ”の値“１１１”を設定する。次に、当該動的プログラムブロックテーブル２１０８の項目“動的ループテーブルＩＤ”へ当該動的ループテーブル２１１８の項目“テーブルＩＤ”の値“１１１”を設定する。次に、処理ステップ５１５へ進む。処理ステップ５１５では、当該プログラムブロック、すなわち“ｍｅｔｈｏｄ３”中に他のループが存在するか否かを判定し、図６の１２４行目“ｆｏｒ（ｉ＝０；ｉ＜ｙ３；ｉ＋＋）”にループが存在するため、処理ステップ５１３へ進む。処理ステップ５１３では、静的に未確定なループ繰返し回数が存在し、それが動的に確定したか否かを判定し、本実施例では、ループ繰返し回数が“ｙ３”で静的に未確定であるが動的解析で“１００”に確定したと仮定すると、処理ステップ５１４へ進む。
【００４５】
処理ステップ５１４では、動的ループテーブル２１１９を生成する。図１１に例を示す。次に、当該動的ループテーブル２１１９の項目“テーブルＩＤ”に固有のＩＤ番号として“１１２”を、項目“ループ行番号”に“１２４”を、項目“ループ繰返し回数”に“１００”を設定する。次に、項目“ＮｅｘｔテーブルＩＤ”へ前動的ループテーブルポインタの値“１１１”を設定する。次に、前動的ループテーブルポインタへ当該動的ループテーブル２１１９の項目“テーブルＩＤ”の値“１１２”を設定する。次に、当該動的プログラムブロックテーブル２１０８の項目“動的ループテーブルＩＤ”へ当該動的ループテーブル２１１９の項目“テーブルＩＤ”の値“１１２”を設定する。次に、処理ステップ５１５へ進む。処理ステップ５１５では、当該プログラムブロック、すなわち“ｍｅｔｈｏｄ３”中に他のループが存在するか否かを判定し、存在しないため、処理ステップ５１６へ進む。処理ステップ５１６では、他に実行されたプログラムブロックが存在するか否かを判定し、存在しないため、本動的情報検出処理を終了する。
【００４６】
図１２は、図１におけるコンパイル部８の動作フローチャートである。図１２を用いて、コンパイル処理の流れを説明する。
【００４７】
まず、処理ステップ８０１で中間コード１を入力する。次に、処理ステップ８０２でプログラムブロック重要度テーブル２２１６、２２１７、２２１８を入力する。次に、処理ステップ８０３でループ制御変数に値“０”を設定する。次に、処理ステップ８０４でループ制御変数の値に１を加算する。次に、処理ステップ８０５で重要度順位がループ制御変数と等しいプログラムブロックテーブルが存在するか否かを判定し、プログラムブロック重要度テーブル２２１６が存在するため、処理ステップ８０６へ進む。処理ステップ８０６では、動的情報更新フラグを判定し、“ＴＲＵＥ”の場合、処理ステップ８０７へ進み、“ＦＡＬＳＥ”の場合、処理ステップ８１１へ進む。処理ステップ８０７では、動的情報解析処理、すなわちプログラムブロック重要度テーブルの更新を行う。詳細は図１３、１４、１５を用いて後述する。次に、処理ステップ８０８で動的情報検出範囲決定処理を行う。詳細は、図１７を用いて後述する。
【００４８】
次に、処理ステップ８０９でループ制御変数に値“０”を設定する。次に、処理ステップ８１０で動的情報更新フラグに“ＦＡＬＳＥ”を設定する。次に、処理ステップ８１１で当該プログラムブロック重要度テーブルの項目“コンパイル済フラグ”を判定し、“ＦＡＬＳＥ”の場合、処理ステップ８１２へ進み、“ＴＲＵＥ”の場合、処理ステップ８１４へ進む。処理ステップ８１２では、当該プログラムブロック重要度テーブルが指すプログラムブロックをコンパイルし、ネイティブコードを出力する。次に、処理ステップ８１３で当該プログラムブロック重要度テーブルの項目“コンパイル済フラグ”に値“ＴＲＵＥ”を設定する。次に、他のプログラムブロック重要度テーブルが存在するか否かを判定し、存在する場合、処理ステップ８０４へ戻り、上記処理を繰り返す。処理ステップ８１４で存在しない場合、本コンパイル処理を終了する。
【００４９】
図１３、１４、１５は、図１における動的解析部９の動作フローチャートである。図１３、１４、１５を用いて、動的解析処理の流れを説明する。
【００５０】
まず、処理ステップ９０１で中間コード１を入力する。次に、処理ステップ９０２でプログラムブロック重要度テーブル２２１６、２２１７、２２１８を入力する。次に、処理ステップ９０３で、動的プログラムブロックテーブル２１０６、２１０７、２１０８と動的ループテーブル２１１６、２１１７、２１１８、２１１９を入力する。次に、処理ステップ９０４で動的情報更新フラグを判定し、本実施例では、“ＴＲＵＥ”であったと仮定し処理ステップ９０５へ進む。処理ステップ９０４で“ＦＡＬＳＥ”の場合、処理ステップ９２８へ進む。処理ステップ９０５では、動的プログラムブロックテーブルが存在するか否かを判定し、動的プログラムブロックテーブル２１０６が存在するため、処理ステップ９０６へ進む。次に、処理ステップ９０６で当該動的プログラムブロック重要度テーブル２１０６とプログラムブロック名称“ｍｅｔｈｏｄ１”が一致するプログラムブロック重要度テーブル２２１６を検出する。
【００５１】
次に、処理ステップ９０７で当該動的プログラムブロックテーブル２１０６の実行回数“１”を検出し、当該プログラムブロックテーブル２２１６の重要度順位を実行回数×１０だけ上位に引き上げる。ただし、最高１位までとする。本実施例の場合、当該プログラムブロック重要度テーブル２２１６の重要度順位が１であるので、そのまま変化なしとなる。次に、処理ステップ９０８で当該動的プログラムブロックテーブルの項目“コンパイル済フラグ”を判定し、“ＴＲＵＥ”の場合処理ステップ９０９へ進み、“ＦＡＬＳＥ”の場合処理ステップ９１０へ進む。処理ステップ９０９では、当該プログラムブロック重要度テーブルの項目“コンパイル済フラグ”に“ＴＲＵＥ”を設定する。本実施例では、処理ステップ９０８で、当該動的プログラムブロックテーブル２１０６の項目“コンパイル済フラグ”が“ＦＡＬＳＥ”であるため、処理ステップ９１０へ進む。処理ステップ９１０では、当該動的プログラムブロックテーブル２１０６の項目“動的ループテーブルＩＤ”が“ＮＵＬＬ”以外か否かを判定し、“ＮＵＬＬ”であるため、処理ステップ９２７へ進む。処理ステップ９１０で“ＮＵＬＬ以外”の場合、処理ステップ９１１へ進む。処理ステップ９２７では、他に動的プログラムブロックテーブルが存在するか否かを判定し、動的プログラムブロックテーブル２１０７が存在するため、処理ステップ９０６へ戻って、上記処理を繰り返す。処理ステップ９２７で、存在しない場合処理ステップ９２８へ進む。
【００５２】
処理ステップ９０６で当該動的プログラムブロック２１０７とプログラムブロック名称“ｍｅｔｈｏｄ２”が一致するプログラムブロック重要度テーブル２２１８を検出する。次に、処理ステップ９０７で当該動的プログラムブロックテーブル２１０７の実行回数“１”を検出し、当該プログラムブロックテーブル２２１８の重要度順位を実行回数×１０だけ上位に引き上げる。ただし、最高１位までとする。本実施例の場合、当該プログラムブロック重要度テーブル２２１８の重要度順位が３であるので、１とする。次に、処理ステップ９０８で当該動的プログラムブロックテーブルの項目“コンパイル済フラグ”を判定し、当該動的プログラムブロックテーブル２１０７の項目“コンパイル済フラグ”が“ＦＡＬＳＥ”であるため、処理ステップ９１０へ進む。処理ステップ９１０では、当該動的プログラムブロックテーブル２１０７の項目“動的ループテーブルＩＤ”が“ＮＵＬＬ”以外か否かを判定し、“１００”であるため、処理ステップ９１１へ進む。処理ステップ９１１では、当該プログラムブロック“ｍｅｔｈｏｄ２”の中間コードを検出する。次に、処理ステップ９１２でプログラムブロック重みに“０”を設定する。次に、処理ステップ９１３でループが含められるか否か判定する。図６の１１２行目“ｆｏｒ（ｉ＝０；ｉ＜ｘ；ｉ＋＋）”にループが存在するため、処理ステップ９１４へ進む。処理ステップ９１３でループが存在しない場合、処理ステップ９２６へ進む。
【００５３】
処理ステップ９１４では、ループ重みに“０”を設定する。次に、処理ステップ９１５でループ繰返し回数“ｘ”を検出する。次に、処理ステップ９１６でループ繰返し回数が静的に未確定か否かを判定し、未確定であるため、処理ステップ９１７へ進む。処理ステップ９１６で、確定の場合、処理ステップ９３０へ進む。処理ステップ９１７では、ループ繰返し回数として暫定値“１０”を設定する。次に、処理ステップ９１８で、動的ループテーブルが存在するか否かを判定し、動的ループテーブル２１１６が存在するため、処理ステップ９１９へ進む。存在しない場合は、処理ステップ９２５へ進む。処理ステップ９１９では、当該動的ループテーブル２１１６の項目“ループ行番号”と一致するか否かを判定し、一致するため、処理ステップ９２０へ進む。一致しない場合は、処理ステップ９２１へ進む。処理ステップ９２０では、ループ繰返し回数として当該動的ループテーブル２１１６の項目“ループ繰返し回数”の値“１００００”を設定する。次に、処理ステップ９２１で、ループ本体の演算量を検出する。本実施例では前述の通り“３０００”と仮定している。次に、処理ステップ９２２で、ループ繰返し回数“１００００”とループ本体の演算量“３０００”の積である“３０００００００”を算出しループ重みとする。次に処理ステップ９２３で、プログラムブロック重み“３０００００００”を算出する（プログラムブロック重み“０”＋ループ重み“３０００００００”）。
【００５４】
次に、処理ステップ９２４で他に動的ループテーブルが存在するか否かを判定し、当該動的ループテーブルの項目“ＮｅｘｔテーブルＩＤ”の値が“ＮＵＬＬ”であるため、処理ステップ９２５へ進む。処理ステップ９２４で、存在する場合は、処理ステップ９１９へ戻り、上記処理を繰り返す。処理ステップ９２５では、当該プログラムブロック中に他のループが存在するか否かを判定し、存在しないため、処理ステップ９２６へ進む。存在する場合は、処理ステップ９１４へ戻り、上記処理を繰り返す。処理ステップ９２６では、“ｍｅｔｈｏｄ２”の当該プログラムブロック重要度テーブル２２１８の項目“重要度ポイント”へプログラムブロック重み“３０００００００”を設定する。次に、処理ステップ９２７で他に動的プログラムブロックが存在するか否かを判定し、２１０８が存在するので処理ステップ９０６へ戻り、上記処理を繰り返す。存在しない場合、処理ステップ９２８へ進む。
【００５５】
処理ステップ９０６で当該動的プログラムブロック２１０８とプログラムブロック名称“ｍｅｔｈｏｄ３”が一致するプログラムブロック重要度テーブル２２１７を検出する。次に、処理ステップ９０７で当該動的プログラムブロックテーブル２１０８の実行回数“１”を検出し、当該プログラムブロックテーブル２２１７の重要度順位を実行回数×１０だけ上位に引き上げる。ただし、最高１位までとする。本実施例の場合、当該プログラムブロック重要度テーブル２２１７の重要度順位が２であるので、１とする。次に、処理ステップ９０８で当該動的プログラムブロックテーブルの項目“コンパイル済フラグ”を判定し、当該動的プログラムブロックテーブル２１０８の項目“コンパイル済フラグ”が“ＦＡＬＳＥ”であるため、処理ステップ９１０へ進む。処理ステップ９１０では、当該動的プログラムブロックテーブル２１０８の項目“動的ループテーブルＩＤ”が“ＮＵＬＬ”以外か否かを判定し、“１１２”であるため、処理ステップ９１１へ進む。処理ステップ９１１では、当該プログラムブロック“ｍｅｔｈｏｄ３”の中間コードを検出する。次に、処理ステップ９１２でプログラムブロック重みに“０”を設定する。次に、処理ステップ９１３でループが含められるか否か判定する。図６の１２４行目“ｆｏｒ（ｉ＝０；ｉ＜ｙ３；ｉ＋＋）”にループが存在するため、処理ステップ９１４へ進む。処理ステップ９１３でループが存在しない場合、処理ステップ９２６へ進む。
【００５６】
処理ステップ９１４では、ループ重みに“０”を設定する。次に、処理ステップ９１５でループ繰返し回数“ｙ３”を検出する。次に、処理ステップ９１６でループ繰返し回数が静的に未確定か否かを判定し、未確定であるため、処理ステップ９１７へ進む。処理ステップ９１６で、確定の場合、処理ステップ９３０へ進む。処理ステップ９３０では、ループ本体の演算量を検出し、処理ステップ９３１では、ループ重み（ループ繰返し回数×ループ本体演算量）を算出し、処理ステップ９３２では、プログラムブロック重み（ループ重みを加算した値）を算出する。処理ステップ９１７では、ループ繰返し回数として暫定値“１０”を設定する。次に、処理ステップ９１８で、動的ループテーブルが存在するか否かを判定し、動的ループテーブル２１１９が存在するため、処理ステップ９１９へ進む。存在しない場合は、処理ステップ９２５へ進む。処理ステップ９１９では、当該動的ループテーブル２１１９の項目“ループ行番号”と一致するか否かを判定し、一致するため、処理ステップ９２０へ進む。一致しない場合は、処理ステップ９２１へ進む。
【００５７】
処理ステップ９２０では、ループ繰返し回数として当該動的ループテーブル２１１９の項目“ループ繰返し回数”の値“１００”を設定する。次に、処理ステップ９２１で、ループ本体の演算量を検出する。本実施例では前述の通り“１５００”と仮定している。次に、処理ステップ９２２で、ループ繰返し回数“１００”とループ本体の演算量“１５００”の積である“１５００００”を算出しループ重みとする。次に、処理ステップ９２３で、プログラムブロック重み“１５００００”を算出する（プログラムブロック重み“０”＋ループ重み“１５００００”）。次に、処理ステップ９２４で他に動的ループテーブルが存在するか否かを判定し、存在しないため、処理ステップ９２５へ進む。処理ステップ９２５では、当該プログラムブロック中に他のループが存在するか否かを判定し、図６の１２１行目“ｆｏｒ（ｉ＝０；ｉ＜ｙ２；ｉ＋＋）”にループが存在するため、処理ステップ９１４へ進む。処理ステップ９１３でループが存在しない場合、処理ステップ９２６へ進む。
【００５８】
処理ステップ９１４では、ループ重みに“０”を設定する。次に、処理ステップ９１５でループ繰返し回数“ｙ２”を検出する。次に、処理ステップ９１６でループ繰返し回数が静的に未確定か否かを判定し、未確定であるため、処理ステップ９１７へ進む。処理ステップ９１６で、確定の場合、処理ステップ９３０へ進む。処理ステップ９１７では、ループ繰返し回数として暫定値“１０”を設定する。次に、処理ステップ９１８で、動的ループテーブルが存在するか否かを判定し、動的ループテーブル２１１８が存在するため、処理ステップ９１９へ進む。存在しない場合は、処理ステップ９２５へ進む。処理ステップ９１９では、当該動的ループテーブル２１１８の項目“ループ行番号”と一致するか否かを判定し、一致するため、処理ステップ９２０へ進む。一致しない場合は、処理ステップ９２１へ進む。処理ステップ９２０では、ループ繰返し回数として当該動的ループテーブル２１１８の項目“ループ繰返し回数”の値“１００”を設定する。
【００５９】
次に、処理ステップ９２１で、ループ本体の演算量を検出する。本実施例では前述の通り“２０００”と仮定している。次に、処理ステップ９２２で、ループ繰返し回数“１００”とループ本体の演算量“２０００”の積である“２０００００”を算出しループ重みとする。次に処理ステップ９２３で、プログラムブロック重み“３５００００”を算出する（プログラムブロック重み“１５００００”＋ループ重み“２０００００”）。次に、処理ステップ９２４で他に動的ループテーブルが存在するか否かを判定し、存在しないため、処理ステップ９２５へ進む。処理ステップ９２５では、当該プログラムブロック中に他のループが存在するか否かを判定し、図６の１１８行目“ｆｏｒ（ｉ＝０；ｉ＜ｙ１；ｉ＋＋）”にループが存在するため、処理ステップ９１４へ進む。処理ステップ９１３でループが存在しない場合、処理ステップ９２６へ進む。
【００６０】
処理ステップ９１４では、ループ重みに“０”を設定する。次に、処理ステップ９１５でループ繰返し回数“ｙ１”を検出する。次に、処理ステップ９１６でループ繰返し回数が静的に未確定か否かを判定し、未確定であるため、処理ステップ９１７へ進む。処理ステップ９１６で、確定の場合、処理ステップ９３０へ進む。処理ステップ９１７では、ループ繰返し回数として暫定値“１０”を設定する。次に、処理ステップ９１８で、動的ループテーブルが存在するか否かを判定し、動的ループテーブル２１１７が存在するため、処理ステップ９１９へ進む。存在しない場合は、処理ステップ９２５へ進む。処理ステップ９１９では、当該動的ループテーブル２１１７の項目“ループ行番号”と一致するか否かを判定し、一致するため、処理ステップ９２０へ進む。一致しない場合は、処理ステップ９２１へ進む。処理ステップ９２０では、ループ繰返し回数として当該動的ループテーブル２１１７の項目“ループ繰返し回数”の値“１００”を設定する。
【００６１】
次に、処理ステップ９２１で、ループ本体の演算量を検出する。本実施例では前述の通り“１０００”と仮定している。次に、処理ステップ９２２で、ループ繰返し回数“１００”とループ本体の演算量“１０００”の積である“１０００００”を算出しループ重みとする。次に処理ステップ９２３で、プログラムブロック重み“４５００００”を算出する（プログラムブロック重み“３５００００”＋ループ重み“１０００００”）。次に、処理ステップ９２４で他に動的ループテーブルが存在するか否かを判定し、存在しないため、処理ステップ９２５へ進む。処理ステップ９２５では、当該プログラムブロック中に他のループが存在するか否かを判定し、存在しないため、処理ステップ９２６へ進む。存在する場合は、処理ステップ９１４へ戻り、上記処理を繰り返す。
【００６２】
処理ステップ９２６では、“ｍｅｔｈｏｄ３”の当該プログラムブロック重要度テーブル２２１７の項目“重要度ポイント”へプログラムブロック重み“４５００００”を設定する。次に、処理ステップ９２７で他に動的プログラムブロックが存在するか否かを判定し、存在しないため、処理ステップ９２８へ進む。次に、処理ステップ９２８で、プログラムブロック重要度テーブル２２１６、２２１７、２２１７を重要度ポイントで昇順にソートする。結果例を図１６（“重要度順位”２２３１、“プログラムブロック名称”２２３２、“重要度ポイント”２２３３、“コンパイル済フラグ”２２３４、“動的情報解析範囲コード”２２３５、プログラムブロック重要度テーブル２２３６、２２３７、２２３８）に示す。このように静的解析だけでは得られない、実際のプログラム実行における精度の高いプログラムブロック毎の重要度が得られ、これに基づいた事前コンパイルを実施することで、プログラム実行の高速化を実現する。次に、処理ステップで、動的情報更新フラグに“ＦＡＬＳＥ”を設定し、本動的解析処理を終了する。
【００６３】
以上で、本発明の重要度ベース事前コンパイルプログラム実行方法の第一実施例の説明を終了する。
【００６４】
この第一実施例によれば、静的解析の結果得られたプログラムブロック毎の重要度に動的解析結果を反映して精度良い重要度を算出し、このプログラム実行中に遂次更新される重要度を基に、プログラム実行用コア（ＣＰＵ）と別の事前コンパイル用コアで事前コンパイルさせることにより、利用される可能性の高いプログラムブロックのネイティブコードを事前に準備し、プログラム実行の高速化を実現することができる。
【００６５】
次に、第二実施例について説明する。第一実施例中の図１２で説明したコンパイル処理において、処理ステップ８０８を加える点が異なる。処理ステップ８０８の詳細を図１７を用いて説明する。
【００６６】
図１７は、図１における動的情報検出範囲決定部１０の動作フローチャートである。図１７を用いて、動的情報検出範囲決定処理の流れを説明する。
【００６７】
まず、処理ステップ１０１でプログラムブロック重要度テーブル２２３６、２２３７、２２３８を入力する（図１６）。次に、処理ステップ１０２でプログラムブロック重要度テーブルが存在するか否かを判定し、プログラムブロック重要度テーブル２２３６が存在するので、処理ステップ１０３へ進む、存在しない場合は、本動的情報検出範囲決定処理を終了する。処理ステップ１０３では、当該プログラムブロック重要度テーブル２２３６の重要度順位“１”を検出する。次に、処理ステップ１０４で重要度順位が３未満か否かを判定し、値“１”であるため処理ステップ１０５へ進み、処理ステップ１０５では、当該プログラムブロック重要度テーブルの項目“動的情報解析範囲コード”へ値“１”を設定し、その後処理ステップ１０７へ進む。
【００６８】
処理ステップ１０４で、値“３”以上の場合、処理ステップ１０６へ進み、処理ステップ１０６では、当該プログラムブロック重要度テーブルの項目“動的情報解析範囲コード”へ値“２”を設定し、その後処理ステップ１０７へ進む。なお、本実施例では、動的情報解析範囲コードの数を２つに、重要度順位の切り分けを３位未満としたが、これらの値は状況によって変更される。処理ステップ１０７では、他にプログラムブロック重要度テーブルが存在するか否かを判定し、プログラムブロック重要度テーブル２２３７が存在するため、処理ステップ１０３へ戻り、上記処理を繰り返す。処理ステップ１０７で、存在しない場合は、本動的情報検出範囲決定処理を終了する。
【００６９】
この第二実施例によれば、コンパイル処理において、処理ステップ８０８を加えることで、プログラム実行時の動的情報取得コストを低減させることが可能となる。よって、この第二実施例によれば、第一実施例よりさらに高速化が可能になる。
【００７０】
最後に、本実施の形態のプログラム実行システムを実現するハードウェア構成を説明する。図１８は、図１におけるプログラム実行システムを実現するプログラム実行処理装置の概要を示すブロック図である。
【００７１】
図１８において、プログラム実行処理装置は、プログラム実行用のＣＰＵ１（１００１）、プログラムブロックの事前コンパイルを行うＣＰＵ２（１００２）、主記憶装置１００３、二次記憶装置１００４、これらを結合する結合装置１００５から構成される。二次記憶装置１００４には中間コード１が格納され、また主記憶装置１００３で仮想マシン２が構築される。このようなマルチコア環境において、静的解析によって抽出される「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」と、「当該プログラムブロックに含まれるループ重みの合計」と「当該プログラムブロックの実行回数」の積から成る「プログラムブロック重み」と、「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を組合わせてプログラムブロック毎の重要度を精度良く決定し、これに従った事前コンパイル結果を利用することにより、プログラム実行を高速化することができる。
【００７２】
また、重要度からプログラムブロック毎の動的情報として取得する項目の範囲を分類し、重要度が低いプログラムブロックの取得すべき動的情報項目を限定することで、プログラム実行時の重要度が低いプログラムブロックの動的情報取得コストを低減させることにより、さらなるプログラム実行を高速化することが可能となる。
【００７３】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は前記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。
【産業上の利用可能性】
【００７４】
本発明は、プログラム実行技術に関し、特に、重要度ベース事前コンパイルプログラム実行方法、プログラム、およびプログラム実行システムに利用可能である。
【図面の簡単な説明】
【００７５】
【図１】本発明の実施の形態のプログラム実行システムの概要を示すブロック図である。
【図２】本発明の実施の形態において、タスク割当処理の流れを示すフローチャートである。
【図３】本発明の実施の形態において、中間コードの実行制御処理の流れを示すフローチャートである。
【図４】本発明の実施の形態において、中間コードの事前コンパイル制御処理の流れを示すフローチャートである。
【図５】本発明の実施の形態において、静的解析処理の流れを示すフローチャートである。
【図６】本発明の実施の形態において、入力ソースプログラムの例を示す図である。
【図７】本発明の実施の形態において、プログラムブロック重要度テーブルを示す図である。
【図８】本発明の実施の形態において、プログラムブロック重要度テーブルを示す図である。
【図９】本発明の実施の形態において、動的情報検出処理の流れを示すフローチャートである。
【図１０】本発明の実施の形態において、動的プログラムブロックテーブルを示す図である。
【図１１】本発明の実施の形態において、動的ループテーブルを示す図である。
【図１２】本発明の実施の形態において、コンパイル処理の流れを示すフローチャートである。
【図１３】本発明の実施の形態において、動的解析処理の流れを示すフローチャートである。
【図１４】本発明の実施の形態において、動的解析処理の流れを示すフローチャートである。
【図１５】本発明の実施の形態において、動的解析処理の流れを示すフローチャートである。
【図１６】本発明の実施の形態において、プログラムブロック重要度テーブルを示す図である。
【図１７】本発明の実施の形態において、動的情報検出範囲決定処理の流れを示すフローチャートである。
【図１８】本発明の実施の形態のプログラム実行システムを実現するプログラム実行処理装置の概要を示すブロック図である。
【符号の説明】
【００７６】
１…中間コード、２…仮想マシン、３…タスク割当部、４…実行制御部、５…動的情報検出部、６…事前コンパイル制御部、７…静的解析部、８…コンパイル部、９…動的解析部、１０…動的情報検出範囲決定部、２１…動的情報、２２…プログラムブロック重要度情報、２３…ネイティブコード、１００１…ＣＰＵ１、１００２…ＣＰＵ２、１００３…主記憶装置、１００４…二次記憶装置、１００５…結合装置。
【図１】
2007334643.tif 000003
【図２】
2007334643.tif 000004
【図３】
2007334643.tif 000005
【図４】
2007334643.tif 000006
【図５】
2007334643.tif 000007
【図６】
2007334643.tif 000008
【図７】
2007334643.tif 000009
【図８】
2007334643.tif 000010
【図９】
2007334643.tif 000011
【図１０】
2007334643.tif 000012
【図１１】
2007334643.tif 000013
【図１２】
2007334643.tif 000014
【図１３】
2007334643.tif 000015
【図１４】
2007334643.tif 000016
【図１５】
2007334643.tif 000017
【図１６】
2007334643.tif 000018
【図１７】
2007334643.tif 000019
【図１８】
2007334643.tif 000020