JP2008102748A - プログラム実行方法、言語処理系、及び実行時ルーチン - Google Patents

プログラム実行方法、言語処理系、及び実行時ルーチン Download PDF

Info

Publication number
JP2008102748A
JP2008102748A JP2006284809A JP2006284809A JP2008102748A JP 2008102748 A JP2008102748 A JP 2008102748A JP 2006284809 A JP2006284809 A JP 2006284809A JP 2006284809 A JP2006284809 A JP 2006284809A JP 2008102748 A JP2008102748 A JP 2008102748A
Authority
JP
Japan
Prior art keywords
variable
optimization
program
code
processing system
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
JP2006284809A
Other languages
English (en)
Inventor
Yuji Chiba
雄司 千葉
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.)
Hitachi Ltd
Original Assignee
Hitachi 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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2006284809A priority Critical patent/JP2008102748A/ja
Publication of JP2008102748A publication Critical patent/JP2008102748A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】
変数名を通じて変数を上書きする機能を提供するプログラミング言語では,上書機能を通じた上書きを考慮すると最適化できる機会が減るという課題がある。
【解決手段】
実行時に上書機能を通じて更新されうる変数の集合を求め,求めた集合に属さない変数については,リフレクション(615)による更新が発生しないものと仮定してコンパイル,最適化を適用する(614)。実行の過程で新たに変数が上書機能経由で更新可能になった場合には,その変数が上書機能経由で更新されえないと仮定して最適化したコードを無効化する(613)。
【選択図】図6

Description

本発明は,変数名を通じた上書きの機能を提供するプログラミング言語向け言語処理系における最適化処理技術に関する。
これまでのコンパイラは,メモリの内容が特定の値になると判っているとき,その情報をもとに,プログラムを最適化できる(非特許文献1)。最適化の具体例を図1の関数getVar()を使って説明する。まず,最適化を適用しない場合について述べる。関数getVar()を最適化せずにコンパイルすると図2のコードになる。図2のコードはアセンブリ言語で記述したものである。
図2のコードでは,まず,最初に命令movによって,変数varの値を格納するメモリを参照し,メモリの内容,つまり変数varの値をレジスタeaxにコピーする。ここでレジスタeaxは関数の返戻値を格納する役割を果たすものとする。命令movの実行が終了したら,続いて手続きから戻るための命令retを実行する。
つぎに,最適化を適用する場合について述べる。もし,図1のプログラムについて,変数varの値が必ず1であると判れば,コンパイルの際に最適化を適用し,図1のプログラムを図3のコードに変換できる。図3のコードでは,最初に命令movでレジスタeaxに値1を格納し,次に命令retで手続きから戻る。図3のコードは,図2のコードよりも高速に動作する。なぜなら,図3のコードは,変数varの値を格納するメモリにアクセスしないので,その分,実行に手間がかからないからである。
コンパイラが最適化を適用するには,コンパイル対象のプログラムに関する情報が必要になる。たとえば図1のプログラムを,図3のコードに最適化するには,「変数varの値は必ず1」という情報が必要である。コンパイラはコンパイル対象のプログラムを解析して,最適化に必要な情報を収集する。収集の結果,必要な情報が得られなければ最適化を適用することはできず,たとえば「変数varの値は必ず1」という情報なしに,図1のプログラムを,図3のコードに最適化することはできない。
コンパイラによる最適化を目的とした情報収集を困難にする従来技術の1つに,リフレクションなど,変数名を通じて変数の値を上書きする技術がある。リフレクションはJava(登録商標、以下同じ)などのプログラミング言語が提供する機能であり(非特許文献2),プログラムが自身の構成要素を参照する際に用いる。ここでプログラムの構成要素とは,クラスやインタフェース,メソッド,クラス変数やメンバ変数を意味する。リフレクションの実装によっては,リフレクションの機能を通じてクラス変数やメンバ変数の値を書き換えることもできる。
リフレクションなど,変数名を通じた変数の上書きが最適化に悪影響を及ぼす例を,図4を使って説明する。図4のプログラムはJavaで記述したものである。図4のプログラムは,クラスKlassを定義するもので,クラスKlass内では,クラス変数varを定義し,その初期値は1と指定している。ここでクラス変数varの定義には,クラス変数を参照可能な範囲を指定するための予約語privateがついており,この結果,クラス変数varは原則としてクラスKlass内のみから参照可能になっている。もしここで,クラス変数varが完全にクラスKlass内のみから参照可能なのであれば,クラス変数varの値は必ず1ということができる。なぜなら,クラス変数varの初期値は1であり,なおかつ,クラスKlassの定義の中に,クラス変数varの値を書き換える処理がないからである。
しかしながら図4のプログラムについて,クラス変数varの値が必ず1ということはできない。なぜなら図4のプログラムについては,Javaが提供するリフレクションを使うと,クラスKlassの外から,クラス変数varの値を書き換えられるからである。リフレクションを使って,クラス変数varの値を,クラスKlassの外から書き換えるプログラムを図5に示す。図5のプログラムは,まず最初にリフレクション用のメソッドforName()を呼び出して,クラス名を表す文字列”Klass”に対応するクラスへの参照を取得して変数cに格納し,次にメソッドgetDeclaredField()を呼び出して,変数cの指示先にあるクラスが宣言するメンバ変数群から,メンバ変数名を表す文字列”var”に対応するメンバ変数を表すインスタンスへの参照を変数fに格納し,次にメソッドsetAccessible()を呼び出して,変数fが参照するインスタンスを通じたメンバ変数の更新を可能にし,最後にメソッドsetInt()を呼び出して,変数fが参照するインスタンスに対応するクラス変数varの値を2に更新する。
図5に示したプログラムが,クラスKlassの外に存在しうることを考慮すると,図4のクラスKlassのみを解析しても,「クラス変数varの値は必ず1」という情報は得られないことが判る。この例が示すように,リフレクションなど,変数名を通じて変数の値を上書きする技術は最適化を阻害することがある。
このようなリフレクションを提供するプログラミング言語向けにも最適化を適用可能にするための従来技術として,コンパイラでプログラムの全体を解析し,リフレクションを通じて更新されうる変数を求める方法がある(非特許文献3)。この方法を使って,たとえば図4のプログラムについて「クラス変数varの値はリフレクション経由で更新されえない」という情報が得られれば,得られた情報に基づいてクラスKlassを解析することで,「クラス変数varの値は必ず1」という情報が得られる。
Alfred V. Aho, Ravi Sethi, and Jeffrey D. Ullman: Compilers Principles, Techniques, and Tools, pp.592, Addison-Wesley, 1986. Ken Arnold, James Gosling, and David Holmes: The Java Programming Language, 4th edition, Addison-Wesley, 2005. Bruno Blanchet: Escape Analysis for Java: Theory and Practice, ACM Transactions on Programming Languages and Systems, Vol. 25, Issue 6, pp.713775 (2003). Kazuaki Ishizaki, Motohiro Kawahito, Toshiaki Yasue, Hideaki Komatsu, Toshio Nakatani: A Study of Devirtualization Techniques for a Java Just-In-Time Compiler, In proceedings of the ACM SIGPLAN conference on Object Oriented Programming, Systems, Language and Applications, pp. 294-310 (2000). Urs Holzle, Craig Chambers, and David Ungar: Debugging optimized code with dynamic Deoptimization, In proceedings of the ACM SIGPLAN '92 Conference on Programming Language Design and Implementation, pp.32-43 (1992).
しかしながら従来技術には問題点が2つある。1つ目の問題はプログラム全体の解析が容易でない場合があることで,2つ目の問題はリフレクションによる更新の対象を特定できない場合があることである。
1つ目の問題点は,コンパイル時にプログラムの全体を把握しきれない場合に発生する。たとえばJavaではプログラムの実行を進めながら,随時,必要になったプログラム片を読み込む。したがってJavaでは,実行時にコンパイルをおこなう場合でも,コンパイルの時点で全てのプログラム片が読込済の状態になっているとは限らず,このとき全プログラムを対象とした解析は不可能になる。この問題は別の従来技法で解決されている(非特許文献4,5参照)。非特許文献4の技法では,読み込み済みのプログラム片のみがプログラムの全体だと仮定して解析をおこない,あとから追加読み込みをおこなったら,再度解析をやりなおす。
2つ目の問題点は,リフレクションのメソッドが受け取る引数が変数である場合に発生する。たとえば図5のプログラムについて考えると,リフレクションのメソッドforName()やgetDeclaredField()が受け取る引数は”Klass”や”var”といった定数であり,このプログラムを従来技術によって解析すると,図5のプログラムが更新しうる変数は,クラスKlassが定義するクラス変数varだと判る。しかしながらメソッドforName()やgetDeclaredField()が受け取る引数は変数の場合もあり,このとき,コンパイラの解析によって引数がとりうる値を特定しきれないケースも生じうる。特定しきれない場合には,たとえば全クラス変数が更新されうると想定する必要が生じ,結果として最適化を適用可能な範囲が狭まる。
本発明の目的は,変数名を通じて変数の値を上書きする機能を原因とする最適化の抑止を回避し,プログラムの実行を高速化することが可能なプログラム実行方法、言語処理系、及び実行時ルーチンを提供することにある。
上記目的を達成するため、本発明においては、記憶部と処理部とを有する計算機システムにおいて、記憶部に記憶した言語処理系のプログラムを使って、記憶部に記憶した実行対象のプログラムを実行するプログラム実行方法であって、実行対象のプログラムを、言語処理系の動的コンパイラを使って、記憶部の所定領域に記憶している変数の保持する値が不変であると仮定して最適化を適用し,言語処理系の実行時ルーチンを使って,実行対象のプログラムが、所定領域を,所定領域に対応する変数名を通じて上書きしうるか監視し,上書きの可能性が生じた場合に,動的コンパイラが前記所定領域に対応する変数の保持する値が不変と仮定して最適化を適用しつつ生成したコードを無効化するプログラム実行方法、及び言語処理系を提供する。
また、本発明は、動的コンパイラが、所定領域に記憶された変数が不変と仮定して最適化を適用してコードを生成する場合、どの変数が上書機能によって更新されえないと仮定したかを最適化記録として記録するプログラム実行方法、及び言語処理系を提供する。
更に、本発明は、プログラムを処理する処理部で実行される実行時ルーチンであって、プログラムが実行時ルーチンを使って,メモリに記憶された変数への上書きの可能性が生じた場合に,動的コンパイラがこのメモリの値が不変と仮定して最適化を適用しつつ生成した動的コンパイル済みコードを無効化する実行時ルーチンを提供する。
即ち、本発明の言語処理系においては、コンパイラと、変数名を通じて変数の値を上書機能を実現する実行時ルーチンを含み、このコンパイラは,上書機能によって変数が更新されえないと仮定して最適化に必要な情報を収集し,最適化を適用する。この最適化の適用にあたって,どの変数が上書機能によって更新されえないと仮定したかを最適化記録として記録する。一方、上書機能を実現する実行時ルーチンは,実行時に上書機能を通じて新たな変数が更新可能になるたびに,この変数が上書機能によって更新されえないと仮定して最適化されたコードの集合を,最適化記録を参照して求め,求めた集合に属するコードに無効化の処理を行う。ここで無効化の処理とは,コードをプログラムの実行に使えなくするための処理を意味する。コードを無効化したメソッドを実行する必要が生じた場合には,更新された変数を用い、再度動的コンパイル処理を行う、或いはインタプリタなど代替の実行手段を使う。
更に,本発明においては、上書機能を実現する実行時ルーチンは,上書機能を通じて,どの変数が更新されうるか更新可能変数記録として記録をとり、この更新可能変数記録がある場合,コンパイラは,該記録に記載されている変数について,上書機能を通じて更新されうるとみなして最適化処理を抑止可能になる。
なお、本明細書において、「言語処理系」とは、プログラミング言語で記述されたプログラムを計算機上で実行するためのソフトウエアのことを言う。また、本明細書において、プロセッサを処理部、主記憶とハードディスクを記憶部と呼ぶことがある。更に、変数などが記憶されている記憶部の所定領域をメモリと呼ぶことがある。
変数名を通じて変数の値を上書きする機能によって実行時に更新されない変数について,最適化を抑止する必要がなくなり,プログラムの実行を高速化できる。
本発明を実施する最良の言語処理系は,動的コンパイラと,変数名を通じて変数の値を上書きする機能を実現する実行時ルーチンからなる。この実行時ルーチンは更新可能変数記録を作成して動的コンパイラに引き渡し,動的コンパイラは更新可能変数記録に載っていない変数のみが実行時ルーチンによって更新されえないと仮定して最適化を適用し,動的コンパイル済みコードと,最適化記録を生成する。動的コンパイル済みコードが,実行時ルーチンによって無効化された場合には,再度、動的コンパイル処理をおこなうことで,無効化された動的コンパイル済みコードに代わる実行手段を用意する。
以下、本発明の第一の実施例である、言語処理系を実行する計算機システムを図6に示す。図6の計算機システムはプロセッサ601,主記憶602,ハードディスク603,DVD−ROM(Digital Versatile Disc Read Only Memory)読み取り装置604と,これらを結ぶバス605からなる。図6の計算機システムは,DVD−ROM606から,本実施例の言語処理系を読み取り,バス605を介してハードディスク603にインストールする。なお、言語処理系のインストールは、DVD−ROM606のような可搬記録媒体を使う場合のみならず、計算機システムの図示されていないネットワークインターフェースを用い、ネットワークからインストールすることも可能である。本実施例の言語処理系を実行する際には,ハードディスク603にインストールした言語処理系のプログラム607を,バス605を介して主記憶602に読み込み,プロセッサ601で実行する。本明細書において、プロセッサ601を処理部、主記憶602とハードディスク603を記憶部と呼ぶことがある。
本実施例の言語処理系607は,静的コンパイラ608と実行環境609から構成され,実行環境609は,インタプリタ610と動的コンパイラ611,実行時ライブラリ612,動的コンパイル済みコード無効化処理613を含む。動的コンパイラ611は最適化処理614を含み,実行時ライブラリ612はリフレクションルーチン615を含む。
次に、言語処理系607を使って,ソースコード616に記述したプログラムを実行するまでの過程を図7に示す。図7の過程では,まず,処理701でソースコード616を静的コンパイラ608によってコンパイルし,中間コード617に変換する。次に,処理702で中間コード617をインタプリタ610に入力してプログラムの実行を開始する。処理701でソースコード616を中間コード617に変換する理由は,ソースコード616のままインタプリタ610に解釈実行させると解釈に大きなコストがかかるからである。処理701におけるコンパイル作業では,出力するコードを中間コード617ではなく,機械コードとすることもでき,機械コードにはインタプリタ610を使わずにプロセッサ601で直接実行できるという利点があるが,一方で中間コードには機種非依存性を確保しうるという利点があり,本実施例では,処理701で出力するコードを中間コード617にする。
図7に戻り,処理702において,インタプリタ610は実行の過程で,個々のメソッドの実行頻度を求め,頻度が高いものについては,コンパイルするよう,動的コンパイラ611に指示する。指示を受け取った動的コンパイラ611は,中間コード617に対応する,機械コード形式の動的コンパイル済みコード703を生成する。動的コンパイルの過程では最適化処理614を適用する。最適化処理614は,更新可能変数記録704,すなわち,リフレクションを通じて更新されうる変数一式の記録を参照して,ここに記録されていない変数についてはリフレクションを通じて更新されえないと仮定して処理をおこなう。最適化処理614では,最適化を適用した場合,最適化記録705を生成する。最適化記録705は,個々のメソッドの動的コンパイル済みコードごとに作成するデータ構造であり,対応するメソッドを動的コンパイル,最適化する過程で,どの変数がリフレクションによって変更されえないと仮定したかを記録する。最適化記録705の実施例については後述する。
インタプリタ610は,メソッド呼出しを実行する際に,呼出先のメソッドに対応する動的コンパイル済みコード703があるか調べ,あるならば自身でそのメソッドを解釈実行する代わりに,動的コンパイル済みコード703を呼び出す。インタプリタ610や動的コンパイル済みコード703は,実行の過程で,実行時ライブラリ612を呼び出すことがあり,このとき呼出先がリフレクションルーチン615である場合もある。
本実施例のリフレクションルーチン615は,どの変数がリフレクションを通じて更新されうるか,更新可能変数記録704に記録し,また,更新可能変数記録704に記録された変数が,いずれかの動的コンパイル済みコード703の最適化記録705に含まれているか監視し,もし含まれているならば,動的コンパイル済みコード無効化処理613を呼び出して,対応する動的コンパイル済みコードを無効化する。無効化の処理は,具体的には,次の2つの処理からなる。(1)インタプリタ610でメソッド呼出しを実施する際に,無効化対象の動的コンパイル済みコードを呼び出さないようにするための処理。(2)無効化の時点で,無効化対象の動的コンパイル済みコードを実行途中ならば,実行をインタプリタ610に引き継ぐ処理。動的コンパイル済みコード無効化処理613は本発明に固有な処理ではなく,非特許参考文献5で言及されており,また,いくつかのJava向け実行環境で実現されている。本実施例における動的コンパイル済みコード無効化処理613の実現は,これら従来の実現に倣うものとする。
動的コンパイラ611の一実施例を図8に示す。図8の動的コンパイラ611は,まず,処理801において中間コード617を入力として受け取り,コンパイラの内部表現802に変換する。次に,内部表現802に対して,本発明の最適化処理614を適用する。最後に処理803で,最適化後の内部表現802を,動的コンパイル済みコード703に変換する。
最適化処理614の一実施例を図9に示す。図9の処理では,まず処理901において,空の最適化記録705を生成し,続く処理902で内部表現802から参照する変数の集合を求め,判断903で集合が空か確認し,空ならば最適化を終了し,空でないならば処理904に進む。処理904では集合から変数を1つ取り出し,続く判断905で変数が更新可能変数記録704に記録されているか調べ,記録されているならば最適化を諦めて判断903に戻り,記録されていないならば判断906に進む。
判断906では中間コード617を走査してリフレクション以外の手段による変数の更新が発生しうるか調べる。たとえば図4のプログラムに対応する中間コード617を走査すると,変数varの値を更新する処理は唯一,初期化処理の中あり,他に更新するコードがないと判ることから,初期化処理の実行より後で動的コンパイルをおこなった場合には,リフレクション以外の手段による変数varの更新は発生しないと判断する。判断906における調査の結果,発生しうると判ったならば最適化を諦めて判断903に戻り,発生しないと判ったならば処理907に進んで最適化をおこなう。具体的には,内部表現802中にある変数への参照を,変数が保持している値で差し替える。たとえば最適化対象の変数がvarで,なおかつ動的コンパイル時点における変数varの値が1であるとき,内部表現802中に「return (var);」に相当する処理があるならば,この処理中のvarを1で差し替える。差替の結果,「return (var);」は「return (1);」になる。処理907が終了したら処理908に進み,最適化対象の変数を最適化記録705に記録する。
記録後の最適化記録705の一実施例を図10に示す。図10の最適化記録705には,記録された変数の個数を記述する欄1001と,変数のアドレスを記述する欄1002がある。図10の最適化記録705は,変数varのアドレスが0x12345678であると仮定して,変数varのみを記録したものである。具体的には,変数の個数を記述する欄に1001に1を,変数のアドレスを記述する欄1002に0x12345678のみを記述した状態になっている。なお,図10に示した最適化記録は,大域変数のように,アドレスを唯一に定めることができる変数向けの最適化記録である。変数の中には,メンバ変数のように,アドレスが唯一に定まらず,データ構造の先頭からのオフセットのみが唯一に定まるものもある。メンバ変数を本発明の最適化の対象とする場合には,メンバ変数向け最適化記録として,図10のように変数のアドレスを記録する最適化記録ではなく,メンバ変数を宣言する型と,データ構造の先頭からのオフセットを記録する最適化記録を用いればよい。本実施例では,大域変数のように,アドレスを唯一に定めうる変数のみを最適化対象とする。
図9に戻り,処理908における最適化記録705への記入が終わったら,判断903に戻る。なお,図9では変数を対象として最適化をおこなっているが,最適化対象は必ずしも変数である必要はなく,変数が指示する配列中の要素などを最適化対象とすることもできる。また,図9の実施例で実施する最適化はコピー伝播(変数参照を変数の保持している値で差し替える最適化)だが,本発明はコピー伝播以外の最適化にも応用できる。たとえば図11のJavaで記述したプログラムでは,クラスDaysが文字列の配列daysとメソッドlength()を定義しており,メソッドlength()は引数dを受け取って,配列daysのd番目の要素が参照する文字列の長さを返すが,このプログラムに本発明の最適化を適用すると,メソッドlength()における処理内容を,dが0〜6の範囲にある場合には,単に3を返す処理 に最適化できる。なぜなら配列daysの個々の要素が参照する文字列の長さは全て3で,なおかつ,リフレクション以外に配列daysを上書きする手段がないからである。この最適化はコピー伝播とは異なる。
次に、リフレクションルーチン615の一実施例を図12に示す。リフレクションルーチン615は,インタプリタ610や動的コンパイル済みコード703によるプログラムの実行の過程で呼び出されるもので,たとえば図5のプログラムを実行すると呼び出される。図5のプログラムでは,文字列に対応するクラスへの参照を返戻するメソッドforName()や,文字列に対応する変数を表わすインスタンスを作成し,該インスタンスへの参照を返戻するメソッドgetDeclaredField(),変数の値を更新するメソッドsetInt()を呼び出すが,これらはいずれもリフレクションルーチンである。図12は,文字列に対応する変数を表わすインスタンスを作成し,該インスタンスへの参照を返戻するリフレクションルーチンの実施例であり,まず処理1201で文字列に対応する変数を表わすインスタンスを作成する。続く判断1202では前記変数が更新可能変数記録704に登録済みか調べ,登録済みでなければ処理1203に,さもなくば処理1209に進む。処理1203では前記変数を更新可能変数記録704に登録する。登録後の更新可能変数記録704の実施例を図13に示す。
図13の更新可能変数記録704には,登録された変数の数を記録する欄1301と,登録された変数のアドレスを記録する欄1302がある。図13はアドレス0x12345678の変数varのみ登録した状態を表している。具体的には,登録された変数の数を記録する欄1301の値が1になっており,登録された変数のアドレスを記録する欄1302には,変数varのアドレスが登録されている。
図11に戻り,処理1203に続いて処理1204で全ての最適化記録705を納めた集合を求める。続く判断1205で集合が空か調べ,空でなければ処理1206に進む。処理1206では集合から最適化記録705を1つ取り出して,続く判断1207で最適化記録705に前記変数が登録されているか調べ,登録されているならば,最適化記録705に対応する動的コンパイル済みコード703を無効化するために,処理1208で,動的コンパイル済みコード無効化処理613を呼び出す.無効化が終了した,あるいは登録されていなかったならば,判断1205に戻る。判断1205で集合が空にならば,処理1209に進み,処理1201で作成したインスタンスへの参照を返戻する。図11の処理のうち,本発明に固有な部分は判断1202〜処理1208であり,処理1201と処理1209は従来のリフレクションルーチンと変わりない。
図4のメソッドgetVar()を,本実施例の実行環境609で実行すると,次のように最適化される。まず,図7にあるように,インタプリタ610が動的コンパイラ611にメソッドgetVar()をコンパイルするよう指示すると,動的コンパイラ611は図8にあるように,本発明の最適化処理614の適用を試みる。図9に示した本発明の最適化処理614を適用すると,最適化の時点で変数varを1に初期化する処理が終わっており,なおかつ,更新可能変数記録704に変数varが登録されていなければ(リフレクションルーチンによって変数varを表わすインスタンスを作成したことがなければ),メソッドgetVar()のコードは最適化されて「return (1);」になり,また,この動的コンパイル済みコード703に対応する最適化記録705として,図10の最適化記録705が生成される。動的コンパイル後に図5のリフレクションを含む処理を実行すると,図11に示したリフレクションルーチン(文字列に対応する変数を表わすインスタンスを作成し,該インスタンスへの参照を返戻するリフレクションルーチン)を起動した時点で,処理1203で更新可能変数記録704に変数varが登録され,また,getVar()の最適化記録705に変数varが登録されていることから,処理1208においてgetVar()の動的コンパイル済みコードが無効化される。動的コンパイル済みコードが無効化されたgetVar()は,無効化後しばらくの間,インタプリタ610で実行され,再度動的コンパイラ111によってコンパイルされることもありうるが,再コンパイルの際には,更新可能変数記録704に変数varが登録されていることから,再度getVar()に処理907の最適化処理が適用されることはなくなる。
なお,本実施例の言語処理系607は,マルチスレッドを考慮した作りにはなっていない。マルチスレッドの機能を提供する場合には,排他制御などの処理を追加する必要が生じる。具体的には,マルチスレッド環境で動的コンパイラ611とリフレクションルーチン615が並列に動作すると,それぞれが参照するデータ構造(更新可能変数表704と最適化記録705)を,それぞれが書き換えたうるので,それに対処する処理が必要になる。たとえば,動的コンパイラ611が最適化処理614の時点で参照した更新可能変数表704の内容は,動的コンパイルの終了までに変化している可能性があり,変化が生じた場合には動的コンパイル中のコードを無効にするといった処理が必要になる。マルチスレッド対応するには,簡単には,動的コンパイラ611とリフレクションルーチン615に排他制御を適用し,これらの処理を同時に実行しうるスレッドの数を唯一に制限すればよい。
以上のように、本発明によれば,プログラム全体を解析せずとも,また,どの変数がリフレクションなどの対象になりうるか解析できない場合であっても,リフレクションなどを原因とする最適化の抑止を解除可能になる。例えば、Javaのリフレクション機能など,変数名を通じて変数を上書きする機能を提供するプログラミング言語向けの言語処理系において,プログラムの実行を高速化できる。
ソースコードの例を示す図。 コンパイル済みコードの例を示す図。 コンパイル済みコードの例を示す図。 ソースコードの例を示す図。 リフレクションを使うソースコードの例を示す図。 本発明の言語処理系を駆動する計算機システムの一実施例を示す図。 第一の実施例の言語処理系607の一実施例を示す図。 第一の実施例の動的コンパイラ611の一実施例を示す図。 第一の実施例の最適化処理614の一実施例を示す図。 第一の実施例の最適化記録705の一実施例を示す図。 第一の実施例におけるソースコードの一例を示す図。 第一の実施例のリフレクションルーチン615の一実施例を示す図。 第一の実施例の更新可能変数記録704の一実施例を示す図。
符号の説明
617…中間コード、704…適化対象外の変数の集合、705…最適化を適用した変数の集合、802…コンパイル対象のメソッドの内部表現、901…最適化を適用した変数の集合を確保,空に初期化する処理、902…内部表現中から参照する変数の集合を求める処理、903…集合が空か否かの判断、904…集合から変数を1つ取り出す処理、905…変数が最適化対象か否かの判断、906…変数が最適化対象か否かの判断、907…最適化を適用する処理、908…変数を集合に加える処理。

Claims (5)

  1. 記憶部と処理部とを有する計算機システムにおいて、前記記憶部に記憶した言語処理系のプログラムを使って、前記記憶部に記憶した実行対象のプログラムを実行するプログラム実行方法であって、
    前記実行対象のプログラムを、前記言語処理系の動的コンパイラを使って、前記記憶部の所定領域に記憶している変数の保持する値が不変であると仮定して最適化を適用し,
    前記言語処理系の実行時ルーチンを使って,前記実行対象のプログラムが、前記所定領域を,前記所定領域に対応する変数名を通じて上書きしうるか監視し,
    前記上書きの可能性が生じた場合に,前記動的コンパイラが前記所定領域に対応する前記変数の保持する値が不変と仮定して最適化を適用しつつ生成したコードを無効化する
    プログラム実行方法。
  2. 請求項1記載のプログラム実行方法であって、
    前記動的コンパイラは、前記最適化を適用した場合、不変であると仮定した前記変数を最適化記録に記録し、
    前記実行時ルーチンは、前記最適化記録を参照して、前記コードの無効化を実行する
    プログラム実行方法。
  3. プログラムを記憶する記憶部と前記プログラムを処理する処理部とを有する計算機システムにおける言語処理系であって、
    前記プログラムの実行時に,前記記憶部の所定領域に記憶されている変数を確認し,確認した前記変数が不変であると仮定して最適化を適用する動的コンパイラと,
    前記プログラムが実行時ルーチンを使って,前記所定領域を,前記所定領域に対応する変数名を通じて上書きしうるか監視し,前記上書きの可能性が生じた場合に,前記動的コンパイラが前記所定領域の前記変数が不変と仮定して最適化を適用しつつ生成したコードを無効化する実行時ルーチンとを含む
    言語処理系。
  4. 請求項3記載の言語処理系であって、
    前記動的コンパイラは、前記最適化を適用した場合、不変であると仮定した前記変数を最適化記録に記録し、
    前記実行時ルーチンは、前記最適化記録を参照しながら、前記コードの無効化を実行する
    言語処理系。
  5. 動的コンパイラを含むプログラムを処理する処理部で実行される実行時ルーチンであって、
    前記プログラムが前記実行時ルーチンを使って,
    メモリへの上書きの可能性が生じた場合に,前記動的コンパイラが前記メモリの値が不変と仮定して最適化を適用しつつ生成した動的コンパイル済みコードを無効化する
    実行時ルーチン。
JP2006284809A 2006-10-19 2006-10-19 プログラム実行方法、言語処理系、及び実行時ルーチン Pending JP2008102748A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2006284809A JP2008102748A (ja) 2006-10-19 2006-10-19 プログラム実行方法、言語処理系、及び実行時ルーチン

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2006284809A JP2008102748A (ja) 2006-10-19 2006-10-19 プログラム実行方法、言語処理系、及び実行時ルーチン

Publications (1)

Publication Number Publication Date
JP2008102748A true JP2008102748A (ja) 2008-05-01

Family

ID=39437032

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006284809A Pending JP2008102748A (ja) 2006-10-19 2006-10-19 プログラム実行方法、言語処理系、及び実行時ルーチン

Country Status (1)

Country Link
JP (1) JP2008102748A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9027008B2 (en) 2012-04-25 2015-05-05 International Business Machines Corporation Method, computer, and computer program for speculatively optimizing code
US9032190B2 (en) 2009-08-24 2015-05-12 International Business Machines Corporation Recovering from an error in a fault tolerant computer system

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9032190B2 (en) 2009-08-24 2015-05-12 International Business Machines Corporation Recovering from an error in a fault tolerant computer system
US9027008B2 (en) 2012-04-25 2015-05-05 International Business Machines Corporation Method, computer, and computer program for speculatively optimizing code

Similar Documents

Publication Publication Date Title
US7490320B2 (en) Method and apparatus for transforming Java Native Interface function calls into simpler operations during just-in-time compilation
KR101354796B1 (ko) 소프트웨어 트랜잭션 메모리 블록들을 포함하는 프로그램의컴파일을 위한 방법
US6078744A (en) Method and apparatus for improving compiler performance during subsequent compilations of a source program
Van Put et al. Diablo: a reliable, retargetable and extensible link-time rewriting framework
US5907709A (en) Development system with methods for detecting invalid use and management of resources and memory at runtime
US5768592A (en) Method and apparatus for managing profile data
JP4833206B2 (ja) 最適化されたプログラムのためのアンワインド情報の生成
US20090024986A1 (en) Runtime code modification
US8352921B2 (en) Static analysis defect detection in the presence of virtual function calls
US20090248721A1 (en) System And Method for Stack Crawl Testing and Caching
US10942718B2 (en) Systems and/or methods for type inference from machine code
JP2012506094A (ja) ランタイムにおいて生成したコードのキャッシュへの格納
US20090319554A1 (en) Unified metadata for external components
US8856752B2 (en) Monitoring asset state to enable partial build
JPH09101897A (ja) オブジェクト指向c++言語のソースコードから実行可能コードを生成する方法および装置
US20090320007A1 (en) Local metadata for external components
US20130024675A1 (en) Return address optimisation for a dynamic code translator
US7086044B2 (en) Method, article of manufacture and apparatus for performing automatic intermodule call linkage optimization
US7624381B1 (en) Portable detection of start and completion of object construction
Kang Function call interception techniques
Smowton I/O Optimisation and elimination via partial evaluation
JP2008102748A (ja) プログラム実行方法、言語処理系、及び実行時ルーチン
Lavoie et al. Portable and efficient run-time monitoring of javascript applications using virtual machine layering
Kuhlenschmidt et al. Efficient gradual typing
Häubl et al. Trace transitioning and exception handling in a trace-based JIT compiler for Java