(57)【要約】【課題】コンパイル済みのアプリケーション・コードの性能を最適化するデータ処理装置と方法を提供する。【解決手段】データ処理装置はプロセッサ１３０と、プロセッサ１３０が実行する命令を生成するためにアプリケーション・コード１００をコンパイルするコンパイラ１１０とを備える。また、プロセッサ１３０から受けた入力信号からプロセッサが実行する命令を表す追跡情報を生成するための、非侵入的追跡ユニット３００がプロセッサ１３０に結合する。コンパイラ１１０は追跡信号に従ってアプリケーション・コード１００のコンパイルを制御する。追跡ユニット３００は非侵入的なので、プロセッサ１３０が実行するコードの行動を変えずにコンパイラ１１０が用いる輪郭情報を作るための追跡信号を生成することができる。これにより、フィードバック駆動最適化コンパイル方式に用いられる輪郭情報を得る非常に優れた方法が与えられる。【選択図】　　　図３
2004062858.tif 000002
【特許請求の範囲】
【請求項１】
データ処理装置であって、
プロセッサと、
前記プロセッサが実行する命令を生成するためにアプリケーション・コードをコンパイルするコンパイラと、
前記プロセッサから受けた入力信号から前記プロセッサが実行する命令を表す追跡信号を生成するための、前記プロセッサに結合する非侵入的追跡ユニットと、
を備え、
前記コンパイラは前記追跡信号に従って前記アプリケーション・コードのコンパイルを制御する、
データ処理装置。
【請求項２】
前記非侵入的追跡ユニットと前記プロセッサとは同じチップ上に設けられる、請求項１記載のデータ処理装置。
【請求項３】
前記非侵入的追跡ユニットは埋込み追跡マクロセルである、請求項２記載のデータ処理装置。
【請求項４】
前記コンパイラが前記アプリケーション・コードのコンパイルの制御に用いる性能データを前記追跡信号から得るための追跡解析器を更に備える、請求項１記載のデータ処理装置。
【請求項５】
前記性能データは前記コンパイラに直接入力される、請求項４記載のデータ処理装置。
【請求項６】
前記性能データを受けて、前記コンパイラでコンパイルするアプリケーション・コードを修正するためのプロセッサを更に備える、請求項４記載のデータ処理装置。
【請求項７】
前記性能データは命令のシーケンスの実行の頻度を識別するデータを含む、請求項４記載のデータ処理装置。
【請求項８】
前記性能データは命令のシーケンスの実行時間を識別するデータを含む、請求項４記載のデータ処理装置。
【請求項９】
前記追跡信号は命令フロー内の分岐を識別する、請求項１記載のデータ処理装置。
【請求項１０】
前記コンパイラにフィードバックする前にその後の解析に用いる前記追跡信号を記憶するための追跡バッファを更に備える、請求項１記載のデータ処理装置。
【請求項１１】
前記プロセッサはターゲット・プロセッサであり、前記コンパイラは前記ターゲット・プロセッサとは異なるホスト・プロセッサ上で実行されるコンパイラ・コードである、請求項１記載のデータ処理装置。
【請求項１２】
前記コンパイラ・コードがコンパイルした前記アプリケーション・コードは前記ターゲット・プロセッサ上でテスト・モードで実行され、前記コンパイラ・コードは前記非侵入的追跡ユニットが生成した追跡信号に従って前記アプリケーション・コードを再コンパイルする、請求項１１記載のデータ処理装置。
【請求項１３】
前記コンパイラが前記アプリケーション・コードのコンパイルの制御に用いる性能データを前記追跡信号から得るための追跡解析器を更に備え、前記コンパイル済みのアプリケーション・コードは前記プロセッサが所定の時間実行し、前記追跡解析器はその間に得られた前記追跡信号から、前記コンパイラ・コードが前記アプリケーション・コードを再コンパイルするのに用いる性能データを生成する、請求項１２記載のデータ処理装置。
【請求項１４】
前記コンパイラは前記プロセッサ上で実行してランタイム中にアプリケーション・コードを動的にコンパイルする動的コンパイラ・コードである、請求項１記載のデータ処理装置。
【請求項１５】
命令のインタープリタ・シーケンスとして前記プロセッサ上で実行してアプリケーション・コードを解釈するインタープリタ・コードを更に含み、前記非侵入的追跡ユニットが生成する前記追跡信号は前記プロセッサが実行する命令のインタープリタ・シーケンスを表し、前記動的コンパイラ・コードは前記追跡信号に従ってアプリケーション・コードのセクションをコンパイルすることにより、前記アプリケーション・コードのこれらのセクションを前記プロセッサで実行することを可能にする、請求項１４記載のデータ処理装置。
【請求項１６】
前記プロセッサ上で実行できるようにアプリケーション・コードの所定のセクションを復号するためのハードウエア復号器を更に備え、前記インタープリタ・コードは前記アプリケーション・コードのこれらの所定のセクションを解釈せず、また前記非侵入的追跡ユニットが生成する前記追跡信号は前記ハードウエア復号器の動作を表す、請求項１５記載のデータ処理装置。
【請求項１７】
前記コンパイラが前記アプリケーション・コードのコンパイルの制御に用いる性能データを前記追跡信号から得るための追跡解析器を更に備え、前記追跡解析器は前記プロセッサ上で実行する追跡解析器コードである、請求項１４記載のデータ処理装置。
【請求項１８】
前記アプリケーション・コードはジャバ・バイトコードを含む、請求項１４記載のデータ処理装置。
【請求項１９】
前記動的コンパイラ・コードは前記プロセッサ上で実行されるジャバ仮想機械内に与えられる、請求項１８記載のデータ処理装置。
【請求項２０】
命令のインタープリタ・シーケンスとして前記プロセッサ上で実行してアプリケーション・コードを解釈するインタープリタ・コードを更に含み、前記非侵入的追跡ユニットが生成する前記追跡信号は前記プロセッサが実行する命令のインタープリタ・シーケンスを表し、前記動的コンパイラ・コードは前記追跡信号に従ってアプリケーション・コードのセクションをコンパイルすることにより、前記アプリケーション・コードのこれらのセクションを前記プロセッサで実行することを可能にし、前記インタープリタ・コードはジャバ仮想機械内に与えられる、請求項１９記載のデータ処理装置。
【請求項２１】
前記コンパイラがアプリケーション・コードのコンパイルの制御に用いる性能データを前記追跡信号から得るための追跡解析器を更に備え、前記追跡解析器は前記プロセッサ上で実行する追跡解析器コードであり、前記追跡解析器コードはジャバ仮想機械内に与えられる、請求項１９記載のデータ処理装置。
【請求項２２】
前記アプリケーション・コードはソース・コードであり、前記コンパイラは前記追跡信号に従って前記命令をオブジェクト・コード・フォーマットで生成する、請求項１記載のデータ処理装置。
【請求項２３】
前記アプリケーション・コードはオブジェクト・コードであり、前記コンパイラは前記追跡信号に従って前記命令を新しいオブジェクト・コードとして生成する、請求項１記載のデータ処理装置。
【請求項２４】
命令を実行するプロセッサと、前記プロセッサに結合して前記プロセッサから受けた入力信号から前記プロセッサが実行する命令を表す追跡信号を生成する非侵入的追跡ユニットとを備えるデータ処理装置内で、アプリケーション・コードをコンパイルする方法であって、
ａ）アプリケーション・コードをコンパイルして前記プロセッサが実行する命令を生成するステップと、
ｂ）前記非侵入的追跡ユニットを用いて前記追跡信号を生成するステップと、
ｃ）前記追跡信号に従って前記ステップ（ａ）でのアプリケーション・コードのコンパイルを制御するステップとを含む、
アプリケーション・コードをコンパイルする方法。
【請求項２５】
前記非侵入的追跡ユニットと前記プロセッサとは同じチップ上に設けられる、請求項２４記載のアプリケーション・コードをコンパイルする方法。
【請求項２６】
前記非侵入的追跡ユニットは埋込み追跡マクロセルである、請求項２５記載のアプリケーション・コードをコンパイルする方法。
【請求項２７】
更に、
（ｄ）前記ステップ（ｃ）で前記アプリケーション・コードのコンパイルの制御に用いる性能データを前記追跡信号から得るステップを更に含む、請求項２４記載のアプリケーション・コードをコンパイルする方法。
【請求項２８】
前記性能データは命令のシーケンスの実行頻度を識別するデータを含む、請求項２７記載のアプリケーション・コードをコンパイルする方法。
【請求項２９】
前記性能データは命令のシーケンスの実行時間を識別するデータを含む、請求項２７記載のアプリケーション・コードをコンパイルする方法。
【請求項３０】
前記追跡信号は命令フロー内の分岐を識別する、請求項２４記載のアプリケーション・コードをコンパイルする方法。
【請求項３１】
前記ステップ（ｃ）にフィードバックする前にその後の解析に用いる前記追跡信号を追跡バッファ内に記憶するステップを更に含む、請求項２４記載のアプリケーション・コードをコンパイルする方法。
【請求項３２】
前記プロセッサはターゲット・プロセッサであり、前記アプリケーション・コードのコンパイルは前記ターゲット・プロセッサとは異なるホスト・プロセッサ上で実行されるコンパイラ・コードが行う、請求項２４記載のアプリケーション・コードをコンパイルする方法。
【請求項３３】
更に、
前記ステップ（ａ）で前記コンパイラ・コードがコンパイルした前記アプリケーション・コードをテスト・モードで実行するステップと、
前記ステップ（ｃ）で、前記非侵入的追跡ユニットが生成した追跡信号に従って前記アプリケーション・コードを再コンパイルするステップと、
を含む請求項３２記載のアプリケーション・コードをコンパイルする方法。
【請求項３４】
前記ステップ（ｃ）で前記アプリケーション・コードのコンパイルの制御に用いる性能データを前記追跡信号から得るステップ（ｄ）を更に含み、また前記ステップ（ａ）でコンパイル済みのアプリケーション・コードは前記プロセッサが所定の時間実行し、また前記ステップ（ｄ）はその間に得られた追跡信号から、前記ステップ（ｃ）で前記アプリケーション・コードを再コンパイルするのに用いる性能データを生成する、請求項３３記載のアプリケーション・コードをコンパイルする方法。
【請求項３５】
前記アプリケーション・コードのコンパイルは前記プロセッサ上で実行する動的コンパイラ・コードが行って、ランタイム中にアプリケーション・コードを動的にコンパイルする、請求項２４記載のアプリケーション・コードをコンパイルする方法。
【請求項３６】
更に、
命令のインタープリタ・シーケンスとして前記プロセッサ上でインタープリタ・コードを実行してアプリケーション・コードを解釈し、前記非侵入的追跡ユニットが生成する前記追跡信号は前記プロセッサが実行する命令のインタープリタ・シーケンスを表す、ステップと、
前記ステップ（ｃ）で、前記動的コンパイラ・コードを用いて前記追跡信号に従って前記アプリケーション・コードのセクションをコンパイルすることにより、前記アプリケーション・コードのこれらのセクションを前記プロセッサで実行することを可能にするステップと、
を含む請求項３５記載のアプリケーション・コードをコンパイルする方法。
【請求項３７】
前記プロセッサ上で実行できるようにハードウエア復号器を用いてアプリケーション・コードの所定のセクションを復号し、前記インタープリタ・コードは前記アプリケーション・コードのこれらの所定のセクションを解釈せず、また前記非侵入的追跡ユニットが生成する前記追跡信号は前記ハードウエア復号器の動作を表す、ステップを含む、請求項３６記載のアプリケーション・コードをコンパイルする方法。
【請求項３８】
前記ステップ（ｃ）で前記アプリケーション・コードのコンパイルの制御に用いる性能データを前記追跡信号から得る前記ステップ（ｄ）を更に含み、前記ステップ（ｄ）は前記プロセッサ上で実行する追跡解析器コードが行う、請求項３５記載のアプリケーション・コードをコンパイルする方法。
【請求項３９】
前記アプリケーション・コードはジャバ・バイトコードを含む、請求項３５記載のアプリケーション・コードをコンパイルする方法。
【請求項４０】
前記動的コンパイラ・コードは前記プロセッサ上で実行されるジャバ仮想機械内に与えられる、請求項３９記載のアプリケーション・コードをコンパイルする方法。
【請求項４１】
更に、
命令のインタープリタ・シーケンスとして前記プロセッサ上でインタープリタ・コードを実行してアプリケーション・コードを解釈し、前記非侵入的追跡ユニットが生成する前記追跡信号は前記プロセッサが実行する命令のインタープリタ・シーケンスを表す、ステップと、
前記ステップ（ｃ）で、前記動的コンパイラ・コードを用いて前記追跡信号に従って前記アプリケーション・コードのセクションをコンパイルすることにより、前記アプリケーション・コードのこれらのセクションを前記プロセッサで実行することを可能にするステップと、
を含み、
前記インタープリタ・コードはジャバ仮想機械内に与えられる、
請求項４０記載のアプリケーション・コードをコンパイルする方法。
【請求項４２】
前記ステップ（ｃ）で前記アプリケーション・コードのコンパイルの制御に用いる性能データを前記追跡信号から得る前記ステップ（ｄ）を更に含み、前記ステップ（ｄ）は前記プロセッサ上で実行する追跡解析器コードが行い、また前記追跡解析器コードはジャバ仮想機械内に与えられる、請求項４０記載のアプリケーション・コードをコンパイルする方法。
【請求項４３】
請求項２４記載の方法を行うデータ処理装置を構成するコンピュータ・プログラム製品。
【請求項４４】
請求項２４記載の方法の前記ステップ（ａ）と（ｃ）を行うデータ処理装置を構成するコンピュータ・プログラム製品。
【請求項４５】
請求項２７記載の方法の前記ステップ（ｄ）を行うデータ処理装置を更に構成する、請求項４４記載のコンピュータ・プログラム製品。
【請求項４６】
請求項２７記載の方法の前記ステップ（ｄ）を行うデータ処理装置を構成するコンピュータ・プログラム製品。
【請求項４７】
請求項４３記載のコンピュータ・プログラムを含むキャリア媒体。
【請求項４８】
請求項４４記載のコンピュータ・プログラムを含むキャリア媒体。
【請求項４９】
請求項４５記載のコンピュータ・プログラムを含むキャリア媒体。
【請求項５０】
請求項４６記載のコンピュータ・プログラムを含むキャリア媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はデータ処理装置内のアプリケーション・コードのコンパイルに関するものである。
【０００２】
【従来の技術】
プロセッサ上でアプリケーション・コードを走らせる前に、まずそのアプリケーション・コードをコンパイルして、そのアプリケーション・コードを表す命令のシーケンスをアプリケーション・コードから生成した上でこれをプロセッサ上で実行する必要がある。
【０００３】
全面的にまたは部分的にコンパイル済みのコードの性能を改善するのに用いられる公知の方法はフィードバック駆動最適化（Ｆｅｅｄｂａｃｋ　Ｄｒｉｖｅｎ　Ｏｐｔｉｍｉｓａｔｉｏｎ）（ＦＤＯ）である。この方法では、コンパイル済みのコードをデータ処理システムのプロセッサ上で実行してそのシステムの性能の輪郭を描写し、コンパイラはこの輪郭情報（ｐｒｏｆｉｌｉｎｇ　ｉｎｆｏｒｍａｔｉｏｎ）を用いて、コンパイル済みのコードをどのように修正するかを決定する。完全に静的にコンパイルされる言語（ＣやＣ＋＋など）では輪郭情報をテストランで集める。テストランのときは元のコンパイル済みのコードをターゲット・プロセッサ上で実行する。テストランが終わると、コンパイラは輪郭情報を用いてコードの再コンパイルを制御する。その後に用いるのはこの再コンパイル済みのコードである。
【０００４】
動的にコンパイルされる言語では、コンパイラは一般にアプリケーション・コードの各部をランタイム中に動的にコンパイルする。動的にコンパイルされる言語の一例はサン・マクロシステムズ社が指定したジャバ・プログラミング言語である。ジャバ（Ｊａｖａ（Ｒ））・プログラミング言語は、ジャバ（Ｊａｖａ（Ｒ））で書かれたコンピュータ・ソフトウエアを多くの異なる処理ハードウエア・プラットフォーム上で、ジャバ・ソフトウエアを変更せずに実行することのできる環境を提供することを目的としている。ジャバでは、ランタイム・システムはバイトコード・コンパイラを含む。これはジャバ・バイトコード（すなわち、ジャバ・アプリケーション・コード）をランタイムでコンパイルして、ソフトウエアを実行するプロセッサ用の自然コードを作るコンパイラである。実際には、バイトコード・コンパイラは全てのジャバ・バイトコードをコンパイルするのではなく、最初のバイトコード・ストリームをインタプリタ・コードで解釈し、この解釈したアプリケーション・コードの性能に基づいて、その一部をバイトコード・コンパイラでコンパイルして自然コードを作る。
【０００５】
かかる動的にコンパイルされるシステムでは、輪郭情報を用いて、アプリケーション・コードのどのセクションをコンパイルするかを動的に選択することができる。これをジャバ環境では適応動的コンパイル（ＡＤＣ）と呼ぶ。かかるＡＤＣの目的は、実行中にシステムの性能を改善することである。
【０００６】
輪郭情報を得るための公知の方法は多数ある。１つの方法はコードの「編成（ｉｎｓｔｒｕｍｅｎｔａｔｉｏｎ）」である。この方法では、コンパイラがアプリケーション・コードから生成した命令のシーケンスに追加の命令を加え（または、ジャバなどの動的にコンパイルされる言語の場合はインタプリタ・コードの該当する部分に追加の命令を加え）、かかる追加の命令を実行するときに所定の輪郭情報を記憶する。例えば編成プロセスでは、ループの本体を形成する命令シーケンスに追加の命令を加え、この追加の命令が現れる度にカウンタを増分することにより、ループを繰り返した回数を数える。コンパイラは、輪郭情報のこの部分と、編成プロセス中に別の命令を加えた結果得られる輪郭情報の他の部分とを用いて、コンパイルを最適化することができる。
【０００７】
編成に代わる方式はサンプルに基づく輪郭描写方法を用いることである。この場合は所定の時点でプロセッサに割込みをかけて、ＪＴＡＧインターフェースを介して性能カウンタを読むかまたはメモリに記憶する。フィードバック駆動最適化の詳細については、Ｒｏｂｅｒｔ　Ｃｏｈｎ他の「アルファ用のコンパックのコンパイル・ツールにおけるフィードバック指向最適化（Ｆｅｅｄｂａｃｋ　ｄｉｒｅｃｔｅｄ　ｏｐｔｉｍｉｓａｔｉｏｎ　ｉｎ　Ｃｏｍｐａｑ’ｓ　ｃｏｍｐｉｌａｔｉｏｎ　ｔｏｏｌｓ　ｆｏｒ　Ａｌｐｈａ），フィードバック指向最適化に関する第２回ＡＣＭワークショップ（２ｎｄ　ＡＣＭ　Ｗｏｒｋｓｈｏｐ　ｏｎ　Ｆｅｅｄｂａｃｋ−Ｄｉｒｅｃｔｅｄ　Ｏｐｔｉｍｉｓａｔｉｏｎ）、ハイファ（Ｈａｉｆａ）、イスラエル、１９９９年１１月１５日、に述べられている。
【０００８】
【発明が解決しようとする課題】
上に述べた２つの方法の問題は侵入的（ｉｎｔｒｕｓｉｖｅ）であることであって、最適化しようとするコードの行動を大幅に変えたり遅くしたりする。例えば、編成方式は命令シーケンスに追加の命令を加えるので命令シーケンスが大幅に変わる。同様に、サンプルに基づく輪郭描写方式は所定の時点で実行に割込みをかけるが、これはコンパイル済みのコードを実行するときには通常は起こらないことである。したがってこの２つの方法は、集めた情報、特に実時間システムで集めた情報の精度に悪い影響を与える。また上に述べたジャバなどの動的コンパイル法では、何をコンパイルするかを決定するために集めた情報の量と、その情報を集めるコスト（例えば、性能、コードの大きさの増加など）との間で注意深くバランスをとる必要がある。
したがって、かかるＦＤＯ方式に用いる輪郭情報を得るための改善された方法を提供することが望まれる。
【０００９】
【課題を解決するための手段】
第１の形態では、本発明が提供するデータ処理装置は、プロセッサと、プロセッサが実行する命令を生成するためにアプリケーション・コードをコンパイルするコンパイラと、プロセッサから受けた入力信号からプロセッサが実行する命令を表す追跡信号を生成するための、このプロセッサに結合する非侵入的（ｎｏｎ−ｉｎｖａｓｉｖｅ）追跡ユニットとを備える。コンパイラはこの追跡信号に従ってアプリケーション・コードのコンパイルを制御する。
【００１０】
本発明では、非侵入的追跡ユニットは、プロセッサから受けた入力信号からプロセッサが実行する命令を表す追跡信号を生成し、コンパイラはこの追跡信号に従ってアプリケーション・コードのコンパイルを制御する。非侵入的追跡ユニットを輪郭情報源として用いることにより、前に述べたＦＤＯ方式の問題は大幅に緩和される。詳しく述べると、監視される命令シーケンスはその予定通りに実行される（追加の命令を実行する必要がなく、また実行に割込みをかける必要がない）ので、集めた情報は正確である。
【００１１】
静的にコンパイルされる言語では、追跡信号を別のコンピュータで（例えば、標準の追跡インターフェースを用いて）集めて解析することができる。これはプロセッサの行動や性能に何の影響も与えない。集めた情報は従来のＦＤＯ方式と同じ方法でコンパイラに与えてよい。ジャバなどの動的にコンパイルされる言語では、追跡ユニットが生成する追跡信号を読み取って解析するために一般に別のアプリケーション・スレッドが与えられる。この解析の結果はコンパイラにフィードバックされ、アプリケーション・コードのどの部分をコンパイルするかがこれを用いて決定される。これはシステム全体の性能にいくぶん影響を与えるが、上に述べた従来の方法を用いてかかる情報を集めた場合に比べて影響ははるかに小さい。また注意すべきは、解析したコードをプロセッサが実行するときにはこのオーバーヘッドは特に発生しないので、得られた輪郭情報の精度が悪くなることは全くないことである。
【００１２】
理解されるように、非侵入的追跡ユニットはデータ処理装置内のどこに置いてもよい。しかし好ましい実施の形態では、非侵入的追跡ユニットとプロセッサとを同じチップ上に設けて、追跡信号生成プロセスの性能を改善させる。詳しく述べると、好ましい実施の形態では、非侵入的追跡ユニットは埋込み追跡マクロセル（例えば、英国キャンブリッジのＡＲＭ社製）であり、これに種々のＡＲＭプロセッサが関連する。かかる埋込み追跡マクロセル（Ｅｍｂｅｄｄｅｄ　Ｔｒａｃｅ　Ｍａｃｒｏｃｅｌｌ）（ＥＴＭ）は、追跡しようとするデータ処理装置の動作を表すデータの追跡ストリームを実時間で生成する。次にこの追跡ストリームを用いて、データ処理装置が実行する処理命令のシーケンスをデバッグする。本発明の発明者が理解したのは、コンパイラによるアプリケーション・コードのコンパイルの制御に必要な輪郭情報を形成する追跡信号は、かかる既存のＥＴＭを用いて生成することができるということである。これは、必要な輪郭情報を生成する非侵入的方法である。
【００１３】
理解されるように、或る実施の形態では、非侵入的追跡ユニットが生成した追跡信号をコンパイラが直接用いてもよい。しかし好ましい実施の形態では、コンパイラが必要とする輪郭情報を生成するには、一般に追跡信号について何らかの解析を行う必要がある。したがって好ましい実施の形では、データ処理装置は、コンパイラがアプリケーション・コードのコンパイルの制御に用いる性能データを追跡信号から得るための追跡解析器を更に備える。
【００１４】
或る実施の形態では、性能データはコンパイラに直接入力され、コンパイラはこれを用いてアプリケーション・コードのコンパイルを制御する。しかし別の実施の形態では、データ処理装置は、性能データを受けるための、またコンパイラでコンパイルするアプリケーション・コードを修正するための、プリプロセッサを更に備える。この場合コンパイラは、追跡信号から得られた性能データを考慮した、コンパイルのための修正されたアプリケーション・コードを受ける。
【００１５】
当業者が理解するように、性能データは種々の形をとってよい。しかし好ましい実施の形態では、性能データは命令のシーケンスを実行する頻度を識別するデータを含む。これとは別にまたはこれに加えて、性能データは命令のシーケンスの実行時間（すなわち、命令の特定のシーケンスを実行するのに要する時間）を識別するデータも含む。
【００１６】
理解されるように、非侵入的追跡ユニットはプロセッサが命令を実行している間に発生する種々の事象を表す追跡信号を生成することができる。しかし少なくとも、非侵入的追跡ユニットは命令フロー内の分岐を識別する追跡信号を生成することが望ましい。当業者が理解するように、分岐と分岐の間は命令は順次に実行されるので、分岐を識別する情報から、プロセッサが実行する命令の完全なフローに関する情報を構築する（したがってコンパイラがアプリケーション・コードのコンパイルの制御に用いるのに適当な情報を生成する）ことができる。
【００１７】
理解されるように、非侵入的追跡ユニットが生成する追跡信号は、その後の解析のために適当な機構を介して送ってよい。しかし好ましい実施の形態では、データ処理装置は、コンパイラにフィードバックする前にその後の解析に用いる追跡情報を記憶するための追跡バッファを更に備える。生成される追跡信号の量は時間と共に変わる可能性があるので追跡バッファを用いると有利である。追跡信号を緩衝すれば、追跡信号の生成に従って「直ちに」解析とコンパイラへのフィードバックを行う必要はない。
【００１８】
本発明は静的にコンパイルされる言語にも動的にコンパイルされる言語にも用いることができる。静的にコンパイルされる言語では、好ましい実施の形態のプロセッサはターゲット・プロセッサであり、コンパイラはターゲット・プロセッサとは異なるホスト・プロセッサ上で実行されるコンパイラ・コードである。
【００１９】
より特定して述べると、好ましい実施の形態では、コンパイラ・コードがコンパイルしたアプリケーション・コードはターゲット・プロセッサ上でテスト・モードで実行され、コンパイラ・コードは非侵入的追跡ユニットが生成する追跡信号に従ってアプリケーション・コードを再コンパイルする。
【００２０】
生成された追跡信号から追跡解析器を用いてコンパイラのための性能データを生成する実施の形態では、コンパイル済みのアプリケーション・コードは好ましくはプロセッサが所定の時間実行し、追跡解析器はその間に得られた追跡信号から、コンパイラ・コードがアプリケーション・コードを再コンパイルするのに用いる性能データを生成する。
コンパイルされるアプリケーション・コードが動的にコンパイルされる言語で書かれる実施の形態では、コンパイラは好ましくはプロセッサ上で実行してランタイム中にアプリケーション・コードを動的にコンパイルする動的コンパイラ・コードである。
【００２１】
当業者が理解するように、動的にコンパイルされる言語で書かれたアプリケーション・コードは一般にプロセッサで実行する前に全てをコンパイルするのではなく、最初のアプリケーション・コードをまず解釈し、この解釈されたコードの性能に基づいてアプリケーション・コードの各部をコンパイルして自然コードを生成し、これらの部分をプロセッサで直接実行する。より詳細に述べると、好ましい実施の形態では、データ処理装置は命令のインタプリタ・シーケンスとしてプロセッサ上で実行してアプリケーション・コードを解釈するインタプリタ・コードを更に含み、非侵入的追跡ユニットが生成する追跡信号はプロセッサが実行する命令のインタプリタ・シーケンスを表し、また動的コンパイラ・コードは追跡信号に従ってアプリケーション・コードのセクションをコンパイルするので、アプリケーション・コードのこれらのセクションをプロセッサで実行することが可能になる。インタプリタ・コードは好ましくは自然コードで書かれる。
【００２２】
アプリケーション・コードを解釈するためにインタプリタ・コードを設けるだけでなく、プロセッサ上で直接実行できるようにアプリケーション・コードの所定のセクションを復号するためのハードウエア復号器を設けてよい。これは一般にアプリケーション・コードの共通に用いられるセクション（例えば、分岐を定義するセクション）の性能を向上させるために行う。かかるハードウエア復号器を含む実施の形態では、インタプリタ・コードは好ましくはアプリケーション・コードのこれらの所定のセクションを解釈せず、また非侵入的追跡ユニットが生成する追跡信号はハードウエア復号器の動作を表す。このように、アプリケーション・コードのどのセクションをコンパイルするかを決定するのにコンパイラが用いるために生成される情報は、インタプリタ・コードの動作だけでなくハードウエア復号器の動作にも従って生成されるので、データ処理装置上でアプリケーション・コードがどのように走っているかを一層完全に示すことができる。
【００２３】
動的にコンパイルされるアプリケーション・コードに基づく実施の形態において、追跡解析器を用いて追跡信号を解析する場合は、この追跡解析器は好ましくはプロセッサ上で実行する追跡解析器コードを備える。この追跡解析器コードは好ましくは自然コードである。
当業者が理解するように、本発明は任意の動的にコンパイルされる言語に適用することができる。しかし好ましい実施の形態では、アプリケーション・コードは動的にコンパイルすることができるジャバ・バイトコードを含む。
【００２４】
かかる実施の形態では、動的なコンパイラ・コードは好ましくはプロセッサ上で実行されるジャバ仮想機械内に与えられる。更に、インタプリタ・コードは好ましくはジャバ仮想機械内に与えられる。また好ましい実施の形態では、追跡解析器コードもジャバ仮想機械内に与えられる。当業者が理解するように、仮想機械はホスト・コンピュータ上で走るが別個のコンピュータのように行動するシミュレートされたコンピュータである。したがってジャバ仮想機械はジャバ・アプリケーションを走らせる自立動作環境として働き、したがってホスト・オペレーティング・システムとは独立に動作する。
【００２５】
一般に、コンパイラはソース・コードをオブジェクト・コードに変換する。したがってかかる実施の形態では、アプリケーション・コードはソース・コードであり、コンパイラは追跡信号に従って前記命令をオブジェクト・コード・フォーマットで生成する。しかし別の実施の形態ではアプリケーション・コードはオブジェクト・コードであり、コンパイラは追跡信号に従って前記命令を新しいオブジェクト・コードとして生成する。新しいオブジェクト・コードは前のオブジェクト・コードと同様に動作するが、追跡信号に関して生成されるために増強された性能を有する。かかる実施の形態では、コンパイラをオプティマイザまたは２進トランスレータと呼ぶことが多い。
【００２６】
第２の形態では、本発明は、命令を実行するプロセッサと、プロセッサに結合してプロセッサから受けた入力信号からこのプロセッサが実行する命令を表す追跡信号を生成する非侵入的追跡ユニットとを備えるデータ処理装置内で、アプリケーション・コードをコンパイルする方法を与える。この方法は、ａ）アプリケーション・コードをコンパイルしてプロセッサが実行する命令を生成するステップと、ｂ）非侵入的追跡ユニットを用いて前記追跡信号を生成するステップと、ｃ）追跡信号に従って前記ステップ（ａ）でのアプリケーション・コードのコンパイルを制御するステップとを含む。
【００２７】
第３の形態では、本発明は本発明の第２の形態に係る方法を実行するデータ処理装置を構成するコンピュータ・プログラム製品を与える。
第４の形態では、本発明は本発明の第２の形態に係る方法のコンパイル・ステップａ）とｃ）を行うデータ処理装置を構成するコンピュータ・プログラム製品を与える。
【００２８】
第５の形態では、本発明は、アプリケーション・コードのコンパイルを制御するのに用いる性能データを追跡信号から得るステップを行うデータ処理装置を構成する、本発明の第４の形態に係るコンピュータ・プログラム製品を与える。
第６の形態では、本発明はアプリケーション・コードのコンパイルを制御するのに用いる性能データを追跡信号から得るステップを行うデータ処理装置を構成するコンピュータ・プログラム製品を与える。
第７の形態では、本発明は本発明の第３から第６までの任意の形態に係るコンピュータ・プログラムを含むキャリア媒体を与える。
【００２９】
【好ましい実施の形態の説明】
図１は、コンパイラが生成するコードのＦＤＯに用いる輪郭情報を生成する、サンプルに基づく輪郭描写方法の概要を示す図である。図１に示すように、アプリケーション・コード１００をコンパイラ１１０に通して、実行する命令のシーケンス１２０を生成する。コンパイラ１１０は一般にプロセッサ上で実行するソフトウエアとして形成される。プロセッサは、命令のシーケンス１２０を実行するプロセッサと同じであっても同じでなくてもよい。図１に例として示すように、アプリケーション・コードの或る部分が或るパラメータ（この例ではパラメータ「ｘ」）を１に設定するように指定すると、命令を生成するコンパイラ１１０は或る特定のレジスタの値を１に設定する。英国キャンブリッジのＡＲＭ社が開発したＡＲＭ命令集合内では、これは一般に「ＭＯＶ」命令で行われる。この命令は指定された値を或るレジスタに移動する。図１に示す例では、この命令は値１をレジスタｒ０に移動する。
【００３０】
当業者によく知られているように、コンパイラ１１０がアプリケーション・コードの特定のセクションを命令シーケンスに実際に変換するには、一般に多くの異なる方法がある。コンパイラ１１０がアプリケーション・コードの任意の特定の部分を最もよくコンパイルする方法を決定するときに用いる情報の１つの重要な部分は、プロセッサ上で走るときのアプリケーションの実行状態である。かかる実行状態は種々の異なる情報部分を含む。例えば或る特定のループを何回繰り返すか、「ｔｈｅｎ」という節を実行するのが適当か、或る機能を実行するのにどの程度の時間を要するか、などである。前に述べたように、ＦＤＯはコンパイラが用いるプログラムのランタイム行動についての情報を得るための機構である。実行プログラムの輪郭を描写し、得られた輪郭情報を用いてアプリケーション・コードをコンパイラで再コンパイルする。例えば、コードを頻繁に実行する経路を速くし、他の経路を遅くする。多くの異なる最適化方法が知られている。例えば、Ｒｏｂｅｒｔ　Ｃｏｈｎ他の「アルファ用のコンパックのコンパイル・ツールにおけるフィードバック指向最適化（Ｆｅｅｄｂａｃｋ　ｄｉｒｅｃｔｅｄ　ｏｐｔｉｍｉｓａｔｉｏｎ　ｉｎ　Ｃｏｍｐａｑ’ｓ　ｃｏｍｐｉｌａｔｉｏｎ　ｔｏｏｌｓ　ｆｏｒ　Ａｌｐｈａ）、フィードバック指向最適化に関する第２回ＡＣＭワークショップ（２ｎｄ　ＡＣＭ　Ｗｏｒｋｓｈｏｐ　ｏｎ　Ｆｅｅｄｂａｃｋ　−Ｄｉｒｅｃｔｅｄ　Ｏｐｔｉｍｉｓａｔｉｏｎ）、ハイファ（Ｈａｉｆａ）、イスラエル、１９９９年１１月１５日、を参照していただきたい。しかし明らかに重要なことは、かかる最適化方法を適用する前に、コンパイラ１１０に入力する正確な輪郭情報を得ることである。
【００３１】
かかる輪郭情報を得る１つの公知の方法は図１に示すいわゆるサンプルに基づく輪郭描写方法である。この方法では、実行する命令１２０は図１のボックス１３０で示す予定されたプロセッサ（ここでは「ターゲット」プロセッサとも呼ぶ）上で実行する。実行中の種々の時点で、割込み機能１４０を用いてプロセッサの実行を所定の点で止めて、性能カウンタを例えばＪＴＡＧインターフェースを介して読み取るかまたはメモリ内に保存する。かかる性能カウンタは輪郭メモリ１５０内に輪郭データとして記憶する。当業者が理解するように、この輪郭メモリ１５０は、例えばオンチップまたはプロセッサがアクセス可能な外部ＲＡＭなど、種々の形をとることができる。
【００３２】
図１のボックス１６０で示すように、輪郭データを例えば「輪郭」ハンドラで読み取り、輪郭情報をコンパイラ１１０にフィードバックしてアプリケーション・コードのコンパイルを制御する。前に述べたように、この方法の１つの問題は得られた輪郭データの精度に悪い影響を与えることである。なぜなら、輪郭情報を得るのに命令の実行を所定の時点で中断しなければならないので、命令が予定されたように実行されないからである。
【００３３】
図２は、ＦＤＯ方式に必要な輪郭情報を得る別の従来技術の方法を示す。図１に示した方法と同様に、アプリケーション・コード１００をコンパイラ１１０に通して、実行する命令のシーケンス１２０を生成する。これらの命令をプロセッサ上で実行する前に命令をまず編成器（ｉｎｓｔｒｕｍｅｎｔｅｒ）２００に通し、命令シーケンスに追加の命令を挿入して、これらの追加の命令を実行したときに輪郭情報を輪郭メモリ内に記録するようにする。このようにして、修正された命令シーケンス２１０が得られる。
【００３４】
図２に示すように、編成器２００が追加する命令の１つの種類は分岐命令である。この分岐命令を実行すると、命令フローは或る輪郭情報を輪郭メモリ１５０内に記憶するのに用いられる所定のルーチンへ分岐する。図２に示す例では分岐命令を「ｂｌ」命令で示し、必要な輪郭情報を輪郭メモリ１５０内に記録する「ｒｅｃｏｒｄ」と呼ぶルーチンを識別する。
【００３５】
注意すべきであるが、図２では編成プロセスをコンパイル・プロセスとは別個のプロセスとして示しているが、かかるプロセスは並列に行われることが多く、実際に編成ソフトウエアはコンパイラ・ソフトウエア内に組み込まれることがある。編成はこの技術ではよく知られた方法なので、これ以上詳細には説明しない。
【００３６】
編成プロセスが終わると、修正された命令シーケンス２１０をプロセッサ（ボックス１３０で示す）上で実行し、或る輪郭情報を輪郭メモリ１５０内に記憶する。図１を参照して前に説明したように、この輪郭情報を或る適当な時点で読み取り、これをコンパイラ１１０にフィードバックしてアプリケーション・コードのコンパイルの制御に用いることができる。前に述べたように、かかる編成方式をプロセッサ上で実行すると、追加の命令があるのでコードの行動が大幅に変わり、得られる輪郭情報の精度に悪い影響を与える可能性がある。また、命令を追加するとコードの実行が遅くなるので、集めた情報の精度にやはり悪い影響を与える。また、動的にコンパイルされる言語で実行する動的コンパイルなどの実時間システムでは、輪郭情報を集めるための性能コストが生じるので、輪郭情報に基づく動的コンパイル・プロセスにより実現される性能の利点がいくぶん減少する。
【００３７】
この問題を緩和するため、本発明の好ましい実施の形態は図３に概略説明する方法を用いる。前と同様に、アプリケーション・コード１００をコンパイラ１１０に通し、実行する命令１２０を生成する。この命令シーケンスをプロセッサ１３０上で実行するが、輪郭情報を得るのに上に説明した侵入的方法を用いるのではなく、プロセッサが実行する命令を表す追跡信号を埋込み追跡マクロセル（Ｅｍｂｅｄｄｅｄ　Ｔｒａｃｅ　Ｍａｃｒｏｃｅｌｌ）（ＥＴＭ）３００で生成する。
【００３８】
ＥＴＭは一般にシステム開発において、追跡するシステム内のステップ毎の動作を表すデータを含む追跡ストリームを生成するのに用いられる。外部からアクセス可能なピンを介してプロセッサの状態を追跡することがますます困難になりつつあるので、追跡機能性をチップ上に置く量が次第に増えている。かかるオンチップ追跡機構の例として、英国キャンブリッジのＡＲＭ社が種々のＡＲＭプロセッサに関連して提供するＥＴＭがある。
【００３９】
ＥＴＭは追跡したいデータ処理システムの動作を表すデータの追跡ストリームを実時間で作成する。次にこの追跡ストリームを用いて、データ処理システムが実行する処理命令のシーケンスのデバッグに役立てる。この追跡ストリームは完全に非侵入的方法で生成されるので、プロセッサが実行するコードの行動に影響を与えない。本発明の発明者が理解したのは、ＥＴＭ３００が追跡する行動を適当に指定すれば、生成された追跡信号を用いて、コンパイラ１１０にフィードバックしてＦＤＯ方式に用いられる輪郭情報を生成することができるということである。これはＥＴＭ３００の全く新しい使い方であって以前には考えられなかったことである。ＥＴＭ３００を用いることにより、プロセッサ上で実行するコードの実行状態すなわち性能に影響を与えずにデータを得ることができる。またこのデータから、コンパイラ１１０にフィードバックするための適当な輪郭情報を得ることができる。図３に示すように、ＥＴＭ３００が生成する追跡ストリームを次にブロック３１０で示すように解析し、コンパイラ１１０にフィードバックする適当な輪郭情報を生成して、アプリケーション・コードのコンパイルの制御に用いることができる。
【００４０】
或る実施の形態では、輪郭情報を図３に示すコンパイラ１１０に直接入力し、コンパイラはこれを用いてアプリケーション・コードのコンパイルを制御する。しかし別の実施の形態ではプリプロセッサを設け、輪郭情報を受けて、コンパイラ１１０がコンパイルするアプリケーション・コード１００を修正してもよい。この場合コンパイラは、追跡信号から得られる輪郭情報を考慮に入れた、コンパイルのための修正されたアプリケーション・コードを受ける。
【００４１】
図４は、アプリケーション・コードがＣやＣ＋＋などの静的にコンパイルされた言語を用いて書かれている実施の形態における輪郭データの生成の詳細を示すブロック図である。かかる実施の形態では、コンパイル済みのアプリケーション・コードを実行する予定のプロセッサ・コア４４０とは異なるホスト・システム４００のプロセッサ上で、コンパイラ・コード４１０を実行するように考えられている。輪郭データにアクセスせずにアプリケーション・コードをまずコンパイラ４１０でコンパイルし、このコンパイル済みのコードを経路４１５によりターゲット・システム内のプロセッサ・コア４４０に送り、プロセッサ・コア４４０がアクセス可能なメモリの一部にこれを記憶する。図４ではこれを丸印で（ｓｔｉｇｍａｔｉｃａｌｌｙ）コンパイル済みのコード４５０として示す。
【００４２】
次に、コンパイル済みのコード４５０をプロセッサ・コア４４０上で実行すると、ＥＴＭ４６０は追跡ストリームを生成し、経路４６５によりこれを追跡バッファ４７０内に記憶する。この追跡バッファは別個のハードウエアでもよいし、ターゲット・システム内のメモリのブロックで与えてもよい。当業者が理解するように、追跡ストリームは多数の情報片を含んでよいが、少なくとも命令フロー内の分岐は識別する。これにより、ホスト４００内の追跡解析器４２０は後でプロセッサ・コア内の命令フローの姿を得ることができる。
【００４３】
アプリケーション・コードをテスト・モードで所定の時間実行した後、追跡解析器４２０はＥＴＭ４６０が生成する追跡信号のストリームを追跡バッファ４７０から経路４７５により検索する。次に、追跡解析器４２０は追跡信号からプロセッサ・コアの行動を決定する。例えば、プロセッサ・コア内の命令フローの姿を構築し、その行動から、コンパイラ４１０にフィードバックするための輪郭データ４３０を生成する。
【００４４】
追跡解析器はＥＴＭが生成する追跡ストリームの解析を行うために開発されたもので、前に説明したようにかかる解析はデータ処理システム上で実行するデバッグ・プロセスの一部として用いられている。考えてみると、任意のかかる公知の追跡解析器は追跡解析器４２０として用いることができるし、またかかる追跡解析器を制御すればコンパイラ４１０が用いることのできる適当な輪郭データ４３０を作成することができる。例えば、追跡解析器としてはＡＲＭ社の追跡デバッグ・ツール（ＴＤＴ）ソフトウエア製品を用いることができる。
【００４５】
当業者が理解するように、コンパイラ４１０が適用するＦＤＯ技術に必要なデータに従って、輪郭データは種々の形をとることができる。しかし好ましい実施の形態では、輪郭データは命令のシーケンスの実行頻度を識別する性能データおよび／または命令の特定のシーケンスが実行するのに要した時間を識別するデータである。したがって命令の或る特定のシーケンスが頻繁に実行され、現在その実行時間が比較的遅い場合は、コンパイラ４１０は命令のそのシーケンスの実行時間が短くなるように命令のそのシーケンスを変えてコンパイルしてよい。
【００４６】
このように輪郭データ４３０に基づいて、コンパイラ４１０はその輪郭データに関してアプリケーション・コードを再コンパイルし、修正されたコンパイル済みのコードを経路４１５でプロセッサ・コア４４０に出力する。その後プロセッサ・コア４４０が用いるのは、この修正されたコンパイル済みのコードである。この時点で、プロセッサ・コア４４０を組み込んだデータ処理システムを、点線４８０で示すようにホスト・システム４００から切り離してよい。
上の説明から分かるように、プロセッサ・コア４４０（例えばＡＲＭプロセッサ・コア）に取り付けられたＥＴＭ４６０は侵入なしにプロセッサの実行の履歴記録を与えることができる。
【００４７】
本発明の別の実施の形態を図５に示す。この場合は、好ましい実施の形態の技術を用いて、ジャバ・バイトコードで形成するアプリケーション・コードの動的コンパイルに用いる輪郭情報を生成する。当業者が理解するように、プロセッサ・コア４４０上で実行するジャバ仮想機械５１０を設け、ジャバ・バイトコード５２０で形成するジャバ・アプリケーションを走らせるための独立の動作環境を作る。この構成の利点は、プロセッサ・コア４４０内に設けられるホスト・オペレーティング・システムとは独立にジャバ・アプリケーションを走らせることができることである。ジャバ仮想機械の部分はプロセッサ・コア上で動作して実際上ジャバ・バイトコード５２０を走らせるので、ＥＴＭ４６０は追跡バッファ４７０内に記憶する追跡信号のストリームを生成する。本発明の好ましい実施の形態では、プロセッサ・コア４４０上で動作する追跡解析器コード５００を設けてＥＴＭ４６０が生成する追跡ストリームを解析し、ジャバ仮想機械５１０にフィードバックする輪郭情報を生成する。次にこの情報を用いて、ジャバ・バイトコードのセクションの動的コンパイルを制御する。このプロセスを、図６を参照してに更に詳細に説明する。
【００４８】
図６に示すように、プロセッサ・コア４４０（例えば、ＡＲＭプロセッサ・コア）は多数の異なるアプリケーション６００，６１０を実行する。好ましくはプロセッサ・コア上でマルチタスク・オペレーティング・システムを走らせて、特定の時点で実行する種々のプログラム・スレッドにそれぞれの処理時間を割り当てる。ジャバ仮想機械６１０はプロセッサ・コア上で実行する必要のある多数の異なるプログラム・スレッドから成る。これらは、インタプリタ・コード６２０、ジャスト・イン・タイム（ＪＩＴ）コンパイラ・コード６３０、追跡バッファ解析器コード６４０などを含む。これらの各プログラム・スレッドはプロセッサ・コア４４０上で実行する自然コードから成る。例えばプロセッサ・コアがＡＲＭプロセッサの場合は、これらのプログラム・スレッドはＡＲＭコードから成る。
【００４９】
インタプリタ・コード６２０とＪＩＴコンパイラ・コード６３０はジャバ仮想機械６１０の標準の機能であるが、追跡バッファ解析器コード６４０は本発明の好ましい実施の形態に従って追加されたコードであって、ＥＴＭ４６０が生成する追跡ストリームを解析する。これについては後で詳細に説明する。前の図５から明らかなように、追跡バッファ解析器コードをジャバ仮想機械に含める必要はなく、実際に全く別個のコード片として与えてよい。
【００５０】
インタプリタ・コード６２０は、ジャバ・バイトコード５２０を解釈するのに用いられる命令のインタプリタ・シーケンスとしてプロセッサ・コア４４０上で実行される。当業者が理解するように、インタプリタ・コード６２０は実行する必要のある動作をジャバ・バイトコード毎に識別する。例えば、ジャバ・バイトコードが「加算」バイトコードの場合は、必要な動作はスタックのトップとスタックのスタック‐１項目のトップの中のデータ値を加算してその結果をスタック項目のトップに入れることである、ということをインタプリタ・コード６２０は指定する。インタプリタ・コード６２０はＡＲＭ復号器６５０を通り、マルチプレクサ６６５を介し、実行パイプライン６７０を通って進み、その解釈を実行して適当な動作を行う。ＥＴＭ４６０はプロセッサ・コア４４０の動作を表す追跡信号を生成し、これを追跡バッファ４７０に記憶する。
【００５１】
追跡解析器コード６４０は追跡バッファの内容を検索し、この追跡信号から、ＪＩＴコンパイラ・コード６３０に入力する輪郭情報を生成する。ＪＩＴコンパイラ・コード６３０はこの輪郭情報を用いて、プロセッサ・コア４４０上で直接実行するにはジャバ・バイトコード５２０のどのセクション（もしあれば）をコンパイルしてＡＲＭコードを作成するかを決定する。例えば、ジャバ・アプリケーションの最も頻繁に実行されるセクションのジャバ・バイトコードは、プロセッサが直接実行できるようにＪＩＴコンパイラ・コード６３０でコンパイルして自然コード（この例ではＡＲＭコード）を作成する。
【００５２】
ジャバ・バイトコードの或るセクションのコンパイルが終わると、その後そのセクションが現れたときはもうインタプリタ・コード６２０で解釈する必要はなく、ＡＲＭ復号器６５０と実行パイプライン６７０を通して直接送ることにより、ジャバ・アプリケーションのそのセクションの性能を大幅に高めることができる。
これらの種々のプログラム・スレッド６２０，６３０，６４０はプロセッサ・コア４４０上で実行するが、他のプログラム・スレッド６００も実行してよいことは明らかである。
【００５３】
好ましい実施の形態では、特定のジャバ・バイトコード・シーケンスの実行を促進するためにプロセッサ・コア４４０に更にジャバ・ハードウエア復号機６６０を設ける。或るジャバ・バイトコードを自然コードに変換することなく実行パイプライン６７０が実行する多数の動作を直接指定できるようにするため、ジャバ復号器６６０はこれらのバイトコードを復号する。一般にジャバ・ハードウエア復号器６６０は共通に発生するジャバ・バイトコードの動作（例えば分岐を指定するなど）を実行する。ジャバ・バイトコードがプロセッサ・コア４４０上で走っている状態の姿を追跡バッファ解析器コード６４０が正確に構築するため、ＥＴＭ４６０はプロセッサ・コア４４０上でのインタプリタ・コードの実行に関する信号を追跡するだけでなく、ジャバ復号器６６０の動作を表す追跡信号を生成する。この情報に基づいてＪＩＴコンパイラ・コード６３０のための適当な輪郭情報を生成することにより、どのバイトコードをコンパイルして自然コードを作成するかをＪＩＴコンパイラ・コードは決定することができる。
【００５４】
好ましい実施の形態では、ＥＴＭ４６０は取得した全てのＢＸＪ命令（すなわち、ジャバ復号器６６０への分岐というＡＲＭ命令）のターゲット・アドレスを捕捉する追跡信号を生成し、またバイトコード「ｇｏｔｏ」、「ｉｆ」、「ｊｓｒ」（すなわち、サブルーチンへジャンプ）命令のターゲット・アドレスを追跡する。追跡バッファ解析器コード６４０は好ましくは追跡ハードウエアを処理する双対プロセッサ・インターフェースを用い、またプロセッサ・バスを介した追跡バッファへのメモリ・マップ・アクセスを得て追跡バッファを読み取る。次に追跡バッファ解析器コードは多数の機能を実行して、ＪＩＴコンパイラ・コード６３０のための適当な信号を生成する。例えば、追跡バッファ解析器コード６４０は使用カウンタを保持し（恐らくジャバ・コードへの分岐のターゲット・アドレスのハッシュを用いて）、頻繁に実行されるアドレスを発見するとジャバ仮想機械のＪＩＴコンパイラはバイトコード・シーケンスをより最適なＡＲＭマシン・コード形式に変換する。
【００５５】
当業者が理解するように、図６に示す方法でＥＴＭ４６０を用いると最初に考えていたデバッグ・プロセスに用いる機能に影響を与えることがある。しかしこの問題は、ＥＴＭハードウエアを拡張して別個の共存する輪郭マクロセルを実現する（例えば二重ポート・インターフェースを使用カウンタのハッシュ・マップ・ブロックに用いる）ことにより緩和することができる。
【００５６】
図７は、本発明の好ましい実施の形態に用いることのできるデータ処理装置の概要を示すブロック図である。好ましい実施の形態では、データ処理装置はＣＰＵ１０内に設けられるＣＰＵコア６０の形をとる。ＣＰＵコア６０は、命令を実行する処理ユニットと、処理ユニットが扱うデータ値を入れるためのこの処理ユニットがアクセス可能なレジスタの集合７０とを含む。ＣＰＵ１０は一般にＣＰＵコア６０と、ＥＴＭ４５と、多数の他の要素（キャッシュ５０など）を含む。
【００５７】
ＣＰＵ１０は一般にバス３０を介して他の要素に接続する。例えばリード・オンリー・メモリ（ＲＯＭ）４０やランダム・アクセス・メモリ（ＲＡＭ）２０に接続する。ＲＯＭ４０はＣＰＵコア６０上で走るオペレーティング・システムなどを特に記憶し、また本発明の好ましい実施の形態では、ＲＡＭ２０はアプリケーション・コードおよび／またはＣＰＵコア６０上で実行するこのコードのコンパイル済みの形を記憶するのに用いてよい。追跡バッファ８０もバス３０に結合し、ＥＴＭ４５が生成する追跡ストリームを記憶するのに用いられる。ＥＴＭ４５からの追跡ストリームは経路４７により追跡バッファ８０に送られる。
【００５８】
静的にコンパイルされる言語を含む前に説明した実施の形態に関して考えると、ホスト・システム４００を図７に示すデータ処理装置に結合して、テスト・モード中にＣＰＵコア６０で実行するために、コンパイラ４１０で生成したコンパイル済みのコードをＲＡＭ２０にロードする。追跡解析器４２０は図７に示すデータ処理装置とインターフェースして追跡バッファ８０（図７に示すようにターゲット・システム内に設けてもよいし、前に説明したように外部に設けてもよい）内に記憶されている追跡ストリームを検索し、追跡解析器４２０が生成した輪郭データ４３０に関するコードをコンパイラ４１０で再コンパイルする。再コンパイル済みのコードは、後でＣＰＵコア６０が実行できるようにＲＡＭ２０内に記憶する。この時点で、ホスト・システム４００を図７に示すデータ処理装置から切り離してよい。
【００５９】
動的にコンパイルされる言語に関してここで説明した他の実施の形態に関して、特にジャバ・バイトコードの動的なコンパイルに関して、ジャバ仮想機械６１０や、追跡解析器（ジャバ仮想機械内に含まれない場合でも）や、その他のプログラム・スレッド６００や、ジャバ・バイトコード５２０は全て、ＣＰＵ６０上で実行できるようにＲＡＭ２０内に記憶する。この実施の形態では、追跡バッファ８０はＣＰＵコア６０からアクセス可能でなければならない。
【００６０】
上の説明から明らかなように、本発明の好ましい実施の形態では、ＡＲＭ社が開発したＥＴＭなどの非侵入的追跡ユニットを用いて、データ処理装置の一部または全部のコードの行動（したがって、性能）の詳細な追跡を提供する。この方法はシステムの性能に影響を与えないので、コンパイルのＦＤＯのための輪郭情報源としてＥＴＭを用いることにより、上に説明した従来技術のＦＤＯ技術の問題は実質的に緩和される。更に、この方法は非侵入的なので、集めた情報は正確であり、また情報を集めるためにシステムが遅くなることはない。
【００６１】
静的にコンパイルされる言語を用いると、標準の追跡インターフェースを用いて別個のコンピュータで追跡データを集めて解析することができる。これはターゲット・プロセッサの行動すなわち性能に全く影響がなく、集めた情報は従来のＦＤＯ技術の場合と同様にしてコンパイラに送られる。
【００６２】
ジャバなどの動的にコンパイルされる言語では、追跡データを追跡バッファ内に記憶し、ジャバ仮想機械の別個のスレッドで読み取って解析する。この解析の結果をジャバ・バイトコード・コンパイラにフィードバックしてソフトウエアのどの部分をコンパイルして自然コードを生成するかを決定することができる。余分なプログラム・スレッドが存在するのでこれはシステムの性能にいくらか影響を与えるが、例えば編成などの公知の従来の方法を用いて同じ量の情報を集める場合に比べて、悪い影響ははるかに少ないはずである。また、解析したアプリケーション・コードが走っているときはこのオーバーヘッドは特に発生しないので、集めた性能データを悪化させることはない。
【００６３】
本発明の特定の実施の形態について説明したが、本発明はこれに限定さるものではなく、発明の範囲内において種々の変更や追加を行ってよいことは明らかである。例えば、本発明の範囲から逸れることなく、従属請求項の特徴と独立請求項の特徴とを種々に組み合わせてよい。
【図面の簡単な説明】
本発明について、単なる例であるが、以下の図面に示す本発明の好ましい実施の形態を説明する。
【図１】輪郭情報を生成するための、従来技術のサンプルに基づく輪郭描写方法を示す略図。
【図２】輪郭情報を生成するための、従来技術の「編成」方式を示す略図。
【図３】本発明の実施の形態に係る、輪郭情報を得る方法を示す略図。
【図４】本発明の１つの実施の形態に係る、静的にコンパイルされる言語のコンパイルを最適にするのに用いられる輪郭情報の生成を示す略図。
【図５】本発明の別の実施の形態に係る、ジャバ・バイトコードの動的なコンパイルに用いられる輪郭情報の生成を示す略図。
【図６】本発明の好ましい実施の形態に係る、ジャバ・バイトコードの動的なコンパイルの制御に追跡データを用いる方法の詳細を示す図。
【図７】本発明の実施の形態に用いられるデータ処理装置の概要を示すブロック図。
【符号の説明】
１００　アプリケーション・コード
１１０　コンパイラ
１２０　実行する命令
１３０　プロセッサ
３００　非侵入的追跡ユニット
【図１】
2004062858.tif 000003
【図２】
2004062858.tif 000004
【図３】
2004062858.tif 000005
【図４】
2004062858.tif 000006
【図５】
2004062858.tif 000007
【図６】
2004062858.tif 000008
【図７】
2004062858.tif 000009