(57)【要約】【課題】  原始プログラムのうち実行回数の多い部分、或いは実行回数の多い可能性の高い部分を良好な精度で選び出し優先的にコンパイルすることを可能にする。【解決手段】  Ｓ１１はメインプログラムについて、多重入れ子構造又は１重入れ子構造を有するループを探索する。Ｓ１４はループの中から呼び出されている別のプログラムを検出する。Ｓ１５は呼出し先のプログラムについて多重入れ子構造又は１重入れ子構造を有するループを探索する。Ｓ１７は、それまでに検出されたループの入れ子の総数をループ深さとして算出する。即ちＳ１７は、呼出し関係にある複数のプログラムにわたって多重入れ子構造をなしているループの全体としての多重度を、ループ深さとして算出する。Ｓ２０は、ループ深さが大きいループを優先的にコンパイルすべき部分に含める。Ｓ２１は、コンパイルすべきと決定された部分のみをコンパイルする。【選択図】      図９
2004326760.tif 000002
【特許請求の範囲】
【請求項１】
原始プログラムを目的プログラムに変換するコンパイラであって、
前記原始プログラムに含まれる多重入れ子構造を検出する多重入れ子構造検出手順と、
前記多重入れ子構造を構成する各単位ループの戻り先アドレスを検出する戻り先アドレス検出手順と、
前記戻り先アドレス検出手順が検出した複数の戻り先アドレスのうちに、互いにアドレスが共通する重複戻り先アドレスがあるか否かを判定するアドレス重複判定手順と、
前記アドレス重複判定手順が前記重複戻り先アドレスがあると判定した場合に、前記目的プログラムとして、前記重複戻り先アドレスを互いに異なるアドレスとした目的プログラムへ、前記原始プログラムを変換する分割手順とをコンピュータに実行させるためのコンパイラ。
【請求項２】
前記分割手順は、前記重複戻り先アドレスの何れかに、実行に影響を与えない命令である不要命令を追加することによって前記重複戻り先アドレスを互いに異なるアドレスとする命令付加手順を備える請求項１記載のコンパイラ。
【請求項３】
第１及び第２の原始プログラムを目的プログラムに変換するコンパイラであって、
前記第１の原始プログラムに含まれ、多重又は１重入れ子構造を有する第１ループを検出する第１ループ検出手順と、
前記第１ループの中から呼び出される前記第２の原始プログラムに含まれ、多重又は１重入れ子構造を有する第２ループを検出する第２ループ検出手順と、
前記第１ループの入れ子数と前記第２ループの入れ子数とを加算して総入れ子数を計算するループ深さ評価手順と、
前記総入れ子数が大きい第２ループを優先的にコンパイルすることにより、前記第１及び第２の原始プログラムを前記目的プログラムに変換する部分コンパイル手順とをコンピュータに実行させるためのコンパイラ。
【請求項４】
複数の原始プログラムを目的プログラムに変換するコンパイラであって、
前記複数の原始プログラムの一つに含まれ、多重又は１重入れ子構造を有する第１ループを探索する第１ループ検出手順と、
前記第１ループ検出手順が前記第１ループを検出した場合に、前記複数の原始プログラムのうち、前記第１ループの中から呼び出される別の原始プログラムに含まれ、多重又は１重入れ子構造を有する第２ループを探索する第２ループ検出手順と、
前記第２ループ検出手順が前記第２ループを検出した場合に、前記第１ループ検出手段が前記第１ループを検出したものとして、前記第２ループ検出手順を再び実行する第１反復手順と、
前記第１ループと前記第２ループとの何れかが検出されなかった場合に、それまでに検出したループの入れ子の総数であるループ深さを算出するループ深さ評価手順と、
前記第１ループ検出手順から前記ループ深さ評価手順までを、前記第１ループが検出されなくなるまで反復する第２反復手順と、
前記複数の原始プログラムのうち、ループ深さが大きいループを優先的にコンパイルすることにより、前記複数の原始プログラムを前記目的プログラムへ変換する部分コンパイル手順とをコンピュータに実行させるためのコンパイラ。
【請求項５】
前記部分コンパイル手順は、前記ループ深さ評価手順が算出したループ深さの最大値が予め定められた閾値に満たないときには、前記複数の原始プログラムの何れの部分をもコンパイルしない請求項４記載のコンパイラ。
【請求項６】
前記ループ深さ評価手順が複数のループ深さを算出した場合に、前記複数のループ深さが均一であるか否かを判定する均一度評価手順を前記コンピュータに更に実行させ、
前記部分コンパイル手順は、前記均一度評価手順が、前記複数のループ深さが均一であると判定した場合には、前記複数の原始プログラムの何れの部分をもコンパイルしない請求項４又は５記載のコンパイラ。
【請求項７】
第１及び第２の原始プログラムを目的プログラムに変換するコンパイラであって、
前記第１の原始プログラムに含まれ、反復して実行される部分である第１反復実行部を検出する第１反復実行部検出手順と、
前記第１反復実行部の中から呼び出される前記第２の原始プログラムに含まれ、反復して実行される部分である第２反復実行部を検出する第２反復実行部検出手順と、
前記第１反復実行部の実行回数と前記第２反復実行部との実行回数とを加算して総実行回数を計算する総実行回数評価手順と、
前記総実行回数が大きい第２反復実行部を優先的にコンパイルすることにより、前記第１及び第２の原始プログラムを前記目的プログラムに変換する部分コンパイル手順とをコンピュータに実行させるためのコンパイラ。
【請求項８】
複数の原始プログラムを目的プログラムに変換するコンパイラであって、
前記複数の原始プログラムの一つに含まれ、反復して実行される部分である第１反復実行部を探索する第１反復実行部検出手順と、
前記第１反復実行部検出手順が前記第１反復実行部を検出した場合に、前記複数の原始プログラムのうち、前記第１反復実行部の中から呼び出される別の原始プログラムに含まれ、反復して実行される第２反復実行部を探索する第２反復実行部検出手順と、
前記第２反復実行部検出手順が前記第２反復実行部を検出した場合に、前記第１反復実行部検出手段が前記第１反復実行部を検出したものとして、前記第２反復実行部検出手順を再び実行する第１反復手順と、
前記第１反復実行部と前記第２反復実行部との何れかが検出されなかった場合に、それまでに検出した反復実行部の実行回数の総和である総実行回数を算出する総実行回数評価手順と、
前記第１反復実行部検出手順から前記総実行回数評価手順までを、前記第１反復実行部が検出されなくなるまで反復する第２反復手順と、
前記複数の原始プログラムのうち、総実行回数が大きい反復実行部を優先的にコンパイルすることにより、前記複数の原始プログラムを前記目的プログラムへ変換する部分コンパイル手順とをコンピュータに実行させるためのコンパイラ。
【請求項９】
前記部分コンパイル手順は、前記総実行回数評価手順が算出した総実行回数の最大値が予め定められた閾値に満たない場合には、前記複数の原始プログラムの何れの部分をもコンパイルしない請求項８記載のコンパイラ。
【請求項１０】
前記総実行回数評価手順が複数の総実行回数を算出した場合に、前記複数の総実行回数が均一であるか否かを判定する均一度評価手順を前記コンピュータに更に実行させ、
前記部分コンパイル手順は、前記均一度評価手順が、前記複数の総実行回数が均一であると判定した場合には、前記複数の原始プログラムの何れの部分をもコンパイルしない請求項８又は９記載のコンパイラ。
【請求項１１】
第１及び第２の原始プログラムを目的プログラムに変換するコンパイラであって、
前記第１の原始プログラムに含まれる多重若しくは１重入れ子構造を有するループ又は非ループである第１処理部分の中から呼び出される前記第２の原始プログラムに含まれる多重若しくは１重入れ子構造を有するループ又は非ループである第２処理部分を探索する第１呼び出し検出手順と、
前記第１呼び出し検出手順が前記第２処理部分を検出した場合に、前記第２処理部分の中で呼び出されている前記第１の原始プログラムのうちの前記第１処理部分を含む処理部分である第３処理部分を探索する第２呼び出し検出手順と、
前記第２呼び出し検出手順が前記第３処理部分を検出した場合に、前記第１及び第２原始プログラムのうち、前記第２処理部分と前記第３処理部分とをコンパイルすることにより、前記第１及び第２原始プログラムを前記目的プログラムへ変換する部分コンパイル手順とをコンピュータに実行させるためのコンパイラ。
【請求項１２】
原始プログラムを目的プログラムに変換するコンパイラであって、
前記原始プログラムに含まれる多重入れ子構造を検出する多重入れ子構造検出手順と、
前記多重入れ子構造を構成する各単位ループの戻り先アドレスを検出する戻り先アドレス検出手順と、
前記戻り先アドレス検出手順が検出した複数の戻り先アドレスのうちに、実行に影響を与えない命令である不要命令を有するものがあるか否かを判定する不要命令検出手順と、
前記不要命令検出手順が前記不要命令を有する戻り先アドレスを検出した場合に、前記目的プログラムとして、前記不要命令を削除した目的プログラムへ、前記原始プログラムを変換する不要命令削除手順とをコンピュータに実行させるためのコンパイラ。
【請求項１３】
コンピュータ読み取り可能な記録媒体であって、
請求項１から請求項１２の何れか１項に記載のコンパイラを記録した記録媒体。
【請求項１４】
原始プログラムを目的プログラムに変換するコンパイル装置であって、
前記原始プログラムに含まれる多重入れ子構造を検出する多重入れ子構造検出手段と、
前記多重入れ子構造を構成する各単位ループの戻り先アドレスを検出する戻り先アドレス検出手段と、
前記戻り先アドレス検出手段が検出した複数の戻り先アドレスのうちに、互いにアドレスが共通する重複戻り先アドレスがあるか否かを判定するアドレス重複判定手段と、
前記アドレス重複判定手順が前記重複戻り先アドレスがあると判定した場合に、前記目的プログラムとして、前記重複戻り先アドレスを互いに異なるアドレスとした目的プログラムへ、前記原始プログラムを変換する分割手段とを備えるコンパイル装置。
【請求項１５】
複数の原始プログラムを目的プログラムに変換するコンパイル装置であって、
前記複数の原始プログラムのうちの一つの原始プログラムに含まれ、多重又は１重入れ子構造を有する第１ループを探索する第１ループ検出手段と、
前記第１ループ検出手段が前記第１ループを検出する毎に、前記複数の原始プログラムのうち、前記第１ループの中から呼び出される別の原始プログラムに含まれ、多重又は１重入れ子構造を有する第２ループを探索するとともに、前記第２ループを検出した場合には、前記第１ループ検出手段が前記第１ループを検出したものとして、更に前記第２ループを探索することにより、前記一つの原始プログラムと当該一つの原始プログラムから順に呼び出し先となっている各原始プログラムとの間で構成される多重入れ子構造を探索する第２ループ検出手段と、
前記第１ループ検出手段が前記第１ループを検出する毎に、前記第１ループの入れ子の数、または前記第２ループ検出手段が前記第２ループを検出した場合には、前記第１ループから各第２ループについて順に加算して得た入れ子の総数であるループ深さを算出するループ深さ評価手段と、
前記複数の原始プログラムのうち、ループ深さが大きいループを優先的にコンパイルすることにより、前記複数の原始プログラムを前記目的プログラムへ変換する部分コンパイル手段とを備えるコンパイル装置。
【請求項１６】
前記部分コンパイル手段は、前記ループ深さ評価手段が算出したループ深さの最大値が予め定められた閾値に満たない場合には、前記複数の原始プログラムの何れの部分をもコンパイルしない請求項１５記載のコンパイル装置。
【請求項１７】
前記ループ深さ評価手段が複数のループ深さを算出した場合に、前記複数のループ深さが均一であるか否かを判定する均一度評価手段を更に備え、
前記部分コンパイル手段は、前記均一度評価手段が均一であると判定した場合には、前記複数の原始プログラムの何れの部分をもコンパイルしない請求項１５又は１６記載のコンパイル装置。
【請求項１８】
請求項１４乃至１７の何れかに記載のコンパイル装置と、
前記コンパイル装置がコンパイルすべき原始プログラムを伝送媒体を通じて取得する通信手段と、
前記コンパイル装置が生成した目的プログラムを実行する実行制御手段とを備える通信端末装置。
【請求項１９】
前記実行制御部は、前記コンパイル装置が処理対象とし且つその何れの部分をもコンパイルしなかった原始プログラムである非コンパイルプログラムをも実行対象とし、
前記実行制御部は、
前記非コンパイルプログラムの実行中に、当該目的プログラムのうちの定められた基準値を超える頻度で実行される部分である高頻度実行部分を検出する頻度検出手段と、
前記頻度検出部が検出した前記高頻度実行部分をコンパイルする別の部分コンパイル手段とを備える請求項１８記載の通信端末装置。
【請求項２０】
コンピュータが原始プログラムを目的プログラムに変換するコンパイル方法であって、
前記原始プログラムに含まれる多重入れ子構造を検出する多重入れ子構造検出手順と、
前記多重入れ子構造を構成する各単位ループの戻り先アドレスを検出する戻り先アドレス検出手順と、
前記戻り先アドレス検出手順が検出した複数の戻り先アドレスのうちに、互いにアドレスが共通する重複戻り先アドレスがあるか否かを判定するアドレス重複判定手順と、
前記アドレス重複判定手順が前記重複戻り先アドレスがあると判定した場合に、前記目的プログラムとして、前記重複戻り先アドレスを互いに異なるアドレスとした目的プログラムへ、前記原始プログラムを変換する分割手順とを備えるコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、高級プログラム言語と称されることのあるコンパイラ言語、例えば、Ｃ言語、Ｃ＋＋言語、Ｊａｖａ（Ｒ）言語、ＦＯＲＴＲＡＮ及びＣＯＢＯＬ等の古典的なコンパイラ言語、或いはＡＰＬ、ＰＬ／１、ＡＤＡ、Ｓｍａｌｌｔａｌｋ、Ｌｉｓｐ、アセンブラ言語、その他のあらゆるプログラム言語で記述された原始プログラムを、何等かの機械向け言語、例えばＣＰＵ（Central Processing Unit；中央演算処理装置）（但し、ＣＰＵはＭＰＵ（Micro Processing Unit；マイクロ演算処理装置）を含む）が直接実行することのできる機械語（マシン語）、機械語に変換する過程としての何等かの中間言語である目的プログラムに変換するコンパイラ、或いはこのコンパイラを記録した記録媒体、コンパイルを行うコンパイル装置、このコンパイル装置を有する通信端末装置及びコンパイルを行うコンパイル方法に関するものである。なお、上記「Ｊａｖａ（Ｒ）」は米国Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ社の登録商標である。本明細書において、記号（Ｒ）は登録商標を表す。
【背景技術】
【０００２】
従来の部分コンパイラとして、例えば特許文献１に記載のものが知られている。特許文献１に記載される従来の部分コンパイラは、関数呼び出し毎のインライン展開の要否の決定を可能とし、実行イメージに合ったインライン展開を行い、実用的且つ効率的なインライン展開を可能とすることを目的とするものであった。この従来技術では、そのために、制御フロー重み付け手段が、制御フロー解析手段の解析結果に基づいて制御フローを構成する各部分制御フローの実行回数を推測し、その実行回数に基づいて各部分制御フローに対する重み付けを行っている。更に、オブジェクト生成手段が、制御フロー重み付け手段による重み付けの結果を参照することにより、各関数呼び出しによって呼び出される関数のインライン展開の要否を決定し、その決定を反映したオブジェクトプログラムを生成する。
【特許文献１】特開平６−２０２８７５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
特許文献１記載の従来の部分コンパイラは、コンパイル部分を決定するために実行回数を算定するに際し、他のプログラムから呼び出されるプログラム内で実行されるサブプログラムがいわゆるループの多重入れ子構造を有しているとき、このループの入れ子の多重度、即ちループの深さを考慮して実行回数を算定している。しかしながら、この部分コンパイラは、呼び出し元プログラムで実行されるサブプログラムも又、ループの多重入れ子構造を有している場合であっても、読み出し元プログラム内でのループの入れ子の多重度、即ちループの深さまでは考慮していない。
【０００４】
そのために、特許文献１記載の従来の部分コンパイラは、呼び出し元で実行されるループの深さと呼び出し先で実行されるループの深さを併せて考慮し、トータルとして実行回数の多い部分を優先的にコンパイルすることができないという問題点を有していた。その結果、この従来技術は、プログラムの実行速度の向上とプログラムを記憶するためのメモリの記憶容量の節減とを最適化することができないという問題点を有していた。
【０００５】
更に、特許文献１記載の従来技術は、例えば２重入れ子構造のループが存在する場合であっても、各ループの戻り先が同じアドレスであって且つ異なるラベル（すなわち、アドレスを表すシンボル・記号）が付されていない場合には、戻り先が１重のループの途中からの戻りと最後からの戻りとであるのか、２重入れ子構造のループの戻り先であるのかを、判別することができないという問題点を有していた。そのために、この従来技術は、ループの深さ或いは実行回数を精度良く算定することができないという問題点を有していた。即ちこの従来技術は、この点においても、実行回数の多い部分を良好な精度で選び出し優先的にコンパイルするということができず、実行速度の向上と使用メモリ領域の節減とを最適化することができないという問題点を有していた。
【０００６】
本発明は上記の問題点に鑑みてなされたもので、原始プログラムのうち実行回数の多い部分、或いは実行回数の多い可能性の高い部分を良好な精度で選び出し優先的にコンパイルすることを可能にし、それにより、プログラムの実行速度の向上とプログラムを記憶するためのメモリの記憶容量の節減とを良好な精度で最適化することを可能にするコンパイラ、記録媒体、コンパイル装置、通信端末装置及びコンパイル方法を提供することを目的とする。
【課題を解決するための手段】
【０００７】
上記課題を解決し上記目的を達成するために、請求項１に記載の発明は、原始プログラムを目的プログラムに変換するコンパイラであって、前記原始プログラムに含まれる多重入れ子構造を検出する多重入れ子構造検出手順と、前記多重入れ子構造を構成する各単位ループの戻り先アドレスを検出する戻り先アドレス検出手順と、前記戻り先アドレス検出手順が検出した複数の戻り先アドレスのうちに、互いにアドレスが共通する重複戻り先アドレスがあるか否かを判定するアドレス重複判定手順と、前記アドレス重複判定手順が前記重複戻り先アドレスがあると判定した場合に、前記目的プログラムとして、前記重複戻り先アドレスを互いに異なるアドレスとした目的プログラムへ、前記原始プログラムを変換する分割手順とをコンピュータに実行させるためのものである。
【０００８】
請求項１記載の発明によれば、分割手順が、多重入れ子構造を構成する単位ループの戻り先アドレスのうちに重複するものがある場合に、重複するアドレスを互いに異なるアドレスにするので、ループの深さの算定を正しく行うことが可能となる。それにより、実行回数の多い部分である可能性の高いループの深い部分を正しく選択して優先的にコンパイルすることが可能となる。
【０００９】
請求項２記載の発明は、請求項１記載のコンパイラであって、前記分割手順は、前記重複戻り先アドレスの何れかに、実行に影響を与えない命令である不要命令を追加することによって前記重複戻り先アドレスを互いに異なるアドレスとする命令付加手順を備えるものである。
【００１０】
請求項２記載の発明によれば、分割手順が不要命令を追加することにより重複戻り先アドレスを互いに異なるアドレスとするので、実行への影響をもたらすことなく、ループの深さを正しく算出することが可能となる。
【００１１】
請求項３記載の発明は、第１及び第２の原始プログラムを目的プログラムに変換するコンパイラであって、前記第１の原始プログラムに含まれ、多重又は１重入れ子構造を有する第１ループを検出する第１ループ検出手順と、前記第１ループの中から呼び出される前記第２の原始プログラムに含まれ、多重又は１重入れ子構造を有する第２ループを検出する第２ループ検出手順と、前記第１ループの入れ子数と前記第２ループの入れ子数とを加算して総入れ子数を計算するループ深さ評価手順と、前記総入れ子数が大きい第２ループを優先的にコンパイルすることにより、前記第１及び第２の原始プログラムを前記目的プログラムに変換する部分コンパイル手順とをコンピュータに実行させるためのものである。
【００１２】
請求項３記載の発明によれば、一つの原始プログラムに含まれる第１ループの入れ子数だけでなく、このループの中から呼び出される別の原始プログラムに含まれる第２ループの入れ子数をも含めた総入れ子数が計算され、総入れ子数の大きい第２ループが優先的にコンパイルされる。すなわち、呼び出し元で実行されるループの深さと呼び出し先で実行されるループの深さを併せて考慮し、実行回数の多い部分である可能性の高い、トータルとして入れ子数の多いループが優先的にコンパイルされる。
【００１３】
請求項４記載の発明は、複数の原始プログラムを目的プログラムに変換するコンパイラであって、前記複数の原始プログラムの一つに含まれ、多重又は１重入れ子構造を有する第１ループを探索する第１ループ検出手順と、前記第１ループ検出手順が前記第１ループを検出した場合に、前記複数の原始プログラムのうち、前記第１ループの中から呼び出される別の原始プログラムに含まれ、多重又は１重入れ子構造を有する第２ループを探索する第２ループ検出手順と、前記第２ループ検出手順が前記第２ループを検出した場合に、前記第１ループ検出手段が前記第１ループを検出したものとして、前記第２ループ検出手順を再び実行する第１反復手順と、前記第１ループと前記第２ループとの何れかが検出されなかった場合に、それまでに検出したループの入れ子の総数であるループ深さを算出するループ深さ評価手順と、前記第１ループ検出手順から前記ループ深さ評価手順までを、前記第１ループが検出されなくなるまで反復する第２反復手順と、前記複数の原始プログラムのうち、ループ深さが大きいループを優先的にコンパイルすることにより、前記複数の原始プログラムを前記目的プログラムへ変換する部分コンパイル手順とをコンピュータに実行させるためのものである。
【００１４】
請求項４記載の発明によれば、一つの原始プログラムに含まれるループの入れ子数だけでなく、このループを起点として順次呼び出される原始プログラムに含まれるループの入れ子数をも含めた入れ子の総数が計算され、入れ子の総数の大きいループが優先的にコンパイルされる。即ち、一つの原始プログラムから順に呼び出し先となっている各原始プログラムとの間で構成される多重入れ子構造をも含めて、入れ子の総数の大きいループが優先的にコンパイルされる。従って、原始プログラムのうちの実行回数の多い部分である可能性の高い部分が、より精度良く選び出されコンパイルされる。
【００１５】
請求項５記載の発明は、請求項４記載のコンパイラであって、前記部分コンパイル手順が、前記ループ深さ評価手順が算出したループ深さの最大値が予め定められた閾値に満たないときには、前記複数の原始プログラムの何れの部分をもコンパイルしないものである。
【００１６】
請求項５記載の発明によれば、ループ深さの最大値が閾値に満たないときには、複数の原始プログラムの何れの部分もコンパイルされないので、実行速度の向上への寄与の低い部分を無駄にコンパイルしてメモリ領域を無駄に使用することを回避することができる。
【００１７】
請求項６記載の発明は、請求項４又は５記載のコンパイラであって、前記ループ深さ評価手順が複数のループ深さを算出した場合に、前記複数のループ深さが均一であるか否かを判定する均一度評価手順を前記コンピュータに更に実行させ、前記部分コンパイル手順は、前記均一度評価手順が、前記複数のループ深さが均一であると判定した場合には、前記複数の原始プログラムの何れの部分をもコンパイルしないものである。
【００１８】
請求項６記載の発明によれば、複数のループ深さが均一である場合には、複数の原始プログラムの何れの部分もコンパイルされないので、実行速度の向上への寄与が同等程度の部分を数多くコンパイルしてメモリ領域の有効利用を損なうことを回避することができる。
【００１９】
請求項７記載の発明は、第１及び第２の原始プログラムを目的プログラムに変換するコンパイラであって、前記第１の原始プログラムに含まれ、反復して実行される部分である第１反復実行部を検出する第１反復実行部検出手順と、前記第１反復実行部の中から呼び出される前記第２の原始プログラムに含まれ、反復して実行される部分である第２反復実行部を検出する第２反復実行部検出手順と、前記第１反復実行部の実行回数と前記第２反復実行部との実行回数とを加算して総実行回数を計算する総実行回数評価手順と、前記総実行回数が大きい第２反復実行部を優先的にコンパイルすることにより、前記第１及び第２の原始プログラムを前記目的プログラムに変換する部分コンパイル手順とをコンピュータに実行させるためのものである。
【００２０】
請求項７記載の発明によれば、一つの原始プログラムに含まれる第１反復実行部の実行回数だけでなく、このループの中から呼び出される別の原始プログラムに含まれる第２反復実行部の実行回数をも含めた総実行回数が計算され、総実行回数の大きい第２反復実行部が優先的にコンパイルされる。すなわち、呼び出し元で実行される反復実行部の実行回数さと呼び出し先で実行される反復実行部の実行回数を併せて考慮し、トータルとして実行回数の多い反復実行部が優先的にコンパイルされる。
【００２１】
請求項８記載の発明は、複数の原始プログラムを目的プログラムに変換するコンパイラであって、前記複数の原始プログラムの一つに含まれ、反復して実行される部分である第１反復実行部を探索する第１反復実行部検出手順と、前記第１反復実行部検出手順が前記第１反復実行部を検出した場合に、前記複数の原始プログラムのうち、前記第１反復実行部の中から呼び出される別の原始プログラムに含まれ、反復して実行される第２反復実行部を探索する第２反復実行部検出手順と、前記第２反復実行部検出手順が前記第２反復実行部を検出した場合に、前記第１反復実行部検出手段が前記第１反復実行部を検出したものとして、前記第２反復実行部検出手順を再び実行する第１反復手順と、前記第１反復実行部と前記第２反復実行部との何れかが検出されなかった場合に、それまでに検出した反復実行部の実行回数の総和である総実行回数を算出する総実行回数評価手順と、前記第１反復実行部検出手順から前記総実行回数評価手順までを、前記第１反復実行部が検出されなくなるまで反復する第２反復手順と、前記複数の原始プログラムのうち、総実行回数が大きい反復実行部を優先的にコンパイルすることにより、前記複数の原始プログラムを前記目的プログラムへ変換する部分コンパイル手順とをコンピュータに実行させるためのものである。
【００２２】
請求項８記載の発明によれば、一つの原始プログラムに含まれる反復実行部の実行回数だけでなく、この反復実行部を起点として順次呼び出される原始プログラムに含まれる反復実行部の実行回数をも含めた総実行回数が計算され、総実行回数の大きい反復実行部が優先的にコンパイルされる。即ち、一つの原始プログラムから順に呼び出し先となっている各原始プログラムとの間で構成される反復実行部の多重構造をも含めて、実行回数の総数の大きい反復実行部が優先的にコンパイルされる。従って、原始プログラムのうちの実行回数の多い部分が、より精度良く選び出されコンパイルされる。
【００２３】
請求項９記載の発明は、請求項８記載のコンパイラであって、前記部分コンパイル手順は、前記総実行回数評価手順が算出した総実行回数の最大値が予め定められた閾値に満たない場合には、前記複数の原始プログラムの何れの部分をもコンパイルしないものである。
【００２４】
請求項９記載の発明によれば、総実行回数の最大値が閾値に満たないときには、複数の原始プログラムの何れの部分もコンパイルされないので、実行速度の向上への寄与の低い部分を無駄にコンパイルしてメモリ領域を無駄に使用することを回避することができる。
【００２５】
請求項１０記載の発明は、請求項８又は９記載のコンパイラであって、前記総実行回数評価手順が複数の総実行回数を算出した場合に、前記複数の総実行回数が均一であるか否かを判定する均一度評価手順を前記コンピュータに更に実行させ、前記部分コンパイル手順は、前記均一度評価手順が、前記複数の総実行回数が均一であると判定した場合には、前記複数の原始プログラムの何れの部分をもコンパイルしないものである。
【００２６】
請求項１０記載の発明によれば、複数の総実行回数が均一である場合には、複数の原始プログラムの何れの部分もコンパイルされないので、実行速度の向上への寄与が同等程度の部分を数多くコンパイルしてメモリ領域の有効利用を損なうことを回避することができる。
【００２７】
請求項１１記載の発明は、第１及び第２の原始プログラムを目的プログラムに変換するコンパイラであって、前記第１の原始プログラムに含まれる多重若しくは１重入れ子構造を有するループ又は非ループである第１処理部分の中から呼び出される前記第２の原始プログラムに含まれる多重若しくは１重入れ子構造を有するループ又は非ループである第２処理部分を探索する第１呼び出し検出手順と、前記第１呼び出し検出手順が前記第２処理部分を検出した場合に、前記第２処理部分の中で呼び出されている前記第１の原始プログラムのうちの前記第１処理部分を含む処理部分である第３処理部分を探索する第２呼び出し検出手順と、前記第２呼び出し検出手順が前記処理部分を検出した場合に、前記第１及び第２原始プログラムのうち、前記第２処理部分と前記第３処理部分とをコンパイルすることにより、前記第１及び第２原始プログラムを前記目的プログラムへ変換する部分コンパイル手順とをコンピュータに実行させるためのものである。
【００２８】
請求項１１記載の発明によれば、第１及び第２呼び出し検出手順が、第１及び第２原始プログラムの間に存在する、いわゆる再入構造を検出し、検出された再入構造を部分コンパイル手順がコンパイルする。即ち、原始プログラムのうちの実行回数の多い可能性の高い部分である再入構造が選び出されコンパイルされる。
【００２９】
請求項１２記載の発明は、原始プログラムを目的プログラムに変換するコンパイラであって、前記原始プログラムに含まれる多重入れ子構造を検出する多重入れ子構造検出手順と、前記多重入れ子構造を構成する各単位ループの戻り先アドレスを検出する戻り先アドレス検出手順と、前記戻り先アドレス検出手順が検出した複数の戻り先アドレスのうちに、実行に影響を与えない命令である不要命令を有するものがあるか否かを判定する不要命令検出手順と、前記不要命令検出手順が前記不要命令を有する戻り先アドレスを検出した場合に、前記目的プログラムとして、前記不要命令を削除した目的プログラムへ、前記原始プログラムを変換する不要命令削除手順とをコンピュータに実行させるためのものである。
【００３０】
請求項１２記載の発明によれば、不要命令削除手順が、多重入れ子構造を構成する単位ループの戻り先アドレスのうちに不要命令がある場合に、この不要命令を削除するので、不要命令による実行速度の遅れを回避することができる。即ち、実行回数の多い部分である可能性の高いループの深い部分を正しく選択して優先的にコンパイルすることを可能にする不要命令を、コンパイル後に削除することにより、メモリ領域を節減しつつ実行速度を更に高めることができる。
【００３１】
請求項１３記載の発明は、コンピュータ読み取り可能な記録媒体であって、請求項１から請求項１２の何れか１項に記載のコンパイラを記録したものである。
【００３２】
請求項１３記載の発明によれば、記録媒体に本発明のコンパイラが記録されているので、当該記録媒体をコンピュータに読み込まれることにより、原始プログラムのうちの実行回数の多い部分、或いは実行回数の多い可能性の高い部分を精度良く選び出してコンパイルすることができる。
【００３３】
請求項１４記載の発明は、原始プログラムを目的プログラムに変換するコンパイル装置であって、前記原始プログラムに含まれる多重入れ子構造を検出する多重入れ子構造検出手段と、前記多重入れ子構造を構成する各単位ループの戻り先アドレスを検出する戻り先アドレス検出手段と、前記戻り先アドレス検出手段が検出した複数の戻り先アドレスのうちに、互いにアドレスが共通する重複戻り先アドレスがあるか否かを判定するアドレス重複判定手段と、前記アドレス重複判定手順が前記重複戻り先アドレスがあると判定した場合に、前記目的プログラムとして、前記重複戻り先アドレスを互いに異なるアドレスとした目的プログラムへ、前記原始プログラムを変換する分割手段とを備えるものである。
【００３４】
請求項１４記載の発明によれば、分割手段が、多重入れ子構造を構成する単位ループの戻り先アドレスのうちに重複するものがある場合に、重複するアドレスを互いに異なるアドレスにするので、ループの深さの算定を正しく行うことが可能となる。それにより、実行回数の多い部分である可能性の高いループの深い部分を正しく選択して優先的にコンパイルすることが可能となる。
【００３５】
請求項１５記載の発明は、複数の原始プログラムを目的プログラムに変換するコンパイル装置であって、前記複数の原始プログラムのうちの一つの原始プログラムに含まれ、多重又は１重入れ子構造を有する第１ループを探索する第１ループ検出手段と、前記第１ループ検出手段が前記第１ループを検出する毎に、前記複数の原始プログラムのうち、前記第１ループの中から呼び出される別の原始プログラムに含まれ、多重又は１重入れ子構造を有する第２ループを探索するとともに、前記第２ループを検出した場合には、前記第１ループ検出手段が前記第１ループを検出したものとして、更に前記第２ループを探索することにより、前記一つの原始プログラムと当該一つの原始プログラムから順に呼び出し先となっている各原始プログラムとの間で構成される多重入れ子構造を探索する第２ループ検出手段と、前記第１ループ検出手段が前記第１ループを検出する毎に、前記第１ループの入れ子の数、または前記第２ループ検出手段が前記第２ループを検出した場合には、前記第１ループから各第２ループについて順に加算して得た入れ子の総数であるループ深さを算出するループ深さ評価手段と、前記複数の原始プログラムのうち、ループ深さが大きいループを優先的にコンパイルすることにより、前記複数の原始プログラムを前記目的プログラムへ変換する部分コンパイル手段とを備えるものである。
【００３６】
請求項１５記載の発明によれば、一つの原始プログラムに含まれるループの入れ子数だけでなく、このループを起点として順次呼び出される原始プログラムに含まれるループの入れ子数をも含めた入れ子の総数が計算され、入れ子の総数の大きいループが優先的にコンパイルされる。即ち、一つの原始プログラムから順に呼び出し先となっている各原始プログラムとの間で構成される多重入れ子構造をも含めて、入れ子の総数の大きいループが優先的にコンパイルされる。従って、原始プログラムのうちの実行回数の多い部分である可能性の高い部分が、より精度良く選び出されコンパイルされる。
【００３７】
請求項１６記載の発明は、請求項１５記載のコンパイル装置であって、前記部分コンパイル手段は、前記ループ深さ評価手段が算出したループ深さの最大値が予め定められた閾値に満たない場合には、前記複数の原始プログラムの何れの部分をもコンパイルしないものである。
【００３８】
請求項１６記載の発明によれば、ループ深さの最大値が閾値に満たないときには、複数の原始プログラムの何れの部分もコンパイルされないので、実行速度の向上への寄与の低い部分を無駄にコンパイルしてメモリ領域を無駄に使用することを回避することができる。
【００３９】
請求項１７記載の発明は、請求項１５又は１６記載のコンパイル装置であって、前記ループ深さ評価手段が複数のループ深さを算出した場合に、前記複数のループ深さが均一であるか否かを判定する均一度評価手段を更に備え、前記部分コンパイル手段は、前記均一度評価手段が均一であると判定した場合には、前記複数の原始プログラムの何れの部分をもコンパイルしないものである。
【００４０】
請求項１７記載の発明によれば、複数のループ深さが均一である場合には、複数の原始プログラムの何れの部分もコンパイルされないので、実行速度の向上への寄与が同等程度の部分を数多くコンパイルしてメモリ領域の有効利用を損なうことを回避することができる。
【００４１】
請求項１８記載の発明は、通信端末装置であって、請求項１４乃至１７の何れかに記載のコンパイル装置と、前記コンパイル装置がコンパイルすべき原始プログラムを伝送媒体を通じて取得する通信手段と、前記コンパイル装置が生成した目的プログラムを実行する実行制御手段とを備えるものである。
【００４２】
請求項１８記載の発明によれば、通信端末装置が通信手段を備えるので、原始プログラムを伝送媒体を通じて取得することができ、これをコンパイル装置によってコンパイルすることができる。更に、通信端末装置が実行制御手段を備えるので、コンパイルされた目的プログラムを実行することができる。即ち、このコンパイル装置によれば、伝送媒体を通じて取得した原始プログラムを実行することができる。更に、通信端末が本発明のコンパイル装置を備えるので、実行速度の向上と使用メモリ領域の節減とを良好な精度で最適化することが可能となる。
【００４３】
請求項１９記載の発明は、請求項１８記載の通信端末装置であって、前記実行制御部は、前記コンパイル装置が処理対象とし且つその何れの部分をもコンパイルしなかった原始プログラムである非コンパイルプログラムをも実行対象とし、前記実行制御部は、前記非コンパイルプログラムの実行中に、当該目的プログラムのうちの定められた基準値を超える頻度で実行される部分である高頻度実行部分を検出する頻度検出手段と、前記頻度検出部が検出した前記高頻度実行部分をコンパイルする別の部分コンパイル手段とを備えるものである。
【００４４】
請求項１９記載の発明によれば、非コンパイルプログラムの実行中に頻度検出手段により検出された高頻度実行部分が、部分コンパイル手段によりコンパイルされる。即ち、非コンパイルプログラムが、いわゆるＪＩＴによりコンパイルされる。従って、実行速度の向上とメモリ領域の節減との最適化の観点から、コンパイル装置が事前コンパイルを行うことが適切ではない場合に、それに代わってＪＩＴにより最適化を図ることができる。
【００４５】
請求項２０記載の発明は、コンピュータが原始プログラムを目的プログラムに変換するコンパイル方法であって、前記原始プログラムに含まれる多重入れ子構造を検出する多重入れ子構造検出手順と、前記多重入れ子構造を構成する各単位ループの戻り先アドレスを検出する戻り先アドレス検出手順と、前記戻り先アドレス検出手順が検出した複数の戻り先アドレスのうちに、互いにアドレスが共通する重複戻り先アドレスがあるか否かを判定するアドレス重複判定手順と、前記アドレス重複判定手順が前記重複戻り先アドレスがあると判定した場合に、前記目的プログラムとして、前記重複戻り先アドレスを互いに異なるアドレスとした目的プログラムへ、前記原始プログラムを変換する分割手順とを備えるものである。
【００４６】
請求項２０記載の発明によれば、分割手順が、多重入れ子構造を構成する単位ループの戻り先アドレスのうちに重複するものがある場合に、重複するアドレスを互いに異なるアドレスにするので、ループの深さの算定を正しく行うことが可能となる。それにより、実行回数の多い部分である可能性の高いループの深い部分を正しく選択して優先的にコンパイルすることが可能となる。
【発明の効果】
【００４７】
以上のように本発明のコンパイラ、記録媒体、コンパイル装置、通信端末装置及びコンパイル方法によれば、原始プログラムのうちの実行回数の多い部分、或いは実行回数の多い可能性の高い部分を精度良く選び出してコンパイルすることができる。それにより、プログラムの実行速度の向上とプログラムを記憶するためのメモリの記憶容量の節減とを良好な精度で最適化することが可能となる。
【発明を実施するための最良の形態】
【００４８】
本発明の実施の形態について図面を参照しつつ詳細に説明する。
【００４９】
（実施の形態１）
本発明の一実施の形態によるコンパイラの開発環境の主要部の概略構成を図１に示す。この開発環境１０５は、本発明の一実施の形態による記録媒体、コンパイル装置、及びコンパイル方法を実施する開発環境にも該当する。開発環境１０５はその内部に、その一部として、例えばＪａｖａ（Ｒ）プログラム言語によるプログラムを開発する環境である、Ｊａｖａ（Ｒ）プログラム言語開発環境１２５を含んでいる。
【００５０】
図１では、Ｊａｖａ（Ｒ）プログラム言語開発環境１２５を例示するが、使用されるプログラム言語は必ずしもＪａｖａ（Ｒ）プログラム言語に限られるものではなく、何等かのいわゆる高級プログラム言語と呼ばれることのあるコンパイラ言語であればよい。例えば、Ｃ言語、Ｃ＋＋言語、Ｊａｖａ（Ｒ）言語、ＦＯＲＴＲＡＮ、及びＣＯＢＯＬ等の古典的なコンパイラ言語、或いはＡＰＬ、ＰＬ／１、ＡＤＡ、ＳｍａｌｌｔａｌｋやＬｉｓｐ、いわゆるアセンブラ言語、その他のあらゆるプログラム言語で、原始プログラムが記述されても支障がない。又、開発環境１０５は複数の言語を用いた開発環境を含んでいてもよく、単一の言語の開発環境のみを含むものであってもよい。
【００５１】
Ｊａｖａ（Ｒ）プログラム言語開発環境１２５によって、Ｊａｖａ（Ｒ）プログラムコード１２１が開発される。Ｊａｖａ（Ｒ）プログラムコード１２１は、本発明に係る原始プログラムの一実施の形態に該当する。Ｊａｖａ（Ｒ）プログラムコードの一例を図２に示す。図２の例では、Ｊａｖａ（Ｒ）プログラムコード１２１は、２重の入れ子を構成する２つの「ｄｏ〜ｗｈｉｌｅ」ループを含んでいる。即ち、Ｊａｖａ（Ｒ）プログラムコード１２１は、２重入れ子構造を有している。
【００５２】
尚、本明細書では、「多重入れ子構造」を単に「多重ループ」と適宜称する。また、単一のループ即ち１重ループと、多重入れ子構造即ち多重ループとを含めて、「ループ構造」或いは「ループ」と適宜称する。更に、多重ループを構成する個々のループを、特に区別するために、「単位ループ」と適宜称する。また、１重ループを「１重入れ子構造」とも称する。
【００５３】
このようなループ構造は、コンパイル部分決定部１２７によって解析の対象とされる。開発環境１０５は、不図示のコンピュータを有しており、このコンピュータが本発明の一実施形態によるコンパイラを実行することによりコンパイル部分決定部１２７の機能を実現する。コンパイル部分決定部１２７のシミュレータ１３７は、図２に例示するＪａｖａ（Ｒ）プログラムコード１２１の実行をシミュレートするもので、ループ解析部１３１及びヘッダ分割部１３３を備えている。
【００５４】
ループ解析部１３１はループの解析を行うことにより、多重ループの戻り先アドレスのうち、重複した戻り先アドレスを検出する。このために、ループ解析部１３１は、多重入れ子構造検出部１３５、戻り先アドレス検出部１３６及びアドレス重複判定部１３７を有している。ヘッダ分割部１３３は、検出された重複した戻り先アドレスを分割し、重複した戻り先アドレスが分割されたＪａｖａ（Ｒ）バイトコード１２９へＪａｖａ（Ｒ）プログラムコード１２１を変換し、それを出力する。このために、ヘッダ分割部１３３は命令付加部１３８を備えている。Ｊａｖａ（Ｒ）バイトコード１２９は、本発明の目的プログラムの一実施の形態に該当する。
【００５５】
図３は、比較例としてコンパイル部分決定部１２７が、重複した戻り先アドレスを分割せずに出力した場合のＪａｖａ（Ｒ）バイトコード１２９を例示する説明図である。図３が例示するＪａｖａ（Ｒ）バイトコード１２９は、プログラムモジュール４０３、４０５、４０７及び４０９を含んでいる。図３（ａ）は、各モジュールの処理の流れを例示するブロックフローチャートであり、図３（ｂ）は各モジュールに記述されているプログラムを例示している。このＪａｖａ（Ｒ）バイトコード１２９では、２つのループの戻り先が共に、プログラムモジュール４０５の先頭の「１５  ｉｉｎｃ  ２  １」命令である。すなわち、２重ループの戻り先アドレスが重複している。
【００５６】
このように２重ループの２つの戻り先アドレスが同一である場合には、Ｊａｖａ（Ｒ）バイトコード１２９に含まれる多重ループを部分コンパイルする際に、このループが途中からの戻りを含む１つのループであるのか、２重ループであるのかを判断することができない。即ち、プログラムモジュール４０５とプログラムモジュール４０７を連続して繰り返す１つのループであり、ある条件に応じてプログラムモジュール４０５を実行するだけで１回のループを終了する場合があるのか、それとも、プログラムモジュール４０５だけを繰り返す内側のループと、この内側のループに加えてプログラムモジュール４０７を繰り返すループとを含む、２重ループであるのかを判断することができない。
【００５７】
そこで、ループ解析部１３１は、このような多重ループの重複した戻り先アドレスを検出し、ヘッダ分割部１３３は、検出された重複した戻り先アドレスを分割する。即ち、図４にプログラムモジュール５０４として例示するように、ヘッダ分割部１３３は「１５  ｎｏｐ」を挿入し、内側のループの戻りアドレスと外側のループの戻りアドレスの分割を行う。図４において、プログラムモジュール５０３、５０５、５０７及び５０９は、図３に示したプログラムモジュール４０３、４０５、４０７及び４０９とは、モジュール５０４が介挿された分だけアドレスがずれているのみで、それぞれ内容同一である。
【００５８】
このように２重ループの２つの戻り先が同一である場合、例えば前記「ｎｏｐ（Ｎｏ  Ｏｐｅｒａｔｉｏｎ）」のように処理上意味のない命令（本明細書では、「不要命令」と称する）を挿入して、戻り先アドレスを分割することによって、図４（ａ）のブロックフローチャートにその構造を示す通り、このループが２重ループであることを明確化することができる。このようにしてヘッダ分割部１３３によって重複する２重ループの戻りアドレスの分割が行われたＪａｖａ（Ｒ）バイトコード１２９は、開発環境１０５からサーバ１０３に転送される。サーバ１０３は、転送されたＪａｖａ（Ｒ）バイトコード１２９を、クライアント端末装置からの送信要求に備えて保存する。
【００５９】
しかしこのサーバ１０３への転送と保存は、一例であって、必ずしも必須のものではなく、他の例では、開発環境１０５とサーバ１０３は同一装置の異なる記録部であってもよいし、同一装置の同一記録部であってもよいし、その他の構造であっても構わない。
【００６０】
ここで、コンパイル部分決定部１２７による処理の手順について更に詳細に説明する。図５は、コンパイル部分決定部１２７が実行する処理の手順を示すフローチャートである。コンパイル部分決定部１２７は、ステップＳ１〜Ｓ５の処理を実行しつつ、Ｊａｖａ（Ｒ）プログラムコード１２１をＪａｖａ（Ｒ）バイトコード１２９へ変換する。コンパイル部分決定部１２７が処理を開始すると、初めに多重入れ子構造検出部１３５は、Ｊａｖａ（Ｒ）プログラムコード１２１の中に多重入れ子構造を検索する（Ｓ１）。多重入れ子構造検出部１３５が多重入れ子構造を検出すると（Ｓ２でＹｅｓ）、戻り先アドレス検出部１３６は、検出された多重入れ子構造を構成する各単位ループの戻り先アドレスを検出する（Ｓ３）。
【００６１】
戻り先アドレスが重複しておれば（Ｓ４でＹｅｓ）、ヘッダ分割部１３３の命令付加部１３８は、重複した戻り先アドレスの何れかにｎｏｐ命令を追加することにより、重複した戻り先アドレスを分割する（Ｓ５）。一般に、Ｎ重（Ｎ≧２）の入れ子構造の各単位ループの戻り先アドレスが重複している場合には、内側のＮ−１個の単位ループの戻り先の各々にｎｏｐ命令を挿入することにより、重複を解消することができる。その後、処理はステップＳ１へ戻る。一方、戻り先アドレスが重複していなければ（Ｓ４でＮｏ）、処理はそのままステップＳ１へ戻る。コンパイル部分決定部１２７は、多重入れ子構造検出部１３５が多重入れ子構造を検出しなくなるまで、ステップＳ１〜Ｓ５の処理を反復し、多重入れ子構造が検出されなくなると（Ｓ２でＮｏ）、処理を終了する。
【００６２】
（実施の形態２）
図６は、本発明の一実施の形態によるコンパイラを実行する端末装置の主要部の概略構成図を示すブロック図である。この端末装置２０５は、本発明の一実施の形態によるコンパイル装置及び通信端末装置にも該当する。更に、端末装置２０５は、本発明の一実施形態による記録媒体及びコンパイル方法を実施する装置にも該当する。
【００６３】
端末装置２０５は図示しないコンピュータを有している。このコンピュータが本発明の一実施形態によるコンパイラを実行することにより、端末装置２０５が備える事前リンク部２３１の機能を実現する。事前リンク部２３１の機能を実現するコンパイラは、ＲＯＭ（Read Only Memory）、フレキシブルディスク、ＣＤ−ＲＯＭ等の記録媒体３１を通じて供給することも、電話回線、ネットワーク等の伝送媒体３３を通じて供給することも可能である。図６には、記録媒体３１としてＣＤ−ＲＯＭが描かれている。ＣＤ−ＲＯＭに記録されたコンパイラは、ＣＤ−ＲＯＭ読取装置３２を入出力インタフェース２１１に接続することにより、読み出すことができ、更に不図示のコンピュータが備えるハードディスク或いはＲＡＭ（Random Access Memory）等の記憶媒体に格納することができる。
【００６４】
記録媒体３１としてＲＯＭの形態でコンパイラが供給される場合には、当該ＲＯＭをコンピュータに搭載することにより、コンピュータはコンパイラに従った事前リンク部２３１の処理を実行可能となる。伝送媒体３３を通じて供給されるコンパイラは、通信インタフェース２１０を通じて受信され、例えばハードディスク或いはＲＡＭ等の不図示の記憶媒体に格納される。伝送媒体３３は、有線の伝送媒体に限らず無線の伝送媒体であっても良い。尚、実施の形態１では説明を略したが、コンパイル部分決定部１２７（図１）の機能を実現するコンパイラも、同様にして開発環境２０１が備える不図示のコンピュータに供給することができる。
【００６５】
端末装置２０５は、サーバ１０３から多重ループの戻り先アドレスが分割されたＪａｖａ（Ｒ）バイトコード１２９を、ネットワーク３２及び通信インタフェース２１０を通じて第１のファイルシステム２４３に読み込む。第１のファイルシステム２４３に読み込まれたＪａｖａ（Ｒ）バイトコード２２１は、端末装置２０５の事前リンク部２３１に読み込まれ、コンパイル部２３３が備えるコンパイル部分決定部２２３によって、コンパイルする部分が決定される。
【００６６】
コンパイル部分決定部２２３は、複数プログラム間の呼び出し関係を考慮し、呼び出し元プログラムにおける呼び出し命令のループの深さと、呼び出し先プログラムのループの深さとを併せて考慮して、最も深さの大きいループを、最も多くの回数実行される可能性の高いループ（命令）であると判断する。更に、コンパイル部分決定部２２３は、優先して部分コンパイルを行うべき部分として、最も深さの大きいループ（命令）を決定する。
【００６７】
ここで「ループの深さ」或いは「ループ深さ」とは、ループの多重入れ子構造又は１重入れ子構造の多重度のことを言う。例えば、１重入れ子構造のループ深さは１であり、２重入れ子構造のループ深さは２である。また一般に、ループを検出する代わりに、反復して実行される処理部分又は命令（本明細書では「反復実行部分」と称する）を検出しても良い。この意味で、ループの後に「（命令）」を付記している。反復実行部分の実行回数が、ループの深さに対応する。
【００６８】
例えば図７に示すように、３つのプログラム、即ちプログラム６１０、プログラム６３０、プログラム６７０で、順に呼び出しが行われていると仮定する。また、プログラム６１０はプログラムモジュール６０３〜６０７を含み、プログラム６３０はプログラムモジュール６２４〜６２６を含み、プログラム６７０はプログラムモジュール６４３〜６４９を含むものとする。更に、プログラム６１０のプログラムモジュール６０５から、プログラム６３０の呼び出しが行われており、プログラム６３０のプログラムモジュール６２５から、プログラム６７０の呼び出しが行われているものと仮定する。
【００６９】
プログラムモジュール６０５はプログラム６１０内で深さが２のループの中にあり、プログラムモジュール６２５はプログラム６３０内で深さが１のループの中にあり、プログラムモジュール６４６はプログラム６７０内で深さが３のループの中にある。従って、プログラムモジュール６４６は、プログラム６７０単独でループの深さを考慮すると、その深さは「３」であるが、全てのプログラム間の呼び出し関係を考慮してトータルとしてループの深さを判断すると、その深さは「２＋１＋３＝６」である。
【００７０】
これは１つの例であるが、他のプログラムとプログラムモジュールに関しても全てこのように、全プログラムを通じての呼び出し関係を考慮してトータルとしてループの深さを判断することによって、より多くの回数が実行される可能性の高いループ（命令）をより正確に検出し、その部分を部分コンパイルすることによって、より正確に実行速度の最大化を図ることができる。
【００７１】
Ｊａｖａ（Ｒ）バイトコード２２１は、開発環境１０５のコンパイル部分決定部１２７のヘッダ分割部１３３によって多重ループの戻り先アドレスが分割されている。従って、図３及び図４に例示したような２重ループであっても、正確に２重ループを検出し、最も多くの回数実行されるループ（命令）を精度良く判断することができる。それにより、優先的にコンパイルすべき部分を精度良く決定することができる。従って、実行時メモリ容量、即ち図６の例では端末装置２０５が備える第２のファイルシステム２４５のメモリ容量の許す限り、最も実行速度を上げることのできる部分を正確に判断して、当該部分をコンパイルすべき部分として決定することができる。
【００７２】
コンパイル部２３３が備える部分ネイティブコンパイル部２２５は、コンパイル部分決定部２２３が決定したコンパイルすべき部分をコンパイルする。コンパイル部分決定部２２３によるコンパイル部分の決定は、前記の通りトータルとして考慮したループの深いものを優先し、実行メモリ容量を併せて考慮しながら、実行メモリ容量の許す限り多くの命令を事前コンパイルするように行われる。これによって実行時メモリ容量の許す限りで、実行速度を可及的に上げることができるからである。
【００７３】
実行時メモリ容量の制限から、必ずしも全ての命令を事前コンパイルすることはできないので、事前コンパイル後のプログラムには、事前コンパイルが済んだネイティブコード２２９の部分とＪａｖａ（Ｒ）バイトコード２２７のまま残される部分とが併存することになる。この事前コンパイルが済んだネイティブコード２２９の部分とＪａｖａ（Ｒ）バイトコード２２７のまま残される部分とが併存する実行時プログラムは、第２のファイルシステム２４５に記憶保存される。この第１のファイルシステム２４３と第２のファイルシステム２４５とは同一のものであってもよく、別体のものであってもよい。
【００７４】
第２のファイルシステム２４５に記憶保存された実行時プログラムは、実行制御部２５７によって実行される。この実行時プログラムは、実行時メモリ容量の許す限りループの深い部分が優先的に事前コンパイルが行われているので、最大限実行速度を向上させることができる。
【００７５】
前記の通り、コンパイル部分決定部２２３は、図３及び図４に例示したような２重ループがあっても、コンパイル部分決定部１２７のヘッダ分割部１３３によって２重ループの戻り先アドレスが分割されているので、正確に２重ループを検出し、最も多くの回数実行されるループ（命令）を精度良く判断して、優先的にコンパイルする部分を決定することができる。しかしながら、既に述べたように戻り先アドレスの分断は、ｎｏｐ命令のような処理上意味のない不要命令を挿入することによって行われている。この命令は確かに処理上の意味はないため、処理内容に関して悪影響を及ぼすことはないが、メモリ上に不要な領域を占める。又、実行制御部２５７がプログラムを実行する時に、この命令を解読し、例えばｎｏｐ命令であることを判断するまでには不要な時間をロスすることにもなる。そこで部分ネイティブコンパイル部２２５は、２重ループであるか否かの判断を行ってしまえば不要となるこのような追加された命令を削除して、事前コンパイルを実行する。
【００７６】
次に、コンパイル部２３３の構成及び動作手順についてより詳細に説明する。図８は、コンパイル部２３３が備えるコンパイル部分決定部２２３及び部分ネイティブコンパイル部２２５の構成を示すブロック図である。コンパイル部分決定部２２３は、ループ検出部２６１、呼出し検出部２６２、ループ深さ評価部２６３、均一度評価部２６４、コンパイル部分判定部２６５及び再入構造判定部２６７を備えている。部分ネイティブコンパイル部２２５は、多重入れ子構造検出部２７１、戻りアドレス検出部２７２、不要命令検出部２７３及び不要命令削除部２７４を備えている。
【００７７】
図９は、コンパイル部分決定部２２３及び部分ネイティブコンパイル部２２５が実行する処理の手順を示すフローチャートである。説明の便宜上、コンパイル部分決定部２２３及び部分ネイティブコンパイル部２２５は、図７の３つのプログラム６１０、６３０及び６７０を有するＪａｖａ（Ｒ）バイトコード２２１を処理対象とするものと仮定する。コンパイル部分決定部２２３が処理を開始すると、初めにループ検出部２６１は、Ｊａｖａ（Ｒ）バイトコード１２９に含まれるメインプログラム、即ち図７のプログラム６１０について、多重入れ子構造又は１重入れ子構造を有するループを探索する（Ｓ１１）。
【００７８】
ループ検出部２６１がプログラム６１０に含まれるループを検出すると（Ｓ１２でＹｅｓ）、呼出し検出部２６２は、検出されたループの中から呼び出されている別のプログラムを検出する（Ｓ１４）。呼出し先のプログラム、即ちプログラム６３０が検出されると（Ｓ１４でＹｅｓ）、ループ検出部２６１は、プログラム６３０について多重入れ子構造又は１重入れ子構造を有するループを探索する（Ｓ１５）。なお、ループ検出部２６１は、本発明の第１及び第２ループ検出手段の双方の実施形態に該当する。
【００７９】
ループ検出部２６１がプログラム６３０に含まれるループを検出すると（Ｓ１６でＹｅｓ）、呼出し検出部２６２は、検出されたループの中から呼び出されている更に別のプログラム検出する（Ｓ１４）。呼出し先のプログラム、即ちプログラム６７０が検出されると（Ｓ１４でＹｅｓ）、ループ検出部２６１は、プログラム６７０について多重入れ子構造又は１重入れ子構造を有するループを探索する（Ｓ１５）。
【００８０】
ループ検出部２６１がプログラム６７０に含まれるループを検出すると（Ｓ１６でＹｅｓ）、呼出し検出部２６２は、検出されたループの中から呼び出されている更に別のプログラム検出する（Ｓ１４）。呼出し先のプログラムは検出されないので（Ｓ１４でＮｏ）、ループ深さ評価部２６３は、それまでにループ検出部２６１で検出されたループの入れ子の総数、即ち２＋１＋３＝６をループ深さとして算出する。即ち、ループ深さ評価部２６３は、呼出し関係にあるプログラム６１０、６３０及び６７０にわたって多重入れ子構造をなしているループの全体としての多重度を、ループ深さとして算出する（Ｓ１７）。
【００８１】
ループ検出部２６１は、プログラム６１０について、更にループを探索する（Ｓ１１）。ループ検出部２６１が新たなループを検出しなければ（Ｓ１２でＮｏ）、好ましくは均一度評価部２６４がループ深さの間の均一度を評価する（Ｓ１９）。均一度評価部２６４は、ループ深さ評価部２６３が、複数のループ深さを算出した場合には、これら複数のループ深さが定められた基準に照らして均一であるか否かを判定する。例えば、均一度評価部２６４は、複数のループ深さの全てが同一であれば均一であると判定し、同一でないものがあれば均一でないと判定する。或いは、均一度評価部２６４は、複数のループ深さの全てが定められた基準幅の中に入っておれば均一であると判定し、基準幅からはみ出すものがあれば、均一でないと判定する。均一度評価部２６４は、ループ深さ評価部２６３が、単一のループ深さのみを算出した場合には、ループ深さは均一でないと判定する。
【００８２】
均一度評価部２６４が、ループ深さが均一でないと判定すると（Ｓ１９でＮｏ）、コンパイル部分判定部２６５は、ループ深さが大きいループを優先的にコンパイルすべき部分に含める（Ｓ２０）。例えば、コンパイル部分判定部２６５は、第２のファイルシステム２４５の中に割り当てられたメモリ容量の許す範囲で、可能な限り多くのループを、ループ深さの大きいものから優先的にコンパイルすべき部分に含める。別の例として、コンパイル部分判定部２６５は、ループ深さが最大のループのみ、或いはループ深さが大きいものから順に定められた個数以内のループをコンパイルすべき部分に含める。或いは、コンパイル部分判定部２６５は、ループ深さが定められた閾値を超えるループをコンパイルすべき部分に含める。
【００８３】
コンパイル部分判定部２６５の処理（Ｓ２０）が終了すると、或いは均一度評価部２６４がループの深さが均一であると判定すると（Ｓ１９でＹｅｓ）、部分ネイティブコンパイル部２２５は、コンパイル部分判定部２６５がコンパイルすべきと決定した部分のみをコンパイルすることにより、ネイティブコード２２９を含むＪａｖａ（Ｒ）バイトコード２２７を生成する（Ｓ２１）。
【００８４】
このように、Ｊａｖａ（Ｒ）バイトコード２２１に含まれ、互いに呼出し関係にある複数のプログラム６１０、６３０及び６７０の間で構成される多重入れ子構造をも含めて、入れ子の総数の大きいループが優先的にコンパイルされる。従って、Ｊａｖａ（Ｒ）バイトコード２２１のうちの実行回数の多い可能性の高い部分が、より精度良く選び出されコンパイルされる。それにより、プログラムの実行速度の向上と第２のファイルシステム２４５のメモリ領域の節減とを、良好な精度で最適化することが可能となる。
【００８５】
また、ステップＳ２０において、コンパイル部分判定部２６５は、ループ深さの最大値が、予め定められた閾値に満たないときには、コンパイルすべき部分がないものと決定しても良い。それにより、実行速度の向上への寄与の低い部分を無駄にコンパイルして、第２のファイルシステム２４５のメモリ領域を無駄に使用することを回避することができる。
【００８６】
更に、ループ深さ評価部２６３が、ループ深さが均一であると判定した場合には（Ｓ１９でＹｅｓ）、コンパイル部分判定部２６５は、コンパイルすべき部分がないものと決定しても良い。それにより、実行速度の向上への寄与が同等程度の部分を数多くコンパイルして、第２のファイルシステム２４５のメモリ領域の有効利用を損なうことを回避することができる。
【００８７】
コンパイル部分判定部２６５が、コンパイルすべき部分がないと決定した場合には、部分ネイティブコンパイル部２２５は、処理対象である原始プログラムとしてのＪａｖａ（Ｒ）バイトコード２２１を、コンパイルすることなく、処理後の目的プログラムであるＪａｖａ（Ｒ）バイトコード２２７として、そのまま出力することとなる。この場合、Ｊａｖａ（Ｒ）バイトコード２２７は、望ましくは、実行制御部２５７によって実行に供されつつ、実行頻度の高い部分が抽出され、抽出された部分が部分コンパイルされる。すなわち、実行前に部分コンパイルされないＪａｖａ（Ｒ）バイトコード２２７は、いわゆるＪＩＴ（Just In Time）処理に供されるのが望ましい。また、実行前に部分コンパイルされたＪａｖａ（Ｒ）バイトコード２２７についても、実行制御部２５７によってＪＩＴ処理が施され、それによってより望ましい部分がコンパイルされても良い。ＪＩＴを実行するための実行制御部２５７の構成例については後述する。
【００８８】
図９において、ループ検出部２６１は、ループを検出する代わりに、反復して実行される部分である反復実行部分を検出しても良い。反復実行部分はループを含む。この場合には、ループ深さ評価部２６３は、ループ深さ即ちループの多重度の総和に代えて、反復実行部の実行回数の総和を算出するとよい。それにより、Ｊａｖａ（Ｒ）バイトコード２２１のうちの実行回数の多い部分が、より精度良く選び出されコンパイルされる。その結果、プログラムの実行速度の向上と第２のファイルシステム２４５のメモリ領域の節減とを、良好な精度で最適化することが可能となる。
【００８９】
図１０は、部分ネイティブコンパイル部２２５がステップＳ２１の前に、又はステップＳ２１の処理と並行して実行する望ましい処理の手順を示すフローチャートである。部分ネイティブコンパイル部２２５は、例えばステップＳ５１〜Ｓ５５の処理を実行しつつ、Ｊａｖａ（Ｒ）バイトコード２２１を、通常はネイティブコード２２９を含むＪａｖａ（Ｒ）バイトコード２２７へ変換する。部分ネイティブコンパイル部２２５が処理を開始すると、初めに多重入れ子構造検出部２７１は、Ｊａｖａ（Ｒ）バイトコード２２１の中に多重入れ子構造を検索する（Ｓ５１）。多重入れ子構造検出部２７１が多重入れ子構造を検出すると（Ｓ５２でＹｅｓ）、戻り先アドレス検出部２７２は、検出された多重入れ子構造を構成する各単位ループの戻り先アドレスを検出する（Ｓ５３）。
【００９０】
次に、不要命令検出部２７３は、検出された戻り先アドレスのうちに不要命令を含むものがあるか否かを判定する（Ｓ５４）。不要命令検出部２７３が、不要命令を有する戻り先アドレスを検出した場合には（Ｓ５４でＹｅｓ）、不要命令削除部２７４は、検出された戻り先アドレスから不要命令を削除する（Ｓ５５）。その後、処理はステップＳ５１へ戻る。一方、不要命令を有する戻り先アドレスが検出されなければ（Ｓ５４でＮｏ）、処理はそのままステップＳ５１へ戻る。部分ネイティブコンパイル部２２５は、多重入れ子構造検出部２７１が多重入れ子構造を検出しなくなるまで、ステップＳ５１〜Ｓ５５の処理を反復し、多重入れ子構造が検出されなくなると（Ｓ５２でＮｏ）、不要命令を削除するための図１０の処理を終了する。
【００９１】
上述の通り、部分ネイティブコンパイル部２２５は、コンパイル部分決定部２６５が決定したコンパイルすべき部分を優先的にコンパイルする（Ｓ２１）。部分ネイティブコンパイル部２２５は、例えば第２のファイルシステム２４５に割り当てられたメモリ領域がオーバフローした時点で、ステップＳ２１のコンパイル処理を終了する。
【００９２】
図１１は、実行制御部２５７の構成例を示すブロック図である。図１１の例では、実行制御部２５７は、第１実行制御部２５７Ａと第２実行制御部２５７Ｂとを備えている。第２ファイルシステム２４５から読み出されたＪａｖａ（Ｒ）バイトコード２２７がネイティブコード２２９を含んでいるときには、このＪａｖａ（Ｒ）バイトコード２２７は第１実行制御部２５７Ａによって実行される。一方、Ｊａｖａ（Ｒ）バイトコード２２７がネイティブコード２２９を含まないときは、このＪａｖａ（Ｒ）バイトコード２２７は、第２実行制御部２５７Ｂによって実行される。第２実行制御部２５７Ｂは、いわゆるＪＩＴを実行するものである。
【００９３】
第１実行制御部２５７Ａへ入力されたネイティブコード２２９を含むＪａｖａ（Ｒ）バイトコード２２７は、リンカ部２８１によってリンク処理が施された後、ネイティブコード２２９の部分はキャッシュ２８２へ保持され、Ｊａｖａ（Ｒ）バイトコード２２７の部分はキャッシュ２８３へ保持される。実行処理の流れに沿って、ネイティブコード２２９とＪａｖａ（Ｒ）バイトコード２２７とが切り替え部２８４によって選択され、選択された部分が実行部２８５によって実行される。Ｊａｖａ（Ｒ）バイトコード２２７の全てがネイティブコード２２９に置き換えられている場合、即ち、コンパイル部２３３によってＪａｖａ（Ｒ）バイトコード２２１の全ての部分がコンパイルされている場合にも、当該プログラムは第１実行制御部２５７Ａによって実行される。
【００９４】
第２実行制御部２５７Ｂは、第１実行制御部２５７Ａの構成に加えて、実行部分頻度検出部２８６及び部分ネイティブコンパイル部２８７を備えている。実行部分頻度検出部２８６は、当初においてネイティブコード２２９を含まないＪａｖａ（Ｒ）バイトコード２２７を実行部２８５が実行している最中に、このプログラムのうちの定められた基準を超える高い頻度で実行される部分である高頻度実行部分を検出する。部分ネイティブコンパイル部２８７は、実行部分頻度検出部２８６が検出した高頻度実行部分をコンパイルする。その結果、ネイティブコード２２９を含むこととなったＪａｖａ（Ｒ）バイトコード２２７は、第１実行制御部２５７Ａと同様に、キャッシュ２８２及び２８３、並びに切り替え部２８４を経て、実行部２８５によって実行される。
【００９５】
実行制御部２５７Ｂによる実行が終了し、すでにネイティブコード２２９を含むこととなったＪａｖａ（Ｒ）バイトコード２２７は、次回の実行に備えて、第２ファイルシステム２４５に保存することができる。保存されたＪａｖａ（Ｒ）バイトコード２２７は、すでに部分コンパイルが行われているので、第１実行制御部２５７Ａで実行することが可能である。
【００９６】
図１１のように構成される実行制御部２５７によれば、コンパイル部２３３のコンパイル部分判定部２６５でコンパイルする部分がないと決定されたＪａｖａ（Ｒ）バイトコード２２７が、いわゆるＪＩＴに供されることとなる。従って、事前コンパイルを行うことが適切でないとコンパイル部２３３が判定したＪａｖａ（Ｒ）バイトコード２２７に対して、事前コンパイルに代わって、ＪＩＴによって実行速度の最適化とメモリ領域の節減との最適化を図ることができる。
【００９７】
図１１は、第１実行制御部２５７Ａと第２実行制御部２５７Ｂとが併存する形態を例示した。これに対して、実行制御部２５７が実行制御部２５７Ｂのみを備え、入力されるＪａｖａ（Ｒ）バイトコード２２７がネイティブコード２２９を含むか否かに応じて、実行部分頻度検出部２８６及び部分ネイティブコンパイル部２８７をオン・オフ制御するように実行制御部２５７を構成しても良い。
【００９８】
図８に戻って、コンパイル部分決定部２２３は、再入構造判定部２６７を動作させることにより、以下に述べるような処理をも実現する。コンパイル部分決定部２２３が処理対象とする原始プログラム、即ちＪａｖａ（Ｒ）バイトコード２２１が、例えば図１２に示すループ構造を有していたと仮定する。図１２に例示するＪａｖａ（Ｒ）バイトコード２２１は、プログラム７１０とプログラム７３０とを有している。プログラム７１０はプログラムモジュール７０３〜７０７を含んでおり、プログラム７３０はプログラムモジュール７２４〜７２６を含んでいる。
【００９９】
呼び出し元プログラム７１０において２重ループを構成しているプログラムモジュール７０５はプログラム７３０に含まれるプログラムモジュール７２４を呼び出している。一方、プログラム７３０では、プログラムモジュール７２４に続いて実行されるプログラムモジュール７２５が１重のループ構造を有している。更に、このプログラムモジュール７２５は、呼び出し元プログラム７１０に含まれ、自分自身を呼び出したプログラムモジュール７０５の実行に至るプログラムモジュール７０４を呼び出している。
【０１００】
一般にこのような構造は、「再入」構造又は「リエントラント（Ｒｅ−ｅｎｔｒａｎｔ）」構造と呼ばれることがある。即ち、プログラムモジュール７０４、７０５、７０６、７２４、７２５及び７２６が、再入構造を構成する。コンパイル部分決定部２２３の再入構造判定部２６７が、コンパイル対象プログラム中に、このような再入構造を発見すると、コンパイル部分決定部２３３は、その部分を最優先でコンパイル部分と決定する。従って、再入構造は、部分ネイティブコンパイル部２２５によって優先的にコンパイルされる。Ｊａｖａ（Ｒ）バイトコード２２１のうちの実行回数の多い可能性の高い部分である再入構造が優先的にコンパイルされるので、実行速度の向上と第２ファイルシステム２４５のメモリ領域の節減とが良好な精度で最適化される。
【０１０１】
次に、コンパイル部分決定部２２３の再入構造の判定に関する動作手順についてより詳細に説明する。図１３は、再入構造の判定に関するコンパイル部分決定部２３３の動作手順を示すフローチャートである。図１３の処理手順は、図９の処理手順と並行して実行することが可能である。説明の便宜のために、コンパイル部分決定部２２３が、図１２に例示したＪａｖａ（Ｒ）バイトコード２２１を処理対象とするものと仮定する。
【０１０２】
コンパイル部分決定部２２３が図１３の処理を開始すると、呼出し検出部２６２は、メインプログラムであるプログラム７１０について、別プログラムを呼出している処理部分を探索する（Ｓ３１）。呼出し検出部２６２が、このような処理部分、即ちプログラムモジュール７０５を検出すると（Ｓ３２でＹｅｓ）、呼出し検出部２６２は、呼出し先であるプログラム７３０の中で、呼出し元プログラムであるプログラム７１０の中の呼出し部分（即ち、プログラムモジュール７０５）を含む処理部分（即ち、プログラムモジュール７０４、７０５及び７０６）を呼び出している処理部分（即ち、プログラムモジュール７２５）を探索する（Ｓ３３）。
【０１０３】
呼出し検出部２６２が、このような処理部分、即ちプログラムモジュール７２５を検出すると（Ｓ３４でＹｅｓ）、再入構造判定部２６７は、呼出し先の処理（即ち、プログラムモジュール７２４、７２５及び７２６）と、読み出し先から逆に呼び出されている読み出し元の処理（即ち、プログラムモジュール７０４、７０５及び７０６）とを、再入構造であると判定する（Ｓ３５）。その後、呼出し検出部２６２は、再びステップＳ３３の処理を実行する。呼出し検出部２６２が、新たな処理部分を検出しない場合には（Ｓ３４でＮｏ）、呼出し検出部２６２は、再びステップＳ３１の処理を実行する。呼出し検出部２６２が新たな処理部分を検出しない場合には（Ｓ３２でＮｏ）、コンパイル部分判定部２６５は、再入構造判定部２６７が再入構造であると判定した処理部分を、コンパイルすべき部分に含める（Ｓ３６）。
【０１０４】
その後、コンパイル部分決定部２２３は、図１３の処理を終了する。部分ネイティブコンパイル部２２５は、図９の処理によってコンパイル部分判定部２６５がコンパイルすべき部分と決定したループと、図１３の処理によってコンパイル部分判定部２６５がコンパイルすべき部分と決定した再入構造とを、優先的にコンパイルすることとなる。
【０１０５】
（その他の実施の形態）
実施の形態１では、Ｊａｖａ（Ｒ）プログラムコード１２１からＪａｖａ（Ｒ）バイトコード１２９への変換が、開発環境１０５の中で行われる例を示した。これに対して、端末装置２０５が、例えば通信インタフェース２１０を通じてＪａｖａ（Ｒ）プログラムコード１２１をサーバ１０３からダウンロードし、事前リンク部２３１の中で、Ｊａｖａ（Ｒ）バイトコード１２９への変換を実行しても良い。
【産業上の利用可能性】
【０１０６】
本発明のコンパイラ、記録媒体、コンパイル装置、通信端末装置及びコンパイル方法は、プログラムの実行速度の向上とプログラムを記憶するためのメモリの記憶容量の節減とを良好な精度で最適化することを可能にするので、産業上有用である。
【図面の簡単な説明】
【０１０７】
【図１】本発明の実施の形態１によるコンパイラを実行する開発環境の概略構成図。
【図２】図１の開発環境によって開発されたＪａｖａ（Ｒ）プログラムコードの例を示す図。
【図３】２つのループの戻り先が重複するＪａｖａ（Ｒ）バイトコードを例示する図。
【図４】２つのループの戻り先が分割されたＪａｖａ（Ｒ）バイトコードを例示する図。
【図５】重複するループの戻り先を分割するための処理手順を示す流れ図。
【図６】本発明の実施の形態２による端末装置の構成を示すブロック図。
【図７】３つのプログラムの間で順に呼び出しを行うＪａｖａ（Ｒ）バイトコードを例示する図。
【図８】図６のコンパイル部の構成を示すブロック図。
【図９】図８のコンパイル部による処理手順を示す流れ図。
【図１０】図８の部分ネイティブコンパイル部による処理手順を示す流れ図。
【図１１】図６の実行制御部の構成を示すブロック図。
【図１２】再入構造を有するプログラムを例示する図。
【図１３】図８のコンパイル部分決定部による再入構造を優先的にコンパイルするための処理手順を示す流れ図。
【符号の説明】
【０１０８】
１０３  サーバ          １０５  開発環境        
１２１  Ｊａｖａ（Ｒ）プログラムコード
１２５  Ｊａｖａ（Ｒ）プログラム言語開発環境    １２７  コンパイル部分決定部
１２９  Ｊａｖａ（Ｒ）バイトコード              １３１  ループ解析部
１３３  ヘッダ分割部                            １３５  多重入れ子構造検出部
１３６  戻り先アドレス検出部                    １３７  アドレス重複判定部
１３８  命令付加部                              １３７  シミュレータ
２０５  端末装置（通信端末装置）      ２１０  通信インタフェース（通信手段）
２２１  Ｊａｖａ（Ｒ）バイトコード              ２２３  コンパイル部分決定部
２２５  部分ネイティブコンパイル部（部分コンパイル手段）
２２７  Ｊａｖａ（Ｒ）バイトコード              ２２９  ネイティブコード
２３１  事前リンク部                  ２３３  コンパイル部（コンパイル装置）
２４３  第１のファイルシステム        ２４５  第２のファイルシステム
２５７  実行制御部          ２６１  ループ検出部          ２６２  呼出し検出部
２６３  ループ深さ評価部                        ２６４  均一度評価部
２６５  コンパイル部分判定部                    ２６７  再入構造判定部
２７１  多重入れ子構造検出部                    ２７２  戻りアドレス検出部
２７３  不要命令検出部                          ２７４  不要命令削除部
２８６  実行部分頻度検出部
２８７  部分ネイティブコンパイル部（部分コンパイル手段）
４０３，４０５，４０７，４０９  プログラムモジュール
５０３，５０４，５０５，５０７，５０９  プログラムモジュール
６０３，６０４，６０５，６０６，６０７  プログラムモジュール
６１０，６３０，６７０  プログラム
６２４，６２５，６２６  プログラムモジュール
６４３，６４４，６４５，６４６，６４７，６４８，６４９  プログラムモジ
ュール
【図１】
2004326760.tif 000003
【図２】
2004326760.tif 000004
【図３】
2004326760.tif 000005
【図４】
2004326760.tif 000006
【図５】
2004326760.tif 000007
【図６】
2004326760.tif 000008
【図７】
2004326760.tif 000009
【図８】
2004326760.tif 000010
【図９】
2004326760.tif 000011
【図１０】
2004326760.tif 000012
【図１１】
2004326760.tif 000013
【図１２】
2004326760.tif 000014
【図１３】
2004326760.tif 000015