JP2006134351A - Jitコンパイラを備えた仮想計算機 - Google Patents

Jitコンパイラを備えた仮想計算機 Download PDF

Info

Publication number
JP2006134351A
JP2006134351A JP2005371745A JP2005371745A JP2006134351A JP 2006134351 A JP2006134351 A JP 2006134351A JP 2005371745 A JP2005371745 A JP 2005371745A JP 2005371745 A JP2005371745 A JP 2005371745A JP 2006134351 A JP2006134351 A JP 2006134351A
Authority
JP
Japan
Prior art keywords
code
compiled
native code
processing
virtual machine
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2005371745A
Other languages
English (en)
Inventor
Hiroya Shimura
浩也 志村
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2005371745A priority Critical patent/JP2006134351A/ja
Publication of JP2006134351A publication Critical patent/JP2006134351A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】本発明はJITコンパイラを備えた仮想計算機に関し、限られたメモリ容量で処理の高速化を図り、応答性能の向上を図る。
【解決手段】仮想計算機のバイトコードをソフトウェアで解釈・実行する機能を有し、メモリ上に容量の制限されたネイティブコードの格納領域としてコードキャッシュを持ち、バイトコードを実行する際にバイトコードを仮想計算機が直接実行できるネイティブコードにコンパイルしてコードキャッシュ3に格納した後、そのネイティブコードを実行するJITコンパイラを備え、バイトコードのアドレスから、コンパイルされているか否かを判断するための情報と、コンパイルされたネイティブコードのアドレスを検索する検索テーブル2を備えた。
【選択図】図1

Description

本発明は、携帯電話機や無線通信機能を有する携帯情報端末(PDA)等の携帯型無線通信機器に利用可能なJITコンパイラを備えた仮想計算機に関する。
近年、インターネットの普及によりネットワークを介してプログラムを実行するシステムが実用化されている。特に、Java言語は、携帯電話機上で「i−aPPli」としてプログラムを実行させることのできるものとして急速に広まってきている。
しかし、Java言語は実行させるプラットホームを選ばない仮想計算機のプログラム(以下「バイトコード」と記す)として配付されるため、携帯型無線通信機器のプロセッサでは直接実行することができず、エミュレーション等の技術により実行を行っている。
本発明は、Javaのような仮想計算機のバイトコードを携帯電話機、PDA等に利用し、メモリが少ない携帯型無線通信機器上で高速に動作させることの可能なJITコンパイラを備えた仮想計算機に関する。
(従来例の説明)
以下、従来例について説明する。
(1) :インタプリタの説明
図12は、仮想計算機のコードであるバイトコードを解釈、実行するインタプリタの処理フローチャートである。以下、図12に基づいて、インタプリタの処理を説明する。なお、S1〜S6は各処理ステップを示す。
従来、仮想計算機のバイトコードを実行する手段として、ソフトウェアによりバイトコードを逐次解釈、実行するインタプリタ方式が知られていた。しかし、このインタプリタ方式では、バイトコードの命令を1つずつ実行するため、処理速度が遅い。具体的には次の通りである。
先ず、バイトコードの命令フェッチを行い(S1)、フェッチした命令をデコードする(S2)。そして、デコードした結果が命令の実行であれば、その命令を実行し(S3、S4)、S1の処理へ移行する。また、デコードした結果が分岐であれば分岐処理を行い(S5)、S1の処理へ移行する。更に、デコードした結果がメソッド呼び出しであれば(S6)、メソッド呼び出しを行い(S6)、S1の処理へ移行する。以降、同様にして、命令毎に処理を行う。
(2) :従来一般に使用されているJITコンパイラの説明
図13は、インタプリタとJITコンパイラを組み合わせた時の処理フローチャートである。以下、図13に基づき、インタプリタと、従来一般に使用されているJITコンパイラ(携帯電話機では使用されておらず、パーソナルコンピュータ等で使用されている)を組み合わせた時の処理を説明する。なお、S11〜S20は各処理ステップを示す。また、S11〜S16はインタプリタの処理であり、S17〜S20がJITコンパイラの処理である。
前記インタプリタの処理速度が遅いことを解決する方法として、JIT(Just-IN-Compiler) コンパイラを使う手法が一般に使用されていた。このJITコンパイラはバイトコードをネイティブコードにコンパイルする。これにより、アプリケーションは直接そのマシンのプロセッサで実行できるようになり、高速な実行が可能になる。
一般に、JITコンパイラは、ダウンロードしたクラス、又は実行を開始したメソッドという単位でコンパイルを行う。すなわち、メソッドのバイトコード全体をコンパイルする。また、コンパイルしたネイティブコードは、メモリ(プログラム上の格納領域)上に格納され、再び実行を行う時は再利用され、1度目の実行時には、コンパイルのオーバヘッドがあるが、2度目からはこのオーバヘッド無しに高速に実行できる。具体的には次のようになる。
先ず、バイトコードの命令フェッチを行い(S11)、フェッチした命令をデコードする(S12)。そして、デコードした結果が実行であれば、その命令を実行し(S13、S14)、S11の処理へ移行する。また、デコードした結果が分岐であれば、分岐処理を行い(S15)、S11の処理へ移行する。更に、デコードした結果がメソッド呼び出しであれば、メソッド呼び出しを行い(S16)、コンパイル済みか否かを判断する(S17)。
その結果、コンパイル済みでなければ、コンパイルすべきか否かを判断し(S18)、コンパイルすべきでなければ、S11の処理へ移行するが、コンパイルすべきであれば、メソッドで呼び出したコードをJITコンパイラによりコンパイルしてネイティブコードを生成し、ネイティブコードの格納領域に格納し(S19)、ネイティブコードを実行する(S20)。ネイティブコードの実行中、メソッド呼び出しがあれば、S16の処理へ移行し、メソッドの処理が終了すれば、S11へ移行する。また、S17の処理において、コンパイル済みであれば、S20の処理へ移行する。以降、同様にして処理を行う。
なお、前記バイトコード(bytecode)とは、Javaで開発したソフトのバイナリ表現形式として米サン・マイクロシステムズが定めたJava仮想マシン(仮想計算機)のマシン・コードのことを言う。また、バイトコードをマシンが直接実行できるネイティブコードへ変換するソフトを「JIT(Just-in-time)コンパイラ」と呼ぶ。
また、「メソッド」(Method)とは、オブジェクト指向プログラミングにおいて、オブジェクトの実行する操作の方法を記述したプログラム(サブルーチンと同じ意味)のことを言う。
前記のような従来のものにおいては、次のような課題があった。
すなわち、携帯電話機やPDA等の携帯型無線通信機器では使用できるメモリ容量が限られており、コンパイルしたコードを全てメモリ上に格納することはできない。また、前記携帯型無線通信機器でのソフトウェアの実行は、ゲームなどの対話型のアプリケーションが多く、応答性を高めるためには、コンパイルにあまり時間をかけることはできない。
特に、前記携帯型無線通信機器に搭載されたプロセッサでは処理能力が比較的低いため、大きなプログラムをコンパイルすると、実行中のプログラムが一瞬止まって見えることもある。また、一度しか実行されないようなバイトコードの場合、コンパイルする時間のオーバーヘッドのため、インタプリタで実行するよりも遅くなる。
本発明は、このような従来の課題を解決し、限られたメモリ容量で処理の高速化を図り、応答性能の向上を図ることを目的とする。
本発明は前記の目的を達成するため、次のように構成した。
(1) :仮想計算機のバイトコードをソフトウェアで解釈・実行する機能を有し、メモリ上に、容量の制限されたネイティブコードの格納領域としてコードキャッシュを持ち、前記バイトコードを実行する際に、JITコンパイラによりバイトコードを仮想計算機が直接実行できるネイティブコードにコンパイルして前記コードキャッシュに格納した後、そのネイティブコードを実行するJITコンパイラを備えた仮想計算機において、前記バイトコードのアドレスから、コンパイルされているか否かを判断するための情報と、コンパイルされたネイティブコードのアドレスを検索する検索テーブルを備えていることを特徴とする。
(2) :前記(1) の仮想計算機において、前記検索テーブル上、又は前記コードキャッシュ上に、命令の実行回数を計数するための実行カウンタを設け、バイトコードを実行する際に、前記実行カウンタの値を調べ、予め決めた特定回数より小さい場合はインタプリタで実行し、前記特定回数以上の場合は、JITコンパイラによりバイトコードをコンパイルしてから実行する選択処理手段を備えていることを特徴とする。
(3) :前記(1) の仮想計算機において、前記検索テーブルに、1度目の実行時にバイトコードのアドレスだけ登録し、ネイティブコードのアドレスの登録は特別な値、又は数字の0を登録にしておく検索テーブル情報登録手段と、1度目はインタプリタで実行し、2度目はJITコンパイルによりコンパイルして実行する実行制御手段を備えていることを特徴とする。
(4) :前記(1) の仮想計算機において、コンパイル時間を短縮するために、コンパイルする範囲を制限し、処理の途中であっても、バイトコードの特定の命令を検出したら、そこまでをコンパイルして処理を中断する命令を生成し、残りはコンパイルしないように処理を制限する処理制限手段を備えていることを特徴とする。
(5) :前記(1) の仮想計算機において、前記コードキャッシュに空きがなくなった時、コードキャッシュの先頭から順にネイティブコードを破棄する第1の破棄手段と、FILO方式で最も昔にコンパイルしたコードから順に破棄する第2の破棄手段を備えていることを特徴とする。
(作用)
図1は本発明の原理説明図である。以下、図1を参照しながら本発明の作用を説明する。
(a) :前記(1) では、バイトコードのアドレスから、コンパイルされているか否かを判断するための情報と、コンパイルされたネイティブコードのアドレスを検索する検索テーブルを備えている。
従って、前記検索テーブルを検索することでコンパイルされているか否かを判断したり、コンパイルされている場合に、該当するネイティブコードの格納アドレスを検索することが容易になる。その結果、バイトコードをネイティブコードにコンパイルすることで、アプリケーションプログラムの実行時間を速くすることが可能になる。また、従来のJITコンパイラがネイティブコードを生成し格納するために使用するメモリが制限され、少ないメモリでも処理が高速化できる。
(b) :前記(2) では、選択処理手段が、バイトコードを実行する際に、実行カウンタの値を調べ、予め決めた特定回数より小さい場合はインタプリタで実行し、前記特定回数以上の場合は、JITコンパイラによりバイトコードをコンパイルしてから実行する。
この場合、コンパイル処理は時間を要するため、一度しか実行はないようなバイトコードはコンパイルして実行するよりもインタプリタで実行する方が速い。そこで、前記のように処理を行うことで、アプリケーションプログラムの全体の実行速度を速くすることができる。
(c) :前記(3) では、検索テーブル情報登録手段は、検索テーブルに、1度目の実行時にバイトコードのアドレスだけ登録し、ネイティブコードのアドレスの登録は特別な値、又は数字の0を登録しておく。また、実行制御手段は、1度目はインタプリタで実行し、2度目はJITコンパイルによりコンパイルして実行するように制御する。
この場合、コンパイル処理は時間を要するため、一度しか実行はないようなバイトコードはコンパイルして実行するよりもインタプリタで実行する方が速い。そこで、前記のように処理を行うことで、アプリケーションプログラムの全体の実行速度を速くすることができる。また、前記(2) と比較して、実行カウンタのための領域が必要なく、メモリを節約できる。
(d) :前記(4) では、処理制限手段は、コンパイル時間を短縮するために、コンパイルする範囲を制限し、処理の途中であっても、バイトコードの特定の命令を検出したら、そこまでをコンパイルして処理を中断する命令を生成し、残りはコンパイルしないように処理を制限する。
この場合、従来は、メソッド全体をコンパイルしていたので、全く実行しない部分もコンパイルしていた。これに対して本発明の前記(4) では、必ず実行する部分だけをコンパイルするので、コンパイルに消費する時間の無駄がなく高速である。
また、従来は、メソッド全体をコンパイルしていたので、全く実行しない部分のネイティブコードも生成していた。しかし、本発明の前記(4) では、必ず実行する部分だけをコンパイルするので、生成するネイティブコードに無駄がなく、メモリの消費が抑えられる。また、アプリケーションプログラムの応答性を向上させることができる。すなわち、コンパイルしている最中はアプリケーションプログラムの実行は停止するので、この停止している時間が短縮する。
(e) :前記(5) では、第1の破棄手段は、コードキャッシュに空きがなくなった時、コードキャッシュの先頭から順にネイティブコードを破棄する。そして、第2の破棄手段は、FILO方式で最も昔にコンパイルしたコードから順に破棄する。
このようにすれば、ネイティブコードの破棄の方式が簡単なため、実現し易く、ネイティブコードの断片化が起きない。
(1) :バイトコードのアドレスから、コンパイルされているか否かを判断するための情報と、コンパイルされたネイティブコードのアドレスを検索する検索テーブルを備えている。
従って、前記検索テーブルを検索することでコンパイルされているか否かを判断したり、コンパイルされている場合に、該当するネイティブコードの格納アドレスを検索することが容易になる。その結果、バイトコードをネイティブコードにコンパイルすることで、アプリケーションプログラムの実行時間を速くすることが可能になる。また、従来のJITコンパイラがネイティブコードを生成し、格納するために使用するメモリが制限され、少ないメモリでも処理が高速化できる。
(2) :選択処理手段がバイトコードを実行する際に、実行カウンタの値を調べ、予め決めた特定回数より小さい場合はインタプリタで実行し、前記特定回数以上の場合は、JITコンパイラによりバイトコードをコンパイルしてから実行する。
この場合、コンパイル処理は時間を要するため、一度しか実行はないようなバイトコードはコンパイルして実行するよりもインタプリタで実行する方が速い。そこで、前記のように処理を行うことで、アプリケーションプログラムの全体の実行速度を速くすることができる。
(3) :検索テーブル情報登録手段は、検索テーブルに、1度目の実行時にバイトコードのアドレスだけ登録し、ネイティブコードのアドレスの登録は特別な値、又は数字の0を登録にしておく。また、実行制御手段は、1度目はインタプリタで実行し、2度目はJITコンパイルによりコンパイルして実行するように制御する。
この場合、コンパイル処理は時間を要するため、一度しか実行しないようなバイトコードはコンパイルして実行するよりもインタプリタで実行する方が速い。そこで、前記のように処理を行うことで、アプリケーションプログラムの全体の実行速度を速くすることができる。また、前記(2) と比較して、実行カウンタのための領域が必要なく、メモリを節約できる。
(4) :処理制限手段は、コンパイル時間を短縮するために、コンパイルする範囲を制限し、処理の途中であっても、バイトコードの特定の命令を検出したら、そこまでをコンパイルして処理を中断する命令を生成し、残りはコンパイルしないように処理を制限する。
この場合、従来は、メソッド全体をコンパイルしていたので、全く実行しない部分もコンパイルしていた。これに対して請求項4では、必ず実行する部分だけをコンパイルするので、コンパイルに消費する時間の無駄がなく高速である。
また、従来は、メソッド全体をコンパイルしていたので、全く実行しない部分のネイティブコードも生成していた。しかし、請求項4では、必ず実行する部分だけをコンパイルするので、生成するネイティブコードに無駄がなく、メモリの消費が抑えられる。また、アプリケーションプログラムの応答性を向上させることができる。すなわち、コンパイルしている最中はアプリケーションプログラムの実行は停止するので、この停止している時間が短縮する。
(5) :第1の破棄手段は、コードキャッシュに空きがなくなった時、コードキャッシュの先頭から順にネイティブコードを破棄する。そして、第2の破棄手段は、FILO方式で最も昔にコンパイルしたコードから順に破棄する。このようにすれば、ネイティブコードの破棄の方式が簡単なため、実現し易く、ネイティブコードの断片化が起きない。
以下、本発明の実施の形態を図面に基づいて詳細に説明する。なお、以下に説明する仮想計算機は、プログラム上だけで実現される仮想的な計算機であり、前記携帯型無線通信機器内のメモリに格納されたプログラムを、内部のプロセッサ(CPU、又はMPU)が実行することで実現される仮想マシンである。
従って、以下に説明するフローチャートで表現された処理は、全て前記プログラム上で実行されるものである。そのため、仮想計算機上のメモリ、コードキャッシュ、検索テーブル等は、全て前記プログラム上で実現されるものである。
(1) :例1の詳細な説明
(a) :例1の内容
例1は、仮想計算機のバイトコードをソフトウェアで解釈・実行する機能を有し、メモリ上に、容量の制限されたネイティブコードの格納領域としてコードキャッシュを持ち、バイトコードを実行する際に、JITコンパイラによりバイトコードを仮想計算機が直接実行できるネイティブコードにコンパイルしてコードキャッシュに格納した後、そのネイティブコードを実行するJITコンパイラ(以下、単に「コンパイラ」とも記す)を備えた仮想計算機に関するものであり、バイトコードのアドレスから、コンパイルされているか否かを判断するための情報(後述する)と、コンパイルされたネイティブコードのアドレスを検索する検索テーブルを備えている。
そして、コンパイルを行う時にネイティブコードの格納領域に空きがなければ、既に格納済みのコンパイルコードを破棄して前記格納領域に空き領域を作り、検索テーブルを更新するものである。
(b) :フローチャートによる処理(その1)の説明
図1は例1の処理フローチャート(その1)である。以下、図1に基づいて、例1の処理(その1)を説明する。なお、S31〜S40は各処理ステップを示す。この処理では、全てのバイトコードを対象としてコンパイルされているかどうかをチェックする例であり、仮想計算機上の処理である。
先ず、全てのバイトコードに対して、検索テーブル上のタグ(tag)情報を利用して(詳細は後述する)コンパイル済みか否かを判断し(S31)、コンパイル済みでなければ、コンパイルすべきか否かを判断し(S32)、コンパイルすべきでないと判断した場合には、バイトコード命令のフェッチを行い(S33)、フェッチされた命令のデコードを行う(S34)。
その結果、実行であれば(S35、S36)その命令を実行し、S31の処理へ移行する。また、分岐であれば(S37)分岐処理を行い、S31の処理へ移行する。更に、メソッド呼び出しであれば(S38)、メソッド呼び出しを行い、S31の処理へ移行する。
また、前記S32の処理で、コンパイルすべきであると判断した場合には、部分的にコンパイルし、ネイティブコードを生成してネイティブコード格納領域へ格納し(S39)、ネイティブコードを実行し(S40)、S31の処理へ移行する。また、S31の処理で、コンパイル済みであれば、S40の処理へ移行する。前記処理において、S31〜S38はインタプリタの処理であり、S39、S40がJITコンパイラによる処理である。
(c) :フローチャートによる処理(その2)の説明
図2は例1の処理フローチャート(その2)である。以下、図2に基づいて、例1の処理(その2)を説明する。なお、S41〜S50は各処理ステップを示す。
この処理では、分岐、メソッド呼び出しなどの実行制御が途切れる地点で、コンパイルのチェックを行う。一般のJITコンパイラとの違いとしては、コンパイルをメソッド単位で行わず、以下に説明する例5、例6、例7、例8等の条件で、コンパイルを中断することが特徴である。
先ず、バイトコード命令のフェッチを行い(S41)、命令デコードを行う(S42)。その結果、実行であれば(S43、S44)、その命令を実行し、S41の処理へ移行する。また、分岐であれば(S45)、分岐処理を行い(S45)、メソッド呼び出しであれば(S46)メソッド呼び出しを行う。
そして、分岐又はメソッド呼び出しを行った場合、コンパイル済みか否かを判断し(S47)、コンパイル済みでなければ、コンパイルすべきか否かを判断する(S48)。その結果、コンパイルすべきでないと判断した場合には、S41の処理へ移行する。
また、コンパイルすべきであると判断した場合は、途中までコンパイルを行い、ネイティブコードを生成しネイティブコード格納領域へ格納する(S49)。そして、ネイティブコードを実行し(S50)、S47の処理、又はS46の処理へ移行する。
(d) :検索テーブルの説明
図3は例1の検索テーブル例である。前記のようにコンパイル済みか否かを調べて判断するために、検索テーブルを使用するが、その検索テーブルの1例を図3に示す。図3において、1はコンパレータ、2は検索テーブル、3はコードキャッシュである。
この検索テーブル2は、タグ(tag)と、ネイティブコードのアドレス(コードキャッシュ3内のネイティブコード領域のアドレス)との対応情報が登録できるようになっており、ネイティブコードのアドレスからコードキャッシュ3のネイティブコード領域のデータが検索できるようになっている。
また、検索テーブル2は、バイトコードアドレス(上位Mビット+下位Nビットとする)の下位Nビットを利用してタグ(tag)を検索することで、ネイティブコードのアドレスが検索できるようになっている。そして、バイトコードアドレスの上位Mビットをコンパレータ1に入力すると共に、検索テーブルのタグ(tag)情報をコンパレータ1に入力し、両者が一致するか否かの比較を自動的に行うようになっている。
前記比較の結果、両者が一致(hit)した場合、コンパレータ1から一致出力が出され、この一致出力信号によりコンパイル済みと判断できるようになっている。
(e) :例1の特徴
前記図3の検索テーブルを検索することでコンパイルされているか否かを判断したり、コンパイルされている場合に、該当するネイティブコードの格納アドレス(コードキャッシュ3内のネイティブコード領域のアドレス)を検索することが容易になる。
その結果、バイトコードをネイティブコードにコンパイルすることで、アプリケーションプログラムの実行時間を速くすることが可能になる。また、従来のJITコンパイラがネイティブコードを生成し、格納するために使用するメモリが制限され、少ないメモリ容量でも処理が高速化できる。
(2) :例2の詳細な説明
(a) :例2の内容
例2は、例1において、検索テーブル2上、又はコードキャッシュ3上に命令の実行回数を計数する実行カウンタを設け、仮想計算機のコードであるバイトコードを実行する際に、実行カウンタの値が、予め決めた特定回数より小さければインタプリタで実行し、前記特定回数より大きく、頻繁に実行されるバイトコードはJITコンパイラによりコンパイルして実行する例である。
(b) :検索テーブルの説明
図4は例2の検索テーブル例である。図4に示したように、検索テーブル2は、タグ(tag)と、実行カウンタと、ネイティブコードのアドレスを対応させた情報が格納されており、ネイティブコードのアドレスから、コードキャッシュ3のネイティブコード領域のアドレスが検索できるようになっている。
また、検索テーブル2は、バイトコードアドレス(上位Mビット+下位Nビットとする)の下位Nビットを利用してタグ(tag)を検索することで、ネイティブコードアドレスが検索できるようになっている。そして、バイトコードアドレスの上位Mビットをコンパレータ1に入力すると共に、検索テーブルのタグ(tag)情報をコンパレータ1に入力し、両者が一致する(hit)か否かの比較を行う。
前記比較の結果、両者が一致(hit)した場合、コンパレータ1から一致出力が出され、この一致出力信号によりコンパイル済みと判断する。このような検索テーブルを利用し、バイトコードを実行する際に実行カウンタの値が特定回数より小さければインタプリタ(従来の処理)で実行し、特定回数より大きく頻繁に実行されるバイトコードはコンパイルして実行する。なお、前記実行カウンタは、コードキャッシュ3に設けても良い。
(c) :フローチャートによる処理の説明
図5は、例2のコンパイル選択処理フローチャートである。以下、図5に基づいて、例2のコンパイルの選択処理を説明する。なお、S61〜S75は各処理ステップを示す。
この処理は、インタプリタの処理(S61〜S67)と、JITコンパイラによるコンパイラの処理(S71〜S75)とに分かれている。インタプリタの処理では、コンパイル済みか否かを判断し(S61)、コンパイル済みでなければ、テーブル登録済み(図4の検索テーブル2のtagに登録されているか否か)を判断する(S62)。その結果、テーブル登録済みでなければ、タグ(tag)にアドレス登録を行い(S63)、実行カウンタをクリアする(S64)。次に、命令フェッチを行い(S65)、デコードを行って(S66)、実行する(S67)。そして、S61の処理に移行する。
S62の処理でテーブル登録済みであると判断した場合には、検索テーブル2の実行カウンタをUP(+1)し(S71)、予め決めた特定回数より大きいか否かを判断する(S72)。その結果、特定回数より小さければ、S65に移行しインタプリタで実行し、特定回数以上の場合は、S73に移行してJITコンパイラによりバイトコードをコンパイルしてネイティブコードを生成し、コードキャッシュ3に登録する。また、この時、検索テーブル2にも必要な情報(ネイティブコードのアドレス)を登録する(S74)。
次に、前記ネイティブコードを実行し(S75)、S61へ移行する。また、S61の処理でコンパイル済みであると判断した場合には、S75へ移行する。
(d) :例2の特徴
コンパイル処理は時間を要するため、あまり実行されないバイトコードはコンパイルして実行するよりも、インタプリタで実行する方が、全体の処理速度が上がる。
(3) :例3の詳細な説明
(a) :例3の内容
例3は、例2のような実行カウンタを使用しないでコンパイルの選択を行う例であり、例1の処理において、検索テーブルに1度目の実行時にはバイトコードアドレスだけを登録(検索テーブル2のtagに登録)し、ネイティブコードのアドレスの登録は特別なコンパイルの処理を行う関数(コンパイル又は処理の先頭アドレス)、又は数字の0にしておき、1度目はインタプリタで実行し、2度目はコンパイルして実行する例である。
(b) :フローチャートによる処理の説明
図6は、例3のコンパイル選択処理フローチャートである。以下、図6に基づいて、例3のコンパイルの選択処理を説明する。なお、S81〜S94は各処理ステップを示す。
この処理は、インタプリタの処理(S81〜S86)と、コンパイラの処理(S91〜S94)とに分かれている。インタプリタの処理では、先ず、Aから始まりテーブル登録済み(検索テーブル2に登録されている)か否かを判断し(S81)、登録済みでなければ(1度目)、インタプリタによる処理を行う。この場合、検索テーブル2のタグ(tag)にバイトコードアドレス(バイトコードのアドレスのみ)を登録する(S82)。
次に、ネイティブコードアドレスに、エントリBを登録して(S83)、命令フェッチを行い(S84)、デコードを行う(S85)。そして、デコードした命令を実行し(S86)、S81の処理へ移行する。
また、S81の処理で、テーブル登録済みであると判断した場合(2度目)は、JITコンパイラによる処理を行う。この場合、ネイティブコードアドレスへジャンプし(S91)、エントリBからJITコンパイラによるコンパイルを行い(S92)、ネイティブコードアドレス登録を行う(S93)。そして、ネイティブコードを実行し(S94)、S81の処理へ移行する。
また、前記S91の処理結果により、S94に移行してネイティブコードを実行し(S94)、S81の処理へ移行する。
(c) :例3の特徴
コンパイル処理は時間を要するため、一度しか実行はないようなバイトコードはコンパイルして実行するよりもインタプリタで実行する方が速い。そこで、前記のように処理を行うことで、アプリケーションプログラムの全体の実行速度を速くすることができる。また、前記例2と比較して、実行カウンタのための領域が必要なく、メモリを節約できる。
(4) :例4の詳細な説明
(a) :例4の内容
例4は、例1において、検索テーブルはコンパイルされているかどうかだけの情報(タグの情報)を持ち、ネイティブコードのアドレスはバイトコードのアドレスから計算する例である。
(b) :検索テーブルとコードキャッシュの構成例
図7は例4の検索テーブルとコードキャッシュの構成例である。この検索テーブル2には、タグ(tag)のみ格納されている。この場合、バイトコードアドレスの下位Nビットを利用して検索テーブル2をアクセスすると共に、前記Nビットの下位アドレスを演算器4により整数倍、例えば、8倍(×8)した値によりコードキャッシュ3のネイティブコード領域のアドレスへアクセスできるようになっている。
また、検索テーブル2は、バイトコードアドレス(上位Mビット+下位Nビットとする)の下位Nビットを利用してタグ(tag)を検索できるようになっている。そして、バイトコードアドレスの上位Mビットをコンパレータ1に入力すると共に、検索テーブルのタグ(tag)情報をコンパレータ1に入力し、両者が一致するか否かの比較を行う。前記比較の結果、両者が一致した場合、コンパレータ1から一致出力が出されるが、この一致出力信号によりコンパイル済みと判断する。
(c) :例4の特徴
バイトコードのアドレスに対し、コンパイルされるネイティブコードのメモリ上の位置が一意に決まるため、テーブルからネイティブコードのアドレスを索引する必要がなくなる。また、置換の際には、破棄すべきネイティブコードを探す必要がなく単純に処理できる。
(5) :例5の詳細な説明
(a) :例5の内容
例5は、例1において、コンパイル時間を短縮(応答性を向上)するために、コンパイルする範囲を制限する。処理の途中であっても、バイトコードの特定の命令(分岐命令、メソッド呼び出しなど)を検出したら、そこまでをコンパイルし、処理を中断する命令(ネイティブコードの分岐命令や割り込み命令)を生成し(ネイティブコードの最終コードの後に、分岐命令や割り込み命令を生成し)、残りはコンパイルしない例である。
すなわち、仮想計算機において、コンパイル時間を短縮するために、コンパイルする範囲を制限し、処理の途中であっても、バイトコードの特定の命令を検出したら、そこまでをコンパイルして処理を中断する命令を生成し、残りはコンパイルしないように処理を制限する処理制限手段を備えている。
(b) :例5の特徴
必ず実行する部分だけがコンパイルされ効率が良い。例えば、“IF条件THEN処理”のようなバイトコードの列をコンパイルするとき、「条件」を処理する部分だけコンパイルを行い、「処理」の部分はコンパイルしない。
この場合、従来は、メソッド全体をコンパイルしていたので、全く実行しない部分もコンパイルしていた。これに対して例5では、必ず実行する部分だけをコンパイルするので、コンパイルに消費する時間の無駄がなく高速である。
また、従来は、メソッド全体をコンパイルしていたので、全く実行しない部分のネイティブコードも生成していた。しかし、例5では、必ず実行する部分だけをコンパイルするので、生成するネイティブコードに無駄がなく、メモリの消費が抑えられる。また、アプリケーションプログラムの応答性を向上させることができる。すなわち、コンパイルしている最中はアプリケーションプログラムの実行は停止するので、この停止している時間が短縮する。
(6) :例6の詳細な説明
(a) :例6の内容
例6は、コンパイル時間の短縮を行う例であり、例5において、特定な命令の検出のほかに、バイトコードの量でコンパイルを中断する。例えば、100命令コンパイルしたところでコンパイルを中断する例である。なお、例6は、例4と同様に、例1の処理におけるコンパイルを中断させる条件を提供するものである。
(b) :例6の特徴
例5と同じように、必ず実行する部分だけをコンパイルするので、生成するネイティブコードに無駄がなく、メモリの消費が抑えられる。また、アプリケーションプログラムの応答性を向上させることができる。すなわち、コンパイルしている最中はアプリケーションプログラムの実行は停止するので、この停止している時間が短縮する。
(7) :例7の詳細な説明
(a) :例7の内容
例7はコンパイル時間の短縮を行う例であり、例5において、特定な命令の検出のほかに、生成したネイティブコードの量でコンパイルを中断する。例えば、コンパイルが128ワード分だけネイティブコードを生成したら、コンパイルを中断する。なお、例7は、例4と同様に、例1の処理におけるコンパイルを中断させる条件を提供するものである。
(b) :例7の特徴
例5と同じように、必ず実行する部分だけをコンパイルするので、生成するネイティブコードに無駄がなく、メモリの消費が抑えられる。また、アプリケーションプログラムの応答性を向上させることができる。すなわち、コンパイルしている最中はアプリケーションプログラムの実行は停止するので、この停止している時間が短縮する。
(8) :例8の詳細な説明
(a) :例8の内容
例8はコンパイル時間の短縮を行う例であり、特定な命令の検出のほかに、時間によってコンパイルを中断する。例えば、コンパイラがコンパイルの処理に100ミリセカンド消費したら、コンパイルを中断する。なお、例8は、例4と同様に、例1の処理におけるコンパイルを中断させる条件を提供するものである。
(b) :例8の特徴
例5と同じように、必ず実行する部分だけをコンパイルするので、生成するネイティブコードに無駄がなく、メモリの消費が抑えられる。また、アプリケーションプログラムの応答性を向上させることができる。すなわち、コンパイルしている最中はアプリケーションプログラムの実行は停止するので、この停止している時間が短縮する。
(9) :例9の詳細な説明
(a) :例9の内容
例9は、コードキャッシュの置換を行う例であり、例1において、コードキャッシュに空きがなくなったとき、コードキャッシュの先頭から順にネイティブコードを破棄する。この処理では、FILO(First In Last Out )方式で最も昔にコンパイルしたコードから順に破棄する。
(b) :コードキャッシュの置換の説明
図8は例9のコードキャッシュの置換処理説明図である。この例では、初期値として、P1:命令生成ポインタはコードキャッシュの先頭、P2:解放ポインタはコードキャッシュの末尾を指しておく。実行が進む(コンパイルが何度も行われる)につれて、コードキャッシュ3は小さなブロックに分けられ、ブロックの先頭にタグ(tag)ポインタ(検索テーブルへのポインタ)と、ネクスト(next)ポインタ(次のブロックを指すポインタ)が格納される。
ブロックの残り部分はネイティブコードを格納する命令領域である。ネクスト(next)ポインタはポインタである必要はなく、ブロックの切れ目が判れば良い。
(c) :フローチャートによる処理の説明
図9は、例9のコードキャッシュ置換処理フローチャートである。以下、図9に基づいて、例9の処理を説明する。なお、S101〜S111は各処理ステップを示す。
この処理は、コンパイルの処理の最中にコードキャッシュ3の置換処理を行う例である。先ず、生成する領域のタグ(tag)ポインタに検索テーブル2へのタグ(tag)ポインタを設定する(S101)。設定する領域は図8のP1(命令生成ポインタ)によって指示される。S102、S103、S104、S105がコンパイル処理のメインループであり、バイトコードからネイティブコードを生成する処理である。
次に、JITコンパイルのコンパイル処理により、バイトコードからネイティブコードへの変換を行う(S102)。変換後のネイティブコードをコードキャッシュ3に格納する前に、命令生成ポインタと解放ポインタの値を比較(命令生成ポインタ<解放ポインタの条件を満たしているか否かを比較)する(S103)ことで、有効なコードを上書きしてしまわないかチェックする。
その結果、命令生成ポインタが解放ポインタより小さければ、全て解放済みの領域なので、コードキャッシュ3にネイティブコードを生成して書き込む(S104)。この時、命令生成ポインタを進める。次に、コンパイル終了条件を満たしたか否かを判断する(S105)。
その結果、コンパイル終了条件を満たさなければ、S102の処理へ移行し、コンパイル処理を継続する。また、コンパイル終了条件を満たしたら、生成したネイティブコードを1つのブロックとして構成する。この場合、生成した領域のネクストポインタに、命令生成ポインタの値を設定する(S106)。
また、S103の処理で、前記条件を満たしていない場合、すなわち、命令生成ポインタが解放ポインタと等しいか、又は大きい場合、有効なブロックを解放する必要がある。そこで、解放ポインタがコードキャッシュの最後を指している(解放ポインタ<コードキャッシュの末尾の条件を満たしている)か否かをチェックする(S107)。
その結果、解放ポインタがコードキャッシュの最後を指している場合は、解放ポインタをコードキャッシュ3の先頭に設定し(S108)、命令生成ポインタをコードキャッシュ3の先頭のブロックの命令領域に設定する(S109)。この処理により、コードキャッシュ3の先頭に戻ってブロックの解放を行う。
次に、解放ポインタが示すタグ(tag)ポインタから検索テーブル2のタグ(tag)をクリアする(S110)。そして、前記S110の処理により、検索テーブルのタグ(tag)が無効化され、解放ポインタが示すブロックが実際に解放される。次に、解放ポインタを次のポインタ(nextポインタ)に設定して(S111)、S104の処理へ移行する。この処理で、解放ポインタが次のブロックを指すようになる。
(d) :特徴
コードキャッシュから検索テーブルへのポインタを持つことによって、キャッシュブロックのサイズを可変長にでき、メモリを有効に活用することが可能になる。このポインタがない場合でも、検索テーブル全体を調べてキャッシュを無効化することができるが、検索テーブル全体を調べるのは処理量が多く、コンパイルに時間を浪費するが、例9の処理により、キャッシュの無効化を高速に行うことができる。
(10):例10の詳細な説明
(a) :例10の内容
図10は例10のコードキャッシュの置換処理説明図である。例10は、コードキャッシュの置換を行う例であり、コードキャッシュ3に空きがなくなったとき、検索テーブル2の実行カウンタを値の小さいものをスキャンし、実行カウンタの値の小さなものから順に破棄する。実行カウンタはコンパイル直後は適当な大きな値を設定しておき、実行する度に実行したコードに対応するカウンタを増加するようにし、置換が必要となったときに、全体のカウンタを減少するようにする。
(b) :フローチャートによる処理の説明
図11は例10の処理フローチャートである。以下、図11に基づいて例10の処理を説明する。なお、S121〜S136は各処理ステップを示す。また、S121〜S131の処理は、図5に示した例2のS61〜S75の処理と同じである。
インタプリタの処理では、コンパイル済みか否かを判断し(S121)、コンパイル済みでなければ、テーブル登録済み(図4の検索テーブル2のtagに登録されているか否か)を判断する(S122)。その結果、テーブル登録済みでなければ、タグ(tag)にアドレス登録を行い(S123)、実行カウンタをクリアする(S124)。
次に、命令フェッチを行い(S125)、デコードを行って(S126)、前記処理と同様にして命令を実行する(S127)。そして、S121の処理に移行する。
また、前記S122の処理でテーブル登録済みであると判断した場合には、検索テーブル2の実行カウンタをUP(+1)し(S129)、予め決めた特定回数より大きいか否かを判断する(S130)。その結果、特定回数より小さければ、S125に移行しインタプリタで実行し、特定回数以上の場合は、JITコンパイラによりバイトコードをコンパイルしてネイティブコードを生成し(S131)、生成したネイティブコードをコードキャッシュ3に登録する(S132)。
また、この時、検索テーブル2の実行カウンタを設定する。次に、前記S132の処理で登録したネイティブコードを実行し(S133)、S121の処理へ移行する。また、S121の処理で、コンパイル済みであると判断した場合は、検索テーブル2の実行カウンタをUP(+1)して(S128)、S133の処理へ移行する。
一方、前記S131の処理において、ネイティブコードを生成した場合、コードキャッシュ3に空きがあるか否かを判断し(S134)、空きがあれば、S131の処理へ戻る。しかし、コードキャッシュ3に空きがなければ、実行カウンタ全体をスキャンし、個々の実行カウンタを減少させる(S135)。そして、実行回数が少ないエントリを破棄して、コードキャッシュ3に空きを作成し(S136)、S131の処理に戻る。
(c) :例10の特徴
頻繁に実行されるネイティブコードが破棄されにくくなる。しかし、空き領域が断片化し、ネイティブコード上で断片化した箇所への無駄な分岐命令が必要となる。
(11):例11の詳細な説明
(a) :例11の内容
例11は、コードキャッシュ3のコンパクションの例であり、例10において、コードキャッシュ3の空き領域の断片化が起きる。この時に、ネイティブコードのかたまりを移動(リロケーション)することで、コンパイラが一度に生成するコードを一塊にまとめる。
(b) :例11の特徴
断片化により分断された命令の間に無駄な分岐命令を挿入する必要がなくなる。実行する命令列がコードキャッシュ上に分断されることがなくなり、一塊となるため、命令キャッシュが効率的に使われ、性能が向上する。
(12):例12の詳細な説明
(a) :例12の内容
例12は、検索テーブルのヒット率の向上を図る例であり、例5において、コンパイルした全てのバイトコードの命令を検索テーブルに登録せず、コンパイルした命令シーケンスの先頭だけ検索テーブルに登録する。
(b) :例12の特徴
検索テーブルのエントリ数にも制限があり、コンパイルした全てのバイトコード命令のアドレスを登録すると、検索テーブル2を上書きする機会が増えるため、コンパイル済みにもかかわらず、検索ミスする率が大きくなり、無駄なコンパイルを行う。これを防ぐため、コンパイルした命令シーケンスの先頭だけを登録する。
前記の説明に対し、次の構成を付記する。
(付記1)
仮想計算機のバイトコードをソフトウェアで解釈・実行する機能を有し、メモリ上に、容量の制限されたネイティブコードの格納領域としてコードキャッシュを持ち、
前記バイトコードを実行する際に、JITコンパイラによりバイトコードを仮想計算機が直接実行できるネイティブコードにコンパイルして前記コードキャッシュに格納した後、そのネイティブコードを実行するJITコンパイラを備えた仮想計算機において、
前記バイトコードのアドレスから、コンパイルされているか否かを判断するための情報と、コンパイルされたネイティブコードのアドレスを検索する検索テーブルを備えていることを特徴とするJITコンパイラを備えた仮想計算機。
(付記2)
前記検索テーブル上、又は前記コードキャッシュ上に、命令の実行回数を計数するための実行カウンタを設け、
前記バイトコードを実行する際に、実行カウンタの値を調べ、予め決めた特定回数より小さい場合はインタプリタで実行し、
前記特定回数以上の場合は、JITコンパイラによりバイトコードをコンパイルしてから実行する選択処理手段を備えていることを特徴とする(付記1)記載のJITコンパイラを備えた仮想計算機。
(付記3)
前記検索テーブルに、1度目の実行時にバイトコードのアドレスだけ登録し、ネイティブコードのアドレスの登録は特別な値、又は数字の0にしておく検索テーブル情報登録手段と、
1度目はインタプリタで実行し、2度目はJITコンパイルによりコンパイルして実行する実行制御手段を備えていることを特徴とする(付記1)記載のJITコンパイラを備えた仮想計算機。
(付記4)
前記検索テーブルは、コンパイルされているかどうかを判断するだけの情報を持ち、ネイティブコードのアドレスは、バイトコードのアドレスから計算して求める演算手段を備えていることを特徴とする(付記1)記載の仮想計算機。
(付記5)
コンパイル時間を短縮するために、コンパイルする範囲を制限し、処理の途中であっても、バイトコードの特定の命令を検出したら、そこまでをコンパイルし、処理を中断する命令を生成し、残りはコンパイルしないように処理を制限する処理制限手段を備えていることを特徴とする(付記1)記載のJITコンパイラを備えた仮想計算機。
(付記6)
処理制限手段は、特定な命令の検出の他に、バイトコードの量でコンパイルを中断することを特徴とする(付記5)記載の仮想計算機。
(付記7)
処理制限手段は、特定な命令の検出の他に、生成したネイティブコードの量でコンパイルを中断することを特徴とする(付記5)記載の仮想計算機。
(付記8)
処理制限手段は、特定な命令の検出の他に、時間によってコンパイルを中断することを特徴とする(付記5)記載の仮想計算機。
(付記9)
前記コードキャッシュに空きがなくなった時、コードキャッシュの先頭から順にネイティブコードを破棄する第1の破棄手段と、
FILO方式で最も昔にコンパイルしたコードから順に破棄する第2の破棄手段を備えていることを特徴とする(付記1)記載のJITコンパイラを備えた仮想計算機。
本発明の実施の形態における例1の処理フローチャート(その1)である。 本発明の実施の形態における例1の処理フローチャート(その2)である。 本発明の実施の形態における例1の検索テーブル例である。 本発明の実施の形態における例2の検索テーブル例である。 本発明の実施の形態における例2のコンパイル選択処理フローチャートである。 本発明の実施の形態における例3のコンパイル選択処理フローチャートである。 本発明の実施の形態における例4の検索テーブルとコードキャッシュの構成例である。 本発明の実施の形態における例9のコードキャッシュの置換処理説明図である。 本発明の実施の形態における例9のコードキャッシュの置換処理フローチャートである。 本発明の実施の形態における例10のコードキャッシュの置換処理説明図である。 本発明の実施の形態における例10の処理フローチャートである。 従来のインタプリタの処理フローチャートである。 従来のインタプリタとJITコンパイラを組み合わせた時の処理フローチャートである。
符号の説明
1 コンパイラ
2 検索テーブル
3 コードキャッシュ
4 演算器

Claims (1)

  1. 仮想計算機のバイトコードをソフトウェアで解釈・実行する機能を有し、メモリ上に、容量の制限されたネイティブコードの格納領域としてコードキャッシュを持ち、
    前記バイトコードを実行する際に、JITコンパイラによりバイトコードを仮想計算機が直接実行できるネイティブコードにコンパイルして前記コードキャッシュに格納した後、そのネイティブコードを実行するJITコンパイラを備えた仮想計算機において、
    前記バイトコードのアドレスから、コンパイルされているか否かを判断するための情報と、コンパイルされたネイティブコードのアドレスを検索する検索テーブルを備えると共に、
    コンパイル時間を短縮するために、コンパイルする範囲を制限し、処理の途中であっても、バイトコードの特定の命令を検出したら、そこまでをコンパイルして処理を中断する命令を生成し、残りはコンパイルしないように処理を制限する処理制限手段を備えていることを特徴とするJITコンパイラを備えた仮想計算機。
JP2005371745A 2005-12-26 2005-12-26 Jitコンパイラを備えた仮想計算機 Pending JP2006134351A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2005371745A JP2006134351A (ja) 2005-12-26 2005-12-26 Jitコンパイラを備えた仮想計算機

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2005371745A JP2006134351A (ja) 2005-12-26 2005-12-26 Jitコンパイラを備えた仮想計算機

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP2001341577A Division JP3808755B2 (ja) 2001-11-07 2001-11-07 Jitコンパイラを備えた仮想計算機

Publications (1)

Publication Number Publication Date
JP2006134351A true JP2006134351A (ja) 2006-05-25

Family

ID=36727773

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2005371745A Pending JP2006134351A (ja) 2005-12-26 2005-12-26 Jitコンパイラを備えた仮想計算機

Country Status (1)

Country Link
JP (1) JP2006134351A (ja)

Similar Documents

Publication Publication Date Title
JP3808755B2 (ja) Jitコンパイラを備えた仮想計算機
Gal et al. HotpathVM: An effective JIT compiler for resource-constrained devices
US6453411B1 (en) System and method using a hardware embedded run-time optimizer
US8024554B2 (en) Modifying an instruction stream using one or more bits to replace an instruction or to replace an instruction and to subsequently execute the replaced instruction
EP0997816B1 (en) Method and apparatus for selecting ways to compile at runtime
JP2000040007A (ja) バイトコ―ド・コンパイラのためのコ―ド生成
US7290254B2 (en) Combining compilation and instruction set translation
US7823140B2 (en) Java bytecode translation method and Java interpreter performing the same
KR20040111163A (ko) 명령의 시맨틱의 동적 변경
JP2007531075A (ja) プログラム・コードを変換するための共用コード・キャッシングの方法および装置
JP2004259252A (ja) Java(登録商標)プログラムでのバイトコードのコンパイル時間短縮システム及び方法
US20040244009A1 (en) Inline database for receiver types in object-oriented systems
CN111770204B (zh) 一种执行智能合约的方法、区块链节点和存储介质
JP2013257916A (ja) バーチャルマシン内でコンパイルされたメソッドを実行する頻度を決定する方法と装置
US6931638B2 (en) Method and apparatus to facilitate sharing optimized instruction code in a multitasking virtual machine
US6553426B2 (en) Method apparatus for implementing multiple return sites
Aslam et al. Optimized java binary and virtual machine for tiny motes
CN112214266A (zh) 欺骗调用链安卓脱壳方法、装置、存储介质及计算机设备
JP2006164294A (ja) Jitコンパイラを備えた仮想計算機
US8806459B2 (en) Java stack machine execution kernel dynamic instrumentation
JP2006202317A (ja) Jitコンパイラを備えた仮想計算機
JP2006134351A (ja) Jitコンパイラを備えた仮想計算機
Brandner et al. Embedded JIT compilation with CACAO on YARI
US20110321064A1 (en) Accelerated class check
EP4083785B1 (en) Profiling and optimization of compiler-generated code

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20081017

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20090120

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20090602