JP2005346407A - 動的コンパイルにおけるインライン展開実施方法 - Google Patents
動的コンパイルにおけるインライン展開実施方法 Download PDFInfo
- Publication number
- JP2005346407A JP2005346407A JP2004165246A JP2004165246A JP2005346407A JP 2005346407 A JP2005346407 A JP 2005346407A JP 2004165246 A JP2004165246 A JP 2004165246A JP 2004165246 A JP2004165246 A JP 2004165246A JP 2005346407 A JP2005346407 A JP 2005346407A
- Authority
- JP
- Japan
- Prior art keywords
- history
- java
- code
- registered trademark
- method call
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
【課題】 インタプリタを用いてバイトコードを実行するJava(登録商標)等の仮想マシンでは、実行頻度の高いメソッド呼出しに対して、そのバイトコードをコンパイルすることにより実行効率を改善する最適化が行われている。しかし、コンパイルが実施された場合に、コンパイルされたバイトコード中のメソッド呼出しに対してインライン展開が実施されない場合がある。動的メソッド呼出しをサポートしているために、実際に呼び出されるメソッドをコンパイル時に決定することができないためである。
【解決手段】 本発明は、インタプリタによる実行時に各メソッド呼出しの履歴を記録する。コンパイルが実施された場合には、その履歴を参照することで動的メソッド呼出しについてもインライン展開を実施し、コンパイルコードの実行効率を改善するものである。
【選択図】 図1
【解決手段】 本発明は、インタプリタによる実行時に各メソッド呼出しの履歴を記録する。コンパイルが実施された場合には、その履歴を参照することで動的メソッド呼出しについてもインライン展開を実施し、コンパイルコードの実行効率を改善するものである。
【選択図】 図1
Description
本発明はインタプリタを用いてバイトコードを実行することによりプログラムの実行を行うJava(登録商標)等について動的にコンパイルを使用する方法に関し、より詳しくは動的コンパイル時のインライン展開の方法に関する。
インタプリタを用いてバイトコードを実行するJava(登録商標)等の仮想マシンでは、実行頻度の高いメソッド呼出しに対して、その呼び出されるメソッドのバイトコードをコンパイルしてマシンコードを生成することにより実行効率を改善する最適化が行われている。
しかし、コンパイルが実施された場合に、コンパイルされたバイトコード中のメソッド呼出しに対してインライン展開が実施されない場合がある。Java(登録商標)等では、実行時に与えられるレシーバクラスに基づいて呼び出されるメソッドを決定する動的メソッド呼出しをサポートしているため、実際に呼び出されるメソッドをコンパイル時に決定することができないためである。
本発明は、インタプリタによる実行時に、各メソッドについて、それが呼び出すメソッドの履歴を記録する。コンパイルが実施された場合には、コンパイルされるバイトコード中のメソッド呼出しについて、前記インタプリタ実行中のメソッド呼出しの履歴を参照することにより、動的メソッド呼出しについてもインライン展開を実施する。
本発明によれば、従来はインライン展開が実施されなかった動的メソッド呼出しについてもインライン展開を実施するため、コンパイルコードの実行効率を改善することができる。
以下、本発明を実施するための最良の形態について図面に基づいて詳細に説明する。
図1は本発明の適用対象が動作する計算機システムの例である。計算機システムはプロセッサ107・主記憶108・ディスク109から構成され、これらがバス110によって結合されている。本発明を適用した言語処理系であるJava(登録商標)仮想マシン102はディスク109から主記憶108へ読み出され、プロセッサ107で実行される。Java(登録商標)仮想マシン102は、Java(登録商標)インタプリタ部103とJava(登録商標)JITコンパイラ部104によりバイトコード列101を実行する。Java(登録商標)インタプリタ部103は、バイトコード列101中のバイトコードをデコードし、バイトコードの各命令に対応した処理ルーチンを呼び出して実行する。このときJava(登録商標)インタプリタ部103は、実行したバイトコードのメソッド呼出しに関する実行の履歴をメソッド呼出し履歴105として記録する。Java(登録商標)JITコンパイラ部104はバイトコード列101の一部をコンパイルしてマシンコード106を生成し、そのマシンコードを実行する。一度生成されたマシンコードはJava(登録商標)仮想マシン102内に保存され、対応するバイトコード列が再度実行される場合には、その保存してあるマシンコードを実行する。
図2はJava(登録商標)仮想マシン102におけるバイトコードの実行手順の詳細を表すフローチャートである。まずバイトコードを読み取り(ステップ201)、それがメソッド呼出しを意味するバイトコードかどうかを判定する(ステップ202)。メソッド呼出しを意味するバイトコードでない場合には、バイトコードの命令に対応した処理ルーチンを呼び出すバイトコード実行処理(ステップ203)を行う。その後、そのバイトコードが最後のバイトコードかどうかを判定し(ステップ209)、最後のバイトコードである場合には全体の処理が終了する。最後のバイトコードではなく、さらに実行すべきバイトコードが存在する場合には、ステップ201に戻り処理を継続する。ステップ202においてメソッド呼出しを意味するバイトコードである場合には、呼び出されるメソッドが既にJava(登録商標)JITコンパイラ部によりコンパイル済みであるかどうかを判定する(ステップ204)。コンパイル済みである場合には対応するマシンコードの実行を行う(ステップ205)。ステップ204においてコンパイル済みでない場合、当該メソッド呼出しについてのメソッド呼出し履歴を登録する(ステップ206)。このメソッド呼出し履歴の登録処理が本発明において追加したものであり、その詳細は後述する。その後、当該メソッド呼出しがコンパイル条件を満たすかどうかを判定する(ステップ207)。このとき、呼び出されるメソッドがこれまでに呼び出された総回数が定められた閾値を越えたかどうか、などが一般的なコンパイル条件として使用される。すべてのメソッドをJava(登録商標)JITコンパイルするのではなくステップ207の判定が設けられているのは、Java(登録商標)JITコンパイル時間もバイトコード列全体の実行時間に含まれることから、コンパイルしたことによるその後のそのメソッドの実行時間の短縮がコンパイル時間より大きくないとバイトコード列全体としての実行時間の短縮にならないためである。一般には、あるメソッドの呼出し回数を実行前に知ることができないため「そのメソッドがこれまでに呼び出された総回数」を判定値として用い、これまでに呼ばれた回数が多いものは今後も呼ばれる可能性が高いという予測により判定されている。コンパイル条件を満たす場合には呼び出されるメソッドに対応するバイトコード列に対してJava(登録商標)JITコンパイル処理を行いマシンコードが生成される(ステップ208)。それから、生成されたマシンコードを実行する(ステップ205)。ステップ207において当該メソッド呼出しがコンパイル条件を満たさなかった場合はステップ203のバイトコード実行処理により、そのバイトコードを実行する。
図3はメソッド呼出し履歴登録処理(ステップ206)の実行手順の詳細を表すフローチャートである。履歴登録処理では図4と図5の履歴テーブルにメソッド呼出しの情報を登録する。図4の履歴テーブルは各メソッド呼出しバイトコードに対して一個づつ割り付けるものであり、メソッド識別子401と整数値を格納するcaller_count402の2つのフィールドを持つ。図5の履歴テーブルは各メソッドに対して一個づつ割り付けるものであり、整数値を格納するcallee_count501のフィールドを持つテーブルが本発明において追加したものである。502は従来から使用されている各メソッドの情報を格納するテーブルであり、メソッド識別子・返却値の型・パラメタのサイズなどを格納している。callee_count501のフィールドを持つ履歴テーブルは、このテーブル502から辿れるようにするか、または、callee_count501のフィールドをテーブル502に追加してもよい。メソッド呼出し履歴登録処理(ステップ206)では、まず呼び出されるメソッドが持つ履歴テーブルにおけるcallee_countフィールドの内容を1増やす(ステップ301)。なお、callee_countフィールドの初期値は0である。次に、その呼び出されるメソッドの履歴テーブルにおけるcallee_countフィールドの内容を1次変数countに格納する(ステップ302)。その後、当該メソッド呼出しバイトコードが持つ履歴テーブルのcaller_countフィールドの値をcountの値と比較する(ステップ303)。countの値がcaller_countフィールドの値より小さい場合には履歴登録処理を終了する。他方、countの値がcaller_countフィールドの値と等しいかより大きい場合には、さらに次の処理を行う。まず、当該メソッド呼出しバイトコードが持つ履歴テーブルのcaller_countフィールドにcountの値を格納する(ステップ304)。次に、当該メソッド呼出しバイトコードが持つ履歴テーブルのメソッド識別子フィールドに、呼び出されるメソッドの識別子を格納する(ステップ305)。
図6はJITコンパイル処理(ステップ208)の実行手順の詳細を表すフローチャートである。まず、バイトコード列を中間コードに変換する(ステップ601)。その後、中間コード中のメソッド呼出しについて呼び出されるメソッドのインライン展開処理を実施する(ステップ602)。このとき、当該メソッド呼出しがもつ履歴テーブルを参照し、そのメソッド識別子フィールドに格納されているメソッドが既にJITコンパイル済みである場合は、そのメソッドをインライン展開する。このとき、Java(登録商標)では、実行時に与えられるレシーバクラスに基づいて呼び出されるメソッドを決定する動的メソッド呼出しをサポートしているため、インライン展開においては、実際に呼び出されるメソッドがインライン展開されたものであるかどうかを検査するコードを追加することが必要である。詳細については、後述する実施例において説明する。最後に、中間コードからマシンコードを生成する(ステップ603)。
図7は本発明を適用したJava(登録商標)仮想マシンによりJava(登録商標)JITコンパイルを実施した例である。Java(登録商標)仮想マシンがメソッド701中のメソッド呼出し”obj.caller(some_obj);”に対応するバイトコードをJITコンパイル処理208にて処理する場合について述べる。メソッド701中で使用しているクラス定義は”Base.func”が持つ履歴テーブルは703であり、メソッド”Derived.func”が持つ履歴テーブルは704であるとする。703と704の履歴テーブルは、それぞれメソッド”Base.func”の情報テーブル707と”Derived.func”の情報テーブル708から辿れる。さらに、メソッド呼出し”obj.caller(some_obj);”に対応するバイトコードが持つ履歴テーブルは705とする。まず、中間コード生成処理601においてメソッド”Derived.caller”の中間コードを生成する。その後、インライン展開処理602においてメソッド呼出し”obj.caller(some_obj);”の中間コードに対してインライン展開を実施する。このとき、メソッド呼出し”obj.caller(some_obj);”のバイトコードに対応する履歴テーブル705のメソッド識別子は”Derived.func()”であるため、メソッド”Derived.func”のJITコンパイル済みのコードをインライン展開する。ここでは、メソッド”Derived.func”は既にJITコンパイル済みである場合を仮定している。履歴テーブル705においてメソッド識別子が”Derived.func()”となっているが、これは以前のメソッド呼出し”obj.caller(some_obj);”に対応するバイトコードの実行時にメソッド呼出し履歴登録処理206により記録されたものである。メソッド呼出し”obj.caller(some_obj);”からは”Base.func”と”Derived.func”が呼ばれたことがあるとした場合、履歴テーブル704のcallee_countの値が履歴テーブル703のcallee_countの値よりも大きいため”Derived.func”が記録されたものである。最後に、マシンコード生成処理603により生成されたマシンコードが706である。706においてR0・R1・R2はレジスタを表す。実際に呼び出されるメソッドがインライン展開されたものであるかどうかを検査するコードが706の4行目である。R2には実際に呼び出すメソッドのアドレスが入っており、インライン展開したメソッドである”Derived.func”のアドレスとそれが等しいかどうかを判定し、等しい場合のみにインライン展開したコードを実行するようにしている。
101…バイトコード列、102…Java(登録商標)仮想マシン、103…Java(登録商標)インタプリタ部、104…Java(登録商標)JITコンパイラ部、105…メソッド呼出し履歴、106…マシンコード、107…プロセッサ、108…主記憶、109…ディスク、110…バス。
Claims (2)
- 実行頻度の高いメソッド呼出しに対して、そのバイトコードをコンパイルして実行する機能を有するインタプリタにおいて、インタプリタ実行時にメソッド呼出しの履歴を記録し、コンパイル時にその履歴を参照することにより動的メソッド呼出しのインライン展開を実施する動的コンパイル方法。
- 請求項1記載の動的コンパイル方法を利用したプログラミング言語処理系。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2004165246A JP2005346407A (ja) | 2004-06-03 | 2004-06-03 | 動的コンパイルにおけるインライン展開実施方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2004165246A JP2005346407A (ja) | 2004-06-03 | 2004-06-03 | 動的コンパイルにおけるインライン展開実施方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2005346407A true JP2005346407A (ja) | 2005-12-15 |
Family
ID=35498722
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2004165246A Pending JP2005346407A (ja) | 2004-06-03 | 2004-06-03 | 動的コンパイルにおけるインライン展開実施方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2005346407A (ja) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2007213490A (ja) * | 2006-02-13 | 2007-08-23 | Fujitsu Ltd | アプリケーションサーバシステムおよび仮想マシンプログラム |
JP2012053566A (ja) * | 2010-08-31 | 2012-03-15 | Internatl Business Mach Corp <Ibm> | コード生成方法、システム及びプログラム |
JP2012088812A (ja) * | 2010-10-15 | 2012-05-10 | Internatl Business Mach Corp <Ibm> | プロファイル計装方法、プログラム及びコンパイラ |
JP2014049056A (ja) * | 2012-09-04 | 2014-03-17 | Fujitsu Ltd | 情報処理装置、ログ出力方法およびログ出力プログラム |
KR101778479B1 (ko) | 2013-08-30 | 2017-09-26 | 애플 인크. | 동적 타입 객체들에 액세스함에 있어서의 동시 인라인 캐시 최적화 |
JP2018028777A (ja) * | 2016-08-17 | 2018-02-22 | Necプラットフォームズ株式会社 | エミュレーション装置、エミュレーション方法、及び、エミュレーションプログラム |
-
2004
- 2004-06-03 JP JP2004165246A patent/JP2005346407A/ja active Pending
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2007213490A (ja) * | 2006-02-13 | 2007-08-23 | Fujitsu Ltd | アプリケーションサーバシステムおよび仮想マシンプログラム |
US8332845B2 (en) | 2006-02-13 | 2012-12-11 | Fujitsu Limited | Compile timing based on execution frequency of a procedure |
JP2012053566A (ja) * | 2010-08-31 | 2012-03-15 | Internatl Business Mach Corp <Ibm> | コード生成方法、システム及びプログラム |
US9235394B2 (en) | 2010-08-31 | 2016-01-12 | International Business Machines Corporation | Method and system for code generation and inlining |
JP2012088812A (ja) * | 2010-10-15 | 2012-05-10 | Internatl Business Mach Corp <Ibm> | プロファイル計装方法、プログラム及びコンパイラ |
US8782623B2 (en) | 2010-10-15 | 2014-07-15 | International Business Machines Corporation | Profiler for executing computer program |
JP2014049056A (ja) * | 2012-09-04 | 2014-03-17 | Fujitsu Ltd | 情報処理装置、ログ出力方法およびログ出力プログラム |
KR101778479B1 (ko) | 2013-08-30 | 2017-09-26 | 애플 인크. | 동적 타입 객체들에 액세스함에 있어서의 동시 인라인 캐시 최적화 |
JP2018028777A (ja) * | 2016-08-17 | 2018-02-22 | Necプラットフォームズ株式会社 | エミュレーション装置、エミュレーション方法、及び、エミュレーションプログラム |
US10268462B2 (en) | 2016-08-17 | 2019-04-23 | Nec Platforms, Ltd. | Emulation device, emulation method, and recording medium storing emulation program |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9043768B2 (en) | System and method for efficient compilation and invocation of function type calls | |
US6381737B1 (en) | Automatic adapter/stub generator | |
US6003095A (en) | Apparatus and method for demand loading a dynamic link library | |
JP5473768B2 (ja) | マルチパス動的プロファイリングのためのコンピュータに実行させる方法、システム及びコンピュータ・プログラム | |
US7171649B1 (en) | Optimizing safe downcasting in an object-oriented programming language | |
JP5818695B2 (ja) | コード変換方法、プログラム及びシステム | |
US8464230B2 (en) | Methods and systems to implement non-ABI conforming features across unseen interfaces | |
US6553426B2 (en) | Method apparatus for implementing multiple return sites | |
US7458071B2 (en) | Compilation method, compiler apparatus and compiler | |
US9164783B2 (en) | Load time resolution for dynamic binding languages | |
JP2002297396A (ja) | コンパイラ、変換プログラム、例外処理プログラム及びこれらを用いたコンピュータ装置 | |
JP5496792B2 (ja) | コード変換プログラム、方法及びシステム | |
JP2005346407A (ja) | 動的コンパイルにおけるインライン展開実施方法 | |
CN108984223A (zh) | 一种程序调用解耦方法、装置、电子设备及存储介质 | |
US20050246677A1 (en) | Native method invocation (NMI) custom marshalling stub service | |
JP2006163686A (ja) | コンパイル方法、コンパイルプログラム、コンパイル装置およびコンパイル用の記録媒体 | |
JP2007226784A (ja) | インラインされたメソッドの呼出方法およびそれを用いたジャバ仮想マシン | |
CN111596970A (zh) | 动态库延迟加载方法、装置、设备和存储介质 | |
US20050125783A1 (en) | Program optimization with intermediate code | |
JP2005284729A (ja) | バイトコードをネイティブコードにコンパイルする仮想マシン | |
JP2003241967A (ja) | プログラム実行装置およびその方法、並びにそこで実行されるプログラム | |
WO2022046198A1 (en) | Thread-local return structure for asynchronous state machine | |
CN108920219B (zh) | 一种基于开放平台的业务处理方法及装置 | |
US8843888B2 (en) | Characterizing artificiality in object code | |
KR20100099569A (ko) | 실행 파일 생성 방법 및 그 방법을 이용하는 시스템 장치 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
RD04 | Notification of resignation of power of attorney |
Effective date: 20060424 Free format text: JAPANESE INTERMEDIATE CODE: A7424 |