(57)【要約】【課題】コンテンツの実行速度を向上させる情報処理装置を提供する。【解決手段】本発明の携帯電話機１０１は、スクリプト或いはJavaプログラム１０７のサブルーチンごとに、ネイティブコード１３１、第１コード１１９、及び第２コード１２１を記憶するメモリと仮想マシン１５３と、プロセッサ１１３と、第１コード１１９から第２コード１２１を生成するプリコンパイル回路１７３とを備える。この各種コードは、該当する種類を表すコードタイプが記述されたヘッダ部２５０を有するとともに、他のサブルーチンへのジャンプ先アドレスとして特殊アドレスが記述されており、前記特殊アドレスは、特殊アドレス識別子と前記他のサブルーチンの先頭アドレスを含む。さらに、携帯電話機１０１は、プロセッサ１１３の特殊アドレスへのアクセスを検出した場合、メモリ１１７上に存在するコードの種類に応じて、該コードの処理方法を切り替えるサブルーチン管理手段を備える。【選択図】図１
2009211187.tif 000002
【特許請求の範囲】
【請求項１】
コンテンツに含まれる複数のサブルーチンごとに、プロセッサで実行可能なネイティブコード、前記ネイティブコードの元となるＯＳに依存しない第１コード、及び前記第１コードを前記ネイティブコードへ変換する過程で生成される第２コードのうち、少なくともいずれか１種類のコードを記憶するメモリであって、前記コードは、該当する種類を表すコードタイプが記述されたコード情報格納部を有するとともに、他のサブルーチンへのジャンプ先アドレスとして特殊アドレスが記述されており、前記特殊アドレスは、特殊アドレス識別子と前記他のサブルーチンの先頭アドレスを含む、メモリと、
前記第１コードをインタプリタ方式で実行するインタプリタ機能、及び前記第２コードをネイティブコードへ変換してから実行するＪＩＴコンパイル機能を備えた仮想マシンと、
前記ネイティブコードを実行するプロセッサと、
前記第１コードから前記第２コードを生成するプリコンパイル回路と、
前記コンテンツの実行中に前記プロセッサがアクセスしたアドレスに前記特殊アドレス識別子が含まれている場合に前記特殊アドレスであると判断し、前記メモリ上に当該他のサブルーチンのコードとして、ネイティブコードが記憶されていれば、該ネイティブコードが前記プロセッサで実行されるように第１の実行制御を行い、ネイティブコードが記憶されておらず第２コードが記憶されていれば、該第２コードが前記仮想マシンのＪＩＴコンパイル機能で実行され、生成されたネイティブコードが前記メモリに格納されるように第２の実行制御を行い、第１コードだけが記憶されていれば、該第１コードが前記仮想マシンのインタプリタ機能で実行されるとともに、前記プリコンパイル回路で第２コードに変換され、該第２コードが前記メモリに格納されるように第３の実行制御を行うサブルーチン管理手段とを備え、
前記サブルーチン管理手段は、前記コード情報格納部に記述されているコードタイプを利用して前記第１乃至第３の実行制御を切り替える情報処理装置。
【請求項２】
前記サブルーチン管理手段は、前記第１又は第２の実行制御によりサブルーチンのコードが変換されたときは、該コードのコード情報格納部に変換後のコードの先頭アドレスが記述されるように記録制御を行い、前記コンテンツの実行中に前記プロセッサがアクセスしたアドレスに前記特殊アドレス識別子が含まれている場合に前記特殊アドレスであると判断し、当該他のサブルーチンのコードのコード情報格納部を検査し、第１コードを表すコードタイプが記述されており、且つ第２コードの先頭アドレスが記述されていないときは、前記第３の実行制御を行い、第１コードを表すコードタイプが記述されており、且つ第２コードの先頭アドレスが記述されており、且つ該先頭アドレスで特定される第２コードのコード情報格納部にネイティブコードの先頭アドレスが記述されていないときは、前記第２の実行制御を行い、第１コードを表すコードタイプが記述されており、且つ第２コードの先頭アドレスが記述されており、且つ該先頭アドレスで特定される第２コードのコード情報格納部にネイティブコードの先頭アドレスが記述されているときは、前記第１の実行制御を行う情報処理装置。
【請求項３】
前記サブルーチン管理手段は、前記第３の実行制御を行う際、前記サブルーチンごとに定められる前記第１コードを前記第２コードへ変換する優先度に基づいて、前記プリコンパイル回路を制御する請求項１又は２に記載の情報処理装置。
【請求項４】
前記メモリは、前記優先度に応じて、前記プリコンパイル回路の動作速度を定めた動作速度定義表を記憶し、
さらに、前記プリコンパイル回路で処理される第１コードに対応するサブルーチンの優先度を用いて、前記動作速度定義表から動作速度を判断し、該動作速度に従って前記プリコンパイル回路が動作するように制御を行うプリコンパイル制御手段を備えた
請求項３に記載の情報処理装置。
【請求項５】
前記優先度は、前記コンテンツの実行中に呼び出されたサブルーチンごとの回数であり、又は前記コンテンツの実行中に各サブルーチンが呼び出された際のスタックフレームの数を所定の値から減じた値である請求項３又は４に記載の情報処理装置。
【請求項６】
前記優先度は、前記コンテンツに含まれる各サブルーチンの第１コードを第２コードへ変換するのに要する時間に基づいて、又は前記コンテンツの実行中に各サブルーチンが呼び出される頻度に基づいて、各サブルーチンの第１コード内に予め記述された値である請求項３又は４に記載の情報処理装置。
【請求項７】
前記プリコンパイル制御手段は、前記プリコンパイル回路の動作速度を下げたとき、該プリコンパイル回路への供給電圧を、その動作を維持できる電圧値の範囲内で下げる請求項４乃至６のいずれかに記載の情報処理装置。
【請求項８】
前記プリコンパイル制御手段は、バス内のデータ伝送量又はプロセッサによる前記メモリへのアクセス頻度を監視し、前記データ伝送量又は前記アクセス頻度が所定の基準を超えている間、前記プリコンパイル回路の動作を停止する請求項４乃至７のいずれかに記載の情報処理装置。
【請求項９】
前記サブルーチン管理手段は、前記第３の実行制御によりサブルーチンの第１コードが第２コードに変換されたとき、該第２コードのコード情報格納部に変換元となる第１コードの先頭アドレスが記述されるように前記記録制御を行い、前記第２の実行制御の対象となる第２コードの変換元の第１コードのサイズが所定の値より大きいときは、その第２コードが前記仮想マシンのＪＩＴコンパイル機能でネイティブコードに変換されて前記メモリに格納されるとともに、その第２コードのコード情報格納部に記述されている変換元の第１コードの先頭アドレスに基づいて、該第１コードが別スレッドで前記インタプリタ機能によって実行されるように前記第２の実行制御を行う請求項１乃至８のいずれかに記載の情報処理装置。
【請求項１０】
さらに、前記コード情報格納部の内容を記憶するキャッシュメモリを備え、
前記サブルーチン管理手段は、前記コード情報格納部に替えて、前記キャッシュメモリに記憶されている情報に基づいて前記第１乃至第３の実行制御を行うとともに、前記キャッシュメモリに対して前記記録制御を行う請求項１乃至９のいずれかに記載の情報処理装置。
【請求項１１】
前記サブルーチン管理手段は、前記記録制御として、前記優先度が前記キャッシュメモリに記憶されるように制御を行い、
前記プリコンパイル制御手段は、前記キャッシュメモリに記憶されている優先度を用いて、前記動作速度定義表から動作速度を判断する
請求項１０に記載の情報処理装置。
【請求項１２】
前記第１コードは、スタックマシン用のコードであり、
前記第２コードは、前記第１コードから生成されるレジスタマシン用のコードを含む
請求項１乃至１１のいずれかに記載の情報処理装置。
【請求項１３】
前記第２コードは、前記サブルーチンの実行過程で呼び出される他のサブルーチンの第１コードを、呼び出し元のサブルーチンの第１コード内にインライン展開して成るコードを含む請求項１乃至１２のいずれかに記載の情報処理装置。
【請求項１４】
前記サブルーチン管理手段は、前記コンテンツの実行中にサブルーチンのネイティブコードが呼び出された場合、その呼び出し元のサブルーチンのコードに記述されているジャンプ先アドレスを表す特殊アドレスを、該ネイティブコードの先頭アドレスに置き換える請求項１乃至１３のいずれかに記載の情報処理装置。
【請求項１５】
前記ＪＩＴコンパイル機能は、前記第２コードの実行過程で呼び出される他のサブルーチンの第１コード、第２コード、又はネイティブコードを、呼び出し元の第２コード内にインライン展開し、これをネイティブコードへ変換する請求項１乃至１４のいずれかに記載の情報処理装置。
【請求項１６】
前記メモリは、前記サブルーチンごとに複数のコンテンツとの対応関係を表すサブルーチン共用表を記憶し、
前記サブルーチン管理手段は、前記優先度に替えて、前記サブルーチン共用表に基づいて、対応するコンテンツの数が多いサブルーチンから順に、その第１コードが第２コードに変換されるように前記第３の実行制御を行う
請求項３乃至１５のいずれかに記載の情報処理装置。
【請求項１７】
前記サブルーチン管理手段は、前記優先度に替えて、前記コンテンツの実行中に呼び出されたサブルーチンのうち最後に呼び出されたサブルーチンから順に、その第１コードが第２コードに変換されるように前記第３の実行制御を行う請求項３乃至１５のいずれかに記載の情報処理装置。
【請求項１８】
前記コンテンツに対応する表示物を表示するディスプレイを備え、
前記サブルーチン管理手段は、前記優先度に替えて、前記ディスプレイ上で、中央の表示物、最前面の表示物、又は最も大きい表示物に対応するコンテンツに含まれるサブルーチンの第１コードから優先的に第２コードが生成されるように前記第３の実行制御を行う
請求項３乃至１５のいずれかに記載の情報処理装置。
【請求項１９】
前記ディスプレイ上に表示される矢印等の指示部を移動させ、及び前記表示物を前記指示部によって選択するための操作部をさらに備え、
前記サブルーチン管理手段は、前記ディスプレイ上で、前記指示部と重っている表示物又は前記指示部によって選択された表示物に対応するコンテンツに含まれるサブルーチンの第１コードから優先的に第２コードが生成されるように前記第３の実行制御を行う
請求項１８に記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、携帯電話、カーナビゲーション装置、及びテレビ受像機等の情報処理装置内で動作するＪＩＴコンパイラを備えた仮想マシンに関する。
【背景技術】
【０００２】
近年、ユーザの要望するコンテンツは、ダウンロード可能なアプリケーションとして又はそのまま利用できるＷｅｂアプリケーションとして、ホームページ上で提供されることが多い。これらのコンテンツには、文書編集ソフト、表計算ソフト、及びメール送受信ソフト等のコンピュータプログラムだけでなく、ゲーム、小説、動画、アニメーション等のソフトウェアも含まれる。
【０００３】
しかしながら、このアプリケーション及びそれを表示するブラウザは、主に閲覧を目的として作られているため、画面デザイン、操作性、応答性の面において、Windows（登録商標）等のデスクトップアプリケーションに劣っていた。そこで、これらの課題を改善するため、JavaScript（登録商標。非特許文献１参照）、Ajax（非特許文献２参照）などの技術を用いて、既存のデスクトップアプリケーションと同等な性能を持つRich Internet Application（ＲＩＡ、非特許文献３参照）と呼ばれるＷｅｂアプリケーションが開発されている。
【０００４】
また、高度なアニメーションや動画を表示させることができるメディアプレイヤーと呼ばれるアプリケーション実行環境が、ブラウザのプラグインとして、又は単体のアプリケーションとして開発されている（非特許文献４参照）。このメディアプレイヤーを用いることによっても、既存のデスクトップアプリケーションと同等なアプリケーション実行環境を実現することができる。
【０００５】
これらのブラウザ及びメディアプレイヤーは、ＣＰＵを内蔵し、ソフトウェアに制御されて動作するパーソナルコンピュータ（ＰＣ）以外の機器、いわゆる組込み機器においても広く用いられている。組込み機器としては、例えば、携帯電話機、その他の携帯情報機器、カーナビゲーション装置、家庭用電話機、携帯ゲーム機、家庭用ゲーム機、ＨＤＤレコーダ等の個人用機器、及びカラオケ機器、ロボット、鉄道等の輸送機器、ロケット、プラント制御装置等の業務用機器がある。
【０００６】
上記ブラウザ及びメディアプレイヤーは、HTML、XML、Java（登録商標）、JavaScript等の標準的な技術を採用していることから、コンテンツの作成時には、ＯＳ等のアーキテクチャの違いを意識する必要がない。従って、一度開発されたコンテンツは、任意の端末で変更せずに動作させることが原理的には可能となり、開発負担の大幅な軽減及び互換性の向上を実現している。
【０００７】
上記コンテンツを組込み機器向けに開発する際には、ＰＣ向けの場合とは異なり、ＣＰＵの処理速度、メモリの容量、画像表示能力等の面において、ＰＣと比較してリソースが厳しく制限される点を考慮しなければならない。特に、ＲＩＡの開発においては、JavaScript等のスクリプト言語やJavaで動作を記述することが多い。しかし、スクリプト言語は、C++などと比較して、記述量が少ないため、開発効率は良いという利点がある一方で、同一環境での実行速度が数倍遅いという問題がある。実行速度が遅いという問題については、Javaで記述されたプログラム（Javaプログラム）にも共通する。
【０００８】
この問題の一因としては、スクリプト言語で記述されたコードを含むプログラム及びJavaプログラムが、組込み機器等の情報処理装置のＯＳが直接実行できるネイティブコードとは異なる形式で配布されることが挙げられる。これらのプログラムのコードは、ＯＳやハードウェア等のアーキテクチャに依存しないバイナリ形式のJavaバイトコードと呼ばれる中間コードに一旦コンパイルされ、この中間コードの状態で配布される。
【０００９】
すなわち、中間コードの形式のプログラムは、インタプリタ方式又はJust-In-Timeコンパイル（ＪＩＴコンパイル）方式で実行される。具体的には、インタプリタ方式の場合、例えばソフトウェアで構成したインタプリタが、中間コードをネイティブコードに逐次変換し（例えば、コード単位で変換し）ながら実行する。ＪＩＴコンパイル方式の場合、例えばソフトウェアで構成したＪＩＴコンパイラが、中間コードをネイティブコードに一旦変換し（例えば、サブルーチン単位で変換し）てから実行する。
【００１０】
更に詳細には、インタプリタ方式とＪＩＴコンパイル方式のいずれにおいても、生成されたネイティブコードは、実際にはＣＰＵによって実行される。ＰＣ等の多くの情報処理装置には、このインタプリタとＪＩＴコンパイラを備えた仮想マシンが搭載されている。JavaScriptの場合、ブラウザに搭載されたスクリプトエンジンがスクリプトを解釈し、インタプリタ形式で実行する態様が多い。いずれにしても、ネイティブコードへコンパイル済みの状態で配布されるプログラムと比較すれば、インタプリタ形式で実行する場合には処理完了までの時間が長くなり、ＪＩＴコンパイルで実行する場合にはコンパイル完了までのオーバーヘッドが発生するため、実行速度が遅くなる。今後、Java（登録商標）やスクリプト言語を用いたコンテンツの開発が大規模化してくると、この問題の解決が重要になる。
【００１１】
また、中間コード及びネイティブコードの両形式が混在するプログラムを実行する際の注意点として、ＣＰＵが中間コードへ直接ジャンプすることにより暴走等のエラーが生ずるおそれがあることが挙げられる。かかるプログラムを実行する情報処理装置は、ＣＰＵから呼び出されたサブルーチンのネイティブコードが存在するのかどうかを判断するための機能を備えている。そして、呼び出されたサブルーチンを実行する際には、先ず上記の判断を行い、ネイティブコードが存在すれば、そのネイティブコードの先頭アドレスをＣＰＵに送り、ネイティブコードが存在しなければ、仮想マシンで実行すべき中間コードの先頭アドレスをＣＰＵに送る。その後、ＣＰＵが直接実行するか又は仮想マシンによって実行される。従って、上記判断に長時間を要すると、前述の実行速度の問題が大きくなる。以下、これらの問題の解決に貢献し得る従来技術の例を示す。
【００１２】
（１）特許文献１［特開２００６−２０２３１７号公報］
特許文献１には、バイトコードとネイティブコードがメモリ上に混在する場合において、コンパイルされているか否か及びネイティブコードの格納アドレスの検索を容易にすることにより、処理の高速化を図る技術が開示されている。具体的には、バイトコードがコンパイルされているか否かを判断するための情報と、コンパイルされたネイティブコードのアドレスを検索する検索テーブルをメモリ上に備えておき、バイトコードの実行時に、この検索テーブルを検索することにより、コンパイルの要否の判断やネイティブコードの格納アドレスの検索を容易（高速）に行うという技術である。
【００１３】
（２）特許文献２［特許第３８１６９６１号公報］
特許文献２には、バーチャルマシン命令（中間コードと思われる）をネイティブ命令のシーケンスに変換するため、例えばネイティブ命令がフルコードによって表わされた翻訳テーブルと、各バーチャルマシン命令について翻訳テーブルに対応するシーケンスの始点を示すコードインデックステーブルとを備えたデータ処理装置が開示されている。これらのテーブルは、例えば、メモリとプロセッサコアとの間に位置するプリプロセッサ内のコンバータに備えられるようである。この装置においては、コンバータは、バーチャルマシン命令を受けると、そのバーチャルマシン命令を用いて、コードインデックステーブル内でネイティブ命令のシーケンスの始点（アドレス）を検索する。そして、コンバータは、そのアドレスにアクセスしてネイティブ命令を読み出してプロセッサコアへ供給する。
【非特許文献１】“Introduction to JavaScript”、[online]、Refsnes Data、[2008年2月7日検索]、インターネット<URL：http://www.w3schools.com/js/js#intro.asp>
【非特許文献２】“Ajax(programming)”、[online]、2008年2月6日、Wikipedia、[2008年2月7日検索]、インターネット<URL：http://en.wikipedia.org/wiki/AJAX>
【非特許文献３】“Rich Internet application”、[online]、2008年2月3日、Wikipedia、[2008年2月7日検索]、インターネット<URL：http://en.wikipedia.org/wiki/Rich#Internet#application>
【非特許文献４】“Java processor”、[online]、2008年1月22日、Wikipedia、[2008年2月7日検索]、インターネット<URL：http://en.wikipedia.org/wiki/Java#processor>
【特許文献１】特開２００６−２０２３１７号公報
【特許文献２】特許第３８１６９６１号公報
【発明の開示】
【発明が解決しようとする課題】
【００１４】
しかしながら、（１）の技術には、ＪＩＴコンパイル時のオーバーヘッドが解消されていないうえに、検索テーブルの検索時にＣＰＵによるメモリへのアクセスが頻発することにより、実行速度が低下するという問題がある。
【００１５】
また、（２）の技術においても、バーチャルマシン命令を受けたコンバータがコードインデックステーブル内を検索する必要があり、その検索時間が処理のオーバーヘッドとなる。さらに、同技術では、バーチャル命令（中間コード）に対応するネイティブ命令を、プリプロセッサに設けた翻訳テーブル内に予め格納するため、大容量の記憶媒体をメインメモリのほかに設ける必要があり、コストや消費電力の面から見て現実的ではない。
【００１６】
そこで、本発明は、コンテンツの実行速度を向上させる情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【００１７】
本発明は、コンテンツを構成するサブルーチンのコンパイル状況を簡易な方法で判断可能とすることにより、コンテンツの実行速度を向上させる。
【００１８】
上記の課題を解決するため、本発明の情報処理装置は、コンテンツに含まれる複数のサブルーチンごとに、プロセッサで実行可能なネイティブコード、前記ネイティブコードの元となるＯＳに依存しない第１コード、及び前記第１コードを前記ネイティブコードへ変換する過程で生成される第２コードのうち、少なくともいずれか１種類のコードを記憶するメモリであって、前記コードは、該当する種類を表すコードタイプが記述されたコード情報格納部を有するとともに、他のサブルーチンへのジャンプ先アドレスとして特殊アドレスが記述されており、前記特殊アドレスは、特殊アドレス識別子と前記他のサブルーチンの先頭アドレスを含む、メモリと、前記第１コードをインタプリタ方式で実行するインタプリタ機能、及び前記第２コードをネイティブコードへ変換してから実行するＪＩＴコンパイル機能を備えた仮想マシンと、前記ネイティブコードを実行するプロセッサと、前記第１コードから前記第２コードを生成するプリコンパイル回路と、前記コンテンツの実行中に前記プロセッサがアクセスしたアドレスに前記特殊アドレス識別子が含まれている場合に前記特殊アドレスであると判断し、前記メモリ上に当該他のサブルーチンのコードとして、ネイティブコードが記憶されていれば、該ネイティブコードが前記プロセッサで実行されるように第１の実行制御を行い、ネイティブコードが記憶されておらず第２コードが記憶されていれば、該第２コードが前記仮想マシンのＪＩＴコンパイル機能で実行され、生成されたネイティブコードが前記メモリに格納されるように第２の実行制御を行い、第１コードだけが記憶されていれば、該第１コードが前記仮想マシンのインタプリタ機能で実行されるとともに、前記プリコンパイル回路で第２コードに変換され、該第２コードが前記メモリに格納されるように第３の実行制御を行うサブルーチン管理手段とを備え、前記サブルーチン管理手段は、前記コード情報格納部に記述されているコードタイプを利用して前記第１乃至第３の実行制御を切り替えることを特徴とする。
【００１９】
本発明の実施形態では、前記サブルーチン管理手段は、前記第１又は第２の実行制御によりサブルーチンのコードが変換されたときは、該コードのコード情報格納部に変換後のコードの先頭アドレスが記述されるように記録制御を行い、前記コンテンツの実行中に前記プロセッサがアクセスしたアドレスに前記特殊アドレス識別子が含まれている場合に前記特殊アドレスであると判断し、当該他のサブルーチンのコードのコード情報格納部を検査し、第１コードを表すコードタイプが記述されており、且つ第２コードの先頭アドレスが記述されていないときは、前記第３の実行制御を行い、第１コードを表すコードタイプが記述されており、且つ第２コードの先頭アドレスが記述されており、且つ該先頭アドレスで特定される第２コードのコード情報格納部にネイティブコードの先頭アドレスが記述されていないとき、又は第２コードを表すコードタイプが記述されており、且つネイティブコードの先頭アドレスが記述されていないときは、前記第２の実行制御を行い、第１コードを表すコードタイプが記述されており、且つ第２コードの先頭アドレスが記述されており、且つ該先頭アドレスで特定される第２コードのコード情報格納部にネイティブコードの先頭アドレスが記述されているとき、又は第２コードを表すコードタイプが記述されており、且つネイティブコードの先頭アドレスが記述されているときは、前記第１の実行制御を行うように構成することができる。
【００２０】
別の実施形態では、前記サブルーチン管理手段は、前記第３の実行制御を行う際、前記サブルーチンごとに定められる前記第１コードを前記第２コードへ変換する優先度に基づいて、前記プリコンパイル回路を制御する構成を採用することができる。この場合において、前記メモリは、前記優先度に応じて、前記プリコンパイル回路の動作速度を定めた動作速度定義表を記憶し、さらに、前記プリコンパイル回路で処理される第１コードに対応するサブルーチンの優先度を用いて、前記動作速度定義表から動作速度を判断し、該動作速度に従って前記プリコンパイル回路が動作するように制御を行うプリコンパイル制御手段を備えた構成を採用することができる。
【００２１】
また、上記優先度としては、前記コンテンツの実行中に呼び出されたサブルーチンごとの回数であり、又は前記コンテンツの実行中に各サブルーチンが呼び出された際のスタックフレームの数を所定の値から減じた値を採用することができる。
【００２２】
或いは、上記優先度としては、前記コンテンツに含まれる各サブルーチンの第１コードを第２コードへ変換するのに要する時間に基づいて、又は前記コンテンツの実行中に各サブルーチンが呼び出される頻度に基づいて、各サブルーチンの第１コード内に予め記述された値を採用することもできる。
【００２３】
本発明の実施形態では、前記プリコンパイル制御手段は、前記プリコンパイル回路の動作速度を下げたとき、該プリコンパイル回路への供給電圧を、その動作を維持できる電圧値の範囲内で下げるように構成することができる。
【００２４】
別の実施形態では、前記プリコンパイル制御手段は、バス内のデータ伝送量又はプロセッサによる前記メモリへのアクセス頻度を監視し、前記データ伝送量又は前記アクセス頻度が所定の基準を超えている間、前記プリコンパイル回路の動作を停止するように構成することができる。
【００２５】
また別の実施形態では、前記サブルーチン管理手段は、前記第３の実行制御によりサブルーチンの第１コードが第２コードに変換されたとき、該第２コードのコード情報格納部に変換元となる第１コードの先頭アドレスが記述されるように前記記録制御を行い、前記第２の実行制御の対象となる第２コードの変換元の第１コードのサイズが所定の値より大きいときは、その第２コードが前記仮想マシンのＪＩＴコンパイル機能でネイティブコードに変換されて前記メモリに格納されるとともに、その第２コードのコード情報格納部に記述されている変換元の第１コードの先頭アドレスに基づいて、該第１コードが別スレッドで前記インタプリタ機能によって実行されるように前記第２の実行制御を行う構成を採用することができる。
【００２６】
さらにまた別の実施形態として、前記コード情報格納部の内容を記憶するキャッシュメモリを備え、前記サブルーチン管理手段は、前記コード情報格納部に替えて、前記キャッシュメモリに記憶されている情報に基づいて前記第１乃至第３の実行制御を行うとともに、前記キャッシュメモリに対して前記記録制御を行う構成を採用することができる。
【００２７】
前記第１コードは、スタックマシン用のコードであり、前記第２コードは、前記第１コードから生成されるレジスタマシン用のコードを含むことができる。また、前記第２コードは、前記サブルーチンの実行過程で呼び出される他のサブルーチンの第１コードを、呼び出し元のサブルーチンの第１コード内にインライン展開して成るコードを含むことができる。
【００２８】
本発明の実施形態として、前記サブルーチン管理手段は、前記コンテンツの実行中にサブルーチンのネイティブコードが呼び出された場合、その呼び出し元のサブルーチンのコードに記述されているジャンプ先アドレスを表す特殊アドレスを、該ネイティブコードの先頭アドレスに置き換える構成を採用することができる。
【００２９】
別の実施形態では、前記ＪＩＴコンパイル機能は、前記第２コードの実行過程で呼び出される他のサブルーチンの第１コード、第２コード、又はネイティブコードを、呼び出し元の第２コード内にインライン展開し、これをネイティブコードへ変換する構成を採用することができる。
【００３０】
また別の実施形態としては、前記メモリは、前記サブルーチンごとに複数のコンテンツとの対応関係を表すサブルーチン共用表を記憶し、前記サブルーチン管理手段は、前記優先度に替えて、前記サブルーチン共用表に基づいて、対応するコンテンツの数が多いサブルーチンから順に、その第１コードが第２コードに変換されるように前記第３の実行制御を行う構成を採用することができる。
【００３１】
さらに別の実施形態では、前記サブルーチン管理手段は、前記優先度に替えて、前記コンテンツの実行中に呼び出されたサブルーチンのうち最後に呼び出されたサブルーチンから順に、その第１コードが第２コードに変換されるように前記第３の実行制御を行う構成を採用することができる。
【００３２】
またさらに別の実施形態では、前記コンテンツに対応する表示物を表示するディスプレイを備え、前記サブルーチン管理手段は、前記優先度に替えて、前記ディスプレイ上で、中央の表示物、最前面の表示物、又は最も大きい表示物に対応するコンテンツに含まれるサブルーチンの第１コードから優先的に第２コードが生成されるように前記第３の実行制御を行う構成を採用することができる。この場合、前記ディスプレイ上に表示される矢印等の指示部を移動させ、及び前記表示物を前記指示部によって選択するための操作部をさらに備え、前記サブルーチン管理手段は、前記ディスプレイ上で、前記指示部と重っている表示物又は前記指示部によって選択された表示物に対応するコンテンツに含まれるサブルーチンの第１コードから優先的に第２コードが生成されるように前記第３の実行制御を行う構成を採用することができる。
【００３３】
上記態様によれば、コンテンツを構成するサブルーチンのコンパイル状況を簡易な方法で判断することが可能となるため、コンテンツの実行速度が格段に向上する。
【００３４】
具体的には、各サブルーチンのコード内に、他のサブルーチンへのジャンプ先アドレスとしての当該他のサブルーチンの先頭アドレスを含む特殊アドレスと、該当するコードの種類を表すコードタイプを記述しておく。プロセッサがその特殊アドレスにアクセスすると、サブルーチンの呼び出しが発生したことをサブルーチン管理手段が検出し、メモリ内を検索することなく、特殊アドレスに含まれる先頭アドレスで特定されるコードのコード情報格納部に記述されたコードタイプに基づいて、そのコードの種類に応じた処理が行われるように制御される。従って、コンパイル状況の確認及び処理方法の判断のためのメモリ内の検索が不要となり、コンテンツの実行速度を格段に向上することができる。
【発明の効果】
【００３５】
本発明によれば、コンテンツの実行速度を格段に向上することができる。
【発明を実施するための最良の形態】
【００３６】
以下、本発明の実施例において、複数のサブルーチンを含んで構成されるコンテンツとして、Javaプログラムを携帯電話機で実行する方法を説明する。その説明において、音声通話機能、メール送受信機能、スケジュール管理機能、及び撮像機能など、携帯電話機が通常備える機能については、図示及び説明を省略する。また、一般に、オブジェクト指向プログラミングでは、サブルーチンに相当するプログラムをメソッドと呼ぶことがあるが、ここではプログラミングの指向性にかかわらず、いずれもサブルーチンと呼ぶこととする。
［実施例１］
【００３７】
図１は、本発明を適用した携帯電話機１０１の基本構成を示す。
携帯電話機１０１は、バス１０３を解して互いに接続された各種のハードウェア１０５、並びにこれを制御するプログラム及び携帯電話機１０１で実行される複数のコンテンツ１０７等の各種のソフトウェア１０９を含んで構成される。
【００３８】
具体的には、携帯電話機１０１は、
ユーザによる操作の受け付け、画面表示、通信、及び入出力等の機能を有する周辺機能部１１１と、
ソフトウェア１０９に含まれる再生アプリ１２５等の各種のプログラムを実行するプロセッサ１１３と、
携帯電話機１０１の電源遮断中においても、ソフトウェア１０９の一部又は全部のデータを記録する不揮発性記録媒体１１５と、
起動中のソフトウェア１０９に関するデータを格納するメモリ１１７と、
スクリプト及びJavaプログラムを構成する、プロセッサ１１３で実行可能なネイティブコード１３１の元となるＯＳに依存しないバイトコード（以下「第１コード」という。）１１９を、ネイティブコード１３１に変換する過程で生成されるコード（以下「第２コード」という。）１２１に変換したり、コンテンツ１０７の実行中に呼び出されたサブルーチンのコードの種類（第１コード１１９、第２コード１２１、ネイティブコード１３１）に基づいて、後述のインタプリタ１５７やＪＩＴコンパイラ１５９で実行することをプロセッサ１１３に依頼するなど、各種の処理を行う実行コード処理部１２３と
を含んで構成される。
【００３９】
周辺機能部１１１としては、例えば、操作ボタン、タッチパネル、ディスプレイ、マイク、スピーカー、及びネットワーク接続手段を採用することができる。
【００４０】
不揮発性記録媒体１１５としては、例えば、フラッシュメモリ、ハードディスク読取装置（HDD）、Magnetoresistive Random Access Memory（MRAM）、Ferroelectric Random Access Memory（FeRAM）等の記録媒体を採用することができる。メモリ１１７としては、Static Random Access Memory（SRAM）、Dynamic Random Access Memory（DRAM）、MRAM等の記録媒体を採用することができる。これらのハードウェアは、製造時点における価格、記憶容量、消費電力、読み書きの速度等の条件を考慮して選ぶのがよい。
【００４１】
携帯電話機１０１は、ハードウェア１０５を制御するプログラム及び携帯電話機１０１で実行されるスクリプト及びJavaプログラム等のソフトウェア１０９をメモリ１１７上に持つ。具体的には、ソフトウェア１０９には、Javaプログラム等のコンテンツ１０７（後述の第１コード１１９を含む。）、再生アプリ１２５、及びＯＳ１２７、並びにコンテンツ１０７の実行時等に適時参照される三種類の表として、コンテンツ管理表２０１、サブルーチン管理表２０３、及び動作速度定義表３０１が含まれる。
【００４２】
プロセッサ１１３は、サブルーチン管理プログラム１３３を実行することで、後述のサブルーチン管理回路１７１を制御し、サブルーチン管理回路１７１とともにサブルーチン管理手段を構成する。プロセッサ１１３は、また、プリコンパイル制御プログラム１３５を実行することで、後述のプリコンパイル制御回路１７５を制御し、プリコンパイル制御回路１７５とともにサブルーチン制御手段を構成する。
【００４３】
コンテンツ１０７は、Javaプログラムを実行するのに必要なプログラム及びデータとして、例えば、第１コード１１９、第２コード、ネイティブコード１３１、各種バイナリデータ１４１、及びテキストデータ１４３により構成される。本実施例では、コンテンツ１０７を構成するサブルーチンの第１コード１１９、第２コード、及びネイティブコード１３１のことをまとめて実行コード１４５という。コンテンツ１０７の種類としては、ゲーム、動画、アニメーション等のほかにも、文書編集ソフトや表計算ソフトといった一般にアプリケーションと呼ばれるプログラムも含まれる。
【００４４】
第１コード１１９は、コンテンツ１０７を実行する携帯電話機１０１のアーキテクチャ（例えば、ＯＳ）に依存しない形式のプログラムコードであり、複数のサブルーチンで構成される。なお、本実施例でいうサブルーチンには、メインルーチンが含まれる。スクリプト及びJavaプログラムの第１コード１１９は、携帯電話機１０１のプロセッサ１１３が実行できる形式のネイティブコード１３１ではなく、アーキテクチャに依存しない形式にコンパイルされているため、実行時には、携帯電話機１０１のプロセッサ１１３に対応する形式のネイティブコード１３１に再度コンパイルする必要がある。
【００４５】
各種バイナリデータ１４１は、動画、静止画、音声、ベクトル、３Ｄ描画データ、各種設定データ、及び文字列から構成される。テキストデータ１４３は、文字列形式のデータであり、例えばＸＭＬ等の言語を用いれば、テキストデータを直接組み込んだ状態で、各種データを表現することができる。
【００４６】
再生アプリ１２５は、コンテンツ１０７を実行するブラウザや各種メディアプレイヤー等のプログラムである。この再生アプリ１２５は、コンテンツ１０７に含まれる動画、音声、静止画などのデータを再生する各種データ再生部１５１と、第１コード１１９及び第２コード１２１を実行するコード実行部（仮想マシン）１５３、そしてこれらの機能がＯＳ１２７及びハードウェア１０５にアクセスする際に利用するドライバＩ／Ｆ１５５を含んで構成される。
【００４７】
コード実行部（仮想マシン）１５３は、インタプリタ１５７及びＪＩＴコンパイラ１５９で構成され、後述する条件に応じていずれか又は両方を起動するとともに、必要に応じて実行コード処理部１２３にアクセスする。
【００４８】
インタプリタ１５７は、コンテンツ１０７の実行中に呼び出されたサブルーチンについて、その第１コード１１９を解析してネイティブコード１３１へ変換しながらプロセッサ１１３に順次実行させる処理を、例えば、コード単位で逐次実行するプログラムである。
【００４９】
ＪＩＴコンパイラ１５９は、コンテンツ１０７の実行中に呼び出されたサブルーチンについて、その第２コードをネイティブコードへ一旦変換してから、そのネイティブコード１３１をＣＰＵに実行させる処理を、例えば、サブルーチン単位又はループ処理単位で実行するプログラムである。また、ＪＩＴコンパイラ１５９は、第２コード１２１をネイティブコード１３１に変換するためだけに動作し、ネイティブコード１３１を実行しないこともできる。例えば、本実施例では、コンテンツ１０７の実行中にサブルーチンの第２コード１２１が呼び出された場合において、その第２コード１２１の変換元となる第１コード１１９のサイズが予め決めておいた所定の値より大きいときは、第２コード１２１の処理とは別に、その第１コード１１９が別スレッドでインタプリタ１５７によって実行される。この場合、インタプリタ１５７による実行が優先され、ＪＩＴコンパイラ１５９は、第２コード１２１からネイティブコード１３１を生成するために動作し、生成したネイティブコード１３１の実行は行わないものとする。
【００５０】
ドライバＩ／Ｆ１５５は、コード実行用Ｉ／Ｆ１６１及びデータ再生用Ｉ／Ｆ１６３で構成されている。コード実行用Ｉ／Ｆ１６１は、ハードウェア１０５の実行コード処理部１２３へアクセスするために利用される。データ再生用Ｉ／Ｆ１６３は、各種データ再生部１５１がコンテンツデータを再生する際に各種ハードウェア１０５へアクセスするために利用される。
【００５１】
ＯＳ１２７は、携帯電話機１０１等の組込み機器向けの基本ソフトウェアである。ＯＳ１２７の例としては、Linux、WindowsEmbedded、Symbian等のソフトウェアが挙げられる。また、ＯＳ１２７は、再生アプリ１２５がハードウェア１０５にアクセスするために必要なドライバ１６５を搭載している。
【００５２】
ドライバ１６５は、コード実行用ドライバ１６７及びデータ再生用ドライバ１６９で構成される。コード実行用ドライバ１６７は、コンテンツ１０７の実行時に再生アプリ１２５がハードウェア１０５へアクセスするための機能を提供する。データ再生用ドライバ１６９は、コンテンツ１０７の実行以外のデータ処理時に、再生アプリ１２５がハードウェア１０５へアクセスするための機能を提供する。
【００５３】
コード実行部１５３のインタプリタ１５７及びＪＩＴコンパイラ１５９は、必要に応じて、コード実行用Ｉ／Ｆ１６１を介してコード実行用ドライバ１６７へアクセスし、各種ハードウェア１０５を呼び出すことができる。その際、必要なハードウェア１０５が存在しなければ、ソフトウェアエミュレータを起動し、必要な機能を再現させることができる。従って、ハードウェア１０５では実現されない他のハードウェアの機能が必要になる場合は、ソフトウェア１０９として、ソフトウェアエミュレータを備えておくのがよい。
【００５４】
コンテンツ管理表２０１は、各コンテンツ１０７のＩＤとコンテンツ名を管理する。サブルーチン管理表２０３は、コンテンツ１０７を構成する各サブルーチンについて、コードサイズや配布元（ダウンロード元のサーバＵＲＬなど）等の情報を管理する。動作速度定義表３０１は、実行コード処理部１２３による第１コード１１９から第２コード１２１への変換処理（プリコンパイル）の制御方法を定める。これらの表の詳細については後述する。
【００５５】
ソフトウェア１０９には、これらのほかにも、後述する、実行コード処理部１２３の処理により生成される第２コード１２１、及び仮想マシン１２９の処理により生成されるネイティブコード１３１が含まれる。さらに、ソフトウェア１０９は、サブルーチンのコードの種類（第１コード１１９、第２コード１２１、ネイティブコード１３１）に応じた処理の命令や各サブルーチンのコード内にある別のサブルーチンへのジャンプ先アドレスを後述の特殊アドレスに書き換える処理の命令等の各種命令が組み合わされたサブルーチン管理プログラム１３３と、第１コード１１９から第２コード１２１を生成する後述のプリコンパイル回路１７３の制御命令等の各種命令が組み合わされたプリコンパイル制御プログラム１３５とを含む。
【００５６】
実行コード処理部１２３は、
サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもと、コンテンツ１０７を構成する各サブルーチンについて、各実行コード１４５の情報を管理するコード情報格納部としての後述のヘッダ部２５０（図２）から、第１コード、第２コード、及びネイティブコード１３１のうち該当するコードの種類、及びコンテンツ１０７の実行中に呼び出された回数等の情報をキャッシュして管理するとともに、サブルーチンの実行コード１４５の種類に応じた処理が実行されるように制御を行うサブルーチン管理手段を構成するサブルーチン管理回路１７１と、
第１コード１１９を第２コード１２１へ変換するプリコンパイル回路１７３と、
プリコンパイル制御プログラム１３５を実行するプロセッサ１１３の制御のもと、プリコンパイル回路１７３の動作を制御するプリコンパイル制御手段を構成するプリコンパイル制御回路１７５と
を含んで構成される。
【００５７】
サブルーチン管理回路１７１は、上記の情報を格納し、その内容を高速に検索するための記憶装置としてキャッシュメモリ（例えば、連想メモリ）１７７を備えている。本実施例では、キャッシュメモリ１７７上に格納される上記の情報をヘッダキャッシュと呼ぶ。各サブルーチンのコード内のヘッダ部２５０とヘッダキャッシュとの間では、所定のタイミングで、内容の書き換え又は入れ替えが行われる。これにより、ヘッダキャッシュには、少なくともメモリ１１７上に格納される各サブルーチンの実行コード１４５のヘッダ部２５０の情報の一部若しくは全部が格納される。ヘッダキャッシュの内容については後述する。
【００５８】
プリコンパイル回路１７３は、第１コード１１９をネイティブコード１３１にコンパイルする際に生成される第２コード１２１を得るための手段である。プリコンパイル回路１７３による処理（プリコンパイル）により生成される第２コード１２１とは、例えば、以下のとおりである。
【００５９】
（１）スタックマシン用の第１コード１１９から生成されるレジスタマシン用のコード
（２）サブルーチンの実行過程で呼び出される他のサブルーチンの第１コード１１９を、呼び出し元のサブルーチンの第１コード１１９内にインライン展開して成るコード
（３）メモリ１１７上に、第１コード１１９における不要な記述、文法上の瑕疵、又は誤記等の修正を要する記載の修正方法を定めた修正辞書を記憶させておき、その修正辞書に基づいて第１コードを最適化したコード
ただし、上記以外の方法であっても、プリコンパイルの従来の方法があれば、それをプリコンパイル回路１７３によるプリコンパイルに適用することも勿論可能である。
【００６０】
図２は、コンテンツ１０７の実行時におけるメモリ１１７及び不揮発性記録媒体１１５の構成、各サブルーチンの実行コード１４５の構成、並びに特殊アドレスの構成を示す。
【００６１】
メモリ１１７には、コンテンツ１０７、再生アプリ１２５、ＯＳ１２７、コンテンツ管理表２０１、サブルーチン管理表２０３、動作速度定義表３０１、サブルーチン管理プログラム１３３、及びプリコンパイル制御プログラム１３５が格納されており、携帯電話機１０１の動作時に適宜参照され又は実行される。この図では、コンテンツ１０７として、Ａコンテンツ１０７ａ，Ｂコンテンツ１０７ｂ等の複数のコンテンツが格納されている状態を示す。メモリ１１７上のこれらのデータは、携帯電話機１０１の起動時及びコンテンツ１０７の起動時に、不揮発性記録媒体１１５からメモリ１１７上にロードされる。また、コンテンツ１０７を構成する実行コード１４５のうち、第２コード１２１及びネイティブコード１３１は、本実施例では、コンテンツ終了時に削除され、コンテンツ１０７が実行されるたびに生成されるものとするが、メモリ１１７及び不揮発性記録媒体１１５の空き容量が十分にあれば、コンテンツ１０７の実行が終了しても保持されるように構成してもよい。
【００６２】
また、サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもとでサブルーチン管理回路１７１が各サブルーチンの実行コード１４５の処理方法を選択し、第１コード１１９は、インタプリタ１５７によって解釈されながら逐次実行されるとともに、プリコンパイル回路１７３で第２コード１２１に変換されてメモリ１１７に格納される。第２コード１２１についても、サブルーチン管理回路１７１が処理方法を選択し、ＪＩＴコンパイラ１５９によって実行されるとともに、生成されるネイティブコード１３１がメモリ１１７に格納される。
【００６３】
不揮発性記録媒体１１５には、ＯＳイメージファイル４０１、再生アプリ１２５、コンテンツ１０７、サブルーチン管理プログラム１３３、プリコンパイル制御プログラム１３５、及びその他のアプリ／データ４０３等のデータが保存されている。これらのデータは、例えば、携帯電話機１０１の起動時やコンテンツ１０７の起動時等のタイミングで、メモリ１１７上に読み込まれ、携帯電話機１０１の電源遮断時やコンテンツ１０７の実行終了時等のタイミングで、メモリ１１７から変更箇所が書き戻される。
【００６４】
各サブルーチン実行コード１４５は、各実行コードに関する情報を管理するコード情報格納部としてのヘッダ部２５０と、具体的な処理内容が記述されたコード部２５２とから構成される。本実施例では、ヘッダ部２５０は、サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもとでサブルーチン管理回路１７１によって生成される。
【００６５】
ヘッダ部２５０は、コードタイプ２５６、処理ステート２６８、実行中フラグ２７０、終了アドレス２７２、及びチェックサム２７４を含んで構成される。
【００６６】
コードタイプ２５６は、各実行コード１４５のコードの種類、すなわち第１コード１１９、第２コード１２１、及びネイティブコード１３１のうち該当する種類を表すＩＤである。具体的には、図３に示すように、コードタイプ２５６として記述される各ＩＤは以下の意味を表す。
【００６７】
（１）０：第１コード
（２）１：第２コード
（３）２：ネイティブコード
処理ステート２５８は、実行コード１４５が第１コード１１９又は第２コード１２１である場合に、第２コード１２１へのプリコンパイル又はネイティブコード１３１へのコンパイルが行われる条件を表す処理条件２８０、処理条件２８０を満たすかどうかを判断する場合等の所定のタイミングで参照される優先度２８２、プリコンパイル又はコンパイルの処理の状態を表す処理状態フラグ２８４、実行コード１４５が第２コード１２１又はネイティブコード１３１である場合に、変換前の第１コード１１９又第２コード１２１の先頭アドレスを表すオリジナルアドレス２８６、実行コード１４５が第コード１１９又は第２コード１２１である場合に、変換後の第２コード１２１又はネイティブコード１３１の先頭アドレスを表す変換済みコードアドレス２８８を含んで構成される。
【００６８】
処理条件２８０は、コンテンツ１０７の実行中にサブルーチンの第１コード１１９又は第２コード１２１が呼び出された場合において、その第１コード１１９又は第２コード１２１を第２コード１１２又はネイティブコード１３１へそれぞれ変換すべきかどうかを判断するための条件を表す。本実施例では、例えば、図３に示すように、処理条件２８０として記述される各ＩＤは以下の意味を表す。
【００６９】
（１）１：コンテンツ起動時
（２）２：実行時
（３）３：優先度が所定の値を超えている時
（４）４：処理不要
従って、第１コード１１９の処理条件のＩＤが、“１”の場合はコンテンツ起動時にプリコンパイルされ、“２”の場合は実行時すなわち呼び出された時にプリコンパイルされ、“３”の場合は呼び出された際に後述の優先度が所定の値を超えていればプリコンパイルされ、“４”の場合は呼び出されてもプリコンパイルされない。本実施例では、上記優先度として、各実行コード１４５の呼び出された回数（実行回数）を採用し、コンテンツ１０７の実行中に呼び出されたサブルーチンの実行コード１４５の上記ＩＤが“３”の場合、その優先度が所定の値として記述された値（例えば、５０）を超えている時に限り、プリコンパイルされることとする。また、呼び出された実行コード１４５が第２コード１２１の場合も、これと同様に判断され、コンパイルが行われる。なお、上記ＩＤが“３”の場合の条件は適宜変更が可能であり、例えば、メモリ１１７に所定の空き容量がある時などの条件を採用することができる。
【００７０】
優先度２８２は、本実施例では、前述のとおり、各実行コード１４５の実行回数を採用しているが、各実行コード１４５を第２コード１２１又はネイティブコード１３１へ変換する優先度を表し得る他の値を採用することもできる。
【００７１】
処理状態フラグ２８２は、プリコンパイル又はコンパイルの処理の状態を表すＩＤであり、各ＩＤは以下の意味を表す。
【００７２】
（１）０：未変換
（２）１：変換中
（３）２：変換済み
例えば、第２コード１２１については、上記ＩＤが“０”の場合はコンパイル処理が行われておらず、“１”の場合はコンパイル処理の最中であり、“２”の場合はコンパイルが完了してネイティブコード１３１が存在することを表す。
【００７３】
実行中フラグ２８４は、サブルーチンの各実行コード１４５がプロセッサ１１３によって実行されているかどうかを表すＩＤであり、各ＩＤは以下の意味を表す。
【００７４】
（１）０：プロセッサが実行している
（２）１：プロセッサが実行していない
終了アドレス２７２は、各サブルーチンの実行コード１４５の終了アドレスである。チェックサム２７４は、第１コード１１９については、コンテンツ１０７の配布時にコンテンツ提供者から発行される値をそのまま採用してもよいし、後述のコンテンツ転送処理（図７）におけるヘッダ部生成処理（ＳＴ７０５）において、サブルーチン管理回路１７１によって計算されるように構成することができる。第２コード１２１及びネイティブコード１３１のチェックサム２７４の値については、それらのコードが生成されたときに又はコンテンツ１０７の起動時にプロセッサ１１３又はサブルーチン管理回路１７１によって計算されるように構成することができる。
【００７５】
コード部２５２は、第１コード１１９及び第２コード１２１については、コード本体２９０のみで構成され、ネイティブコード１３１については、後述の方法で記述されるジャンプ先アドレス変換命令２９２及びコード本体２９０で構成される。ジャンプ先アドレス変換命令２９２とは、サブルーチンの第１コード１１９の生成時において、サブルーチンの第１コード１１９がプリコンパイル回路１７３で第２コード１２１に変換される過程において、又は第２コード１２１が仮想マシン１５３のＪＩＴコンパイラ１５９でネイティブコード１３１に変換される過程において、その第１コード１１９若しくは第２コード１２１から生成されるネイティブコード１３１がコンテンツ１０７の実行中に呼び出されたときに実行される命令である。具体的には、その呼び出し元のサブルーチンの実行コード１４５に記述されている当該ネイティブコード１３１の特殊アドレスを、そのネイティブコード１３１の先頭アドレスに置き換えるという内容の命令である。この場合、ネイティブコード１３１のコード本体２９０の先頭アドレスに書き換えるのが好ましい。コード本体２９０の先頭アドレスは、ネイティブコード１３１の先頭アドレスに、ヘッダ部２５０及びジャンプ先アドレス変換命令２９２の合計サイズを加算して求めることができる。
【００７６】
本実施例で採用する特殊アドレスは、例えばメモリ１１７上に存在しないエリア（特殊アドレス空間）２９６を指すアドレスである。具体的には、この特殊アドレスは、図２に示すように、サブルーチンの実行コード１４５の先頭アドレスと、当該先頭アドレスで特定されるサブルーチンが実行コード１４５の種類に応じて処理される必要があることを示す文字列としての特殊アドレス識別子とを含んで構成される。本実施例では、特殊アドレスに含まれる特殊アドレス識別子は、特殊アドレス空間２９６がメモリ１１７上の物理アドレスの範囲外のエリアを表すこととなるように、例えば、“Ａ０００００００”等の文字列で構成される。従って、コンテンツ１０７のメモリ１１７上における物理アドレスが“１１１Ｆ”〜“ＦＥＢＦ”の範囲で設定されていれば、特殊アドレス空間２９６は、“Ａ０００００００１１１Ｆ”〜“Ａ０００００００ＦＥＢＦ”の範囲の特殊アドレスで表わされる。
【００７７】
上記特殊アドレスを採用する理由は、次のとおりである。プロセッサ１１３が特殊アドレスにアクセスした場合、すなわちサブルーチン内で他のサブルーチンを呼び出した場合、当該他のサブルーチンのコードは、第１コード１１９や第２コード１２１のように、プロセッサ１１３がそのまま実行することができないものである可能性があるため、そのような実行コード１４５に該当するかどうかを検査する必要があるからである。また、プロセッサ１１３がそのまま実行できない実行コード１４５に該当する場合は、サブルーチンの実行コード１４５の種類に応じた処理が行われるように制御される必要がある。
【００７８】
従来の技術によれば、バイトコードアドレス（本実施例における第１コード１１９の先頭アドレスに相当するアドレス）の一部をインデックスとし、そのバイトコードから生成したネイティブコードの先頭アドレスを記憶するテーブルをメモリ上に用意しておき、バイトコードが呼び出されるたびに、そのテーブル内を検索し、ネイティブコードの有無及びネイティブコードが存在する場合はその先頭アドレスを判断していた。従って、バイトコードの呼び出しのたびに、プロセッサ等のデバイスがメモリにアクセスすることとなり、処理速度が低下していた。
【００７９】
一方、本実施例では、特殊アドレスに含まれる先頭アドレスで特定される実行コード１４５に予めヘッダ部２５０を設け、そのヘッダ部２５０内に、実行コード１４５の種類を表すコードタイプや変換後の実行コード１４５の先頭アドレス等を記述しておく構成を採用している。これにより、サブルーチンから他のサブルーチンが呼び出された場合、メモリ１１７内を検索しなくても、ヘッダ部２５０内を検査するだけで、そのサブルーチンに関し、メモリ１１７上に存在する実行コード１４５の種類及び先頭アドレスを判断することができ、コンテンツ１０７の実行速度が格段に向上する。
【００８０】
図４は、メモリ１１７に格納されるコンテンツ管理表２０１及びサブルーチン管理表２０３と、キャッシュメモリ１７７に格納されるヘッダキャッシュ２０５の構成を示す。以下、これらの表の内容について説明する。
【００８１】
コンテンツ管理表２０１は、コンテンツＩＤ欄２０７及びコンテンツ名欄２０９で構成される各種の項目を有する。コンテンツＩＤ欄２０７には、携帯電話機１０１内に保存されているコンテンツ１０７を識別するコンテンツＩＤが格納される。コンテンツ名欄２０９には、各コンテンツの名前が格納される。コンテンツ管理表２０１は、各コンテンツのＩＤと名前を管理するのに用いられる。
【００８２】
コンテンツＩＤの付与方法としては、例えば、携帯電話機１０１で利用可能なコンテンツダウンロードサービス等の各種サービス内で共通のＩＤを、サービス提供者が一元的に定める方法と、携帯電話機１０１内でのみ通用するＩＤを、携帯電話機１０１が独自に又はサービス提供者が付与する方法がある。後者の場合、例えば、コンテンツ１０７をダウンロードした順に、通し番号を付す方法がある。
【００８３】
サブルーチン管理表２０３は、ハッシュ値管理表２３７、第１コードサイズ管理表２３９、ダウンロード元管理表２４１、サブルーチン共用表２４３の４種類の表を含んで構成される。これらの表は、必要とされる機能に応じて適宜組み合わせて利用される。
【００８４】
ハッシュ値管理表２３７は、サブルーチンＩＤ欄２４５とハッシュ値欄２４７で構成される各種の項目を有する。
【００８５】
サブルーチンＩＤ欄２４５には、コンテンツ１０７に含まれる各サブルーチンを識別するＩＤが格納される。このＩＤの付与方法としては、携帯電話機１０１で利用可能なコンテンツダウンロードサービス等の各種サービス内で共通のＩＤを、サービス提供者が一元的に定める方法と、携帯電話機１０１内でのみ通用するＩＤを、携帯電話機１０１が独自に又はサービス提供者が付与する方法がある。後者の場合、例えば、コンテンツ１０７のダウンロード時に若しくはコンテンツの最初の実行時に、サブルーチンの先頭から通し番号若しくはランダムな番号を付す方法がある。
【００８６】
ハッシュ値欄２４７には、各サブルーチンの第１コードに付与されるハッシュ値が格納される。このハッシュ値の生成方法としては、例えば、それぞれの第１コード１１９全文に基づいてハッシュ関数を用いて生成する方式、又は各第１コードの改変を検出できる最小限の間隔で抽出した１バイトの値に基づいてハッシュ関数を用いて生成する方式が適用可能である。上記改変を検出できる最小限の間隔は、例えば、数バイトから数十バイトの間隔である。このハッシュ値は、コンテンツ１０７を提供するサーバ側で付与してもよいし、携帯電話機１０１内で、上記の方法により付与するように構成してもよい。
【００８７】
第１コードサイズ管理表２３９は、ブルーチンＩＤ欄２５１と第１コードサイズ欄２５３で構成される各種の項目を有する。サブルーチンＩＤ欄２５１には、各サブルーチンのサブルーチンＩＤが格納される。第１コードサイズ欄２５３には、各サブルーチンの第１コードのサイズが格納される。
【００８８】
ダウンロード元管理表２４１は、サーバＵＲＬ欄２５５、サブルーチンＩＤ欄２５７、及びサーバ通知欄２５９で構成される各種の項目を有し、サブルーチンを含むコンテンツ１０７のダウンロード元であるサーバに関する情報を管理する。
【００８９】
サーバＵＲＬ欄２５５には、ダウンロード元であるサーバのＵＲＬが格納される。サブルーチンＩＤ欄２５７には、各サブルーチンのサブルーチンＩＤが格納される。サーバ通知欄２５９には、各サブルーチンが携帯電話機１０１に存在すること（たとえば、ダウンロードが完了したこと）をサーバに通知したか否かを示すフラグが格納される。このフラグが、”ｙｅｓ”の場合は通知済み、”ｎｏ”の場合は未通知であることを示す。
【００９０】
サブルーチン共用表２４３は、サブルーチンＩＤ欄２６１、共用数欄２６３、及び対応コンテンツＩＤ欄２６５で構成される各種の項目を有し、各サブルーチンを共用している複数のコンテンツ１０７を把握するために利用される。
【００９１】
サブルーチンＩＤ欄２６１には、各サブルーチンのサブルーチンＩＤが格納される。共用数欄２６３には、各サブルーチンを利用しているコンテンツの数が格納される。対応コンテンツＩＤ欄２６５には、各サブルーチンを利用するコンテンツのコンテンツＩＤが格納される。
【００９２】
サブルーチン共用表２４３は、コンテンツのダウンロード時及び削除時に、サブルーチン管理回路１７１によって、そのコンテンツに含まれる各サブルーチンが他のコンテンツで利用されているかどうかが判断され、更新される。
【００９３】
ヘッダキャッシュ２０５は、ヘッダ情報欄２６７及びキャッシュアウトカウント欄２８１で構成される各種の項目を有する。ヘッダキャッシュ２０５は、各サブルーチンの実行コード１４５に関する情報を格納する。本実施例では、ヘッダキャッシュ２０５内にある実行コード１４５ごとの情報をエントリという。
【００９４】
ヘッダ情報欄２６７は、サブ項目として、開始アドレス欄２７１、終了アドレス欄２７３、コードタイプ欄２７５、処理ステート欄２７７、実行中フラグ欄２７９、及びチェックサム欄２８０を有する。これらの欄には、コンテンツ１０７の実行開始時に及びコンテンツ１０７の実行中における所定のタイミングで、サブルーチンの実行コード１４５のヘッダ部２５０からデータが転送され、適宜格納される。なお、ヘッダキャッシュ２０５内の各項目には、ヘッダ部２５０（図２）内で同じ項目名が付されている項目のデータが格納される。
【００９５】
また、処理ステート欄２７７に格納されるデータには、コンテンツ１０７のサブルーチンごとに定められる優先度２８２（図２）として、コンテンツ１０７の実行中に呼び出されたサブルーチンの実行コード１４５ごとの回数（実行回数）が含まれており、各実行コード１４５が呼び出されるたびに、該当するエントリの優先度の値がインクリメントされる（“１”が加算される）。本実施例では、原則としてサブルーチンの各実行コード１４５の実行回数を優先度として取り扱う。
【００９６】
ヘッダキャッシュ２０５のキャッシュアウトカウント欄２８１にも、コンテンツ１０７の実行中に呼び出されたサブルーチンの実行コード１４５ごとの回数（実行回数）が格納される。本実施例では、後述の方法によって、実行コード１４５のヘッダ部２５０のデータがメモリ１１７からヘッダキャッシュ２０５へ転送される際には、キャッシュアウトカウント欄２８１には値が格納されず、初期値が“０”に設定されることとする。そして、エントリがヘッダキャッシュ２０５に格納された後、そのエントリに対応するサブルーチンの実行コード１４５が呼び出されるたびに、該当するエントリのキャッシュアウトカウント欄２８１の値に“１”が加算される。尚、このとき、呼び出されていない他のエントリのキャッシュアウトカウントを“１”減算する方法も考えられる。
【００９７】
上記のとおり、各実行コード１４５のヘッダ部２５０内の優先度２８２は、エントリがキャッシュメモリ１７７とメモリ１１７との間で転送されても、クリアされずに累積するが、キャッシュアウトカウントは、エントリがヘッダキャッシュ２０５に格納される際に値が“０”にクリアされるという相違点を持たせている。これにより、優先度は、コンテンツ１０７内に存在する全てのサブルーチンに着目して各サブルーチンの第１コード１１９のプリコンパイルすべき順番を表し、キャッシュアウトカウントは、ヘッダキャッシュ２０５内に存在するエントリに着目して各サブルーチンの第１コード１１９のプリコンパイルすべき順番を表すことができる。
【００９８】
なお、キャッシュアウトカウントは、後述の方法で、メモリ１１７へ書き戻すエントリを決定する際には、適宜減算されるが、“０”以下には減算されないものとする。また、一定の値を超えると、そのエントリに対応する実行コード１４５が呼び出されても、加算されないものとする。
【００９９】
ヘッダキャッシュ２０５は、コンテンツ実行時において、例えば次のように利用される。コンテンツ１０７の実行中にサブルーチンが呼び出され、プロセッサ１１３が特殊アドレスにアクセスすると、サブルーチン管理回路１７１はその特殊アドレスに基づいて該当する実行コード１４５の先頭アドレスを特定し、その先頭アドレスとヘッダキャッシュ２０５内の開始アドレス欄２７１の各アドレスとを照合する。呼び出されている実行コード１４５のエントリがヘッダキャッシュ２０５内に存在する場合は、サブルーチン管理回路１７１は、処理ステート欄２７７の情報に基づいて処理条件等を判断し、その実行コード１４５がコードの種類に応じて処理されるように制御を行う。なお、サブルーチンごとの処理条件２８０（図２）は、ヘッダキャッシュ２０５の処理ステート欄２７７のデータに含まれている。このように、呼び出されたサブルーチンの実行コード１４５の種類の判断や、処理条件２８０等の判断をヘッダキャッシュ２０５を用いて行うため、メモリ１１７へアクセスする必要がなく、当該判断等の処理を高速化できる。なお、該当するエントリがヘッダキャッシュ２０５内に存在しない場合は、後述の方法で、呼び出されている実行コード１４５のヘッダ部２５０のデータがメモリ１１７から転送され、上記の判断等の処理が再度行われる。
【０１００】
図５は、プリコンパイル回路１７３の動作速度を定める動作速度定義表３０１の一例を示す。この表は、プリコンパイル対象のサブルーチンの第１コード１１９を処理する際に、プリコンパイル制御回路１７５がプリコンパイル回路１７３の動作速度を制御するために利用される。
【０１０１】
動作速度欄３０３、優先度範囲欄３０５、及びサブルーチン定義値欄３０７で構成される各種の項目を有する。
【０１０２】
動作速度欄３０３には、プリコンパイル回路１７３の動作速度を表す値が格納される。本実施例では、この値が大きいほど、プリコンパイル回路１７３が高速で動作することを意味する。
【０１０３】
実行回数範囲欄３０５には、各動作速度が適用されるサブルーチンの実行コード１４５の呼び出された回数（実行回数。本実施例では、原則としてこの値を優先度として取り扱っている。）の範囲が格納される。例えば、実行回数が０〜５０の範囲内にあるサブルーチンの第１コード１１９は、これに対応する動作速度“１”で動作するプリコンパイル回路１７３によってプリコンパイルされる。
【０１０４】
サブルーチン定義値欄３０７には、例えば、以下の（１）〜（３）の情報に基づいて、各サブルーチンの第１コード１１９の生成時に付与される値が格納される。
【０１０５】
（１）コンテンツ１０７に含まれる各サブルーチンの第１コード１１９を第２コード１２１へ変換するのに要する時間
（２）コンテンツ１０７に含まれる各サブルーチンの第１コード１１９をネイティブコード１３１へ変換するのに要する時間
（３）コンテンツ１０７の実行中に各サブルーチンが呼び出される頻度。
【０１０６】
上記の情報に基づいて付与されるサブルーチン定義値は、例えば、第１コード１１９を生成する際に用いるコンパイラの機能によって、第１コード１１９内に記述することができる。例えば、任意の箇所にコメントとして埋め込んだり、その際にヘッダ部２５０を生成して埋め込むことができる。実施例では、コンテンツ１０７の実行中に呼び出されたサブルーチンの第１コード１１９のヘッダ部２５０内にサブルーチン定義値が記述されていれば、例外的に、そのサブルーチン定義値を、第１コード１１９から第２コード１２１を生成する優先度として抽出し、これに基づいてプリコンパイル回路１７３の動作速度を判断し、記述されていなければ実行回数（優先度）で判断することとしている。なお、サブルーチン定義値として“３”が付与されているサブルーチンの第１コード１１９は、動作速度“３”で動作するプリコンパイル回路１７３によってプリコンパイルされる。
【０１０７】
動作速度定義表３０１を作成する際には、例えば、サブルーチンの実行回数及びサブルーチン定義値の値が大きくなるに連れて、プリコンパイル回路１７３の動作速度が大きくなるようにするのがよい。具体的には、サブルーチンの実行回数又はサブルーチン定義値の値が大きくなるに連れて、プリコンパイル回路１７３のクロック（動作周波数）を増加させる方法を採用することができる。また、サブルーチンの実行回数又はサブルーチン定義値の値が小さくなるに連れて、プリコンパイル回路１７３のクロックを大きな値で分周する方法を採用することができる。
【０１０８】
そして、サブルーチンの実行回数又はサブルーチン定義値に基づいて決定される動作速度が小さければ、プリコンパイル制御回路１７５がプリコンパイル回路１７３を低速で動作させ、さらに、動作を維持できる電圧値の範囲内で供給電圧を下げることにより、消費電力を低く抑えることができる。なお、プリコンパイル回路１７３の動作速度を決定するための判断材料としては、サブルーチンごとの実行回数とサブルーチン定義値のいずれか一方だけを用いて判断するように構成してもよい。
【０１０９】
図６は、携帯電話機１０１が起動してから停止するまでの間における、プロセッサ１１３及びサブルーチン管理回路１７１の処理のフローチャートを示す。携帯電話機１０１の電源が“ＯＮ”になると、ハードウェア１０５が初期化（メモリ１１７のクリアなど）され、本処理が開始する。
【０１１０】
まず、プロセッサ１１３は、ＯＳイメージファイル４０１及び再生アプリ１２５を不揮発性記録媒体１１５からメモリ１１７へ転送し（ＳＴ６０１）、ＯＳ１２７を起動させる（ＳＴ６０２）。
【０１１１】
プロセッサ１１３は、ユーザが操作ボタン等の周辺機能部１１１を操作するなど、何らかのきっかけによりコンテンツ１０７の実行が指示されるまで待機し（ＳＴ６０３の判断が“Ｎ”の場合）、実行が指示されると（ＳＴ６０３の判断が“Ｙ”の場合）、再生アプリ１２５を起動する（ＳＴ６０４）。
【０１１２】
そして、サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもとで、サブルーチン管理回路１７１が後述のコンテンツ転送処理（図７）を行う（ＳＴ６０５）。コンテンツ転送処理（ＳＴ６０５）では、実行対象のコンテンツ１０７が不揮発性記録媒体１１５からメモリ１１７へロードされる。この際、各サブルーチンには、ヘッダ部２５０が付加されるとともに、各サブルーチン内に記述されたジャンプ先アドレスが後述の方法（図７）で特殊アドレスに書き換えられる。
【０１１３】
次に、プロセッサ１１３は、メモリ１１７上に記憶されたコンテンツ１０７のサブルーチンの実行コード１４５からヘッダ部２５０のデータ（ヘッダ情報）を抽出し、キャッシュメモリ１７７上のヘッダキャッシュ２０５へ転送する（ＳＴ６０６）。なお、ヘッダキャッシュ２０５へ転送されるヘッダ情報は、実行対象のコンテンツ１０７に含まれるサブルーチンのすべての実行コード１４５に関するでデータでもよいし、コンテンツ１０７を構成するサブルーチンの先頭から順に抽出した所定の個数（例えば、５０個）のサブルーチンの実行コード１４５に関するデータでもよいし、ヘッダ部２５０に格納される優先度２８２の値の大きいものから順に選んだ所定の個数のサブルーチンの実行コード１４５のデータを採用することもできる。
【０１１４】
プロセッサ１１３は、サブルーチン管理回路１７１によるコンテンツ１０７のデータのメモリ１１７への転送が終了すると、続いてサブルーチン管理回路１７１に後述のコンテンツ実行支援処理を実行させる（ＳＴ６０７）。プロセッサ１１３は、サブルーチン管理回路１７１によるコンテンツ実行支援処理（ＳＴ６０７）の結果に基づいて、コンテンツ１０７を実行する。
【０１１５】
プロセッサ１１３は、コンテンツ１０７を実行している間、ユーザが操作ボタン等の周辺機能部１１１を操作することにより、何らかの処理を実行すべき指示（イベント）が発生したかどうかを監視し（ＳＴ６０８の判断が“Ｎ”の場合）、イベントが発生した場合（ＳＴ６０８の判断が“Ｙ”の場合）、そのイベントの内容が、別のコンテンツ１０７の実行指示かどうかを判別する（ＳＴ６０９）。
【０１１６】
そのイベントが別のコンテンツ１０７の実行指示だった場合（ＳＴ６０９の判断が“Ｙ”の場合）、プロセッサ１１３は、後述のコンテンツ終了処理を実行し（ＳＴ６１０）、当該別のコンテンツ１０７の転送処理が行われる（ＳＴ６０５）。
【０１１７】
そのイベントが別のコンテンツ１０７の実行指示ではなかった場合（ＳＴ６０９の判断が“Ｎ”の場合）、プロセッサ１１３は、携帯電話機１０１の電源ＯＦＦ等のシステム終了指示だったかどうか判断し（ＳＴ６１１）し、システム終了指示ではなかった場合は（ＳＴ６１１の判断が“Ｎ”の場合）、指示されたイベントを処理する（ＳＴ６１２）。
【０１１８】
一方、システム終了指示がされた場合（ＳＴ６１１の判断が“Ｙ”の場合）、プロセッサ１１３は、終了するコンテンツ１０７に関するヘッダキャッシュ２０５上のエントリをメモリ１１７へ書き戻し（ＳＴ６１３）、コンテンツ１０７のデータのうち、各サブルーチンの実行コード１４５のヘッダ部２５０のデータなど、変更されたデータを不揮発性記録媒体１１５へ書き戻し（ＳＴ６１４）、ＯＳ終了処理を実行する（ＳＴ６１４）。その後、ハードウェア１０５への電源供給が遮断され、携帯電話機１０１が停止する。なお、ＳＴ６１４においては、変更されたデータとして、新たに生成された第２コード１２１及びネイティブコード１３１のデータを不揮発性記録媒体１１５へ書き戻すように構成することもできる。
【０１１９】
図７は、サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもとでサブルーチン管理回路１７１が行うコンテンツ転送処理（図６のＳＴ６０５）のフローチャートを示す。
【０１２０】
本処理は、ユーザが操作ボタン等の周辺機能部１１１を操作するなど、何らかのきっかけによりコンテンツ１０７の実行が指示されることにより、プロセッサ１１３が、そのコンテンツ１０７のデータが不揮発記録媒体１１５からメモリ１１７へ転送し始めた場合に行われる。また、この処理の前提として、本実施例では、コンテンツ１０７のサブルーチンの各実行コード１４５には、他のサブルーチンへのジャンプ先アドレス、及び同一サブルーチン内でのジャンプ先アドレスとして、サブルーチンの先頭を基準とする相対アドレス（以下「初期アドレス」という。）が割り当てられているものとする。さらに、サブルーチンの実行コード１４５が不揮発性記録媒体１１５からメモリ１１７へ転送されると、ＯＳ１２７が、サブルーチンの各実行コード１４５のメモリ１１７上の格納開始アドレス（ベースアドレス）及び上記初期アドレスに基づいて、サブルーチンの各実行コード１４５の先頭アドレス及び各実行コード１４５内に記述さているジャンプ先アドレスをメモリ１１７上の絶対アドレス（物理アドレス）に変換するものとする。
【０１２１】
なお、このコンテンツ転送処理の際には、図８に示す先頭アドレス管理テーブル８５０及びジャンプ先アドレス管理テーブル８５５が利用されるため、これらのテーブルについて予め説明する。
【０１２２】
図８は、サブルーチンの各実行コード１４５について、初期アドレス、メモリ１１７上へ格納された時に割り当てられる物理アドレス、及び後述の変数（i）の値を管理する先頭アドレス管理テーブル８５０及びジャンプ先アドレス管理テーブル８５５の構成を示す。
【０１２３】
先頭アドレス管理テーブル８５０は、初期アドレス欄８５１及び物理アドレス欄８５２で構成される各種の項目を有する。初期アドレス欄８５１には、サブルーチンの実行コード１４５の初期アドレスのうち、サブルーチンの実行コード１４５の先頭アドレスが格納される。物理アドレス欄８５２には、サブルーチンの実行コード１４５のメモリ１１７の物理アドレスが格納される。
【０１２４】
ジャンプ先アドレス管理テーブル８５５は、初期アドレス欄８５６、物理アドレス欄８５７、及び変数欄８５８で構成される各種の項目を有する。初期アドレス欄８５６には、サブルーチンの実行コード１４５の初期アドレスのうち、サブルーチンの実行コード１４５に記述されている、他のサブルーチンへのジャンプ先アドレスや、同一実行コード１４５内でのジャンプ先アドレスが格納される。物理アドレス欄８５７には、サブルーチンの実行コード１４５に記述されているジャンプ先アドレスのメモリ１１７の物理アドレスが格納される。そして、変数欄８５８には、後述の変数“i”の値が格納される。
【０１２５】
続いて、コンテンツ転送処理（図７）の手順を説明する。まず、サブルーチン管理回路１７１は、プロセッサ１１３が不揮発性記録媒体１１７からコンテンツ１０７のデータを読み出すと、変数“i”を初期化し（ＳＴ７０１）、サブルーチンの実行コード１４５ごとに検査を開始する（ＳＴ７０２）。
【０１２６】
次に、サブルーチン管理回路１７１は、サブルーチンの実行コード１４５がヘッダ部２５０（図２）を有するかどうかを検査する（ＳＴ７０３）。ヘッダ部１４５を有するかどうかの検査は、例えば、実行コード１４５の先頭にコードタイプ２５６の値が記述されているかどうかを基準にして行うことができる。
【０１２７】
ＳＴ７０３の検査の結果、そのサブルーチンの実行コード１４５がヘッダ部２５０を有していない場合（ＳＴ７０３の判断が“Ｎ”の場合）、サブルーチン管理回路１７１は、そのサブルーチンの実行コード１４５の先頭にヘッダ部２５０（図２）を生成する（ＳＴ７０４）。なお、本実施例において、ヘッダ部２５０を有していない実行コード１４５とは、例えば、初めて実行されるコンテンツ１０７に含まれる第１コード１１９である。サブルーチン管理回路１７１が生成するヘッダ部２５０は、例えば以下のとおりである。
【０１２８】
（１）コードタイプ：“０”
（２）処理条件：“０”〜“３”のいずれか
（３）優先度：“０”
（４）処理状態フラグ：“０”
（５）オリジナルコードアドレス：この第１コード１１９の先頭アドレス
（６）変換済みコードアドレス：null
（７）実行中フラグ：“１”
（８）終了アドレス：この第１コード１１９の終了アドレス
（９）チェックサム：チェックサム（プロセッサ１１３又はサブルーチン管理回路１７１によって計算される）。
【０１２９】
上記（２）の処理条件については、サブルーチンごとに、コンテンツ１０７の実行中に呼び出される回数やプリコンパイルに要する時間等の事情を考慮して設定するのが好ましい。従って、処理条件は、サブルーチンの第１コード１１９の生成時に予め定めておき、例えばその第１コード１１９の先頭に、コメント等の形式で予め記述しておくことができる。そして、上記処理（ＳＴ７０４）の実行時に、その第１コード１１９の先頭に記述されている情報を参照して、処理条件としてヘッダ部２５０に書き込むようにすることができる。或いは、サブルーチンＩＤと処理条件とを対応付けて構成した処理条件管理表（図示省略）をメモリ１１７上に記憶し、ＳＴ７０４の処理の際にこの表を参照して、各サブルーチンの処理条件を決定することも可能である。
【０１３０】
上記（９）のチェックサムは、第１コード１９については、このヘッダ部生成処理（ＳＴ７０４）の際にプロセッサ１１３又はサブルーチン管理回路１７１によって計算するように構成することができる。
【０１３１】
サブルーチン管理回路１７１は、実行コード１４５にヘッダ部２５０を生成すると、変数“i”をインクリメントする（“１”を加算する。ＳＴ７０５）。
【０１３２】
サブルーチン管理回路１７１は、検査中のサブルーチンがヘッダ部２５０を既に有している場合（ＳＴ７０３の判断が“Ｙ”の場合）又はＳＴ７０５の後、検査中の実行コード１４５をメモリ１１７へ転送する（ＳＴ７０６）。サブルーチンの実行コード１４５のデータをメモリ１１７へ格納すると、その実行コード１４５に関する初期アドレスに基づいて、ＯＳ１２７が物理アドレスを割り当てる。例えば、検査対象の実行コード１４５の先頭アドレスを表す初期アドレスが“ＦＦＥＦ３Ｃ”で、メモリ１１７上のベースアドレスが“１０００００００００”の場合には、物理アドレスは“１０００ＦＦＥＦ３Ｃ”となる。
【０１３３】
サブルーチン管理回路１７１は、検査対象の実行コード１４５のデータをメモリ１１７へ転送すると、先頭アドレス管理テーブル８５０及びジャンプ先アドレス管理テーブル８５５に、当該実行コード１４５に関する、初期アドレス、物理アドレス、変数“i”の値を格納する（ＳＴ７０７）。
【０１３４】
具体的には、先頭アドレス管理テーブル８５０のうち、初期アドレス欄８５１には、検査対象の実行コード１４５の先頭アドレスを表す初期アドレスが格納される。物理アドレス欄８５２には、検査対象の実行コード１４５のメモリ１１７上の物理アドレスが格納される。
【０１３５】
また、ジャンプ先アドレス管理テーブル８５５のうち、初期アドレス欄８５１には、検査対象の実行コード１４５に記述されているジャンプ先アドレスを表す各初期アドレスが格納される。物理アドレス欄８５２には、それらの初期アドレスに基づいて割り当てられたメモリ１１７上の物理アドレスが格納される。そして、変数欄８５８には、変数“i”の値が格納される。
【０１３６】
サブルーチン管理回路１７１は、先頭アドレス管理テーブル８５０にデータを格納すると、全てのサブルーチンの実行コード１４５について検査が完了したかどうかを判断し（ＳＴ７０８）、検査が完了していない場合（ＳＴ７０８の判断が“Ｎ”の場合）、次のサブルーチンの実行コード１４５を探索して（ＳＴ７０９）、上記の処理（ＳＴ７０３〜ＳＴ７０７）を繰り返す。
【０１３７】
一方、サブルーチン管理回路１７１は、全てのサブルーチンの実行コード１４５の検査が完了した場合（ＳＴ７０８の判断が“Ｙ”の場合）、コンテンツ１０７のサブルーチンの先頭から実行コード１４５を検査し、実行コード１４５内にジャンプ先アドレスが記述されているかどうかを検査する（ＳＴ７０９）。このジャンプ先アドレスには、他のサブルーチンへのジャンプ先アドレスのほかに、同一実行コード１４５内のループ先アドレスやエスケープ先アドレスが含まれる。
【０１３８】
そのサブルーチンの実行コード１４５内にジャンプ先アドレスが記述されている場合（ＳＴ７０９の判断が“Ｙ”の場合）、そのジャンプ先アドレスを、ヘッダサイズを考慮したアドレスに書き換える（ＳＴ７１０）。ＳＴ７０４で生成されたヘッダ部２５０のサイズに応じてメモリ１１７上のデータの格納位置が変化するため、この変化に基づいてジャンプ先アドレスを調整する必要があるからである。
【０１３９】
具体的には、そのジャンプ先アドレスが、他のサブルーチンの実行コード１４５へのジャンプ先アドレスの場合、サブルーチン管理回路１７１は、ジャンプ先アドレス管理テーブル８５５（図８）を参照して、そのジャンプ先アドレス（物理アドレス）に対応する初期アドレスを抽出し、その初期アドレスを用いて先頭アドレス管理テーブル８５０内を検索して、該当する実行コード１４５の物理アドレスを抽出してジャンプ先アドレスを書き換える。
【０１４０】
また、そのジャンプ先アドレスが、検査対象の実行コード１４５内の任意の位置へのジャンプ先アドレスの場合には、サブルーチン管理回路１７１は、ジャンプ先アドレス管理テーブル８５５（図８）を参照して、そのジャンプ先アドレス（物理アドレス）を抽出し、その物理アドレスの値に下記割増量を加算して得られるアドレスを用いてジャンプ先アドレスを書き換える。
【０１４１】
［割増量］
offset＝（ヘッダサイズ）＊（変数欄８５８の値）。
【０１４２】
なお、そのジャンプ先アドレスが、検査対象の実行コード１４５内のジャンプ先アドレスの場合には、サブルーチン管理回路１７１は、実行コード１４５をメモリ１１７へ転送した直後（ＳＴ７０６の後）に、そのジャンプ先アドレス（物理アドレス）に下記割増量を加算して得られるアドレスを用いてジャンプ先アドレスを書き換えるように構成してもよい。この構成を採用する場合、ジャンプ先アドレス管理テーブル８５５における変数欄８５８を用いなくてもよい。
【０１４３】
［割増量］
offset＝（ヘッダサイズ）＊（変数“i”の値）。
【０１４４】
そして、サブルーチン管理回路１７１は、検査中のサブルーチンの実行コード１４５内にある全てのジャンプ先アドレスを書き換えたかどうかを検査し（ＳＴ７１１）、未変換のジャンプ先アドレスがあれば（ＳＴ７１１の判断が“Ｙ”の場合）、次のアドレスを探索し(ＳＴ７１２)、前述の方法でアドレスの書き換え処理（ＳＴ７１０）を行う。サブルーチン管理回路１７１は、このようにして、検査中のサブルーチンの実行コード１４５内のすべてのジャンプ先アドレスを書き換える。なお、アドレス書き換え処理（ＳＴ７１０）は、例えば、メモリ１１７内でデータ構造が変化した際に、その変化に応じて、サブルーチンの各実行コード１４５内に記述されている物理アドレスを含め、各物理アドレスを自動的に変換する機能をＯＳ１２７が有している場合は、行わないように構成することができる。
【０１４５】
検査中のサブルーチンの実行コード１４５内にあるすべてのジャンプ先アドレスを変更した場合（ＳＴ７１１の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、それらのジャンプ先アドレスのなかに、他のサブルーチンの実行コード１４５へのジャンプ先アドレスが含まれているかどうかを検査する（ＳＴ７１３）。例えば、各ジャンプ先アドレスの値と、検査対象の実行コード１４５のメモリ１１７上の格納エリアとを比較し、ジャンプ先アドレスが実行コード１４５のメモリ１１７上の格納エリアの範囲外のエリアを表していれば、他のサブルーチンの実行コード１４５へのジャンプ先アドレスであると判断することができる。
【０１４６】
その検査の結果、実行コード１４５内にあるジャンプ先アドレスのなかに、他のサブルーチンの実行コード１４５へのジャンプ先アドレスが含まれている場合（ＳＴ７１３の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、そのジャンプ先アドレスに特殊アドレス識別子を付加することにより、そのジャンプ先アドレスを特殊アドレスに書き換える(ＳＴ７１４)。
【０１４７】
そして、サブルーチン管理回路１７１は、検査中のサブルーチンの実行コード１４５内にある、他のサブルーチンへのジャンプ先アドレスをすべて書き換えたかどうかを判断し（ＳＴ７１５）、未変換のジャンプ先アドレスがあれば（ＳＴ７１５の判断が“Ｎ”の場合）、次のアドレスを探索し（ＳＴ７１６)、前述のようにアドレス変換処理（ＳＴ７１４）を行う。サブルーチン管理回路１７１は、このようにして、検査中のサブルーチンの実行コード１４５内に記述されている、他のサブルーチンの実行コード１４５へのジャンプ先アドレスのすべてを特殊アドレスに書き換える。
【０１４８】
サブルーチン管理回路１７１は、検査中のサブルーチンの実行コード１４５内に記述されている、他のサブルーチンの実行コード１４５へのジャンプ先アドレスをすべて変換した後（ＳＴ７１５の判断が“Ｙ”の場合）、実行対象のコンテンツ１０７に含まれるすべてのサブルーチンの実行コード１４５を検査したかどうかを判断する（ＳＴ７１７）。そして、未検査のサブルーチンの実行コード１４５がある場合（ＳＴ７１８の判断が“Ｎ”の場合）、次のサブルーチンを探索し(ＳＴ７１８)、その実行コード１４５について上記の処理を繰り返す（ＳＴ７０９〜ＳＴ７１６）。
【０１４９】
サブルーチン管理回路１７１は、実行対象のコンテンツ１０７に含まれるサブルーチンのすべての実行コード１４５について、上記の処理を行った場合（ＳＴ７１７の判断が“Ｙ”の場合）、プロセッサ１１３によって不揮発性記録媒体１１５から転送される各種データ１４１，１４３をメモリ１１７へ転送し（ＳＴ７１９）、コンテンツ転送処理が終了する。
【０１５０】
図９は、サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもとでサブルーチン管理回路１７１が行うコンテンツ実行支援処理（図６のＳＴ６０７）のフローチャートを示す。本処理は、コンテンツ１０７の実行が開始され、プロセッサ１１３から特定のデータにアクセスするためのアドレスが発行されたときに行われる。
【０１５１】
まず、サブルーチン管理回路１７１は、プロセッサ１１３から発行されたアドレスが、特殊アドレスの範囲内の値かどうかを判断する（ＳＴ８０１）。サブルーチン管理回路１７１は、プロセッサ１１３から発行されたアドレスが特殊アドレスの範囲外であると判断した場合（ＳＴ８０１の判断が“Ｎ”の場合）、該当するアドレスのデータをメモリ１１７から抽出し、プロセッサ１１３へ転送する（ＳＴ８０２）。
【０１５２】
一方、プロセッサ１１３から発行されたアドレスが特殊アドレスの範囲内であると判断した場合（ＳＴ８０１の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、そのアドレスが特殊アドレス識別子（図２）を含むかどうか、すなわち本実施例の場合は上位数ビットが特殊アドレス識別子（例えば、“Ａ０００００００”）と一致するかどうかを検査する（ＳＴ８０３）。サブルーチン管理回路１７１は、プロセッサ１１３から発行されたアドレスの上位数ビットが特殊アドレス識別子と一致しない場合（ＳＴ８０３の判断が“Ｎ”の場合）、プロセッサ１１３にエラー（例えば、“エントリ無し”という内容の例外命令）を通知し（ＳＴ８０４）、コンテンツ実行支援処理を終了する。
【０１５３】
プロセッサ１１３から発行されたアドレスが特殊アドレスに該当する場合、すなわちそのアドレスの上位数ビットが特殊アドレス識別子と一致する場合（ＳＴ８０３の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、その特殊アドレスからサブルーチンの実行コード１４５の先頭アドレスを抽出し（ＳＴ８０５）、ヘッダキャッシュ２０５内の開始アドレス２７１の値を参照して、該当するエントリを検索する（ＳＴ８０７）。
【０１５４】
サブルーチン管理回路１７１は、ヘッダキャッシュ２０５内の検索の結果、該当するエントリが存在するかどうかを判断し（ＳＴ８０７）、該当するエントリが存在しない場合は、後述のヘッダキャッシュ入れ替え処理を実行する（ＳＴ８０８）。
【０１５５】
ヘッダキャッシュ２０５内に該当するエントリが存在する場合（ＳＴ８０７の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、そのエントリに対応するサブルーチンの実行コード１４５に基づいてチェックサムを算出し、ヘッダキャッシュ２０５のチェックサム欄２８０に格納されている値と比較し、チェックサムが不正かどうか、すなわち両者の値が一致しないかどうかを検査する（ＳＴ８０９）。そして、サブルーチン管理回路１７１は、チェックサムが不正の場合、すなわち算出したチェックサムの値とヘッダキャッシュ２０５のチェックサム欄２８０の値とが一致しない場合（ＳＴ８０９の判断が“Ｙ”の場合）、プロセッサ１１３へエラー（例えば、“エントリ無し”という内容の例外命令）を通知し（ＳＴ８０４）、コンテンツ実行支援処理を終了する。
【０１５６】
一方、チェックサムが正しい場合、すなわち算出したチェックサムの値とヘッダキャッシュ２０５のチェックサム欄２８０の値とが一致する場合（ＳＴ８０９の判断が“Ｎ”の場合）、サブルーチン管理回路１７１は、ヘッダキャッシュ２０５における該当するエントリの情報を更新する（ＳＴ８１０）。具体的には、ヘッダ情報欄２６７の処理ステート欄２７７に含まれる優先度の値に“１”を加算し、キャッシュアウトカウント欄２８１の値に“１”を加算する。
【０１５７】
次に、サブルーチン管理回路１７１は、ヘッダキャッシュ２０５内にある実行対象のサブルーチンのエントリに着目し、そのエントリのコードタイプ欄２７５の値が“２”かどうか、すなわちサブルーチンのネイティブコード１３１が呼び出されているのかどうかを判断する（ＳＴ８１１）。
【０１５８】
その判断の結果、ネイティブコード１３１が呼び出されている場合（ＳＴ８１１の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、メモリ１１７からネイティブコード１３１のデータを抽出し、プロセッサ１１３へ転送する（ＳＴ８１２）。これにより、プロセッサ１１３によってネイティブコード１３１が実行される。また、ネイティブコード１３１が実行されると、このネイティブコード１３１内に後述の方法で記述されたジャンプ先アドレス変換命令２９２（図２）も実行される。ジャンプ先アドレス変換命令が実行されることにより、呼び出し元のサブルーチンの実行コード１４５に記述されている当該ネイティブコード１３１の特殊アドレスが、このネイティブコード１３１のコード本体２９０（図２）の先頭アドレスに置き換えられる。
【０１５９】
従って、その呼び出し元のサブルーチンの実行コード１４５から上記ネイティブコード１３１が再度呼び出される際には、特殊アドレスではなく、ネイティブコード１３１の先頭アドレスへ直接アクセスすることができ、サブルーチン管理回路１７１による上記判断が不要となるため、処理が更に高速化する。
【０１６０】
一方、呼び出されたサブルーチンがネイティブコード１３１ではない場合（ＳＴ８１１の判断が“Ｎ”の場合）、サブルーチン管理回路１７１は、ヘッダキャッシュ２０５内にある実行対象のサブルーチンのエントリのコードタイプ欄２７５の値が“１”かどうか、すなわちサブルーチンの第２コード１２１が呼び出されているのかどうかを判断する（ＳＴ８１３）。
【０１６１】
ＳＴ８１３の判断の結果、第２コード１２１が呼び出されている場合（ＳＴ８１３の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、ヘッダキャッシュ２０５内で該当するエントリの処理ステート欄２７７に格納されている処理状態フラグが“２”かどうか、すなわち、実行対象の第２コード１２１がネイティブコード１３１に変換済みかどうかを判断する（ＳＴ８１４）。
【０１６２】
ＳＴ８１４の判断の結果、実行対象の第２コード１２１からネイティブコード１３１が既に生成されている場合（ＳＴ８１４の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、ヘッダキャッシュ２０５の処理ステート欄２７７から、ネイティブコード１３１のアドレスを表す変換済みコードアドレス２８８（図２）を抽出し、これに基づいてネイティブコード１３１のデータをメモリ１１７から抽出してプロセッサ１１３へ転送する（ＳＴ８１５）。
【０１６３】
一方、ＳＴ８１４の判断の結果、実行対象の第２コード１２１からネイティブコード１３１がまだ生成されていない場合（ＳＴ８１４の判断が“Ｎ”の場合）、サブルーチン管理回路１７１は、その第２コード１２１に適用すべき処理の内容を決定するため、後述の処理内容選択処理を実行する（ＳＴ８１６）。この処理内容選択処理を実行することにり、実行対象の第２コード１２１がまだＪＩＴコンパイラ１５９で処理されていなければ、ＪＩＴコンパイラ１５９で処理すべき内容の命令がプロセッサ１１３へ発行される。
【０１６４】
サブルーチン管理回路１７１は、処理内容選択処理（ＳＴ８１６）を実行するとともに、実行対象の第２コード１２１の元となる第１コード１１９のサイズが、所定の条件を満たすかどうか（例えば、予め定めておいたサイズより大きいかどうか）を判断する（ＳＴ８１７）。この判断は、実行対象のサブルーチンのサブルーチンＩＤに基づいて、メモリ１１７内の第１コードサイズ管理表２３９（図４）を検索し、その第２コード１２１の元となる第１コード１１９のサイズを抽出することにより行うことができる。なお、本実施例では、サブルーチンＩＤは、コードの種類にかかわらずサブルーチンごとに一定であるものとする。
【０１６５】
ＳＴ８１７の判断の結果、実行対象の第２コード１２１の元となる第１コード１１９のサイズが、予め定めたサイズより大きい場合（ＳＴ８１７の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、実行対象の第２コード１２１に関するヘッダキャッシュ２０５のエントリを参照し、処理ステート欄２７７内に記述されている変換元となる第１コード１１９の先頭アドレスに基づいてコード本体１９０（図２）の先頭アドレスを抽出する（ＳＴ８１８）。そして、サブルーチン管理回路１７１は、抽出した第１コード１１９の先頭アドレスを、スタックにプッシュし（ＳＴ８１９）、その第１コード１１９のインタプリタ実行をプロセッサ１１３に依頼する（ＳＴ８２０）。
【０１６６】
なお、第１コード１１９のコード本体２９０の先頭アドレスは、例えば、実行対象の第２コード１２１に関するヘッダキャッシュ２０５の処理ステート欄２７７に含まれるオリジナルコードアドレス２８６（図２）のアドレス値を抽出し、そのアドレス値から第１コード１１９のヘッダ部２５０のサイズを減算することにより得ることができる。なお、第１コード１１９のヘッダ部２５０のサイズ（本実施例では、一定値である）は、メモリ１１７上に別途記憶させておけばよい。
【０１６７】
これにより、その第２コード１２１がＪＩＴコンパイラ１５９でネイティブコード１３１へ変換されるとともに、その第２コード１２１の元となる第１コード１１９がインタプリタ１５７で逐次解釈されながら実行される。コードのサイズが、或る程度大きい場合は、第２コードをＪＩＴコンパイラ１５９でコンパイルしてから実行するよりも、第１コード１１９をインタプリタ１５７で実行した方が処理速度が向上するというメリットがある。なお、本実施例では、処理対象のサブルーチンについて、第１コード１１９のインタプリタ１５７による実行と、第２コード１２１のＪＩＴコンパイラ１５９による実行を別スレッドで同時に行う場合、第１コード１１９のインタプリタ１５７による実行を優先し、ＪＩＴコンパイラ１５９はネイティブコード１３１の生成だけのために動作する。
【０１６８】
一方、ＳＴ８１７の判断の結果、実行対象の第２コード１２１の元となる第１コード１１９のサイズが、予め定めておいたサイズより小さい（ＳＴ８１７の判断が“Ｎ”の場合）、コンテンツ実行支援処理は終了する。
【０１６９】
ＳＴ８１３の判別処理に戻り、呼び出されたサブルーチンが第２コード１２１ではない場合（ＳＴ８１３の判断が“Ｎ”の場合）、サブルーチン管理回路１７１は、ヘッダキャッシュ２０５内にある実行対象のサブルーチンのエントリのコードタイプ欄２７５の値が “０”かどうか、すなわちサブルーチンの第１コード１１９が呼び出されているのかどうかを判断する（ＳＴ８２１）。
【０１７０】
ＳＴ８２１の判断の結果、呼び出されたサブルーチンが第１コード１１９ではない場合（ＳＴ８２１の判断が“Ｎ”の場合）、サブルーチン管理回路１７１は、プロセッサ１１３に対しエラー（例えば、“コードタイプ不正”という内容の例外命令）を通知し（ＳＴ８２２）、コンテンツ実行支援処理は終了する。
【０１７１】
一方、ＳＴ８２１の判断の結果、呼び出されたサブルーチンが第１コード１１９である場合（ＳＴ８２１の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、ヘッダキャッシュ２０５の処理ステート欄２７７内に記述されている処理状態フラグが“２”かどうか、すなわち、実行対象の第１コード１１９が既に第２コード１２１に変換されているかどうかを判断する（ＳＴ８２３）。
【０１７２】
ＳＴ８２３の判断の結果、実行対象の第１コード１１９から生成された第２コード１２１が既に存在する場合（ＳＴ８２３の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、後述のヘッダキャッシュ入れ替え処理を実行する（ＳＴ８２４）。
【０１７３】
一方、ＳＴ８２３の判断の結果、実行対象の第１コード１１９が第２コード１２１に変換されていない場合（ＳＴ８２３の判断が“Ｎ”の場合）、サブルーチン管理回路１７１は、後述の処理内容選択処理（ＳＴ８２５）を実行する。第１コード１１９に対して処理内容選択処理を実行すると、その第１コード１１９がプリコンパイル回路１７３でプリコンパイルされている最中か又は既にプリコンパイルされた場合でなければ、プリコンパイル待ちの状態に設定され、所定のタイミングでプリコンパイルされることになる。
【０１７４】
サブルーチン管理回路１７１は、処理内容選択処理（ＳＴ８２５）を実行するとともに、スタックに実行対象の第１コード１１９のコード本体２９０（図２）の先頭アドレスをプッシュし（ＳＴ８１９）、当該第１コード１１９のインタプリタ１５７による実行をプロセッサ１１３に依頼する（ＳＴ８２０）。なお、第１コード１１９のコード本体２９０の先頭アドレスは、例えば、当該第１コード１１９の呼び出し時にプロセッサ１１３から発行された特殊アドレスに含まれる先頭アドレスから、ヘッダ部２５０のサイズを減算することにより得ることができる。
【０１７５】
上記ＳＴ８２５，ＳＴ８１９，ＳＴ８２０の処理により、プロセッサ１１３から呼び出されたサブルーチンの第１コード１１９は、インタプリタ１５７で逐次解釈されて実行されるとともに、プリコンパイル回路１７３で第２コード１２１に変換されることになる。
【０１７６】
図１０は、サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもとでサブルーチン管理回路１７１により行われるヘッダキャッシュ２０５の更新処理（図９のＳＴ８０８）のフローチャートを示す。この処理では、サブルーチンの呼び出しが発生した際に、必要に応じて、メモリ１１７上の各実行コード１４５のヘッダ部２５０とヘッダキャッシュ２０５との間でデータの入れ替えが行われる。
【０１７７】
本処理が呼ばれると、まず、以下のようにパラメータを初期化する（ＳＴ８０１）。
【０１７８】
（１）探索位置［pos］＝キャッシュの先頭
（２）最小キャッシュアウトカウント値［min］＝予め定めた値（例えば、格納可能なキャッシュアウトカウントの最大値［max］）
（３）最小キャッシュアウトカウント値を持つエントリ位置［posmin］＝キャッシュの先頭。
【０１７９】
続いて、posのエントリ［ent］のキャッシュアウトカウント［ent.Cnt］から“１”を減算し（ＳＴ９０２）、ent.Cntが最小キャッシュアウトカウント値［min］より小さいかどうかを判断する（ＳＴ９０３）。
【０１８０】
ent.Cntがminより小さい場合（ＳＴ９０３の判断が“Ｙ”の場合）、minにent.Cntを設定し（ＳＴ９０４）、posminにposを設定する（ＳＴ９０５）。
【０１８１】
ent.Cntがminより大きい場合（ＳＴ９０３の判断が“Ｎ”の場合）又はＳＴ９０５の後、ent.Cntが“０”かどうかを判断し（ＳＴ９０６）、ent.Cntが“０”ではない場合（ＳＴ９０６の判断が“Ｎ”の場合）は、全てのエントリを検索し終わったかどうかを判断する（ＳＴ９０７）。全エントリの検索が終了していない場合（ＳＴ９０７の判断が“Ｎ”の場合）、posに“１”を加算し（ＳＴ９０８）、次のエントリについて上記の処理を行う。
【０１８２】
ent.Cntが“０”の場合（ＳＴ９０６の判断が“Ｙ”の場合）、そのエントリをメモリ１１７上にある対応するサブルーチンの実行コード１４５のヘッダ部２５０へ書き戻す（ＳＴ９０９）。また、全エントリの検索が終了した場合（ＳＴ９０７の判断が“Ｙ”の場合）、posminのエントリをメモリ１１７上にある対応するサブルーチンの実行コード１４５のヘッダ部２５０へ書き戻し（ＳＴ９１０）、posにposminを設定する（ＳＴ９１１）。
【０１８３】
これらの処理により、キャッシュアウトカウント値の最も小さいエントリが、殆ど参照されていないエントリとして検出され、ヘッダキャッシュ２０５からメモリ１１７へ書き戻すべきエントリを合理的に判断することができる。
【０１８４】
ＳＴ９０９又はＳＴ９１１の後、プロセッサ１１３が参照しようとしているサブルーチンの実行コード１４５をメモリ１１７内で検索して、該当するサブルーチンの実行コード１４５からヘッダ部２５０のデータを抽出し（ＳＴ９１２）、そのエントリをヘッダキャッシュ８０５内のposが示す位置へ読み込み（ＳＴ９１３）、ヘッダキャッシュ２０５の更新処理が終了する。
【０１８５】
図１１は、サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもとでサブルーチン管理回路１７１により行われる処理内容選択処理（図９のＳＴ８１６，ＳＴ８２４）のフローチャートを示す。
【０１８６】
本処理が呼び出されると、サブルーチン管理回路１７１は、まず、実行対象の第１コード１１９又は第２コード１２１に関するヘッダキャッシュ２０５のエントリの処理ステート欄２７７を参照し、処理条件（図３の上から三番目の表）が成立しているかどうかを判断する（ＳＴ１００１）。処理条件が成立していない場合（ＳＴ１００１の判断が“Ｎ”の場合）、サブルーチン管理回路１７１は、この処理内容選択処理を終了する。
【０１８７】
一方、ＳＴ１００１の判断の結果、実行対象の第１コード１１９又は第２コード１２１に関する処理条件が成立していると判断した場合（ＳＴ１００１の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、実行対象のサブルーチンの実行コード１４５について、ヘッダキャッシュ２０５の処理ステート欄２７７内に記述されている処理状態フラグが“０”かどうかを判断する（ＳＴ１００２）。具体的には、サブルーチン管理回路１７１は、実行対象のサブルーチンに関するヘッダキャッシュ２０５のエントリの内容に基づいて、第１コード１１９が処理対象のサブルーチンであれば、第２コード１２１へ変換されておらず且つ変換途中でもないかどうか、また、第２コード１２１が処理対象サブルーチンであれば、ネイティブコード１３１へ変換されておらず且つ変換途中でもないかどうかを判断する。
【０１８８】
ＳＴ１００２の判断の結果、実行対象のサブルーチンの実行コード１４５の処理状態フラグが“０”の場合（ＳＴ１００２の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、この処理内容選択処理を終了する。
【０１８９】
一方、実行対象のサブルーチンの実行コード１４５の処理状態フラグが“０”ではない場合（ＳＴ１００２の判断が“Ｎ”の場合）、サブルーチン管理回路１７１は、実行対象のサブルーチンのコードタイプが“０”かどうか、すなわち第１コード１１９が処理対象のサブルーチンかどうかを判断する（ＳＴ１００３）。
【０１９０】
ＳＴ１００３の判断の結果、処理対象のサブルーチンが第１コード１１９ではない場合（ＳＴ１００３の判断が“Ｎ”の場合）、すなわち第２コード１２１が処理対象のサブルーチンである場合には、サブルーチン管理回路１７１は、その第２コード１２１のコード本体２９０（図２）の先頭アドレスをスタックにプッシュする（ＳＴ１００４）。第２コード１２１のコード本体２９０の先頭アドレスは、例えば、プロセッサ１１３から発行された特殊アドレスに含まれる第２コード１２１の先頭アドレスからヘッダ部２５０のサイズを減算して得ることができる。第２コード１２１のヘッダ部２５０のサイズは、予め計算してメモリ１１７に記憶させておいてもよいし、必要に応じて計算してもよい。
【０１９１】
そして、サブルーチン管理回路１７１は、その第２コード１２１をＪＩＴコンパイラ１５９でネイティブコード１３１へ変換するため、ＪＩＴコンパイラ１５９による処理をプロセッサ１１３に依頼する（ＳＴ１００５）。
【０１９２】
ＳＴ１００３の判断の結果、サブルーチン管理回路１７１は、第１コード１１９が処理対象のサブルーチンである場合（ＳＴ１００３の判断の結果が“Ｙ”の場合）、又はＳＴ１００５の後、実行対象のサブルーチンに関するヘッダキャッシュ２０５のエントリのうち、処理ステート欄２８０のデータに含まれる処理状態フラグを“１”に設定する（ＳＴ１００６）。なお、サブルーチンの第１コード１１９に関するエントリの処理状態フラグを“１”に設定することにより、この第１コード１１９は、後述のプリコンパイル回路１７３によるプリコンパイル処理の待ち状態に設定される。
【０１９３】
図１２は、プリコンパイル時における実行コード処理部１２３の動作のフローチャートを示す。本フローチャートに示す動作は、コンテンツ１０７の実行が開始された後、ヘッダキャッシュ入れ替え処理（図９のＳＴ８０８）やヘッダ情報２６７の更新処理（図９のＳＴ８１０）によって、ヘッダキャッシュ２０５のエントリの内容が変化した場合に開始する。また、この動作が行われている間は、ヘッダキャッシュ２０５のエントリの内容が再度変化しても、同様の動作が重複して行われることはないものとする。
【０１９４】
まず、サブルーチン管理回路１７１は、ヘッダキャッシュ２０５のエントリの内容が変化するのを待ち（ＳＴ１１０１）、エントリの変化を検出すると（ＳＴ１１０１の判断が“Ｙ”の場合）、変化したエントリに対応するサブルーチンのコードタイプが“０”で、且つ処理状態フラグが“１”かどうかを判断する（ＳＴ１１０２）。すなわち、サブルーチン管理回路１７１は、処理対象のサブルーチンがプリコンパイル待ち状態の第１コード１１９であるかどうかを判断する。
【０１９５】
ＳＴ１１０２の判断の結果、処理対象のサブルーチンがプリコンパイル待ち状態の第１コード１１９ではない場合（ＳＴ１１０２の判断が“Ｎ”の場合）、本動作は終了する。
【０１９６】
ＳＴ１１０２の判断の結果、処理対象のサブルーチンがプリコンパイル待ち状態の第１コード１１９である場合（ＳＴ１１０２の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、メモリ１１７の空き容量が十分あるかどうかを調べる（ＳＴ１１０３）。
【０１９７】
メモリ１１７の空き容量が不十分であれば（ＳＴ１１０３の判断が“Ｎ”の場合）、この動作が終了する。メモリ１１７の空き容量の判定方法としては、例えば、メモリ１１７の使用量があらかじめ定めた閾値を超えた場合にメモリ不足と判定するなどの方法を適用することができる。
【０１９８】
メモリ１１７の空き容量が十分あれば（ＳＴ１１０３の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、プリコンパイル制御回路１７５に対し、パラメータの初期設定を行う（ＳＴ１１０４）。このパラメータは、例えば、動作速度定義表３０１の値である。なお、動作速度定義表３０１は、メモリ１１７上に格納されているので、パラメータを設定する処理を省略し、プリコンパイル制御回路１７５が必要に応じてメモリ１１７上の動作速度定義表３０１を参照するように構成してもよい。また、動作速度定義表３０１をキャッシュメモリ１７７上に格納しておき、これを参照するように構成してもよい。このパラメータの設定は、プロセッサ１１３が行うように構成してもよい。パラメータの設定（ＳＴ１１０４）が完了すると、サブルーチン管理回路１７１は、プリコンパイル制御回路１７５を起動する（ＳＴ１１０５）。
【０１９９】
次に、サブルーチン管理回路１７１は、プリコンパイル待ちのサブルーチンの実行コード１４５の優先度を用いてプリコンパイル対象のエントリ選択する（ＳＴ１１０６）。本実施例では、優先度は、ヘッダキャッシュ２０５の処理ステート欄２７７内にある優先度の値を採用することができる。そして、優先度の高いサブルーチンから順に、第１コード１１９を第２コード１２１へ変換するのがよい。なお、プリコンパイル待ち状態のサブルーチンの第１コード１１９が一個しか存在しない場合は、ＳＴ１１０６の判断において、その第１コード１１９が選択されることになる。
【０２００】
サブルーチン管理回路１７１がプリコンパイルの対象エントリを選択した後、プリコンパイル制御回路１７５は、インタプリタ実行のバックグラウンドでプリコンパイルを実行できるシステム状態かどうかを調べる（ＳＴ１１０７）。バックグラウンドで実行できない場合とは、例えば、
（１）バス１０３の負荷（データ伝送量）が予め定めた閾値より高い場合
（２）メモリ１１７を複数搭載する場合において、プリコンパイル対象の第１コード１１９が存在するメモリ１１７へのプロセッサ１１３によるアクセス頻度が、予め定めた閾値より高い場合
などが考えられる。
【０２０１】
プリコンパイルをインタプリタ実行のバックグラウンドで実行できない場合（ＳＴ１１０７の判断が“Ｎ”の場合）は、システム状態が回復するまで待機する。プリコンパイルをインタプリタ実行のバックグラウンドで実行できる場合（ＳＴ１１０７の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、プリコンパイル結果としての第２コード１２１を格納するためのメモリ１１７上のアドレス（プリコンパイル結果格納アドレス）にヘッダ部２５０（図２）を生成する（ＳＴ１１０８）。生成されるヘッダ部２５０の内容は、以下のとおりである。
【０２０２】
（１）コードタイプ：“１”
（２）処理条件：例えば、変換元となる第１コード１１９の処理条件と同じ値
（３）優先度：“０”
（４）処理状態フラグ：“０”
（５）オリジナルコードアドレス：元となる第１コード１１９の先頭アドレス。
【０２０３】
（６）変換済みコードアドレス：null
（７）実行中フラグ：“１”
（８）終了アドレス：この第２コード１２１の終了アドレス
（９）チェックサム：チェックサム（プロセッサ１１３又はサブルーチン管理回路１７１によって計算される）。
【０２０４】
なお、プリコンパイル結果格納アドレスは、メモリ１１７上で、プリコンパイル対象の第１コード１１９が格納されているエリアの直後に設定（図２）すればよいが、コンテンツ１０７のデータを格納するエリアとは別のエリアに設定することも可能である。
【０２０５】
その後、プリコンパイル制御回路１７５は、プリコンパイル回路１７３を起動し（ＳＴ１１０９）、後述（図１４）のプリコンパイル回路１７３の動作速度制御を開始する（ＳＴ１１１０）。
【０２０６】
プリコンパイル制御回路１７５は、プリコンパイル回路１７３の動作速度制御を開始すると、さらにシステム状態を監視し、システム状態が悪化したかどうかを検査する（ＳＴ１１１１）。システム状態が悪化すると（ＳＴ１１１１の判断が“Ｙ”の場合）、プリコンパイル回路１７３によるプリコンパイル処理を一時停止させる（ＳＴ１１１２）。ここで、システム状態の悪化とは、例えば、バス１０３の負荷があらかじめ定めた閾値より高い場合や、メモリ１１７を複数搭載する場合において、プリコンパイル対象の第１コード１１９が存在するメモリ１１７へのプロセッサ１１３によるアクセス頻度が予め定めた基準より高い場合などが考えられる。
【０２０７】
システム状態が悪化しなければ（ＳＴ１１１１の判断が“Ｎ”の場合）、プリコンパイル回路１７１にプリコンパイルを継続させ（ＳＴ１１１３）、プリコンパイルが完了したかどうかを判断する（ＳＴ１１１４）。プリコンパイルが完了していなければ（ＳＴ１１１４の判断が“Ｎ”の場合）、ＳＴ１１１０へ戻る。プリコンパイルが完了した場合（ＳＴ１１１４の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、プリコンパイルを行った第１コード１１９に対応するヘッダキャッシュ２０５上のエントリを更新する（ＳＴ１１１５）。具体的には、更新するエントリの内容は以下のとおりである。
【０２０８】
（１）処理状態フラグ：“２”
（２）変換済みコードアドレス：プリコンパイル結果格納アドレス。
【０２０９】
そして、サブルーチン管理回路１７１は、プリコンパイル待ちの他のサブルーチンのエントリ、すなわちコードタイプが“０”で、且つ処理状態フラグが“１”のエントリがほかにも存在するかどうかを調べる（ＳＴ１１１６）。
【０２１０】
ＳＴ１１１６の判断の結果、プリコンパイル待ちの他のサブルーチンのエントリが存在する場合（ＳＴ１１１６の判断が“Ｙ”の場合）、ＳＴ１１０６へ戻る。プリコンパイル待ちの他のサブルーチンのエントリが存在しない場合（ＳＴ１１０６の判断が“Ｎ”の場合）、プリコンパイル制御回路１７５は、プリコンパイル回路１７１を停止する（ＳＴ１１１７）。そして、プリコンパイル制御回路１７５の動作が停止し（ＳＴ１１１８）、この動作が終了する。
【０２１１】
図１３は、プリコンパイルの開始から終了までの間におけるプリコンパイル回路１７３による処理のフローチャートを示す。この処理は、プリコンパイル制御回路１７５によってプリコンパイル回路１７３が起動されること（図１２のＳＴ１１０９）により開始する。
【０２１２】
プリコンパイル回路１７３は、処理対象のサブルーチンの第１コード１１９のプリコンパイルを開始すると（ＳＴ１２０１）、エラーが発生したかどうかを検出する（ＳＴ１２０２）。エラーが発生した場合（ＳＴ１２０２の判断が“Ｙ”の場合）、途中まで生成したコードを破棄し（ＳＴ１２０３）、プリコンパイル処理を中止する。エラーの内容としては、例えば、第２コード格納用のメモリ領域が不足した場合や、第１コードに不正な値が入っていた等の理由によりコンパイルエラーが発生した場合などの不具合が考えられる。
【０２１３】
一方、プリコンパイルが正常に終了すると（ＳＴ１２０２の判断が“Ｎ”で、ＳＴ１２０４の判断が“Ｙ”の場合）、プリコンパイル回路１７３は、生成した第２コード１２１を、図１２のＳＴ１１０８でメモリ１１７上に生成したヘッダ部２５０の直後へ格納する（ＳＴ１２０５）。メモリ１１７への格納方法としては、プリコンパイルの最中に生成される第２コード１２１をメモリ１１７へ逐次格納するように構成してもよい。また、メインルーチンについては、コンテンツ１０９の実行時に一度しか実行されない場合が多いため、ヘッダ部２５０の処理条件２８０（図２）を“４”に設定し、プリコンパイルを行わず、インタプリタ１５７でのみ実行するように構成するのがよい。
【０２１４】
図１４は、プリコンパイル制御回路１７５によるプリコンパイル回路１７３の動作速度制御処理のフローチャートを示す。
【０２１５】
プリコンパイル制御回路１７５は、プリコンパイル回路１７３が第１コード１１９のプリコンパイルを行う際（例えば、図１２のＳＴ１１１３など）、その第１コード１１９内（例えば、ヘッダ部２５０のなか）にサブルーチン定義値が書き込まれているかどうかを調べる（ＳＴ１３０１）。第１コード１１９内にサブルーチン定義値が存在する場合（ＳＴ１３０１の判断が“Ｙ”の場合）、例外的にその値を、第１コード１１９から第２コード１２１を生成する優先度として抽出し（ＳＴ１３０２）、この優先度を動作速度定義表（図５）に照らして動作速度を抽出する（ＳＴ１３０３）。
【０２１６】
第１コード１１９内にサブルーチン定義値が存在しない場合（ＳＴ１３０１の判断が“Ｎ”の場合）、その第１コード１１９に対応するサブルーチンの優先度を、ヘッダキャッシュ２０５の処理ステート欄２７７から抽出し（ＳＴ１３０４）、取得した優先度を動作速度定義表（図５）に照らし、その優先度に応じた動作速度を抽出する（ＳＴ１３０５）。
【０２１７】
プリコンパイル制御回路１７５は、ＳＴ１３０３又はＳＴ１３０５で抽出した動作速度の値に従って、プリコンパイル回路１７３の動作速度を制御するとともに、動作速度を下げる場合は、プリコンパイル回路１７３の動作を維持できる電圧値の範囲内で同回路１７３への供給電圧値を下げる（ＳＴ１３０６）。
【０２１８】
図１５は、仮想マシン１５３のインタプリタ１５７によるサブルーチンの第１コード１１９のインタプリタ実行処理のフローチャートを示す。本処理は、サブルーチン管理回路１７１がプロセッサ１１３に対してインタプリタ実行を依頼すること（図９のＳＴ８２０）により開始する。
【０２１９】
本処理が開始すると、プロセッサ１１３は、仮想マシン１５３のインタプリタ１５７を起動し、スタックから処理対象の第１コード１１９の先頭アドレスを読み込み（ＳＴ１４０１）、そのアドレスに基づいて、処理対象の第１コード１１９のデータを読み込み（ＳＴ１４０２）、その読み込んだ第１コード１１９のデータを解析しながら逐次実行する（ＳＴ１４０３）。
【０２２０】
図１６は、サブルーチンの第２コード１２１をネイティブコード１３１へ変換する際の、プロセッサ１１３及びサブルーチン管理回路１７１による処理のフローチャートを示す。本処理は、サブルーチン管理回路１７１がプロセッサ１１３に対してＪＩＴコンパイラ１５９によるサブルーチンの第２コード１２１の処理を指示したこと（図１１のＳＴ１００５）により開始する。
【０２２１】
まず、プロセッサ１１３は、メモリ１１７の空き容量が十分かどうかを判断し（ＳＴ１５０１）、メモリ１１７の空き容量が不十分であれば（ＳＴ１５０１の判断が“Ｎ”の場合）、処理対象の第２コード１２１をネイティブコード１３１へ変換せずに本処理が終了する。メモリ１１７の空き容量の判定方法としては、例えば、メモリ１１７の使用量が予め定めた閾値を超えた場合にメモリ不足と判定するなどの方法を適用することができる。
【０２２２】
メモリ１１７の空き容量が十分あれば（ＳＴ１５０１の判断が“Ｙ”の場合）、プロセッサ１１３は、サブルーチン管理プログラム１３３に基づいて、サブルーチン管理回路１７１に対し、コンパイル結果としてのネイティブコード１３１を格納するためのメモリ１１７上のアドレス（コンパイル結果格納アドレス）にヘッダ部２５０（図２）を生成させる（ＳＴ１５０２）。生成されるヘッダ部２５０の内容は、以下のとおりである。
【０２２３】
（１）コードタイプ：“２”
（２）処理条件：例えば、“null”
（３）優先度：“０”
（４）処理状態フラグ：“０”
（５）オリジナルコードアドレス：変換元となる第２コード１２１の先頭アドレス
（６）変換済みコードアドレス：null
（７）実行中フラグ：“１”
（８）終了アドレス：このネイティブコード１３１の終了アドレス
（９）チェックサム：チェックサム（プロセッサ１１３又はサブルーチン管理回路１７１によって計算される）。
【０２２４】
なお、コンパイル結果格納アドレスは、メモリ１１７上で、コンパイル対象の第２コード１２１の直後に設定（図２）すればよいが、コンテンツ１０７のデータを格納するエリアとは別のエリアに設定することも可能である。
【０２２５】
その後、プロセッサ１１３は、仮想マシン１５３のＪＩＴコンパイラ１５９を起動し、サブルーチン管理回路１７１によって予めスタックにプッシュされている第２コード１２１の先頭アドレスを抽出し、そのアドレスに基づいて取得した第２コード１２１のデータをネイティブコード１３１へ変換し、実行する（ＳＴ１５０３）。なお、本実施例では、処理対象のサブルーチンについて、第１コード１１９のインタプリタ１５７による実行と、第２コード１２１のＪＩＴコンパイラ１５９による実行を別スレッドで同時に行う場合（図９のＳＴ８１８〜ＳＴ８２０）、第１コード１１９のインタプリタ１５７による実行がＪＩＴコンパイラ１５９のネイティブコード１３１の生成より優先される。
【０２２６】
この際、ＪＩＴコンパイラ１５９は、処理対象のサブルーチンの第２コード１２１をネイティブコードに変換する過程において、そのネイティブコード１３１がコンテンツ１０７の実行中に呼び出されたときに実行されるジャンプ先アドレス変換命令２９２（図２）をコード内に記述する。具体的には、ネイティブコード１３１の呼び出し元のサブルーチンの実行コード１４５に記述されている当該ネイティブコード１３１の特殊アドレスを、該ネイティブコード１３１のコード本体２９０の先頭アドレスに置き換えるという内容の命令をコード内に記述する。これにより、コンテンツ１０７の実行中にサブルーチンのネイティブコード１３１が呼び出された場合、プロセッサ１１３は、特殊アドレスではなく、そのネイティブコード１３１のコード本体２９０の先頭アドレスに直接アクセスすることができるため、コンテンツ１０７の実行速度を更に向上させることができる。
【０２２７】
そして、サブルーチン管理回路１７１は、ＪＩＴコンパイラ１５９によって生成されたネイティブコード１３１を、メモリ１１７上に生成したヘッダ部２５０の直後に格納し（ＳＴ１５０４）、元となる第２コード１２１のヘッダキャッシュ２０５内のエントリを以下のとおり更新し、本処理が終了する。
【０２２８】
（１）処理状態フラグ：“２”
（２）変換済みコードアドレス：コンパイル結果格納アドレス。
【０２２９】
図１７は、サブルーチン管理回路１７１によるコンテンツ終了処理のフローチャートを示す。この処理は、例えば、ユーザによってコンテンツ１０７の終了が指示されたとき、或るコンテンツ１０７の実行中に、別のコンテンツを実行するとき（図６のＳＴ６１０）又はサーバから別のコンテンツをダウンロードして実行するとき（図６のＳＴ６１０）のいずれかのタイミングで実行される。実施例の携帯電話機１０１は携帯型の組込み機器であるため、プロセッサ１１３やメモリ１１７等のハードウェア１０５のリソースが厳しく制限されるため、別のコンテンツを実行する際には、この終了処理を行うことにより、実行中のコンテンツ１０７を強制的に終了して、メモリ１１７等のリソースを開放する。
【０２３０】
まず、コンテンツ１０７の終了が指示されると、ヘッダキャッシュ２０５から終了するコンテンツ１０７に対応するエントリをメモリ１１７上にある対応する実行コード１４５のヘッダ部２５０へ書き戻す（ＳＴ１６０１）。そして、メモリ１１７の空き容量が十分にあるかどうかを検査する（ＳＴ１６０２）。容量が十分ある状態とは、例えば、別のコンテンツをメモリ１１７上にロードできるだけの容量が空いていることをいう。メモリ１１７上に十分な空き容量がある場合（ＳＴ１６０２の判断が“Ｙ”の場合）、コンテンツ終了処理を終了する。
【０２３１】
メモリ１１７上に十分な空き容量がない場合（ＳＴ１６０２の判断が“Ｎ”の場合）、不揮発性記録媒体１１５内にこのコンテンツ１０７が存在するかどうかを判断する（ＳＴ１６０３）。不揮発性記録媒体１１５内にこのコンテンツ１０７が存在する場合（ＳＴ１６０３の判断が“Ｙ”の場合）、このコンテンツ１０７をメモリ１１７上から削除し（ＳＴ１６０４）、コンテンツ終了処理を終了する。
【０２３２】
不揮発性記録媒体１１５内にこのコンテンツ１０７が存在しない場合（ＳＴ１６０３の判断が“Ｎ”の場合）、ユーザによる保存の指示があったかどうかを判断する（ＳＴ１６０５）。ユーザによる保存の指示があった場合（ＳＴ１６０５の判断が“Ｙ”の場合）、不揮発性記録媒体１１５にコンテンツ１０７を保存し（ＳＴ１６０６）、そのコンテンツ１０７をメモリ１１７上から削除し（ＳＴ１６０４）、コンテンツ終了処理を終了する。
【０２３３】
一方、ユーザによる保存の指示がなかった場合（ＳＴ１６０５の判断が“Ｎ”の場合）、コンテンツ１０７をメモリ１１７上から削除し（ＳＴ１６０４）、コンテンツ終了処理を終了する。なお、ＳＴ１６０４の処理では、サブルーチン共用表２４３に基づいて、終了するコンテンツ１０７の実行コード１４５が他のコンテンツとの間で共用されていると判断される場合、その共用されている実行コード１４５をメモリ１１７上に保持するように構成することができる。
【０２３４】
なお、ＳＴ１６０２〜ＳＴ１６０６の処理は、プロセッサ１１３が行うように構成してもよい。
【０２３５】
以上の説明（図１〜図１７）を整理すると、実施例の携帯電話機１０１は、以下の構成を有する。
【０２３６】
（１）スクリプト或いはＪａｖａプログラム（コンテンツ）１０７に含まれる複数のサブルーチンごとに、プロセッサ１１３で実行可能なネイティブコード１３１、ネイティブコード１３１の元となるＯＳ１２７に依存しない第１コード１１９、及び第１コード１１９をネイティブコード１３１へ変換する過程で生成される第２コード１２１のうち、少なくともいずれか１種類の実行コード１４５を記憶するメモリ１１７であって、その実行コード１４５は、該当する種類を表すコードタイプが記述されたコード情報格納部としてのヘッダ部２５０を有するとともに、他のサブルーチンへのジャンプ先アドレスとして特殊アドレスが記述されており、その特殊アドレスは、特殊アドレス識別子と上記他のサブルーチンの先頭アドレスを含む、メモリを備える。また、このメモリ１１７には、サブルーチンごとに定められる第１コード１１９を第２コード１２１へ変換する優先度に応じて、プリコンパイル回路１７３の動作速度を定めた動作速度定義表３０１（図５）が記憶される。
【０２３７】
（２）各サブルーチンの実行コード１４５のヘッダ部２５０の内容をヘッダキャッシュ２０５として記憶するキャッシュメモリ１７７を備える。
【０２３８】
（３）第１コード１１９をインタプリタ方式で実行するインタプリタ１５７、及び第２コード１２１をコンパイルしてから実行するＪＩＴコンパイラ１５９を有する仮想マシン１５３を備える。
【０２３９】
（４）第１コード１１９から第２コード１２１を生成するプリコンパイル回路１７３を備える。
【０２４０】
（５）スクリプト或いはＪａｖａプログラム１０７の実行中にプロセッサ１１３がアクセスしたアドレスに特殊アドレス識別子が含まれている場合に特殊アドレスであると判断し、メモリ１１７上に当該他のサブルーチンの実行コード１４５として、ネイティブコード１３１が記憶されていれば、そのネイティブコードがプロセッサ１３１で実行されるように第１の実行制御を行い、ネイティブコード１３１が記憶されておらず第２コード１２１が記憶されていれば、その第２コード１２１が仮想マシン１５３のＪＩＴコンパイル機能（ＪＩＴコンパイラ１５９）で実行され、生成されたネイティブコード１３１がメモリ１１７に格納されるように第２の実行制御を行い、第１コード１１９だけが記憶されていれば、その第１コード１１９が仮想マシン１５３のインタプリタ機能（インタプリタ１５７）で実行されるとともに、プリコンパイル回路１７３で第２コード１２１に変換され、その第２コード１２１がメモリ１１７に格納されるように第３の実行制御を行うサブルーチン管理手段（サブルーチン管理プログラム１３３を実行するプロセッサ１１３がサブルーチン管理回路１７１を制御するこで実現する手段）を備える。このサブルーチン管理手段は、コード情報格納部としてのヘッダ部２５０に記述されているコードタイプを利用して第１乃至第３の実行制御を切り替えている。
【０２４１】
（６）サブルーチン管理回路１７１は、サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもとで、第１又は第２の実行制御によりサブルーチンの実行コード１４５が変換されたときは、その実行コード１４５のヘッダ部２５０に変換後の実行コード１４５の先頭アドレスが記述されるように記録制御を行う。また、サブルーチン管理回路１７１は、スクリプト或いはＪａｖａプログラム１０７の実行中にプロセッサ１１３がアクセスしたアドレスに特殊アドレス識別子が含まれている場合に特殊アドレスであると判断し、当該他のサブルーチンの実行コード１４５のヘッダ部２５０を検査し、第１コード１１９を表すコードタイプが記述されており、且つ第２コード１２１の先頭アドレスが記述されていないときは、第３の実行制御を行い、第１コード１１９を表すコードタイプが記述されており、且つ第２コード１２１の先頭アドレスが記述されており、且つ該先頭アドレスで特定される第２コード１２１のヘッダ部２５０にネイティブコード１３１の先頭アドレスが記述されていないときは、第２の実行制御を行い、第１コード１１９を表すコードタイプが記述されており、且つ第２コード１２１の先頭アドレスが記述されており、且つ該先頭アドレスで特定される第２コード１２１のヘッダ部２５０にネイティブコード１３１の先頭アドレスが記述されているときは、第１の実行制御を行う。
【０２４２】
（７）サブルーチン管理回路１７１は、サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもとで、第３の実行制御を行う際、サブルーチンごとに定められる第１コード１１９を第２コード１２１へ変換する優先度に基づいて、プリコンパイル回路１７３を制御する。なお、サブルーチンごとの優先度のデータは、キャッシュメモリ１７７上のヘッダキャッシュ２０５に記憶されており、サブルーチン管理回路１７１は、これを参照して優先度を判断することができる。
【０２４３】
（８）プリコンパイル回路１７３で処理される第１コード１１９に対応するサブルーチンの優先度を用いて、動作速度定義表３０１から動作速度を判断し、その動作速度に従ってプリコンパイル回路１７３が動作するように制御を行うプリコンパイル制御手段（プリコンパイル制御プログラム１３５を実行するプロセッサ１１３がプリコンパイル制御回路１７５を制御することで実現する手段）を備える。また、プリコンパイル制御回路１７５は、プリコンパイル回路１７３の動作速度を下げたとき、プリコンパイル回路１７３への供給電圧を、その動作を維持できる電圧値の範囲内で下げる。実施例では、優先度として、コンテンツ１０７の実行中に呼び出されたサブルーチンごとの回数を採用している。
【０２４４】
（９）サブルーチン管理回路１７１は、サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもとで、コンテンツ１０７の実行中にサブルーチンのネイティブコード１３１が呼び出された場合、その呼び出し元のサブルーチンの実行コード１４５に記述されているジャンプ先アドレスを表す特殊アドレスを、そのネイティブコード１３１のコード本体２９０の先頭アドレスに置き換える。具体的には、サブルーチンの第２コード１２１が仮想マシン１５３のＪＩＴコンパイラ１５９でネイティブコード１３１に変換される過程において、そのネイティブコード１３１がコンテンツ１０７の実行中に呼び出されたときに実行されるジャンプ先アドレス変換命令２９２（図２）がコード内に記述されるように構成する。その命令は、そのネイティブコード１３１の呼び出し元であるサブルーチンの実行コード１４５に記述されている当該ネイティブコード１３１の特殊アドレスを、そのネイティブコード１３１のコード本体２９０の先頭アドレスに置き換えるという内容の命令である。例えば、このジャンプ先アドレス変換命令２９２は、サブルーチン管理プログラム１３３の処理の一部を用いて記述されるように構成してもよいし、これとは別にプロセッサ１１３によって実行される専用のプログラムを用いて記述されるように構成することもできる。また、ジャンプ先アドレス変換命令２９２がネイティブコード１３１内に記述される構成を採用しない構成、例えば、ネイティブコード１３１が実行されるたびに、プロセッサ１１３又はサブルーチン管理回路１７１が所定のプログラムを実行し、その呼び出し元のサブルーチンの実行コード１４５に記述されている当該ネイティブコード１３１の特殊アドレスを、当該ネイティブコード１３１のコード本体２９０の先頭アドレスに書き換える構成を採用することもできる。
【０２４５】
（１０）メモリ１１７は、各サブルーチンの第１コード１１９のサイズを管理する第１コードサイズ管理表２３９を記憶しており、サブルーチン管理回路１７１は、サブルーチン管理プログラム１３３を実行するプロセッサ１１３の制御のもとで、第３の実行制御によりサブルーチンの第１コード１１９が第２コード１２１に変換されたとき、その第２コード１２１に関するヘッダキャッシュ２０５のエントリに、変換元となる第１コード１１９の先頭アドレスが記述されるように記録制御を行う。そして、第２の実行制御の対象となる第２コード１２１の変換元の第１コード１１９のサイズを第１コードサイズ管理表から抽出した結果、そのサイズが所定の値より大きいときは、その第２コード１２１が仮想マシン１５３のＪＩＴコンパイラ１５９でネイティブコードに変換されてメモリ１１７に格納されるとともに、その第２コード１２１のヘッダ部２５０に記述されている変換元の第１コード１１９の先頭アドレスに基づいて、その第１コード１１９が別スレッドでインタプリタ１５７で実行されるように前記第２の実行制御を行う。
【０２４６】
以上のように、本実施例では、各サブルーチンの実行コード１４５内に、他のサブルーチンの先頭アドレス及び当該先頭アドレスで特定されるサブルーチンが実行コード１４５の種類に応じて処理される必要があることを示す特殊アドレス識別子を含んで構成された特殊アドレスを記述しておき、さらに該当する実行コード１４５の種類を表すコードタイプをヘッダ部２５０に記述しておき、ヘッダ部２５０の情報をキャッシュメモリ１７７上のヘッダキャッシュ２０５に格納する。これにより、プロセッサ１１３がその特殊アドレスにアクセスすると、サブルーチン管理回路１７１は、サブルーチンの呼び出しが発生したことを検出し、メモリ１１７内を検索することなく、特殊アドレスに含まれる先頭アドレスで特定される実行コード１４５に関するヘッダキャッシュ２０５内のエントリに記述されたコードタイプに基づいて、その実行コード１４５の種類に応じた処理が行われるように制御を行う。このように、コンパイル状況の確認及び処理対象の実行コード１４５の先頭アドレスの判断のためのメモリ１１７内の検索が不要となり、コンテンツ１０７の実行速度を格段に向上することができる。
【０２４７】
また、コンテンツ１０７の実行中にネイティブコード１３１が呼び出された場合、呼び出し元のサブルーチンの実行コード１４５内に記述された特殊アドレスがネイティブコード１３１のコード本体２９０の先頭アドレスに書き換えられるため、同じ呼び出し元からの呼び出しが再び発生したときには、ネイティブコード１３１のコード本体２９０の先頭アドレスに直接アクセスできるため、コンテンツ１０７の実行速度が向上する。
【０２４８】
さらに、第１コード１１９を第２コード１２１へ変換する処理（プリコンパイル）を、プリコンパイル専用の回路（プリコンパイル回路１７３）を用いて行うことにより、インタプリタ１５７による第１コード１１９の処理とは完全に独立した状態（プロセッサ１１３が使用されない状態）で、プリコンパイルを行うことができる。従って、プリコンパイルとインタプリタ１５７による各処理を同時に実行しても、いずれも処理速度が低下することがない。さらに、ＪＩＴコンパイラ１５９は、予めプリコンパイルされた第２コード１２１をコンパイルすることになるため、ＪＩＴコンパイルの処理速度の向上を図ることができる。
［実施例２］
【０２４９】
次に、実施例２として、本発明を適用した携帯電話機１０１を用いて、コンテンツ配信サーバ１７０１から既存コンテンツ１０７又は新しいコンテンツ１７０３のデータを受信する方法を説明する。実施例２においては、実施例１で説明した携帯電話機１０１の機能については説明を省略するとともに、同じ要素については同一の符号を付した。
【０２５０】
図１８は、携帯電話機１０１及びコンテンツ配信サーバ１７０１のそれぞれの構成及び連携方法を示す。携帯電話機１０１とコンテンツ配信サーバ１７０１は、インターネット等の通信ネットワークを介して接続される。
【０２５１】
携帯電話機１０１は、サブルーチン管理表２０３のうち、ハッシュ値管理表２３７及びダウンロード元管理表２４１については、これらを組み合わせて構成したクライアントサブルーチンリスト１７０５として有している。
【０２５２】
クライアントサブルーチンリスト１７０５は、各サブルーチンのダウンロード元のＵＲＬ（サーバＵＲＬ）、サブルーチンＩＤ、ハッシュ値、及びサーバ通知状況を格納する。実施例２では、サブルーチンＩＤ、サブルーチン名、及びハッシュ値は、コンテンツ配信サーバ１７０１側でサブルーチンごとに付与される。
【０２５３】
コンテンツ配信サーバ１７０１は、複数のコンテンツ１０７，１７０３等のほかに、
コンテンツ１０７，１７０３に含まれるサブルーチンごとに、サブルーチンＩＤ、サブルーチン名、及びハッシュ値を管理するサーバサブルーチンリスト１７０７と、
各サブルーチンに対して一意なＩＤを割り当てるサブルーチンＩＤカウンタ１７０９と、
サーバサブルーチンリスト１７０７に、各サブルーチンの情報が初めて登録されるとき及び変更されたサブルーチンの情報が登録されたときに、そのサブルーチンに対してハッシュ値を生成し、サーバサブルーチンリストへ登録するハッシュ値生成部１７１０と、
Ｗｅｂサーバが通常備える各種機能を有するとともに、携帯電話機１０１との間でコンテンツ等の情報通信を行うために必要な各種機能を有する配信機能部１７１１と
を含んで構成される。
【０２５４】
サーバ側のコンテンツ１７０３も、第１コード１７１３と、テキストデータ及び各種バイナリデータ等で構成されるその他のデータ１７１５によって構成される。
【０２５５】
ハッシュ値生成部１７１０によるハッシュ値の生成方法としては、例えば、各サブルーチンの第１コード１７１３の全文に基づいてハッシュ関数を用いて生成する方式、又は各第１コード１７１３の改変を検出できる最小限の間隔で抽出した１バイトの値に基づいてハッシュ関数を用いて生成する方式が適用可能である。上記改変を検出できる最小限の間隔は、例えば、数バイトから数十バイトの間隔である。
【０２５６】
また、コンテンツ配信サーバ１７０１は、コンテンツ１０７，１７０３等のコンテンツＩＤとこれらに含まれるサブルーチンごとのサブルーチンＩＤとを管理する、コンテンツ管理表（図２）２０１と同様のサーバコンテンツ表（図示省略）を備えている。コンテンツ配信サーバ１７０１は、携帯電話機１０１へコンテンツ１０７，１７０３のサブルーチンの第１コード１１９，１７１３等のデータを送信する際に、各サブルーチンに対応するコンテンツＩＤの情報も併せて送信する。
【０２５７】
次に、図１８及び図１９を用いて、携帯電話機１０１がコンテンツ配信サーバ１７０１からコンテンツ１０７，１７０３のデータをダウンロードする方法を説明する。図１８には、図１９で説明する処理を図示したので、適時参照されたい。
【０２５８】
図１９は、携帯電話機１０１のサブルーチン管理回路１７１（図１）によるコンテンツ登録処理のフローチャートを示す。この処理は、ユーザの指示により、携帯電話機１０１からコンテンツ配信サーバ１７０１側へコンテンツの配信を要求した場合に実行される。具体的には、ユーザが携帯電話機１０１を用いて、ダウンロード可能な複数のコンテンツ１０７，１７０３等が表示されたウェブサイトへアクセスし、所望のコンテンツをダウンロードする操作を行った場合に実行される。
【０２５９】
まず、サブルーチン管理回路１７１は、ユーザの指示に応じて、コンテンツ配信サーバ１７０１に対し、ダウンロードしようとするコンテンツに関するサーバサブルーチンリスト１７０７の情報の送信を要求し（ＳＴ１８０１）、その情報が送信されるまで待機する（ＳＴ１８０２）。
【０２６０】
サーバサブルーチンリスト１７０７の情報を受信すると（ＳＴ１７０２の判断が“Ｙ”の場合）、サーバサブルーチンリスト１７０７とクライアントサブルーチンリスト１７０５とを比較し、ハッシュ値に基づいて、両リスト１７０５，１７０７内で重複するサブルーチンを検出する（ＳＴ１８０３）。ここで、重複するサブルーチンがない場合、そのコンテンツは、新しくダウンロードするコンテンツ１７０３である。
【０２６１】
一方、重複するサブルーチンが存在する場合、ダウンロードしようとしているコンテンツは、既に携帯電話機１０１にダウンロードされているが、そのダウンロードの後に修正され若しくは追加されたサブルーチンを含むコンテンツ１０７、又は携帯電話機１０１にダウンロードされていないが、幾つかのサブルーチンが既にインストールされている別のコンテンツとの間で共用されているコンテンツ１７０３である。
【０２６２】
サブルーチン管理回路１７１は、ＳＴ１８０３で検出したサブルーチンの重複情報をコンテンツ配信サーバ１７０１へ通知し（ＳＴ１８０４）、サーバ側から送信されるデータの受信が開始するまで待機する（ＳＴ１８０５）。コンテンツ配信サーバ１７０１からは、重複しないサブルーチンの第１コード１１９，１７１３等のデータが送信される。サブルーチン管理回路１７１は、受信を開始すると（ＳＴ１８０５の判断が“Ｙ”の場合）、そのデータを不揮発性記録媒体１１５へダウンロードする（ＳＴ１８０６）。そして、ダウンロードが完了すると、ダウンロードしたデータをメモリ１１７上に転送する（ＳＴ１８０７）。
【０２６３】
次に、サブルーチン管理回路１７１は、ダウンロードしたデータが、新しいコンテンツのデータかどうかを判断する（ＳＴ１８０８）。そして、新しいコンテンツ１７０３のデータ１７１３，１７１５をダウンロードした場合（ＳＴ１８０８の判断が“Ｙ”の場合）、そのコンテンツ１７０３にコンテンツＩＤを割り当て、コンテンツ管理表２０１（図４）にその情報を登録する（ＳＴ１８０９）。この際、既存のコンテンツ１０７との間で幾つかのサブルーチンを共用することになった場合、その共用関係を動的にライブラリ化する（サブルーチン共用表２４３に登録する）ように構成しておくのがよい。
【０２６４】
既存のコンテンツ１０７のデータをダウンロードした場合（ＳＴ１８０８の判断が“Ｎ”の場合）、又はＳＴ１８０９の後、サブルーチン管理手段を構成するサブルーチン管理回路１７１は、ダウンロードしたコンテンツ１７０３の各サブルーチンに関する情報に基づいて、クライアントサブルーチンリスト１７０５を更新する（ＳＴ１８１１）。具体的には、クライアントサブルーチンリスト１７０５の各項目に対して以下の値を格納する。
【０２６５】
（１）サーバＵＲＬ欄：ダウンロード元であるコンテンツ配信サーバ１７０１のＵＲＬを格納する
（２）サブルーチンＩＤ欄：サーバで割り当てられたサブルーチンＩＤを格納する
（３）ハッシュ値欄：サーバから受信したサーバサブルーチンリストの情報に基づいて、ハッシュ値を格納する
（４）サーバ通知欄：ＳＴ１８０４で重複するサブルーチンとして通知された場合は、“yes”に設定する。新たにダウンロードしたサブルーチンの場合は、“no”に設定する。
【０２６６】
上記の構成によれば、携帯電話機１０１でコンテンツ１０７，１７０３をダウンロードするとき、そのコンテンツ１０７，１７０３に含まれる各サブルーチンの識別子（ここではハッシュ値）を用いて、サブルーチン単位でダウンロード済みかどうかを判断することができる。そして、ダウンロード済みのサブルーチンに関する情報をコンテンツ配信サーバ１７０１へ通知し、サーバ側で重複しない（未送信の）サブルーチンを特定して送信するように構成することにより、必要なデータだけをダウンロードすることができ、コンテンツ１０７，１７０３のダウンロード時の通信量を大幅に削減することができる。
【０２６７】
また、携帯電話機１０１では、クライアントサブルーチンリスト１７０５内でサブルーチンの重複情報の通知の有無をフラグ（サーバ通知）で管理しているため、コンテンツのダウンロード時にコンテンツ配信サーバ１７０１から送信されるサーバサブルーチンリスト１７０７への返答の際には、未通知の重複情報だけを送信すればよくなり、通信量を削減することができる。
【０２６８】
さらに、コンテンツ配信サーバ１７０１側で、携帯電話機１０１から送信されるサブルーチンの重複情報を携帯電話機１０１等の端末別に管理するのがよい。これにより、それ以降のコンテンツ１０７，１７０３等のダウンロード時には、そのコンテンツに関するサーバサブルーチンリスト１７０７のうち、未送信の情報だけを携帯電話機１０１側へ送信すればよくなり、通信量を削減することができる。
【０２６９】
以上、本発明の実施例を説明したが、実現可能な実施形態はこれに限られない。以下、本発明の実施形態の変形例を示す。
［画像処理用の実行コードを含む場合］
【０２７０】
図２０は、実行対象のコンテンツ１０７に画像処理プログラムが含まれる場合における、実行コード処理部１２３による処理のフローチャートを示す。
【０２７１】
プリコンパイル回路１７３は、サブルーチン管理回路１７１によって選択されたサブルーチンの第１コード１１９のデータ（例えば、ループ単位や関数単位のデータ）をメモリ１１７から取得すると（ＳＴ１９０１）、画像処理用コードパターンに一致するかどうかを検査する（ＳＴ１９０２）。この検査においては、例えば、画像処理プログラムのサブルーチンの実行コードを表す幾つかのパターンを予めメモリ１１７上に又はキャッシュメモリ１７７上に記憶させておき、必要に応じて参照するのがよい。
【０２７２】
上記検査の結果、処理対象の第１コード１１９のデータが画像処理用コードパターンに一致した場合（ＳＴ１９０２の判断が“Ｙ”の場合）、サブルーチン管理回路１７１は、その第１コード１１９に基づいてシェーダを生成し（ＳＴ１９０３）、周辺機能部１１１内の映像処理モジュール（図示省略。例えば、ＧＰＵ［Graphics Processing Unit］）へ転送する（ＳＴ１９０４）。
【０２７３】
一方、上記の検査の結果、処理対象の第１コード１１９のデータが画像処理用コードパターンに一致しなかった場合（ＳＴ１９０２の判断が“Ｎ”の場合）、プリコンパイル回路１７３は、その第１コード１１９についてプリコンパイルを実行する（ＳＴ１９０５）。このプリコンパイルの処理は、図１３で説明した方法で行われる。
【０２７４】
このように、画像処理用コードを映像処理モジュールで処理させることで、プロセッサ１１３の処理量を軽減することができる。
［ジャンプ先アドレス変換命令２９２（図２）の記述方法］
実施例では、ＪＩＴコンパイラ１５９で第２コード１２１をネイティブコード１３１に変換する過程において、ジャンプ先アドレス変換命令２９２をコード内に記述していたが、これに限られず、以下の方法で記述することもできる。
【０２７５】
（１）第１コード１１９の作成時（ソースコードの作成時など）に、プログラマによって、その第１コード１１９のコード本体２９０に記述する
（２）第１コード１１９の作成時に、ソースコードから第１コード１１９を生成するためのプログラム（コンパイラなど）を用いて、その第１コード１１９のコード本体２９０に記述する
（３）プリコンパイル回路１７３で第１コード１１９を第２コード１２１へ変換する過程において、サブルーチン管理手段による制御のもとで、そのコード内のコード本体２９０に相当する箇所に記述する
（４）コンテンツ転送処理（図７）の過程において、サブルーチン管理手段による制御のもとで、各サブルーチンの実行コード１４５のコード本体２９０に記述する。
［情報処理装置の例］
【０２７６】
上記実施例では、本発明を携帯電話機に適用したが、本発明は、各種の情報処理装置に適用が可能である。特に、ＰＣと比較して、ＣＰＵの処理速度、メモリの容量、及び画像表示能力など、実装可能な各種デバイスの能力が厳しく制限されるいわゆる組込み機器に適用すれば、本発明の効果が一層高まる。組込み機器の例としては、例えば、ＰＤＡや携帯ゲーム機等の携帯情報端末、携帯電話機、カーナビゲーション装置、家庭用電話機、家庭用ゲーム機、テレビ受像機、ＨＤＤレコーダ等の個人用機器、及びカラオケ機器、ロボット、鉄道等の輸送機器、ロケット、プラント制御装置等の業務用機器が挙げられる。これらのなかでも、携帯用に作られた組込み機器は、上記リソースの制限の問題が大きいため、本発明を適用するのが特に好ましい。
［キャッシュメモリを用いない構成］
【０２７７】
実施例では、キャッシュメモリ１７７上にヘッダキャッシュ２０５を持ち、このキャッシュ上で各サブルーチンの実行コード１４５の優先度の検索等の処理を行ったが、キャッシュメモリ１７７を備えない構成も可能である。この場合、ヘッダキャッシュ２０５を用いて行う処理に替えて、メモリ１１７上の各サブルーチンの実行コード１４５のヘッダ部２５０のデータを用いて前述の各種の処理を行えばよい。具体的には、サブルーチン管理手段は、キャッシュメモリ１７７上のヘッダキャッシュ２０５に替えて、メモリ１１７上のヘッダ部２５０のデータに基づいて第１乃至第３の実行制御を行い、また、メモリ１１７上のヘッダ部２５０に対して記録制御を行うように構成すればよい。
［ＪＩＴコンパイルの方法］
【０２７８】
実施例では、仮想マシン１２９のＪＩＴコンパイラ１５９は、実行対象のサブルーチン（第２コード１２１）をネイティブコード１３１へ変換するだけであったが、次のような処理も可能である。すなわち、ＪＩＴコンパイラ１５９は、実行対象のサブルーチンの実行過程で参照される他のサブルーチンがあるときは、その第１コード１１９、第２コード１２１、又はネイティブコード１３１を参照元のサブルーチンの第２コード１２１内にインライン展開し、これをネイティブコード１３１へ変換することができる。
［プリコンパイルの方法］
【０２７９】
実施例では、プリコンパイルの方法として、サブルーチンの実行過程で参照される他のサブルーチンの第１コードを、参照元のサブルーチンの第１コード内にインライン展開する方法を示したが、この処理をさらに細かく制御することも可能である。例えば、第１コード１１９等の各サブルーチンの実行コード１４５のサイズを、サブルーチン管理表２０３若しくはヘッダキャッシュ２０５で管理することにより、又は第１コード１１９の所定の箇所（例えば、ヘッダ部２５０）に記述することにより、予め定めた閾値より容量の小さい第１コード１１９だけをインライン展開することも可能である。
［プロセッサ１１３との接続方法］
【０２８０】
周辺機能部１１１とプロセッサ１１３間、サブルーチン管理回路１７１とプロセッサ１１３間など、各種のハードウェア１０５間を、バス１０３を介さずに直結することも可能である。特に、サブルーチン管理回路１７１内のヘッダキャッシュ２０５は、サブルーチンの呼び出しのたびにプロセッサ１１３によって参照されるため、サブルーチン管理回路１７１とプロセッサ１１３間を直結すれば、アクセス速度の向上及びバス１０３の負荷の低減を図ることができる。
［実行コード処理部１２３の構成］
【０２８１】
実施例では、実行コード処理部１２３の構成として、サブルーチン管理回路１７１、プリコンパイル回路１７３、及びプリコンパイル制御回路１７５をそれぞれ別個に図示したが、これに限られない。これら三つの回路は、任意に組み合わせて１個の回路として又は２個の回路として構成することもできる。
［優先度］
【０２８２】
優先度の変形例としては、以下の値を採用することができる。
（１）コンテンツ１０７の実行中に各サブルーチンの実行コード１４５が呼び出された際のメモリ１１７のスタックフレームの数を所定の値から減じた値
（２）各サブルーチンを共用しているコンテンツ１０７の数
（３）各サブルーチンの処理内容に応じて定められた値。
【０２８３】
上記（１）の値を採用する場合、各サブルーチンに関する上記スタックフレームの数が、サブルーチン管理手段を構成するサブルーチン管理回路１７１によって、各サブルーチンの実行コード１４５のヘッダ部２５０又はヘッダキャッシュ２０５に書き込まれるように構成しておくのがよい。また、実施例における動作速度定義表３０１で定めた動作速度の値を基準にして、プリコンパイル回路１７３の動作速度が適切となるように、上記所定の値を調整するのがよい。或いは、これとは逆に、所定の値に基づいて算出される優先度を基準とし、動作速度定義表３０１における動作速度の値を調整してもよい。いずれの場合においても、プリコンパイル制御回路１７５は、各サブルーチンの実行コード１４５のヘッダ部２５０又はヘッダキャッシュ２０５に書き込まれている優先度を用いて、動作速度定義表３０１から動作速度を判断し、この動作速度でプリコンパイル回路１７３を動作させることができる。
【０２８４】
この変形例においては、例えば、複数のサブルーチンが入れ子になっている場合、最後のほうで参照されるサブルーチンについては、そのスタックフレームが未処理の複数のサブルーチンのスタックフレーム上にプッシュされ（積み上げられ）るため、スタックフレームの数が大きくなり、これを所定の値から減じると、結果的に小さな値が得られる。これとは逆に、頻繁に参照され（早い段階で呼び出され）るサブルーチンについては、スタックフレームの数が小さくなり、これを所定の値から減じると、結果的に大きな値が得られる。従って、早くプリコンパイルすべきである頻繁に参照されるサブルーチンの優先度が高くなり、プリコンパイルを急ぐ必要のないあまり参照されないサブルーチンの優先度が低くなる。これにより、プリコンパイルの優先度の低いサブルーチンをプリコンパイルする際には、プリコンパイル回路１７５の動作速度を落とすことにより、消費電力を低く抑えることができる。
【０２８５】
上記（２）の値を採用する場合、サブルーチンと複数のコンテンツ１０７との対応関係を表すサブルーチン共用表２４３（図２）を、メモリ１１７上に又はキャッシュメモリ１７７上に持たせておく。そして、サブルーチン管理回路１７１は、複数のコンテンツ１０７を同時に実行する場合において、いずれかのコンテンツ１０７の実行中にサブルーチンが呼び出されたが、処理待ちのサブルーチンの第１コード１１９があるときは、サブルーチン共用表２４３に基づいて、それらのサブルーチンのうち対応するコンテンツ１０７の数が多いサブルーチンから順に、プリコンパイル回路１７３がその第１コードから第２コードを生成するように制御を行うのがよい。
【０２８６】
上記（３）の値を採用する場合、サブルーチンの第１コード１１９内の所定の箇所（コード本体２９０やヘッダ部２５０）に、当該サブルーチンが実行されることにより実現される処理の内容を表す属性を予め記載しておく。また、メモリ１１７に、その属性ごとに第１コード１１９から第２コード１２１を生成する優先順位を定めた属性管理表を記憶しておく。そして、コンテンツ１０７の実行中にサブルーチンが呼び出されたが、プリコンパイル待ち（処理状態フラグが“１”）のサブルーチンの第１コード１１９が存在するときは、サブルーチン管理回路１７１は、それらの第１コード１１９に記載された属性を用いて属性管理表から優先順位を特定し、その優先順位に従って第１コード１１９から第２コード１２１が生成されるように第３の実行制御を行うことができる。
【０２８７】
なお、実施例において優先度を用いて説明したその他の処理についても、上記（１）〜（３）の値を用いて実行することができる。
［コンテンツの種類］
【０２８８】
実施例では、実行するコンテンツとして、全体又はその一部にスクリプト又はJavaプログラムを含むプログラムを採用しているが、一部又は全体がスクリプトである任意のコンテンツを採用することができる。ここで、スクリプトは、JS（JavaScript）、PHP（Hypertext Preprocessor）、Perl（Practical Extraction and Report Language）、ActionScript、又はVBScript（Visual Basic Script）等のスクリプト言語で記述されたプログラムを示す。従って、その一部にスクリプトを含むHtmlファイルを扱うことも可能である。これらのプログラムを採用する場合、ソースコードを第１コードとして扱い、前述のように、例えば呼び出し先のサブルーチンの第１コードを、呼び出し元の第１コード内にインライン展開するなどの方法により、第２コードを生成することができる。また、各スクリプトを実行するためのコード実行部１５３をソフトウェアで構成するのがよい。この場合において、いわゆるサーバサイドスクリプトに該当するプログラムを採用する場合には、再生アプリ１２５に又はこれとは別にサーバサイドスクリプトをクライアント端末で実行するための機能を持たせればよい。代替手段としては、コード実行部１５３にWEBサーバの機能を持たせることにより対応可能である。
【０２８９】
また、HTMLファイルを第１コード１１９として扱う場合には、サブルーチン管理回路１７１が特定のタグで囲まれた領域をサブルーチンとして識別できるように構成しておき、識別したサブルーチンごとにハッシュ値を計算しておく構成を採用することができる。これにより、例えば、携帯電話機１０１がコンテンツ１０７としてHTMLファイルをダウンロードする際に、そのハッシュ値に基づいて、変更された（重複しない）サブルーチンを特定し、その変更部分だけをダウンロードすることができる。この方法を採用することにより、差分データの取得処理を高速化することができる。なお、このような処理を利用する組み込みシステムとしては、例えば、予め決められたウェブサイトのデータを定期的に取得するように構成されたＷｅｂ巡回ロボットなどが考えられる。
［キャッシュ更新処理］
【０２９０】
実施例では、ヘッダキャッシュ２０５内の先頭位置から順にエントリを参照し、キャッシュアウトカウント値が“０”又は最小のエントリを１つ検出し、メモリ１１７上にある対応するサブルーチンの実行コード１４５のヘッダ部２５０のデータと入れ替えていたが、次のようなアルゴリズムを採用することができる。すなわち、メモリ１１７へ書き戻す方法としては、ヘッダキャッシュ２０５内を検索し、キャッシュアウトカウントが“０”のエントリを全て書き戻す方法、起動してから一定時間実行されていないコンテンツに対応するエントリを優先的に書き戻す方法がある。ヘッダキャッシュ２０５へデータを格納する方法としては、各サブルーチンから参照される別のサブルーチンを特定する呼び出し関係表を作成しておき、この表に基づいて、呼び出されたサブルーチンとそのサブルーチンから参照される別のサブルーチンの各エントリを格納する方法がある。
［サブルーチン定義値］
【０２９１】
実施例では、第１コード生成時にコンパイラを用いてサブルーチン定義値を第１コード内に埋め込む方法を提示したが、これに限られない。例えば、プログラマ自身がソースコードにサブルーチン定義値を書き込んでもよい。或いは、或るサブルーチンの第１コードから呼び出される別のサブルーチンの数や頻度及び別のサブルーチンからこのサブルーチンが呼び出される回数や頻度を判断してサブルーチン定義値を付与するプログラムを用意し、これを用いてサブルーチン定義値をサブルーチンの第１コード内に書き込んでもよい。そのプログラムは、サブルーチンの第１コードを第２コードへ変換するのに要する時間に基づいてサブルーチンを定義値を付与するものであってもよい。
［プリコンパイルの順序］
【０２９２】
実施例では、プリコンパイル対象の第１コード１１９が複数存在する場合、すなわちコードタイプが“０”で、処理状態フラグが“１”のサブルーチンのエントリが処理待ちの状態で複数存在する場合、優先度の高いサブルーチンから順に第１コード１１９をプリコンパイルしたが、これに限られない。プリコンパイルは、例えば、以下のいずれかの方法で行うことが可能である。
【０２９３】
（１）コンテンツ１０７の実行中にサブルーチンが呼び出されたが、それより前に呼び出されたサブルーチンの第１コード１１９が第２コード１２１へ変換されておらず、処理待ち状態になっているときは、プリコンパイル回路１７３は、それらのサブルーチンのうち最後に呼び出されたサブルーチンの第１コード１１９から順に第２コード１２１へ変換することができる。
【０２９４】
（２）携帯電話機１０１のハードウェア１０５として、コンテンツ１０７に対応する表示物を表示するディスプレイを備えておく。そして、コンテンツ１０７の実行中にサブルーチンが呼び出されたが、それより前に呼び出されたサブルーチンの第１コード１１９から第２コード１２１が生成されておらず、処理待ち状態になっているときは、サブルーチン管理回路１７１は、上記ディスプレイ上で、中央の表示物、最前面の表示物、又は最も大きい表示物に対応するコンテンツに含まれるサブルーチンの第１コード１１９から優先的に第２コード１２１が生成されるように第３の実行制御を行うことができる。
【０２９５】
（３）携帯電話機１０１のハードウェア１０５として、ディスプレイ上に表示される矢印等の指示部を移動させ、及び表示物を指示部によって選択するための操作部をさらに備えておく。そして、コンテンツ１０７の実行中にサブルーチンが呼び出されたが、プリコンパイル待ちのサブルーチンが存在するときは、サブルーチン管理回路１７１は、ディスプレイ上で、指示部と重っている表示物又は指示部によって選択された表示物に対応するコンテンツ１０７に含まれるサブルーチンの第１コード１１９から優先的に第２コード１２１が生成されるように第３の実行制御を行うことができる。
【図面の簡単な説明】
【０２９６】
【図１】本発明を適用した携帯電話機の基本構成を示す図。
【図２】コンテンツの実行時におけるメモリ及び不揮発性記録媒体の構成、各サブルーチンの実行コードの構成、並びに特殊アドレスの構成を示す図。
【図３】コードタイプ、処理条件、処理状態フラグ、及び実行中フラグを表すＩＤとそれぞれの意味を示す表。
【図４】メモリに格納されるコンテンツ管理表及びサブルーチン管理表と、キャッシュメモリに格納されるヘッダキャッシュの構成を示す。
【図５】プリコンパイル回路の動作速度を定める動作速度定義表。
【図６】携帯電話機が起動してから停止するまでの間における、プロセッサ及びサブルーチン管理回路の処理のフローチャート。
【図７】サブルーチン管理プログラムを実行するプロセッサの制御のもとでサブルーチン管理回路が行うコンテンツ転送処理のフローチャート。
【図８】メモリ上に格納されるサブルーチンの実行コードごとのアドレスを管理するアドレス管理テーブルの構成を示す図。
【図９】サブルーチン管理プログラムを実行するプロセッサの制御のもとでサブルーチン管理回路が行うコンテンツ実行支援処理のフローチャート。
【図１０】サブルーチン管理プログラムを実行するプロセッサの制御のもとでサブルーチン管理回路により行われるヘッダキャッシュの更新処理のフローチャート。
【図１１】サブルーチン管理プログラムを実行するプロセッサの制御のもとでサブルーチン管理回路により行われる処理内容選択処理のフローチャート。
【図１２】プリコンパイル時における実行コード処理部の動作のフローチャート。
【図１３】プリコンパイルの開始から終了までの間におけるプリコンパイル回路による処理のフローチャート。
【図１４】プリコンパイル制御回路によるプリコンパイル回路の動作速度制御処理のフローチャート。
【図１５】仮想マシンのインタプリタによるサブルーチンの第１コードのインタプリタ実行処理のフローチャート。
【図１６】サブルーチンの第２コードをネイティブコードへ変換する際の、プロセッサ及びサブルーチン管理回路による処理のフローチャート。
【図１７】サブルーチン管理回路によるコンテンツ終了処理のフローチャート。
【図１８】携帯電話機及びコンテンツ配信サーバのそれぞれの構成及び連携方法を示す図。
【図１９】携帯電話機のサブルーチン管理回路によるコンテンツ登録処理のフローチャート。
【図２０】実行対象のコンテンツに画像処理プログラムが含まれる場合における、実行コード処理部による処理のフローチャート。
【符号の説明】
【０２９７】
１０１…携帯電話機
１０３…バス
１０５…ハードウェア
１０７，１３０３…コンテンツ
１０９…ソフトウェア
１１１…周辺機能部
１１３…プロセッサ
１１５…不揮発性記録媒体
１１７…メモリ
１１９，１３１３…第１コード
１２１…第２コード
１２３…実行コード処理部
１２５…再生アプリ
１２７…ＯＳ、１２９…仮想マシン
１３１…ネイティブコード
１３３…サブルーチン管理プログラム
１３５…プリコンパイル制御プログラム
１５３…仮想マシン
１５９…ＪＩＴコンパイラ
１７１…サブルーチン管理回路
１７３…プリコンパイル回路
１７７…連想メモリ
２０１…コンテンツ管理表
２０３…サブルーチン管理表
２０５…ヘッダキャッシュ
２３７…ハッシュ値管理表
２３９…第１コードサイズ管理表
２４１…ダウンロード元管理表
２４３…サブルーチン共用表
３０１…動作速度定義表
１３０１…コンテンツ配信サーバ
１３０５…クライアントサブルーチンリスト
１３０７…サーバサブルーチンリスト
【図１】
2009211187.tif 000003
【図２】
2009211187.tif 000004
【図３】
2009211187.tif 000005
【図４】
2009211187.tif 000006
【図５】
2009211187.tif 000007
【図６】
2009211187.tif 000008
【図７】
2009211187.tif 000009
【図８】
2009211187.tif 000010
【図９】
2009211187.tif 000011
【図１０】
2009211187.tif 000012
【図１１】
2009211187.tif 000013
【図１２】
2009211187.tif 000014
【図１３】
2009211187.tif 000015
【図１４】
2009211187.tif 000016
【図１５】
2009211187.tif 000017
【図１６】
2009211187.tif 000018
【図１７】
2009211187.tif 000019
【図１８】
2009211187.tif 000020
【図１９】
2009211187.tif 000021
【図２０】
2009211187.tif 000022