JP2007334643A - プログラム実行方法、プログラム、およびプログラム実行システム - Google Patents
プログラム実行方法、プログラム、およびプログラム実行システム Download PDFInfo
- Publication number
- JP2007334643A JP2007334643A JP2006165913A JP2006165913A JP2007334643A JP 2007334643 A JP2007334643 A JP 2007334643A JP 2006165913 A JP2006165913 A JP 2006165913A JP 2006165913 A JP2006165913 A JP 2006165913A JP 2007334643 A JP2007334643 A JP 2007334643A
- Authority
- JP
- Japan
- Prior art keywords
- program
- loop
- program block
- execution
- importance
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
【課題】特にマルチコア環境において、静的解析結果と動的解析結果を組合わせて利用し、精度良く重要度の高いプログラムブロック(PB)の事前コンパイルを行い、プログラムを高速化する技術を提供する。
【解決手段】プログラム実行担当のタスクで、中間コードもしくはネイティブコードを入力してプログラムを実行し、PB毎の「ループ繰返し回数」と「PB実行回数」から成る「動的情報」を抽出する。次に、プログラムの事前コンパイル担当のタスクで、中間コードを入力して静的解析の結果抽出した「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」、および「当該PBに含まれる全ループの重みの合計」と「当該PB実行回数」の積から成る「PB重み」と、前記動的情報を組合わせてPB毎の重要度を決定し、この実行時に遂次更新する重要度順に従って事前コンパイルしてネイティブコードを出力し、これをプログラム実行担当のタスクで活用する。
【選択図】図1
【解決手段】プログラム実行担当のタスクで、中間コードもしくはネイティブコードを入力してプログラムを実行し、PB毎の「ループ繰返し回数」と「PB実行回数」から成る「動的情報」を抽出する。次に、プログラムの事前コンパイル担当のタスクで、中間コードを入力して静的解析の結果抽出した「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」、および「当該PBに含まれる全ループの重みの合計」と「当該PB実行回数」の積から成る「PB重み」と、前記動的情報を組合わせてPB毎の重要度を決定し、この実行時に遂次更新する重要度順に従って事前コンパイルしてネイティブコードを出力し、これをプログラム実行担当のタスクで活用する。
【選択図】図1
Description
本発明は、プログラム実行技術に関し、特に、重要度ベース事前コンパイルプログラム実行方法、プログラム、およびプログラム実行システムに適用して有効な技術に関する。
中間コードを高速に実行させるプログラム実行方法として、例えばJava(登録商標)の場合、実行時にメソッドの実行回数をカウントし、閾値を超えた際にコンパイルし、以降コンパイル結果であるネイティブコードを利用することで高速化するJITと呼ばれる方法が存在する。さらに特許文献1に記載の方法では、JITコンパイラのコンパイル部分を事前のアイドル時間を利用して、1つだけコンパイルして利用する。これにより、コンパイル時間なしにネイティブコードが利用できコンパイル時間分高速化できる。
また、特許文献2に記載の方法では、実行用タスク、コンパイル用タスクを設け、前者を優先して処理し、コンパイル対象箇所の1回目の実行はインタプリタ処理、2回目以降はコンパイル結果を利用して処理する。これにより、「コンパイル時間+ネイティブコード実行時間−インタプリタ処理時間」分高速化される。
また、特許文献3に記載の方法では、静的解析によりプログラム中の実行回数の多い部分を見積り、これをベースに優先順位を付けて事前コンパイルする。これにより、実行時にネイティブコードが準備されている場合、コンパイル時間分高速化される。
特開平11−237989号公報
特開2004−355277号公報
特開2004−326760号公報
一般にマルチコア環境では、シングルコア環境に比べてCPUパワーを多く利用できる。上記従来技術では、マルチコア環境を想定しておらず、実行時に積極的にコンパイルする戦略を取っていない。よって、どの従来技術も事前コンパイルによる高速化の効果は限定的である。特許文献3に記載の方法は、他の2件に比べて効果が大きいと考えられるが、静的な解析によるループネスト数でプログラムブロック毎の優先順位を決定しているため、精度が不十分であり、高速化に関して大きな効果を得ることができない。また、静的解析による起動時間の増大が予想され、十分な高速化が得られない可能性がある。
そこで、本発明は、上記事情に鑑みてなされたものであり、その目的は、特にマルチコア環境において、プログラム実行用コア(CPU)とは別のコアで、静的解析結果と動的解析結果を組合わせて利用し、精度良く重要度の高いプログラムブロックの事前コンパイルを行い、プログラムを高速化することにある。
本発明の前記ならびにその他の目的と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
本願において開示される発明のうち、代表的なものの概要を簡単に説明すれば、次のとおりである。
本発明は上記課題を解決すべく、プログラム実行を担当するタスクで、中間コードもしくはネイティブコードを入力してプログラムを実行し、プログラムブロック毎の「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を抽出する。次に、プログラムの事前コンパイルを担当するタスクで、中間コードを入力して静的解析の結果抽出した「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」、および「当該プログラムブロックに含まれる全ループの重みの合計」と「当該プログラムブロック実行回数」の積から成る「プログラムブロック重み」と、前記動的情報を組合わせてプログラムブロック毎の重要度を決定し、この実行時に遂次更新する重要度順に従って事前コンパイルしてネイティブコードを出力し、このネイティブコードをプログラム実行を担当するタスクで活用する。
本願において開示される発明のうち、代表的なものによって得られる効果を簡単に説明すれば以下のとおりである。
本発明によれば、特にマルチコア環境において、静的解析によって抽出される「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」と、「当該プログラムブロックに含まれるループ重みの合計」と「当該プログラムブロックの実行回数」の積から成る「プログラムブロック重み」と、「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を組合わせてプログラムブロック毎の重要度を精度良く決定し、これに従った事前コンパイル結果を利用することにより、プログラムの高速実行が可能となる。
また、前記重要度からプログラムブロック毎の動的情報として取得する項目の範囲を分類し、重要度が低いプログラムブロックの取得すべき動的情報項目を限定することで、プログラム実行時の重要度が低いプログラムブロックの動的情報取得コストを低減させることにより、さらなるプログラムの高速実行が可能となる。
以下、本発明の実施の形態を図面に基づいて詳細に説明する。なお、これにより本発明が限定されるものではない。
本発明の実施の形態では、プログラム実行システムについて述べる。
図1は、本実施の形態のプログラム実行システムの概要を示すブロック図である。本発明は、計算機上で実施され、静的情報と動的情報を組合わせて精度良くプログラムブロックの重要度を見積もり、これを基に積極的に事前コンパイルを実施してプログラム実行を高速化する方法である。
図1において、仮想マシン2は、高級言語で記述されたソースプログラムを変換した中間コード1を入力し実行する。仮想マシン2は、中間コード1の実行を担当するタスクと事前コンパイルを担当するタスクをマルチコア環境において任意のコア(CPU)に割当てるタスク割当部3と、中間コード1の実行を制御する実行制御部4と、中間コード1の事前コンパイルを制御する事前コンパイル制御部6と、「ループ繰返し回数」と「プログラムブロック実行回数」から成る動的情報21と、プログラムブロック毎の「重要度順位」と「プログラムブロック名称」と「重要度ポイント」と「コンパイル済みフラグ」と「動的情報解析範囲コード」から成るプログラムブロック重要度情報22と、中間コード1のコンパイル結果であるネイティブコード23から構成される。
また、実行制御部4は動的情報の検出を行う動的情報検出部5を含み、事前コンパイル制御部6は中間コード1を入力し静的解析を行ってプログラムブロック重要度情報22を出力する静的解析部7と、プログラムブロック重要度情報22と動的情報21と中間コード1を入力しコンパイルしてネイティブコード23を出力するコンパイル部8から構成される。さらにコンパイル部8は中間コード1と動的情報21とプログラムブロック重要度情報22を入力して動的解析を行いプログラムブロック重要度情報22を更新して出力する動的解析部9と、プログラムブロック重要度情報22を入力して動的情報検出範囲の決定を行い結果をプログラムブロック重要度情報22に反映させて出力する動的情報検出範囲決定部10から構成される。なお、各図において、プログラムブロックはPBと図示する。
図2〜図16により、本発明の重要度ベース事前コンパイルプログラム実行方法の第一実施例を説明する。
図2は、図1におけるタスク割当部3の動作フローチャートである。図2を用いて、仮想マシン2起動後実施されるタスク割当処理の流れを説明する。
まず、処理ステップ31で動的情報更新フラグに“FALSE”を設定する。次に、処理ステップ32でコア番号を判定し、“1”の場合、処理ステップ34へ進み中間コード1の実行処理を実施し、その後本タスク割当処理を終了する。処理ステップ32でコア番号が“1”以外の場合、処理ステップ33に進む。次に、処理ステップ33でコア番号を判定し“2”の場合、処理ステップ35へ進み中間コード1の事前コンパイル処理を実施し、その後本タスク割当処理を終了する。処理ステップ33でコア番号が“2”以外の場合、本タスク割当処理を終了する。
図3は、図1における実行制御部4の動作フローチャートである。図3を用いて、中間コード1の実行制御処理の流れを説明する。
まず、処理ステップ41で中間コード1を入力する。次に、処理ステップ42で動的情報として「ループ繰返し回数」と「プログラムブロック実行回数」を検出する。なお、本実施例では動的情報として上記2件を例に挙げて説明するが、これに限定するものではなく「IF文分岐確率」やJava(登録商標)仕様でいう「仮想メソッドの割当て」や「例外発生回数」など様々な項目の適用が考えられる。処理ステップ42の詳細は、図9を用いて後述する。次に、処理ステップ43でプログラムブロック重要度情報を入力する。次に、処理ステップ44で当該プログラムブロックがコンパイル済みか否か判定し、コンパイル済みの場合、処理ステップ45へ進みコンパイル済みネイティブコードを実行する。
次に、処理ステップ46で他にプログラムブロックが存在するか否か判定する。存在する場合、処理ステップ42に戻る。上記処理を繰り返す。処理ステップ46で存在しない場合、本実行制御処理を終了する。処理ステップ44でコンパイル済みでない場合、処理ステップ47に進む。処理ステップ47では当該プログラムブロックの実行回数が閾値以上か否か判定し、閾値以上の場合、処理ステップ48に進み当該プログラムブロックのコンパイルを行う。その後処理ステップ45に進む。処理ステップ47で閾値未満の場合、処理ステップ49に進みインタープリタで解釈、実行する。その後処理ステップ46に進む。
図4は、図1における事前コンパイル制御部6の動作フローチャートである。図4を用いて、中間コード1の事前コンパイル制御処理の流れを説明する。
まず、処理ステップ61で中間コード1を入力する。次に、処理ステップ62で中間コード1の静的解析を行う。ここでは、プログラムブロック毎の重みの見積もり、プログラムブロック重みを利用した重要度順位の決定を行う。「プログラムブロック重み」とは、「当該プログラムブロックに含まれる全ループの重み」と「当該プログラムブロックの実行回数(暫定値は1とする)」の積であり、「ループ重み」とは、「ループ本体演算量」と「ループ繰返し回数(暫定値は10とする)」の積である。なお、処理ステップ62の詳細は、図5を用いて後述する。
次に、処理ステップ63でプログラムブロック重要度順にプログラムブロックのコンパイルを実施する。ここでは、動的情報が取得できた場合、プログラムブロック重要度の再見積もり、重要度順位の再決定を行う。また、動的情報検出範囲の決定を行う。処理ステップ63の詳細は、図12を用いて後述する。次に、処理ステップ64において中間コード1の実行中であるか否かを判定し、実行中の場合、処理ステップ63に戻り、上記処理を繰り返す。処理ステップ64において実行が完了している場合、本事前コンパイル制御処理を終了する。
図5は、図1における静的解析部7の動作フローチャートである。図5を用いて、静的解析処理の流れを説明する。
まず、処理ステップ701で中間コード1を入力する。本実施例では、図6に示すJava(登録商標)言語で記述されたソースプログラムから変換された中間コードが入力された場合を想定して説明する。なお、Java(登録商標)では、中間コードに相当するコードをバイトコードと呼んでいる。Java(登録商標)ソースプログラムからバイトコードへ変換する方法については、サン・マイクロシステムズ社などから公開された周知の技術であるため、本明細書では説明を割愛する。次に、処理ステップ702で中間コード1中からプログラムブロックを検出し、その有無を判定する。本実施例で用いるプログラムブロックは、Java(登録商標)ではメソッドと呼ばれる。バイトコード中からメソッド、ループ、ループ繰返し範囲を抽出する技術は、デコンパイル技術などで広く知られた周知の技術であるため、本明細書では説明を割愛する。例えば、情報処理学会論文誌(Vol.40 No.SIG10(PRO5)pp.34−50)丸山冬彦他「Java(登録商標)バイトコードをデコンパイルするための効果的なアルゴリズム」で示されている。
処理ステップ702でプログラムブロックとして図6で示す“method1”が検出されるため、処理ステップ703へ進む。処理ステップ702でプログラムブロックが検出されない場合は、処理ステップ716へ進む。処理ステップ703では、プログラムブロック重みに値“0”を設定する。次に、処理ステップ704でループの検出を行い、図6の106行目“for(i=0;i<100;i++)”にループが存在するため、処理ステップ705へ進む。処理ステップ704でループが検出されない場合は、処理ステップ715へ進む。処理ステップ705では、ループ重みに値“0”を設定する。次に、処理ステップ706でループ繰返し回数“100”の検出を行う。次に、処理ステップ707でループ繰返し回数が静的に未確定か否か判定し、確定であるため、処理ステップ709へ進む。処理ステップ709では、図6の106行目のループのループ本体の演算量、すなわちバイトコード数を検出する。本実施例では、“1000”であったと仮定する。なお、ループ本体には、他のループがネストしていたり、他のメソッドへの呼出しが含まれている場合があるが、その場合は全ての演算量を加算する。ループがネストしている場合やメソッド呼出しがネストする場合の解析方法は、広く知られた周知の技術であるため、本明細書では説明を割愛する。例えば、特許文献3にも記載がある。
次に、処理ステップ710でループ繰返し回数“100”とループ本体の演算量“1000”の積であるループ重み“100000”を算出する。次に、処理ステップ711でプログラムブロック重み“100000”を算出する(プログラムブロック重み“0”+ループ重み“100000”)。次に、処理ステップ712で当該プログラムブロック内に他にループが存在するか否かを判定し、存在しないため処理ステップ713へ進む。処理ステップ713では、プログラムブロック重要度テーブル2206を生成する。図7に例を示す。プログラムブロック重要度テーブルは、項目“重要度順位”2201、“プログラムブロック名称”2202、“重要度ポイント”2203、“コンパイル済フラグ”2204、“動的情報解析範囲コード”2205から構成される。各々の項目は初期値として“NULL”、“NULL”、“NULL”、“FLASE”、“1”が設定される。次に、処理ステップ714でプログラムブロック重要度テーブル2206に、プログラムブロック名称“method1”、重要度ポイントとしてプログラムブロック重み“100000”を登録する。次に、処理ステップ715で他にプログラムブロックが存在するか否かを判定し、図6の110行目“method2”が存在するため、処理ステップ703へ戻り、上記処理を繰り返す。
処理ステップ703では、プログラムブロック重みに値“0”を設定する。次に、処理ステップ704でループの検出を行い、図6の112行目“for(i=0;i<x;i++)”にループが存在するため、処理ステップ705へ進む。処理ステップ705では、ループ重みに値“0”を設定する。次に、処理ステップ706でループ繰返し回数“x”の検出を行う。次に、処理ステップ707でループ繰返し回数が静的に未確定か否か判定し、未確定であるため、処理ステップ708へ進む。処理ステップ708では、ループ繰返し回数として暫定値“10”を設定する。次に、処理ステップ709で、図6の112行目のループのループ本体の演算量、すなわちバイトコード数を検出する。本実施例では、“3000”であったと仮定する。次に、処理ステップ710でループ繰返し回数“10”とループ本体の演算量“3000”の積であるループ重み“30000”を算出する。次に、処理ステップ711でプログラムブロック重み“30000”を算出する(プログラムブロック重み“0”+ループ重み“30000”)。次に、処理ステップ712で当該プログラムブロック内に他にループが存在するか否かを判定し、存在しないため処理ステップ713へ進む。処理ステップ713では、図7に示すプログラムブロック重要度テーブル2207を生成する。次に、処理ステップ714でプログラムブロック重要度テーブル2207に、プログラムブロック名称“method2”、重要度ポイントとしてプログラムブロック重み“30000”を登録する。次に、処理ステップ715で他にプログラムブロックが存在するか否かを判定し、図6の116行目“method3”が存在するため、処理ステップ703へ戻り、上記処理を繰り返す。
処理ステップ703では、プログラムブロック重みに値“0”を設定する。次に、処理ステップ704でループの検出を行い、図6の118行目“for(i=0;i<y1;i++)”にループが存在するため、処理ステップ705へ進む。処理ステップ705では、ループ重みに値“0”を設定する。次に、処理ステップ706でループ繰返し回数“y1”の検出を行う。次に、処理ステップ707でループ繰返し回数が静的に未確定か否か判定し、未確定であるため、処理ステップ708へ進む。処理ステップ708では、ループ繰返し回数として暫定値“10”を設定する。次に、処理ステップ709で、図6の118行目のループのループ本体の演算量、すなわちバイトコード数を検出する。本実施例では、“1000”であったと仮定する。次に、処理ステップ710でループ繰返し回数“10”とループ本体の演算量“1000”の積であるループ重み“10000”を算出する。次に、処理ステップ711でプログラムブロック重み“10000”を算出する(プログラムブロック重み“0”+ループ重み“10000”)。次に、処理ステップ712で当該プログラムブロック内に他にループが存在するか否かを判定し、図6の121行目“for(i=0;i<y2;i++)”にループが存在するため、処理ステップ705へ進む。
処理ステップ705では、ループ重みに値“0”を設定する。次に、処理ステップ706でループ繰返し回数“y2”の検出を行う。次に、処理ステップ707でループ繰返し回数が静的に未確定か否か判定し、未確定であるため、処理ステップ708へ進む。処理ステップ708では、ループ繰返し回数として暫定値“10”を設定する。次に、処理ステップ709で、図6の121行目のループのループ本体の演算量、すなわちバイトコード数を検出する。本実施例では、“2000”であったと仮定する。次に、処理ステップ710でループ繰返し回数“10”とループ本体の演算量“2000”の積であるループ重み“20000”を算出する。次に、処理ステップ711でプログラムブロック重み“30000”を算出する(プログラムブロック重み“10000”+ループ重み“20000”)。次に、処理ステップ712で当該プログラムブロック内に他にループが存在するか否かを判定し、図6の124行目“for(i=0;i<y3;i++)”にループが存在するため、処理ステップ705へ進む。
処理ステップ705では、ループ重みに値“0”を設定する。次に、処理ステップ706でループ繰返し回数“y3”の検出を行う。次に、処理ステップ707でループ繰返し回数が静的に未確定か否か判定し、未確定であるため、処理ステップ708へ進む。処理ステップ708では、ループ繰返し回数として暫定値“10”を設定する。次に、処理ステップ709で、図6の124行目のループのループ本体の演算量、すなわちバイトコード数を検出する。本実施例では、“1500”であったと仮定する。次に、処理ステップ710でループ繰返し回数“10”とループ本体の演算量“1500”の積であるループ重み“15000”を算出する。次に、処理ステップ711でプログラムブロック重み“45000”を算出する(プログラムブロック重み“30000”+ループ重み“15000”)。次に、処理ステップ712で当該プログラムブロック内に他にループが存在するか否かを判定し、存在しないため処理ステップ713へ進む。
処理ステップ713では、図7に示すプログラムブロック重要度テーブル2208を生成する。次に、処理ステップ714でプログラムブロック重要度テーブル2208に、プログラムブロック名称“method3”、重要度ポイントとしてプログラムブロック重み“45000”を登録する。次に、処理ステップ715で他にプログラムブロックが存在するか否かを判定し、存在しないため処理ステップ716へ進む。処理ステップ716では、プログラムブロック重要度テーブル2206、2207、2208を項目“重要度ポイント”の昇順にソートし、各々のテーブルの項目“重要度順位”を設定する。例を図8(“重要度順位”2211、“プログラムブロック名称”2212、“重要度ポイント”2213、“コンパイル済フラグ”2214、“動的情報解析範囲コード”2215、プログラムブロック重要度テーブル2216、2217、2218)に示す。以上のステップで本静的解析処理を終了する。
図9は、図1における動的情報検出部5の動作フローチャートである。図9を用いて、動的情報検出処理の流れを説明する。
まず、処理ステップ501で中間コードを入力する。次に、処理ステップ502でプログラムブロック重要度テーブル2216、2217、2218を入力する。次に、処理ステップ503で実行されたプログラムブロックの検出を行い、プログラムブロックの有無を判定する。本実施例では、図6で示す“method1”が実行されたと仮定すると、処理ステップ517へ進む。処理ステップ503で実行されたプログラムブロックが検出されない場合は、本動的情報検出処理を終了する。処理ステップ517では、動的情報更新フラグに値“TRUE”を設定する。次に、処理ステップ504で、前動的ループテーブルポインタに“NULL”を設定する。次に、処理ステップ505では、動的プログラムブロックテーブル2106を生成する。図10に例を示す。動的プログラムブロックテーブルは、項目“プログラムブロック名称”2101、“実行回数”2102、“コンパイル済フラグ”2103、“動的ループテーブルID”2104から構成される。各々の項目は初期値として“NULL”、“0”、“FALSE”、“NULL”が設定される。
次に、処理ステップ506で動的プログラムブロックテーブル2106にプログラムブロック名称“method1”、実行回数“1”を登録する。次に、処理ステップ507で当該プログラムブロックがコンパイル済みか否かを判定して、本実施例ではコンパイル対象とする実行回数の閾値を100と設定すると、コンパイル済みでないため、処理ステップ509へ進む。処理ステップ507でコンパイル済みの場合、処理ステップ508へ進み、当該動的プログラムブロックテーブルの項目コンパイル済フラグに“TRUE”を設定し、その後処理ステップ509へ進む。処理ステップ509では、当該プログラムブロックとプログラムブロック名称の一致するプログラムブロック重要度テーブル2216を検出する。次に、処理ステップ510で、当該プログラムブロック重要度テーブル2216の項目“動的情報解析範囲コード”の値“1”を検出する。
次に、処理ステップ511で動的情報解析範囲コードが1か否かの判定を行い、1であるため、処理ステップ512に進む。処理ステップ512では、図6で示す“method1”内にループが存在するか否かを判定し、図6の106行目“for(i=0;i<100;i++)”にループが存在するため、処理ステップ513へ進む。処理ステップ513では、静的に未確定なループ繰返し回数が存在し、それが動的に確定したか否かを判定し、当該ループは、ループ繰返し回数“100”が静的に確定しているため、処理ステップ515へ進む。次に、処理ステップ515では、当該プログラムブロック、すなわち“method1”中に他のループが存在するか否かを判定し、存在しないため、処理ステップ516へ進む。処理ステップ516では、他に実行されたプログラムブロックが存在するか否かを判定し、本実施例では、図6の110行目“method2”が実行されたと仮定すると、処理ステップ504へ戻り、上記処理を繰り返す。処理ステップ516で実行された他のプログラムブロックが検出されない場合は、本動的情報検出処理を終了する。
処理ステップ504では、前動的ループテーブルポインタに“NULL”を設定する。次に、処理ステップ505では、動的プログラムブロックテーブル2107を生成する。図10に例を示す。次に、処理ステップ506で動的プログラムブロックテーブル2107にプログラムブロック名称“method2”、実行回数“1”を登録する。次に、処理ステップ507で当該プログラムブロックがコンパイル済みか否かを判定して、本実施例ではコンパイル対象とする実行回数の閾値を100と設定すると、コンパイル済みでないため、処理ステップ509へ進む。処理ステップ509では、当該プログラムブロックとプログラムブロック名称の一致するプログラムブロック重要度テーブル2217を検出する。次に、処理ステップ510で、当該プログラムブロック重要度テーブル2217の項目“動的情報解析範囲コード”の値“1”を検出する。次に、処理ステップ511で動的情報解析範囲コードが1か否かの判定を行い、1であるため、処理ステップ512に進む。処理ステップ512では、図6で示す“method2”内にループが存在するか否かを判定し、図6の112行目“for(i=0;i<x;i++)”にループが存在するため、処理ステップ513へ進む。処理ステップ513では、静的に未確定なループ繰返し回数が存在し、それが動的に確定したか否かを判定し、本実施例では、ループ繰返し回数が“x”で静的に未確定であるが動的解析で“10000”に確定したと仮定すると、処理ステップ514へ進む。
処理ステップ514では、動的ループテーブル2116を生成する。図11に例を示す。動的ループテーブルは、項目“テーブルID”2111、“ループ行番号”2112、“ループ繰返し回数”2113、“NextテーブルID”2114から構成される。各々の項目は初期値として“0”、“0”、“0”、“NULL”が設定される。次に、当該動的ループテーブル2116の項目“テーブルID”に固有のID番号として“100”を、項目“ループ行番号”に“112”を、項目“ループ繰返し回数”に“10000”を設定する。次に、項目“NextテーブルID”へ前動的ループテーブルポインタの値“NULL”を設定する。次に、前動的ループテーブルポインタへ当該動的ループテーブル2116の項目“テーブルID”の値“100”を設定する。次に、当該動的プログラムブロックテーブル2107の項目“動的ループテーブルID”へ当該動的ループテーブル2116の項目“テーブルID”の値“100”を設定する。次に、処理ステップ515へ進む。処理ステップ515では、当該プログラムブロック、すなわち“method2”中に他のループが存在するか否かを判定し、存在しないため、処理ステップ516へ進む。処理ステップ516では、他に実行されたプログラムブロックが存在するか否かを判定し、本実施例では、図6の116行目“method3”が実行されたと仮定すると、処理ステップ504へ戻り、上記処理を繰り返す。
処理ステップ504では、前動的ループテーブルポインタに“NULL”を設定する。次に、処理ステップ505では、動的プログラムブロックテーブル2108を生成する。図10に例を示す。次に、処理ステップ506で動的プログラムブロックテーブル2108にプログラムブロック名称“method3”、実行回数“1”を登録する。次に、処理ステップ507で当該プログラムブロックがコンパイル済みか否かを判定して、本実施例ではコンパイル対象とする実行回数の閾値を100と設定すると、コンパイル済みでないため、処理ステップ509へ進む。処理ステップ509では、当該プログラムブロックとプログラムブロック名称の一致するプログラムブロック重要度テーブル2218を検出する。次に、処理ステップ510で、当該プログラムブロック重要度テーブル2218の項目“動的情報解析範囲コード”の値“1”を検出する。次に、処理ステップ511で動的情報解析範囲コードが1か否かの判定を行い、1であるため、処理ステップ512に進む。処理ステップ512では、図6で示す“method3”内にループが存在するか否かを判定し、図6の118行目“for(i=0;i<y1;i++)”にループが存在するため、処理ステップ513へ進む。処理ステップ513では、静的に未確定なループ繰返し回数が存在し、それが動的に確定したか否かを判定し、本実施例では、ループ繰返し回数が“y1”で静的に未確定であるが動的解析で“100”に確定したと仮定すると、処理ステップ514へ進む。
処理ステップ514では、動的ループテーブル2117を生成する。図11に例を示す。次に、当該動的ループテーブル2117の項目“テーブルID”に固有のID番号として“110”を、項目“ループ行番号”に“118”を、項目“ループ繰返し回数”に“100”を設定する。次に、項目“NextテーブルID”へ前動的ループテーブルポインタの値“NULL”を設定する。次に、前動的ループテーブルポインタへ当該動的ループテーブル2117の項目“テーブルID”の値“110”を設定する。次に、当該動的プログラムブロックテーブル2108の項目“動的ループテーブルID”へ当該動的ループテーブル2117の項目“テーブルID”の値“110”を設定する。次に、処理ステップ515へ進む。処理ステップ515では、当該プログラムブロック、すなわち“method3”中に他のループが存在するか否かを判定し、図6の121行目“for(i=0;i<y2;i++)”にループが存在するため、処理ステップ513へ進む。処理ステップ513では、静的に未確定なループ繰返し回数が存在し、それが動的に確定したか否かを判定し、本実施例では、ループ繰返し回数が“y2”で静的に未確定であるが動的解析で“100”に確定したと仮定すると、処理ステップ514へ進む。
処理ステップ514では、動的ループテーブル2118を生成する。図11に例を示す。次に、当該動的ループテーブル2118の項目“テーブルID”に固有のID番号として“111”を、項目“ループ行番号”に“121”を、項目“ループ繰返し回数”に“100”を設定する。次に、項目“NextテーブルID”へ前動的ループテーブルポインタの値“110”を設定する。次に、前動的ループテーブルポインタへ当該動的ループテーブル2118の項目“テーブルID”の値“111”を設定する。次に、当該動的プログラムブロックテーブル2108の項目“動的ループテーブルID”へ当該動的ループテーブル2118の項目“テーブルID”の値“111”を設定する。次に、処理ステップ515へ進む。処理ステップ515では、当該プログラムブロック、すなわち“method3”中に他のループが存在するか否かを判定し、図6の124行目“for(i=0;i<y3;i++)”にループが存在するため、処理ステップ513へ進む。処理ステップ513では、静的に未確定なループ繰返し回数が存在し、それが動的に確定したか否かを判定し、本実施例では、ループ繰返し回数が“y3”で静的に未確定であるが動的解析で“100”に確定したと仮定すると、処理ステップ514へ進む。
処理ステップ514では、動的ループテーブル2119を生成する。図11に例を示す。次に、当該動的ループテーブル2119の項目“テーブルID”に固有のID番号として“112”を、項目“ループ行番号”に“124”を、項目“ループ繰返し回数”に“100”を設定する。次に、項目“NextテーブルID”へ前動的ループテーブルポインタの値“111”を設定する。次に、前動的ループテーブルポインタへ当該動的ループテーブル2119の項目“テーブルID”の値“112”を設定する。次に、当該動的プログラムブロックテーブル2108の項目“動的ループテーブルID”へ当該動的ループテーブル2119の項目“テーブルID”の値“112”を設定する。次に、処理ステップ515へ進む。処理ステップ515では、当該プログラムブロック、すなわち“method3”中に他のループが存在するか否かを判定し、存在しないため、処理ステップ516へ進む。処理ステップ516では、他に実行されたプログラムブロックが存在するか否かを判定し、存在しないため、本動的情報検出処理を終了する。
図12は、図1におけるコンパイル部8の動作フローチャートである。図12を用いて、コンパイル処理の流れを説明する。
まず、処理ステップ801で中間コード1を入力する。次に、処理ステップ802でプログラムブロック重要度テーブル2216、2217、2218を入力する。次に、処理ステップ803でループ制御変数に値“0”を設定する。次に、処理ステップ804でループ制御変数の値に1を加算する。次に、処理ステップ805で重要度順位がループ制御変数と等しいプログラムブロックテーブルが存在するか否かを判定し、プログラムブロック重要度テーブル2216が存在するため、処理ステップ806へ進む。処理ステップ806では、動的情報更新フラグを判定し、“TRUE”の場合、処理ステップ807へ進み、“FALSE”の場合、処理ステップ811へ進む。処理ステップ807では、動的情報解析処理、すなわちプログラムブロック重要度テーブルの更新を行う。詳細は図13、14、15を用いて後述する。次に、処理ステップ808で動的情報検出範囲決定処理を行う。詳細は、図17を用いて後述する。
次に、処理ステップ809でループ制御変数に値“0”を設定する。次に、処理ステップ810で動的情報更新フラグに“FALSE”を設定する。次に、処理ステップ811で当該プログラムブロック重要度テーブルの項目“コンパイル済フラグ”を判定し、“FALSE”の場合、処理ステップ812へ進み、“TRUE”の場合、処理ステップ814へ進む。処理ステップ812では、当該プログラムブロック重要度テーブルが指すプログラムブロックをコンパイルし、ネイティブコードを出力する。次に、処理ステップ813で当該プログラムブロック重要度テーブルの項目“コンパイル済フラグ”に値“TRUE”を設定する。次に、他のプログラムブロック重要度テーブルが存在するか否かを判定し、存在する場合、処理ステップ804へ戻り、上記処理を繰り返す。処理ステップ814で存在しない場合、本コンパイル処理を終了する。
図13、14、15は、図1における動的解析部9の動作フローチャートである。図13、14、15を用いて、動的解析処理の流れを説明する。
まず、処理ステップ901で中間コード1を入力する。次に、処理ステップ902でプログラムブロック重要度テーブル2216、2217、2218を入力する。次に、処理ステップ903で、動的プログラムブロックテーブル2106、2107、2108と動的ループテーブル2116、2117、2118、2119を入力する。次に、処理ステップ904で動的情報更新フラグを判定し、本実施例では、“TRUE”であったと仮定し処理ステップ905へ進む。処理ステップ904で“FALSE”の場合、処理ステップ928へ進む。処理ステップ905では、動的プログラムブロックテーブルが存在するか否かを判定し、動的プログラムブロックテーブル2106が存在するため、処理ステップ906へ進む。次に、処理ステップ906で当該動的プログラムブロック重要度テーブル2106とプログラムブロック名称“method1”が一致するプログラムブロック重要度テーブル2216を検出する。
次に、処理ステップ907で当該動的プログラムブロックテーブル2106の実行回数“1”を検出し、当該プログラムブロックテーブル2216の重要度順位を実行回数×10だけ上位に引き上げる。ただし、最高1位までとする。本実施例の場合、当該プログラムブロック重要度テーブル2216の重要度順位が1であるので、そのまま変化なしとなる。次に、処理ステップ908で当該動的プログラムブロックテーブルの項目“コンパイル済フラグ”を判定し、“TRUE”の場合処理ステップ909へ進み、“FALSE”の場合処理ステップ910へ進む。処理ステップ909では、当該プログラムブロック重要度テーブルの項目“コンパイル済フラグ”に“TRUE”を設定する。本実施例では、処理ステップ908で、当該動的プログラムブロックテーブル2106の項目“コンパイル済フラグ”が“FALSE”であるため、処理ステップ910へ進む。処理ステップ910では、当該動的プログラムブロックテーブル2106の項目“動的ループテーブルID”が“NULL”以外か否かを判定し、“NULL”であるため、処理ステップ927へ進む。処理ステップ910で“NULL以外”の場合、処理ステップ911へ進む。処理ステップ927では、他に動的プログラムブロックテーブルが存在するか否かを判定し、動的プログラムブロックテーブル2107が存在するため、処理ステップ906へ戻って、上記処理を繰り返す。処理ステップ927で、存在しない場合処理ステップ928へ進む。
処理ステップ906で当該動的プログラムブロック2107とプログラムブロック名称“method2”が一致するプログラムブロック重要度テーブル2218を検出する。次に、処理ステップ907で当該動的プログラムブロックテーブル2107の実行回数“1”を検出し、当該プログラムブロックテーブル2218の重要度順位を実行回数×10だけ上位に引き上げる。ただし、最高1位までとする。本実施例の場合、当該プログラムブロック重要度テーブル2218の重要度順位が3であるので、1とする。次に、処理ステップ908で当該動的プログラムブロックテーブルの項目“コンパイル済フラグ”を判定し、当該動的プログラムブロックテーブル2107の項目“コンパイル済フラグ”が“FALSE”であるため、処理ステップ910へ進む。処理ステップ910では、当該動的プログラムブロックテーブル2107の項目“動的ループテーブルID”が“NULL”以外か否かを判定し、“100”であるため、処理ステップ911へ進む。処理ステップ911では、当該プログラムブロック“method2”の中間コードを検出する。次に、処理ステップ912でプログラムブロック重みに“0”を設定する。次に、処理ステップ913でループが含められるか否か判定する。図6の112行目“for(i=0;i<x;i++)”にループが存在するため、処理ステップ914へ進む。処理ステップ913でループが存在しない場合、処理ステップ926へ進む。
処理ステップ914では、ループ重みに“0”を設定する。次に、処理ステップ915でループ繰返し回数“x”を検出する。次に、処理ステップ916でループ繰返し回数が静的に未確定か否かを判定し、未確定であるため、処理ステップ917へ進む。処理ステップ916で、確定の場合、処理ステップ930へ進む。処理ステップ917では、ループ繰返し回数として暫定値“10”を設定する。次に、処理ステップ918で、動的ループテーブルが存在するか否かを判定し、動的ループテーブル2116が存在するため、処理ステップ919へ進む。存在しない場合は、処理ステップ925へ進む。処理ステップ919では、当該動的ループテーブル2116の項目“ループ行番号”と一致するか否かを判定し、一致するため、処理ステップ920へ進む。一致しない場合は、処理ステップ921へ進む。処理ステップ920では、ループ繰返し回数として当該動的ループテーブル2116の項目“ループ繰返し回数”の値“10000”を設定する。次に、処理ステップ921で、ループ本体の演算量を検出する。本実施例では前述の通り“3000”と仮定している。次に、処理ステップ922で、ループ繰返し回数“10000”とループ本体の演算量“3000”の積である“30000000”を算出しループ重みとする。次に処理ステップ923で、プログラムブロック重み“30000000”を算出する(プログラムブロック重み“0”+ループ重み“30000000”)。
次に、処理ステップ924で他に動的ループテーブルが存在するか否かを判定し、当該動的ループテーブルの項目“NextテーブルID”の値が“NULL”であるため、処理ステップ925へ進む。処理ステップ924で、存在する場合は、処理ステップ919へ戻り、上記処理を繰り返す。処理ステップ925では、当該プログラムブロック中に他のループが存在するか否かを判定し、存在しないため、処理ステップ926へ進む。存在する場合は、処理ステップ914へ戻り、上記処理を繰り返す。処理ステップ926では、“method2”の当該プログラムブロック重要度テーブル2218の項目“重要度ポイント”へプログラムブロック重み“30000000”を設定する。次に、処理ステップ927で他に動的プログラムブロックが存在するか否かを判定し、2108が存在するので処理ステップ906へ戻り、上記処理を繰り返す。存在しない場合、処理ステップ928へ進む。
処理ステップ906で当該動的プログラムブロック2108とプログラムブロック名称“method3”が一致するプログラムブロック重要度テーブル2217を検出する。次に、処理ステップ907で当該動的プログラムブロックテーブル2108の実行回数“1”を検出し、当該プログラムブロックテーブル2217の重要度順位を実行回数×10だけ上位に引き上げる。ただし、最高1位までとする。本実施例の場合、当該プログラムブロック重要度テーブル2217の重要度順位が2であるので、1とする。次に、処理ステップ908で当該動的プログラムブロックテーブルの項目“コンパイル済フラグ”を判定し、当該動的プログラムブロックテーブル2108の項目“コンパイル済フラグ”が“FALSE”であるため、処理ステップ910へ進む。処理ステップ910では、当該動的プログラムブロックテーブル2108の項目“動的ループテーブルID”が“NULL”以外か否かを判定し、“112”であるため、処理ステップ911へ進む。処理ステップ911では、当該プログラムブロック“method3”の中間コードを検出する。次に、処理ステップ912でプログラムブロック重みに“0”を設定する。次に、処理ステップ913でループが含められるか否か判定する。図6の124行目“for(i=0;i<y3;i++)”にループが存在するため、処理ステップ914へ進む。処理ステップ913でループが存在しない場合、処理ステップ926へ進む。
処理ステップ914では、ループ重みに“0”を設定する。次に、処理ステップ915でループ繰返し回数“y3”を検出する。次に、処理ステップ916でループ繰返し回数が静的に未確定か否かを判定し、未確定であるため、処理ステップ917へ進む。処理ステップ916で、確定の場合、処理ステップ930へ進む。処理ステップ930では、ループ本体の演算量を検出し、処理ステップ931では、ループ重み(ループ繰返し回数×ループ本体演算量)を算出し、処理ステップ932では、プログラムブロック重み(ループ重みを加算した値)を算出する。処理ステップ917では、ループ繰返し回数として暫定値“10”を設定する。次に、処理ステップ918で、動的ループテーブルが存在するか否かを判定し、動的ループテーブル2119が存在するため、処理ステップ919へ進む。存在しない場合は、処理ステップ925へ進む。処理ステップ919では、当該動的ループテーブル2119の項目“ループ行番号”と一致するか否かを判定し、一致するため、処理ステップ920へ進む。一致しない場合は、処理ステップ921へ進む。
処理ステップ920では、ループ繰返し回数として当該動的ループテーブル2119の項目“ループ繰返し回数”の値“100”を設定する。次に、処理ステップ921で、ループ本体の演算量を検出する。本実施例では前述の通り“1500”と仮定している。次に、処理ステップ922で、ループ繰返し回数“100”とループ本体の演算量“1500”の積である“150000”を算出しループ重みとする。次に、処理ステップ923で、プログラムブロック重み“150000”を算出する(プログラムブロック重み“0”+ループ重み“150000”)。次に、処理ステップ924で他に動的ループテーブルが存在するか否かを判定し、存在しないため、処理ステップ925へ進む。処理ステップ925では、当該プログラムブロック中に他のループが存在するか否かを判定し、図6の121行目“for(i=0;i<y2;i++)”にループが存在するため、処理ステップ914へ進む。処理ステップ913でループが存在しない場合、処理ステップ926へ進む。
処理ステップ914では、ループ重みに“0”を設定する。次に、処理ステップ915でループ繰返し回数“y2”を検出する。次に、処理ステップ916でループ繰返し回数が静的に未確定か否かを判定し、未確定であるため、処理ステップ917へ進む。処理ステップ916で、確定の場合、処理ステップ930へ進む。処理ステップ917では、ループ繰返し回数として暫定値“10”を設定する。次に、処理ステップ918で、動的ループテーブルが存在するか否かを判定し、動的ループテーブル2118が存在するため、処理ステップ919へ進む。存在しない場合は、処理ステップ925へ進む。処理ステップ919では、当該動的ループテーブル2118の項目“ループ行番号”と一致するか否かを判定し、一致するため、処理ステップ920へ進む。一致しない場合は、処理ステップ921へ進む。処理ステップ920では、ループ繰返し回数として当該動的ループテーブル2118の項目“ループ繰返し回数”の値“100”を設定する。
次に、処理ステップ921で、ループ本体の演算量を検出する。本実施例では前述の通り“2000”と仮定している。次に、処理ステップ922で、ループ繰返し回数“100”とループ本体の演算量“2000”の積である“200000”を算出しループ重みとする。次に処理ステップ923で、プログラムブロック重み“350000”を算出する(プログラムブロック重み“150000”+ループ重み“200000”)。次に、処理ステップ924で他に動的ループテーブルが存在するか否かを判定し、存在しないため、処理ステップ925へ進む。処理ステップ925では、当該プログラムブロック中に他のループが存在するか否かを判定し、図6の118行目“for(i=0;i<y1;i++)”にループが存在するため、処理ステップ914へ進む。処理ステップ913でループが存在しない場合、処理ステップ926へ進む。
処理ステップ914では、ループ重みに“0”を設定する。次に、処理ステップ915でループ繰返し回数“y1”を検出する。次に、処理ステップ916でループ繰返し回数が静的に未確定か否かを判定し、未確定であるため、処理ステップ917へ進む。処理ステップ916で、確定の場合、処理ステップ930へ進む。処理ステップ917では、ループ繰返し回数として暫定値“10”を設定する。次に、処理ステップ918で、動的ループテーブルが存在するか否かを判定し、動的ループテーブル2117が存在するため、処理ステップ919へ進む。存在しない場合は、処理ステップ925へ進む。処理ステップ919では、当該動的ループテーブル2117の項目“ループ行番号”と一致するか否かを判定し、一致するため、処理ステップ920へ進む。一致しない場合は、処理ステップ921へ進む。処理ステップ920では、ループ繰返し回数として当該動的ループテーブル2117の項目“ループ繰返し回数”の値“100”を設定する。
次に、処理ステップ921で、ループ本体の演算量を検出する。本実施例では前述の通り“1000”と仮定している。次に、処理ステップ922で、ループ繰返し回数“100”とループ本体の演算量“1000”の積である“100000”を算出しループ重みとする。次に処理ステップ923で、プログラムブロック重み“450000”を算出する(プログラムブロック重み“350000”+ループ重み“100000”)。次に、処理ステップ924で他に動的ループテーブルが存在するか否かを判定し、存在しないため、処理ステップ925へ進む。処理ステップ925では、当該プログラムブロック中に他のループが存在するか否かを判定し、存在しないため、処理ステップ926へ進む。存在する場合は、処理ステップ914へ戻り、上記処理を繰り返す。
処理ステップ926では、“method3”の当該プログラムブロック重要度テーブル2217の項目“重要度ポイント”へプログラムブロック重み“450000”を設定する。次に、処理ステップ927で他に動的プログラムブロックが存在するか否かを判定し、存在しないため、処理ステップ928へ進む。次に、処理ステップ928で、プログラムブロック重要度テーブル2216、2217、2217を重要度ポイントで昇順にソートする。結果例を図16(“重要度順位”2231、“プログラムブロック名称”2232、“重要度ポイント”2233、“コンパイル済フラグ”2234、“動的情報解析範囲コード”2235、プログラムブロック重要度テーブル2236、2237、2238)に示す。このように静的解析だけでは得られない、実際のプログラム実行における精度の高いプログラムブロック毎の重要度が得られ、これに基づいた事前コンパイルを実施することで、プログラム実行の高速化を実現する。次に、処理ステップで、動的情報更新フラグに“FALSE”を設定し、本動的解析処理を終了する。
以上で、本発明の重要度ベース事前コンパイルプログラム実行方法の第一実施例の説明を終了する。
この第一実施例によれば、静的解析の結果得られたプログラムブロック毎の重要度に動的解析結果を反映して精度良い重要度を算出し、このプログラム実行中に遂次更新される重要度を基に、プログラム実行用コア(CPU)と別の事前コンパイル用コアで事前コンパイルさせることにより、利用される可能性の高いプログラムブロックのネイティブコードを事前に準備し、プログラム実行の高速化を実現することができる。
次に、第二実施例について説明する。第一実施例中の図12で説明したコンパイル処理において、処理ステップ808を加える点が異なる。処理ステップ808の詳細を図17を用いて説明する。
図17は、図1における動的情報検出範囲決定部10の動作フローチャートである。図17を用いて、動的情報検出範囲決定処理の流れを説明する。
まず、処理ステップ101でプログラムブロック重要度テーブル2236、2237、2238を入力する(図16)。次に、処理ステップ102でプログラムブロック重要度テーブルが存在するか否かを判定し、プログラムブロック重要度テーブル2236が存在するので、処理ステップ103へ進む、存在しない場合は、本動的情報検出範囲決定処理を終了する。処理ステップ103では、当該プログラムブロック重要度テーブル2236の重要度順位“1”を検出する。次に、処理ステップ104で重要度順位が3未満か否かを判定し、値“1”であるため処理ステップ105へ進み、処理ステップ105では、当該プログラムブロック重要度テーブルの項目“動的情報解析範囲コード”へ値“1”を設定し、その後処理ステップ107へ進む。
処理ステップ104で、値“3”以上の場合、処理ステップ106へ進み、処理ステップ106では、当該プログラムブロック重要度テーブルの項目“動的情報解析範囲コード”へ値“2”を設定し、その後処理ステップ107へ進む。なお、本実施例では、動的情報解析範囲コードの数を2つに、重要度順位の切り分けを3位未満としたが、これらの値は状況によって変更される。処理ステップ107では、他にプログラムブロック重要度テーブルが存在するか否かを判定し、プログラムブロック重要度テーブル2237が存在するため、処理ステップ103へ戻り、上記処理を繰り返す。処理ステップ107で、存在しない場合は、本動的情報検出範囲決定処理を終了する。
この第二実施例によれば、コンパイル処理において、処理ステップ808を加えることで、プログラム実行時の動的情報取得コストを低減させることが可能となる。よって、この第二実施例によれば、第一実施例よりさらに高速化が可能になる。
最後に、本実施の形態のプログラム実行システムを実現するハードウェア構成を説明する。図18は、図1におけるプログラム実行システムを実現するプログラム実行処理装置の概要を示すブロック図である。
図18において、プログラム実行処理装置は、プログラム実行用のCPU1(1001)、プログラムブロックの事前コンパイルを行うCPU2(1002)、主記憶装置1003、二次記憶装置1004、これらを結合する結合装置1005から構成される。二次記憶装置1004には中間コード1が格納され、また主記憶装置1003で仮想マシン2が構築される。このようなマルチコア環境において、静的解析によって抽出される「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」と、「当該プログラムブロックに含まれるループ重みの合計」と「当該プログラムブロックの実行回数」の積から成る「プログラムブロック重み」と、「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を組合わせてプログラムブロック毎の重要度を精度良く決定し、これに従った事前コンパイル結果を利用することにより、プログラム実行を高速化することができる。
また、重要度からプログラムブロック毎の動的情報として取得する項目の範囲を分類し、重要度が低いプログラムブロックの取得すべき動的情報項目を限定することで、プログラム実行時の重要度が低いプログラムブロックの動的情報取得コストを低減させることにより、さらなるプログラム実行を高速化することが可能となる。
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は前記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。
本発明は、プログラム実行技術に関し、特に、重要度ベース事前コンパイルプログラム実行方法、プログラム、およびプログラム実行システムに利用可能である。
1…中間コード、2…仮想マシン、3…タスク割当部、4…実行制御部、5…動的情報検出部、6…事前コンパイル制御部、7…静的解析部、8…コンパイル部、9…動的解析部、10…動的情報検出範囲決定部、21…動的情報、22…プログラムブロック重要度情報、23…ネイティブコード、1001…CPU1、1002…CPU2、1003…主記憶装置、1004…二次記憶装置、1005…結合装置。
Claims (6)
- ソースプログラムから変換された中間コードを入力し、プログラム実行を担当するタスクとプログラムの事前コンパイルを担当するタスクを割当てる第1のステップと、
中間コードもしくはネイティブコードを入力してプログラムを実行し、プログラムブロック毎の「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を抽出する第2のステップと、
中間コードを入力し、静的解析の結果抽出した「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」、および「当該プログラムブロックに含まれる全ループの重みの合計」と「当該プログラムブロック実行回数」の積から成る「プログラムブロック重み」と、前記「動的情報」を組合わせてプログラムブロック毎の重要度を決定し、この実行時に遂次更新する重要度順に従って事前コンパイルしてネイティブコードを出力する第3のステップとを有することを特徴とするプログラム実行方法。 - 請求項1記載のプログラム実行方法において、
前記第3のステップは、プログラムブロック毎の重要度順をベースに動的情報として検出する項目の範囲を決定するステップを有し、
上記第2のステップは、前記動的情報の検出範囲に従って検出する動的情報の範囲を変更するステップを有することを特徴とするプログラム実行方法。 - ソースプログラムから変換された中間コードを入力し、プログラム実行を担当するタスクとプログラムの事前コンパイルを担当するタスクを割当てる第1のステップと、
中間コードもしくはネイティブコードを入力してプログラムを実行し、プログラムブロック毎の「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を抽出する第2のステップと、
中間コードを入力し、静的解析の結果抽出した「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」、および「当該プログラムブロックに含まれる全ループの重みの合計」と「当該プログラムブロック実行回数」の積から成る「プログラムブロック重み」と、前記「動的情報」を組合わせてプログラムブロック毎の重要度を決定し、この実行時に遂次更新する重要度順に従って事前コンパイルしてネイティブコードを出力する第3のステップとを計算機に実行させることを特徴とするプログラム。 - 請求項3記載のプログラムにおいて、
前記第3のステップは、プログラムブロック毎の重要度順をベースに動的情報として検出する項目の範囲を決定するステップを前記計算機に実行させ、
上記第2のステップは、前記動的情報の検出範囲に従って検出する動的情報の範囲を変更するステップを前記計算機に実行させることを特徴とするプログラム。 - ソースプログラムから変換された中間コードを入力し、プログラム実行を担当するタスクとプログラムの事前コンパイルを担当するタスクを割当てる第1の手段と、
中間コードもしくはネイティブコードを入力してプログラムを実行し、プログラムブロック毎の「ループ繰返し回数」と「プログラムブロック実行回数」から成る「動的情報」を抽出する第2の手段と、
中間コードを入力し、静的解析の結果抽出した「ループ本体演算量」と「ループ繰返し回数」の積から成る「ループ重み」、および「当該プログラムブロックに含まれる全ループの重みの合計」と「当該プログラムブロック実行回数」の積から成る「プログラムブロック重み」と、前記「動的情報」を組合わせてプログラムブロック毎の重要度を決定し、この実行時に遂次更新する重要度順に従って事前コンパイルしてネイティブコードを出力する第3の手段とを有することを特徴とするプログラム実行システム。 - 請求項5記載のプログラム実行システムにおいて、
前記第3の手段は、プログラムブロック毎の重要度順をベースに動的情報として検出する項目の範囲を決定する手段を有し、
上記第2の手段は、前記動的情報の検出範囲に従って検出する動的情報の範囲を変更する手段を有することを特徴とするプログラム実行システム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006165913A JP2007334643A (ja) | 2006-06-15 | 2006-06-15 | プログラム実行方法、プログラム、およびプログラム実行システム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006165913A JP2007334643A (ja) | 2006-06-15 | 2006-06-15 | プログラム実行方法、プログラム、およびプログラム実行システム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2007334643A true JP2007334643A (ja) | 2007-12-27 |
Family
ID=38934064
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2006165913A Pending JP2007334643A (ja) | 2006-06-15 | 2006-06-15 | プログラム実行方法、プログラム、およびプログラム実行システム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2007334643A (ja) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2013105464A (ja) * | 2011-11-16 | 2013-05-30 | Fujitsu Ltd | アプリケーションサーバ |
JP5360506B2 (ja) * | 2008-09-09 | 2013-12-04 | 日本電気株式会社 | マルチコアにおけるプログラミングシステム、その方法及びそのプログラム |
US9170830B2 (en) | 2013-03-26 | 2015-10-27 | Fujitsu Limited | Method for controlling program execution |
KR20160132434A (ko) * | 2014-03-11 | 2016-11-18 | 아이이엑스 그룹, 인크. | 데이터 동기화 및 페일오버 관리를 위한 시스템들 및 방법들 |
CN109324949A (zh) * | 2018-09-14 | 2019-02-12 | 珠海金山网络游戏科技有限公司 | 一种lua代码执行性能的静态分析方法 |
-
2006
- 2006-06-15 JP JP2006165913A patent/JP2007334643A/ja active Pending
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP5360506B2 (ja) * | 2008-09-09 | 2013-12-04 | 日本電気株式会社 | マルチコアにおけるプログラミングシステム、その方法及びそのプログラム |
JP2013105464A (ja) * | 2011-11-16 | 2013-05-30 | Fujitsu Ltd | アプリケーションサーバ |
US9170830B2 (en) | 2013-03-26 | 2015-10-27 | Fujitsu Limited | Method for controlling program execution |
KR20160132434A (ko) * | 2014-03-11 | 2016-11-18 | 아이이엑스 그룹, 인크. | 데이터 동기화 및 페일오버 관리를 위한 시스템들 및 방법들 |
JP2017511939A (ja) * | 2014-03-11 | 2017-04-27 | アイイーエックス グループ,インコーポレーテッド | データ同期及びフェイルオーバ管理のためのシステム及び方法 |
KR20200137045A (ko) * | 2014-03-11 | 2020-12-08 | 아이이엑스 그룹, 인크. | 데이터 동기화 및 페일오버 관리를 위한 시스템들 및 방법들 |
KR102250613B1 (ko) | 2014-03-11 | 2021-05-10 | 아이이엑스 그룹, 인크. | 데이터 동기화 및 페일오버 관리를 위한 시스템들 및 방법들 |
KR102250617B1 (ko) | 2014-03-11 | 2021-05-10 | 아이이엑스 그룹, 인크. | 데이터 동기화 및 페일오버 관리를 위한 시스템들 및 방법들 |
CN109324949A (zh) * | 2018-09-14 | 2019-02-12 | 珠海金山网络游戏科技有限公司 | 一种lua代码执行性能的静态分析方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP2281236B1 (en) | Just-ahead-of-time compilation | |
US8645932B2 (en) | Control flow analysis methods and computing devices for converting COBOL-sourced programs to object-oriented program structures | |
Rigger et al. | Bringing low-level languages to the JVM: Efficient execution of LLVM IR on Truffle | |
US6973644B2 (en) | Program interpreter | |
US8806456B2 (en) | Configuration-preserving preprocessor and configuration-preserving parser | |
US6636880B1 (en) | Automatic conversion of units in a computer program | |
Li et al. | Automatic extraction of coarse-grained data-flow threads from imperative programs | |
CN103858099A (zh) | 用于在异构计算机上编译和运行高级程序的技术 | |
JPH1097430A (ja) | 最適化のためにアセンブリコードルーチンをソースコードルーチンに挿入する方法およびそのシステム | |
US20020092005A1 (en) | System and method for optimizing operations via dataflow analysis | |
Miecznikowski et al. | Decompiling Java using staged encapsulation | |
US20130167126A1 (en) | In-order execution in an asynchronous programming environment | |
US20040015918A1 (en) | Program optimization method and compiler using the program optimization method | |
Grimmer et al. | Trufflec: Dynamic execution of c on a java virtual machine | |
JP2007334643A (ja) | プログラム実行方法、プログラム、およびプログラム実行システム | |
US20080028383A1 (en) | Architecture Cloning For Power PC Processors | |
Yuan et al. | Compiling esterel for multi-core execution | |
Fonseca et al. | Controlling the granularity of automatic parallel programs | |
JP2009009253A (ja) | プログラム実行方法、プログラム、およびプログラム実行システム | |
Barrière et al. | Towards formally verified just-in-time compilation | |
Qunaibit et al. | Accelerating dynamically-typed languages on heterogeneous platforms using guards optimization | |
Prokesch et al. | Towards automated generation of time-predictable code | |
Ingole et al. | Dynamic shortest paths using javascript on gpus | |
CN106255958B (zh) | 用于执行程序代码的方法和装置 | |
Campanoni et al. | Dynamic look ahead compilation: a technique to hide jit compilation latencies in multicore environment |