JP2010267291A - コンピュータ・システム、コンピュータ読取り可能な記憶媒体および同媒体を動作させる方法、およびコンピュータ・システムを動作させる方法 - Google Patents
コンピュータ・システム、コンピュータ読取り可能な記憶媒体および同媒体を動作させる方法、およびコンピュータ・システムを動作させる方法 Download PDFInfo
- Publication number
- JP2010267291A JP2010267291A JP2010156628A JP2010156628A JP2010267291A JP 2010267291 A JP2010267291 A JP 2010267291A JP 2010156628 A JP2010156628 A JP 2010156628A JP 2010156628 A JP2010156628 A JP 2010156628A JP 2010267291 A JP2010267291 A JP 2010267291A
- Authority
- JP
- Japan
- Prior art keywords
- code
- compiled
- execution
- thread
- computer 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4812—Task transfer initiation or dispatching by interrupt, e.g. masked
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3612—Software analysis for verifying properties of programs by runtime analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
- G06F12/0269—Incremental or concurrent garbage collection, e.g. in real-time systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
- G06F8/4442—Reducing the number of cache misses; Data prefetching
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/445—Exploiting fine grain parallelism, i.e. parallelism at instruction level
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4482—Procedural
- G06F9/4484—Executing subprograms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
- G06F9/4491—Optimising based on receiver type
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/48—Indexing scheme relating to G06F9/48
- G06F2209/481—Exception handling
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99931—Database or file accessing
- Y10S707/99932—Access augmentation or optimizing
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99951—File or database maintenance
- Y10S707/99952—Coherency, e.g. same view to multiple users
- Y10S707/99953—Recoverability
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99951—File or database maintenance
- Y10S707/99956—File allocation
Abstract
【解決手段】方法がファイナルであると仮定する第1のクラスへの呼出しをコンパイリング・システムによりコンパイルするステップと、第2のクラスの出現を決定し、そしてさらに第2のクラスが第1のクラスの方法のインスタンスを含むか否かを決定するステップと、第2のクラスにおける方法のインスタンスが第1のクラスの方法をオーバーライドしているか否かを決定するステップと、第2のクラスにおける方法のインスタンスが第1のクラスの方法をオーバーライドしているか否かのさらなる決定に応答して第1のクラスの方法の前記コンパイルされたコードを変更するステップと、変更されたコンパイルされたコードに従って前記コンピュータ・システムを動作するステップとを含む。
【選択図】図9A
Description
このような状況の下では、プログラマは、「外部」アプリケーションが、ユーザに関するかぎり、エミュレーションが見えないような方法で良好に走らせることができるように、ホスト・コンピュータのオペレーティング・システムを「エミュレート」するソフトウエアを創り出した。換言すれば、ユーザは、自分がしていることを知ることなく、例えばユニックス・ベースのオペレーティング・システムを用いてウインドウズ・ベースのアプリケーションの正常なファンクションの全てをユニックス・マシン上で実施することができる。
更にまた、相互に自由に開発されオペレーティング・システムとプロトコル間の非互換性をもたらしたコンピュータのような簡単な電子装置、通信および制御システムに対する消費者による増加の一途をたどる需要が存在する。例えば、ビデオ・プレーヤ、テープ・プレーヤおよびCDプレーヤに対するリモート・コントロール装置は、「再生」、「前送り」、「逆送り」、「休止」などが共通する似たようなファンクションを持つが、ユーザにより操作されるリモート・コントロールすなわちコマンダ間の送信コードは、同じ製造者により作られた異なる種類の装置間、あるいは異なる製造者により作られた同じ種類の装置間では互換性がない。例えば、装置において使用される特定のハードウエアのいかんを問わない「再生」コマンドに基く正しい「再生」コードを生じ得る装置内のソフトウエアを備えるという明らかな利益が存在しよう。このようなソフトウエアは、「仮想マシン」として一般に知られる。
エミュレーション・ソフトウエア・パッケージは、とりわけ汎用ではなく専用のものであるという幾つかの特徴が共通する傾向がある。これらのパッケージは、急激な開発地域において最も利益があり、製造者がコストを節減することを可能にするという明白な利点を有する。特に、これらパッケージは、物理的なマシンからソフトウエアを分離することができ、すなわち、ソフトウエアの作用の変更を実現するのにマシンの固有ソフトウエアに立入ることを必要とすることなく、エミュレート・ソフトウエアによって物理的マシンにおけるソフトウエアの作用を変えることができる。
仮想マシン、特にオブジェクト指向言語を用いるマシンの使用における余裕および利点があることは認められるが、システム内で行われる動作の一部を最適化することが重要でありかつ有利である領域が当然のこととして存在する。これらは、メモリ要求を減らし、動作速度を増し、別のシステムに組込まれるときシステムの「透過」を改善することを含む。本文に述べる本発明の主たる目的の1つは、メモリの制約内でできるだけ迅速に、例えば10、5、2Mバイト、更には1Mバイト以下で動作するよう最適化される仮想マシンを提供することである。このような制約は、例えば、コスト(またはサイズ)が主な制約となる簡単な電子装置その他の装備に適用されがちである。
適切な場合に、純粋に事例として、(上記の改善を略図的に示す)添付図面が参照される。
図1は仮想マシンの一定の構成要素を示す。
仮想マシンの望ましい実施の形態の特定例について、図1に関して次に記述する。
仮想マシン20は、機器22の特定アイテムに組込まれる実行可能なコードである。このマシンは、ハードウエアおよびオペレーティング・システムからある程度の独立性を提供することができる。仮想マシンは、典型的に、下記の特徴のどれか、一部あるいは全てを含み得る。すなわち、オペレーティング・エンジン、ルーチンのライブラリ、1つ以上のインタプリタ、1つ以上のコンパイラ、複数の命令シーケンスを記憶する記憶手段、キュー管理手段、およびバッファ管理手段である。
参照事項1−コンピュータ・システム、コンピュータ読取可能な記憶媒体およびこの媒体を動作させる方法、および前記システムを動作させる方法
本発明は、コンピュータ・システムに関し、かつコンピュータ・システムを動作させる方法に関する。特に、本発明は、実行のためのコードをコンパイルするコンパイラを含むコンピュータ・システムに関する。望ましい実施の形態において、本発明は、ドミナント・パスのダイナミック・コンパイル法に関する。
本発明は、望ましくは、ランタイムのコンパイル技術によるオブジェクト指向言語のランタイム表示の最適化に関し、かつ望ましくは、ランタイムのコンパイル技術によるオブジェクト指向言語のランタイム表示の最適化に関する。本発明の特質は、仮想マシン、特にジャバ仮想マシンの最適化された実行に関するものである。
例えばジャバ言語を用いる一部のアプリケーションにおいて、コードは、インタプリタを用いる直接的に解釈される。インタプリタは、実行中にコードを翻訳し、これによりコードの解釈は非常に遅くなり得る。従って、このような実行は一般に解釈より非常に速いので、コンパイルされたコードの実行が選好される。
標準的なコンパイラは、アプリケーションの全てのコードを翻訳して、実行のためのコードの完全なコンパイル・ランタイム解釈を行う。このような標準的なコンパイルは、特にコンパイル・コードの最適化が要求される場合に時間を要し、通常はコードの実行前にオフラインで行われる。
ジャスト・インタイム(JIT)・コンパイラは、コードのオンラインのコンパイルを行う。例えば、コードの実行時に最初に1つの方法に遭遇するとき、JITコンパイラを用いると、実行は停止され、JITコンパイラはこの方法全体をコンパイルして可能なかぎり最適化する。このように、JITコンパイラは、使用されそうにない方法の部分を含む方法全体をコンパイルする。このようなコンパイルは、コンパイルにおける時間を浪費し、コードのコンパイルされたバージョンがメモリにおけるスペースを費やす。このため、メモリ使用の最小化が重要である場合に、組込まれるアプリケーションに対する特定の問題を生じ得る。
一般に、コンピュータ言語のランタイム表示のコンパイラ、特にいわゆるジャスト・インタイム(JIT)・コンパイラは、方法全体の表示を一時にコンパイルするか、あるいは比較的大きなユニット(例えば、一時に1ファイルあるいは多くのクラスの1つ)の表示をコンパイルする。アプリケーションの大きな部分は、しばしば例外的な状況の取扱い、すなわちほとんど実行されないコードの取扱いに関する。典型的に、コンパイラは、コンパイルが完了するまでアプリケーションの更なる進行を阻害する。
アプリケーションの前の実行からのプロファイル入力を用いるオフライン・コンパイラは、しばしば、アプリケーションの頻繁に実行されるパスの最適化が可能であり、後者の問題を軽減する。しかし、これらのコンパイラは、アプリケーションによる各パスのコンパイルを依然として行わねばならず、アプリケーションがプロファイルの実行について異なる挙動を呈するときは容易に応答することができない。
JITコンパイラにおいては、方法に対する「呼出し」命令に遭遇するとき、制御がJITコンパイラへ送られ、この方法が前にコンパイルされなかったならば、コンパイルされたバージョンが生成される。コンパイルされたバージョンは、次に、方法の以降の実行に対して使用される。JITコンパイラに利用可能な予定メモリがいったん使用されると、新たな方法のコンパイルは可能でなく、JITコンパイラの使用は停止する。その後見出された方法が解釈され、これにより非コンパイルコードの以降の実行速度を低下させる。
JITコンパイラは、多量のメモリを備えるデスクトップ・コンピュータ・システムにおいて使用されるように設計された。コンパイラへ割当てられるメモリは一般に、実際にコンパイラに利用可能なバッファ・スペース量が制限されないほど大きい。
しかし、組込みシステムの場合は、コンパイラへ割当てられるメモリ量は、70ないし80Kであろう。このことは、明らかに、コンパイルされるコード量に制約を課す。
1.方法全体ではなく主パスに対するコードの断片をコンパイルする
2.実行履歴を用いて、アプリケーションを介するどのパスが主パスであるかを判定する
3.フォールバック・インタプリタを用いて、あまり頻繁に実行されないコードを解釈する
4.アプリケーションの実行時にコードを要求と同時にコンパイルできるオンライン・コンパイルを備える。システムは、優先順位が適用される別のスレッドとして走る
5.コードの新たな断片を実行状態のマルチスレッド型システムへ組込む能力を備える
6.実行状態のマルチスレッド型システムからコード断片を除去することを支援する
7.システム実行中にダイナミック・コンパイラにより使用されるメモリ量をいつでも制限する。
本発明によれば、アプリケーションのコードをコンパイルするためのコンパイラを含むコンピュータ・システムが提供され、このコンパイラはコードの断片をコンパイルするように構成される。
方法全体ではなくコードの断片のみをコンパイルすることにより、それほど必要でない断片はコンパイルしないままにしながら、コードの最も望ましいセクションのみをコンパイルすることが可能になる。
このような方法により、要求される断片のみをコンパイルするので、コンパイルが更に効率的に行われる。また、システムのメモリは、ほとんど実行されないコードのコンパイルされたバージョンで満たす必要がない。
コードの断片に対する参照が行われる場合、方法全体より少ないセクションを表わすコードの一部を参照することが望ましい。コードの断片は、コードの1つ以上のブロックを含むことが望ましい。コードのコンパイルの最小単位がブロックであることが望ましい。
主パスの断片が、関連コードを介する望ましい実行ルートを表わす多数のブロックからなる断片を含むことが理解されよう。例えば、コードのセクションが条件付き分岐を介する場合、分岐によるコードの反復実行時に、分岐を介する1つのパスは分岐を介する別のパス上で選好されやすい。分岐を介する選好ルートと関連するコードの断片は、主パスの断片であると見なされることが望ましい。
以下に示すように、ある場合には、分岐を介する別のそれほど選好されないルートもまた、主パスであり得る。
本発明の望ましい実施の形態においては、コードの主パスの断片は、頻繁に実行されるコードを含む。主パスは、頻繁でなく実行されるコードは含まないことが望ましい。このような頻繁でなく実行されるコードは、例えば、頻繁でなく遭遇する例外を処理するためのコードを含む。
本発明の望ましい実施の形態においては、コードの断片が予め定めた回数より多く実行されるならば、このコードの断片は主パスの一部であると見なされる。
コンピュータ・システムは、コードの断片が実行される、望ましくは解釈される回数を記録するための実行履歴レコーダを更に含むことが望ましい。
実行履歴レコーダは、コードのブロックが解釈される回数を記録することが望ましい。
本発明の望ましい実施の形態において、ならびに特定のブロックが何回解釈されたかの記録において、実行履歴レコーダはまた、ブロックの実行に関する更なる情報、例えばブロックに対する制御の転送がどこからきたか、また制御がブロックからどこへ移転されたかについても記録する。当該レコーダはまた、どのタイプのコードがブロックにおいて実行されたかをも記録する。
閾値に等しいかあるいはこれより大きい回数だけ解釈された断片は、コンパイルが可能であることが望ましい。この閾値は、2.5、更には10より大きいかこれに等しいことが望ましい。
このように、頻繁に実行されるコードのブロックがコンパイルされる。実行されないブロックがコンパイルされることは一般に望ましくない。本発明の望ましい実施の形態においては、実行されないブロックがコンパイルされることはない。
前記閾値は、動的に同調されることが可能であることが望ましい。コンパイル・マネージャがキューを管理する上例の場合は、このキューが恒久的に長ければ、閾値は、コンパイルのためのキューへ少ない数のブロックが送られるように増加されることが望ましい。
実行履歴レコーダは、アプリケーションの実行中に記録するよう構成されることが非常に望ましい。実行履歴については、システムによるアプリケーションの特定の実行のための主パスの表示が決定されコンパイルされたコードを生成するため用いられるように、オンラインで集められることが望ましい。代替例においては、主パスに関する情報が前の実行から捕捉されるときは、条件が前の実行から変更されてしまい前の実行の主パスがその時の実行の主パスの表示ではないというリスクがある。更にまた、主パスは、実行中に変化することがある。
当該システムは更にアプリケーションの変化を解釈するためのインタプリタを含み、実行履歴レコーダがコードの断片の解釈を記録するように構成されていることが望ましい。インタプリタにとっては、実行履歴の記録を管理することがより効率的である。コードのコンパイルされる断片の実行の記録が実施可能なことは判るが、多くの場合、そのために要求される時間とメモリに関してその値打ちがないと考えられる。
実行履歴レコーダは、第1の部分から第2の部分に対する実行のパスを記録するように構成されることが更に望ましい。望ましくは、第1のブロックから第2のブロックへの実行パスが記録される。望ましい実施の形態においては、実行履歴レコーダは、制御が特定のブロックから移転されたこのブロックの実行のために記録する。このため、特定のブロックに対しては、後続する可能性が最も大きいブロックを決定することができる。このように、特定のブロックからの主パスを決定することができる。この特定ブロックが閾値の回数だけ通りかつコンパイルされるならば、後続する確率が最も高いブロックを通る前記特定ブロックからの主パスをコンパイルすることができる。
このように、コンパイラは、あるパスの断片をコンパイルするように構成されることが望ましい。
本発明の実施の形態においては、コードのあるブロックが制御転送の全ての過程で実行されなかったならば、このブロックはコンパイルには適さない。その結果、シンボリックな解決法が依然として要求されることになり、インタプリタで実現することに終始する。
主パスのコンパイル・バージョンは、システムの残部に対して唯一の外部からのエントリ点となることが望ましい。従って、コードのコンパイルにおいては仮定がなされる。このため、コンパイラは、唯一の外部からのエントリ点を持つコンパイルされる部分を生じるように構成されることが望ましい。
コードの断片がコンパイルされる場合、コンパイラはコンパイルされるコードを最適化が可能であることが望ましい。このような最適化はインライン処理を含むことになろう。コンパイルされるコードが最適化された場合、特に後で正しくないことが判るか制約が大きすぎるコードを最適化するときに仮定がなされた場合、コンパイルされるコードは特定の最適化あるいは仮定がなされたことを表示するマーカと関連付けられることが望ましい。
本発明の望ましい実施の形態においては、おそらくは種々の仮定を用いて、主パスに対する特に有効なコンパイルされたコードを生じるために、幾つかの最適化が行われる。
当該システムは、インタプリタと、コードの実行時にコードの少なくとも第1の部分がコンパイルされたコードから実行されるコンパイルされたコードの少なくとも1つの部分と、インタプリタによりコンパイルされないコードから実行されるコードの少なくとも第2の部分とを含むことが望ましい。当該システムはフォールバック・インタプリタを使用することが望ましい。
このような特徴は、特に重要であり、かつ独立的に提供されよう。このため、本発明の更なる特質は、インタプリタを含み、アプリケーションのコードを更に含むコンピュータ・システムを提供し、コードはコンパイルされるコードの少なくとも1つの部分を含み、これにおいてはコードの実行時に、コードの少なくとも第1の部分がコンパイルされるコードから実行され、かつコードの少なくとも第2の部分がインタプリタにより実行される。
当該インタプリタは、コードのコンパイルされないバージョンが利用可能でない場合か、あるいは、例えばコードのコンパイルにおいてなされる仮定が正しくないことが判る場合に用いることができる。このため、あらゆる場合に使用が「安全」でないおそれがある最適化コードを生じる更に積極的な最適化が可能となる。コンパイルされたバージョンが使用に安全でないケースが認められる場合、フォールバック・インタプリタは、実行に対して甚しい破壊を生じることなく、かつコードの一部の新たなコンパイル・バージョンが生成される間に実行を止める必要もなく、必要なコードの実行を完了することができる。
当該システムは更に、コードの断片のコンパイルされたバージョンがあるかどうかを判定する探索装置を含むことが望ましい。このように、得られるコンパイルされたコードの一部をインタプリタが解釈するときに時間が費やされる可能性が低減される。コンパイラは、オンラインでコンパイルが可能であることが望ましい。このため、コンパイラは、実行中に現われることがある新たな主パスの部分に対してコンパイルされたバージョンを生成することが可能である。
望ましいシステムにおいては、このシステムはマルチスレッド型である。コンパイラは、コードを実行中であるスレッドとは別のスレッド上で走ることが望ましい。
本発明は、特に埋込みシステムにおける仮想マシンに対する特定の用途を見出すものである。本発明は、コンパイルされたコードを実行しコードを解釈する選択が存在するシステムにおける一般的用途をも有することが判る。本発明は、特にメモリ制限を持つシステムにおける使用に供される。
本発明はまた、コンピュータ・システムにおけるコードのコンパイルのためのコンパイラを提供し、このコンパイラはコードの断片のコンパイルのため構成される。このコンパイラは、コードの主パスの一部のコンパイルのため構成されることが望ましい。
従って、本発明は、コードの主パス(あるいは、主に近いパス)の一部のみがコンパイルされるアプリケーションのオペレーティング・コードをコンパイルするためのコンパイラを含むコンピュータ・システムを提供する。
当該技術は、性能を強化しかつコンパイルされたスペースを低減するという主要な利点供することができる。この技術は、小さなメモリ用途にとって重要であり、かつメモリ・サイズ、コンパイル時間、および性能間の兼ね合いの混交を含んでいる。
望ましい形態においては、前記技術は、グローバルなデータ・フロー分析のオーバーヘッドもなくループおよびインライン処理に係わる主要な最適化技術の使用をも可能にし、従ってコンパイラ自体がグローバルなデータ・フロー分析は行わないコンパイラよりはるかに速く実行することを可能にする。コンパイラ自体のメモリ使用もまたはるかに低くなる。
先に述べたシステムにおいては、有利なことに、残りのパスが解釈される間にコードを介する全てのパスではなく、実行する主パスのみがコンパイルされる。
オペレーティング・コードがコンパイルされているその実行中の部分であるとき、コードの実行が進行中に主パスがつねに変化しているという意味においてコンパイラがオンラインで動作することは、特に望ましい特徴である。
本発明は更に、コードの断片がコンパイルされるアプリケーションのコードをコンパイルするためのコンパイラを含むコンピュータ・システムを動作させる方法を提供する。
コードの断片が実行される回数は、実行履歴レコーダにより記録されることが望ましい。
望ましい実施の形態においては、システムが更にコンパイラ・マネージャを含み、コードの断片が閾値の回数だけ実行されたとき実行履歴レコーダがコンパイラ・マネージャに警報し、望ましくは実行履歴レコーダがアプリケーションの実行中に記録する。
コンパイラはオンラインでコンパイルすることが望ましい。望ましくはコンパイラに利用可能なメモリが制限され、かつ望ましくは当該方法がコンパイルされたコードを削除するステップを含む。
また、本発明によれば、アプリケーションのオペレーティング・コードをコンパイルするためのコンパイラを含むコンピュータ・システムを動作させる方法が提供され、当該方法はコードの主パスの一部のみをコンパイルすることを含む。
当該方法は、性能を強化し、かつコンピュータ・システムのコンパイルされたスペース要求およびコンパイラ自体のメモリ・スペース要求を低減する。
有利なことに、主パスを識別する情報は、コードの実行履歴から提供される。この実行履歴情報は、プログラムが実行するとき動的に取得されることが望ましい。実行履歴情報は、コードの前の実行から捕捉されることが望ましい。
望ましい実施の形態においては、頻繁には実行されないコードがフォールバック・インタプリタにおいて解釈され、これにより頻繁に実行されないコードに対するコンパイルされたコードを必要とすることなくコードの実行が継続し得ることが望ましい。
有利なことに、アプリケーション/プログラムが実行するとき即時応答してコードをコンパイルすることができ、これにより新たな頻繁に実行されるパスの発生に即応してコンパイル情報を生成可能であるオンラインのコンパイル・システムが提供される。
コンピュータ・システムがマルチスレッド型システムにおいて動作するとき、新たなコード断片がこのマルチスレッド型システムへ組込まれることが望ましく、これにより実行スレッドを止めることなく平滑な動作を達成することが望ましい。
本発明は更に、アプリケーションのオペレーティング・コードをコンパイルするためのコンパイラを含むコンピュータ・システムを動作させる方法を提供し、当該方法はコードの主パス部分のみをコンパイルすることを含んでいる。
当該方法は、コードの断片をコンパイルすることを含み、かつ望ましくはコードの主パス断片をコンパイルすることを含んでいる。
本発明はまた、頻繁に実行されないコードを実行するためフォールバック・インタプリタを使用することをも提供する。
本発明により更に提供されるのはコンピュータ・システムに対するコードであり、このコードは前述の方法により生じるコンパイルされたコードを含んでいる。
本発明の特質のいずれか、あるいは一部、あるいはその全ては、他のいかなる特質にも適用することができる。
適当な場合に、純粋に事例として、(上記の改善を略図的に示す)添付図面が参照される。
以降の考察は、先に述べた本発明のいずれかおよび全ての発明に適用する。
望ましい実施の形態の概要は、下記のとおりである。
コンパイラは、入力として、ソース・プログラムのランタイム表示と、(以下に述べるにように取得される)実行履歴情報とを受取る。この実行履歴情報は、ライブであり(すなわち、プログラムが実行すると共に動的に変化し)、あるいはプログラムの前の実行から捕捉することができる。
実行履歴情報は、プログラム・ソースのランタイム表示から決定される構造的情報と組合わされ、コンパイラがコンパイルすべきプログラムの主パスであるものを確定する。実行されないコードは、主パスに決して含まれないことが望ましい。
コンパイラは、主パスをスーパブロック断片として取扱い、プログラム・ソースでなくても、コードを逐次レイアウトする。主パスにフォールスルー(fall−through)させるのに必要な場合に、分岐およびテストが調整される。主パスが終りまで追従されるという仮定により、コードおよびレジスタが最適化される。このことは、最近のプロセッサ・アーキテクチャにおける性能を改善する。厳密に見れば、主パスのみが、1つの外部エントリ点を呈する。このことは、最適化を著しく簡素化し強化する。
図1Aに示されるように、実行のパスが主パス外である場合、適切なランタイム・テストが、「アウトライア」1002と呼ばれるいくつかのスタブ・コードに対する順方向分岐1000において挿入される。このアウトライア・スタブは、断片から制御を転送する前に、主パスがまだ書き戻されない任意の状態を更新する。主パスの主ライン・コードは、1002に示されるようなアウトライア・スタブのように、一般に一体に保持される。このことは、最近のプロセッサ、特に分岐予測ソフトウエア/ハードウエアが最初に分岐が起こりそうもないと仮定する場合における性能を改善する。これはまた、良好な命令キャッシュの挙動を提供する。
実行されないの主パスのコンパイルは、多くの最適化に要求される分析を簡素化しながら、ループの最適化およびインライン処理を実施させる。これは、コンパイラがシンボリック参照を解かねばならない必要を不要にする。このことは、フォールバック・インタプリタに残される。
例えば、フィールドに対する新たなクラスのシンボリック参照のローディングが用いられるとき、従ってはじめて参照が見えるとき、シンボリック参照を満たすクラスの階層をロードすることが必要となる。本発明の望ましい実施の形態において、全ての関連するコードが少なくとも1回解釈された場合は、シンボリック参照は、コードがコンパイルされる前にすでに解かれている。
フォールバック・インタプリタは、ループを実行して、比較的ゆっくりではあるが適時に例外を認識することになる。例外はほとんど生じないと見なされ、従って最適化ループの利益は短所を上回ることになる。
コードのコンパイル時に、種々の最適化を行うことができる。最適化は、ブロック・レベルで行われ、あるいは、特に幾つかのブロックが含まれる場合は更に広げられる。本発明の望ましい実施の形態の利点は、フロー分析を行う必要がないことである。コンパイルされたコードの更に速い実行を生じるため、コンパイルされたコードに対してレジスタが用いられることが望ましい。
フォールバック・インタプリタが使用できる場合、コードのコンパイル時に種々の仮定を行うこと、およびフォールバック・インタプリタが利用できなければ要求されることがある種々の安全検査を省くことが可能である。後で仮定が誤りであることが証明されるか、あるいは安全検査をしないとなにかが不都合になるならば、関連するコンパイルされなかったコードを解釈するのにフォールバック・インタプリタを用いることができる。
アプリケーションの実行時にコンパイラがオンラインで実行されているとき、コンパイルのオーバーヘッドはしばしば甚大になる。主パスのみをコンパイルすることにより、コンパイラが簡単かつ迅速になり、その分析のためのメモリ使用が少なくなり、従って、特に小さなメモリのシステムにおいて実施可能である以上に多くの最適化の実施が可能となる。
アプリケーションが実行時に、実行履歴が捕捉される。この履歴は、制御の転送が生じるときに、ブロック・レベルで維持される。ブロックに入るとき(ブロックに対する制御の転送が生じるとき)、実行履歴レコーダが記録することが望ましい。実行履歴レコーダはまた、例えば問題のブロック後に実行された次のブロックであるブロックの実行に関する他の詳細も記録することができる。これにより、個々のブロックについての情報のみではなく、コードのブロックを介する実行の望ましいルートについての情報が得られる。
各ブロックごとの1つのエントリ・カウントおよびそれ以降のリストが、それぞれに関するカウントで保持される。これらのカウントは、使用頻度の指標として働く。実行履歴レコーダは、どの命令がブロックを終了した制御の転送を生じたかの表示も含む。制御の含むまでに実行されたブロックのみが候補となる。全ての過程で実行されなかったブロックについては、どのタイプのコードが実行されなかったブロックの部分に「隠された」かは判らない。このような隠されたコードは、シンボリック解明を要求するコードを含んでいることがある。従って、このようなブロックはコンパイルされないことが望ましい。制御がブロックから転送されるときブロックのカウントが実行履歴レコーダにおいて行われる場合、終了まで実行したブロックのみがカウントされる。代替的に、あるいは更に、ブロックが終りまで実行されたかどうかを調べるため、コンパイルに先立ち検査を行うことができる。
メモリが制限されるとき、実行履歴レコーダは2つの方法で再使用される。最初に、後続ブロックのリストが小さな数に制限され、新たな後続ブロックに入ると、最も頻度の低い現存する後続ブロックが新たなブロックと置換される。空いた実行履歴レコードがないとき、使用頻度の最も低い方法と関連する履歴レコードの全てが空いたリストへ移される。
望ましい実施の形態において、コードが最初に実行されると、コードは一切コンパイルされない。実行がインタプリタによりはじめて実施される。各ブロックが解釈されると、実行履歴により保持されたブロックのカウントが1だけ増分される。実行履歴レコーダは、各ブロックごとに、ブロックへの制御の転送が生じたブロックから、制御が移転されたブロックへと記録する。実行履歴はまた、ブロックの実行についての更なる情報、例えば、ブロックにおいて実行されたコードの種類も含み得る。1つの閾値が設定され、特定のブロックに対するカウントがこの閾値に達すると、コンパイルのための待ち行列においてこのブロックへ入る。閾値が5であり、特定のブロックが5回実行されたとき、このブロックに待ち行列において入る。
コンパイラは、コンパイルのためのブロックの待ち行列を管理するコンパイラ・マネージャと関連させられる。特定のブロックが実行の閾値に達すると、実行履歴レコーダがメッセージをコンパイラ・マネージャへ送り、コンパイルのための待ち行列でブロックに入る。コンパイラは、別のスレッドにおいて実行中であり、待ち行列にコンパイルのための項目があるかどうかを調べるためある間隔で検査し、またあるときは、コンパイラが待ち行列の先頭に参照されるブロックをコンパイルし始めることになる。
多すぎるブロックがコンパイル待ち行列にあることが判るならば、閾値を引上げることができる。同様に、コンパイルの待ち行列に少数のブロックしかなく、あるいは一切のブロックがなければ、閾値を引下げることができる。これは、アプリケーションの実行中に動的に行うことができる。コンパイラ・マネージャは、待ち行列の長さを監視することができ、また必要に応じて、実行履歴レコーダに対して閾値を増加あるいは減少するようにメッセージを送ることができる。
コンパイラがコンパイラ・マネージャにより待ち行列におかれるブロックをコンパイルするとき、この1つのブロックだけをコンパイルするように進行する。しかし、コンパイラは後続するブロックに関して実行履歴レコーダにより集められる情報を用いること、およびコンパイラが閾値に達した1つのブロックのみをコンパイルするのではなく最も頻度の高いブロックをもコンパイルし、これによりブロックから最も頻度の高いパス(主パス)をコンパイルすることが望ましい。後続ブロックが自身の権利におけるコンパイルの適格な閾値の回数だけ実行されあるいは実行されないが、それにも拘わらず、閾値の回数だけ実行されたブロックから主パスの一部としてコンパイルされることが判るであろう。
コンパイラがコンパイルされるブロックを選ぶと、このコンパイラは、ブロックが完了するのが望ましいものかどうか、例えばコンパイルすることが可能であるかを判定し、かつすでにコンパイルされたブロック・バージョンが得られるかどうかを判定するため検査を行う。
コンパイルがトリガするとき、主パスは、一時に1ブロックずつ最も頻度の高い後続ブロックに追従することにより決定することができ、方法の呼出しへの追従を含む。
一般に、実行中のアプリケーションの実行履歴は、どのパスが主パスであるかのよい指標である。
1つの方法により2つ以上のパスがある場合、この方法によるパスの両方または全てが主パスであり得、かつ関連するブロックが充分な回数実行されるならばコンパイルされ得ることが判るであろう。
実行履歴は、正確である必要はなく、多くの方法で更新することができる。実行を著しく速度低下させることになるコンパイルされたコードにおけるトラック実行履歴ではなく、フォールバック・インタプリタによる実行履歴が保持される。
頻度が低いかあるいは例外的なコードが実行されるときフォールバック・インタプリタ手段を備えると、これに対してコンパイルされたコードが存在することなく実行が継続することができる。フォールバック・インタプリタは、実行履歴を維持する。このインタプリタは、クラス分解と関連する全ての問題がもっぱらフォールバック・インタプリタにより対処できることも意味する。
コードの主パスのみがコンパイルされる場合で、実行のパスが主パスから外れる場合、コンパイルされないコードの解釈が必要となる。更にまた、コンパイルされたコードのコンパイルにおいて最適化が行われなければならず、また後の段階で最適化においてなされた仮定が正しくないことが判るならば、フォールバック・インタプリタを用いて関連するコードのセクションを解釈する。また、コンパイルされたコード・バージョンが生成される前にインタプリタを用いて実行が開始する。
従って、実行のための制御をコンパイルされたバージョンからインタプリタへ渡し、コンパイルされたコードが得られると制御を再びインタプリタから渡すことが必要となる多くの機会があることが判るであろう。
特定の実施の形態に対し以下に更に詳細に述べるように、インタプリタがコードを翻訳中は、次に実行されるべきコンパイルされたコードのバージョンが存在するかどうか調べるため検査が行われる。このように、不要な解釈を回避することができる。
再び以下に更に詳細に述べるように、制御がインタプリタに対しかつこれからコンパイルされたコードの個々の断片間に送られるとき、特別な変換装置が設けられる。このような装置の事例は、「グルー・コード」および「アウトライア」である。この変換装置は、コンパイルされたコード・バージョン間の実行の円滑な転送の確保を助ける。これらの装置は、例えば、コンパイル・セクションの終りに解釈されるべきコードのアドレスに関する情報を保持し、変数が最新のものであり、かつ例えば実行が転送されるときに適切なレジスタに格納されることを保証するためコンパイル・バージョンにおいて最適化が行われた場合に特に重要なものである。
例えば、コンパイルされたコードからインタプリタへジャンプが行われるとき、インタプリタはメモリ状態がカレントであると予期し、従ってもし記憶場所がコンパイル・バージョンに対するレジスタへ置かれたならば、インタプリタが動作を進める前にこれを適切な記憶場所へ戻す必要がある。
アプリケーションの挙動が変化すると、ダイナミック・コンパイラは、明らかになる新たな頻繁に実行されるパスに対して最適化コードを生成することができる。このことは、別のスレッドとして動作することにより、アプリケーションがフォールバック・インタプリタを介して有効でありつづけることを許容する。
動作中のスレッドを停めることなく新たなコード断片を組込むことができるならば、より円滑な動作が得られる。
コンパイラは、特定ブロックに対する主パスのコンパイルをいったん完了すると、コンパイラ・マネージャに対して、コンパイルが完了した旨のメッセージを送る。完了するまでは、コンパイルされたコードは実行可能コードから離して保持される。コンパイラ・マネージャは、コンパイルされたコードを実行可能コードにロードする。コンパイルされたコードが関連するブロックに対して得られ、そこにコンパイルされたコードがあることを示すため、必要な変更がディスパッチ・テーブルおよびコード・キャッシュにおいて行われる。
コンパイルされたコードの導入は、動作中のスレッドの停止が要求されないように最小単位で行われる。
コード断片の取外しもまた、制限されるメモリ環境における可動性にとって重要である。これはまた、新たな主パスが現われるとき、1つの主パスに対して最適化されたコードを別のコードと置換することを可能にする。コードは、このコードがコンパイルされた最適の前提が破れる場合に削除することができることに基いて、最適な最適化でコンパイルすることができる。
先に述べたように、主パスについてなされた前提がコードの以降の実行に対して不適正であることが判る場合、コードを介する非主パスを解釈するのにフォールバック・インタプリタを用いることができる。しかし、コンパイルされた主パスがその後頻繁に実行されなければ、コンパイルされたコード・バージョンにより使用されるメモリを解放するためコンパイルされたコード・バージョンを外すことが望ましくなろう。
一部の実施の形態においては、コンパイルされたコードの各断片の実行回数が監視され、それほど頻繁に実行されなければ、削除の候補としてマークすることができる。
望ましい実施の形態において、コード・バッファがアクセスされる回数が記録される。制御をバッファへ送る前に、その実行カウントが増分される。使用頻度が最小のバッファは、必要に応じて削除され得る。
例えば、ある時点で、コンパイラがコード・バッファのスペースから出る。その後、バッファが削除される。回数管理がなされたカウントが色々なバッファへ送られているならば、最低使用頻度のバッファが削除される。あるいはまた、最も古いバッファが削除される。
システムに対する破壊のリスクを減じるため、バッファの削除前に種々の検査が通常行われることが判るであろう。例えば、本文の「エージェント資料第6号」参照。
主パスの使用はまた、コンパイラがその予定メモリ制限に達するときパスの途上で断片を切捨てることにより、ダイナミック・コンパイラをメモリ制約に耐え得るものにする。これは、従来技術のコンパイラにおいては不可能である。
このように、コンパイラが全ての割当てメモリを費消したとき、断片のコンパイルを終了することができる。切捨てたコンパイル断片の終りをインタプリタへ戻すことができるようにして、必要に応じて、適正バイトのコード・アドレスにおける、かつ適正な更新パラメータおよびレジスタ構造による実行を継続できるように、通常は適切なステップをとる必要があることが理解されよう。
小メモリのコンピュータ・システムにおいては、コンパイラがメモリ限度に拘束される点は厳しいものである。従って、これらのシステムは、その入力プログラムの内部表示を構成したりデータ・フローの分析などの結果を保持するために、コンパイル中に大量のメモリを消費しがちである。
対照的に、ダイナミック・コンパイラは、システムの始動時あるいは構成時にこれに課される外部の構成され得る制限内で働く。その後、コンパイラは、その制限内で可能なかぎり多くの断片をコンパイルする。コンパイラは、必要な場合は、切捨て時に制御を受取るためフォールバック・インタプリタに依存することによって断片を切捨てる。このことは、コンパイルの単位が1つの方法あるいはそれ以上でありかつフォールバック・インタプリタとの相互動作ができない、従来技術のコンパイラにおいては不可能である。
先に述べたシステムは、仮想マシン(VM)を含み、(C言語における)インタプリタとジャバ・アプリケーションとを含む。当該システムは、マルチスレッド型であり、ジャバ主要スレッド、コンパイラ・マネージャ・スレッドおよびコンパイラ・スレッドを含んでいる。
例えば、ジャバ・アプリケーションは、下記のクラスAを含む。
Java A
class load A
クラスAがロードされ、Aのディスパッチ・テーブルがロードされる。ディスパッチ・テーブルは、図1Cに略図的に示される。図1Cは、種々のアドレス・エントリ1032を持つAのディスパッチ・テーブル1030を示している。例えば、主要な方法はアドレス4000に置かれている。
VMの主要プログラムは、4000における方法の主要Aのアドレスを識別し、グルー・コードを呼出す。
call glue(4000)
グルー・コードは、インタプリタの使用とコンパイルされたコードの実行との間を実行が切換えることを可能にする変換装置の一部である。グルー・コードは、コンパイルされたコードとコンパイルされないコードの実行間の平滑な転送を行うための幾つかの装置を含んでいる。グルー・コードは、下記の1つ以上に対する部分を含んでいる。すなわち、
1.状態の記憶場所とレジスタの状態を更新すること
2.コンパイルされたコード・バージョンが得られず、あるいはコードのコンパイル時に行われる最適化が不適性であることが判るとき、インタプリタへ制御を渡すこと
3.実行のためのコンパイルされたコード・バージョンが得られるときに、インタプリタから制御を外すこと
当該変換装置は、状態を更新するための先に述べたようなアウトライアを含む。例えば、コンパイルされたコードの実行時に実行に遭遇するとき、制御は、インタプリタに実行の処理のためのコードの実行を開始することを命令するためグルー・コードへの送達前に、状態が更新されるアウトライアへ最初に送られる。
次に、グルー・コードは、アドレス4000において始まるグルー・コードの実行を開始するようインタプリタを呼出す。
call interpreter(4000)
インタプリタは、アドレス4000で始動し、インタプリタが呼出しをしようとしていると判定するグルー・コードへ戻る。インタプリタは、呼出しがディスパッチ・テーブルのどこにあるかを知り、グルー・コードへ通知する。
グルー・コードは、方法に対するオブジェクト参照を用いてスタックをオフし、ディスパッチ・テーブルを探して方法に対するアドレスを得る。
方法の開始のコンパイルされたバージョンに対する参照がなければ、ディスパッチ・テーブルは「呼出しグルー」に対するエントリを含み、関連するアドレスにおける方法の解釈を開始するグルー・コードの個々の部分への戻りが行われる。すなわち、
call interpreter(5000)
インタプリタが方法へジャンプすると、インタプリタがメッセージを、方法が実行しようとしている実行履歴レコーダへ送る。
方法の終りに戻りが存在し、インタプリタが、先に述べた如きコンパイルされたバージョンの解釈または実行のため前の方法へ実行を戻すグルー・コードへ戻る。
グルー・コードは、レジスタ、スタックなどが次のコード断片の実行に対して正しいことを保証する戻りを処理する専用部分を含んでいる。例えば、方法がコンパイルされたバージョンから実行され、次のコード部分が解釈される場合、コンパイルされたバージョンに対するレジスタへ置かれた全てが、次のコード部分が生成される前に適正な記憶場所へ復元されねばならない。このため、グルー・コードを処理する戻りが、コンパイルされたコードの使用の結果として変更されたどんな状態でも復元する。
このように、グルー・コードへの戻りは更に、実行がコードの次の部分へ進む前に、グルー・コードを処理する戻りへ戻る。
先に述べたグルー・コードの種々の部分は全て、グルー・コードの同じ部分の一部であり得、あるいはグルー・コードの個々の部分であり得る。状態の更新は、先に述べられ、また本明細書の「エージェント資料第3」項に述べたようなアウトライアにより行われる。
当該実施の形態においては、下記の方法が呼出され、インタプリタを用いて実行される。
バイト・コード ジャバ
0 iload_1 x=p;
1 istore_3
2 iload_2 i=a;
3 istore 4
5 goto 16
8 iload_3 x=x/i;
9 iload 4
11 idiv
12 istore_3
13 i inc 4 1 i++;
16 iload 4 i<p?-reiterate if true
18 iload_1
19 if_icmplt 8
22 return
方法のボイドファンクション(void func)が最初に呼出される。コンパイルされたバージョンがなく、従って方法がインタプリタによる実行を開始する。実行時に、下記のブロックがインタプリタにより認識される。すなわち、
b1={0-5}
b2={19}
b3={8-19}(基本ブロックではない)
b4={22}
インタプリタが最初のブロックb1を実行する。インタプリタが、b1が一回実行されたことを記録しカウント1を持つ実行履歴レコーダを走らせる。(望ましくは、このレコーダは、b1の後続ブロックがb2であること、およびb1は全て全過程にわたり実行されたことをも記録する。簡単にするため、このような余分な情報の記録の参照は以下では省略される。)
a.呼出しに出会う
b.戻りに出会う
c.コード・キャッシュから、次のブロックのコンパイル・バージョンがある ことを見出す
d.例外を介する
ときにのみ、グルー・コードへ戻る。)
このような場合、コンパイル・バージョンがなく、従ってインタプリタはb2へ進み、実行履歴レコーダにカウント1のb2を生じる。インタプリタは、再びキャッシュを調べ、b3のコンパイル・バージョンは見出さないと、b3の実行へ進む。当該事例においては、ループが3回反復され、従ってブロックb4による方法から戻りが行われると(先に述べたように、戻りハンドラを介してグルー・コードに至り)、実行履歴レコーダにおけるブロックのカウントは下記のとおりである。すなわち、
b1=1
b2=1
b3=3
b4=1
コンパイルに対する閾値が5であるならば、ブロックb1、b2またはb3はいずれもコンパイルのために待ち行列にない。方法のボイドファンクションが次に呼出された後、カウントは下記のとおり。すなわち、
b1=2
b2=2
b3=6
b4=2
このように、実行履歴レコーダは、コンパイラ・マネージャへメッセージを送り、b3をコンパイルの待ち行列に置く。ある時間後に、コンパイラは待ち行列に相談してb3をコンパイルする。コンパイル前に、コンパイラは、b3の後続ブロックを示す実行履歴レコーダにおけるB3に対するレコードを用いてb2から主パスを決定する。このような簡単なケースでは、b3の最大頻度の後続ブロックはb3であり、その結果ループを表わす1つのブロックb3のみがコンパイルされる。b3のコンパイルは、例えば、値p、x、i、aを記憶するレジスタを用いることにより最適化される。事前例外条件検査を、i=0検査(ゼロで除算)(本明細書の項「エージェント資料第2」参照)のため挿入することができる。コンパイラがコンパイルを完了したとき、コンパイラは、どのコンパイルが行われたか、コンパイル・バージョンがどこにあるか、および方法のエントリ点であるかどうかをコンパイラ・マネージャへ通知する。コンパイル・バージョンは、その時は実行に使用できない。
後で、方法ファンクションが呼出されると、インタプリタがb2の実行後にコード・キャッシュを調べて、b3のコンパイル・バージョンが利用可能であることを見出す。
インタプリタは、グルー・コードへ戻り、これが、先に述べたように、b3のコンパイル・バージョンの実行を生じる。
更に後で、b1およびb2がコンパイルのための待ち行列に置かれるように、方法ファンクションが5回実行されることになる。
b1がコンパイルに当てられると、コンパイラがb1から主パスを決定する。b1の後続ブロックはb2である(すでにコンパイルされたバージョンが存在するから、コンパイラは、この場合、コンパイルされるb3を主パスの一部と見なすことはない)。
断片b1およびb2がコンパイルされ、ディスパッチ・テーブルが更新される。
後で、コンパイラ・マネージャと関連するメモリ・マネージャが、コンパイラに対するメモリが解放されるべきことを決定する。削除のため選択される最も古いバッファは、b3のコンパイルされたバージョンを含む。コンパイラ・マネージャは、このバッファを削除するためデリータを呼出す。削除の前に幾つかの検査が行われねばならない(例えば、見出し「エージェント資料第6」参照)。先に述べた事例では、(削除されない)b1/b2に対してコンパイルされたコードと(削除される)b3に対してコンパイルされたコードとの間にパッチが挿入されたため、ある特定の問題が生じる。この問題が克服される方法の詳細については、見出し「エージェント資料第12」を参照されたい。
図1Dは、先に述べた実施の形態を実施するのに好適な装置1040を示している。当該装置1040は、コンピュータ・システムにおけるジャバ・コード1043を解釈するためのインタプリタ1042を含んでいる。インタプリタが1つのコード・ブロックの終りに達すると、呼出しか戻りがなければ、コード・キャッシュ・サーチャ1044を用いてコード・キャッシュを検査し、次のブロックのコンパイルされたバージョンが得られるかを調べる。もしそうであれば、コンバータ装置1046(先に述べたグルー・コードを含む)が、コードのコンパイル・バージョン1049を実行するため制御を実行装置1048へ送る前に、必要な変更および改変を実施する。
実行履歴レコーダ1050は、ブロックが閾値の回数だけ実行されると、コンパイラ・マネージャ1052に通知する。このブロックは、コンパイラ・マネージャ1052により管理される待ち行列1054に保持される。閾値チューナ1056が、コンパイラ・マネージャ1052からの情報からの待ち行列の長さを監視する。待ち行列の長さに関する情報に基いて、閾値チューナ1056が実行履歴レコーダ1050に対する閾値を変更してコンパイラ・マネージャへブロックを送る。
コンパイラ1058は、待ち行列1054において参照されるブロックをコンパイルする。コンパイラ1058は、ブロックの実行に関する実行履歴レコーダ1050からの情報を用いてブロックからの主パスを決定し、コードのコンパイルされたバージョンを用意する。コンパイル・バージョンが完成すると、コンパイラ1058が、必要なディスパッチ・テーブルおよびコード・キャッシュを更新しコンパイル・バージョンをロードするコンパイラ・マネージャ1052に通知する。
コンパイラ・マネージャ1052は、コンパイラ1058が利用可能なメモリを監視するメモリ・マネージャ1060を含んでいる。利用可能なメモリが少なくなると、メモリ・マネージャ1060が、コンパイルされたコードの一部を削除するようにデリータ1062へ指令する。また、待ち行列1054が長くなりすぎると、コンパイラ・マネージャ1052が、待ち行列1054の一部または全てを削除するようにデリータ1062へ指令する。
同図は、コードの種々の断片、例えば1068、1070、1072を略図的に示している。このようなコードの断片は、それぞれコードのあるブロックを表わす。
同図に示されるコードは、1つの外部エントリ点1074を有する。ブロック1072の後には、条件付き分岐1076、例えば例外検査が存在する。例外が生じると、実行はコード1078に対するパスAに沿って進み、実行を処理する。さもなければ、コードは呼出しがあり得るコード・ブロック(ブロック1082に対するパスC)に対するパスBに沿って進み、あるいは実行はコード部分1083、1084に対するパスDに進む。実行は、パスEに沿って1085へ進み、あるいはパスFに沿って1086へ進む。
実行がコード1066を走る実行についての情報は、インタプリタ1042により動作される実行履歴レコーダ1050に記録される。
ブロック1068がインタプリタにより閾値の回数だけ実行されたことが判ると、これは待ち行列1054へ送られる。コンパイラ1058は、レコーダ1050における実行履歴を調べて、下記のことを見出す。すなわち、
1.1072の頻度の高い後続ブロックが1080である(すなわち、実行がパスAより頻繁にパスBに沿って進んだ)こと、
2.1080の頻度の高い後続ブロックが1083である(すなわち、実行がパスCより頻繁にパスDに沿って進んだ)こと、および
3.1084の頻度の高い後続ブロックが1085である(すなわち、実行がパスCより頻繁にパスDに沿って進んだ)こと。
コンパイラ1058は、主パスが、従ってコードを介する1068、1070、1072、1080、1083、1084、1085であることを決定する。この主パスは、1088として示される。
コンパイラ1058が主パス1088をたどる間、断片1084が全過程を通じて決して実行されない(決してパスFを通らなかった)ことが判る。このため、1084はコンパイルの適切な候補ではなく、コンパイルのための主パス部分は断片1084あるいは1085は含まない。
このように、コンパイルされる主パス部分は、断片1068、1070、1072、1080ANED1083を含む。
情報の格納に関する特徴は、適切な記憶場所すなわちストアによって実現することができる。情報の処理に関する特徴は、ソフトウエア、あるいはハードウエア、あるいは両者の組合わせのいかんを問わず、適切なプロセッサまたは制御手段によって実現することができよう。
上記の一部あるいは全てにおいて、本発明は、下記の形態の一部あるいは全てにおいて具現され、コンピュータ・システムの作動方法において具現され、コンピュータ・システム自体において具現され、システムの作動方法でプログラムされあるいはこの方法を実行するように適用されあるいは構成されるとき、コンピュータ・システムにおいて具現され、そして(または)システムを作動する方法に従って適用されるプログラムが記録されたコンピュータが読取り可能な記憶媒体において具現される。
本文において用いられるように、用語「コンピュータ・システム」は、「コンピュータ」、「システム」、「装備」、「装置」、「マシン」、などの用語と互換である。コンピュータ・システムは、仮想マシンであり得、あるいは仮想マシンを含み得る。
上記の一部または全てにおいて、方法および装置の特徴および特質を含む先に述べた異なる特徴および特質は、どんな適切な方法においても組合わせが可能である。
本発明が本文において純粋に事例として記述されたこと、および詳細の修正が本発明の範囲内で可能であることが理解されよう。
本文に開示された各特徴、および(適切であるかぎり)請求の範囲および図面は、独立的にあるいは適切な組合わせにおいて提示されるものである。
本発明は、コンピュータ・システムに関し、かつコンピュータ・システムの動作方法に関する。特に、本発明は、コードをコンパイルするコンパイラを含むコンピュータ・システムに関し、かつコンピュータ・システムにおいてコードをコンパイルする方法に関する。望ましくは、本発明は、解釈言語、例えばジャバを走らせるコンピュータ・システムに関する。本発明は、オブジェクト指向プログラム(望ましくは、ジャバ)に関することが望ましい。望ましい実施の形態においては、本発明は、事前例外条件検査に関する。
プログラムの過程またはジャバのようなオブジェクト指向プログラムにおける方法の実行方法において生じる諸問題を回避するために、許されない状況を検出してエラーおよび(または)例外を投与する安全システムが通常組込まれる当該システムは通常、検出される例外条件に応答して例外が検出された場所で実行を停止する。このようなシステムにおいては、実行の継続を許容する前に実行を処理するため、例えば違法な動作を締出すために、例外ハンドラが含まれる。
ジャバは、エラーと例外の両者を投与する。簡単にするため、これらは本文では「例外」と呼ばれる。本文における用語「例外」は、前後関係から明らかである場合を除いて、例えばランタイム・エラー、例外、およびジャバ言語および(または)他の言語で生じる他の出現を含むように広義に解されることを理解すべきである。
例えば、コードの一部は、項「y=i/z」を含む。コードが実行されるときz=0ならば、例外「ゼロで除す」が投与される。コンパイルされると、あり得る例外を含む方法は、例外を投与するものとマークされる。
例外を投与する旨宣言した方法がジャバに呼出されるならば、ジャバ・コンパイラは、前記方法を呼出す方法もまた例外を宣言するか、あるいは例外を処理する例外ハンドラを提供することを要求する。このため、例外は、例外ハンドラにより捕捉され処理されるか、あるいは呼出しチェーンの終りに落ちる(fall off)まで、この呼出しチェーンをリップルアップ(ripple up)し得る。このことは、ジャバには実質的に2つのタイプの例外、すなわち、「検査済み」および「未検査」があることも理解するジャバ言語になじんだ者にはよく理解されよう。
例外「検査済み」は、「捕捉」されるかあるいは「投与」されることになる。コンパイラは、実際に検査済み例外を捕捉あるいは投与に強制する。対照的に、「未検査」例外は、ゼロで除算のようなランタイム・エラーによく似ており、ジャバもC++も投与の宣言を強制しない。
ゼロで除算のような特定の例外が最上位すなわち最も前のフレームaで宣言され、最近のフレームb、c、dなどはフレームaより下方で逐次付加されるものと見なされるスタックが形成される状態について考察しよう。例外がフレームdで遭遇するならば、このフレームに対する評価スタックはクリヤされ、VMは例外オブジェクトを生じてこれに対する参照は、マッチング・ハンドラによりこのフレームの評価スタックに入れられる。
フレームdにおける例外に遭遇すると、最初に、フレームdはハンドラについて探されるが、例外がフレームaにおいて宣言されているので、明らかに見出されず、従ってフレームdは消され、サーチはフレームcにおいて続行する。同じ状態がフレームcにおいて取得され、従ってサーチは後へ続き、ハンドラを見出すことができるフレームaに達するまで、フレームd、c、bを次々に消す。ローカル変数のみが消されたフレームに格納されること、従って貴重な情報の逸失がないことを強調すべきであり、全てのグローバル変数(ジャバでは、アレイ、オブジェクト、スタチック・フィールドと呼ばれる)および(例えば)フレームcに生成されるオブジェクトは、ヒープに格納されたままである。
ジャバは、例外の多い言語である。ジャバの状態は、ジャバ・プログラムの意味論により指令されるように書かれねばならない。
しかし、ジャバ・プログラムがコンパイルされるときは、種々の最適化を行うことが可能である。1つのこのような最適化は、コンパイルされるコードの断片がループを含む場合に可能となる。ランタイムにおける実行をより効率的にするために、任意のループ不変動作をループ外へ移動することが望ましい。しかし、このことは、例外がループ内に生じる場合に問題を生じ得る。このため、下記の簡単な事例において、アレイのアクセス「arr[i]」が例外「限度外の指標(index out of bounds)」を生じる場合に、アレイのアクセスが実行される前に「x」を更新することができない。「x」に対する書込みがアクセス前に誤って移動された場合、および例外が生じた場合、「x」に対する正しくない値を持つことになる。
上記の事例においては、「x」はループ不変値(10)が書込まれている。潜在的な例外が存在する場合、書込みをループ外に移動することはできない。「a」がアレイ「arr」に対する許容指標値の範囲内に該当しなければ、「arr[i]」に対する最初のアクセスは例外を生じ、「x」はループに対するエントリ時に同じ値が存在することになり、値10ではない。更に、例外検査自体は、ループ本体内で実行し、従ってそれ自体の実行上のペナルティを生じる。
この事例は、変数xの別の変数iによる除算を包含する。iがゼロになるある状況が生じ得、ゼロで除すことになり、下記のような計算不能なファンクションとなる。すなわち、
このため、ループの反復実行時にランタイムにおける時間を節減するためループからループ不変項を除去することが望ましいが、詳細な分析を行うことなくループ外へ項を移動するのは安全ではない。
本発明は、このような問題および(または)他の問題を軽減することを求めるものである。
事前例外条件検査は、コードの断片のコンパイルされたバージョンに含まれることが望ましい。事前例外条件検査を用いることにより、例外を生じるかもしれないコードが実行される前に、例外が生じるかどうかを早く決定することができる。例外が生じないことを検査が示すならば、例外を含むコードを実行することが安全となる。
例外が起きるかもしれないコード本体の直前に事前例外条件検査が含まれるのが望ましいことが理解されよう。これにより、事前例外検査以外のコードを最適化することができる。コンパイルされる断片の初めに条件検査が含まれることが望ましい。このことは、断片がループを含む場合に特に望ましい。
例外が生じないという前提において、コードの断片がコンパイルされることが望ましい。事前例外検査が用いられるとき、検査を通るならば、例外が生じないだろうことが判る。このため、例外が生じるかどうかが判らなかったならば実施が安全でなかった最適化が可能である。このように、コンパイルされたコードは、コードの実行における速度が大きいことならびに更にコンパクトになることによりメモリ・スペースが少なて済むことの二点で更に有効であり得る。
当該方法は、条件検査が例外が生じるだろうと決定する場合に使用される救済装置を提供することを含む。多くの場合、事前例外条件検査は、例外が生じずかつコンパイルされたコードの実行を進められることを判定する。しかし、ある場合には、例外が生じるだろうこと、および条件検査が例外条件が切迫していることを決定しよう。救済装置は、例外を実行の予期される時点でインタプリタにおいて遭遇させることが望ましい。
元のコード断片が例外を処理するためのコードを含んでいたならば、このコードが最適化手順の一部としてコンパイル・バージョンには含まれないことが望ましい。いずれの場合も、コードは、頻繁には起きない例外の更なる検出および処理において用いられるコードで複雑にならないようにコンパイルされることが望ましい。従って、例外を処理するためのコードがコンパイルされるのではなく、例外の処理のためコンパイルされないコードを解釈するインタプリタが用いられることが望ましい。救済装置は、インタプリタに対して制御を渡すように構成されることが望ましい。コードのコンパイルされたバージョンがあるため、インタプリタが通常はこのコードの実行のために使用されないので、制御はインタプリタへ送られるよう強制される。
コンパイル・コードが最適化された場合、例外が生じることを条件検査が明らかにするとき状態の条件(例えば、整数の変数およびレジスタの状態の値)は、対応するコンパイルされないコードに対するものと同じでないことがあり得る。救済装置は、状態を更新するためのアウトライアを含むことが望ましい。
断片はコードの主パスの一部であることが望ましい。コードの少なくとも一部がループを形成することが望ましい。特に仮想マシンにおけるように利用可能なメモリが制限される場合、それほど頻繁に実行されないコードをコンパイルしないことが非常に望ましい。当該方法はまた、コードを介する主パスを決定するステップを含むことが望ましい。それほど頻繁に実行されないコード、例えばコードの主パスでない部分はコンパイルされないことが望ましい。コンパイラは、コードの主パス部分のみをコンパイルすることが望ましい。
本発明はまた、先に述べた方法によるコードのコンパイルのためのコンパイラを提供する。
また本発明により提供されるのは、あり得る例外を含むコードの断片をコンパイルする装置であり、当該装置は事前例外条件検査を含む手段を含んでいる。
当該装置は、コンピュータ・システムの一部、望ましくは仮想マシンであることが望ましい。本発明は、特に、解釈される言語に関し、特にジャバに関する。
コンパイラは、コンパイルされた断片の初めに条件検査を含むように構成されることが望ましく、かつコンパイラが、例外が生じないという前提でコードの断片をコンパイルするよう構成されることが望ましい。このことは、断片がループを含む場合に、特に関連する。
当該装置は、条件検査が実行が生じると決定する場合に使用される救済装置を含むことが望ましい。当該救済装置は、コンパイラによりコンパイル時に提供されることが望ましい。
当該装置は更にインタプリタを含み、前記救済装置がインタプリタに対して制御を送るように構成される。インタプリタは、例外を処理するためコードを解釈するように構成されることが望ましい。
前記断片は、コードの主パスの一部であることが望ましく、かつコンパイラが主パスのコードをコンパイルするように構成されることが望ましい。コンパイラは、コードの主パス部分のみをコンパイルするように構成されることが望ましい。コンパイラはオンライン・コンパイラであることが望ましい。コンパイラの実行時間インパクトおよびコンパイラが使用するメモリ量は、コンパイラがコードの主パス部分のみをコンパイルする場合に低減することができる。
本発明はまた、先に述べた方法を用いてコンパイルされるコードを提供する。
本発明によれば、コンピュータ・システムに対するコードも提供され、このコードは、あり得る例外を含むコンパイル・コードの断片を含み、このコードは更に事前例外条件検査を含んでいる。
前記コードは更に、例外が表示されるならば使用される救済装置を含み、救済装置はインタプリタに対する制御の転送を強制する手段を含むことが望ましい。
また本発明により提供されるのは、先に述べたようなコードを含む、構造化されたデータが記録されたコンピュータ読取可能な記憶媒体であり、また先に述べたような方法を実行するためプログラムが記録されたコンピュータ読取可能な記憶媒体である。
本発明は、ループ内の例外条件の存在時のコードの移動に関する最適化を可能にすることを目的とし、結果として得るコンパイルされる断片の実行速度を更に改善する。
この解決法は、コンパイルされる断片がループのエントリ点に先立って行われる相当の検査を含む、「事前例外条件検査」の使用によって達成される。
このような検査は、好都合にもフォールバック・インタプリタの存在に著しく依存する。検査が例外条件を検出するならば、制御は、当該ループのエントリ点において前記断片に再エントリする可能性のないフォールバック・インタプリタに関連する。フォールバック・インタプリタは、ループのエントリ点における実行を続行し、従って実行がその正しい制御点に遭遇する時点まで実行し、これにより全てのジャバの状態が正しい値を含む実行を生じる。しかし、事前例外条件検査が通るならば、断片は安全に使用可能であり、任意のコード移動の最適化が有効である。
従って、上記の事例においては、検査結果を順守するかぎり、「x」のループ不変性の割当てをループ外に移動することが可能である。これにより、ループにおける元の例外検査を省くことを可能にし、これもまた改善された性能を提供する。
全ての事前例外条件検査が任意の実行ループ外で行われて、(特に、ループが多数回反復される場合に)検査の実行の時間的なペナルティを減じることが望ましい。
コンパイル・コードは、幾つかのあり得る例外について検査するため、幾つかの事前例外条件検査を含むことが望ましい。このような検査は、個々の検査の集合として構成され、あるいは任意の数の例外条件が存在するかどうかを決定する1つの検査を含む。
本発明は、インタプリタが使用される解釈言語、特にジャバ言語に対する特定の用途を見出す。インタプリタは、例外が表示されるときにフォールバックとして使用することができる。インタプリタが存在しなかったならば、例えば例外の存在時に、コードの多数の異なるコンパイル・バージョンが、コードを介する代替的なルートを処理するため提供されねばならない。このような構成は、コードのコンパイル・バージョンにより占有されるメモリ・スペースが減じるという利益を低減し、あるいは更にこれを打消すものとなろう。
コードのコンパイル・バージョンへ挿入することができる検査の回数(実行における時間的ペナルティを生じる検査)と、最適化されたコンパイル・コードの実行における実行時間が減じるという利益との間に均衡を生じやすい。
本発明の利益は、望ましくは実行時間およびメモリのペナルティの増加がない(条件検査の使用による)実行における安全の増進を含む。
本発明の更なる利点は、コンパイルされる断片を介する高速な(検査されない)ルート、あるいはループ内に例外条件が存在する場合でさえ、ループ外の遅い(フォールバック・インタプリタを介するルートの検出を除く。本発明は、(例外条件検査を含む)コードの移動の利点を利用する高速なルートを可能にする)ルートの選択である。このような選択は、方法全体をコンパイルした先のコンパイラ、およびそのコンパイルされた方法がフィールドの例外条件に対するインタプリタとは相互に働く能力を持たないコンパイラには得られない。
本発明により、コンパイル部分の性能は、ループ外へコードを移動する能力により著しく改善され得る。従って、従来のコンパイラには通常得られないダイナミック・コンパイラの最適化の選択および用途において、より大きな自由度が得られる。
また、例外条件の発生を識別するため例外検査を実施する手段も任意に提供される。
本発明は、別の特質において、プログラムを実行し、切迫した例外条件の発生を識別するため例外検査をコンパイルし、前記例外検査により識別されたとき解釈される言語において例外を実行するステップを含むコンピュータ・システムの動作方法を提供する。
例外検査は、処理中のループ外で行われることにより、望ましくは例外検査がループの一巡ごとに行われる必要を避けることが望ましい。本発明の利点は、コンパイラを介する高速の(検査されない)ルートか、あるいは従来のコンパイラ・オフラインでは利用できないインタプリタを介する低速の(例外を検出する)ルートをとるよう選択することである。
本発明によれば、将来のある時点にループ外で例外に達すると決定することが可能である。この状態が生じると、制御はインタプリタへ渡され、従ってループの一巡ごとに例外について検査する必要がない。
例外検査自体はコンパイルされるが、比較的遅いインタプリタにおける例外自体の解釈はコンパイル時間を節減するのに役立ち、特にあり得る例外の処理のためコードの多数のコンパイル・バージョンを持たないことによりメモリの必要を低減するのに役立ちながら、最適化を損なうことがない。実際に、最適化は確実に可能とすることができる。(ジャバにおいては、例外処理はプログラミング・レベルで行われる。)
本発明の特質のいずれか、あるいは一部、あるいはその全ては、他の任意の特質に適用され得る。
以下の考察は、先に述べた本発明のいずれかあるいは全ての特質に適用する。
本発明の望ましい実施の形態については、純粋に事例として、(改善を略図的に表わす)添付図面を参照しながら以下に記述される。
1つの方法が呼出される:
当該方法のファンクションが最初に呼出されると、このファンクションはインタプリタによって実行される。例外が生じるならば、この例外は通常の方法で処理され、コードが解釈されているので、xへの書込みは、例外が生じない場合にのみ生じることになる。望ましい特質に寄れば、方法のファンクションのコードの断片がコードの主パスの一部であると見なされるだけ充分な回数インタプリタにより実行されるならば、これら断片はコンパイルのため待ち行列に入れられる。詳細な論議は、本明細書の項「エージェント資料第1」に見出される。
この論議から、ループが最初にコンパイルされやすいこと、およびこのループに対する主パスがループを含むブロック(単数または複数)のみを含むことが判る。
コンパイラは、ブロックb3にあり得る「ゼロで除算」の例外があることを知る。事前例外条件検査が、ブロックb3のコンパイル・バージョンへ挿入される。この場合には、検査がコンパイルされる断片の初めに挿入される。(無論、コンパイル・コードに例外が生じる前に、任意の点に挿入されることもあり得る。例外がループ内に生じ得る場合、検査がループのエントリ点に先立ち挿入されることが望ましい。当例におけるように、いずれの場合も、ループのエントリ点はしばしば主パスの一部の始まりとなる。)
ブロックb3のコンパイル・バージョンは、例えば、以下の左欄に示されるようなものである(明瞭にするため、簡素化したコードで示される)。コンパイル・コードの各部により行われるステップについての表示は、右欄に含まれる。
コンパイルされたコード 行われるステップ
cmp i,0 iをゼロと比較する
ble glue_bailout iが0より小さいか等しければ、グルー・ コードへ進む
load ra,b bをレジスタへロードする
store ra,y y=b(ループ不変ステップ)
load rn,i ループの初めにレジスタをロードする
load rm,x
div rs,rm,rn x/iおよび結果をレジスタsへ格納
add rn,l i++
cmp rn,ra i<b
blt i<bならば、ループを(div rs,rm,rn から)ループを繰返する
上記コードの最初の2行は、事前例外条件検査を含む。iがゼロより大きければ、検査は通り、コンパイル・コードの残りが(3行目から)実行される。iが0より小さいかこれに等しければ、以下に述べるように、コードの2行目が実行を救済装置のグルー・コードへ送る。コンパイルされたブロックb3の残りはこの時は実行されない。インタプリタがループ本体の初めから例外が検出される点まで全てにわたりループを解釈することに注目されたい。このように、コンパイル・コードにおける検査は、即時の例外ではなくこれから起こる例外の早期の警告を与えている。ある場合には、このことは、制御がインタプリタへ転送される前には「行われない」はずの、コンパイル・コードにおいて実施されるステップ数を減じることができる。
上記の事例は、簡素化されている。実際には、aがループ実行の限度から外れる状況に対して、(iが0より小さいかこれに等しいかの検査の前または後に)「限度外の指標」の事前例外条件検査もあり得る。このように、コンパイル・コードの各部は、幾つかの事前例外条件検査を持ち得る。事前例外条件検査のタイプ例については、以下に述べる。
コンパイルされた断片およびコンパイルされない断片を含むコードの実行の詳細な論議については、項「エージェント資料第1」を参照されたい。一部のステップの概要については、条件検査が例条件の存在を判定する場合における上記事例に対してここに述べる。
コンパイル・コードの最初の行は、iが0より小さいかこれに等しいかを調べるために実行される。もし実行されれば、コードの2行目がグルー・コードの特定のエントリ点に対して実行を指令する。グルー・コードは、制御をインタプリタへ送ることを強制する。グルー・コードは、コードの解釈をどのアドレスから始めるか(また、(コード・キャッシュがコンパイル・バージョンに対する参照を含むので。この場合は、コンパイル・バージョンは使用できない)実行前にはコード・キャッシュを調べないこと)をインタプリタに教える。グルー・コードは、インタプリタに対し、ブロックb3のコンパイルされないバージョンの初めにおける(iload_3から、上記参照)実行の再開を示す。インタプリタは、正しい時点における例外を知り、この例外は然るべく処理される。(インタプリタは、例外をそれほど早く起こすことはできない。)
インタプリタが例外を含む断片をいったん実行すると、「エージェント資料第1」において述べたように、制御は、コードのコンパイル・バージョンの実行のためグルー・コードを介して戻される。
別の事前例外条件検査は、コンパイルされるべきコードに生じ得る任意の例外に対して用いることも可能である。1つの事前例外条件検査は、幾つかのあり得る例外についての検査に用いることも可能である。
コードの移動および他の早期検査を組込まれた方法に適用することを可能にするため、早期検査予測検査、あり得る範囲のアレイ指標値に対する早期バウンド検査、早期空参照検査、早期のゼロ除算検査、および早期オブジェクト・タイプ検査を含む、このような1組の事前例外検査を使用に供することができる。
検査予測検査は、所与のタイプのオブジェクトをこのタイプに対するフィールドに格納することができるかどうかを証明し、例えば、検査は「グラフィックス」タイプのオブジェクトを「car」タイプ・オブジェクトに格納できるかどうかの質問に答えることができる。
ジャバ(および他のオブジェクト指向言語)は、クラスAがクラスOを拡張しクラスBがクラスOを拡張するならばクラスAおよびクラスBは関連しない場合に、クラスに対する階層的構造を有する。反対に、クラスAがクラスOを拡張しクラスBがクラスAを拡張するならば、クラスBはクラスAのサブクラスであり、システムはAを用いる場合にBを用いることができる。このように、コードの一部におけるオブジェクトの階層が適切でない場合に例外が生じる有効範囲があることが判る。
検査予測条件検査は、クラスのフェルミ準位が正しく、かつ検査予測検査が失敗する場合に制御が救済装置へ進むことを調べるため検査する。
名前が示唆するように、バウンド検査は、アレイ指標がアレイの許容限度すなわちバウンド内にあるかどうかを証明し、さもなければ、救済装置(グルー・コード)を参照して、指標がバウンド外にある例外を生じる。「バウンド外の指標」の例外が生じる状況について、一例が示される。
空白参照検査は、フィールド参照が空白であるかどうかを識別し、その場合このフィールドでは一切が行われない。
ゼロによる除算検査は、先の事例においてすでに論述されたように、計算不能ファンクションである除数ファンクションの分母がゼロになる状況に達するかどうか決定する。
このような検査の例示として、ドローがグラフィックス・クラスのオブジェクトを描画するための方法である場合に方法がドローを呼ぶ状況について考察しよう。ドローの異なる実現を含むこのような段階でグラフィックスのサブクラスがなければ、方法ドローが最終的なものであり新たなドロー方法によりオーバーライドされないことを仮定することができる。このように、ドロー方法は、たとえ潜在的に多形性であっても、多形性でないと仮定される。コードは、ドロー方法が最終的であるという仮定によりコンパイルされ得る。前記の仮定、例えばコードに対する方法ドローの組込みに基いて、最適化を行うことができる。項「エージェント資料第9」を参照されたい。
オブジェクト・タイプ検査は、呼出された方法を関連するオブジェクトにおいて適切に実現できるかどうか決定するために行われる。当例では、オブジェクトが他のなにものでもなくグラフィックス・タイプであるかどうか、およびドローの方法がオブジェクトに対して適切であるかどうか、検査が決定する。
本発明の方法を実施する装置が、図2Aに略図的に示される。当該装置は、コードを解釈するインタプリタ2000を含んでいる。実行履歴レコーダ2002は、インタプリタ2000によるコードの実行の詳細を記録する。コードの1つのブロックが予め決めた回数実行されるとき、実行履歴レコーダ2002は、コンパイルのためのブロックの待ち行列を管理するコンパイラ・マネージャ2004に通知する。コンパイラ2006は、待ち行列を調べてコンパイルのためのブロックを選択し、実行履歴レコーダ2002のレコードから主パスを決定する。コンパイラはまた、コンパイルされるべき主パス部分に生じる得るなんらかの例外があるかどうかを判定する。もしそうであれば、必要な事前例外条件検査がコードのコンパイルされる断片の初めに挿入される。コンパイラ2006は、この断片をコンパイルして、救済装置2008に対する必要なリンクを設定する。コンパイルされたコードは、実行装置2010により実行される。例外が生じることを事前例外条件検査が示すならば、救済装置2008はグルー・コード2014へ転送し、これが例外に関するコンパイルされないコードの実行のため制御をインタプリタ2000へ送る。
セクション2100は、ループ2102を含んでいる。ループ2102内には、あり得る例外(例えば、例外「ゼロで除算」を生じる結果となる除算)が含まれる。ループ2102はまた、ループ2102の実行速度を増すためにループから出ることが望ましいループ不変項2106をも含む。
コード2100の何回かの実行後に、ループ2102を形成するコード部分がコードの主パス部分であることが見出され、これはコンパイルのため待ち行列に置かれる。図2Cは、コード部分(全体的に2108として示される)のコンパイル・バージョンを示している。コンパイルされたコード部分2108は、例外が生じるかどうかを調べるため検査する事前例外条件検査2112を含む。コンパイル・バージョンは、ループ2114を含むが、コンパイルにおいて行われる最適化により、このバージョンは以前より小さく実行が速い。ループ不変項2116はループ2114から移動されて、実行の速度を増す。事前例外条件検査2112は、例外が生じることが見出される場合に、救済装置2008に対するパス2118を含んでいる。
以上のことのいずれかまたは全てにおいて、本発明の幾つかの特徴がコンピュータ・ソフトウエアを用いて実現された。しかし、無論、当業者には、これらの特徴のいずれもハードウエアまたはハードウエアとソフトウエアの組合わせを用いて実現されることが明らかになるであろう。更にまた、ハードウエア、コンピュータ・ソフトウエアなどにより行われるファンクションが電気信号などを用いて行われることが容易に理解されよう。
上記のいずれかあるいは全てにおいて、本発明は、下記の形態のいずれか、あるいは一部、あるいは全てにおいて具現され、コンピュータ・システムを動作させる方法において具現され、コンピュータ・システム自体において具現され、システムを動作させる方法を実行するようプログラムされあるいは構成されるときコンピュータ・システムにおいて具現され、そして(または)システムを動作させる方法により動作するためのプログラムが記録されたコンピュータ読取可能な記憶媒体において具現されよう。
本文に用いられる用語「コンピュータ・システム」は、「コンピュータ」、「システム」、「装備」、「装置」、「マシン」などと互換される得る。コンピュータ・システムは、仮想マシンでありあるいは仮想マシンを含み得る。
上記のいずれかあるいは全てにおいて、方法および装置の特徴および特質を含む異なる特徴および特質は適切な方法において組合わされよう。
本発明が純粋に事例として記述されたこと、および詳細の修正が本発明の範囲内で可能であることが理解されよう。
本文の記述に開示された各特徴、および(適切な場合)請求の範囲および図面が、独立的にあるいは適切な組合わせにおいて提供される。
本発明は、コンピュータ・システムに関し、かつコンピュータ・システムを動作させる方法に関する。望ましくは、本発明は、コンピュータ・システムにおけるメモリの管理に関し、特にコンピュータ・システムにおけるキャッシュ・メモリの管理に関する。望ましい実施の形態においては、本発明は、低使用頻度のコードなどの空間的離隔のためのアウトライアに関する。
コンピュータ・システムにおいて、色々なレベルのキャッシュ・メモリが存在する。このことは、キャッシュ自体を有効に動作させることができるならば、改善された効率、従って速度に関してシステムにとって有利となる。本発明に関しては、キャッシュに、特に最も高速なキャッシュにおかれて頻繁に実行される見込みのあるコードを持つことが有利であることが判っていた。以下に述べる本発明の実施の形態において、ジャバ・コードは、ダイナミック・コンパイラを用いてランタイムにおいてより速く実行するようにコンパイルされる。有効なコード(密度)のキャッシュ密度を改善するため、本発明の目的の1つとして、キャッシュの最も速いものにダイナミック・コンパイラが生じたコンパイル・コードを置くことが有利となろう。
本発明の第1の特質によれば、コードの主パス部分をコンパイルするよう構成されるコンパイラを含むコンピュータ・システムが提供される。
主パスは、コードを介する頻繁に実行される実行パスを表わし、コードの多数の個々のブロックを含む。主パスがコンパイルされるよう(かつ望ましくは主パスのみがコンパイルされるよう)構成することにより、コンパイル・バージョンが頻繁に実行されるコードのみを含むので、コードのコンパイル・バージンにおける有効コードの密度が増加される。このように、キャッシュにおける有効なコード密度を増加することができる。
主パスがコンパイルされるよう構成することにより、コードを介する最も頻繁に実行されるパスを含むコードのブロックがキャッシュに格納される見込みが多くなるように、かつ主パス・コードの他のブロックと同じ(L1)キャッシュに格納される見込みが多くなるように構成することが可能である。このように、主パスのランタイム実行を速くすることができる。
当該システムは更にコードをコンパイルするコンパイラを含み、コンパイラは主パス部分をコンパイルするよう構成されることが望ましい。当該コンパイラはオンライン・コンパイラであることが望ましい。前記主パス部分が頻繁に実行されないコードは含まないことが望ましい。このように、コードの主パス部分がコードの頻繁に実行されない断片から切離して構成されるならば、システムのメモリの管理を改善することができる。
主パスのコンパイルにおける望ましい特徴の更なる論議は、本明細書のエージェント資料第1に見出すことができる。
当該システムは更に、実行パスが主パスを外す場合に使用されるアウトライアを含むことが望ましい。
本発明の第2の特質によれば、頻繁に実行されないコードの実行時に使用されるアウトライアを含むコンピュータ・システムが提供される。
例えば、コードの主要でない場所への条件付き転送により、あるいは検出される実行条件により、実行パスが主パスを外す場合、制御はアウトライアへ送られる。アウトライアは、制御が転送される主パスの部分と同じコード・バッファにあることが望ましい。
主パスは、その時の挙動に基いてコードを介する実行のあり得るパスの「最良の推測」である。これは、ときおりコードの特定の実行には適用し得ないことを証明する。
当該システムは更にインタプリタを含むことが望ましい。このインタプリタは、頻繁に実行されないコードの少なくとも一部を実行するため使用されることが望ましい。当該システムは更に、コンパイルされたコードとコンパイルされないコードの実行間に変換するコンバータを含むことが望ましい。このコンバータは、アウトライアを含むことが望ましい。
実行が条件付き転送により主パスを外した場合、アウトライアはインタプリタへの制御の転送を行うようになっていることが望ましい。
実行が遭遇する実行により主パスを外した場合、アウトライアが例外ハンドラヘ制御を転送するようになっていることが望ましい。
コードは、アウトライアへの条件付き分岐を含み、条件付き分岐が条件付きテストを含み、かつ条件付きテストが失敗するならば、実行が主パスに従うようにすることが望ましい。プロセッサは、しばしば、順方向分岐が失敗し、分岐が行われる前に種々の検査を行うことを予測する。分岐の条件がめったに生じず、その結果(主パスにおける)実行が失敗するならば、この条件に対するコードがコンパイルされるとき、このコードは、条件が真であるならば制御がアウトライアへ進むように構成される。このように、順方向分岐はめったに生じず、このため、プロセッサ検査はアウトライアへのめったに実行されないジャンプ時のみに行われる。このように、条件が通常は真でなく、実行が単に主パスを通るよう終わるので、プロセッサ時間は減少し得る。
当該システムは、頻繁に実行されないコードから頻繁に実行されたコードを分離する手段を含むことが望ましい。
このことは、独立的に提供される本発明の特に重要な特徴であり、従って本発明は更に、頻繁に実行されるコードと頻繁に実行されないコードとを分離する手段を含むコンピュータ・システムを提供する。
頻繁に実行されないコードから頻繁に実行されるコードを分離することにより、システムのメモリが更に効率的に管理されることが可能になる。例えば、この方法は、少数の頻繁に実行されないコードがキャッシュへ取入れられるよう構成することを可能にする。このことは、キャッシュのミスを減らすことによりランタイムにおいて頻繁に実行されるコードの改善された実行速度を与えることができる。コードを分ける手段は、以下に更に詳細に述べるように、特定の方法でコードをコンパイルするコンパイラにより提供される。この分離は、あるタイプのコードが1つの記憶領域に格納され、かつ他のタイプのコードが別の記憶領域に格納されるように構成することによって行われる。
このため、システムは、頻繁に実行されるコードを第1の記憶領域に格納する手段と、頻繁に実行されないコードを第2の記憶領域に格納する手段とを含むことが望ましい。システムは、主パス部分を第1の記憶領域に格納する手段と、アウトライアを第2の記憶領域に格納する手段とを含むことが望ましい。第1の記憶領域と第2の記憶領域とは、コード・バッファの領域であることが望ましい。
頻繁に実行されるコードと頻繁に実行されないコードとは、コード・バッファの異なる領域において生成されることが望ましい。例えば、システムは、頻繁に実行されないコードをバッファの「後方」へ格納する手段を含む。システムは、主パス部分とアウトライアとをコード・バッファの反対の端部に格納する手段を含むことが望ましい。
コードをこのように格納することにより、頻繁に実行されないコードはキャッシュへ取入れられにくいが、頻繁に実行されるコードはキャッシュへ取込まれやすいようにコードを構成することが可能である。従って、コードは、頻繁に実行されないコードがキャッシュへ取入れられにくいように格納されることが望ましい。
このことは、本発明の特に重要な特徴であり独立的に設けることができる。このため、本発明は更に、コード・キャッシュを含むコンピュータ・システムを提供し、このシステムは頻繁に実行されないコードがキャッシュに取入れられにくいように構成される。
主パスのコンパイルにおいて、頻繁に実行されるコードがコンパイルされた主パス部分を含むことが望ましい。これらの部分は、コード・バッファにおいて順方向に生成されることが望ましい。アウトライアは、コード・バッファにおいて逆方向に生成されて、主パス部分から空間的に分けられることが望ましい。このように、コード・バッファにおいてアウトライアにより占められるメモリは、コンパイルされないコードの頻繁に実行されないコード部分の元の部分のコンパイル・バージョンよりも非常に少なくことができる。
本発明は更に、主パスのコンパイル・コードの実質的に全て(および、望ましくはこれのみ)を一緒に1つの記憶領域に格納する手段を含むコンピュータ・システムを提供する。当該システムは更に、主要でないケースを空間的に別の領域で処理するコード記憶手段を含むことが望ましい。
本発明はまた、コンピュータ・システムを動作させる方法をも提供し、この方法はコードの主パス部分をコンパイルすることを含む。当該方法は、コードの実行中に主パスを決定することを含むことが望ましい。
アウトライアは、頻繁に実行されないコードの実行前に状態を更新することが望ましい。
コードがアウトライアへの条件付き分岐を含む場合、条件付きテストが失敗するならば、前記条件付き分岐が、実行が主パスに追従するような条件付きテストを含むことが望ましい。
当該方法は、頻繁に実行されないコードから頻繁に実行されるコードを分離することを含むことが望ましい。
更に本発明により提供されるのは、頻繁に実行されるコードと頻繁に実行されないコードとを分けることを含むコンピュータ・システムを動作させる方法である。
当該方法は、アウトライアから主パス部分を分離することを含むことが望ましく、また主パス断片を第1の記憶域に格納し、アウトライアを第2の記憶域に格納することが望ましい。第1の記憶域と第2の記憶域とは、コード・バッファの領域であることが望ましい。当該方法は、主パスの断片とアウトライアとをコード・バッファの反対端部に格納することを含むことが望ましい。
当該方法は、頻繁に実行されないコードがキャッシュへ取込まれにくいようにコードを格納することを含むことが望ましい。
本発明はまた、コード・キャッシュを含むコンピュータ・システムにおけるコードの格納方法を提供し、当該方法は頻繁に実行されないコードがキャッシュに格納されにくいようにするものである。
本発明によれば、主パス・コードをコンパイルし、このコンパイル・コードを1つの記憶域に格納するステップを含む、コンピュータ・システムを動作させる方法が更に提供される。当該方法は、アウトライアを別の記憶域に格納することを含むことが望ましい。
また本発明によれば、頻繁に実行されないコードがアウトライアとは別になるように行われる、コードをコンパイルする方法も提供される。
本発明はまた、先に述べた方法によりコンピュータ・システムに格納されるコードを提供し、また本発明によりコードをコンパイルするコンパイラを提供する。
本発明は更に、本発明による方法を実施するためプログラムが記録されたコンピュータ読取可能な記憶媒体を提供する。
本発明はまた、頻繁に実行されるコードがアウトライアとは別になるように行われるコードのコンパイルのため、プログラムが記録されたコンピュータ読取可能な記憶媒体を提供する。
本発明は更に、前述のような方法に従ってプログラムされたコンピュータを提供する。
従って、本発明は、望ましくはアウトライアは空間的に別の領域にのみ格納されるが、主パスのコードの実質的に全て(および望ましくは、これのみ)を一緒に1つの記憶域に格納する手段を含むコンピュータ・システムを提供する。このようなメモリのレイアウトは、典型的にキャッシュへロードされる有効コード量を最大化する。
本発明はまた、アウトライアは別の記憶域に格納することが望ましいが、主パスのコードの全てをコンパイルし、コンパイル・コードの実質的に全てを1つの記憶域に格納するステップを含む、コンピュータ・システムを動作させる方法を提供する。
「アウトライア」は、優先して実行されるコードのため通常の記憶域外に存在するので、このように呼ばれる。このように、主要でないパスを意味する頻繁でないコードは、更に頻繁に用いられる主パス・コードとは分離され、従って、主パスが実行中であるかぎりキャッシュへロードされることがない。
本発明の特質のいずれか、あるいは一部、あるいは全てが、他の任意の特質に適用され得る。
以下の考察は、先に述べた本発明のいずれかおよび全て、および本発明の特質に適用する。
適切な場合、純粋に事例として、(上記の改善を略図的に示す)添付図面が参照される。
図3Aは、計算1、2、3、4および5をそれぞれ実施するブロックB1、B2、B3、B4およびB5を含むジャバ・バイトコードの部分を示している。B4は、B1、B2またはB3において生じる例外を処理するコードである(B4に対するパス9000、9002および9004を参照)。ブロックを介する主パスは、B1の終りにおける制御の条件付き転送時に制御が(ほとんど)つねにB1からB3へ進み(パス9006)B3が制御をB5へ進む(パス9008)如きものであることが判る。パス9000、9002および9004は、ほとんど利用されない。
(特に、ランタイム時のコンパイルの場合における)このようなコードに対する標準的なコンパイル手法は、5つ全てのブロックに対してコードを注入することであり、コンパイル・コードの以降の実行における全ての偶然を許容する。このため、B2およびB5の潜在的にむだなメモリ・スペースのコンパイル・バージョンは、以下に述べるように、望ましい実施の形態に比して、有効コードのキャッシュ密度の低減をもたらし得る。このような方法の多くがこのような標準的な方法でコンパイルされるならば、コンパイル・コードを包含するため用いられるより広い範囲のアドレス・スペースは、アドレス・スペース・ページ境界にわたる制御の転送を更に頻繁にもたらし得、その結果(仮想メモリがコンピュータ・システムにおいて使用可能にされるならば)望ましい実施の形態と比してページ・フォルトの頻度が高くなる。
プログラムが走るとき、プロセッサは、メモリから命令を取出す。プログラムに対する命令が1ページの終りまで走るとき、次のページが主メモリになければ、メモリ・マネージャは次のページを見出し検査するため照会されねばならない。これは時間を要する。従って、ページ境界にクロスすると時間を要する。
コードの標準的なコンパイルが図3Bに示される。ブロックB1、B2、B3、B4およびB5が逐次セットアウトされる。
コードのコンパイルは、ブロックB1における条件テストのロジックを反転させ、その結果予測されるフォール・スルーのケースはブロックB3に対するものとなり、制御の予測されないフローはアウトライアOL1に対するものとなる。ブロックB1およびB3に対するコードは、ソースおよびバイトコードのレベルでは隣接していないにも拘わらず、スペース的に連続していることに注意されたい。このことは、分岐予測ハードウエアを備える最近のプロセッサにとって有利である。このような定義による隣接性がブロックB2が間に挿入された場合より小さな範囲のメモリ・アドレス・スペースで済むことも注意されたい。
ブロックB2およびB4は、これらが主パスの一部でないことが判っていたので、コードのコンパイル・バージョンには存在しない。
B5もまたブロックB3とスペース的に隣接しており、例外ハンドラB4へジャンプするためバイトコードに存在する元の無条件の制御転送は、対応するホスト命令を要求しない。ブロックB3は、制御フローに関して単にブロックB5へ直結している。このため、ブロックB1、B2およびB5は、スペース的に隣接しており、従ってブロックB3およびB4が散在されるより合計において小さな範囲のメモリ・アドレス・スペースで済む。これらのブロック(B1、B2およびB5)は、ジャバ・方法の今日の実行特性をモデル化するようにパッケージされてきた。
次に、同様な方法で所与のコード・バッファへコンパイルされる幾つかの方法(または、その主パス)について考察しよう。これらが制御を相互に渡すので、キャッシュの摂動は,有効コードのより大きなキャッシュ密度を持つことによって低減されることになる。低いキャッシュ密度は、更に頻繁にキャッシュの衝突およびキャッシュのミスをもたらし得る。また、コンピュータ・システムが仮想メモリを用いる場合、望ましい実施の形態は、頻繁に実行可能なコードに対するアドレス・スペースの使用における低減の結果、ページ・フォルトの低減を生じ得る。プロセッサがメモリにない命令を実行しようとするとき、ページ・フォルトが生じる。ページ・フォルトが生じると、実行されるべき命令が見出されるページが仮想メモリとして用いられる恒久的記憶装置からメモリへロードされる。これは、実行速度を低下させる時間を要する動作である。
OL1のようなアウトライアのコードの一例は、下記のとおりである。
a=rn //a,b,cに対する状態を更新し記憶場所を復元する
b=rm
c=rs
callglue (3000)//グルー・コードを呼出し、バイト・コード・アドレス3000
からコンパイルされないコードを解釈するよう指示する
インタプリタは、ブロックB2の初めに実行を開始する。3000におけるバイト・コードが充分に実行されるならば、これは後でコンパイルされる。次にグルーが3000から解釈するよう指示されると、B2のコンパイルされたバージョンが存在することを認識する。OL1の「callglue」ラインを(自動的に)「goto...」するよう変更して制御をコンパイル・バージョンへ向ける。これは、「パッチング」として知られる(本明細書のエージェント資料第12参照)。このように、次にアウトライアOL1が呼出されると、制御はグルーを用いることなく直接b2へ送られる。(本明細書のエージェント資料第1も参照。)
異なるタイプのアウトライアOL2は、例外条件が主パス内で認識される状況を処理する(例えば、ブロックB1が、その適法の境界外のアレイにアクセスしようとする)。主パスは、例外を処理するため制御をアウトライア(OL2)へ送る。ここで、アウトライアは、通常状態を同期させ、次に仮想マシン内に例外を生じるため制御をグルー・コードへ送る。
a=rn //状態の更新、a,b,cに対する記憶場所を復元する
b=rm
c=rs
callglueが例外Xを生じる //タイプXの実行を処理するため、グルーに制御 を実行 ハンドラへ送るよう指示する
グルー・コードの使用およびインタプリタへの制御の転送の更なる論議は、本明細書の項「エージェント資料第1」に見出すことができる。
図3Cには明瞭にするため2つのアウトライアのみが示された。実際には、各例外および生じ得る主パスからの各偏差を処理するため、個々のアウトライアが提供される。
アウトライアは、関連する主パスと対応するこれらコードのブロックから空間的に遠く離れている。実行中に予測されない、すなわち例外の挙動に遭遇するとき、所与のコンパイルが、主パスにより使用されるアウトライアの主パスに対する1組のブロックと別の1組のブロックを生じる。
図3Dは、コンパイル・コードのブロックおよびコード・バッファ9054へ充填されるアウトライアを示している。主パスのブロックが方向9056においてブロックへ充填され、アウトライアは方向9058において充填される。主パスのブロックは、コード・ブロックの一端部を占有し、そのアウトライアは他端部を占有する。コードの新たな断片の各コンパイルが、主パスのブロックおよびアウトライアの新たな組を生じ、コード・バッファはアウトライアと主パスのブロックが相互に成長するように設計される。従って、正常な実行過程において、アウトライアが実行されない場合、これらアウトライアの存在がプロセッサのキャッシュの挙動に関してシステムにおいてトランスパレントであることが判る。こに有効コードの最大キャッシュ密度および有効コードの最大アドレス・スペース密度が得られる。
代替的な実施の形態においては、主パスのコード・ブロックとアウトライアは、ブロックの同じ端部から埋めることができるが、コードの各断片ごとのブロック単位である。上記の事例では、バッファはb1、b3、b5、OL1、OL2、OL3、、、を(この順序で)含むことになる。コンパイルされる次の断片もまた、主パスのブロックに対するコードを展開し、その後アウトライアのコードが続く。しかし、このような構成は、アドレス・スペースがアウトライアにより費消されてアウトライアのコードがキャッシュへ取込まれる機会がより大きくなるので、望ましくない。
図3Eが示すように、プロセッサ・チップ9200が400MHzの速さで動作し、オンボードの16Kの第1レベルのメモリ・キャッシュ9202と関連させ得る。例えば512Kの第2レベルのキャッシュ9204は、チップ9206と関連させられる。これらは、第1および第2レベルのキャッシュ・メモリの400MHzより著しく低い速度で動作するおそらくは32MBの通常のRAM9208に加わる。動作において、プロセッサは、一時に1行ずつキャッシュから命令を取込む(32バイト)。最も頻繁に使用されるコード、すなわちコンパイルされた主パス・コードがそれほど頻繁に使用されないコードから別の記憶域に格納されることを保証することにより、キャッシュにおいて最も頻繁に使用される命令の密度を増すことができる。この過程においては、それほど頻繁に使用されない命令もまた一緒に格納されるが、キャッシュでないメモリに格納され、これによりキャッシュを汚染することがない。
コードの一部の頻繁に実行されない断片から頻繁に実行される断片を分けるために、頻繁に実行されるこれら断片を最初に識別することが必要である。これは、コードの実行ランを分析して、コードを介して最も頻繁に実行されたパス(主パス)を識別することによって実施可能である。主パスは、コードの前のランから決定することができる。本発明の望ましい実施の形態において、主パスは実行中オン行で動的に決定される。主パスの決定の詳細な論議については、頭書のエージェント資料第1に見出すことができる。要約すれば、コードの各ブロックが実行される回数は、実行履歴レコーダにより記録される。実行履歴レコーダは、ブロックが実行されたことを知り、かつ制御がどこから送られたかを知り、また(制御がブロックから移る)後続ブロックをも知る。この情報から、各ブロックの最も頻繁な後続部を決定することができ、またこれにより主パスを見出すことができる。
コードがジャバ・アプリケーションのコードである場合は、このコードはインタプリタにより最初に翻訳される。実行履歴レコーダは、インタプリタにより走らされ、各ブロックの解釈についての情報を記録する。いったんブロックがインタプリタにより閾値回数だけ実行されると、インタプリタはブロックの詳細をコンパイラ・マネージャにより管理されるコンパイルの待ち行列へ送る。この回数の閾値は5である。コンパイラ・マネージャが待ち行列を調べてコンパイルされるブロックを得ると、マネージャはブロックの解釈に関して実行履歴レコーダにより記録された情報を用いて、このブロックおよびその最も頻度の高い後続ブロックから主パスを追跡する。次に、コンパイラは、以下に更に詳細に述べるように、コードの主パス部分のコンパイル・バージョンを生じる。
コードB2およびB4の頻繁に実行されない部分のコンパイル・バージョンは用意されない。代替的な実施の形態においては、コードのコンパイル・バージョンは用意され得るが、これらのコード部分のコンパイルは時間を要し、コンパイル・バージョンはメモリ・スペースを占有し、このため、代替的な実施形態は、例えば仮想マシンにおけるメモリが制限される場合には魅力がない。
断片B1、B3、B5は逐次展開される(図3Cの断片b1、b3、b5参照)。例えば、公知の最適化手法を用いて、コードのコンパイルにおける最適化が行われる。例外検査は、コンパイル・コードにおける関連する位置に挿入され、この例外検査はコンパイルされないコードのブロックB1、B3、B5における最初の検査に対応する。例外検査はそれぞれ、アウトライアと呼ばれるコードの関連部分へのジャンプを含む(B1における例外については、OL2が示される)。先に示したように、例外の処理のためには、アウトライアがコードB4のコンパイル・バージョンは含まないことが望ましい。アウトライアは、コードのコンパイル・バージョンからの制御の転送前に必要な状態およびレジスタを更新するためのコードを含む。
例えば、ブロックB1の終りにおける転送に対応する条件付き転送時にコンパイル・コードが最適化された場合、ブロックb1の終りでは一部の状態がまだ更新されていないことがある。また、コードのコンパイル・バージョンは、元のコードの記憶場所とは異なる記憶場所に状態を保持しているかも知れない。アウトライアOL1は、状態の全てを更新して、これら状態がブロックB1からB2への制御の転送時にそうであったものに登録する。次に、アウトライアOL1は、制御を変換装置へ転送し、この装置が制御をインタプリタへ転送し、このインタプリタがB2に対するコードの解釈へ進む。いったん例外が処理されると、適切な場合は、制御はグルー・コードを介して再びアウトライアへ戻すことができ、このアウトライアが更新された状態を復元し、コンパイル・コードの実行がブロックb3において再開し得る。変換装置およびグルー・コードの役割の更なる論議については、項「エージェント資料第1」を参照されたい。
ほとんどの場合例外が生じず、実行は単にブロックb1、b3、b5を通り過ぎることが理解されよう。
本発明の方法を実施する装置は、図3Fに略図的に示されている。当該装置は、コードの解釈のためのインタプリタ9300を含んでいる。実行履歴レコーダ9302は、インタプリタ9300によるコードの実行の詳細を記録する。ブロックが予め定めた回数だけ実行されると、実行履歴レコーダ9302が、コンパイルのためのブロックの待ち行列を管理するコンパイラ・マネージャ9304へ通知する。コンパイラ9302は、待ち行列を調べてコンパイルされるブロックを得、実行履歴レコーダ9302のレコードから主パスを決定して主パスの部分をコンパイルし、この部分に対して必要なアウトライアを用意する。コンパイルされた部分は、コード・バッファ9308へロードされる。主パスの部分はバッファ9308において順方向にロードされ、アウトライアはバッファ9308において逆方向にロードされる。時には、バッファ9308におけるコンパイル・コードの行がキャッシュ9310へ取込まれる。コンパイルされたコードは、バッファ9308あるいはキャッシュ9310から実行装置9312により実行される。主パス・コードでは処理できない実行に遭遇すると、アウトライア9314が何らかの必要な状態を更新して、例外の処理のためコードを解釈するよう進むインタプリタ9300へ制御を送るグルー・コード9316へ転送する。
本発明の上記の特徴の一部あるいは全ては、コンピュータ・ソフトウエアを用いて実現された。しかし、無論、当業者には、これらの特徴のいずれもハードウエアあるいはハードウエアとソフトウエアの組合わせを用いて実現できることが明らかであろう。更にまた、ハードウエア、コンピュータ・ソフトウエアなどにより行われるファンクションが電気信号などを用いて実施されることは容易に理解されよう。
情報の記憶に関する特徴は、適切な記憶域またはストアにより実現される。情報の処理に関する特徴は、ソフトウエアあるいはハードウエア、あるいはその組合わせにいずれかにおいて、適切なプロセッサまたは制御手段によって実現される。
本文に用いられる如き用語「コンピュータ・システム」は、「コンピュータ」、「システム」、「装備」、「装置」、「マシン」などと互換であり得る。コンピュータ・システムは、仮想マシンでありあるいはこれを含むものでよい。
方法および装置を含む上記、および他の特徴および特質の一部あるいは全てにおいて、特徴および特質はどんな適切な方法においても組合わせることができる。
本発明が純粋に事例として記述されるものであり、細部の修正が本発明の範囲内で可能であることが理解されよう。
本文に開示される各特徴、および(適切な場合)請求の範囲および図面は、独立的に、あるいは何らかの適切な組合わせにおいて提供することができる。
本発明は、「インターフェース」の抽象化を、特にジャバにおいて用いるオブジェクト指向言語の最適化された実行に関するものであることが望ましい。望ましい実施の形態においては、本発明は、インターフェースの諸法に対するディスパッチ機構に関するものである。
ジャバは、インターフェースによる、クラス・タイプの単一の継承をサポートする。インターフェース自体は、他のインターフェースから様々な継承内容であり得る。具体的なクラスが1組のインターフェースを実現することを要求するとき、各方法の実現方法をこれらインターフェースにより直接あるいは間接的に提供しあるいはこれを継承されねばならない。資料[2]を参照されたい。
オブジェクト指向プログラミングにおいては、オブジェクトは、各オブジェクトが属性(その特徴すなわち特質についてのデータ)および方法(オブジェクトが行うファンクション)と関連した階層的構造において分類される。このようなファンクションは、典型的に、モバイルその他の電話の関連における「鳴奏(リング)」、あるいはオーディオおよび(または)ビデオの再生装置の関連における「再生(プレイ)」である。ジャバのようなオブジェクト指向言語における特徴の1つとして、オブジェクトの上位クラスの属性および方法は、そのサブクラスにより「継承」される。
別の文脈においては、モバイルその他の電話のユーザは、電話の使用が仕事であるか社交であるかに従って異なる鳴奏音を出すように自分の電話セットを構成したいと思うかも知れない。このような関連では、「リング」は「インターフェース」と呼ばれることになる。その意味は、「リング」が階層における種々のオブジェクトが(先のカーの事例における「ライトの点灯」のように)生じるが、実際の構成はオブジェクトごとに異なるファンクションであることである。従って、インターフェースは、幾階層にも横断する。このように、インターフェースは、オブジェクトが行うことができるファンクション(「リング」、または「プレイ」、あるいは「レコード」などのような)のリストである。
1つの継承は、通常は、ディスパッチ・テーブル(仮想的なファンクションテーブルとしても知られる)を用いて実現される。サブクラスは、その上位クラスのディスパッチ・テーブルを継承し、これを新たな方法で拡張し、取消されたエントリに置換わる。
C++のような言語における多くの継承は、多くのディスパッチ・テーブルおよびオフセット(詳細については、資料[1]参照)を用いて通常実現される。
関連するデータは、図4Bに略図的に示されるディスパッチ・テーブルのスロットに格納される。テーブル410におけるオブジェクトの属性はつねに、オブジェクトの開始点から同じ距離に置かれる。オブジェクトは、同じファンクションの開始点からつねに同じ距離にある方法のディスパッチ・テーブル414に対するポインタ412を含む。しかし、インターフェースの方法が用いられるとき、先に述べたように、ディスパッチ・テーブルのどのスロットに特定のファンクションが現われるかを知るより所はもはやない。このことは、多くの継承に固有のものであり、特にジャバ言語において見出されるインターフェースに固有の問題である。
ファンクション「プレイ」の類比に関しては、例えばビデオ・レコーダに対して1つのディスパッチ・テーブルがあり、テープ・レコーダに対して1つのディスパッチ・テーブルがあることになる。それぞれが、異なるインターフェース参照を行うことになり、従って「プレイ」は、例えば、ビデオ・レコーダではポジション2にあり、テープ・レコーダではポジション22となる。
インターフェースの方法に関わる論理的定義は、所与のオブジェクトのクラスにより直接あるいは間接的に構成される方法のリストを探すことである。これは明らかに遅くなる。このことは、ディスパッチ・テーブルをならう「フラット」な構造を探すことにより改善することができる。
資料[3]は、インターフェースの方法が見出された最後のオフセットが思い出され、最初の考えとして関与するインターフェースに次に遭遇する最適化について記載している。この考えが誤りであることが判ると、更に完全なサーチが行われる。このような試みは、所与の呼出しサイトが同じタイプのオブジェクトに対して働く傾向があるという前提に基くものである。
この考えが正しくても、それを確認するため識別の方法を調べなければならない。この考えが誤りである場合は、やや遅いサーチが必要となる。
別の試みは、多くの継承がサポートされるC++の類似方法を用いることである。本発明は、オブジェクト指向言語におけるプログラムの実行中ディスパッチ時間を短縮する方法によってこの問題を解決するものであり、このプログラムは多数のインターフェース方法を有する。当該方法は、
(i)ディスパッチ・テーブルを作成し、
(ii)対応するディスパッチ・テーブルにおける特定の場所に対する指標として、あるいはプログラムを実行するコンピュータに格納される方法としてのポインタを有する、1つ以上のディスパッチ・テーブルに対するインターフェース・ハッシュ・テーブルを作成し、
(iii)プログラムが特定のインターフェース方法を要求するステップを実行するとき、インターフェース・ハッシュ・テーブルを用いて、ディスパッチ・テーブルを介してかあるいは直接に前記インターフェース方法を探す
ステップを含んでいる。
特に、本発明は、仮想マシンにおいてディスパッチ時間を短縮する方法をも提供し、仮想マシンにより実行される1組のプログラムが(CDのような)コンピュータ読取可能な媒体に格納され、仮想マシンは、
(i)ディスパッチ・テーブルを作成し、
(ii)1つ以上のディスパッチ・テーブルに対して、対応するディスパッチ・テーブルにおける特定の場所に対する指標として、あるいはプログラムを実行するコンピュータに格納される方法としてのポインタを有するインターフェース・ハッシュ・テーブルを作成し、
(iii)プログラムが特定のインターフェース方法を実行するとき、インターフェース・ハッシュ・テーブルを用いて、ディスパッチ・テーブルを介してか、あるいは直接的に前記インターフェース方法を探す
ことにより、プログラム実行の過程においてディスパッチ時間を短縮するよう働く。
ディスパッチ時間を短縮するこれらの方法は、明らかにジャバに対して特に適用され得る。本発明の実施の一形態では、ディスパッチ・テーブルに対し1つのインターフェース・ハッシュが存在する。本発明の別の実施の形態においては、全てのディスパッチ・テーブルに対して1つのインターフェース・ハッシュが存在する。
本発明の一形態では、ディスパッチ・テーブルがインターフェース・ハッシュ・テーブルを指示する。本発明の別の形態では、ハッシュ・テーブルは開始時はディスパッチ・テーブルの一部である。本発明のこのような後者の形態は、これにより1つのレベルのインダイレクションを排除する。
インターフェース・ハッシュ・テーブルは、例えば、ディスパッチ・テーブルのスロット数を含むことができる。あるいはまた、インターフェース・ハッシュ・テーブルはファンクション点を含み得、これにより1つのレベルのインディレクションを排除する。
本発明の方法は、インターフェース・ハッシュ・テーブルにおける同じインターフェース方法を探すときに生じる衝突の場合に特別な回復方法を呼出すステップを含むことが望ましい。このような場合、ハッシュ・テーブルは、コンピュータに格納される方法を指示するか、あるいはディスパッチ・テーブルにおけるフォールバック・スロットを指示することができ、これは、クラスを「仕分け」て呼出しを適切な場所へ指向するよう設計される適切な格納された方法へ呼出しを再指向する。
本発明の最も広い特質によれば、このような問題に対する解決法はハッシュ・テーブルによる余分なレベルのインディレクションを用いることである。
ハッシュ・テーブルにおける衝突がない場合の大部分では、インターフェースの呼出しが、標準的な仮想的なディスパッチより僅かに遅く、インターフェース方法を呼出す公知の手法より速い。これはまた、特にディスパッチ・テーブルのスロットが情報の1つ以上のワードを含むときに、C++の多重継承法より更にコンパクトであると予期される。
インターフェース・ハッシュ・テーブルに衝突が存在する場合、ディスパッチ・テーブルにおけるフォールバック・スロットが遅いが確実なサーチを行う。
本発明の他の特質によれば、要求される情報に対する高速アクセスの問題は、種々の装置の各々に対するインターフェース・ハッシュ・テーブルならびにディスパッチ・テーブルの使用によって解決されあるいは軽減される。
本発明の望ましい実施の形態については、純粋に事例として、(改善を略図的に示す)添付図面を参照して次に記述する。
本発明の実施の一形態については、事例としてのみ「仮想マシン」を実際に適用できる方法を示すため次に記述する。「仮想マシン」が非常に多くの異なるシステムに適用できるから、これが例示に過ぎないことが判るであろう。これらの事例は、(ハンド・ヘルド・コンピュータを内蔵する)モバイル電話、ディジタル・テレビジョン用のセットトップボックス、MPEGディジタル・システムに使用されるよう意図されたビデオ装置、インテリジェント・ディスク・ドライブを含む。本発明は、物理的なサイズ(例えば、モバイル電話)によりメモリが制限され、ジャバのようなオブジェクト指向言語を用いてプログラムを実行する更に有効なモードが使用できる場合に、特に有効である。モバイル電話搭載のメモリは、例えば、500kb以下に制限され、制限されたメモリを持つ環境においては本発明が良好に働く。しかし、これはまたそのようなメモリにおいても良好に走ることができる。
図4Dないし図4Fは、コンピュータ(図示せず)またはマイクロコントローラ(図示せず)が、「水」の供給すなわち流量(例えば、弁)、「熱」(例えば、時間、弁、ポンプ)、および「光」(例えば、スイッチ)の制御、および「ビデオ」システム(例えば、スイッチ)の動作の制御において使用される動作装置461−464の状態を制御するためのコントローラ・プログラム460を装備した家庭の環境に対して仮想マシンを用いる一例を略図的に示している。これらの動作装置461−464は、それぞれ、所要の動作を生じるためスイッチ、弁、ポンプなどへ適切な動力が与えられるように、プログラムの実行中にコントローラ・プログラム460から適切な指令信号を受取る各装置ドライバ465−468に接続されるように示される。入力469は、コントローラ・プログラムがユーザの要求に対して特定仕様とすることを可能にし、これにより、例えば現在では、加熱システムがオン/オフされ(その温度が調整され)、ビデオ・システムが再生状態にされる、などである。
次に図4Dにおいて、「装置」がサブクラス「ヒーティング・システム」および「電気装置」およびサブクラス「湯水システム」(または、洗浄用に使用される家庭用湯水)、「セントラル・ヒーティング」(空間の加熱に使用される閉循環系統である)、「照明」(各室における照明を含む)、および「ビデオ」(再生、録画、録音、カセットのイジェクション、などのための制御ファンクションを含む)に共通するオン/オフの方法を有するクラスである階層的構造で分類される家庭用システムの各部がオブジェクトとして示される方法を示している。更に、「ヒーティング・システム」は室温の制御を可能にする設定温度の方法を有し、「湯水システム」は(軟水化カートリッジが交換する必要のあるときを示すことが意図される)方法「リロード」を有し、サブクラス「照明」は方法「減光」を有し、サブクラス「ビデオ」は属性「再生」および「カセット交換」を有する。
図4Eは、このようなクラスおよびサブクラスに対するディスパッチ・テーブルを示している。全てのディスパッチ・テーブルにおいて、「オン」および「オフ」のファンクションがポジション1および2を占めている。しかし、「湯水システム」および「セントラル・ヒーティング・システム」に対するポジション3は、「温度設定」であるが、同じポジション3は「湯水システム」および「ビデオ」に対しては減光および交換である。方法「交換」は、軟水化装置におけるカートリッジの交換と、ビデオ・システムにおけるカセットの交換とを弁別する必要があるが、属性「交換」は他の点では類似している。図4Eでは、図面および記述を簡単にするため少数の制御ファンクションが示され、それらのディスパッチ・テーブルは通常は更に多くのスロットすなわちエントリを含むことになろう。
任意の関連するインターフェース・クラスと衝突しない開始ハッシュ値を選択し、次にこれから逐次インターフェースの各メンバー方法ごとにハッシュ数を割当てることが望ましい。ハッシュ値は、同じインターフェースまたは関連するインターフェースの方法が一義的なハッシュ値を持ち競合すなわち衝突しないように選択されるべきである。多くのインターフェースを実現しあるいは多くの方法とインターフェースするオブジェクトは、明らかに衝突を避けることができない。大きなハッシュ・テーブルは通常は衝突数を減じる。
図4Cは、特定の階層(例えば、図4D)内のオブジェクト(例えば、ビデオ)に対するデータがテーブル420のようなデータ構造で配置される本発明の実施の一形態を示している。このデータ構造は、ヘッダと複数のオブジェクト・データ・フィールドとを含むことになる。ディスパッチ・テーブル422におけるスロットに格納された関連方法に対する呼出が行われると、この方法が配置される正確なスロットを知ることの不確定さのゆえに、ディスパッチ・テーブル422が、ディスパッチ・テーブル422における方法の場所の圧縮バージョンを含むハッシュ・テーブル424へこの呼出しを自動的に再び指向させることになる。また、ハッシュ・テーブル424内の場所が各方法に対してつねに同じであるゆえに、ハッシュ・テーブルは、ディスパッチ・テーブル内の全てのあり得る場所のサーチよりも速くディスパッチ・テーブル422における正しい場所に導く指標ポインタ426を生成することができる。他のハッシュ・テーブル(図示せず)およびそのそれぞれのディスパッチ・テーブルでも同じプロセスが続く。
ハッシュ・テーブルにおける衝突の場合には、同じ場所が2つのインターフェース方法に対して必要とされるので、ハッシュ・テーブルは、クラスを「はじく」よう設計されたコンピュータに格納される方法を指示し、発呼者を適切な場所へ指向させる。これはまた、コンピュータに格納された「はじく」方法を指示するディスパッチ・テーブル422におけるスロット(例えば、最初の)を最初に指示することによっても行うことができる。
このハッシュ・テーブルは、ディスパッチ・テーブルの初めに含まれるか、あるいはディスパッチ・テーブルから参照される。
(レジスタにおける)所与のオブジェクトにインターフェース方法を呼出すため、
a.所与のオブジェクトに対するインターフェース・ハッシュ・テーブルのアドレスをロードする
b.インターフェース・ハッシュ・テーブルに対する指標としてそのハッシュを用いる特定のインターフェース方法に対するスロット数を取得する
c.宛て先インターフェース方法に対する一義的な識別子をレジスタへロードする
d.ディスパッチ・テーブルのスロット数が与えられると、正常な仮想的呼出しを行う。
上記ステップに対する擬似アセンブラ・シーケンサは、
ディスパッチ・テーブルにより指示されたインターフェース・ハッシュ・テーブル
LOAD Rd.doffs[Ro] ディスパッチ・テーブル・アドレスをロード
LOAD Ri,ioffs[Rd] インターフェース・ハッシュ・アドレスをロード
LOAD Ri,hash[Ri] ハッシュ・テーブルからのスロットをロード
LOAD Ru,#uniqlfaceld 一義的なインターフェースidをロード
LOAD Ri,[Rd +Ri] 方法アドレスを取得
CALL Ri インターフェース方法を呼出す。
ハッシュ・テーブルがディスパッチ・テーブルの一部である本発明の形態においては、1つのレベルのインディレクションが排除される。
ディスパッチ・テーブルで(前に)格納されたインターフェース・ハッシュ・テーブル
LOAD Rd,doffs[Ro] ディスパッチ・テーブル・アドレスをロード
LOAD Ri,-hash[Ri] ハッシュ・テーブルからスロットをロード
LOAD Ru,#uniqlfaceld 一義的なインターフェースidをロード
LOAD Ri,[Rd+Ri] 方法アドレスを取得
CALL Ri インターフェース方法を呼出す。
インターフェース・ハッシュ・テーブルが方法ポインタを含む本発明の形態においては、別のレベルのインディレクションが排除される。
インターフェース・ハッシュ・テーブルに格納された方法アドレス(プラス、前の最適化)
LOAD Rd,doffs[Ro] ディスパッチ・テーブル・アドレスをロード
LOAD Ri,-hash[Rd] ハッシュ・テーブルからアドレスをロード
LOAD Ru,#uniqlfaceld 一義的なインターフェースidをロード
CALL Ri インターフェース方法を呼出す。
コンピュータ技術の当業者には、情報の密集度が低い場合、さもなければデータ・セット内に高い冗長度が存在する場合、ハッシュ・テーブルがデータ・セットを管理し得る割合まで低減する手段であることが判るであろう。このように、ハッシュ・テーブルは、アプリケーション全体のスケールを減じることができ、これにより装置の大きさを減じることができ、これはジャバの重要な特徴の1つである。
1.インターフェース方法に対するハッシュの使用
各インターフェース方法は、小さなハッシュ値が割当てられる。このインターフェース・ハッシュ値は多くの方法で得ることができるが、以下に用いられるハッシュ・テーブルのサイズを越えてはならない。
ハッシュ値がインターフェース方法間の衝突を減じるように選定されるならば最良であり、従って同じインターフェースまたは関連するインターフェースの方法が一義的なハッシュ値を持つようにハッシュ値が選定されるべきである。明らかに、多くのインターフェースまたは多くの方法とのインターフェースを構成するオブジェクトは、衝突を避けることができないことがある。
当然のこととして、ハッシュならば、テーブルが大きくなるほど衝突数が通常少なくなる。
2.インターフェース方法を呼出すときのハッシュ・テーブルを介するインディレクト
実際の各クラスが定義されると、このクラスが構成する方法の組が判り、ディスパッチ・テーブルが生成される。ディスパッチ・テーブルは、上位クラスから敬称された方法の構成を考慮に入れる。
固定サイズのハッシュ・テーブルが各クラスごとに生成され、これが対応する構成のディスパッチ・テーブル指標へ上記のインターフェース方法のハッシュ値をマップする。1つのクラスが同じインターフェース・ハッシュ値を持つ2つ以上のインターフェース方法を構成する場合、ハッシュ・テーブルは以下に述べるフォールバック・ルーチンのディスパッチ・テーブル指標を含むように設定される。
このハッシュ・テーブルは、ディスパッチ・テーブルの初めに含まれるか、あるいはディスパッチ・テーブルから参照される。
(レジスタにおける)所与のオブジェクトについてインターフェース方法を呼出すため、
a.所与のオブジェクトに対するインターフェース・ハッシュ・テーブルのアドレスをロードする
b.インターフェース・ハッシュ・テーブルに対する指標としてそのハッシュを用いて指定されるインターフェース方法に対するスロット番号を取得する
c.宛て先のインターフェース方法に対する一義的な識別子をレジスタへロードする
d.ディスパッチ・テーブルのスロット番号が与えられると、正常な仮想呼出しを行う。
3.フォールバック・ディスパッチ・テーブルのエントリ
特定のクラスに対するインターフェース方法のハッシュ・エントリ間に衝突が生じる場合、インターフェース・ハッシュ・テーブルがフォールバック方法のディスパッチ・テーブル指標を含む。フォールバック方法は、宛て先オブジェクトに対して(レジスタで)アクセスし、インターフェース方法の場合は、一義的な識別子をアクセスする。
これは、インターフェース方法の当該オブジェクトの構成について標準的なサーチを行う。
従って、本発明によれば、コンピュータ・システムは、1つのクラス階層におけるオブジェクトに適する方法を含むデータ格納する1つ以上のディスパッチ・テーブルと、問題となる方法が見出されるディスパッチ・テーブルの場所を指示するインターフェース・ハッシュ・テーブルとを含む。
本発明はまた、1つのクラス階層におけるオブジェクトに適する方法を含むディスパッチ・テーブルを用いるコンピュータ・システムを動作させる方法を提供し、該方法は、1つの方法の呼出しをディスパッチ・テーブルへ指向させ、ディスパッチ・テーブルにおける方法の場所についての情報を含むハッシュ・テーブルへ呼出しを送り、この呼出しをハッシュ・テーブルから方法が格納されるディスパッチ・テーブルの前記場所へ再指向させるステップを含んでいる。
本発明はまた、オブジェクトに関するデータを格納する手段と、前記オブジェクトに適する方法に関するデータを呼出す手段と、少なくとも1つの前記方法に関するデータを含むためのディスパッチ・テーブルと、前記呼出しを前記ディスパッチ・テーブルにおける方法の場所についての情報を含むハッシュ・テーブルへ送る手段と、呼出された方法の場所にアクセスするためハッシュ・テーブルからの呼出しをディスパッチ・テーブルへ再び指向させる手段とを含むコンピュータ・システムを提供する。
あるいはまた、本発明は、ハッシュ・テーブルを用いることによりインターフェースのディスパッチ動作の性能を改善する方法と、インターフェースのディスパッチ動作の性能を改善するハッシュ・テーブルを含むコンピュータ・システムとの両者を提供する。
本発明は、別の特質において、特定の方法に対するインターフェース参照がハッシュ・テーブルにより見出される方法およびコンピュータ・システムを提供する。
「インターフェース・ディスパッチ動作」が、特定の方法に対するスロットの場所、例えば、ビデオ・レコーダの「再生」ファンクションに対するスロットの場所番号(2)が見出され、次いで関連するデータが呼出される方法であることが理解されよう。
本発明の主な利点は、速いインターフェース・ディスパッチ動作および(または)規模の大きさの低減を含む。
いずれの場合も、前項で述べたような本発明の方法またはコンピュータ・システムは、特にジャバに対して適用され得る。
当該システムの動作は、別の方法において調べることができる。このため、図42においては、特定の階層内のオブジェクトに対するデータがテーブル420のようなデータ構造で配置される。このデータ構造は、ヘッダと関連データを含む複数のフレームとを含んでいる。ディスパッチ・テーブル422におけるスロットに格納された関連データに対する呼出しが行われると、この方法が配置される正確なスロットを知ることが不確実であるために、ディスパッチ・テーブル422は、ディスパッチ・テーブルにおける方法の場合の圧縮バージョンを含むハッシュ・テーブル424へ呼出しを自動的に送り直すことになる。また、ハッシュ・テーブル内の場所が各方法に対してつねに同じであるので、ハッシュ・テーブルは、ディスパッチ・テーブルにおける正しい場所に導く指標ポインタ426を、ディスパッチ・テーブル内の全てのあり得る場所のサーチよりも更に迅速に生成することができる。
上記のことのいずれかあるいは全てにおいて、コンピュータ・ソフトウエアを用いて本発明のある特徴が構成された。しかし、無論、当業者にとっては、これらの特徴のいずれもハードウエアまたはハードウエアとソフトウエアの組合わせを用いて実現されることが明らかであろう。更に、ハードウエア、コンピュータ・ソフトウエアなどにより行われるファンクションが電気信号などを用いて行われることは容易に理解されよう。
情報の記憶に関する特徴は、適切な記憶場所またはストアによって実現されよう。情報の処理に関する特徴は、ソフトウエアまたはハードウエア、あるいは両者の組合わせのいずれかにおいて、適切なプロセッサまたは制御手段により実現されよう。
上記のことのいずれかあるいは全てにおいて、本発明は、下記の形態のいずれか、あるいは一部、あるいはその全てにおいて具現され、コンピュータ・システムを動作させる方法において具現され、コンピュータ・システム自体において具現され、前記コンピュータ・システムを動作させる方法を実行するようプログラムされるときこのコンピュータ・システムにおいて具現され、そして(または)このコンピュータ・システムを動作させる方法に従って動作するようにされるプログラムが記録されたコンピュータ読取可能な記憶媒体において具現されよう。
本文全体で用いられるように、用語「コンピュータ・システム」は、「コンピュータ」、「システム」、「装備」、「装置」、「マシン」などと互換であり得る。コンピュータ・システムは、仮想マシンであり得、あるいはこれを含み得る。
方法および装置を含む上記の異なる特徴および特質のいずれかあるいは全てにおいて、特徴および特質は任意の適切な方法で組合わされる。
本発明がこれまで純粋に事例として記述され、細部の修正が本発明の範囲内で可能であることが理解されよう。
本文の記述、および(適切な場合に)請求の範囲および図面において開示される各特徴は、独立的に、あるいは何らかの適切な組合わせにおいて証明されよう。
関連する特許:米国特許第5,367,685号
文献:
[1] M.EllisおよびB.Stroustrup著「The Annotated C++Reference Manual」(Addison Wesley(ISBN 0−201−51459−1)、217−237ページ)
[2] K.ArnoldおよびJ.Gosling著「The Java Programming Language」(Addison Wesley(ISBN 0−201−63455−4)第4章)
[3] T.LindholmおよびF.Yellin著「The Java Virtual Macine Specification」(Addison Wesley(ISBN 0−201−63452−X)258−260、403−405ページ)
[4] A.W.Appel著「Modern Compiler Implementation in Java」(第14章、1998年3月12日発行)Javaは、Sun Microsystemの商標である。
本発明は、コンピュータ・システムおよび該コンピュータ・システムを動作させる方法に関し、コンピュータにおける不要部分の整理に対するいわゆるリターン・バリアに関し、コンピュータ読取可能な記憶媒体、コンピュータ・システム、仮想マシンあるいはこれらを内蔵する類似の装置に関し、かつ動作方法に関する。望ましい実施の形態においては、本発明は、不要部分の整理に対するリターン・バリアに関する。
本発明は、ランタイム環境に対する全般的な適用性を有する。特に、本発明は、自動的なダイナミック・メモリ管理に適用可能である。
本発明は、1つの特質において、スレッドのスタックが同時の不要部分の整理により検査されている間ブロッキングを最小限に抑えるため、いわゆるリターン・バリアの使用に関する。
典型的な起動スタックが、図5Bに更に詳細に示される。便宜上、スタック(同図における29102)は、「最も新しい」項目がスタックの最下部に最も近くなるように、項目が上から下へ連続的に追加されるメモリ・ストアと見なされる。各スタックは、多数のフレーム(同図に示される29104)からなり、各フレームはデータと、他のフレームまたはスタックに対する1つ以上の参照またはフレーム・ポインタとを含む。典型的には、各フレームは、前のすなわち最も古いフレームに対するポインタ29106と、呼出し手順の実行可能なコードに対するリターン・ポインタ29108とを含む。
トレーシング・プロセスにおいては、スタックの各フレームにおける(メモリ・ヒープに格納されたメモリ・オブジェクトに対する)全てのポインタまたは参照が調べられる必要がある。これが生じるためには、これまでは、当該スレッドのスタック全体にわたってトレーシングが行われる間、スレッドが休止されることが必要であった。このことは更に、不要部分の整理プロセスが、スレッドがガーベッジ・コレクタがそのフレームを照合する許可を与えるのを待つ間、停止されることを必要とする。
換言すれば、制御の起動スタックのスレッドに含まれる任意の参照が、トレーシングするコンカレントGCのルート・セットの一部として処理されることを必要とし、かつGCプロセスの間調べられることを必要とする。調べられるスレッドが、GCスレッドが調べることができるどんな情報も変更しないことが非常に重要である。これを達成する1つの方法は、調べられるスレッドの実行を中断し、GCにスタックの全内容を調べさせ、次いで調べられたスレッドの実行を再開することである。
1つの特質によれば、(単数または複数の)スタック制御の各スレッドにより管理されるように構成された少なくとも1つ、望ましくは複数の、あるいは更に多数の起動スタックを含むコンピュータ・システムを動作させる方法が提供され、該方法は、
その起動スタックを用いて前記スレッドを実行し、かつ
更なるスレッドが望ましくは同時に同じ起動スタックをアクセスすることを許容する
ステップを含んでいる。このような特徴により、当該システムにおける同時実行の程度を強化することができる。
あり得る衝突の問題を防止するため、前記スレッドの実行は、前記の更なるスレッドが当該スレッドの起動スタックをアクセスしている時間の一部のみ休止される。従って、例えば別のスレッドのスタックの内容を調べることを欲するどんな動作もスレッドを不当に止めることなくこれを行うことができる機構が提供される。
同じ理由から、前記スレッドおよび前記の更なるスレッドは、同時に同じ起動フレームをアクセスすることを阻止される。
同様に、前記スレッドによるその時の起動フレームの実行は、前記更なるスレッドが同じ起動フレームをアクセスするのにこのスレッドが要する時間だけ休止される。
前記スレッドがその時の起動フレームから前記更なるスレッドによりその時アクセスされているフレームへ戻ることを選択的に阻止するため、バリアが設けられる。典型的な実際の状況においては、1つのスレッドは、他のスレッド(この場合は、更なるスレッドと呼ばれる)がアクセスに要する時間より所与の起動フレームをゆっくり実行するものと予期される。従って、リターン・バリアが特に頻繁に動作状態になることは予期されない。しかし、これは、衝突が生じないことを確保する上で最も重要である。
前記バリアの阻止効果は、前記の更なるスレッドが前記スレッドのその時の起動フレームのペアレントのフレームをその時アクセスしているかどうかに従って選択的である。従って、前記の更なるスレッドがその時ペアレントの起動フレームをアクセスしているならば、前記スレッドがその時の起動フレームから前記スレッドのその時の起動フレームの前記ペアレントの起動フレームへ戻ることを阻止するためにバリアが設けられることが望ましい。
その時の起動フレームに対するバリアは、前記の更なるスレッドがその時アクセスしているフレームを変更する前に提供される。このような特徴により、「エア・ロック」の形態が生成される。
同じ起動フレームに対しては、前記の更なるスレッドおよび前記第2の更なるスレッドに対する異なるバリアが設けられる。これは、異なるファンクションを行うことを可能にする。
望ましくは、前記バリアは、同バリアのグループが1つの起動フレームと関連させられるように構成される。前記の異なる各バリアごとに1つの記述子ブロックが設けられ、この記述子ブロックは1つのリンクされたリストを形成するようにリンクされることが望ましい。これは、多数のバリアを対処するのに便利な方法である。
1つのサイクルにおいては、ガーベッジ・コレクタが前記スタックのフレームの最初の走査、かつ少なくとも1つの更なる走査を行うことが望ましい。
前記の少なくとも1つの更なる走査においては、変化した唯一のフレームが走査される。走査は、時間を要し得、従ってこの特徴は不要部分の整理のために要する時間を短くし得る。
前記の少なくとも1つの更なる走査においてフレームの走査を必要とする程度のレコードが保持される。このレコードは、以降の走査を開始できる時点の決定に使用することができる。特に、このレコードは、どのフレームが変化できたか、あるいは2つの所与の走査間で生成できたかについてものである。再走査は、その時の起動フレームに対するそのままのリターン・バリアを有する最も新しいフレームからのものである。
最も関連する特質において、本発明は、
それぞれの制御スレッドにより管理されるように構成された少なくとも1つの、望ましくは複数の、あるいは更に多数の起動スタックと、
前記スレッドをその起動スタックを用いて実行する手段(望ましくは、ランタイム・エンジン)と、
望ましくは同時に同じ起動スタックをアクセスすることを更なるスレッドに許容する手段と、
を含むコンピュータ・システムを提供する。
当該コンピュータ・システムは更に、前記の更なるスレッドが前記スレッドの起動スタックのアクセスに要する時間の僅かに一部だけ前記スレッドの実行を休止する手段を含む(あるいは、例えば、ランタイム・エンジンが更に休止するようになっている)ことが望ましい。
当該コンピュータ・システムは更に、前記スレッドおよび前記の更なるスレッドが同時に同じ起動フレームをアクセスすることを阻止する(あるいは更に、阻止するための)手段を含む。
当該コンピュータ・システムは更に、前記スレッドによりそのその時の起動フレームの実行を前記の更なるスレッドが同じ起動フレームのアクセスに要する時間だけ休止する(あるいは、更に休止するための)手段を含む。
当該コンピュータ・システムは更に、前記スレッドのその時の起動フレームから前記の更なるスレッドによりその時アクセスされているフレームへのリターンを選択的に阻止する(あるいは更に阻止するための)バリアを提供する手段を含む。
当該コンピュータ・システムは更に、前記の更なるスレッドがその時アクセスしているフレームを変更する前に、その時の起動フレームに対するバリアを提供する(あるいは更に、提供するための)手段を含む。
当該コンピュータ・システムは更に、第2の更なるスレッドが同じ起動スタックをアクセスすることを許容する(あるいは更に、許容するための)手段を含む。
当該コンピュータ・システムは、前記の更なるスレッドおよび前記第2の更なるスレッドに対する異なるバリアを同じ起動フレームに対して提供するためのものである。
前記バリアは、前記バリアのグループを1つの起動フレームと関連させるように構成されることが望ましい。当該コンピュータ・システムは、前記異なるバリアごとにリンクされたリストを形成するようリンクされる記述子ブロックを提供するためのものである。
前記更なるスレッドは、ガーベッジ・コレクタのスレッドであり得る。
前記ガーベッジ・コレクタは、1つのサイクルにおいて、前記スタックのフレームの最初の走査および少なくとも1つの更なる走査を行うためのものである。
当該コンピュータ・システムは、前記の少なくとも1つの更なる走査において変化したフレームのみが走査されるようになっている。
当該コンピュータ・システムは更に、前記の少なくとも1つの更なる走査においてフレームが再び走査されることを必要とする程度のレコードを保持する(あるいは更に保持するための)手段を含む。
広義において、最も新しい起動フレームの検査に要する長さだけ非GCスレッドの実行を中断し、かつある特殊なコードを参照するようフレームのリターン・アドレスを編集することにより、不要部分の整理に関して先に述べた種々の問題を解決することが提起される。その後、連続する発呼者の起動フレームが調べられる間スレッドが実行を継続することを許容される。特定のフレームの検査がいったん完了すると、次にへ進む前に、フレームのリターン・アドレスが先に述べた同じ特殊コードを参照するように編集される。
不要部分の整理は、典型的な手順呼出しの実行速度と比較して比較的迅速なイベントである。このため、不要部分の整理が完了する前に手順の呼出しからのリターンが生じることは(無論たしかにあり得るが)比較的稀である。このような稀なイベントにおいては、特殊コードが起動され、起動フレームから再び発呼者のフレームへ戻ろうとする試みを受ける。発呼者のフレームがその時GCスレッドにより調べられているならば、非GCスレッドは、GCスレッドが別のフレームへ移るまで待機するよう強制される。
このような関連において、本発明は更に、コンピュータ・システムにおけるスレッド・スタック内に含まれる参照データの並行な不要部分の整理を改善する方法を提供し、この場合スレッドはスタック全体ではなくその時の起動フレームを調べのに要する時間だけ不要部分の整理の目的のため休止されるにすぎない。
ガーベッジ・コレクタがフレームの検査を完了するまで、当該ガーベッジ・コレクタにより内容がその時調べられている起動フレームに対する未決の手順呼出しのリターンを阻止する手段がとられることが望ましい。
本発明の範囲内で、ガーベッジ・コレクタと、スタック全体ではなくその時の起動フレームの検査に要する時間だけ不要部分の整理の目的のためスレッドを休止させる手段とを含む同様の装置もまた提供される。
緊密に関連する特質において、ガーベッジ・コレクタと、スタック全体ではなくその時の起動フレームの検査に要する時間だけ不要部分の整理の目的のためスレッドを休止する手段とを含むコンピュータまたはコンピュータ・システムが提供される。
更に緊密に関連する特質において、プログラムされたとき、コンピュータ・システムにおけるスレッド・スタック内に含まれる参照データの並行な不要部分の整理を改善し、スタック全体ではなくその時の起動フレームの検査に要する時間だけ不要部分の整理の目的のためにのみスレッドが休止される方法を提供するコンピュータが提供される。
緊密に関連する特質において、本発明は、コンピュータ・システムのスレッド・スタックにおける並行な不要部分の整理を改善する方法であって、不要部分の整理スレッドがスタックにおける問題のスレッドをアクセスすることを可能にし、最もアクティブな起動フレームの検査に必要な長さだけ問題のスレッドの実行を中断し、前記フレームのリターン・アドレスをリターン・バリア・コードに編集し、連続する起動フレームが調べられる間実行を問題のスレッドが継続することを許容し、次のフレームへ移動する前に前記各フレームのリターン・アドレスを同じリターン・バリア・コードに編集するステップを含む方法を提供する。
ガーベッジ・コレクタが起動フレームの検査を完了するときまで、ガーベッジ・コレクタにより内容がその時調べられている起動フレームへの未決の手順呼出しのリターンを阻止するため、バリア・コードが用いられる。本発明は、これにより、問題のスレッドが中断される時間を短縮する目的を達成する。本発明はまた、不要部分の整理システムにおける同時実行の程度を最大化することができ、かつ同時実行の認識を改善する。
更に緊密に関連する特質において、コンピュータ・システムのスレッド・スタックにおける並行な不要部分の整理を改善する方法を提供するプログラムが記録されたコンピュータ読取可能な記憶媒体が提供され、当該方法は、不要部分の整理スレッドがスタックにおける問題のスレッドにアクセスすることを可能にし、最もアクティブな起動フレームが検査される必要がある長さのみ問題のスレッドの実行を中断し、前記フレームのリターン・アドレスをリターン・バリア・コードに編集し、連続的な起動フレームが調べられる間問題のスレッドの実行を継続させ、次のフレームへ移る前に前記各フレームのリターン・アドレスを同じリターン・バリア・コードに編集するステップを含んでいる。
本発明はまた、
スレッドがその起動スタックを用いて実行し、かつ
更なるスレッドが同じ起動スタックをアクセスすることを許容する
ようにプログラムされたとき、各制御スレッドにより管理されるよう構成された少なくとも1つの、望ましくは複数の、更に望ましくは多数の起動スタックを含むコンピュータ・システムに拡張する。
本発明はまた、上記方法を提供するプログラムが記録されたコンピュータ読取可能な記憶媒体に拡張する。
緊密に関連する特質において、各制御スレッドにより管理されるよう構成された少なくとも1つの起動スタックを含むコンピュータ・システムを動作させる方法を提供するプログラムが記録されたコンピュータ読取可能な記憶媒体が提供され、前記方法は、
前記スレッドをその起動スタックを用いて実行し、かつ
更なるスレッドが同じ起動スタックをアクセスすることを許容する
ステップを含んでいる。
本発明は、上記コンピュータまたはコンピュータ・システムを含む仮想マシンに拡張する。
本発明は、上記方法により動作されるとき仮想マシンに拡張する。
本発明は、上記コンピュータ読取可能な記憶媒体により動作されるとき仮想マシンに拡張する。
本発明の種々の特質の異なる特徴のいずれか、あるいは一部、あるいはその全ては、他の特質に適用されよう。
本発明の望ましい特徴については、純粋に事例として、添付図面に関して次に記述される。
本発明については、まず全般的に記述し、次いで本発明が実施される特定の方法の更に総括的な記述が続く。
図5Aに関して、本発明において、スレッドは、全ての起動フレームの検査に要する時間ではなく、最近の(すなわち、最も近いかあるいは最もアクティブな)起動フレーム29004の検査に要する長さだけ、ランタイム・エンジンにより休止されるだけでよいことが認められた。このフレームは、参照すなわちポインタについて検査され、リターン・アドレスは、ヒープ29008として知られるデータについて動作するプログラム29006自体へ送られる特殊コードで前のリターン・アドレスを置換することにより編集される。この特殊コードは、前のリターン・アドレスと新しいリターン・アドレスを前記フレームにリンクする。データが戻されるときにガーベッジ・コレクタが前記フレームについて動作しているならば、リターン・バリア・コードは、ガーベッジ・コレクタが別のフレームへ移るときまでリターンを休止することにより、当該フレームにおけるデータの改変を防止する。
GCが最も新しいフレームから移動してある距離だけ移動したフレームを探すので、大半のリターンが妨げられることがない。いかなるときもスタックにアクセスを試みるスレッド数に従って、スタックには幾つかのリターン・バリアがあり得る。後続のスレッドはできるだけ多くの前のスタック数まで戻る必要がないことになる。
スレッドのスタックは、一連のフレームからなっている。1つのフレームは、1つの特定の未決の手順呼出しに関する全ての情報を含む。全てのフレームは、下記を含んでいる。すなわち、
(a)プログラムの実行がフレームと関連する手順呼出しが戻ったものから再開するはずの場所を示すある実行可能なコードのアドレスであるリターン・アドレス(リターン・アドレスは、特定タイプの命令ポインタである)、および
(b)呼出し手順のフレームを示すアドレスを指示するメモリに対する特定タイプのポインタであるペアレントのフレーム・ポインタ(ペアレントのフレーム・ポインタは、特定タイプのフレーム・ポインタである)。
手順パラメータ1、2、、、n(29304)、リターン・アドレス29306、ペアレントのフレーム・ポインタ29308および1組のローカル・データ29310を含む手順呼出しフレーム29302におけるデータの構成の表示について図5Dを参照する。
従って、図5Eに略図的に示されるように、手順呼出しスタック29402を用いてスレッドがその時実行中である未決の手順呼出しを記述するカレントのすなわち最も新しいフレーム29408の概念が存在する。前記の最も新しいフレーム29408のフレーム・ポインタ29404は、典型的に特定マシンのレジスタ(フレーム・レジスタとして知られる)に保持される。29406のような連続的なペアレント・フレーム・ポインタは、逓増的に古くなるフレーム29410、29412を指す。
上記において行われる手順は、下記のように表わされる。すなわち、
リターン・バリア機構は、多数の異なるクライアントを多分(あるいは更に、おそらくは)同時に持つ(その結果フレーム当たり1つ以上のリターン・バリアが必要となる)。ここで、1つの特定のクライアントである、実行されるファンクションが有効に停止ファンクションであるガーベッジ・コレクタについて更に詳細な記述を行う。別のあり得るクライアントはデバッギング・インターフェースであり、この場合は停止ファンクションではなく、ファンクションはデバッガに対して情報の提供に関する。このような関連において重要な特徴は、リターン機構に割込みを行う能力である。
例えば、(比較的早い速度で実行する)不要部分の整理の関連において、最も新しい起動フレームから試みられるリターンが特に生じにくいことが理解されよう。しかし、バリア付きフレームの関連において実行する手順が戻ろうと試みるとき、Cのコードが実行される。これは更にバリア・ファンクションの各々を実行し、次いでバリアがあたかも存在しないかのように完了する役割を負う。コードC(「特殊なコード」)は、擬似コードの以降の項により記述され、このコードが典型的に全てのリターン・バリアに対して一般的であることが知られよう。この項は、リンクされたリストに対する参照を含み、これは一連のリンクされたポインタである。
次に、リターン・バリアの構成について述べる。ガーベッジ・コレクタは、下記の方法でスレッドのスタックの内容を調べる。gcfは、その時GCスレッドにより調べられている起動フレームに対する参照を含むシステム・ワイドなグローバル変数とする。どのスレッドによってもこの変数を読むことはできても、GCのみがこの変数を変えることができる。従って、gcfは、ガーベッジ・コレクタがその時調べているそのフォーカスの概念を表わす。
GCスレッドは、擬似コードの次のセクションで述べるように、スレッドtのスタックを調べる。
バリア・インタセプタ・コードBは、手順が1つのフレームからペアレント(発呼者の)フレーム(pf)へ戻ろうとする比較的生じにくいイベントにおいて呼出され、これが戻ろうとしているフレームに対するポインタが与えられる。これは、GCがその時調べている(すなわち、ペアレント・フレームへ戻ろうとトラップする)フレームへ戻る試みがなされないことを保証する。
早期のスレッド検査により確定されたリターン・バリアがそのまま以降の検査に残り得ることがあり得る。このような場合、すでにバリアがあるならば、GCスレッドはバリアを確定しようとしない。GCが動作していない間は、gcfはあり得ない値を指すようにセットされる。従って、リターン・バリアは無視される。従って、GCが動作していないときはリターン・バリア機構がセルフ・クリーニングし、リターン・バリアは所定位置に残るが、その実行に関与した唯一のオーバーヘッドはpf==gcfの実行であリ、これは小さなオーバーヘッドである。
最小限の再走査をサポートするため要求される強化の詳細にについては、次に述べる。先に述べた変数に加えて、各スレッドは変数tl−hwfを持ち、これがつねに最も新しいフレームを同じGCのリターン・バリアを持つスレッドに保持する。
先に述べた手法は、並行なGC構成が各スレッドとの対話に要する時間量を最小化することを許容し得、これが更に全てのスレッドを更に迅速に再走査することを可能にし、これによりGCサイクル全体を、全てのスレッドのスタックを全体に再走査しなければならない場合に要するよりも少ない時間で完了することを可能にする。
要約すれば、(特に)2つの基本的な特質について述べた。第一に、一般的なリターン・バリア機構が提供され、手順が戻るとき任意の動作を行うことを可能にする。この機構は、リターン・バリアが使用されていないとき、過剰なオーバーヘッドを生じることがない。現フレームのみが、必要に応じて休止しなければならず、その後手順がそれ自体のペースで進み得る方向に自己調整し、同期または初期手続きはほとんど必要でない。
上記のいずれかあるいは全てにおいて、本発明の幾つかの特徴がコンピュータ・ソフトウエアを用いて実現された。しかし、無論、当業者には、これらの特徴のいずれもハードウエアまたはハードウエアとソフトウエアの組合わせを用いて実現できることが明らかであろう。更に、ハードウエア、コンピュータ・ソフトウエアなどにより行われるファンクションが電気信号などを用いて行われることが容易に理解されよう。
情報の格納に関する特徴は、適切な記憶場所またはストアによって実現されよう。情報の処理に関する特徴は、ソフトウエアまたはハードウエア、あるいは両者の組合わせのいずれかにおいて適切なプロセッサまたは制御手段により実現されよう。
本文に用いられるように、用語「コンピュータ・システム」は、「コンピュータ」、「システム」、「装備」、「装置」、「マシン」などの用語と互換であり得る。コンピュータ・システムは、仮想マシンであり得、あるいはこれを含み得る。
上記のいずれかあるいは全てにおいて、方法および装置の特徴および特質を含む先に述べた異なる特徴および特質は、いかなる適切な方法においても組合わせることができよう。
本発明が本文において純粋に事例として記載され、細部の修正が本発明の範囲内で可能であることが理解されよう。
本文の記述、請求の範囲および図面において開示された各特徴は、独立的に、あるいはいかなる適切な組合わせにおいても提供されよう。
本発明は、コンパイルされたコードのセクションを削除することを許容するためコンピュータ・システムにおけるメモリを検査する方法および装置に関し、かつコンピュータ・システムにおいてコンパイルされたコードを削除する方法および装置に関する。本発明は、スタックのウォーキング(walking)がコンパイル・コードを削除することを許容する統合化されたスタックの仮想マシンの環境における特定の用途を(これに限定されず)を見出すものである。望ましい実施の形態において、本発明は、統合化スタック仮想マシンのマルチスレッド環境におけるコンパイル・コードの削除を許容するスタック・ウォーキングに関する。
仮想マシンを用いてコードを実行するとき、エミュレートされたコードの一部または全てのコンパイル・バージョンを生成することが有利であることが判った(「主パスの動的にコンパイル」参照)。前記コンパイル・バージョンの一部あるいは全てを実質的に除去することがときに望ましいかあるいは必要であると信じる。また、エミュレートされたマシンと仮想マシンのコード自体の必要の両方のスタックの要件をサポートするため1つのスタックを使用すること、およびエミュレートされた呼出し(呼び出す)と相当することを行うネイティブな呼出し命令を使用すること、および仮想マシンをランするコードにおけるエミュレートされたリターンに相当することを行うためネイティブなリターン命令を使用することが有利であろうことも信じる。
コンピュータ・システムが特定のファンクションを行うため用いたメモリの使用を終了した場合、更なる使用のためできるだけ速く使用したメモリが返される速度と効率が問題となることが判った。
仮想マシンに対して今日知られる手法は、バックグラウンド情報部分にリストされる1つ以上の最適化手法がシステムの効率を阻害する別個の検査を利用されないことを要する。
本発明の望ましい実施の形態におけるこれらの問題に対する解決法は、コンパイル・コードの削除の時点において、仮想マシンの検査を行い、削除されるコンパイル・コードの断片内の位置を指示するスタックにリターン・アドレスが存在する場合を探し、削除されようとするコードのコンパイル・バージョンなしに前記スレッドの実行のシームレスな継続を可能にするためスタックの内容を再構成することである。この機構は、動作のコストが削除の時点で負担され、2つの状況の相対的頻度がコードの削除操作より多くの呼出し/戻り操作があるようなものであるため、正常な呼出し/戻り時にはほとんどあるいは全くコストが生じないように構成されることが望ましい。
従って、本発明は1つの特質において、コンパイル・コードの部分を削除することを許容するためコンピュータ・システムにおけるメモリを調べる方法を提供し、当該方法は、
コンピュータ・システムにおけるスタックのフレームを調査し、
コンパイル・コードの部分のアドレス範囲内にあるリターン・アドレスをフレームが含むかどうかを識別し、
このようなリターン・アドレスが識別されるときフレームの内容を変更することを含んでいる。
上記方法を実施することにより、削除されるべきコンパイル・コードのセクションをリターン・アドレスが指示したままにすることと関連する問題を克服することができる。
削除されるべきコンパイル・コードのセクションを選択し、
コンピュータ・システムにおけるスタックのフレームを調査し、
コンパイル・コードの部分のアドレス範囲内にあるリターン・アドレスをフレームが含むかどうかを識別し、
このようなリターン・アドレスが識別されるときフレームの内容を変更し、
コンパイル・コードの部分を削除する
ことを含んでいる。
このような任意のリターン・アドレスは、連続コードの断片のアドレスへ変更されることが望ましい。連続コードは、コードが削除されることなくリターン後に継続するよう実行を可能にする。連続コードは、インタプリタへ制御を渡すように構成されることが望ましい。連続コードは、例えばコンパイル・バージョンがあるエミュレートされた命令の部分に遭遇するまで、以降の命令が解釈されるように構成され、あるいはまた、コンパイル・バージョンが存在するならば、削除されるコードのこのようなコンパイル・バージョンへジャンプするように構成される。リターンに後続する命令の実行のためフォールバック・インタプリタの使用することは、命令の新たなコンパイル・バージョンを生じるオーバーヘッドなしに、削除されたコンパイル・コードの命令の実行を可能にする。
フレームがこのようなリターン・アドレスを含むならば、フレームにおける値が変更されることが望ましい。フレームにおける値は、コードが削除されることなく実行が継続することを可能にするように構成されることが望ましい。例えば、フレームに格納される一時的なレジスタ情報は、削除されるコードがコンパイルされたときに行われた最適化を勘定に入れるように変更される。このような変更は、例えば、以降の実行のため制御がインタプリタへ渡される場合に要求される。(エージェント資料第1参照)。
フレームの変更は削除の時点に行われることが望ましい。このため、リンクおよびフレームのリターン・アドレスはいずれも削除後はべコンパイル・コードを指示することがなく、実行中の時間のかかる検査を避けることができる。
スタックにおける複数のフレームが調べられることが望ましい。例えば、スタックにおける全てのフレームを調べることができ、さもなければ、コンパイル・コードの部分を指示するリターン・アドレスを含む各フレームが調べられる。
本発明の望ましい実施の形態においては、コンピュータ・システムがマルチスレッド環境を使用する。各スレッドはそれ自体のスタックを有する。
このように、リターン・アドレスが削除されるコンパイル・コードのセクションを指示しないことを保証することができる。
一部のスレッドが削除されるコンパイル・コードのセクションにアクセスできないことが判る。このようなスレッドのスタックを調べないことにより、実行時間を節減することができる。
しかし、調べられるスタックのスレッドに対しては、検査が行われる間はスレッドを停止することがしばしば必要となる。あるいはまた、スレッドをコードのあるセクションへ限定するためリターン・バリアが挿入される(「リターン・バリア」参照)。
本発明の別の特質においては、コンピュータ・システムにおけるコンパイル・コードを削除する方法が提供され、該方法は、
システムにおける各スレッドの各スタックの各フレームを調査し、
リターン・アドレスが削除されるべきコンパイル・コードの部分を指示するかどうかを識別し、
削除されるコンパイル・コードの部分のないスレッドが実行を継続することを可能にするため、リターン・アドレスを含む各スタックの内容を再構成する
ことを含む。
本発明の更なる特質においては、コンピュータ・システムにおけるコンパイル・コードのセクションを削除する方法が提供され、該方法は、コンピュータ・システムのメモリを調べ、コンパイル・コードのセクションに対するリンクを識別し、このリンクを変更することを含む。
コンパイル・コードの部分に対するリンクは、フレームにおけるリターン・アドレスであることが望ましい。このように、フレームを実行するとき識別されるリターン・アドレスは、削除されるコンパイル・コードのセクションのアドレスの範囲内にあるリターン・アドレスであることが望ましい。
あるいは更に、またはこれに加えて、メモリの検査が、削除されるコンパイル・コードに対するパッチまたはジャンプを識別することができる。前記リンクは、削除されるコンパイル・コードに対して直接的あるいは間接的なリンクである。例えば、リンクは、コンパイル・コードのセクションに対するグルー・コードのセクションである。
本発明の更なる特質において、コンパイル・コードのセクションを削除することを許容するため、コンピュータ・システムにおけるメモリを調べる装置が提供され、該装置は、
コンピュータ・システムにおけるスタックのフレームを調べる手段と、
削除されるコードのセクションのアドレスの範囲内にあるリターン・アドレスをフレームが含むかどうかを識別する手段と、
フレームの内容を変更する手段と、
を含む。
本発明の別の特質において、コンピュータ・システムにおけるコンパイル・コードを削除する装置が提供され、該装置は、
削除されるコンパイル・コードのセクションを選択する手段と、
コンピュータ・システムにおけるスタックのフレームを調べる手段と、
削除されるコンパイル・コードのセクションのアドレスの範囲内に含まれるリターン・アドレスをフレームが含むかどうかを識別する手段と、
フレームの内容を変更する手段と、
コンパイル・コードのセクションを削除する手段と、
を含む。
当該装置は更に、以降の命令を実行する手段を含み、フレームの内容を構成する手段が、任意の前記リターン・アドレスを以降の命令を実行する手段のアドレスへ変更するためのものである。当該装置は更に、フォールバック・インタプリタを含むことが望ましい。以降の命令を実行する手段は、コンパイル・バージョンが存在するエミュレートされた命令のセクションに遭遇するまで、以降の命令を解釈するように構成される。
フレームの内容を構成する手段は、フレームがリターン・アドレスを含むならば、コードを削除することなく実行が継続することを可能にするようフレームにおける値を変更するためのものである。
本発明の望ましい実施の形態において、例えば、インタプリタによる以降の実行を可能にするよう値を更新するためどんな変更が要求されるかに関して「クリーンアップ」情報が利用可能になるように、コードのコンパイルにおいて実施された最適化のレコードが保持される。当該装置を含むコンピュータ・システムの場合、当該システムが更に、コードがコンパイルされるとき「クリーンアップ」情報を記録するレコーダを含むコンピュータ・システムを含むことが望ましい。
スタックにおけるフレームを調べる手段は、当該スタックにおける複数のフレームを調べるためのものである。スタックにおけるフレームを調べる手段は、コンピュータ・システムにおける複数のスレッドの各々のスタックを調べるためのものである。
本発明は更に、先に述べた装置を含むコンピュータ・システムを提供する。
別の特質において、本発明は、コンパイル・コードを削除する手段を含み、更にシステムにおける各スレッドの各スタックの各フレームを調べる手段と、リターン・アドレスが削除されるべきコンパイル・コードの部分を指示するかどうかを識別する手段と、削除されようとするコンパイル・コードの部分なしに前記スレッドが実行を継続することを可能にするように、リターン・アドレスを含む各スタックの内容を再構成する手段とを含むコンピュータ・システムを提供する。
本発明は更に、先に述べたような方法を実施するためのプログラムが記録されたコンピュータ読取可能な記憶媒体を提供する。
上記特質のいずれか特徴は、任意の適切な組合わせにおいて他の任意の特質が提供される。装置の特徴は方法の特質に適用され、あるいは反対に方法の特質は装置の特質に適用される。
本発明の望ましい特徴については、純粋に事例として、添付図面に関して次に記述する。
望ましい実施の形態の記述に先立ち、望ましい実施の形態の背景について最初に論述する。
任意の実行パス、すなわち「スレッド」は、これと関連するスタックを有する。スタックは、一時的なレジスタ情報とサブルーチンのリターン・アドレスとからなるフレームを格納するメモリにおける領域である。従来のエミュレータにおいては、非ネイティブなアプリケーションが、ホスト・オペレーティング・システムのスタックとは別個のそれ自体のスタック(エミュレータ・スタック)を有する。
エミュレータ・スタックの動作の一例が、図6Bに示される。同図によれば、非ネイティブ・コード5008の部分は、アドレスbbbに配置されたサブルーチン5010を呼出すアドレスaaaに呼出し命令を有する。エミュレータが呼出し命令に遭遇すると、アドレスaaa(リターン・アドレス)は、一時的レジスタ情報と共にエミュレータ・スタック5009に入れられ、この時実行のパスはアドレスbbbへジャンプする。サブルーチンの終りに、エミュレータがリターン命令に遭遇する。このエミュレータはレジスタ情報と共にスタックからリターン・アドレスを取得し、主ルーチンにおける呼出し命令に続く命令へ戻る。
望ましい実施の形態の仮想マシンにおいては、非ネイティブ命令の解釈ではなく、命令の一部または全てが、ホスト・オペレーティング・システムで走ることができるネイティブ命令へコンパイルされる。コンパイルにはある量の時間が必要であるが、コンパイル・コードを走らせるとき著しい時間の節減が可能である。
色々な方法で時間の節減が可能である。第一に、コードの一部が1回以上実行されるならば、コンパイル・バージョンを実行するのが更に効率的になる。第二に、エージェント資料第1において先に述べたように、コンパイル・コードの最適化を可能にする種々の仮定がコンパイルの間にできる。第三に、ホスト・オペレーティング・システムのスタックを用いることにより、またサブルーチンの呼出しのため(エミュレートされた呼出し命令ではなく)ネイティブ呼出し命令を用いることによって、時間の節減が可能である。
図6Cにおいて、非ネイティブな主ルーチン5008および非ネイティブなサブルーチン5010が、ネイティブなルーチン5012およびネイティブなサブルーチン5014へコンパイルされる。アドレスxxxにおける呼出し命令はネイティブな呼出し命令である。この呼出し命令に遭遇すると、アドレスxxx(リターン・アドレス)が一時的レジスタ値と共にホスト・スタック5015へ入れられる。アドレスyyyにおけるサブルーチンの命令がピックアップされる。このサブルーチンの終りにおけるリターン命令に遭遇すると、リターン・アドレスとレジスタ値がホスト・スタックから取入られ、主ルーチンの実行が再開する。
コンパイル・コードのセクションから呼出されたサブルーチンをプロセッサが実行中である間コンパイル・コードのセクションが廃棄される場合は、問題が生じる。このような状況では、リターン・アドレスが、もはや存在しないコードの部分を指示するスタックに残される。
望ましい実施の形態によれば、コンパイル・コードのセクションの削除に先立ち、スタックがフレーム単位で調べられて、削除されるコードのセクションを指示する何らかのリターン・アドレスを識別する。このようなリターン・アドレスが識別されると、アドレスが、本文では「グルー・コード」と呼ばれる継続コードの部分のアドレスへ変更される。このグルー・コードは、削除されるコード部分なしに実行を継続することを可能にする。これは、コンパイル・バージョンがあるコード部分に遭遇するまで元の非ネイティブなコードにおける命令を解釈することによるか、あるいはコードの別のコンパイル・バージョンが存在するならば、このコンパイル・バージョンへジャンプすることによって行われる。
グルー・コードの使用およびコンパイル・コードと非コンパイル・コードとの間の実行の転送の論議は、エージェント資料第1において見出すことができる。
先に述べたように、サブルーチンが呼出されると、一時的レジスタ情報もまたリターン・アドレスと同じフレームにおいてスタックへ入れられる。種々の最適化がコードのコンパイルの間に行われるから、コンパイル・コードの残りが実行されるならば、このレジスタ情報のみが有効となる。例えば、コードのセクションがコンパイルされると、コンパイラがこのコードのセクションでは全てのパラメータが必要とされるわけではないことを識別することになる。このような場合、コンパイル・コードの残りの実行に必要でないので、レジスタ情報の一部が残されることになる。しかし、実行が元の解釈されたコードへ戻るならば、パラメータの全てが必要となる(インタプリタがどのパラメータが必要か必要でないかを知ることを見越し得ないので)。このように、コードの解釈されたバージョンを実行できる前に見失ったレジスタ情報が追加されることを必要とすることになる。
望ましい当該実施の形態は、マルチスレッド環境、すなわち非同期で走るが同じ作業スペースを共有する2つ以上のプロセッサすなわちスレッドがある環境において動作するよう意図される。この望ましい実施の形態では、コンパイル・コードがアクセスしたかもしれない各スレッドのスタックが調べられ、あるいは単に各スレッドのスタックが調べられる。
1つのスタックを調べるため、このスタックが関連するスレッドが、ある期間だけ停止される。実施の一形態では、このスレッドは、スタックにおける全てのフレームが調べられる間停止される。別の形態においては、スレッドは、スタックにおける最近のフレームか、あるいは予め定めた数の最近のフレームを調べるだけ充分に長い間停止される。これらのフレームがいったん調べられると、「リターン・バリア」が、エージェント資料第5に記載される方法でスタックへ挿入される。従って、このスレッドは、スタックがリターン・バリアに留まる長さだけ実行を継続することを許され得る。
図6Dに関して、望ましい実施の形態の動作について次に述べることにする。
ステップ5020において、あるコード・バッファが削除されることが決定される。コード・バッファは、コンパイル・コードを格納するメモリにおける1つの領域である。ステップ5022において、そのスタックが調べられるスレッドが選択される。ステップ5024において、このスレッドが停止される。あるいは、ステップ5026において、リターン・バリアがスタックへ挿入され、リターン・バリアにスタックが留まる長さだけスレッドの動作が継続することを許される。
ステップ5028において、スタックにおけるフレームが選択される。調べられる最初のフレームは、典型的に、このスタックにおける最も新しいフレームとなる。ステップ5030において、選択されたフレームが削除されるバッファにおけるリターン・アドレスを含むかどうか知るために、このフレームが調べられる。
フレームが削除されるバッファへのリターン・アドレスを含まなければ、あるいはフレームにおける値がいったん調整されると、ステップ5038において、スタックにおける全てのフレームが調べられたかどうか決定される。もし調べなかったならば、ステップ5040において、スタックにおける次に新しいフレームが選択され、このフレームが調べられる。スタックにおける全てのフレームが調べられると、ステップ5042において、スレッドが再開され、あるいはリターン・バリアが除去される。ステップ5044において、全てのスレッドのスタックが調べられたかどうか決定される。もし調べられなかったならば、スタックが調べられなかった別のスレッドが選択され、このプロセスが反復される。
スレッドの全てにおける全てのスタックのフレームの全てが調べられ、このスタックに対する適切な変更がなされると、ステップ5046において、コード・バッファが削除される。
図6Eは、非ネイティブ・コード5052をホスト・コンピュータ5054で走らせる仮想マシン5050を含むコンピュータ・システムを示している。この仮想マシンは、制御手段5056と、非ネイティブなアプリケーション・コードを解釈するインタプリタ5058と、非ネイティブなアプリケーション・コードの各部をコンパイルするコンパイラ5060と、「スタック・ウォーカ」5062とを含んでいる。ホスト・コンピュータは、プロセッサ5064とメモリ5068とを含む。図6Eには、各スレッド間にその時間を適切に分けることにより、幾つかのスレッドを同時に実行する1つのプロセッサが示されるが、それぞれが1つ以上のスレッドを実行する2つ以上のプロセッサを設けることもできる。
コンパイラ5060によりコンパイルされたコンパイル・コード5070は、メモリ5068に格納される。またメモリ5068には、プロセッサにより実行されているスレッド数と対応する複数のスタック5072、5073、5074が配置される。
動作において、制御手段5056は、ある時点において、例えばメモリの領域を他の目的に用いることを許容するため、コンパイル・コード5070のセクションが削除されるべきことを決定する。次に、制御手段はスタック・ウォーカ5062に対しコードの当該セクションが削除されるべきことを表示する。このスタック・ウォーカは各スレッドの動作を逐次休止させ、スレッドのスタックにおけるフレームを調べて削除されるコードのセクションを含む記憶域にあるリターン・アドレスを含むフレームを識別する。このようなアドレスは、グルー・コード5076の部分のアドレスへ変更され、フレームにおける他のフィールドが、行われたかも知れない、ローカル変数値あるいは仮想マシンに固有の変数の最適化を「クリーンアップ」するように調整される。グルー・コードは、図6Dに関して先に述べた方法で動作する。スレッドの全てにおける全てのスタックのフレームの全てが調べられ、スタック内容への適切な変更がなされると、スタック・ウォーカ5062が制御手段5056に対しコードの当該部分が削除されたことを表示する。次に、制御手段5056は、コンパイル・コード5070のセクションを削除するように削除手段5078を制御する。
要約すると、コードの削除時に、仮想マシンにおける各スレッドが逐次休止させられ、これらスレッドのスタックが、削除されるコードを指示するリターン・アドレス値を探して走査される。これらのケースの1つが見出されると、リターン・アドレス値付近のスタックの状態が、リターンに遭遇する時点(すなわち、スレッドに対する将来のある時点)に当該スレッドに対する仮想マシンの状態を「クリーンアップ」するように調整され、リターン・アドレス値自体は、実行のフローをコードの少数の中央部分の1つへ変えさせるように調整される。コードのこれらの中央部分(「グルー・コード」と呼ばれる)は、ある一般的な検査を行い、当該スレッドに対する適切な方法での実行のフローの継続を生じ、これは通常、コンパイル・バージョンが存在するエミュレートされた命令のセクションに遭遇するまで、以降のエミュレートされる命令の解釈を含む。
上記のいずれかあるいは全てにおいて、本発明の幾つかの特徴がコンピュータ・ソフトウエアを用いて実現された。しかし、無論、当業者には、これら特徴のいずれもハードウエア,またはハードウエアとソフトウエアの組合わせを用いて実現されることが明らかであろう。更に、ハードウエア、コンピュータ・ソフトウエアなどにより行われるファンクションが電気信号などを用いて行われることが容易に理解されよう。
上記のいずれかあるいは全てにおいて、本発明は、下記の形態のいずれか、あるいは一部、あるいはその全てにおいて具現される。すなわち、本発明は、コンピュータ・システムを動作させる方法において具現され、コンピュータ・システム自体において具現され、コンピュータ・システムを動作させる方法を実行するようにプログラムされあるいは構成されるとき、該システムにおいて具現され、そして(または)システムを動作させる方法に従って動作するためのプログラムが記録されたコンピュータ読取可能な記憶媒体において具現されよう。
本文全体に使用されるように、用語「コンピュータ・システム」は、「コンピュータ」、「システム」、「装備」、「装置」、「マシン」などと互換であり得る。コンピュータ・システムは、仮想マシンであり得、あるいは仮想マシンを含み得る。
上記のいずれかあるいは全てにおいて、方法および装置の特徴および特質を含む先に述べた異なる特徴および特質は、適切な方法で組合わせることができる。
本発明が純粋に事例として記述され、細部の修正が本発明の範囲内で可能であることが理解されよう。
本文の記述、および(適切な場合に)請求の範囲および図面に開示された各特徴は、独立的に、あるいは任意の適切な組合わせにおいて提供されよう。
本発明は、コンピュータ・システムにおいてガーベッジ・コレクタ特に、並行なガーベッジ・コレクタ)を動作させる方法に関し、不要部の整理のためのコンピュータおよびコンピュータ・システムに関し、コンピュータ読取可能な記憶媒体に関し、および仮想マシンに関するものである。望ましい実施の形態にいて、本発明は、グレー・パケットに関し、すなわち、非常に多くのスレッド環境において並行なマーキングGCのための低競合グレー・オブジクトに関する。
ここでは、「メモリ・オブジェクト」を参照する。これらオブジェクトは、典型的に、フィールドに組織されたメモリの任意の離散領域であり、その一部は他のオブジェクト、更には同じオブジェクトに対する参照であり得る(オブジェクト指向プログラムにおけるオブジェクトと混同してはならない)。
コンピュータ・システムにおけるメモリの効率的な使用のためには、その時の使用がいったん終了すると、再び使用されるようにメモリを再び割当てるため解放させるある機構が所定位置にあることが重要である。
このような「メモリ管理」は、典型的には、ファンクションを実行するためメモリを必要とすることを示すコード、およびこのメモリの使用が終了したときを示すコードをプログラム自体が含む、「手動」であり、あるいはプログラムがコンピュータ・システムにメモリの使用が終了したときを知らせず、その代わりシステム自体が使用されたメモリを識別して復元する方法を実現しなければならない「自動」である。後者は、便宜上「不要部分の整理」と呼ばれ、プログラムによりその時使用されているメモリ・オブジェクト全体にわたりサーチするプロセスを開始するコンピュータ・システムに依存する。サーチの間遭遇するこのようなオブジェクトがその時使用中であると見なされ、遭遇しない他のオブジェクトはその時使用中ではあり得ず、デッド状態と見なされ、従って再割当てに利用可能である。
「コピーイング」として知られる第2の手法においては、メモリが、図7Aにおいて「FROMスペース」12102と「TOスペース」12104として示される2つの部分へ分けられる。オブジェクトに対するメモリは、FROMスペースが一杯になるまでこのスペース内の直線的に増加するアドレスに割当てられる。この時点で、全てのライブ・オブジェクト12106を「TOスペース」における更にコンパクトな領域12108へコピーするGCのための全ての作業が停止するよう強制される。同時に、「TOスペース」における新たな場所を勘案するように参照も変更される。FROMスペースとTOスペースの役割は逆であり、新たなメモリ割当ては、こんどは前のFROMスペースが用いられたと同じ方法でTOスペースを用いて継続する。このような手法の主な短所はメモリ要求が多くなること、およびGCルーチンが実現されるごとにダウンタイムが生じてFROMスペースとTOスペース間の役割の切換えが生じることである。
いわゆる「マーク/掃引」手法である第3の手法は、オブジェクトを含む1つの論理ユニットに配置される全てのメモリを呼出す。GCは、割当て要求を満たすのに充分に大きなメモリ領域がヒープにないときに呼出され、この時GCが全てのオブジェクトを「白」に色つけし、参照によりライブ・オブジェクトに対する全てのあり得るパスをトレースすることになる。GCが達したどのオブジェクトも「黒」に色つけされてライブであると見なされるが、達しない領域は「白」のままであり、デッド状態であり再割当てに利用可能であると見なされ得る。この手法の最終段階は、白でマークされた全ての領域が解放されて作業が継続することを許される「掃引」動作を呼出す。
参照自体もまた、データ構造における最初の参照を見つけることにより調べられる。この参照は、グレー・スタックから除かれ、これが参照するオブジェクトは「黒」にされる。次に、トレーシング・プロセスによりまだ遭遇しない他のオブジェクトにおける参照12206は、グレー・スタックへ入れられ、これらのオブジェクトは「グレー」にされる。図7Bにおいて便宜上12208で拡大して示される各オブジェクトは、参照の黒/白状態の表示12210、およびスタックにおける他のオブジェクトに対する12212のようなポインタを含む。このプロセスは、グレーのスタックが空になるまで反復される。このトレーシング・プロセスの後に、黒いものが白にされ白いものが将来の使用に供される掃引相が存在する。不要部分の整理の終りに、グレー・スタックが存在しなくなることが理解されよう。
マーク/掃引(トレーシング)手法の主な欠点は、作業が停止する間ダウンタイムが無いことであり、先の2つの手法のいずれよりも更に複雑になることである。コピーするGCに対するその主な利点は、空間的な冗長度がほとんどないかあるいは全くないことである。
事実、グレーのオブジェクトの組は、制御について幾つかのスレッド間で共有されるリソースであり、その全てはこれを変更し得る。従って、任意の変更はある種のロッキング機構により取締られねばならない。グレー・セットは、トレーシング・プロセスの間頻繁に使用され、従ってグレー・セットに対してアクセスしようとする試みがすでに使用中であることを見出す可能性が高い。更に、前記ロッキング機構により課されるオーバーヘッドが増加する傾向を有する。換言すれば、並行なGCにおいては、システムの他の部分がオブジェクトを変更しようと試み得るが、GCは依然としてライブな記憶場所とデッドである記憶場所を見出す方法をトレースし続ける。ライブなオブジェクトがデッドであると不正に識別され、これにより再割当てが行われないようにするために特殊な処置をとることが必要となる。これにより、データの消滅および(または)逸失が結果として生じ得る。このような問題に対する典型的な解決策は、オブジェクトの内容を変更するおそれがある全ての操作に対して「書込みバリア」を用いることであった。
GCに対する更なる問題は、たとえ非常に生じやすい場合でも、グレー・スタック全体に対するスペースがGCサイクルの初めに割当てられねばならないこと、および通常は最悪の偶発性に対処するに充分に大きくなければならないことである。従って、グレー・スタックのため留保されたスペースの大部分が浪費される。
本発明は、1つの特質において、コンピュータ・システムにおいてガーベッジ・コレクタを働かせる方法を提供し、ガーベッジ・コレクタが(典型的には、所与の時点において)1組の部分的にトレースされたメモリ・オブジェクト(典型的には、「グレー」オブジェクト)を持ち、前記方法は複数の離散パケットにおいて前記オブジェクトの組を処理する(あるいは、この組を前記複数の離散パケットへ分ける)ことを含む。
複数の離散パケットにおける前記組を処理することにより、この組は必要とするスペースを占めるに過ぎない。このことは、実質的大きな固定サイズである公知のグレー・スタックと対照され得る。
ガーベッジ・コレクタは、例えば、増分型あるいは休止するガーベッジ・コレクタでよい。しかし、動作の速度については、ガーベッジ・コレクタは並行なガーベッジ・コレクタであることが望ましい。(典型的に、並行なガーベッジ・コレクタは、少なくとも1つの他の制御のスレッドの実行と同時に動作する、すなわち、不要部分の整理と同時に生じる変化を阻止しない。非並行型ガーベッジ・コレクタにおいては、コレクタのスレッドが実行している唯一のスレッドであり、従ってロッキングが必要とされない。)この場合、各パケットがたかだか任意の所与の時点に1つの制御のスレッドによりアクセス可能であることが望ましい。このことは、1つのスレッドが1つのパケットで終了しかつ別のパケットが働くことを必要とする機会に必要とされるロッキングの量を制限し得る。このことは更に、非常に頻繁に使用されるシステムにおけるGCの性能を改善することができ、そして(または)メモリを使用されないように解放することによりコンピュータ・システムのメモリ要求を減じることができる。
異なるパケットは、異なる制御のスレッドにより同時にアクセスすることができることが望ましい。このことは、システムにおける同時実行の程度を強化することができる。
同時実行を強化するためには、異なるスレッドにより使用できるようにパケットが個々に処理されることが望ましい。
パケットの最小数は2であり、後で述べるように、1つはグレー・オブジェクトに関して充填するためのものであり、他は「黒くする」間に空にするためのものである。パケットは、(特に多数のスレッドが実行中であるとき)パケットへの分割の利点を許しかつ多すぎるメモリを使用する欠点を避けるのに充分な長さであることが望ましいが、管理ができず過剰数のロックを生じるほど長くないことが望ましい。従って、各パケットが1つのオブジェクトへの参照ごとに1つずつ多数のスロットを含むことが望ましく、この数は少なくとも2、5、10、50あるいは100の1つである。同様に、各パケットが1つのオブジェクトへの参照ごとに1つずつ多数のスロットを含むことが望ましく、この数は5000、1000、500あるいは100より少ない1つである。これらのおおよそのサイズが広範囲の用途にわたり最適であることが判った。
パケットのサイズのそれほど重要でない処置は、バイト数に関するその長さである。これは2の冪であることが望ましい。各パケットは、少なくとも8、16、32、64、128および256バイトの長さの1つであることが望ましい。各パケットは、1024、512、256、128および64バイト長より短いことが望ましい。
前記各パケットは、固定されたサイズであることが望ましい。各パケットは、固定数のスロットと、当該パケット内でその時使用されるスロット数の表示(典型的には、ヘッダ)とを含むことが望ましい。
メモリ要求を節減するために、パケットは、パケットがデマンドに従って生成され破壊されることが望ましい。換言すれば、パケットが必要に応じて生成、破壊できるようにダイナミックに管理される。後で述べるように、存在するパケット数は、マーキング・プロセスと黒くするプロセス間の間隔のファンクションである。
パケットの破壊は、全パケットの一部の内容を一緒にマージすることによって少なくとも部分的に達成できる。
ガーベッジ・コレクタは、並行なガーベッジ・コレクタであることが望ましい。
各パケットが、所与の時点にたかだか1つの制御のスレッドによりアクセス可能であることが望ましい。
当該コンピュータ・システムは更に、同時に異なる制御のスレッドにより異なるパケットをアクセス可能にする(あるいは、可能にするための)手段を含むことが望ましい。
コンピュータ・システムは更に、パケットを異なるスレッドにより使用できるように個々に処理する(あるいは、処理するための)手段を含むことが望ましい。
コンピュータ・システムは更に、その時「チェックアウト」された特定の制御のスレッドにより使用中である各パケット、およびその時「チェックイン」された特定の制御のスレッドを持たない各パケットをマーキングする(あるいは、マーキングするための)手段と、前記の特定の制御のスレッドによりチェックアウトされたパケットのみについて動作を許容する手段とを含むことが望ましい。
各パケットは、1つのオブジェクトに対する参照ごとに1つずつ多数のスロットを含むことが望ましく、この数は少なくとも2、5、10、50あるいは100の数である。また、各パケットが、1つのオブジェクトへの参照ごとに1つずつ多数のスロットを含むことが望ましく、この数は5000、1000、500あるいは100より少ない数である。前記各パケットは、固定サイズである。各パケットは、固定数のスロットと、該パケット内でその時使用されるスロット数の表示とを含む。
コンピュータ・システムは更に、デマンドに従ってパケットを生成し破壊する(あるいは、生成し破壊するための)手段を含むことが望ましい。
コンピュータ・システムは更に、全パケットの一部の内容を一緒にマージすることにより、パケットを少なくとも部分的に破壊する(あるいは、破壊するための)手段を含むことが望ましい。
本発明は、緊密に関連する特質において、使用されることのないメモリを解放するように、コンピュータ・システムにおける並行なガーベッジ・コレクタ・システムを多重スロット環境において動作させる方法を提供し、該方法は、
1つのメモリ・グループにおける各オブジェクトの状態をトレースし、
トレーシング・プロセス(白)中にオブジェクトが遭遇されなかったか、オブジェクトとこれが参照する全てのオブジェクトがトレーシング・プロセス(黒)により遭遇されたか、およびオブジェクト自体が遭遇されたがこれが参照するオブジェクトの一部が達しなかった(グレー)かに従って識別子を割当て、
グレーの識別子で割当てされた組を離散パケットへ分け、
前記各スレッドがその各々のパケットにおいて他の前記スレッドおよびパケットと独立的に動作できるように、前記各パケットを各スレッドに割当てる
ことを含んでいる。
(望ましくはランタイム・エンジンである)並行なガーベッジ・コレクタと、
1つのメモリ・グループにおける各オブジェクトの状態をトレーシングする手段と、
オブジェクトがトレーシング手段により遭遇されなかったか、オブジェクトとこれが参照する全てのオブジェクトがトレーシング手段(黒)により遭遇されたか、およびオブジェクト自体が遭遇されたがこれが参照するオブジェクトの一部が達しなかった(グレー)かに従って識別子を割当てる手段と、
グレーの識別子で割当てられた組を離散パケットに分ける手段と、
前記各スレッドがその各々のパケットにおいて前記スレッドおよびパケットとは独立的に動作するように、前記各パケットを各スレッドに割当てる手段と、
を含んでいる。
本発明は、並行な不要部分の整理システムを動作させる手段と、各パケットが任意の時点で多くとも1つのスレッドによりアクセスできるようにグレー待ち行列をパケットに分ける手段とを含むコンピュータ・システムに拡張する。
本発明は、緊密に関連する特質において、コンピュータ・システム環境における並行な不要部分の整理システムを動作させる方法を提供し、これにおいてはグレー待ち行列は各々が任意の時点で多くとも1つのスレッドによりアクセスできるパケットに分けられる。
当該コンピュータ・システムは、マルチスレッド環境において動作するようになっていることが望ましい。
コンピュータ・システムは更に、パケットに対するマネージャを含むことが望ましい。
本発明は、上記方法によりプログラムされたときのコンピュータに拡張する。
本発明は、1組のメモリ・オブジェクトを複数の離散パケットにおいて処理するように、プログラムされたとき、1組の部分的にトレースされたメモリ・オブジェクトを持つガーベッジ・コレクタを含むコンピュータ・システムに拡張する。
本発明はまた、上記方法を提供するプログラムが記録されたコンピュータ読取可能な記憶媒体に拡張する。
本発明は、緊密に関連する特質において、コンピュータ・システムにおいて1組の部分的にトレースされたメモリ・オブジェクトを持つガーベッジ・コレクタを動作させる方法であって複数の離散パケットにおいて前記1組のメモリ・オブジェクトを処理することを含む方法を提供するプログラムが記録されたコンピュータ読取可能な記憶媒体を提供する。
本発明は、上記コンピュータまたはコンピュータ・システムを含む仮想マシンに拡張する。
本発明は、緊密に関連する特質において、上記コンピュータ読取可能な記憶媒体により動作されるとき仮想マシンを提供する。
本発明の望ましい実施の形態については、純粋に事例として、添付図面に関して次に記述する。
最初に、本発明を実施することができる特定の方法の更に包括的な記述の続いて、本発明の性質の概要を述べる。
不要部分の整理(GC)は、ランタイム環境が任意の時点で使用されたが現在は使用されていないメモリを識別することができ、かつ他の目的のため再使用に供することができるプロセスである。並行なGCは、プログラムまたはシステムにおける他のアクティビティを現在進行中のGCアクティビティにより妨げる必要がないようなGCを実現する方法である。
トレーシングGCの(コンカレントあるいはその他の)作業は、所与のあるルートの組12404から始まる12402として全体的に示されるメモリ・オブジェクト間の図7Dにおいて矢印12400として示される参照に従うことにより働き、「ライブ」として取扱われねばならない全てのオブジェクトの組を確定する。前記の組にないオブジェクトは、「デッド」であると見なされ、そのメモリ・スペースは再使用することができる。ルートの組は、不要部分の整理のためのある開始条件であり、典型的に、関心スタックに対する参照を含む1組のパブリック参照である。
任意の時点におけるトレーシング・プロセスの状態は、トリコロール・アブストラクションを用いて要約することができる。各オブジェクトは、これと関連するカラーを有する。すなわち、
白:このオブジェクトは、トレーシング・プロセスの間まだ遭遇されない。
黒:このオブジェクトおよびこれが参照する全てのオブジェクトはトレーシング・プロセスにより遭遇されたものである。
グレー:このオブジェクト自体は遭遇されたが、これが参照するオブジェクトの一部は到達していない(換言すれば、グレーの色づけは進行中の作業を示す)。
コピーイングGCと違い、マーキングGCはこのアブストラクションをやや逐語的に構成する傾向があり、オブジェクトのカラーはメモリにおけるその絶対的位置により黙視的に決定される。本発明は、種としてマーキングGCアルゴリズムおよび手法に関する。
マーキングGCにおいては、オブジェクトのカラーはオブジェクト自体にオブジェクトのヘッダ(図7Eの12502)の一部として格納される。このカラーは、4つの状態、白、黒、グレーおよび自由(すなわち、オブジェクトが割当てに供し得る)の1つにあるマーク情報M、12504としてコード化される。
Mは、典型的に、4つの個別の状態を一緒にコード化させる1対のビットとなる。オブジェクトの再色づけは、オブジェクトのヘッダにおけるMの状態情報を適切な方法で変えるものである。望ましい実施の形態においては、オブジェクトの色づけはオブジェクトの寿命の間記憶される。GCの動作外では、全てのオブジェクトは白に色づけされる。
効率の考察は、グレーのオブジェクトの組は(グレーに再色づけすることにより)追加でき、あるいは(黒に再色づけすることにより)除去することができる個別のエンティティとして処理できることを示す。この組は、これまでは、スタックとして実現されてきた。通常は、グレーのスタックは、どこにアレイにおける読出しおよび書込みが生じるかを示すように変更可能である付加的な指標を持つ別のスタックまたはアレイとされる傾向がある。図7Fは、空のスタック12602を示している。
一般に、各アクセスごとに全体としてロックされねばならない1つのモノリシックなグレー・オブジェクトの組を持つ代わりに、本発明は、望ましくは各スレッド(および、このスレッドのみ)が切離した状態で働き得るセグメントを与えられるように、前記の組を離散的なセグメント、すなわちパケットへ分ける(図7Dにおける事例12406参照)。これは、スレッドが1つのパケットで終り且つ働く別のパケットを必要とする場合に要求されるロッキング量を最小化することができる。従って、パケットは、グレーのスタックを完全に置換える(これは、図7Dのスタックからヒープへの矢印がなぜ点線で示されるかの理由である)。
従って、本発明は、いわゆる「グレーのパケット」に関係し、特に、高度のマルチスレッド環境において並行な不要部の整理をマーキングするための競合度の低いグレー・オブジェクトの組の提供に関する。
あるGCは、メモリにおけるオブジェクトを移動する。ここで使用されるシステムは、並行なGCではそうすることが困難であるゆえにこれを行わない。その代わり、「マークおよび掃引」動作が行われる。この場合、白である全てがトレーシングすなわち「マーク」プロセスの終りに解放される。トレーシング・プロセス以降に、掃引相が生じる。この掃引相では、黒いものが白くされ、白いものが将来の使用のため利用できるようにされる。
グレー・パケット・マネージャ(GPM)は、グレーのパケットを管理するために本文に述べた手法によって提供される。GPMは、プログラムの開始時に現われるが、典型的には、ガーベッジ・コレクタもまた動作するまでは動作しない(ハウスキーピングの目的を除いて)。
特にGCスレッドに限定しないが任意のスレッドは、ときにグレーになることがある。例えば仮想マシン(VM)においては、GPMがその時グレー・パケットと呼ばれるものに対するそれ自体のメモリについてスレッドにより問合わされる。グレー・オブジェクトの組を別のパケットへ分ける理由の1つは、スレッドがそれ自体のグレー・パケットを自由にできるようにするためである。スレッドが一杯であるかそれに非常に近いグレー・パケットへの書込みを続けることを欲するならば、GPMはこのスレッドへ新たなパケットを与え、一杯のパケットを捨ててこれを記憶する。GPMは、空のパケットの待ち行列を用意完了状態に保持することができる。どんな数のスレッドでも、それ自体の別のパケットを自由にするようにでき、その結果このグレー・スタックを多数の排他的なアクセス領域へ分けることができ、かつグローバルなロックは要求されない。
グレー・パケットは同じ小さなアレイであり、要求次第で作成され且つ破壊される。これらパケットは、完全なパケットとして取扱われる。グレー・パケットは、典型的に、サイズが256バイトであり、60参照まで保持することができる。これは、60回に1回のアクセスしかグレー・パケットがGPMと通信することを必要としないことになる。カレントなGCがないときは、アクティブなグレー・パケットは存在しない。
図7Dに略図的に示されたように、1組のグレー・パケット12406は、プログラムまたはシステム内のブロックとして存在する。各ブロックは、固定数のスロット12408を含み(それぞれが1つのオブジェクト参照を記述することができ)、かつこのブロック内でどれだけ多くのスロットがその時使用中であるかの表示を含む。望ましい実施の形態においては、チェック・インされたパケットが、チェーンを形成するようにリンクされることが望ましい組に分けられる。個々のパケット12406の構造は図7Gに示される。各グレー・パケットは、チェック・アウトされ、その場合1つの特定の制御のスレッドによりその時使用されており、あるいはチェック・インされ、この場合は特定の制御のスレッドはこれを使用していない。
グレー・パケットは、プログラムまたはシステム内の個々のモジュール、すなわち、グレー・パケット・マネージャすなわちGPMにより管理される。GPMは、下記のリソースを内部に保持する。すなわち、
一杯:一杯のパケットのリスト
一部一杯:一部一杯のパケットのリスト
上記リストはそれぞれ、これに対するアクセスを制御する個々のロックを有する。パケットは、これが上記リストのいずれかにあるならば、チェック・インされる。
外部では、GPMが下記の基本的サービスを提供する。すなわち、
・getEmptyPacket():空のパケット(あるいは、一部一杯であるが、完全に一杯ではないパケット)を取得し、これを呼出しスレッドへ戻す。
・getFullPacket():一杯のパケット(あるいは、一部一杯であるが、空でないパケット)をチェック・インされたパケットから取得し、その状態をチェック・アウトへ変更し、かつこれを呼出しスレッドへ戻す。空のパケットしか存在しなければ、NULLを返す。
・submitPacket(p):グレー・パケットpがその時チェック・アウトされることを検証し、次にその状態をチェック・インへ変更する。
GPMは、上記動作の各々をロック状態下で行う。
GPMは、これが選択したどんな順序でも取扱うことができ、「後入れ、先出し」のシステムはない。
オブジェクトiをグレーとしてマークすると、
黒くする主アルゴリズムは、下記となる。すなわち、
以上のことから判るように、この手法の主な目的は、グローバル・データ構造に対するロックされたアクセスを最小限にするお蔭で、スレッドが非常に多い環境における並行なGCの性能を改善することである。従って、この手法によるコンカレントGCを用いる商品は、更に伝統的な手法を用いる商品より良好に動作することになろう。
グレー・パケット・マネージャの主要ファンクションの一部の要約は、下記の表に示される。この表では、各ファンクションはアンダーラインを付けて示され、このファンクションのステップはファンクション自体に従う。各ステップは、これが一杯の、ほぼ一杯の、あるいは空のパケットを用いて行われかどうかに従って、3つの欄(「一杯のパケット」、「部分的に一杯のパケット」あるいは「空のパケット」)の1つまたは2つに示される。
一杯のパケット 部分的に一杯のパケット 空のパケット
マーキング相−マークするオブジェクトがこれ以上なくなるまで下記の反復段階で進行する
(a) 空のパケットを取得(新しい空のパケットを取得しそしてグレーとしてマークする)
(b)一杯のパケットを依頼する(一杯のグレーのパケットを依頼する)
(c)空のパケットを取得(別の新しいパケットを取得)
黒くする相−これは、ステップ(b)が失敗するまで反復的に進行する
(a) 空のパケットを取得(黒にする目的のために)
(b)「空の」パケットを依頼(GPMの中へ)
スレッドのデッド
スレッドのデッドと同時に、tl−pihをGPMへ依頼する
全般的な準備
GCは他のスレッドのtl−pihをGPMへ周期的に依頼する
最後に図7Hに関して、望ましい実施の形態の全ファンクションについて、特に種々の主構成要素間のパケットのフローを参照して、次に要約する。
1)新たな空のパケットを取得
2)一杯のパケットを依頼
3)ほぼ一杯パケットを依頼
4)黒くする一杯のパケットを取得
5)空のパケットを依頼
並行および他のGC手法全般の概要は、R.JonesおよびR.Lins著「不要部分の整理:自動的なダイナミック・メモリ管理のためのアルゴリズム(Garbage Collection:Algorithms for Automatic Dynamic Memory Management)」(John Wiley発行、ISBN 0−471−94148−4)に見出すことができる。この文献の開示は、参考のため本文に援用される。
情報の格納に関する特徴は、適切な記憶場所またはストアにより実現されよう。情報の処理に関する特徴は、ソフトウエアあるいはハードウエアにおいて、あるいは両者の組合わせにおいて、適切なプロセッサまたは制御手段により実現されよう。
上記のいずれかあるいは全てにおいて、本発明は、下記の形態のいずれか、あるいは一部、あるいはその全てにおいて具現されよう。すなわち、コンピュータ・システムを動作させる方法において具現され、コンピュータ・システム自体において具現され、コンピュータ・システムを動作させる方法によりプログラムされ、あるいはこれを実行するよう構成されるときこのシステムにおいて具現され、そして(または)コンピュータ・システムを動作させる方法に従って動作するためのプログラムが記録されたコンピュータ読取り可能な記憶媒体において具現されよう。
本文において用いられるように、用語「コンピュータ・システム」は、「コンピュータ」、「システム」、「装備」、「装置」、「マシン」などに対して互換である。コンピュータ・システムは、仮想マシンであり得、あるいはこれを含み得る。
上記のいずれかあるいは全てにおいて、方法および装置の特徴および特質を含む上記の異なる特徴および特質は、任意の適切な方法で組合わせることができる。
本発明は純粋に事例として記述され、細部の修正が本発明の範囲内で可能であることが理解されよう。
本文の記述、および(適当な場合に)請求の範囲および図面に開示された各特徴は、独立的に、あるいは適切な組合わせにおいて提供されよう。
本発明は、コンピュータ・システムおよびコンピュータ・システムを動作させる方法に関する。本発明は、コンピュータ・システムおよび割込みの処理のための方法に関することが望ましい。本発明は、仮想マシンおよび(または)多重スレッド環境に関する特定の(しかし、これに限定しない)用途を見出すものである。本発明の望ましい実施の形態は、ジャバで書かれたデバイス・ドライバ割込みハンドラを実行することに関する。
デバイス・ドライバ・ソフトウエアの実現においては、通常は装置の割込みがドライバ自体の内部のコードにより処理されることが要求される。
このような割込みを処理するためドライバの一部として書かれたコードは、通常はこれに課される著しい制約を有し、これは、このようなコードが、オペレーティング・システムにより提供される小さな固定サイズの別個のスタックを用いてほとんど任意の時点で主幹アプリケーションに関して実行されるゆえである。このため、オペレーティング・システムは割込みを直接処理する。
割込みの処理の確認されている問題に照らして、非ネイティブなソフトウエアを含むコンピュータ・システムの場合に、割込みハンドラが(ホストの)オペレーティング・システムにより提供される。割込みができるだけ速く処理されることが重要であり、従って、オペレーティング・システムは割込みを取扱うように選定される。このような手法には、共に非ネイティブ・システムが実際の割込みレベルから著しく隔てられるという事実から生じる2つの主な問題がある。第一に、非ネイティブなシステムが割込みを直接処理せず、非ネイティブ・システムが割込みについて知らされる前に、実際の割込みがホスト・システムによりすでに切離されているから、特殊な装置の処理(装置のレジスタから/への特殊な値の読出し/書込み)がもはや有効でないという問題が存在する。第二に、生じる実際の割込みと、これと関連して実際に実行する非ネイティブなコードとの間に実質的な長さの時間が経過してしまっている。
本発明の第1の特質によれば、コンピュータ・システムを動作させる方法も提供され、コンピュータ・システムがネイティブなオペレーティング・システムと非ネイティブなソフトウエアを含み、割込みが非ネイティブなソフトウエアにより直接処理される。
望ましい実施の形態においては、本発明は、(本発明の多くの部分はたしかに他の翻訳言語にも同様に適用するが)非ネイティブ・ソフトウエアにおける、特にジャバにおけるその割込みハンドラを含むデバイス・ドライバの完全な実現に関する。
非ネイティブな言語、特にジャバの使用時には、割込みレベルにおいて色々な問題に遭遇する。例えば、ジャバ(および他の言語)は不要情報が収集された言語であるという事実が、割込みハンドラ・コードが、干渉することなくあるいはそれ自体をそれゆえに損なうことなく、不要部分の整理プロセスにおける任意の時点で良好に走るために必要であるという問題の複雑さを加える。上記および他の問題については、以下において更に詳細に論述される。
この問題の処理のため出願人が知る唯一の従来の堤案が、一般的な方法で割込みを処理した後に非割込みレベルで走る高い優先順位のジャバ・スレッドに対して生じる記事を送る前に廃棄した非翻訳言語(アセンブラまたはC)で実現されたそれ自身の専用の割込みハンドラを有する(ジャバの)仮想マシン(VM)に関与するものであった。
このような手法には、共に装置割込みを処理するよう書かれたジャバ・コードが実際の割込みレベルから著しく異なるという事実から生じる2つの主な問題があり、すなわち、第一に、問題となる装置のタイプに従って、処理する(装置レジスタから/へ特殊な値を読出す/書込む)特殊な装置はもはや必ずしも有効でないという問題である。実際の割込みはすでに見切られ、第二に、実際の割込みの発生とジャバ・コードの実際の実行との間には実質的な長さの時間が経過していることである。
例えば、コードの一部が待ち行列、挿入する動作および取出す動作を維持するため1つのコードにおいて動作しようとする同時の試みを阻止するためミューテックス(mutex)のようなセマフォーを必要とするときは、信号が取得されるまで動作が行われない。セマフォーは、割込みレベルでは取得できない。セマフォーが非割込みレベルですでに取得されていたならば、信頼し得る動作は割込みレベルでは不可能である。
ジャバ(および、他の翻訳言語)の場合にも、コード管理に問題がある。
従来技術における問題は、割込みをリアルタイムに処理できないことである。例えば、先に示した堤案においては、システムは正規のスレッドにおける割込みをできるだけ早く処理する要求を出すだけである。
しかし、このような解決法では非ネイティブな(ジャバ)コードが実際の割込みレベルで決して走らないという事実は、不要部分の整理における問題、すなわち先に示したことにおける問題を実質的に軽減する。
非ネイティブなコードを実際の割込みレベルで実際に走らせる問題に対する解決法は,下記の小さな問題のいずれか、あるいは一部、あるいはその全てにおいて、下記のように解決される小さな問題へ分解し、この解決法のいずれも任意の適切な方法で組合わせることができよう。
本発明の第2の特質によれば、を含む割込み処理方法を含むコンピュータ・システムが提供され、該方法においては、割込み処理方法の実行が最初の割込みに先立って開始されるようになされ、実行は待機中の状態へ進み、割込みが生じるときに再開させられる。この割込み処理法は、コンピュータ・システムの初期設定時に開始されるように構成されることが望ましい。
本発明の実施の一形態においては、非ネイティブなソフトウエアによって特殊な割込みハンドラ方法が提供される。割込みが生じると、当該方法が呼出される。この方法の呼出しと同時に、種々のステップ、例えば必要なスタックおよびフレームのセットアップが行われる必要がある。割込みが処理されると、当該方法が閉じられる。異なる方法を異なる割込み、すなわち異なるIRQに対して書込むこともでき、従って、各方法が適切な方法で特定の割込みを処理する。
本発明の第2の特質によれば、割込み方法はシステムのセットアップの一部として開かれることが望ましく、この方法は用意ができて、割込みが生じるときを待機する。このように割込みハンドラの実行は、従って割込みの処理を速くすることができる。このことは、非ネイティブな言語が翻訳言語である場合に特に重要である。解釈は、ネイティブな命令の実行と比較するとより遅い。割込みをできるだけ速く処理することが重要であるので、割込みがオペレーティング・システムにより処理されることが望ましいと考えられてきた。しかし、本発明の第2の特質によれば、非ネイティブなコードによる割込みの処理を、割込みが生じたときにいつでも使用できるスタックを提供することによって速くすることが可能である。このように、割込みを処理するための翻訳言語の使用に固有の実行速度の損失の少なくとも一部を避けることができる。
ある場合、例えばジャバが非ネイティブ言語として用いられる場合、スレッドを完全に破壊することが可能である。多くの場合、スレッドにより使用されるメモリを解放することができるので、このことが選好される。他の場合は、スレッドの破壊は可能ではない。スレッドは、割込みが生じるまで休止状態にある。
当該方法は、割込みが生じるときスタックを用いて制御の割込みフローを行うことによってスレッドが明らかに再活動化させられるように構成されることが望ましい。このような再活動化は、スタックを用いて制御の割込みフローを行う結果であることが望ましい。
制御の割込みフローは、割込み処理方法スレッドが再活動状態になったように見えるように、割込み処理方法のスタックへ切換わる。
当該割込み処理方法は、複数の異なる待機状態を含むことが望ましい。このため、本発明の第2の特質に従って、所与の装置に対する異なるタイプの割込みが1つの割込みハンドラ方法を用いて処理されることが可能である。
本発明の第2の特質はまた、割込みが生じるとき非ネイティブな割込みスレッドのスタックが切換えられるコンピュータ・システムをも提供する。この割込みスレッドのスタックは、ジャバ・スタックであることが望ましい。
非ネイティブな割込みスレッド・スタックがほぼ一杯であることが望ましい。
コンピュータ・システムは、仮想マシンとして構成され、あるいは仮想マシンを構成することが望ましい。
本発明の第2の特質のコンピュータ・システムは、本発明の第1の特質の特徴をも含むことが望ましい。
本発明の第2の特質は、コンピュータ・システムにおける割込みを処理する方法をも提供し、当該方法においては、割込み処理方法が待機状態において動作の半ばで終了させられてスタックを残す。この割込みハンドラ方法のスレッドは、望ましくは割込みが生じるときスタックを用いて制御の割込みフローを行うことにより明らかに再活動化されることが望ましい。本発明の望ましい実施の形態においては、割込みハンドラ方法が非ネイティブな割込み方法であり、望ましくはジャバ割込み方法である。
本発明は、その最も一般的な特質の1つにおいて、非ネイティブな(望ましくは、ジャバの)スレッド・スタックが準備完了状態に保持されて割込みが検出されるとき切換えられるのを待機するコンピュータ・システムまたはコンピュータ・システムを動作させる方法を含む。
割込みハンドラに対して用いられる翻訳言語の場合は、割込みが生じたときに割込みハンドラ方法が呼出されるならば、当該方法に入るとき大きなオーバーヘッドが生じることになる。
本発明は、その望ましい形態において、ソフトウエアVMの関連において存在し、本発明の重要な特徴は、システムまたは方法が非ネイティブな(望ましくは、ジャバの)バイト・コードを割込みレベルで走らせることである。
要約すると、問題が実際の割込みレベルが非ネイティブなバイト・コード実行エンジンによる使用に適さない小さな個々のOSによるスタックで走ることであることが判った。本発明の実施の形態は、正常な非ネイティブなスレッドのスタックが準備完了状態であり、割込みが生じるとき切換えられるのを待機している。
本発明は、第2の特質において、仮想マシンとして構成されたコンピュータ・システムにおけるデバイス・ドライバを実現する方法を提供し、当該方法は割込み呼出しが受取られる瞬間に走る容易ができた特殊な割込みスタックを備えることを含んでいる。
本発明はまた、デバイス・ドライバの割込みを実現する手段が設けられたコンピュータ・システムに拡張し、割込み呼出しが受取られる瞬間に走る用意のある特殊な割込みスタックを含む。
前項に述べたような本発明の望ましい形態においては、システムは、翻訳言語(例えば、ジャバ・コード)を走らせる用意がある。1つの修正においては、この特殊な割込みスレッド・スタックは、割込みが生じるときに切換えられる通常の(ジャバ)スレッド・スタックである。
当該システムは、割込みハンドラ方法が実行される間は潜在的にブロックする同期動作が行われないようなものであることが望ましい。
割込み処理中に潜在的にブロックする同期動作が行われないことが重要である。
本発明の第3の特質によれば、非ネイティブな割込みハンドラを有する割込みハンドラを含むコンピュータ・システムが提供され、当該システムは最初の割込みに先立って最初の実行アクティビティを実施する手段を含んでいる。
多くの場合、最初の実行アクティビティは、避けられないセマフォー(例えば、クラスのローディングにおいて用いられるもの)を含んでいる。割込みが生じる前に(例えば、システムの初期設定時に)このようなアクティビティを実施することにより、このようなセマフォーの使用を回避することができる。
割込みハンドラのコードは予め解かれている。このため、ミューテックス、例えばクラスの分解を不可避的に呼出すステップは、割込みレベルの処理が生じる前に実施することができる。割込みハンドラのコードは予めコンパイルされることが望ましい。
コンピュータ・システムは、仮想マシンとして構成されあるいは仮想マシンを実現することが望ましい。
本発明の第3の特質のコンピュータ・システムは、第1の特質および(または)第2の特質の特徴をも含むことが望ましい。
割込みを処理する方法が、割込み処理方法を実行している間は、潜在的にブロックする同期動作を行わないことを含むことが望ましい。
本発明の第3の特質によれば、非ネイティブな割込みハンドラ方法を用いてコンピュータ・システムにおける割込みを処理する方法が提供され、当該方法は最初の割込みに先立って最初の実行アクティビティを実施することを含む。
当該方法は、割込みハンドラ方法のコードを予め解くステップを含むことが望ましく、また割込みハンドラ方法のコードを予めコンパイルするステップを含むことが望ましい。
本発明の第3の特質によれば、バイト・コード実行エンジンを介する通常のルートが潜在的にブロックする同期動作を持たないことが保証でき、このことはどんな性能の観点からも望ましい!更に、割込みハンドラのバイト・コードの性質が決してバイト・コード実行エンジンを介する通常ルート以外を要求しないことを保証することが望ましい。
本発明の第2の特質は、仮想マシンとして構成されあるいは仮想マシンを実現するコンピュータ・システムにおけるデバイス・ドライバ割込みを実現する方法をも提供し、当該方法は、前記割込みハンドラのバイト・コードを実行する間は、バイト・コード実行エンジンが潜在的にブロックする同期動作を試みることを阻止することを含む。
本発明の第2の特質は更に、デバイス・ドライバ割込みを実現する手段が設けられたコンピュータ・システムに拡張し、前記割込みハンドラのバイト・コードを実行する間は、バイト・コード実行エンジンが潜在的にブロックする同期動作を試みることを阻止する手段を含む。
本発明の第4の特質によれば、割込みハンドラとガーベッジ・コレクタとを含むコンピュータ・システムが提供され、該システムは割込みハンドラとガーベッジ・コレクタとの間の相互動作が阻止されるようなものである。
本発明の第4の特質は、特に不要部分の整理システムを備える非ネイティブなソフトウエアに適用する。
割込みレベルが例えばオブジェクトをガーベッジ・コレクタ(GC)がアクセスするヒープへ入れるならば、GCは、例えば、オブジェクトのGCを試みるかあるいは単にオブジェクトを調べるだけによりオブジェクトを変えることもできる。
割込みハンドラはオブジェクトを含み、この割込みハンドラのオブジェクトがガーベッジ・コレクタから切離されることが望ましい。割込みハンドラはヒープを含み、このヒープがガーベッジ・コレクタから切離されることが望ましい。このように、GCは、割込みハンドラに帰属するオブジェクトを変更あるいは収集することができない。
当該システムは更に、割込みハンドラによる以外に割込みハンドラのオブジェクトにおける参照フィールドの変更を阻止する手段を含むことが望ましい。このため、割込みハンドラは、非割込みレベルのスレッドによる干渉からも保護され得る。割込みレベルは、非割込みレベルのオブジェクトを直接変更しあるいはこれと接触することができないことが望ましい。このように、割込みレベルは非割込みレベルから完全に切離されることが望ましい。
コンピュータ・システムは、仮想マシンとして構成され、あるいは仮想マシンを実現することが望ましい。
本発明の第4の特質は、割込みハンドラとガーベッジ・コレクタとを含むコンピュータ・システムを動作させる方法をも提供し、該割込みハンドラとガーベッジ・コレクタとの間の相互動作が阻止される。
当該割込みハンドラ装置はオブジェクトを含むことが望ましく、割込みハンドラによる以外の割込みハンドラのオブジェクトにおける参照フィールドの変更が阻止される。
要約すると、バイト・コード実行エンジンは,非割込みレベルにおいて(おそらくは同時に)生じる不要部分の整理のいずれかの不要部分の整理相と干渉し得あるいはそのゆえに障害を生じ得るなにものも行ってはならない。このことは、割込みレベル・コードの不要部分が整理されたジャバ・ヒープの完全な柔軟性を否定することにより、望ましい実施の形態において達成することができる。
本発明は更に、仮想マシンとして構成されあるいは仮想マシンを実現するコンピュータ・システムにおけるデバイス・ドライバの割込みを実現する方法を提供し、当該方法は、バイト・コード実行エンジンが非割込みレベルにおける同時の不要部分の整理と干渉することを阻止することを含む。
本発明は更にまた、デバイス・ドライバの割込みを実現する手段が設けられたコンピュータ・システムに拡張し、バイト・コード実行エンジンが非割込みレベルにおける同時の不要部分の整理と干渉することを阻止する手段を含んでいる。
本発明の第5の特質は、仮想マシンとして構成されあるいは仮想マシンを実現するコンピュータ・システムを提供し、該システムは割込みレベルにおける非ネイティブな割込みハンドラを含み、該システムは割込みレベルからの情報が他のレベルへ移ることを可能にする手段を含んでいる。割込みレベルと非割込みレベルとの通信は必要であるが、割込みの処理における潜在的な干渉を避けるためには、割込みレベルが非割込みレベルへある情報を移すために特殊な手法を用いることが必要である。
当該システムは、割込みレベルから他のレベルへ情報を送るためネイティブな呼出しを用いる手段を含むことが望ましい。このように、情報は、割込みの処理中の擾乱のリスクを最小限に抑えながら、非割込みレベルへ送ることができる。
第5の特質のコンピュータ・システムは、第1、第2、第3、および(または)第4の特質のコンピュータ・システムの特徴を含むことが望ましい。
本発明の第5の特質は、割込みレベルにおける非ネイティブな割込みハンドラを含む仮想マシンとして構成されあるいは仮想マシンを実現するコンピュータ・システムを動作させる方法をも提供し、該方法は割込みレベルから他のレベルへ情報を移すことを含んでいる。
要約すると、第3および第4の特質の本発明は、割込みレベルのジャバと非割込みレベルのジャバとの間の通信は不可能ではないが難しいことを示すように見える。本発明の望ましい実施の形態においては、ジャバのアプリケーション・プログラマが情報を割込みレベルで走るジャバ・コードから他のアプリケーションへ移すことを可能にするため、特殊な機構が利用可能にされる。
これらの小さな問題が試みられ克服された方法については、特定の記述の後の項で説明される。
本発明は、割込みハンドラのコードが干渉することなく不要部分の整理プロセスの任意の点において良好に走ることを可能にするという利点を有する。
本発明は更にまた、デバイス・ドライバの割込みを実現する手段が設けられたコンピュータ・システムに拡張し、割込みレベルで走る(ジャバ)コードからの情報が残りのアプリケーションへ移ることを可能にする手段を含んでいる。
本発明は、割込みハンドラのコードが干渉することなく不要部分の整理プロセスにおける任意の点で良好に走ることを可能にするという利点を有する。
本発明はまた、本発明の上記特質のいずれかに従って方法を実施するようプログラムされたコンピュータを提供する。
本発明はまた、本発明の第1、第2、第3、第4、および(または)第5の特質の方法を実施するプログラムが記録されたコンピュータ読取り可能な記憶媒体を提供する。
背景として、図8Aに示されるPC形態のコンピュータ・システムにおいては、CPU18102およびその関連するRAM18104が、プログラム割込みコントローラすなわちPIC回路として知られる(通常は)2つの回路ブロック18106、18108の第1のブロック18106に電気的に接続されている。各PICは、電気的接続が行われる合計8つの端子すなわちピンを有する。これまでは、第1のPIC18106の第2のピンが第2のPIC18108の入力に接続されている。PIC18106の残りの7ピンにPIC18108の8ピンを加えたもの、すなわち全てで15ピンが、先に述べたような更に他の装置における電気的接続のため利用可能である。
装置が接続されるピン数は、そのアイデンティティとなり、むしろそのIRQ番号となる。従って、第5のピンに接続されたキーボードは、IRQ=5ラベルを持つことになる。CPUが(例えば)ピン5で信号を受取るとき、リストにおける対応コード・アドレスを活動状態にできるように、CPUは、15の割込みレベルのコード・アドレスのリスト18110と通信する。
PIC信号をCPUに接続する線における電圧を上げることにより、PICがCPUに対して信号する。ある場合には、各文字が対応する装置へ送られた後に、このような信号がCPUへ送られる。CPUが、例えばドキュメント全体またはテキストのページの印刷ではなく、その時のジョブ、すなわちCPUが作業しているマシン命令をいったん終了すると、CPUは割込み信号に応答して、例えば装置へ送られる次の文字に対して適切な動作を行うため対応する装置のアドレスを活動状態にする。
従って、CPUからのアテンションの要求を割込み数が非常に大きくなり得ること、およびこれらを管理する良い方法が前記CPUを含むPCの有効な動作のために不可欠であることが容易に理解できる。ある事例においては、高い優先順位を持つジョブの部分が割込みによる干渉から保護されることが必要である。このような場合は、処理されるコードの部分は、コードのこの部分の終りの「割込みセット」すなわちSTIコードに達するまで割込みが確認されることを阻止する「割込みクリヤ」すなわちCLI命令により先行される。このような保護を強化するために、CPUは、割込みがCPUにすでに生じるプロセスと干渉するかも知れないリスクを更に減じるように、物理的に別の割込みスタックへ切換わる。
CPUとPCにおける(例えば)COMポートを介して接続される装置との間の通信が一般にプロセッサ速度と比較して中程度の速度で生じることを念頭に置くと、通信は遅い。CPUが装置に対して主幹線呼出しを行うとき、CPUはこれを装置へ書込み、呼出しの最初の文字をとってこれをCOMポートのハードウエアへ書込む。次に、CPUはこれが行っていたジョブ、例えばワード・プロセッシング・パッケージにおけるドキュメントを再取得するジョブへ戻る。
割込みが受取られてCPUがどの装置が割込みを行ったかおよびCPUが応答して行うべきことを確定すると、CPUはその時のプロセスから離れて割込みを処理させるのに充分なデータを記憶する。記憶されたリストは、CPUが例えば「割込みコードがいつ到達するとき、Xへ行く」ことを可能にするスタート・アドレスを含む。但し、「X」は割込みに対する適切な応答を表わす。明らかに、割込みハンドラは、割込みが到達したとき、CPUの状態を知らず、従ってハンドラを処理データから分ける先に述べた必要を知らない。
割込みリターン(IRET)・コードは、割込みが完了したこと、およびCPUが割込み前に動作していたプロセスへの戻りを行うことをCPUへ知らせるため割込みの終りに置かれる。
どの実行パス、すなわち「スレッド」は、これと関連するスタックを有する。スタックは、一時的なレジスタ情報とサブルーチンのリターン・アドレスとからなるフレームを格納する記憶域である。
これまで、デバイス・ドライバが書かれる言語について特に付言しなかった。望ましい実施の形態では、これらのドライバはジャバにおけるものであり、本項の残りはそれだけではないが、特にジャバまたは他の翻訳言語におけるデバイス・ドライバの実現により生じる問題の解決に関するものである。
先に述べた問題がどのように解決されたかについての詳細は、下記のとおりである。
公知の堤案では、実際の割込みレベルは、ジャバのバイト・コード実行エンジンによる使用には適さない小さな別個のOSで提供されるスタックにおいて走る。本発明の望ましい実施の形態は、通常のジャバ・スレッドのスタックが準備完了の状態で割込みが生じるときに切換えられるのを待機しており、これは、特殊なネイティブな方法、waitForFirstInterruptにおける呼出しによりジャバ・アプリケーション・スタートアップ・コードの一部として生成された通常のジャバ・スレッドを部分的に自らを部分的に破壊したことによって達成される。
イベントのシーケンスおよび対応する擬似コードの更に完全な説明が、図8Bおよび図8Cに関してそれぞれ与えられる。
図8Bは割込みの処理において呼出された種々のシステム構成要素に対するイベントシーケンスを示し、図8Cは、興味のある事例とするために2つの動作モード、すなわち同期および非同期のモードを持つものと見なされる仮想的な装置のデバイス・ドライバからのジャバ割込みハンドラの対応する擬似コードの概要である。
初めに、パワーアップ時に、主デバイス・ドライバのスレッドが新たな割込みハンドラ・スレッド(図のF18/02)を要求して登録する。これに応答して、具現された仮想マシン(EVM)割込みハンドラのエントリ点が、EVMのネイティブ・コードを介してリアルタイム・オペレーティング・システム(RTOS)割込処理サービスで登録される。次に新たなスレッドが始動され、擬似コードにおける行「waitForFirstInterrupt」(図8C)に達する点まで走る。むしろ、スタックは関連する割込みと関連させられ、RTOSスレッドのない状態「limbo」へ進み、ジャバのスレッドが方法の途中で終了される位置から後で活動状態にされるのを待機する。
ある時間後に、主デバイス・ドライバのスレッドが、後で割込みを生じさせ、本発明を具現するネイティブ・コードを呼出すためRTOSへ信号を生じる装置(図8Bでは、ハードウエア列に示される)へ入出力(I/O)命令を発する。次に、EVMネイティブ・コードが休止状態のジャバ・スタックへ切換わって戻りを生じる。ここから、ジャバ命令ハンドラ・コードが走り続けるが、このコードはあたかも元のスレッド内で続いていたかのように外からは見える。割込みがいったん処理されると、割込みハンドラ方法は、waitForInterruptにおいてなされた呼出しで終了し、制御は再びRTOSスタックへ切換わって戻る。RTOSがハードウエア割込み(IRET)を終え、割込みが終了される。ループは図8Bの主デバイス・ドライバ・スレッド列における「I/Oの発行」ブロックの初頭へ戻り、装置に対する新たな命令が開始されるときこのシーケンスを再び始める。このループは、図8Bの主デバイス・ドライバ・スレッドにおけるフィードバック「lop forever」により無限となる。
割込みハンドラのジャバ方法がすでに「アクティブ」でありかつ割込みが生じると直ちに実行する用意があるので、より速い実行が可能である。
多くの呼出しサイトが存在する場合に図8Cにおけるようなコードの使用によって、ハンドラが関連する点において割込みハンドラ方法のコードへ入りこみ得、かつ次に呼出しが生じるとき、このハンドラが別の場所に入りこみ得る。このことは、方法が開かれる用意ができておらず割込みが生じるとき呼出しが存在するときに開かれる代替的な実施の形態と対照されるべきである。このような方法は比較的遅いばかりでなく、実行がつねにコードの頭で開始するので、このような特徴はあり得ない。同期/非同期の質問の処理のためには、異なるループを用いられ得る。
図の18/03の事例においては、装置は2つの特殊な状態、すなわち非同期と同期の状態を有する。例えば、プロッタ装置は、絶対的と相対的の2つのモードを有し、各モードにより要求される割込みの異なる処理を有する。
方法「waitForFirstInterrupt」は、望ましい実施の形態のジャバ・VMの割込み処理機構の重要な特徴である。これは、スタックとは別に(このスタックは、ジャバ・アプリケーションにおけるwaitForFirstInterruptに対する特定の呼出しが行われた場所のみに関する情報を含んでいる)、任意のO/Sと関連するスレッドを(可能な場合に)破壊し、このスタックの場所は、特定の装置または割込みに関して後で使用されるインシニア・ジャバ・VMの割込み処理機構が登録される。
要約すると、最初の割込みが関連する装置から受取られると、オペレーティング・システムがインシニア・ジャバ・VMの割込み処理機構の割込みハンドラに入り、−これがスタックを先に予約されていた関連するジャバ・スタックへ切換え、次いでネイティブな方法戻しシーケンスを実行することになり、このシーケンスはつねに、(スタックに記録された如き)ネイティブな方法に続く場所でジャバ実行エンジンを再開する。
この時、バイト・コード実行エンジンがO/S割込みレベルでジャバ・バイト・コードを実行しており、このことが、ブロックするスレッド同期動作は試みないようなバイト・コードを実行している間、種々の制約をバイト・コード実行エンジンに課し、非割込みレベルで(おそらくは、同時に)生じるどのような不要部分の整理の段階のゆえに干渉しあるいは障害を生じ得ることは何も行わず、これらの小さな問題は後で述べる。
割込みハンドラのジャバ・コードが、i)装置の特定仕様および生じた割込みタイプに適するものとしてインシニア・ハードウエア・アクセス・ジャバ・パッケージの一部として提供されるネイティブな方法を用いる装置と相互動作したとき、およびii)適切なものとしてインシニア割込み処理パッケージにおけるネイティブな方法の使用により装置(すなわち、アプリケーションの非割込み部分)と関与したジャバ・アプリケーションの残部と相互動作したとき、このハンドラは通常の非割込みコードの実行が継続することを許容しなければならない。これは、別の特殊なネイティブな方法「waitForInterrupt」(前述の「waitForFirstInterrupt」とは対照的に)の呼出しによって達成される。
このネイティブな方法「waitForInterrupt」は、別の割込みによりジャバ・スタックを以降の活性化のため準備完了状態にし、次いでO/Sの小さな専用割込みスタックへ再び切換わり、次に特定のO/Sに適する戻りを行い、割込みのない実行へ戻るのに必要な動作を行わせる。
ジャバにおける割込みハンドラの使用の結果として生じる個々の問題については、次に更に詳細に論述する。
第一に、先に述べたように、バイト・コード実行エンジンは、割込みハンドラのバイト・コードを実行中に任意の潜在的にブロックする同期動作を試みてはならない。
スレッドを同期させるためセマフォーが用いられる。例えば、多重スレッド環境における下記の状況を考察しよう。非割込みスレッドが、セマフォーを取得した動作を開始する。この非割込みスレッドは、割込みが呼出されるとき動作途上である。制御が割込みスレッドへ切換わる。割込みがつねに優先順位で取扱われるので、制御はその後、割込みが処理されるまで割込みスレッドから切換わることがない。
割込みハンドラが非割込みスレッドにより実施されている動作を実施する必要がある場合は、非割込みスレッドがセマフォーを解放するまで割込みスレッドが動作に入ることができず、また割込みが処理されるまでは割込みスレッドが走ることができないため、問題が生じる。
このように、割込み方法が実行中である間はブロッキング呼出しが避けられねばならないことが判る。
従って、バイト・コード実行エンジンを介する通常のルートが潜在的にブロックする同期動作を持たないこと─このことは性能の観点から望ましい─を保証することが重要である。更に、割込みハンドラのバイト・コードの性質がバイト・コード実行エンジンを介する通常のルート以外を決して要求しないことを確認しよう。このため、割込みレベルで使用できる全てのパスを知り、ブロッキング呼出しがないことを確認する。特定の方法に対するネイティブな呼出し(以下参照)もまた、非割込みレベルと通信するときブロッキング呼出しがないことの要求の問題を克服するために用いることができる。
(更に一般的な翻訳言語とは対照的に)ジャバの場合は、このような後者の点は、一定のプール・エントリが予め解決されねばならないことを意味する(一定のプール解決法は、最初に特定のバイト・コードが実行されるときに通常生じるプロセスであり、多くの潜在的にブロックする同期動作およびI/O動作を結果として生じ得るプロセスである)。
望ましい実施の形態においては、割込みハンドラのジャバ・バイト・コードは、予めコンパイルされる(ダイナミック・コンパイル・システムが当然のこととして何らかの潜在的にブロッキングする同期動作を行うためインタプリタを必要としなければ、これは厳密には必要でないが)。
ブロッキング呼出しが初めから使用される2つのタイプの状況が生じる。
制御のフローが通常の実行パスに従う安定状態の場合は、割込みハンドラにより遭遇され取得され得るセマフォーを含まないようにコードが書かれる必要がある。このため、このような通常の制御パスの場合は、ブロッキング呼出しが使用されてはならない。
特殊な状況は、コードが最初に遭遇され実行される場合を含む。このような場合では、セマフォーを要求する動作、例えばクラスのローディングが必要とされる。このような動作では、セマフォーが不可欠である。このため、セマフォーが割込みレベルで使用できないので、最初の割込みに遭遇する前に必要な全てのクラスがすでにロードされているように、このようなコードが予め分解される。
このような事前分解は、非ネイティブな割込みハンドラ・コードのコードの事前コンパイルを含む。事前分解は、始動時に行われるか、あるいはシステムの構築中に行われる。
第二に、バイト・コード実行エンジンは、非割込みレベルで(おそらくは、同時に)生じる不要部分の整理相のゆえに干渉しあるいは障害を生じ得る割込みレベルでは何もしてはならない。望ましい実施の形態においては、これは、割込みレベル・コードの不要部分が整理されたジャバ・ヒープの完全な柔軟性を否定することによって、下記のように基本的に達成される。すなわち、
割込みハンドラを含む特別なジャバ・スレッドは、(特殊なネイティブな方法、waitForFirstInterruptをクロックす前に)その始動相の一部としてオブジェクトを割付けることが許容され、これらオブジェクトはシステムの全寿命だけ保つ(これらは決してガーベッジとして廃棄されない)。ジャバ・スレッドが正規であることを止める(先に述べたように、割込みレベルで使用されるまさにスタックとなる)とき、このようなヒープ・オブジェクトの組は、割込みレベルのジャバ・コードが見ることができるヒープ・オブジェクトのみの組となり、このように、当該オブジェクトの組は不要部分の整理アクティビティとは独立するジャバ・ヒープにおける固定された存在であり、このように、割込みレベル・コードがそれ自体のオブジェクトの組のみを処理するゆえに、非割込みレベルで走るガーベッジ・コレクタが割込みレベルのジャバ・コードが決してその動作と干渉し得ない(あるいは、その逆)という確信において存続し得る。
このようなポリシーが犯されないことを保証するため、VMの開発時に取締まり機構を組込むことができる。例えば、非割込みレベルのジャバが何かを割込みレベルのジャバ・オブジェクトに格納することを阻止する機構を組込むことができる。
先に示したように、GCを割込みレベルから分離することが重要である。割込みが終ると、GCはシステムのどこか別の場所にあり得る。例えば、GCがセマフォーを取得したならば、このことが先に述べたように割込みレベルにおける問題をもたらすことがある。
更に、割込みハンドラが非割込みオブジェクトを変更することができるものとすれば、ハンドラがGCにより削除のためすでにマークされたオブジェクトに何かを書込むかも知れず、あるいはGCシステムを混乱させることになるオブジェクトを変更するかも知れない。
このように、割込みレベルのオブジェクトの割付けは、メモリの別の部分からなされ、これらはGCからは切離されている。
更に、割込みハンドラは、非割込みオブジェクトを変更しようと試みることができないようにこれらオブジェクトを知ることができない。このことは、例えば、割込みが生じたときGCが移動の途中であったオブジェクトを割込みハンドラが変更しようとしたならば、問題を生じるおそれがある。
第三に、最後の2つの問題の解決は、割込みレベルのジャバと非割込みレベルのジャバとの間の通信が不可能でなくとも難しいことを示すように思われる。本発明の望ましい実施の形態においては、ジャバ・アプリケーション・プログラマが割込みレベルで走るジャバ・コードからアプリケーションの残部へ情報を移すこと可能にするため、特殊な機構が利用可能にされる。
ブロッキング呼出および新たなオブジェクトを作ることがともにできるだけ避けるべきであるから、割込みレベルのジャバ・コードはどのようにアプリケーションの残部と通信するのだろうか?
通常は「wait」および「notify」が用いられるが、本文のコンテキストではジャバ・オブジェクトにおける同期を必要とすることになろう。しかし、(例えば、オブジェクト0=新たなオブジェクト(0)であり、コードが待機および通知に対して同期される(0)場合における)同期が割込みには許されないことを前に述べた。従って、ジャバ・方法における呼出しのように見えるがC言語またはアセンブラ言語で書かれる独自のネイティブな方法を提供する。
ネイティブな方法は、情報を割込みレベルから非割込みレベルへ移すことを許し、これが非割込みコードを実際のネイティブ方法における呼出し中に中断させ、割込みが完了して関連する書込み方法(図8CにおけるSpecialChannel.write)における呼出しを行ったとき働くことを許す割込みパッケージの一部として提供される。
図8Dは、本発明の実施の形態を実施するための装置を示している。この装置は、ハードウエア18000(割込みを生じる)と、リアルタイム・オペレーティング・システム18002と、関連するEVMネイティブ・コード装置18004とを含む。装置は更に、ハードウエア18000に対してI/Oを発行することができるジャバの主デバイス・ドライバ18006を含む。EVMのネイティブ・コード装置18004は、ジャバ割込みハンドラ18008に接続される。装置のこれら構成要素の相互動作については、図8Bに関して記述する。
当該装置はまた、ガーベッジ・コレクタ18010を含んでいる。ガーベッジ・コレクタ18010がジャバの主デバイス・ドライバ18006と別のジャバ・スレッド18012とにアクセスするが、ガーベッジ・コレクタ18010から隔離されるオブジェクト18016とヒープ18014とを含むジャバ割込みハンドラ18008にはアクセスしないことが判る。割込みハンドラ18008はまた、スタック18018も含んでいる。ネイティブな呼出しは、割込みハンドラからOS(18004、18002)から非割込みレベル18006、18012へ行うことができる。
上記のいずれかあるいは全てにおいて、本発明の幾つかの特徴がコンピュータ・ソフトウエアを用いて実現された。しかし、無論当業者には、これらの特徴のいずれもハードウエアまたはハードウエアとソフトウエアの組合わせを用いて実現できることが明らかであろう。更に、ハードウエア、コンピュータ・ソフトウエアなどにより行われるファンクションが電気信号などを用いて行われることが容易に理解されよう。
情報の記憶に関する特徴は、適切な記憶場所またはストアにより実現されよう。情報の処理に関する特徴は、適切なプロセッサまたは制御手段によってソフトウエアまたはハードウエアにおいて、あるいは両者の組合わせにおいて実現されよう。
本文に用いられるように、用語「コンピュータ・システム」は、「コンピュータ」、「システム」、「装備」、「装置」、「マシン」などと互換である。コンピュータ・システムは、仮想マシンであり得、あるいは仮想マシンを含み得る。
上記のいずれかあるいは全てにおいて、方法および装置の特徴および特質を含む先に述べた異なる特徴および特質は、任意の適切な方法で組合わせることができる。
本発明が、純粋に事例として記述され、細部の修正が本発明の範囲ないで可能であることが理解されよう。
本文の記述、および(適切な場合に)請求の範囲および図面において開示された各特徴は、独立的に、あるいは適切な組合わせにおいて提供されよう。
本発明は、コンピュータ・システムに関し、コンピュータ・システムを動作させる方法に関する。特に、本発明は望ましくは、コンピュータ・システムに関し、オブジェクト指向プログラムを含むコンピュータ・システムを動作させる方法に関する。望ましい実施の形態においては、本発明は、ファイナルでないインスタンス方法の直接的な呼出しを可能にするクラス・ローダの使用に関する。
本発明は、方法の継承(inheritance)に関し、「方法」は、既に述べたように、例えば円の「面積」のようなファンクション、および「再生」、「点灯」などのような他の任意のファンクションに対するジャバその他のプログラミング言語における用語である。
ファイナルでないインスタンス「方法」の直接的な呼出しを許容するクラス・ローダの使用に関する本願の部分において、「方法」(大文字「M」を付す)は、プログラミング言語の方法に関して用いられ(また、「ファンクション」および「ルーチン」を含む他の用語によっても、これに限定されないが知られる)、用語「方法」(小文字「m」を付す)は、(前後関係から他の意味が明らかである場合を除き)本発明を実施する手順に関して用いられる。
従来のシステムおよび方法(M)において、所与のネームの方法(M)に対する呼出しは、方法(M)と名付けられた多くの異なる構成の1つを1つのオブジェクトが関心を持たれるもの(例えば、ビデオ・レコーダ、テープ・レコーダなどにおける「再生」ファンクション)に従って実行させる。これは、「ポリモルフィックな呼出し」と呼ばれる。このような状況においては、オブジェクトに従って異なるようにコンパイルする。これらの問題のゆえに、目的の方法(M)について仮定を行わず、従ってこれを最適以下に呼出しをコンパイルしなければならない。
ジャバは、非常にオブジェクト指向的である言語の一例であり、ジャバは単一の継承を許容する。他の言語、例えばC++は多くの継承を許容する。継承は、ポリモルフィズムを導く。
オブジェクト指向環境においては、方法(M)は、方法(M)の多くの異なる構成がシステムにおいて利用可能であるならば、ポリモルフィックであると言われ、使用される構成は方法(M)が呼出される各点およびプログラムの実行時に呼出し点に達するごとにおいて選定される。このような状況は、典型的に、継承によりオブジェクト指向システムにおいて起生し、これによりクラス(あるクラスのインスタンスにおいて呼出され得る方法(M)を含むあるタイプのオブジェクトの記述)が以降のクラスに対するベースと見なされる。このような新たなクラスは、スーパークラスと呼ばれる元のクラスのサブクラスと呼ばれ、スーパークラスの全ての特質(方法(M)を含む)を継承すると言われる。しかし、新しいサブクラスは、スーパークラスから継承された方法(M)の一部または全てをオーバーライドし得、これら方法(M)のそれ自体の構成を提供し、これらのオーバーライドされた方法(M)はポリモルフィックであり、これらのオーバーライドされた方法(M)の1つが呼出される場合に用いられるように選択される構成は呼出が関連させられるオブジェクトのクラスにより支配される。
例えば、単一のネームを付した方法(M)は、クラスの階層において何度も現われ、ネームを付した方法(M)の各外観は方法(M)の異なる構成に対応し得る。走らせられる実際の方法(M)は、ネームを付した方法(M)に関するオブジェクトに依存することになる。
上記の試みは働くシステムを生じるが、方法(M)が(方法(M)に対する呼出しのコンパイルが試みられる時にポリモルフィックでなければ)非ポリモルフィックのままである場合が通常の使用において優勢であると見えるので、潜在的に多数の最適化の機会が失われる。しかし、この方法(M)がポリモルフィックでないという仮定が行われると、仮定が新たなクラスがシステムへロードされるゆえに偽であると後で見出されるならば、システムは問題となるように走る。
本発明の1つの特質においては、システムを最適化する問題に対する解決法は、その時ロードされたクラスの組に対して最適化することを目的とする。本発明の第2の特質において、前にロードされたクラスのある方法(M)をオーバーライドする別の組がロードされると、最適化が新たなクラスがオーバーライドする方法(M)に対する呼出しに対して変更され、すなわち方法(M)がポリモルフィックであることを発見すると、戻って特定の最適化の仮定を取り消す。
本発明の第1の特質によれば、潜在的にポリモルフィックである方法(M)に対する呼出しを含むコードをコンパイルする方法が提供され、この方法は方法(M)がポリモルフィックでないという仮定に基いてコードをコンパイルすることを含む。
方法(M)が非ポリモルフィックであるという仮定がなされると、方法(M)が「仮定されたファイナル」としてマークされることが望ましい。
コンパイルは方法(M)に対する呼出しの最適化を含むことが望ましい。
本発明の第1の特質の実施の一形態においては、最適化は、インライニングを含む。特に、呼出される方法(M)の1つの構成のインライニングがあることが望ましい。以下に更に詳細に述べるように、呼出される方法(M)は、コードの各部間のジャンプがコードの実行時に少なくて済みフレームの生成コストがなくなるように、方法(M)の呼出しを含むコードと一致するようにコンパイル時に移動される。このことは、コンパイル・コードのより速い実行を招来する。
本発明の第1の特質の代替的な実施の形態においては、最適化はパッチの形成を含む。方法(M)がポリモルフィックでないという仮定がなされる場合、方法(M)を呼出すコンパイル・コードと方法(M)のコンパイル・コードとの間にパッチが形成される。パッチの形成については、「エージェント資料第14」とタイトルを付した本発明に関して本文に更に詳細に論述される。
先に示したように、方法(M)がそれに対する呼出しのコンパイル時にポリモルフィックでない場合、大半の場合に方法(M)がポリモルフィックでないままであることがしばしば発見される。しかし、仮定が偽であることが見出される幾つかの場合が生じる。例えば、ロードされる新たなクラスは、先にポリモルフィックでないと仮定された方法(M)の新たなインスタンスを含む新たなサブクラスを含み得る。
当該方法は、この仮定がなされたならば、マーカを生成するステップを更に含むことが望ましい。マーカは、ポリモルフィックでないと仮定された方法(M)と関連することが望ましく、またマーカがポリモルフィックでないと仮定された方法(M)ののデータ構造で作られることが望ましい。
方法(M)がポリモルフィックでないという仮定がなされたことを示すマーカを生成することにより、オーバーライドされるべき仮定がなされたかどうかを調べるため検査を行うことができる。このようなサーチは、新たなクラス、特に新たなサブクラスがシステムへロードされるときに行われることが望ましい。
コードが主パスの断片であることが望ましい。コンパイラは、コードの主パス断片のみをコンパイルするよう構成されることが望ましい。コンパイラの望ましい特徴の論議および主パスの断片のコンパイルの方法については、本明細書の項「エージェント資料第1」を参照されたい。コードの主パスの断片をコンパイルすることによって、頻繁に実行される断片のみがコンパイルされ、これによりコードの頻繁に実行されるセクションのコンパイルにより要する時間およびメモリを低減する。
コードが望ましくはジャバであるオブジェクト指向言語のコードであることが望ましい。
本発明の第1の特質は、コードをコンパイルするコンパイラを含むコンピュータ・システムをも提供し、コンパイラは潜在的にポリモルフィックである方法(M)に対する呼出しを含むコードをコンパイルするとき、コンパイラが方法(M)がポリモルフィックでないという仮定に基くコードをコンパイルするように構成される。
方法(M)がポリモルフィックでないという仮定がなされるならば、当該システムは、方法(M)を「仮定されたファイナル」としてマークする手段を含むことが望ましい。コンパイル・システムは、方法(M)を「仮定されたファイナル」としてマークすることが望ましい。このマーキングは、コンパイラ・マネージャによって行われる。
コンパイラは、方法(M)に対する呼出しを最適化する手段を含むことが望ましい。このコンパイラは、方法(M)とインラインとなるよう、あるいは方法(M)に対するパッチを生じるように構成されることが望ましい。
当該システムは更に、前記仮定がなされたならば、マーカを生成する手段を含むことが望ましい。マーカはコンパイル・システムにより、望ましくはコンパイラ・マネージャによって生成されることが望ましい。
当該コードは、オブジェクト指向言語、望ましくはジャバのコードであることが望ましい。
本発明の第1の特質によれば、先に述べた方法によりコードをコンパイルするコンパイラも提供される。
本発明の第1の特質はまた、先に述べた方法によりコンパイルされえるコードを提供する。
このように、本発明の第2の特質は、例えば本発明の第1の特質に従って、コードのコンパイルにおいて仮定が行われた特定のアプリケーションを見出す。
クラスの導入は、新たなクラスのシステムへのローディングを含み得る。
本発明の第2の特質は、ロードされつつある新たなクラスがすでにシステムにおけるクラスのサブクラスであるシステムへの新たなクラスのローディングにおける特定の用途を見出す。
新たなクラスの方法(M)がポリモルフィックでないと仮定されたことが見出されると、方法(M)がポリモルフィックでなかったという仮定時に行われた任意の最適化に関して変更が行われることが望ましい。
当該方法は、方法(M)がポリモルフィックでないと仮定されたと判定されると、コンパイル・コードを調整することを更に含むことが望ましい。この調整は、方法(M)に対する呼出しを含むコンパイル・コードに対するものである。
コンパイル・コードの調整は、コンパイル・コードのセクションの削除を含む。削除されたコードは、方法(M)に対する呼出しを含む。例えば、コードのコンパイルの最適化がインラインで含んだ場合、インライン化されたセクションを含むコードのコンパイルのセクションの削除が要求される。
代替的に、あるいはこれに加えて、コンパイル・コードの調整がパッチの取り消しを含むこともある。例えば、コードのコンパイルの最適化が方法(M)に対する方法(M)の呼出しから直接指示するパッチを含んだ場合、パッチは行われないことが望ましい。あるいはまた、パッチおよび(または)パッチと関連するコンパイル・コードが削除される。
コンパイル・コードの変更は自動的に行われることが望ましい。これは、幾つかのスレッドが同時に実行中である多重スレッド環境において特に重要である。このような環境において調整が自動的に行われず、仮定が行われた間にスレッドが実行を活発に継続することを許されたならば、コードの領域の調整が行われると同時にスレッドがコンパイル・コードの領域において活発に実行中であるというリスクが存在する。これは、明らかに最も不利となろう。調整が自動的に行われなかったならば、調整が行われた間に調整されるコード領域に進む全てのスレッドの実行を停止することが必要となろう。コードの関連部分を変更することが安全であることを保証するため、特に削除においてコードの変更に先立ち検査が行われることが望ましい。当該方法は、コンパイル・コードの変更に先立ちスタック・ウォーキングを行うステップを含むことが望ましい(「エージェント資料第6」項および「エージェント資料第14」項を参照)。スタック・ウォーキングは、パッチのアンドゥのためには通常は必要でないが、コードのブロックのコンパイル・バージョンの削除前に行われることが望ましい。
多くの場合に、コンパイル・コードの関連部分が仮定が正しくないと判るとできるだけ早く削除されることが望ましいが、コードのコンパイルされたセクションは実行のため利用できなくなる。コンパイルのセクションにより占有されたメモリを解放するため、コンパイル・コードの関連部分がしかるべきときに削除されることが望ましい。しかし、この部分が削除されるまで、コンパイル・コードは使用されてはならないことをマークされるか、あるいはコンパイル・コードが使用されないように調整がどこかに行われることが望ましい。例えば、「エージェント資料第1」の本発明の実施の一形態においては、方法(M)のいずれかの部分のコンパイルされたバージョンが存在するならば、方法(M)のディスパッチ・テーブルがマークされる。このため、仮定が正しくないと見出されるならば、方法(M)のディスパッチ・テーブルはコンパイルされた断片を参照しないように変化することができ、これにより実行のため利用できないようにする。
新たなクラスの方法(M)がポリモルフィックでないと仮定されたと判定されるならば、インタプリタが使用されることが望ましい。従って、インタプリタを用いて実行が続くことが望ましい。仮定を行わない新たなコンパイル・バージョンが作られる間を待機することは可能であるが、これは望ましくない。コンパイル・コードが削除されるか利用できなくされる場合、コンパイル・コードが置換されないかあるいは置換されるまでフォールバック・インタプリタが用いられることが望ましい。フォールバック・インタプリタの使用についての更なる論議については、「エージェント資料第1」に見出すことができる。
本発明の第2の特質のコンピュータ・システムを動作させる方法もまた、コードのコンパイルに関する本発明の第1の特質の方法の特徴を含んでいる。
所与のクラスに対する方法(M)への呼出しをコンパイルし、
新たなサブクラスについて、クラスの方法(M)が前にファイナルとして処理されたかどうか決定し、
方法(M)がファイナルでなければ、所与のクラスに対する方法(M)への呼出しのコンパイルを調整する
ステップを含むコンピュータ・システムの方法をも提供する。
前項による方法は、呼出されている方法(M)が「ファイナル」であるという仮定を有効に利用する。
コンパイル・コードの調整は、クラスが導入される前に行われることが望ましい。例えば、新たなクラスがシステムへロードされている場合、ポリモルフィックでない方法(M)に対するサーチと、コンパイル・コードに必要な調整とがともに、新たなクラスのローディングがコンパイルされる前に行われる。
新たなサブクラスの導入は、クラス・ローダの使用によって行われる。クラス・ローダはコンパイル・システムへの呼出しを行うことが望ましい。ロードされるクラスによりオーバーライドされるコードのコンパイル中に仮定がなされたならば、例えばコードの削除が行われるまで方法(M)のディスパッチ・テーブルの削除および(または)変更によって、パッチを取り消しするか、あるいはコンパイル・コードのコンパイル・バージョンを実行のため利用されないようにすることにより、コンパイラ・マネージャが状況を処理することが望ましい。
本発明の第2の特質によれば、クラス・ローダを用いてコンパイル・コードを含むシステムへクラスをロードする方法が提供され、これにおいてクラス・ローダが、クラスによりオーバーライドされるコンパイル・コードにおいて仮定がなされたかどうかを決定する。
オーバーライドされる仮定がなされたならば、クラス・ローダがコンパイル・コードのマネージャへの呼出を行うことが望ましい。この呼出しは、先に示したようにコンパイル・コードの調整に導く。
本発明は、更なる特質において、本発明は、所与のクラスに対する方法(M)への呼出しをコンパイルする手段と、方法(M)がファイナルとして処理できるかどうか判定する手段と、この判定に基いて所与のクラスに対する方法(M)への呼出しのコンパイルを調整する手段とを含むコンピュータ・システムを提供する。
従って、本発明は、コンピュータ・システムの最適化に対する機会を強化する。
本発明の第2の特質は、新たなクラスを導入する手段を含むコンピュータ・システムをも提供し、当該システムはクラスの方法(M)がポリモルフィックでないと前に仮定されたかどうかを決定する手段を含んでいる。新たなクラスを導入する前記手段は、クラス・ローダであり得る。
前記システムは更に、新たなクラスの方法(M)がコードのコンパイルにおいてポリモルフィックでないと仮定されたと決定されるならば、コンパイル・コードを変更する手段を含むことが望ましい。コンパイル・コードの変更は、コンパイル・システムにより、望ましくはコンパイラ・マネージャによって行われることが望ましい。
当該システムがスタック・ウォーキング装置を含むことが望ましい。
前記システムが更にインタプリタを含むことが望ましい。
本発明の第2の特質によれば、
所与のクラスに対する方法(M)への呼出しをコンパイルするコンパイラと、
クラスの方法(M)が前にファイナルとして処理されたかどうかを新たなサブクラスについて決定する手段と、
所与のクラスに対する方法(M)がファイナルでなければ、該方法(M)への呼出しの前にコンパイルされたバージョンを調整する手段と、
を含むコンピュータ・システムが提供される。
新たなクラスを導入する前記手段がクラス・ローダを含むことが望ましい。
本発明の第2の特質が更に、先に述べたようにコンピュータ・システムにおいて使用されるクラス・ローダを提供する。
本発明は、更に他の特質において、所与のクラスに対する方法への呼出しをコンパイルする手段と、方法が前にファイナルとして処理されたかどうかを決定する手段と、方法が前にファイナルとして処理されるならば所与のクラスに対する方法への呼出しのコンパイルを調整する手段とを含むコンピュータ・システムを提供する。
また、本発明によれば、先に述べたように、本発明の第1および(または)第2の特質に従って方法を実施するためのプログラムが記録されたコンピュータ読取り可能な記憶媒体が提供される。
本発明は、コードをコンパイルする方法を実施するためのプログラムが記録されたコンピュータ読取り可能な記憶媒体に拡張し、当該コードは潜在的にポリモルフィックである方法(M)への呼出しを含み、当該方法は方法(M)がポリモルフィックでないという仮定に基いてコードをコンパイルすることを含む。
本発明はまた、クラスをコンピュータ・システムへ導入する方法を実施するためのプログラムが記録されたコンピュータ読取り可能な記憶媒体に拡張し、当該方法は、クラスの方法(M)が前にポリモルフィックでないと仮定されたかどうかを判定するステップを含む。
本発明は更に、先に述べたような方法に従ってプログラムされるとき、コンピュータに拡張する。
本発明はまた、コードをコンパイルする方法に従ってプログラムされたとき、コンピュータに拡張し、当該コードは潜在的にポリモルフィックである方法(M)への呼出しを含み、当該方法は方法(M)がポリモルフィックでないとの仮定に基いてコードをコンパイルすることを含む。
更に、本発明は、コンピュータ・システムへクラスを導入する方法に従ってプログラムされたとき、コンピュータに拡張し、当該方法は、クラスの方法(M)が前にポリモルフィックでないと仮定されたかどうかを決定するステップを含む。
本発明の特質のいずれか、あるいは一部、あるいはその全ては、他の特質に適用されよう。下記の考慮は、先に述べた本発明のいずれかおよび全て、および本発明の特質に適応する。
本発明の望ましい実施の形態については、純粋に事例として、(改善を示す)図面を参照して次に記述することにする。
潜在的にポリモルフィックである方法は、実際には特定の時点においてポリモルフィックでないことがある。このような方法(M)がコンパイル時にポリモルフィックでなければ、方法(M)に関する呼出しのコンパイルにおいて、特に方法(M)への呼出しに関するコードに対して最適化が可能である。
コードの各セクションがコンパイルのため仮想マシンにより考察されるとき、コード部分からの任意の潜在的にポリモルフィックな呼出しもまた考察される。このような各呼出しに対して、呼出しの決定がコンパイル時に固定される(すなわち、この時この方法(M)の1つの構成のみが存在する)ならば、コンパイル・システムにより状況がそうあり続けるという仮定がなされる。これは、呼出された方法(M)の1つの構成のインライニングに限定はしないがこれを含む種々の最適化を行うことを可能にする。
バーへの呼出しを含むコード部分のコンパイル・バージョンを生じる決定がされるならば、バーがファイナルであるという仮定がなされると、バーへの呼出しのコンパイルに対して種々の最適化が可能である。バーがファイナルでないことが判らなければ、これがそうであるという仮定はコンパイル時に行われる。バーへの呼出しの2つの最適化例は、インライニングおよびパッチングである。
インライニングの最適化法においては、方法(M)のバーは、このバーが呼出されるpulic int foo(int)のコードの残部と一致するように移動される。
最適化は、方法(M)のバーがファイナルであるという仮定を用いて行われた。コードの結果として得るコンパイル・バージョンが実行環境の潜在的部分として仮想マシンの残部に利用可能とされる前に、呼出される方法(M)がそのVMデータ構造において、オーバーライドされない(すなわち、ファイナルの方法(M)である)ことを仮定するコンパイル・コードを持つものとマークされる。先に示した事例では、このマークは、何かが方法(M)をオーバーライドするようになされるならば何かがなされた仮定に照らして行われねばならないことを示す、方法(M)のバーと関連するデータ構造において作られる。
図9Aは、クラス・ローダが例えばロードされる新たなクラスの方法(M)を調べる望ましい実施の形態に関するフロー図を示している。
当該クラス・ローダは、システムへのローディング4000のための新たなクラスを見出す。クラス・ローダは、種々の検査が行われるまでクラスをロードしない。第1のステップ4002として、クラス・ローダが、クラスがロードされるべきシステムに対して有効なクラスであるかを知るため標準的な検査を行う。もしそうでなければ、例外が投入される。もしそうであれば、クラス・ローダはロードされるべきクラスにおけるインスタンスの方法(M)を探す4006。ステップ4008において、クラス・ローダは、方法(M)について、この方法(M)が別の方法(M)をオーバーライドする方法(M)であるかどうか、例えば、これがロードされるクラスのペアレント・クラスの方法(M)をオーバーライドするかどうかを知るために調べる。もしそうでなければ、クラス・ローダは、次の方法(M)を調べる。この方法(M)がペアレントの方法(M)をオーバーライドすることを見出すならば、クラス・ローダは、マークされたかどうかを知るためにペアレントの方法(M)のデータ構造を調べる4012。先に述べたように、マーカは、方法(M)のコンパイル・バージョンに対するコンパイルされた呼出しが、ペアレントの方法(M)がファイナルであるという仮定に基いて用意されたことを表わす。マーカがなければ、クラス・ローダは、新たなクラスにおける別の方法(M)を探し続ける4014。マーカがあれば、クラス・ローダは、ペアレントの方法(M)がファイナルであったという仮定に基いてコンパイルされたコンパイル・コードについて何かがなされねばならないことを示すためコンパイル・システムに呼出しを行う4016。次いで、クラス・ローダは、ロードされるクラスの別の方法(M)を探し続ける。
方法(M)のバーがファイナルであることが正しくないことが判ったという仮定がなされる場合、パッチは下記のように取り消される。すなわち、
呼出し4022は、方法(M)に対する一般的呼出し4024への移動4023へ変更される。呼出し4022のリダイレクションは自動的に行われる。
呼出し4024の一般的形態は、コンパイルされる方法(M)foo4020が生成されたのと同時にアウトライアとして用意され、方法(M)のバーの多くの異なる構成(4028、または4026)へ転移することができる(4029、または4025)。
パッチのリダイレクションおよび削除の更なる詳細については、「エージェント資料第14」を参照されたい。
以下においては、バーがファイナルであるという仮定によりコードのコンパイル時になされた最適化はインライニングである。図9Cは、第1の部分4032、第2の部分4034、および第3の部分4036を含むコンパイル・コード4030の各部を示している。第2の部分4034は、バーに対する呼出しを含むコードのコンパイル・バージョンである。方法(M)のバーは、バーがこの時部分4034に部分4038として含まれるようにインラインされている。
仮定が正しくないことが後で判るならば、コンパイル・コード部分4034は削除されることになる。部分4034を含む方法(M)のディスパッチ・テーブルは、コードのコンパイル・バージョン4034を参照しないように変化される4034。
部分4030の以降の実行時に、コンパイル・コードの部分4032が部分4032の終りに最初に実行され、制御はグルー・コードへ進む。グルー・コードは、次の部分4034のコンパイル・バージョンがあるかどうか知るために調べる。コンパイルされた部分が見出されず、従って、更なる実行のため制御をインタプリタへ送るために準備がなされる。
制御は、最初に状態を更新するためアウトライアへ送られる。(「エージェント資料第3」参照)
後の時点で、コンパイルされた部分4034が削除される。前記部分が削除される前にスタック・ウォーキングが行われる。(「エージェント資料第6」参照)
このように、方法(M)がファイナルであるという仮定が正しくないことが後で発見されるならば、パッチの最適化がインライニングよりも容易にアンドゥされることが判る。しかし、インライニングの使用から更に優れた最適化および少ない実行時間が得られ、仮定がまれにのみ正しくないと証明されることが考えられるならば、多くの場合にインライニングが選好される。
要約すれば、新たな各クラスがロードされると、クラス・ローダが、新たなクラスの方法(M)のどれかがそのデータ構造においてセットされたマーカで方法(M)をオーバーライドするかどうか知るために調べる。もしそうであれば、クラス・ローダは、仮想マシンのコンパイル・コードのマネージャ部分に対する呼出しを再び行い、全ての影響を受けたコンパイル・コードが削除されるかあるいはアクセス不能にされることを要求する。
呼出しコードのコンパイル・バージョンが呼出している方法(M)の内部の詳細について多くの仮定を行わないように構成されると、上記機構と平行して使用できるより簡単な機構は、呼出される方法(M)のコンパイル・バージョンに対し直接呼出す呼出しコードのコンパイル・バージョンののパッチングを可能にすることである。このような直接のパッチは、先に述べたものと同じ検出機構を用いて以降にロードされるクラスが問題の方法(M)をオーバーライドすることが判るならば、比較的容易にアンドゥできる。パッチされるバージョンの利点は、これがどの構成が呼出しのため選択するかについての呼出しの時点における動的な決定を行うことのオーバーヘッドを避けることである。1つの可能性しかなくとも、パッチされる形態が使用されなければ、オーバーヘッドは存在する。
図9Dは、望ましい実施の形態を実施するための装置を示している。この装置は、コンパイラ4042とコンパイラ・マネージャ4044を含むコンパイル・システム4040を含んでいる。コンパイラ4042は、パッチを生成する最適化装置4046とインライニングを行う最適化装置4048とをそれぞれ有する。コンパイラ・マネージャ4044は、呼出しがこれがファイナルであるという仮定に基いてコンパイルされることを示す方法(M)をマークするためのマーキング装置4050を含んでいる。
当該装置は更に、新たなクラスをローディングするクラス・ローダ4052を含む。このクラス・ローダは、ロードされるクラスの方法(M)が、これがファイナルであるという仮定に基いてコンパイルされた方法(M)をオーバーライドするかどうか判定する方法(M)・チェッカ4054を有する。この方法(M)・チェッカ4054は、方法(M)のデータ構造におけるマーカについてサーチする。
当該装置は更に、コンパイル・コードを実行する実行装置4066を含んでいる。グルー・コード4068およびアウトライア4070は、必要な場合にインタプリタによる実行の転送を行うために設けられる。インタプリタ4072は、インタプリタによるコードのブロックの実行を記録するための実行履歴レコーダ4074を含む。この情報は、主パスのコンパイルのために使用される(「エージェント資料第1」参照)。
上記のいずれかあるいは全てにおいて、本発明の幾つかの特徴はコンピュータ・ソフトウエアを用いて実現された。しかし、当業者には、これらの特徴のいずれもハードウエアまたはハードウエアとソフトウエアの組合わせを用いて実現されることが無論明らかであろう。更に、ハードウエア、コンピュータ・ソフトウエアなどにより行われるファンクションが電気信号などで行われあるいはこれを用いて行われることが容易に理解されよう。
情報の格納に関する特徴は、適切な記憶場所またはストアによって実現されよう。情報の処理に関する特徴は、ソフトウエアまたはハードウエアにおいて、あるいは両者の組合わせにおいて、適切なプロセッサまたは制御手段によって実現されよう。
本文において用いられるように、用語「コンピュータ・システム」は、「コンピュータ」、「システム」、「装備」、「装置」、「マシン」などと互換であり得る。コンピュータ・システムは、仮想マシンであり得、あるいは仮想マシンを含み得る。
上記のいずれかまたは全てにおいて、方法および装置の特徴および特質を含む上記の異なる特徴および特質は、任意の適切な方法で組合わされよう。
本発明が、純粋に事例として本文に記述され、細部の修正が本発明の範囲内で可能であることが理解されよう。
本文の記述、および(適切な場合に)請求の範囲および図面において開示された各特徴は、独立的に、あるいは任意の適切な組合わせにおいて提供されよう。
本発明は、特に排他的ではないが多重スレッド環境において、一般にデータ構造のアクセスに関するものである。望ましい実施の形態において、本発明は、多重スレッド環境における無秩序なリストに対するサーチ時間の短縮に関するものである。
本発明の第1の特質は、特に、コンピュータ・システムにおけるエントリのリストにおいて特定のエントリをアクセスする方法に関するものであり、エントリの1つに対する開始ポインタを読出し、特定のエントリが見出されるまで開始ポインタにより指示されるエントリから更に開始するリストにおけるエントリを調べ、見出された特定のエントリをアクセスするステップを含んでいる。
当該方法の公知の構成においては、このリストは、明白な初めと明白な終りとを持ち、開始ポインタはつねにリストの初めを指示し、次のエントリ・ポインタに対する空値を持つ最後のエントリを除いて、各エントリはリストにおける次のエントリに対するポインタを含んでいる。
アクセスされる特定のエントリがリストの終りにあるならば、この特定のエントリが見出される前にリストにおける全てのエントリを調べることが必要である。多くの用途において、見出された特定のエントリがリストが次にアクセスされることが要求されるエントリとなるという平均以上の確率が存在する。このような場合、当該方法の公知の構成によれば、特定のエントリが見出される前にリストの全てのエントリを調べすることが必要であれば、次のアクセスにおいて特定のエントリが見出される前にリストの全てのエントリを調べることも必要となるという平均以上の確率が存在する。
更に他の手法においては、特定のエントリが見出されると、見出されたエントリをリストの前方に移すためリストが記録される。このため、見出されるエントリは、次にリストがアクセスされるとき最初に調べられるものとなる。リストがこの方法で記録される場合、データ構造へのアクセスをミューテックスを用いてロックすることが必要である。2つのスレッドが同時にリストを並べ替えようと試みたならば、リストの改変が生じ易い。
同じか異なる特定のエントリに対する前記ステップの反復において検査ステップが最初に述べた特定のエントリを調べることから開始するように、見出された特定のエントリを指示するように開始ポインタを重ね書きすることにより、多くのアプリケーションにおいて、アクセスを速くかつ効率的にするために、見出された特定のエントリが次にリストがアクセスされるときに要求されるエントリとなる、平均以上の確率が生じるという利点が得られる。
本発明によれば、エントリはそれぞれ、リストにおけるエントリを指示する次の各エントリ・ポインタを含み、検査ステップにおいて、調べられるこのようなエントリに対する次の各ポインタが、次にどのエントリを調べるかを決定するために読出される。従って、リストは、先に述べた公知の構成におけるように、空の次のエントリ・ポインタを有する明白な初めと明白な終りを持つリストではなく、無限ループであると考えることができる。
リストが1つのエントリしか持たない場合は、エントリの次のエントリ・ポインタはそれ自体を指すことになる。しかし、通常は、次のエントリ・ポインタは、リストにおけるエントリの異なる1つを指すことになる。
方法が無限にループすることを阻止するために、特定のエントリが検査ステップの間は見出されない場合は、各エントリが1回調べられるごとに検査ステップが1回終了され、アクセス・ステップと重ね書きステップとは省かれることが望ましい。
本発明の第1および第2の特質の方法においては、開始ポインタを重ね書きするステップが、自然あるいは特殊な設計のいかんを問わずアトミックであることが望ましい。このことは、多重スレッド環境において特に有利である。ポインタ位置がアトミックに変更可能である場合、2つのスレッドが同時にポインタ位置を変えようと試みるときのデータ破壊のリスクが低減される。このため、ミューテックスの保護によらずポインタ位置の変更を許容することが可能となる。また、特定のエントリをアクセスするステップは、読出しアクセス・ステップであることが望ましい。
本発明の第3の特質は、コンピュータ・システムにおけるエントリのリストを形成する方法を提供するもので、該方法は、
各エントリに次のエントリ・ポインタを与え、
エントリ・ポインタの閉ループを形成するように次のエントリ・ポインタを構成し、
異なるエントリを指示するため重ね書きが可能である、エントリを指示する開始ポインタを提供する
ステップを含んでいる。
本発明の第4の特質は、本発明の第3の特質によりエントリのリストを形成する方法と本発明の第1の特質によりエントリをアクセスする方法とを含む、コンピュータ・システムを動作させる方法を提供する。
本発明の第5の特質は、本発明の第1および第2の特質の方法を実施するようプログラムされるコンピュータ・システムを提供する。
本発明の第6の特質は、エントリのリストを記憶する手段と、エントリの1つに対する開始ポインタを記憶する手段と、開始ポインタを読出す手段と、特定のエントリが見出されるまで開始ポインタにより指示されるエントリから始まるリストにおけるエントリを調べる手段と、見出された特定のエントリをアクセスする手段とを含むコンピュータ・システムを提供し、該システムは、見出された特定のエントリを指示するように開始ポインタを重ね書きする手段を特徴とする。
本発明の第7の特質は、エントリのリストとこれらエントリの1つに対する開始ポインタとが記憶され、各エントリが次の各エントリ・ポインタを含み、次のエントリ・ポインタの全てがリストにおけるエントリを指示する、コンピュータ・メモリを提供する。
本発明の第8の特質は、本発明の第7の特質によるメモリと、開始ポインタを読出し、特定のエントリが見出されるまで開始ポインタにより指示されるエントリから始めるリストにおけるエントリを調べ、見出された特定のエントリをアクセスするようにプログラムされたプロセッサとを含むコンピュータ・システムであって、見出された特定のエントリを指示するように、プロセッサが開始ポインタを書直すようにプログラムされることを更に特徴とするコンピュータ・システムを提供する。
本発明の第9の特質は、コンピュータ・システムにおけるリストにおけるデータをアクセスする方法であって、リストをループの形態に構成し、所与の要素をループでアクセスし、該要素を次のアクセスのためのループの始まりであるように選定するステップを含む方法を提供する。
本発明の第10の特質は、リストにおけるデータをアクセスするコンピュータ・システムであって、閉ループの形態でデータを構成する手段と、所与の要素をループでアクセスする手段と、該要素を次のアクセスのためループの開始時に選定する手段とを含むコンピュータ・システムを提供する。
本発明の上記特質において、エントリあるいは要素の少なくとも一部がそれぞれコンパイル・コードの各セグメント(または、チャンク)を含み、そして(または)エントリあるいは要素の少なくとも一部がそれぞれ各キーを含むことが望ましい。
本発明の第11の特質は、全くの方法の特質のいずれかをコンピュータ・システムに実施させ、あるいは本発明のシステムの特質のいずれかに従って動作させるように実行可能なコンピュータ・プログラムが記録されたコンピュータ読取り可能な記憶媒体を提供する。
当該方法は、多重スレッド環境において特に有利である。選択は1つの書込み操作として行われる、すなわち、アトミックであることが望ましい。これは、安定性が維持されるものとすれば多重スレッド環境において非常に有利である。
本発明、あるいは本発明の少なくとも特定の実施の形態は、ミューテックスによらず読むことができる無秩序の単にリンクされたリストのアクセスにおける最適化を提供する。本発明は、新たなエントリをこのようなリストに挿入する問題、あるいは古いエントリを取除く更に困難な問題を目的とするものでもなく、いずれのタスクの複雑さを増すものでもない。このような種類の修正が要求される場合、ある種のバルブ機構が提供されることが望ましい。同様に、リストが秩序のあるリストであるならば、本発明は通常は適用され得ない。
本発明の任意の特質のいずれか、あるいは一部、あるいはその全てが他の任意の特質に適用されよう。
本発明の望ましい特徴については、純粋に事例として、添付図面に関して次に記述される。
図10Aに示されるデータ構造が非常に頻繁に読出すためアクセスされ、ミューテックスを持たないアクセス機構が有効であるならば、ミューテックスを取得し解放するために要する時間はデータ構造をアクセスする時間の著しい割合となる。
図10Aの事例において、スレッドは通常、ポインタlist_head26104を介して第1の要素26110に進入し、更に逐次リストにおける他のポインタを介して移動することになる。ポインタlist_head26104が(例えば)第2の要素26112へ移動されるならば、この点においてリストに進入するスレッドがリストにおける要素の全てを「知る」ことがない。このような問題を克服するため、全ての要素が判るようにリストが並べ直されねばならないが、ミューテックスが設けられねばならない。
特に図10Bによれば、本発明の実施の形態において、リストの終りであったものにエントリ26106におけるポインタnext_ptrの追加によりリストをループに作ることにより、次にアクセスされる確率の最も高い要素を示すためどのスレッドも、ポインタlist_head26104をループの初めに独立的に変更することができる。以降のアクセス時に、サーチされるアイテムが調べられた最初のアイテムに更になりがちである。これは、スレッドが探している要素を見出すごとに、図10Cにおける破線26312により示されるようにループに対する次のアクセス時に次のスレッドがアクセスされた最後の要素へ向けられるように、このスレッドがポインタlist_head26104を書き換えるゆえであり、仮定はこれが再び必要とされる可能性が最も高いことである。
本発明の当該実施の形態では、スレッドがアクセスされた最後の点においてループにアクセスし、これが必要とする要素を見出すまでループを循環し続ける。1つ以上のスレッドがこの状態を同時に行い、各スレッドがアクセス時に遮断する試みにおけるポインタlist_headを書直すならば、これは問題にならない。2つのスレッドが同時にポインタlist_headを変更しようとするならば、この変化が生じる順序は、各変更がアトミックであるかぎり問題ない。この変化は非常にしばしばアトミックであるが、もしそうでなければ、そうなるように容易に保証され得る。ミューテックスを設けることよりも項の計算時にポインタを(自動的に)変更することの方がはるかにやさしい。
スレッドが付加または削除を必要とするならば、別のスレッドが同時に同じことを試みるのを阻止するためミューテックスが介挿される。しかし、ミューテックスが読出し専用スレッドには適応しないので、読出しスレッドは妨げられない。読出しスレッドに対する修正はアトミックに見えるが、修正をアトミックに変更することはできない。
上記プロセスにおいて、first_ptrはステップ11においてptrに等しくセットされ、これは更にステップ10においてlist_headに等しくセットされ、ステップ19におけるテストがlist_headではなくfirst_ptrに関して行われ、その結果異なるスレッドは、その間ステップ13と19間でループを阻止することなくlist_headを変更することができ、おそらくはループにおけるエントリの全てのキーをテストする。
リストが無秩序であるがリストのサーチにおいて見出される最後のアイテムもまたリストが次にサーチされるときについて問い合わされる環境においては、先に述べたようにlist_headを変えることにより、サーチにおいて尋ねるノード数を減らし、従ってサーチ時間を減らす。
このような環境の一例は、チェーンを持つハッシュ・テーブルを用いてソース・ジャバおよび任意の相当コンパイル・ホスト・コードにおけるバイト・コード間をマップする。
無秩序なリストに多くの、例えば約10,000あるいはそれ以上のノードがあることはあまりない。このようなサイズの1つのリストにおけるサーチ時間が異常に長くなるので、1つのチェーンをこのような多数ノードで形成することは実用的でない。従って、それぞれが管理可能なノードまたは要素の数を持つ個々のチェーンを生成することが実際的である。コンピュータ・システムは、ビジット・スレッドを正しいチェーンへ送るためある種のアドレス指定装置またはソフトウエアを必要とする。
2つのチェーンしかない場合は、基本的な事例を選択するためには、キーについての1回のテストで充分である。このテストは、キーが偶数であればバケットの1つのチェーンを指示し、キーが奇数であれば異なるチェーンを指示することを含む。当該システムは、チェーン当たり比較的少ないバケットがある場合に良好に働くことができる。しかし、規準は、チェーン当たり数十あるいは数百のバケットがざる場合であり、領域に10,000バケットがある場合は、管理するかなりの数のチェーンが存在することになる。このような状況は、索引テーブル(望ましくは、ハッシュ・テーブル)の使用により処理することができる。1つのチェーンを他のチェーンから分けて識別するには、素数による除算のようなキーについての簡単なテストを用いることができる。これは、略々同数のエントリがこのようなチェーンごとに割付けられる場合にも望ましい。このハッシュ・アルゴリズムは、適切に選定されることを必要とする。実行の決定は、通常、ハッシュをどれだけ広く規定するかについて必要である。
図10Dにおいて、先に述べた方法を実施するためのコンピュータ・システム26100は、ポインタlist_head26104およびエントリ26110、26112、、、26106を記憶するメモリ26102、メモリ26102をアクセスして方法を実施するプロセッサ26107、および方法の実施のためプロセッサ26107をプログラミングするためプロセッサ26107により読むことができるプログラムを含む記憶媒体26108を含んでいる。
上記のいずれかまたは全てにおいて、本発明の幾つかの特徴は、コンピュータ・ソフトウエアを用いて実現された。しかし、当業者には、これらの特徴のいずれもハードウエアまたはハードウエアとソフトウエアの組合わせを用いて実現されることが無論明らかであろう。更に、ハードウエア、コンピュータ・ソフトウエアなどにより行われるファンクションが電気信号などにおいてあるいはこれを用いて行われることが容易に理解されよう。
情報の記憶に関する特徴は、適切な記憶場所またはストアによって実現されよう。情報の処理に関する特徴は、ソフトウエアまたはハードウエアにおいて、あるいは両者の組合わせにおいて、適切なプロセッサあるいは制御手段によって実現されよう。
本文において用いられるように、用語「コンピュータ・システム」は、「コンピュータ」、「システム」、「装備」、「装置」、「マシン」などの用語と互換であり得る。コンピュータ・システムは、仮想マシンであり得、あるいは仮想マシンを含み得る。
上記のいずれかあるいは全てにおいて、方法および装置の特徴および特質を含む上記の異なる特徴および特質は、任意の適切な方法で組合わされよう。
本発明が本文において純粋に事例として記述され、細部の修正が本発明の範囲内で可能であることが理解されよう。
本文の記述、および(適切な場合に)請求の範囲および図面において開示された各特徴は、独立的に、あるいは任意の適切な組合わせにおいて提供されよう。
本発明は、特定仕様の特定のiplであるコンピュータ・コードのテストに関する。望ましい実施の形態においては、本発明は、自動テストおよび仮想マシンにおける動的にコンパイルされたコードの検証のための方法に関する。
動的にコンパイルされたコードにおけるエラーは、エラーが実際に生じた後も長い間しばしば顕われて、真の原因を識別することを困難にする。エラーは、これが生じるとき良性に見える(例えば、すぐに使用されない誤った計算)が、その影響は招来のある時点またはイベントにおいて(例えば、正しくない値が使用されるとき)ひどいことになるおそれがある。
ダイナミック・コンパイラに対する最適化を変更および(または)付加するとき、結果として生じたコードが正しいことを立証するのは難しい。従って、本発明は、このようなエラーについてテストすることに関する。
先に述べたばかりの手法についての改善である別の公知の手法では、2つの実行エンジンが同じプロセス内で用いられ、その結果が比較される。1つの実行エンジンは信用さ成果構成(マスタ)であり、他方はテスト中の成果(スレーブ)である。このテスト・プロセスは、1つのスレッドのあるアプリケーションに限定され、実行エンジンを逐次走らせねばならないため、かさ高であると共に時間がかかるものであり得る。このプロセスは、初期の状態(状態1)をセーブし、マスタの一部を走らせ、マスタの最終状態(状態2)をセーブし、状態1を復元し、スレーブの一部を走らせ、次いでセーブされた状態2に対してスレーブの最終状態を調べて矛盾を検出するものである。
(インシニア社の)Softwindowにおいて実現されるテスト手法は、今概要を述べたばかりのタイプのものであった。その目的のためには有効であっても、この手法は単一のスレッド環境にのみ適応し得ること、およびCPUエミュレータに用いられるとき、ただ大きいだけの実行能力を持つものであったことにおいて、限定されたものであると言うのが順当であろう。マスタおよびスレーブに対するこの実行能力は、逐次行われねばならないテストと同じ実行能力にあった。更に、このテスト手法は、マスタとスレーブ間に自らバグおよび不統一性をもたらし得る。状態の比較がなされた点は、たかだか制御の移転に過ぎないものであった。
いったん識別されたエラーの原因を識別するための手法は、テスト中のシステムをしばしば障害の挙動を変更しあるいは(一時的に)取除く程度に混乱させる傾向がある。従って、本発明の目的は、望ましくはダイナミック・コンパイラにより生じた実行可能コードの各部をテストするための、より迅速でより信頼し得るシステムおよび方法を提供することである。
アンチ・アリアシングの第1の特質は、別の成果であるコンピュータ・コードの第2の部分に対し特定仕様の成果であるコンピュータ・コードの第1の部分をテストする方法を提供し、該方法は、コードの両部分における対応同期点を規定し、コードの両部分を実行し、同期点におけるコードの両部分により生じる状態を比較するステップを含んでいる。
多くの場合、コードの第1の部分は仕様の信用される成果(マスタ)であり得るが、コードの第2の部分はテスト中の成果(スレーブ)であり得る。
生じた状態において矛盾が見出されると、この矛盾は、前の同期点以降にコードの2つの部分により生じた挙動が異なっていることを示す。最後の同期点以降にスレーブにより実行されたコードは、容易に識別することができる。
矛盾が見出されると、この矛盾は、コードの1つ(あるいは、おそらくは両方)の部分がエラーを含むことを示す。このエラーは、これが単に新しく、更に複雑でかつ信用されるマスタよりテストされ易くないゆえに、一般にスレーブにおいて見出されるが、この方法は、スレーブが正しいかあるいは少なくとも別の点で正しくないものとすれば、信用されるマスタにおけるエラーを識別し得る。
コードの第1および第2の部分がそれぞれ第1および第2の異なる実行能力により、例えば、別のアドレス・システムおよび別のスタックを持つマシンにより実行されることが望ましい。
コードの第1および第2の部分がそれぞれネイティブな方法またはファンクションを含む場合は、コードの第2の部分により要求されるこのようなネイティブな方法またはファンクションの少なくとも1つが第1の実行能力(例えば、マスタ)により実行され、その結果は第2の実行能力へ戻される。この場合は、方法が第1の実行能力から第2の実行能力へ第1の実行能力により実行されるべきこのようなネイティブな方法またはファンクションのリストを与えるステップを更に含むことが望ましい。
コードの第1の部分における各同期点における比較ステップにおいて、第1の実行能力(望ましくは、マスタ)が、コードの第2の部分における対応する同期点において第2の実行能力の状態を調べる。コードの第2の部分における同期点ごとに、第2の実行能力(望ましくは、スレーブ)が最新のものでないその状態要素の少なくとも一部の値をセーブし、これらの状態要素の値を更新し、その状態要素の値を第1の実行能力へ移し、それから更新された状態要素のセーブされた値を復元する。
効率を増すために、コードの第1および第2の部分は並列に実行されることが望ましい。
本発明のこのような特質は、動的にコンパイルされるコードの各部に対して特に適用し得る。
コードの第1および第2の部分がそれぞれ実行の複数のスレッドを有する場合は、コードの第1および第2の部分により生じる対応するスレッド間に対応が識別されることが望ましく、このような場合、対応する同期点はこのような対応するスレッドにおいて規定されることが望ましい。
プログラミング言語がジャバであり、同期がスレッド単位で行われることが望ましい。特に、複数の非同期的に処理されるスレッド対があることが望ましい。
また、コードの第1および第2の部分により動的に割付けられる対応するオブジェクト間に対応が識別されることが望ましい。
本発明の第2の特質は、本発明の第1の特質の方法を行うようプログラムされたコンピュータ・システムを提供する。
本発明の第3の特質は、対応する同期点がコードの両部分において規定される同じ仕様の異なる実現であるコンピュータ・コードの第2の部分に対して特定仕様の実現であるコンピュータ・コードの第1の部分をテストするコンピュータ・システムを提供し、該システムは、コードの両部分を実行する手段と、同期点におけるコードの両部分により生じる状態を比較する手段とを含む。
本発明の第4の特質は、対応する同期点がコードの両部分において規定される同じ仕様の異なる実現であるコンピュータ・コードの第2の部分に対して特定仕様の実現であるコンピュータ・コードの第1の部分をテストするコンピュータ・システムを提供し、該システムは、コードの第1の部分を実行する第1の実行能力と、コードの第2の部分を実行する第2の実行能力とを含み、該第1の実行能力が同期点におけるコードの両部分により生じる状態を比較するようにも動作可能である。
本発明の第4の特質において、第1および第2の実行能力は、それぞれ第1および第2の異なる仮想マシンにより提供されることが望ましい。
本発明の第3または第4の特質による装置は、本発明の第1の特質の方法を行うようにプログラムされることが望ましい。
本発明の第5の特質は、特定仕様の実現であるコンピュータ・コードの第2の部分と、対応する同期点がコードの両部分に規定される同じ仕様の異なる実現であるコンピュータ・コードの第2の部分とが記録されたコンピュータの記憶媒体を提供する。
特に仕様がジャバ・バイト・コードに対する実行エンジンである場合は、2つの成果が異なる仮想マシン(VM)へ構築されることが望ましい。信用される成果を含むVMはマスタVMと呼ばれ、テスト中の成果を含むVMはスレーブと呼ばれる。両方のVMは、同じアプリケーションを実行し、仮想マシンの状態を交換して比較するため既知の同期点で相互に通信する。
上記システムおよび方法において、同期点がコードの長さに(および、望ましくはこれに比例して)(少なくとも部分的に)従って選択されることが望ましい。このことは、テスト中でないときなどに同じ最適化を行う最良の機会をダイナミック・コンパイラに与え、従って律動を減じる。
本発明の特定の実施の形態においては、スレーブVMは最小限の律動を生じ、障害のある挙動を変化させる可能性を減じる。また、各実現により操作される状態は、他の実現により操作される状態とは独立している。更に、スレーブVMは、本発明に対して少ない余分なリソースを要求し、その安定性を増加する。
本発明の実施の形態においては、スレーブVMにおけるテストされない実現における負担は低減される。明らかなように、テストされない実現における負担は、これも以下に述べる同期点における最終状態で信用される実現へ単に移転される。テストされない実現は、能動的な役割を演じるのではなく、有効に受動的になり、信用される実現により要求される如きデータのみを信用される実現へ送る。両方の実現は同じ初期の状態で始動し、従って同期点は予測し得る。更に、信用される実現は通常、強力な目標マシン上で走り、その結果マスタVMは重装備となり得るが、テスト用の実現は比較的小さな、おそらくは手持ち型の目標マシン上で走らせ得る。通常は、スレーブVMが走らせられる目標マシンへマスタVMをポートする必要はない。
本発明はまた、同じ仕様の別の実現に対して特定仕様の1つの実現をテストする方法を提供し、該方法は、
両方の実現における対応する同期点を規定し、前記1つの実現と前記類似の実現とを実行し、同期点においてコードの両部分により生じる状態を比較する
ステップを含んでいる。
本発明はまた、特定仕様の1つの実現を同じ仕様の異なる実現に対してテストするコンピュータ・システムを提供し、該システムは、両方の実現における対応する同期点を規定する手段と、実現を実行する手段と、同期点において両方の実現により生じる状態を比較する手段とを含んでいる。
本発明の任意の特質の特徴のいずれか、あるいは部分、あるいはその全てが、他の任意の特質に対して適用し得る。
本発明の望ましい特徴については、純粋に事例として、添付図面に関して次に記述する。
当該方法は主としてジャバの仮想マシンに対して開発されたが、使用される手法は更に一般的に適用し得る。当該テスト手法の実現におけるコード・バッファ形態およびコード断片をそれぞれ示す図11Aおよび図11Bを参照する。
同期点の選択
両方のVMは、同じ同期点を使用しなければならない。適切な選択は、下記の全てまたは一部を含むことができる。すなわち、制御の条件付き移転、方法/ファンクション/手順の呼出し、方法/ファンクション/手順の戻し、および制御の逆方向の転送である。
仮想マシンが動的に割付けされるオブジェクトをサポートするならば、マスタVMおよびスレーブVMは、対応するオブジェクトがそれぞれのVMにおいて識別されることを保証しなければならない。
仮想マシンが多数のスレッドをサポートするならば、マスタVMおよびスレーブVMは、対応するスレッドが各VMにおいて識別されること、および各スレッドが独立的に同期されることを保証しなければならない。
仮想マシンがネイティブな方法またはファンクション(すなわち、仮想マシンの実行エンジンを介してではなく、直接的に実行されるもの)をサポートするならば、大半はもっぱらマスタおよび戻り値において実行されねばならず、任意の必要な副作用はスレーブへ送られねばならない。例えば、時刻を返すネイティブなファンクションは、つねにマスタ上で実行されることになる。これは、2つの異なるマシン(この文脈においては、VM)上で走るクロックが正確に同期していたならば、実際にまれなイベントであるゆえであり、複雑なテスト手法におけるこのような矛盾に供するのは無意味な高価なふるまいとなるゆえである。一方、仮想マシンから抜けさせるネイティブなファンクションは、マスタとスレーブの両者で実行されるべきである。これらの基本的な注意が然るべく払われなければ、スプリアスな同期エラーが生じ得る。マスタは一般にこれだけが行い得るファンクションのリストを含み、これがスレーブに対して、スレーブがこのファンクションを走らせることを許容されたかどうかを知らせ、あるいはもしそうでなければ、他の動作を行うことを必要とするものを知らせる。ジャバの仮想マシンの場合は、ネイティブな方法がジャバで書かれた方法における呼出しを行う。ネイティブな方法自体が両方のVM上で実行されているか、あるいはもっぱらマスタで実行されているかのいかんに拘わらず、このようなジャバ方法は両方のVMにおいて実行されねばならない。
マスタの(信用される)仮想マシンは、仮想マシンの状態の全ての読みと仮想マシンの状態の全ての修正を記録するため重装備である。
各実行スレッドは、スレーブVMにおける対応する実行スレッドと独立的に同期する。基本的な同期ループが、下記の先頭のプレスレッド同期ループに示される。
プレスレッド同期ループ
同期点において、マスタが前の状態「SB」メッセージをスレーブへ送り、スレーブがいったん対応する同期点に達すると対応する後の状態(SA)メッセージをスレーブから受取るまで待機する。マスタがSAメッセージをスレーブから受取ると、マスタは、前の同期点が正しいタイプと値を持って以来全ての仮想マシンの状態アイテムがスレーブにより書込まれたことを調べる。どれかのアイテムが正しくなければ、エラーをユーザに対してただちに送るかあるいは後の検査のためバッチすることができる。次に、マスタは同期ループの次の繰返しへ進むことができる。
多くの実施の形態において、マスタはコードの実行のためインタプリタを使用する。ダイナミック・コンパイラをスレーブVMにおいてテストすることができる。あるいはまた、マスタとスレーブはともに、コードのコンパイルされたバージョンを走らせることができ、あるいはともに、例えばスレーブVMにおける新たなインタプリタをテストするためコードを解釈することもできる。
スレーブ仮想マシン(テスト中のVM)は、前の同期点以来書かれた状態アイテムのタイプおよび値を集めてマスタへ送るることができるように、その仮想マシンの状態を最新の状態に保持し、あるいは同期点で容易に更新可能に保持しなければならない。スレーブの通常の動作モードに対する摂動を最小化する方法で、このような要件が実現されることが非常に重要である。スレーブが最適化ダイナミック・コンパイラを含むときは、通常の動作において生じるコードに比してテストするとき異なるコードを生じないことが特に重要である。
これは、コンパイル・コードが正しい場所になければ必要な状態を利用可能にし易いときと一致するよう同期点の慎重な選択の組合わせ、および同期点においてダイナミック・コンパイラにコードの特殊な断片を生成させて、まだ最新でない任意の状態アイテムの内容をセーブし、これらアイテムを更新し、SAメッセージを生成して送り、最後に同期点に対して特に更新されたこれら状態アイテムのセーブされた内容を復元することによって達成することができる。
同期点に対する望ましい選択については、すでに述べた。しかし、制御の各移転が必ずしも同期点として選択される必要がないことを更に述べねばならない。バイト・コードの各点を用いることも可能であるが、摂動のリスクも増加される。同期点の選定における重要な特徴は、これら同期点がその時の状態が例えば全ての要素がそれらの本来の状態にある場合に容易に識別できるか、あるいはその状態に容易に置くことができる点でなければならないことである。通常は、ある部分内の要素の順序が実行の結果として変更され、スレーブとマスタの実現に対する共通の参照点がなくなるので、実行の部分内の点を選定することはできない。同様に、同期点は、エラーがこれら同期点間のコードの集まりが、エラーがその集まりにおいて生じるならば、有効な検査にはおそらく大きくなり得るので、あまりかけ離れて選択してはならない。
これらの理由から、同期点において、実行が「ピグライヤ(piglier)」と呼ばれるコードの別の断片へ外れることが望ましく、そのファンクションは必要な状態を更新することである。同期およびデータの必要な移転がいったん完了すると、ピグライアは更新に遭遇し、コンパイル・バージョンへ戻る。この状態においては、バグがコンパイル・バージョンへインポートされあるいはこれから除かれることがないことが重要である。
典型的なコード・バッファの形態が図11Aに示され、同図において、その左側が全般的な概略を示し、右側は同期点周囲に含まれるコード・バッファの内容を示している。
コードの生成時に、コンパイラが、同期点を検出するまで、断片コードを通常のように配置する。コンパイラは、その状態をこの点にセーブし(すなわち、図11Aにおける「ダイナミック・コンパイラの状態A」)、次いでピグライア7106自体およびこれに対するジャンプ(すなわち、「JMPピグライア」)を配置する。ピグライア7106に対して配置されたコードは、最新ではないがこの同期点に対するものである必要があるVM状態要素をその時の内容を除いてセーブするコード、これらの状態要素を更新するコード、SAメッセージを送るファンクションに対する呼出し、VMの状態要素の前の内容を復元するコード、およびセーブされたコンパイラの状態(ダイナミック・コンパイラの状態A)を復元するのに必要な任意のコードからなる。例えば、同期点が所与のレジスタにおける特定の値を持つ前の断片コードおよびピグライア・コードがレジスタにおける値を変更すると、あるコードが前記レジスタの元の値を復元するように配置される。ピグライア7106に配置された最後のコードは、「JMPピグライア」命令に続く断片コードへ戻るジャンプである。
同じプロセスであるがこの時は断片に関して表わされるプロセスが、ピギング状態がない場合とピギング状態がある場合の状態で図7Bに示される。このような概略図から判るように、同期点SPのいずれかの側のコード部分はBおよびCで示される。「ピギング状態でない」場合は、コード生成時のSPにおけるダイナミック・コンパイラの状態は、「ダイナミック・コンパイラ状態R」と呼ばれる。「ピギング状態」の場合は、ダイナミック・コンパイラは、コード部分BおよびCが「ピギング状態でない」場合にそれぞれ生成されるコード部分BおよびCと同じにるように、従って「ピギング状態」の場合におけるピグライア・コードの生成の前と後の両方のダイナミック・コンパイラの状態が「ピギング状態でない」場合における同期点SPにおける「ダイナミック・コンパイラ状態R」と同じになるように、コードを生成しなければならない。このことは、生成されたコードが実行されるときピグライアの実行が実質的にトランスパレントであり生成された断片コードにおける副作用がないことを保証する。
ピグライアが行内で実現されることがあり得るが、デバッグを試みるときは役にたたず、エラーが生じた同期点間のコード部分を識別して調べることを更に困難にするので、望ましい選択ではない。
ピグライアにおいてなされる処理が多くなるほど、状態を復元することが難しくなることが一般的である。また、同期点が頻繁になるほど、エラーの生じる可能性が大きい場合に最適化をオフにすることなく同じコードを走らせることが困難になる。
同期点に対する望ましい選択は、制御の前後両方向における、また任意に呼出し点における、条件付き移転である。これは、ファンクション/方法を戻すためには望ましいことではない。
仮想マシンが多重スレッドであるならば、マスタおよびスレーブのVMは各実行スレッドを個々に同期させる。これらVMは、両方のVMにおける対応する実行スレッドを識別し、かつスレッドのような重要点においてメッセージを交換し、状態の変化と生成を監視する方法を持たねばならない。
同期に関しては、所与の開始スレッドがあり、従ってマスタおよびスレーブにおける開始条件が判る。別のスレッドの生成時のスレッドの挙動は、スレッドの生成/停止の順序のように予測し得る。従って、マスタとスレーブ間のメッセージの交換がスレッドの始動点で生じることが可能である。
マスタ・スレッドAがスレッドBを生成するとき、スレーブにおける対応するスレッドAが生じる次のスレッドがBでもある(あるいは、Bでもあるべき)ように、情報がスレーブへ送られる。マスタ(および、スレーブ)は、マスタ・スレッドのアイデンティティ(例えば、「スレッドBはすなわち5」)と、メッセージの交換のため使用することができるスレーブ・スレッドのアイデンティティ(例えば、「マイスレッドBはすなわち5」)とを含むテーブルを作成する。同じ原理が、オブジェクトの生成のために用いられる。マスタおよびスレーブ間に送られるSAおよびSBのメッセージは、送る側のスレッドのアイデンティティを含まねばならない。
当該方法に要求される通信は、任意の適切な駆動機構、例えばソケットまたはネームを付したパイプの先頭において実現することができる。
信用される実現に対して用いられるVMがピギングをサポートするため特に構築されたVMであることが望ましい。VMはピギング以外に用いることができるが、一般に速度が遅くなる。テスト中実現のため用いられるVMがピギングおよびピグライアをサポートするため特に構築されたVMであることが望ましい。
上記のいずれかあるいは全てにおいて、本発明の幾つかの特徴がコンピュータ・ソフトウエアを用いて実現された。しかし、当業者には、これらの特徴のいずれもハードウエアあるいはハードウエアとソフトウエアの組合わせを用いて実現されることが無論明らかであろう。更に、ハードウエア、コンピュータ・ソフトウエアなどにより行われファンクションが電気信号などにおいてあるいはこれを用いて行われることが容易に理解されよう。
情報の記憶に関する特徴は、適切な記憶場所またはストアにより実現されよう。情報の処理に関する特徴は、ソフトウエアまたはハードウエアにおいて、あるいは両者の組合わせにおいて、適切なプロセッサまたは制御手段によって実現されよう。
上記のいずれかあるいは全てにおいて、本発明は、下記の形態のいずれか、あるいは一部、あるいはその全てにおいて具現され、コンピュータ・システムを動作させる方法において具現され、コンピュータ・システム自体において具現され、コンピュータ・システムを動作させる方法を実行するようプログラムされあるいは構成されるときコンピュータ・システムにおいて具現され、および(または)コンピュータ・システムを動作させる方法に従って動作するためのプログラムが記録されたコンピュータ読取り可能な記憶媒体において具現されよう。
本文に用いられるように、用語「コンピュータ・システム」は、「コンピュータ」、「システム」、「装備」、「装置」、「マシン」などの用語と互換であり得る。コンピュータ・システムは、仮想マシンであり得、あるいは仮想マシンを含み得る。
上記のいずれかあるいは全てにおいて、方法および装置の特徴および特質を含む上記の異なる特徴および特質は、適切な方法において組合わせされよう。
本発明が本文において純粋に事例として記述され、細部の修正が本発明の範囲内で可能であることが理解されよう。
本文の記述、および(適切な場合)請求の範囲および図面において開示された各特徴は、独立的に、あるいは任意の適切な組合わせにおいて提供されよう。
本発明は、1つの特質において、コンパイル・コードの第1の部分からコンパイル・コードの第2の部分までリンクを生成する方法と、コードをコンパイルする方法とに関するものである。本発明は、別の特質において、コンパイル・コードの一部を削除することを許容するためコンピュータ・システムにおけるメモリを調べる方法および装置に関し、かつ特にコンパイル・コードの各セクション間にリンクが存在する場合にコンピュータ・システムにおいてコンパイル・コードを削除する方法および装置に関する。本発明は、自己修正する多重スレッド環境に対する特定の(これに限定しないが)用途を有する。望ましい実施の形態においては、本発明は、多重スレッド型の断片パッチングに関する。
自己修正環境においては、コードの2つの部分間に実行の移転を可能にするため、コンパイル・コードの第1のセクションと作業スペースのどこか他の場所に置かれるコンパイル・コードの第2のセクション間にリンクが作られねばならない状況があり得る。コードの1つの部分から他の部分へ実行を移転するプロセスは、一般に、レジスタ値と共にスタックにおけるコードの第1の部分のアドレスを置き、コードの第2の部分の場所を識別するコードの中間部分へ実行を移転し、次いでコードの第2の部分へ実行を移転する多くのステップを呼出す。このように実行を移転することの問題は、比較的多くの時間が移転の実施に費やされることである。
本発明の第1の特質において、自己修正多重スレッド型コンピュータ・システムにおいてコンパイル・コードの2つの部分間にリンクを設ける方法であって、コンパイル・コードの1つの部分から他の部分へパッチを挿入することを含む方法が提供される。
コンパイル・コードの1つの部分から他の部分へパッチを提供することにより、パッチが作らなかった場合より迅速に実行が移転することができる。
パッチを挿入するステップは、コンパイル・コード内の制御移転命令を変更することを含む。制御移転命令は、ジャンプ命令または呼出し命令のような、実行を別のアドレスへ移転させる任意の命令でよい。この制御移転命令は、パッチが行われるコードの部分のアドレスを指示するように変更することができる。
制御移転命令の変更ステップは、アトミックに行われる。アトミックにとは、他のスレッドが部分的に変更される形態において変更される領域を見ることができないことを意味することが望ましい。これは、パッチを挿入するステップが1つの書込み動作として行われることを保証することにより、単一プロセッサ・システムにおいて達成される。あるいはまた、一部のプロセッサは、アトミック性を保証するよう定義される1つ以上の特殊な命令あるいは一連の特殊な命令を提供し、このような命令は単一プロセッサ・システムおよび多プロセッサ・システムにおけるアトミック性を保証するため用いられる。このように、作業スペースに影響を及ぼすかも知れない他の任意の動作が行われる前にパッチの操作が完了することを保証することができる。
本発明の第1の特質は、自己修正多重スレッド型コンピュータ・システムにおいてコンパイル・コードの2つの部分間にリンクを設ける装置であって、コンパイル・コードの1つの部分から他の部分へパッチを挿入する手段を含む装置をも提供する。
このように、特に他のパスを実行することを可能にするため、コンパイル・コードは、コードがコンパイルされた後に、コードの別の部分に対するパッチを行うことができるように構成することができる。
制御移転命令は、この制御移転命令の最も最適な形態が用いられた場合よりもそれ自体のアドレスとは更に別のアドレスを指示できるタイプであることが望ましい。このような特徴は、パッチが他の場合よりも離れたコードの部分にさせ得る。
当該方法は、制御の転送命令を含むコードの外部のセクションを形成することを含む。
本発明の第1の特質はまた、コンパイル・コードの上記方法のいずれかを実施するためのコンパイラを提供する。
ある状況では、例えば、コンパイル・コードの部分を含むコード・バッファが削除されるゆえに、あるいはコンパイル・コードの部分の付近になされた場合に家庭が有効でないことを証明するゆえに、パッチを取除くことが望ましいかあるいは必要となる。
このため、本発明の第2の特質において、自己修正する多重スレッド型コンピュータ・システムにおけるコンパイル・コードのセクションを含むメモリを調べる方法であって、コンピュータ・システムに対するパッチを識別し、このようなパッチのいずれかを指向し直すことを含む方法が提供される。当該方法は、例えば、コンパイル・コードの1つのセクションが削除されるゆえに、あるいはコンパイル・コードのセクションがもはや使用されないゆえに、実施される。パッチの指向し直すことで、コンパイル・コードのセクションなしにパッチにおいて実行を持続することを可能にする。
本発明の第2の特質は更に、自己修正多重スレッド型コンピュータ・システムにおけるコンパイル・コードを削除する方法であって、削除されるコンパイル・コードのセクションを選択し、コンパイル・コードのセクションに対するパッチを識別し、このようなパッチを指向し直し、コンパイル・コードの部分を削除することを含む方法を提供する。
このようなパッチがコンパイル・コードのアドレスへ指向されることが望ましい。このコンパイル・コードは、コードのセクションなしに実行を継続することを可能にする。コードの継続は、以降の命令の解釈を行うように構成され、あるいはディスパッチ・テーブルの移転を行うように構成される。
パッチを指向し直すステップは、パッチ動作が部分的にのみ完了されるとき他のスレッドがパッチされる場所をアクセスできないことを保証するためアトミックに行われることが望ましい。代替的な解決法は、パッチが指向しなお割れた間に全ての実行するスレッドを停止させることであるが、これはスレッドが停止される間実行時間が失われるゆえにそれほど望ましくない。
コンパイル・コードの部分へゆくパッチを識別するために、当該方法は、コンパイル・コードのセクションのアドレスのハッシュ値を計算し、コンパイル・コードのセクションに対するパッチを識別するためパッチ・ブロックのハッシュ・テーブルを調べることを含む。
有効なメモリ使用の関心では、(コード・バッファからのパッチのような)使用されないパッチは削除されるべきであり、従ってパッチと関連するオーバーヘッドを再生することができる。従って、当該方法は、コンパイル・コードのセクション外のパッチを識別し、このようなパッチを取除くことを更に含むことが望ましい。
このため、本発明の第2の特質は、コンパイル・コードのセクションが削除されるべきとき自己修正する多重スレッド型コンピュータ・システムにおけるメモリを調べる方法であって、コンパイル・コードのセクション外のパッチを識別し、このようなパッチを取除くことを含む方法をも提供する。
メモリを調べる方法は更に、
コンピュータ・システムにおけるスタックのフレームを調べ、
削除されるコンパイル・コードのセクションのアドレスの範囲内にあるリターン・アドレスをフレームが含むかどうかを識別し、
このようなリターン・アドレスが識別されるとき、フレームの内容を変更する
ステップを含むことが望ましい。
コンピュータ・システムにおけるスタックのフレームを調べ、
コンパイル・コードのセクションのアドレスの範囲内にあるリターン・アドレスをフレームが含むかどうかを識別し、
このようなリターン・アドレスが見出されると、フレームの内容を変化し、
コンパイル・コードのセクションに対するパッチを識別し、
このようなパッチを指向し直す
ステップを含む方法をも提供する。
このように、本発明の第2の特質は、エージェント資料第6に記載される本発明の1つ以上の特質の1つ以上の特徴を含むことが望ましい。
当該方法は更に、コンパイル・コードのセクション外のパッチを識別し、このようなパッチを取除くことを含むことが望ましい。
フレームの内容の変更および(または)パッチの指向し直しが、例えば、削除されたコードへのパッチまたは戻りが実行中に見出されるときではなく、コンパイル・コードのセクションの削除の時間に行われることが望ましい。
本発明の第2の特質は、自己修正する多重スレッド型コンピュータ・システムにおけるメモリを調べる装置であって、コンパイル・コードの部分に対するパッチを識別する手段と、このようなパッチを指向し直す手段とを含む装置をも提供する。このように、実行は、コンパイル・コードのセクションのないパッチにおいて継続する。
本発明の第2の特質は、自己修正する多重スレッド型コンピュータ・システムにおいてコンパイル・コードを削除する装置であって、削除されるコンパイル・コードのセクションを選択する手段と、コンパイル・コードのセクションに対するパッチを識別する手段と、このようなパッチを指向し直す手段と、コンパイル・コードのセクションを削除する手段とを含む装置をも提供する。
当該装置は、コンパイル・コードのセクションのアドレスのハッシュ値を計算する手段と、コンパイル・コードのセクションに対するパッチを識別するためパッチ・ブロックのハッシュ値を調べる手段とを含むことが望ましい。
当該装置は更に、コンパイル・コードのセクション外のパッチを識別する手段と、このようなパッチを取除く手段とを含むことが望ましい。
本発明の第2の特質は、コンパイル・コードのセクションを削除させるため自己修正する多重スレッド型コンピュータ・システムにおいてメモリを調べる装置であって、コンパイル・コードのセクション外のパッチを識別する手段と、このようなパッチを取除く手段とを含む装置をも提供する。
1つの特質の特徴は他の特質に適用され、同様に、方法の特徴は装置に適用され、およびその逆も真である。
本発明の望ましい特徴については、純粋に事例として、添付図面に関して次に記述する。
エージェント資料第1に記載されるように、ダイナミック・コンパイルが、方法全体ではなくコンパイルされる方法においてコードの断片を結果として生じる。コンパイルされる当該断片は、例えばソース・プログラムのランタイム表示および実行履歴情報から決定されるような主パスに対応する。以降の段階において、コードの他の断片は、例えば、主パスについてなされた元の仮定が正しくないことを証明する場合にコンパイルされる。
一例として、コードが条件付き制御移転命令(条件付き分岐命令または条件付き呼出し命令のような)を含むならば、コンパイラは、移転が行われ易いかどうかを判定し、次いで最も後続し易いパス(主パス)に対応するコードをコンパイルする。しかし、実行中は、実際には他のパスによるべきものと判定される。このような状況においては、移転命令に遭遇すると、実行は「グルー・コード」として知られるコードの部分へ移る。追従されるパスがコンパイルされなかったならば、グルー・コードがとられるべきパスにおける以降の命令の解釈を生じる。解釈されたパスがある回数だけ追従されると、コンパイラがコードの部分がコンパイルの価値があるものと判定し、次いでコードのコンパイル・バージョンを生じることになる。
これにより、自己修正環境が生成され、これにおいては、コンパイル・コードの部分が実行中に動的に生成され(あるいは、削除され)る。このような環境は、典型的に、幾つかのプロセスが同じ作業スペースにおいて同時に動作する多重スレッド型である。
望ましい実施の形態によれば、このような状況では、コードの新たにコンパイルされるセクションへのコードの元のセクションにおける移転命令から、パッチが行われる。このパッチは、コードの新たにコンパイルされるセクションのアドレスへ直接コードを移転させるように、転送命令を修正する。パッチが行われることを許容するため、コンパイルの時点において、必要ならば、パッチが後の段階で挿入できるようにコンパイル・コードが構成される。これは、例えば、元のコンパイル・コードに対して必要であるよりも長い形態の移転命令をコンパイルすることによって行われ、コードの更に離れた部分への転送を後の段階で行わせる。
パッチはまた、必要ならば、コードの新たにコンパイルされるセクションから再びコードの元のセクションに対しても行われる。
多重スレッド環境においては、先に述べたようなパッチングがアトミックに、すなわち単一命令として行われる必要があり、従って他のスレッドが複数の変更形態において変更される領域を見えないことに注意すべきである。従って、コードは、パッチをアトミックに行うことができるように構成される。アトミック性を保持するため、パッチングは1回の書込み操作として行うことができる。あるいはまた、あるプロセッサは、アトミック性を保証する1つ以上の特殊な命令または一連の特殊命令を提供する。多プロセッサ環境においては、パッチされる場所のアドレスは、おそらくは、多くのプロセッサにおいて、(アドレスが動作サイズの整数倍になるように)パッチ・データのサイズに従って整合されることを必要とする。
図12Aにおいて、第1のコード部分23002は、アドレスaaaに呼出し命令23003を有する。元の非ネイティブ・コードでは、この呼出し命令はサブルーチン「バー」を呼出した。コンパイルの間、このサブルーチン「バー」は、(例えば、バーのどのバージョンが使用されるかが確かでなかったゆえに)コンパイルされなかったが、その代わり、バーが呼出される状況を処理するため外部コード23004の部分が作成された。呼出し命令23003は、外部コードにおけるアドレスabdを指す。このアドレスでは、実行をグルー・コードの部分へ移す呼出し命令23005が存在する。グルー・コードは、バーのコンパイル・バージョンが存在しなければ、サブルーチン・バーを翻訳させる。このため、呼出し命令23003が実行されると、グルー・コードが呼出される。
次に図12Bにおいて、ある後の時点に、サブルーチン・バーがコンパイルされる。バーのコンパイル・バージョンは、当例ではアドレスxyzにコンパイル・コード23006として格納される。次に、パッチ23008は、直接にあるいは外れたコード23004を介して、コード断片23002からコンパイル・コード23006に対して行われる。
図12Bは、パッチが直接行われる場合を示している。この場合、呼出し命令23003が、直接アドレスxyzを指すように変更される。これは、呼出し命令23003がアドレスxyzにアトミックにパッチ可能である形態でコンパイルされたならば可能である。
図12Cは、アウトライア23004を介してパッチが行われる場合を示している。この場合、アウトライアにおけるアドレスabcのジャンプ命令23007がアドレスxyzへジャンプするようにセットされ、呼出し命令23003はアドレスabcを指すように変更される。あるいはまた、呼出し命令23003はアドレスabcを恒久的に指すことができ、この場合は、ジャンプ命令23007が(グルー・コードを呼出すため)最初アドレスabdを指し、次に(パッチを行うため)アドレスxyzを指すように変更される。
いずれ場合も、アドレスxyzを指すように変更される命令は、比較的離れたアドレスへの転送を許す長い形態である。このため、コードをコンパイルするとき、そのためのアローアンスがなされなければならない。例えば、呼出し命令23003は、この命令がアドレスabdを指すだけの場合に必要なよりも長いバージョンになるようにすることができ、命令を将来における更に離れたアドレスを指すように変更させる。命令がこれが指すアドレスをアトミックに変更させ得るタイプであることもまた保証されねばならない。
各パッチ時に、パッチに関する情報は、パッチが始まるコード・バッファ(メモリの領域)に記憶されるパッチ・ブロックに記録される。
図12Dは、コード23012の部分が条件付き分岐命令23013をアドレスaaaに含む事例を示している。コンパイルの間、コンパイラは、分岐命令が続いて起こりにくいと判定し、従って元の(非ネイティブな)分岐命令が指示したアドレスにおける命令が完了しなかったと判定した。このような仮定が間違っている状況に対処するため、コンパイラはアウトライア23014を挿入した。最初に、命令23013がアウトライアにおけるアドレスabdを指示する。このアドレスには、グルー・コードに対する呼出しが存在する。グルー・コードは、元の(非ネイティブな)分岐命令が指示したアドレスに命令を解釈させる。
後の段階において、例えばこれらの命令が実行されにくいという最初の仮定が正しくないことを証明したゆえに、分岐命令が指示する命令がコンパイルされる。これら命令のコンパイル・バージョンが、当例ではアドレスxyzに示される。パッチは、直接アドレスxyzのコンパイル・コードに対してなされる。これは、アドレスabcのジャンプ命令をアドレスxyzを指すように変更することにより、また命令23013をアドレスabcを指すように変更することによって行われる。あるいはまた、命令23013は恒久的にアドレスabcを指すことができ、このアドレスのジャンプ命令は最初にabdを指すことができ、次にxyzを指すように変更することができる。再び、コンパイル時に、パッチを行うように変更される命令は、パッチがアトミックに行うことができるようにセットアップされる。
このように、上記の手法の重要な特質が、パッチが後で挿入されるようにコンパイル・コードが構成されることであることが判る。これは、2つ以上の可能な実行パスがあり1つのパスのみがコンパイルされる場合、実行を比較的離れたアドレスへ移転するようアトミックに修正できる(呼出しまたはジャンプ命令のような)制御転送命令が存在することを保証することによって行うことができる。
先に述べたアウトライアもまた、コードのコンパイル・バージョンから制御を転送する前にレジスタおよび状態を更新するコードを含む。このようなアウトライアについては、エージェント資料第3に更に詳細に記載されている。
ある状況においては、行われたパッチを取除くことが望ましいか、あるいは必要である。例えば、ある段階では、コンパイル・コードの一部を含むコード・バッファを削除されることがある。これは、コード・バッファが他の場所で使用するため要求されるゆえか、あるいはコンパイルの間行われた仮定が妥当しないゆえである。また、特に制限されたメモリ環境で使用するときに、将来必要となることが予期されないコードを除去することが望ましい。コード・バッファに対するパッチが存在する場合、コード・バッファの削除は、すでに存在しないコードの部分に対するパッチを残すことになる。
先に述べたように、パッチが行われるとき、パッチに関する情報はパッチ・ブロックに格納される。各パッチ・ブロックは、これが関連するパッチの「から」アドレスおよび「へ」アドレスを与える。このパッチ・ブロックは、パッチが発生するコード・バッファにチェーンとして格納される。従って、各コード・バッファは、このブロックからのパッチに関してパッチ・ブロックのチェーンを有する。パッチ・ブロックは同時に、パッチがどれに対するものかに従って、第2のチェーン上で一緒に連鎖させられる。同時に、種々のチェーンに対するアクセスを許容するハッシュ・テーブルが維持される。ハッシュ・テーブルは、任意の機械的ファンクションに従って要素が分類される多数のブロックのチェーンからなるデータ構造である。ハッシュ・テーブルについては、エージェント資料第4に更に詳細に記述されている。
削除されるべきバッファへいくパッチを見出すために、ハッシュは(ハッシュ・テーブルと同じ数学ファンクションを用いて)、パッチがパッチ「へ」に関するパッチ・ブロックを含むチェーンを見出すために転送を生じるバッファのアドレスから作られる。チェーンにおけるパッチ・ブロックは、削除されるバッファに対するハッシュと関連するかどうかを知るために調べられる。このようなパッチ・ブロックが見出されると、これが関連するパッチが、例えばグルー・コードまたはアウトライア・コードの部分へ送り直され、パッチ・ブロック自体はチェーンから除去される。グルー・コードは、例えば、以降の命令の解釈により、あるいはコンパイル・コードの別の部分へジャンプすることによって、ある一般的な検査を行い、実行のフローの継続を生じるように意図される。グルー・コードの動作の更なる論議については、エージェント資料第1に見出すことができる。
削除されるバッファからのパッチが存在するかどうかも決定することができる。これは、先に述べた第1のチェーンを用いて削除されるバッファに格納されたパッチ・ブロックのチェーンを調べることによって行うことができる。このチェーンにおけるパッチ・ブロックが調べられ、まだ削除されていないパッチが存在するならば、このパッチが削除される。このように、パッチと関連するオーバーヘッドを再利用することができる。
コード・バッファに対する全てのパッチについてハッシュ・テーブルが調べられると、コード・バッファから出すパッチについて調べられる。ステップ23032において、削除されるべきコード・バッファにおける「からの」(ジャンプ・ソース)チェーンからのパッチ・ブロックが選択される。ステップ23034において、「への」バッファ・アドレスからハッシュが行われる。ステップ23036において、当該パッチに対する「への」バッファに関するハッシュ・チェーンからパッチ・ブロックが除去される。ステップ23038において、パッチ・ブロックが「からの」チェーンにおける最後のものであるかどうかが決定され、もしそうでなければ、全てのパッチ・ブロックが調べられるまで、チェーンにおける他のパッチ・ブロックに対するシーケンスが反復される。最後に、ステップ23039において、コード・バッファが削除される。
別の事例において、コードが格納されるコード・バッファが削除されるからではなく、例えばコンパイルの間にされた仮定がもはや有効でないゆえにコンパイル・コードがもはや使用されないため、コンパイル・コードへの/からのパッチが除去される。例えば、潜在的にポリモルフィックな方法が最後であると仮定されたとき、およびパッチがこの方法のコンパイル・バージョンに対してなされたとき、この方法が最後でないことが後で発見されるならば、コンパイル・バージョンに対するパッチは除去されねばならない。これについては、エージェント資料第9を参照されたい。
図12Fにおいて、コンパイル・コード23072の部分がポリモルフィックである方法に対する呼出しを含む。呼出される方法は、最初にコンパイルされない。呼出し命令23073は、外部コード23074の部分におけるアドレスabcを指示する。このアドレスには、グルー・コードに対する呼出しがある。グルー・コードは、方法のどのバージョンを使用するかを決定し、このバージョンを実行させる。
更に後で、前記方法が最後のものであったという仮定が誤りであることが判る。このような状況においては、方法のどのバージョンが用いられるべきか確かでないため、パッチ23028が除去される。次に、命令23073がアドレスabdを指すように変更される。このアドレスには、ディスパッチ・テーブルに対する呼出しがある。ディスパッチ・テーブルは、方法のどのバージョンが使用されるべきか、およびコンパイル・バージョンが存在するかを決定する。コンパイル・バージョンが存在するならば、実行はこのバージョンへジャンプし、もしそうでなければ、実行は方法を解釈させたグルー・コードへジャンプする。
コンパイル・コードを削除する手法は、エージェント資料第6に記載される「スタック・ウォーキング」手法、および(または)本文に述べた他の手法と組合わせて用いられる。
図12Gに関して、当該実施の形態を実施する装置が記述される。図12Gは、非ネイティブ・コード23042をホスト・コンピュータ23044上で走らせる仮想マシン23040を含むコンピュータ・システムを示している。この仮想マシンは、制御手段23046と、インタプリタ23048と、コンパイラ23050と、グルー・コード23054と、削除手段23056とを含んでいる。ホスト・コンピュータは、プロセッサ23058と、コード・バッファ23062を含むメモリ23060とを含んでいる。コード・バッファ23062は、コンパイラによりコンパイルされたコードを含む。コンパイラは、先に述べた方法のどれかでコードをコンパイルするためのものである。図12Gにも示されるのは、コンパイル・コードの1つの部分から他の部分へパッチを挿入するためのパッチング手段23055である。このパッチング手段23055は、先に述べた方法のいずれかでパッチを行うためのものである。
動作において、制御手段23046は、あるとき、コード・バッファ23062が削除されるべきことを決定する。この制御手段は、先に述べた方法で、ハッシュ・テーブル23052を調べてコード・バッファに入れる/から出すパッチを識別する。コード・バッファから出すパッチを見出すと、制御手段はこれらのパッチを例えばグルー・コード23054へ再指向する。コード・バッファから出すパッチを見出すと、制御手段はこれらパッチに関するパッチ・ブロックを除去する。次に、制御手段は、削除手段23056にコード・バッファを削除するように指令する。
本発明が純粋に事例として本文に記述され、細部の修正が本発明の範囲内で可能であることが理解されよう。
本文の記述、および(適切な場合)請求の範囲および図面に開示された各特徴は、独立的に、あるいは適切な組合わせにおいて提供されよう。
上記のいずれかまたは全てにおいて、本発明の幾つかの特徴はコンピュータ・ソフトウエアを用いて実現された。しかし、当業者には、これらの特徴がハードウエア押ハードウエアとソフトウエアの組合わせを用いて実現されることが無論明らかであろう。更に、ハードウエア、コンピュータ・ソフトウエアなどにより行われるファンクションが電気信号などにおいてあるいはこれを用いて行われることが容易に理解されよう。
情報の格納に関する特徴は、適切な記憶場所またはストアによって実現されよう。情報の処理に関する特徴は、ソフトウエアまたはハードウエアにおいて、あるいは両者の組合わせにおいて、適切なプロセッサまたは制御手段により実現されよう。
上記のいずれかあるいは全てにおいて、本発明は、下記の形態のいずれか、あるいは一部、あるいはその全てにおいて具現されよう。すなわち、本発明は、コンピュータ・システムを動作させる方法において具現され、コンピュータ・システム自体において具現され、コンピュータ・システムを動作させる方法を実行するようプログラムされあるいは実行するためのコンピュータ・システムにおいて具現され、および(または)コンピュータ・システムを動作させる方法に従って動作するためのプログラムが記録されたコンピュータ読取り可能な記憶媒体において具現されよう。
上記のいずれかあるいは全てにおいて、方法および装置の特徴および特質を含む上記の異なる特徴および特質は、任意の適切な方法において組合わせることができる。
本発明が本文において純粋に事例として記述され、細部の修正が本発明の範囲内で可能であることが理解されよう。
本文の記述、および(適切な場合)請求の範囲および図面に開示された各特徴は、独立的に、あるいは適切な組合わせにおいて提供されよう。
先に使用された用語のあるものは、ジャバ言語およびジャバ・タイプの言語に特有のものである。本発明およびその実施の形態の種々の特質もまた、他の言語の使用において適用可能である。本文に用いた用語が他の言語に関する類似のおよび(または)対応する特徴を含むように広義に解釈されるべきことが理解されよう。
本発明が本文において純粋に事例として記述され、細部の修正が本発明の範囲内で可能であることが理解されよう。
本文の記述、および(適切な場合)請求の範囲および図面に開示された各特徴は、独立的に、あるいは適切な組合わせにおいて提供されよう。
本発明のいずれかの1つの特質の特徴は、本発明あるいは本文に記述した他の発明の他の特質に適用されよう。同様に、方法の特徴は装置の特徴に適用され、その逆も真である。
Claims (9)
- コンピュータ・システムにおける第1のクラスの方法を呼出す方法であって、
前記方法がファイナルであると仮定する前記第1のクラスへの呼出しをコンパイリング・システムによりコンパイルするステップと、
第2のクラスの出現を決定し、そしてさらに前記第2のクラスが前記第1のクラスの方法のインスタンスを含むか否かを決定するステップと、
前記第2のクラスにおける方法のインスタンスが前記第1のクラスの方法をオーバーライドしているか否かを決定するステップと、
前記第2のクラスにおける方法のインスタンスが前記第1のクラスの方法をオーバーライドしているか否かのさらなる決定に応答して前記第1のクラスの方法の前記コンパイルされたコードを変更するステップと、
前記変更されたコンパイルされたコードに従って前記コンピュータ・システムを動作するステップと、
を含む方法。 - 前記第1のクラスの方法をファイナルとしてマーキングするステップをさらに含む、請求項1に記載の方法。
- 前記第1のクラスの方法が前記コンパイルコードを変更する前にファイナルであるか否かを決定するステップをさらに含む、請求項1に記載の方法。
- 前記第2のクラスが有効であるか否かを決定するステップをさらに含む、請求項1に記載の方法。
- 前記第2のクラスが有効でない場合は例外にするステップをさらに含む、請求項4に記載の方法。
- 前記コンパイルするステップは前記呼出しのコードを含む、請求項1に記載の方法。
- 前記コード最適化するステップはパッチを作成するステップを含む、請求項6に記載の方法。
- 前記コンパイルされたコードを変更するステップはパッチを取り消すステップを含む、請求項7に記載の方法。
- 前記コンパイルされたコードを変更するステップはコードを削除するステップを含む、請求項1に記載の方法。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
GBGB9825102.8A GB9825102D0 (en) | 1998-11-16 | 1998-11-16 | Computer system |
GB9825102.8 | 1998-11-16 |
Related Parent Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2000582880A Division JP2003526135A (ja) | 1998-11-16 | 1999-03-16 | コンピュータ・システム、コンピュータ読取り可能な記憶媒体および同媒体を動作させる方法、およびコンピュータ・システムを動作させる方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2010267291A true JP2010267291A (ja) | 2010-11-25 |
JP4783471B2 JP4783471B2 (ja) | 2011-09-28 |
Family
ID=10842535
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2000582880A Withdrawn JP2003526135A (ja) | 1998-11-16 | 1999-03-16 | コンピュータ・システム、コンピュータ読取り可能な記憶媒体および同媒体を動作させる方法、およびコンピュータ・システムを動作させる方法 |
JP2010156628A Expired - Lifetime JP4783471B2 (ja) | 1998-11-16 | 2010-07-09 | クラスが有するメソッドを呼出して実行するコンピュータ・システムが行う方法 |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2000582880A Withdrawn JP2003526135A (ja) | 1998-11-16 | 1999-03-16 | コンピュータ・システム、コンピュータ読取り可能な記憶媒体および同媒体を動作させる方法、およびコンピュータ・システムを動作させる方法 |
Country Status (7)
Country | Link |
---|---|
US (13) | US6862728B2 (ja) |
EP (1) | EP1208425B1 (ja) |
JP (2) | JP2003526135A (ja) |
AU (1) | AU2846999A (ja) |
DE (1) | DE69939495D1 (ja) |
GB (1) | GB9825102D0 (ja) |
WO (1) | WO2000029937A2 (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102955735A (zh) * | 2011-08-24 | 2013-03-06 | 英业达股份有限公司 | 基本输入输出系统测试方法 |
Families Citing this family (559)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0825506B1 (en) | 1996-08-20 | 2013-03-06 | Invensys Systems, Inc. | Methods and apparatus for remote process control |
JPH11296381A (ja) * | 1998-04-08 | 1999-10-29 | Matsushita Electric Ind Co Ltd | 仮想マシン及びコンパイラ |
US7260817B2 (en) * | 1999-07-09 | 2007-08-21 | International Business Machines Corporation | Method using array range check information for generating versioning code before a loop for execution |
GB9825102D0 (en) * | 1998-11-16 | 1999-01-13 | Insignia Solutions Plc | Computer system |
US6842853B1 (en) * | 1999-01-13 | 2005-01-11 | Sun Microsystems, Inc. | Thread suspension system and method |
US7013454B2 (en) * | 1999-02-22 | 2006-03-14 | Sun Microsystems, Inc. | Thread suspension system and method using trapping instructions |
US6308319B1 (en) | 1999-02-22 | 2001-10-23 | Sun Microsystems, Inc. | Thread suspension system and method using trapping instructions in delay slots |
US7283991B1 (en) * | 1999-03-11 | 2007-10-16 | Microsoft Corporation | Caching system for path search optimization |
US7353163B2 (en) * | 1999-04-27 | 2008-04-01 | Transitive Limited | Exception handling method and apparatus for use in program code conversion |
WO2000070417A1 (en) * | 1999-05-17 | 2000-11-23 | The Foxboro Company | Process control configuration system with parameterized objects |
US7089530B1 (en) * | 1999-05-17 | 2006-08-08 | Invensys Systems, Inc. | Process control configuration system with connection validation and configuration |
US6788980B1 (en) * | 1999-06-11 | 2004-09-07 | Invensys Systems, Inc. | Methods and apparatus for control using control devices that provide a virtual machine environment and that communicate via an IP network |
US7150005B2 (en) * | 1999-07-02 | 2006-12-12 | Beryl Technical Assays, Llc | Method and system for global constant management for memory |
US7882501B1 (en) * | 1999-08-13 | 2011-02-01 | Oracle America, Inc. | System and method for enabling dynamic modifed class reloading in an application server environment |
US7096238B2 (en) | 1999-08-19 | 2006-08-22 | Sun Microsystems, Inc. | Dynamic feedback for determining collection-set size |
US6983350B1 (en) | 1999-08-31 | 2006-01-03 | Intel Corporation | SDRAM controller for parallel processor architecture |
GB9921720D0 (en) * | 1999-09-14 | 1999-11-17 | Tao Group Ltd | Loading object-oriented computer programs |
US6880152B1 (en) * | 1999-10-13 | 2005-04-12 | Transmeta Corporation | Method of determining a mode of code generation |
US6532509B1 (en) | 1999-12-22 | 2003-03-11 | Intel Corporation | Arbitrating command requests in a parallel multi-threaded processing system |
US6694380B1 (en) | 1999-12-27 | 2004-02-17 | Intel Corporation | Mapping requests from a processing unit that uses memory-mapped input-output space |
US6661794B1 (en) | 1999-12-29 | 2003-12-09 | Intel Corporation | Method and apparatus for gigabit packet assignment for multithreaded packet processing |
US7480706B1 (en) * | 1999-12-30 | 2009-01-20 | Intel Corporation | Multi-threaded round-robin receive for fast network port |
US6952824B1 (en) * | 1999-12-30 | 2005-10-04 | Intel Corporation | Multi-threaded sequenced receive for fast network port stream of packets |
US7080359B2 (en) * | 2002-01-16 | 2006-07-18 | International Business Machines Corporation | Stack unique signatures for program procedures and methods |
US6904594B1 (en) * | 2000-07-06 | 2005-06-07 | International Business Machines Corporation | Method and system for apportioning changes in metric variables in an symmetric multiprocessor (SMP) environment |
EP1176482B1 (de) * | 2000-07-27 | 2004-12-22 | Abb Research Ltd. | Verfahren und Computerprogramm zum Herstellen einer Regelung oder Steuerung |
US6658656B1 (en) * | 2000-10-31 | 2003-12-02 | Hewlett-Packard Development Company, L.P. | Method and apparatus for creating alternative versions of code segments and dynamically substituting execution of the alternative code versions |
US6813760B1 (en) * | 2000-11-30 | 2004-11-02 | Nortel Networks Limited | Method and a tool for estimating probability of data contention in a multi-processor shared-memory system |
US8458754B2 (en) | 2001-01-22 | 2013-06-04 | Sony Computer Entertainment Inc. | Method and system for providing instant start multimedia content |
US7461148B1 (en) * | 2001-02-16 | 2008-12-02 | Swsoft Holdings, Ltd. | Virtual private server with isolation of system components |
US8219620B2 (en) | 2001-02-20 | 2012-07-10 | Mcafee, Inc. | Unwanted e-mail filtering system including voting feedback |
US6892212B2 (en) * | 2001-03-22 | 2005-05-10 | International Business Machines Corporation | Method for efficient garbage collection based on object type |
CA2346766A1 (en) * | 2001-05-07 | 2002-11-07 | Ibm Canada Limited-Ibm Canada Limitee | Efficient locking for thread-safe self-modifying code |
US6760726B1 (en) * | 2001-06-19 | 2004-07-06 | Ants Software | System and method of managing concurrent operations on linked lists |
US7082597B2 (en) * | 2001-06-20 | 2006-07-25 | Sun Microsystems, Inc. | Representation of objects in a Java programming environment |
US6980997B1 (en) * | 2001-06-28 | 2005-12-27 | Microsoft Corporation | System and method providing inlined stub |
US20030005408A1 (en) * | 2001-07-02 | 2003-01-02 | Pradeep Tumati | System and method for creating software modifiable without halting its execution |
JP3790683B2 (ja) * | 2001-07-05 | 2006-06-28 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンピュータ装置、その例外処理プログラム及びコンパイル方法 |
US6851006B2 (en) * | 2001-08-25 | 2005-02-01 | International Business Machines Corporation | Interruption handler-operating system dialog for operating system handling of hardware interruptions |
US7350194B1 (en) * | 2001-09-24 | 2008-03-25 | Oracle Corporation | Techniques for debugging computer programs involving multiple computing machines |
JP4272371B2 (ja) * | 2001-11-05 | 2009-06-03 | パナソニック株式会社 | デバッグ支援装置、コンパイラ装置、デバッグ支援プログラム、コンパイラプログラム、及びコンピュータ読取可能な記録媒体。 |
US6996814B2 (en) * | 2001-11-14 | 2006-02-07 | Sun Microsystems, Inc. | Method and apparatus for dynamically compiling byte codes into native code |
US7069546B2 (en) * | 2001-12-03 | 2006-06-27 | Corrigent Systems Ltd. | Generic framework for embedded software development |
JP2003196553A (ja) * | 2001-12-27 | 2003-07-11 | Seiko Epson Corp | 会員管理サーバシステム、そのプログラム及び会員管理方法 |
SE521753C2 (sv) * | 2002-02-08 | 2003-12-02 | Xelerated Ab | Förfarande och system för att uppfylla realtidskrav för en dataprocessor |
US6735756B1 (en) * | 2002-02-22 | 2004-05-11 | Xilinx, Inc. | Method and architecture for dynamic device drivers |
US7065760B2 (en) * | 2002-02-28 | 2006-06-20 | Sun Microsystems, Inc. | Reducing the memory footprint of applications executed in a virtual machine |
US7421478B1 (en) * | 2002-03-07 | 2008-09-02 | Cisco Technology, Inc. | Method and apparatus for exchanging heartbeat messages and configuration information between nodes operating in a master-slave configuration |
US20030182653A1 (en) * | 2002-03-22 | 2003-09-25 | Giuseppe Desoli | Systems and methods for verifying correct execution of emulated code via dynamic state verification |
AU2003213927A1 (en) * | 2002-03-29 | 2003-10-13 | Research In Motion Limited | System and method for object oriented interface checking and method dispatching |
US7379860B1 (en) | 2002-03-29 | 2008-05-27 | Cypress Semiconductor Corporation | Method for integrating event-related information and trace information |
US20030187911A1 (en) * | 2002-04-01 | 2003-10-02 | Michael Abd-El-Malek | Method and apparatus to facilitate recovering a thread from a checkpoint |
US7587465B1 (en) * | 2002-04-22 | 2009-09-08 | Cisco Technology, Inc. | Method and apparatus for configuring nodes as masters or slaves |
WO2003091874A2 (en) * | 2002-04-25 | 2003-11-06 | Koninklijke Philips Electronics N.V. | Automatic task distribution in scalable processors |
US7020870B2 (en) * | 2002-05-15 | 2006-03-28 | Sun Microsystems, Inc. | Dynamic size for language variables |
JP3956113B2 (ja) * | 2002-06-13 | 2007-08-08 | インターナショナル・ビジネス・マシーンズ・コーポレーション | データ処理装置及びプログラム |
US7506323B2 (en) * | 2002-06-18 | 2009-03-17 | Panasonic Corporation | Program execution processing terminal device, program execution processing method, and program |
WO2004001584A2 (en) * | 2002-06-24 | 2003-12-31 | Ante Vista Gmbh | A method for executing structured symbolic machine code on a microprocessor |
US20040003383A1 (en) * | 2002-06-28 | 2004-01-01 | Microsoft Corporation | Stripping of unnecessary information from source code |
US6970985B2 (en) * | 2002-07-09 | 2005-11-29 | Bluerisc Inc. | Statically speculative memory accessing |
US20040010779A1 (en) * | 2002-07-10 | 2004-01-15 | Di Loreto Michael A. | Multi-module interpreter |
US7036057B2 (en) * | 2002-07-11 | 2006-04-25 | Mediatek Inc. | Range splitting read/write methods for CD-MRW |
US7047488B2 (en) | 2002-07-19 | 2006-05-16 | Open Invention Network | Registry driven interoperability and exchange of documents |
US7346895B2 (en) * | 2002-07-31 | 2008-03-18 | International Business Machines Corporation | Method of tracing data collection |
US7296257B1 (en) * | 2002-08-01 | 2007-11-13 | Tymesys Corporation | Techniques for exception handling by rewriting dispatch table elements |
US20040040029A1 (en) * | 2002-08-22 | 2004-02-26 | Mourad Debbabi | Method call acceleration in virtual machines |
US6999980B2 (en) * | 2002-08-23 | 2006-02-14 | Sun Microsystems, Inc. | Eliminating write barriers for young objects |
TWI336848B (en) * | 2002-08-26 | 2011-02-01 | Interdigital Tech Corp | Wireless transmit/receive unit and method for providing a communication path between a plurality of operating systems in a wireless device |
US20040044988A1 (en) * | 2002-08-29 | 2004-03-04 | Schene Christopher Robin | Generation of compiled code for simulator speed up |
US7367022B2 (en) * | 2002-09-05 | 2008-04-29 | Intel Corporation | Methods and apparatus for optimizing the operating speed and size of a computer program |
US7953588B2 (en) * | 2002-09-17 | 2011-05-31 | International Business Machines Corporation | Method and system for efficient emulation of multiprocessor address translation on a multiprocessor host |
US9043194B2 (en) * | 2002-09-17 | 2015-05-26 | International Business Machines Corporation | Method and system for efficient emulation of multiprocessor memory consistency |
US8108843B2 (en) * | 2002-09-17 | 2012-01-31 | International Business Machines Corporation | Hybrid mechanism for more efficient emulation and method therefor |
US7765532B2 (en) * | 2002-10-22 | 2010-07-27 | Oracle America, Inc. | Inducing concurrency in software code |
US7603664B2 (en) * | 2002-10-22 | 2009-10-13 | Sun Microsystems, Inc. | System and method for marking software code |
US7346902B2 (en) * | 2002-10-22 | 2008-03-18 | Sun Microsystems, Inc. | System and method for block-based concurrentization of software code |
US7178132B2 (en) * | 2002-10-23 | 2007-02-13 | Microsoft Corporation | Forward walking through binary code to determine offsets for stack walking |
US7069279B1 (en) * | 2002-11-04 | 2006-06-27 | Savaje Technologies, Inc. | Timely finalization of system resources |
US6999979B2 (en) * | 2002-11-05 | 2006-02-14 | Sun Microsystems, Inc. | Efficient encoding of references into a collection set |
US7035884B2 (en) * | 2002-11-05 | 2006-04-25 | Sun Microsystems, Inc. | Placement of allocation trains in the train algorithm |
US7539713B2 (en) | 2002-11-05 | 2009-05-26 | Sun Microsystems, Inc. | Allocation of likely popular objects in the train algorithm |
US7188129B2 (en) | 2002-11-15 | 2007-03-06 | Sun Microsystems, Inc. | Merging trains in a collector based on the train algorithm |
US7209935B2 (en) * | 2002-11-27 | 2007-04-24 | Sun Microsystems, Inc. | Avoiding remembered-set maintenance overhead for memory segments known to be in a collection set |
US7085790B2 (en) * | 2002-12-06 | 2006-08-01 | Sun Microsystems, Inc. | Advancing cars in trains managed by a collector based on the train algorithm |
US7024437B2 (en) * | 2002-12-06 | 2006-04-04 | Sun Microsystems, Inc. | Better placement of objects reachable from special objects during collection based on the train algorithm |
US7069280B2 (en) | 2002-12-06 | 2006-06-27 | Sun Microsystems, Inc. | Collection-tick mechanism for a collector based on the train algorithm |
US7031990B2 (en) | 2002-12-06 | 2006-04-18 | Sun Microsystems, Inc. | Combining external and intragenerational reference-processing in a garbage collector based on the train algorithm |
US7143124B2 (en) | 2002-12-06 | 2006-11-28 | Sun Microsystems, Inc. | Detection of dead regions during incremental collection |
US7194744B2 (en) * | 2002-12-17 | 2007-03-20 | International Business Machines Corporation | System and method for dynamic exception handling using an external exception handler |
FR2849229B1 (fr) * | 2002-12-18 | 2005-02-25 | Trusted Logic | Procede de compactage de programme par suppression dynamique de code |
US7983239B1 (en) | 2003-01-07 | 2011-07-19 | Raytheon Bbn Technologies Corp. | Systems and methods for constructing a virtual model of a multi-hop, multi-access network |
US7146390B2 (en) | 2003-02-24 | 2006-12-05 | Sun Microsystems, Inc. | Staging the processing of remembered-set entries as part of collection based on the train algorithm |
US7069281B2 (en) | 2003-02-24 | 2006-06-27 | Sun Microsystems, Inc. | Efficient collocation of evacuated objects in a copying garbage collector using variably filled local allocation buffers |
US7096329B2 (en) * | 2003-02-27 | 2006-08-22 | Sun Microsystems, Inc. | Better placement of objects promoted into a generation managed by the train algorithm |
JP3924787B2 (ja) * | 2003-02-27 | 2007-06-06 | ソニー株式会社 | 記録装置、ファイル管理方法、ファイル管理方法のプログラム、ファイル管理方法のプログラムを記録した記録媒体 |
US7062519B2 (en) * | 2003-02-27 | 2006-06-13 | Sun Microsystems, Inc. | Incremental scanning of enormous objects to improve scheduling and pause-time behavior of garbage collection |
US7225439B2 (en) * | 2003-03-21 | 2007-05-29 | Sun Microsystems, Inc. | Combining write-barriers within an inner loop with fixed step |
US20040186863A1 (en) * | 2003-03-21 | 2004-09-23 | Garthwaite Alexander T. | Elision of write barriers for stores whose values are in close proximity |
GB2399897B (en) * | 2003-03-26 | 2006-02-01 | Advanced Risc Mach Ltd | Memory recycling in computer systems |
CN100342377C (zh) * | 2003-04-16 | 2007-10-10 | 华为技术有限公司 | 一种提高数据处理效率的方法 |
GB2401217B (en) * | 2003-05-02 | 2005-11-09 | Transitive Ltd | Improved architecture for generating intermediate representations for program code conversion |
US9454490B2 (en) | 2003-05-12 | 2016-09-27 | International Business Machines Corporation | Invalidating a range of two or more translation table entries and instruction therefore |
US7284100B2 (en) * | 2003-05-12 | 2007-10-16 | International Business Machines Corporation | Invalidating storage, clearing buffer entries, and an instruction therefor |
US7293265B2 (en) * | 2003-05-15 | 2007-11-06 | Intel Corporation | Methods and apparatus to perform return-address prediction |
US7603663B2 (en) * | 2003-05-20 | 2009-10-13 | Intel Corporation | Apparatus and methods for restoring synchronization to object-oriented software applications in managed runtime environments |
US7080172B1 (en) | 2003-05-27 | 2006-07-18 | Marvell Luternational Ltd. | Management of memory, hardware and associated device drivers using stacks |
CA2430763A1 (en) | 2003-05-30 | 2004-11-30 | Ibm Canada Limited - Ibm Canada Limitee | Efficiently releasing locks when an exception occurs |
US7219329B2 (en) * | 2003-06-13 | 2007-05-15 | Microsoft Corporation | Systems and methods providing lightweight runtime code generation |
US7089272B1 (en) | 2003-06-18 | 2006-08-08 | Sun Microsystems, Inc. | Specializing write-barriers for objects in a garbage collected heap |
US7322027B2 (en) * | 2003-06-27 | 2008-01-22 | Microsoft Corporation | Detecting termination and providing information related to termination of a computer system process |
WO2005001695A1 (ja) * | 2003-06-30 | 2005-01-06 | Matsushita Electric Industrial Co., Ltd. | ガーベジコレクションシステム |
US7496896B2 (en) * | 2003-07-17 | 2009-02-24 | Computer Associates Think, Inc. | Accessing return values and exceptions |
US7881229B2 (en) * | 2003-08-08 | 2011-02-01 | Raytheon Bbn Technologies Corp. | Systems and methods for forming an adjacency graph for exchanging network routing data |
US20050039189A1 (en) * | 2003-08-14 | 2005-02-17 | Todd Anderson | Methods and apparatus to preemptively compile an application |
US7149762B1 (en) | 2003-08-20 | 2006-12-12 | Sun Microsystems, Inc. | Handling futile collections in the train algorithm through selective extension of the collection set |
US20050050135A1 (en) * | 2003-08-25 | 2005-03-03 | Josef Hallermeier | Handheld digital multimedia workstation and method |
US7210135B2 (en) * | 2003-08-26 | 2007-04-24 | Microsoft Corporation | Data flow analysis of transactional processes |
US7606927B2 (en) | 2003-08-27 | 2009-10-20 | Bbn Technologies Corp | Systems and methods for forwarding data units in a communications network |
US8166204B2 (en) * | 2003-08-29 | 2012-04-24 | Raytheon Bbn Technologies Corp. | Systems and methods for automatically placing nodes in an ad hoc network |
US7404182B1 (en) | 2003-10-03 | 2008-07-22 | Sun Microsystems, Inc. | Deferring and combining write barriers for a garbage-collected heap |
US7552426B2 (en) * | 2003-10-14 | 2009-06-23 | Microsoft Corporation | Systems and methods for using synthetic instructions in a virtual machine |
US7447829B2 (en) | 2003-10-15 | 2008-11-04 | International Business Machines Corporation | Heap and stack layout for multithreaded processes in a processing system |
US7668083B1 (en) | 2003-10-28 | 2010-02-23 | Bbn Technologies Corp. | Systems and methods for forwarding data in a communications network |
US20050114850A1 (en) | 2003-10-29 | 2005-05-26 | Saurabh Chheda | Energy-focused re-compilation of executables and hardware mechanisms based on compiler-architecture interaction and compiler-inserted control |
US20050097533A1 (en) * | 2003-10-31 | 2005-05-05 | Chakrabarti Dhruva R. | Run-time performance with call site inline specialization |
US7487498B2 (en) * | 2003-11-12 | 2009-02-03 | Microsoft Corporation | Strategy for referencing code resources |
US7263690B1 (en) * | 2003-11-14 | 2007-08-28 | Sun Microsystems, Inc. | Mechanism for safe byte code in a tracing framework |
US7996671B2 (en) | 2003-11-17 | 2011-08-09 | Bluerisc Inc. | Security of program executables and microprocessors based on compiler-architecture interaction |
US7266726B1 (en) | 2003-11-24 | 2007-09-04 | Time Warner Cable Inc. | Methods and apparatus for event logging in an information network |
US8302111B2 (en) | 2003-11-24 | 2012-10-30 | Time Warner Cable Inc. | Methods and apparatus for hardware registration in a network device |
US7380086B2 (en) * | 2003-12-12 | 2008-05-27 | International Business Machines Corporation | Scalable runtime system for global address space languages on shared and distributed memory machines |
US7770034B2 (en) * | 2003-12-16 | 2010-08-03 | Intel Corporation | Performance monitoring based dynamic voltage and frequency scaling |
US7624137B2 (en) * | 2004-01-05 | 2009-11-24 | International Business Machines Corporation | Method and apparatus for scheduling and performing garbage collection in a real-time system with guaranteed space bounds |
US7603668B2 (en) * | 2004-01-09 | 2009-10-13 | Hewlett-Packard Development Company, L.P. | Determining the applicability of patches for installation on a computer system |
US20050165837A1 (en) * | 2004-01-22 | 2005-07-28 | International Business Machines Corporation | System and method for embedded java memory footprint performance improvement |
JP4086791B2 (ja) * | 2004-01-28 | 2008-05-14 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンパイラプログラム、動的コンパイラプログラム、再現コンパイラプログラム、再現コンパイラ、コンパイル方法、及び記録媒体 |
US8607209B2 (en) | 2004-02-04 | 2013-12-10 | Bluerisc Inc. | Energy-focused compiler-assisted branch prediction |
US9213538B1 (en) | 2004-02-06 | 2015-12-15 | Time Warner Cable Enterprises Llc | Methods and apparatus for display element management in an information network |
US20050183077A1 (en) * | 2004-02-12 | 2005-08-18 | International Business Machines Corporation | System and method for JIT memory footprint improvement for embedded java devices |
US7475002B1 (en) * | 2004-02-18 | 2009-01-06 | Vmware, Inc. | Method and apparatus for emulating multiple virtual timers in a virtual computer system when the virtual timers fall behind the real time of a physical computer system |
US8078669B2 (en) | 2004-02-18 | 2011-12-13 | Time Warner Cable Inc. | Media extension apparatus and methods for use in an information network |
US7266804B2 (en) | 2004-02-20 | 2007-09-04 | Microsoft Corporation | Strategy for selectively making non-public resources of one assembly visible to another |
US7689543B2 (en) * | 2004-03-11 | 2010-03-30 | International Business Machines Corporation | Search engine providing match and alternative answers using cumulative probability values |
US7644402B1 (en) * | 2004-03-17 | 2010-01-05 | Sun Microsystems, Inc. | Method for sharing runtime representation of software components across component loaders |
US7496897B1 (en) | 2004-03-17 | 2009-02-24 | Timesys Corporation | Multiple code sets for multiple execution contexts |
US7904893B2 (en) * | 2004-03-17 | 2011-03-08 | Marvell International Ltd. | Power and/or energy optimized compile/execution |
US7406687B1 (en) * | 2004-03-17 | 2008-07-29 | Sun Microsystems, Inc. | Sharing runtime representation of software component methods across component loaders |
US20050228851A1 (en) * | 2004-03-29 | 2005-10-13 | Intel Corporation | Configuration of redirection tables |
US7836434B1 (en) * | 2004-05-04 | 2010-11-16 | Oracle America, Inc. | Method and system for analyzing array access to a pointer that is referenced as an array |
US7770169B2 (en) * | 2004-05-17 | 2010-08-03 | Oracle America, Inc. | Thread rendezvous for read-only code in an object-oriented computing environment |
US7620943B1 (en) | 2004-06-30 | 2009-11-17 | Sun Microsystems, Inc. | Using class properties to segregate objects in a generation managed by the train algorithm |
US8869104B2 (en) * | 2004-06-30 | 2014-10-21 | Lsi Corporation | Object code configuration tool |
US20060005190A1 (en) * | 2004-06-30 | 2006-01-05 | Microsoft Corporation | Systems and methods for implementing an operating system in a virtual machine environment |
US7949666B2 (en) * | 2004-07-09 | 2011-05-24 | Ricoh, Ltd. | Synchronizing distributed work through document logs |
EP1622009A1 (en) * | 2004-07-27 | 2006-02-01 | Texas Instruments Incorporated | JSM architecture and systems |
KR100678891B1 (ko) * | 2004-07-30 | 2007-02-05 | 삼성전자주식회사 | Av데이터 수신시 버퍼량을 컨텐츠 속성에 따라탄력적으로 조절하는 방법 및 장치 |
US7398523B2 (en) * | 2004-08-19 | 2008-07-08 | International Business Machines Corporation | Adaptive class loading |
US20060048122A1 (en) * | 2004-08-30 | 2006-03-02 | International Business Machines Corporation | Method, system and computer program product for hierarchical loop optimization of machine executable code |
US7676801B1 (en) | 2004-08-31 | 2010-03-09 | Sun Microsystems, Inc. | Scanning of evacuated objects in a generation managed by the train algorithm |
US8819639B2 (en) * | 2004-09-15 | 2014-08-26 | Lakeside Software, Inc. | System for selectively blocking execution of applications on a computer system |
US7415021B1 (en) * | 2004-09-22 | 2008-08-19 | Sun Microsystems, Inc. | Method and apparatus for preserving null semantics during use of a forwarding method |
US7653793B1 (en) * | 2004-11-17 | 2010-01-26 | Sun Microsystems, Inc. | Use of memory protection to implement replicating collection in an incremental, copying garbage collector |
FI20041517A0 (fi) * | 2004-11-25 | 2004-11-25 | Nokia Corp | Menetelmä elektroniikkalaitteiden ohjelmien turvalliseen tulkintaan |
US20060123397A1 (en) * | 2004-12-08 | 2006-06-08 | Mcguire James B | Apparatus and method for optimization of virtual machine operation |
US7321909B1 (en) | 2004-12-23 | 2008-01-22 | Sun Microsystems, Inc. | Method and apparatus for forwarding references to objects concurrently with space-incremental garbage collection |
TWI257053B (en) * | 2005-01-20 | 2006-06-21 | Via Tech Inc | System and method used to automatically reload and manage hyperlinks |
US7379943B2 (en) * | 2005-01-28 | 2008-05-27 | Microsoft Corporation | Method and system for bidirectionally data binding a control of a template |
US7730016B2 (en) * | 2005-01-31 | 2010-06-01 | Oracle International Corporation | Identification of false ambiguous roots in a stack conservative garbage collector |
US20090178032A1 (en) * | 2005-03-03 | 2009-07-09 | Rongzhen Yang | Mining for performance data for systems with dynamic compilers |
US7735089B2 (en) * | 2005-03-08 | 2010-06-08 | Oracle International Corporation | Method and system for deadlock detection in a distributed environment |
US7574702B2 (en) * | 2005-03-18 | 2009-08-11 | Microsoft Corporation | Method and apparatus for hybrid stack walking |
US7574700B2 (en) * | 2005-03-31 | 2009-08-11 | Sun Microsystems, Inc. | Supporting dynamically-typed languages in typed assembly languages |
US7661095B2 (en) * | 2005-04-14 | 2010-02-09 | Hewlett-Packard Development Company, L.P. | System and method to build a callgraph for functions with multiple entry points |
WO2006111001A1 (en) * | 2005-04-18 | 2006-10-26 | Research In Motion Limited | System and method of waste management |
US20060271575A1 (en) * | 2005-05-25 | 2006-11-30 | Harris Steven T | Clustered object state using field set operations |
GB2426840A (en) * | 2005-06-04 | 2006-12-06 | Transitive Ltd | Method of executing program code where a portion of the target code calls a native code portion which then calls a second target code portion. |
US20060277541A1 (en) * | 2005-06-07 | 2006-12-07 | Sony Computer Entertainment America Inc. | Relocatable component file format |
US20060288341A1 (en) * | 2005-06-15 | 2006-12-21 | Microsoft Corporation | Patch-impact assessment through runtime insertion of code path instrumentation |
WO2007002855A2 (en) * | 2005-06-29 | 2007-01-04 | Neopath Networks, Inc. | Parallel filesystem traversal for transparent mirroring of directories and files |
EP1752874A1 (en) * | 2005-07-19 | 2007-02-14 | Alcatel | Adaptive evolutionary computer software product |
US9230029B2 (en) * | 2005-07-26 | 2016-01-05 | Creative Technology Ltd | System and method for modifying media content playback based on an intelligent random selection |
US20070083783A1 (en) * | 2005-08-05 | 2007-04-12 | Toru Ishihara | Reducing power consumption at a cache |
JP4068106B2 (ja) * | 2005-08-05 | 2008-03-26 | 三菱電機株式会社 | リアルタイム組込み簡易モニタプログラム |
US20070050606A1 (en) * | 2005-08-29 | 2007-03-01 | Searete Llc, A Limited Liability Corporation Of The State Of Delaware | Runtime-based optimization profile |
US7877584B2 (en) | 2005-08-29 | 2011-01-25 | The Invention Science Fund I, Llc | Predictive processor resource management |
US7774558B2 (en) * | 2005-08-29 | 2010-08-10 | The Invention Science Fund I, Inc | Multiprocessor resource optimization |
US7653834B2 (en) | 2005-08-29 | 2010-01-26 | Searete, Llc | Power sparing synchronous apparatus |
US7779213B2 (en) | 2005-08-29 | 2010-08-17 | The Invention Science Fund I, Inc | Optimization of instruction group execution through hardware resource management policies |
US7725693B2 (en) | 2005-08-29 | 2010-05-25 | Searete, Llc | Execution optimization using a processor resource management policy saved in an association with an instruction group |
US8181004B2 (en) | 2005-08-29 | 2012-05-15 | The Invention Science Fund I, Llc | Selecting a resource management policy for a resource available to a processor |
US7627739B2 (en) | 2005-08-29 | 2009-12-01 | Searete, Llc | Optimization of a hardware resource shared by a multiprocessor |
US7607042B2 (en) * | 2005-08-29 | 2009-10-20 | Searete, Llc | Adjusting a processor operating parameter based on a performance criterion |
US8255745B2 (en) * | 2005-08-29 | 2012-08-28 | The Invention Science Fund I, Llc | Hardware-error tolerant computing |
US7647487B2 (en) * | 2005-08-29 | 2010-01-12 | Searete, Llc | Instruction-associated processor resource optimization |
US8423824B2 (en) | 2005-08-29 | 2013-04-16 | The Invention Science Fund I, Llc | Power sparing synchronous apparatus |
US20070050605A1 (en) * | 2005-08-29 | 2007-03-01 | Bran Ferren | Freeze-dried ghost pages |
US8516300B2 (en) * | 2005-08-29 | 2013-08-20 | The Invention Science Fund I, Llc | Multi-votage synchronous systems |
US8214191B2 (en) * | 2005-08-29 | 2012-07-03 | The Invention Science Fund I, Llc | Cross-architecture execution optimization |
US8209524B2 (en) * | 2005-08-29 | 2012-06-26 | The Invention Science Fund I, Llc | Cross-architecture optimization |
US7739524B2 (en) * | 2005-08-29 | 2010-06-15 | The Invention Science Fund I, Inc | Power consumption management |
US7730491B2 (en) * | 2005-08-30 | 2010-06-01 | Intel Corporation | Fair scalable reader-writer mutual exclusion |
US7793299B2 (en) * | 2005-08-30 | 2010-09-07 | International Business Machines Corporation | System and method for scheduling tasks for execution |
US7565365B2 (en) * | 2005-08-31 | 2009-07-21 | Sap Ag | Object storage and synchronization hooks for occasionally-connected devices |
US20070083644A1 (en) * | 2005-10-12 | 2007-04-12 | Microsoft Corporation | Capturing, displaying, and re-creating network conversations and state information |
KR100778001B1 (ko) * | 2005-10-14 | 2007-11-21 | 엘지전자 주식회사 | 멀티미디어 파일을 재생하는 방법 및 그 장치 |
EP1783604A3 (en) * | 2005-11-07 | 2007-10-03 | Slawomir Adam Janczewski | Object-oriented, parallel language, method of programming and multi-processor computer |
US7774843B1 (en) * | 2005-11-16 | 2010-08-10 | Mcafee, Inc. | System, method and computer program product for preventing the execution of unwanted code |
JP4732874B2 (ja) * | 2005-11-28 | 2011-07-27 | 株式会社エヌ・ティ・ティ・ドコモ | ソフトウェア動作モデル化装置、ソフトウェア動作監視装置、ソフトウェア動作モデル化方法及びソフトウェア動作監視方法 |
US20070150895A1 (en) * | 2005-12-06 | 2007-06-28 | Kurland Aaron S | Methods and apparatus for multi-core processing with dedicated thread management |
US7739675B2 (en) * | 2005-12-16 | 2010-06-15 | International Business Machines Corporation | Dynamically computing a degradation analysis of waiting threads in a virtual machine |
FR2895103B1 (fr) * | 2005-12-19 | 2008-02-22 | Dxo Labs Sa | Procede et systeme de traitement de donnees numeriques |
US9830174B2 (en) * | 2005-12-22 | 2017-11-28 | Synopsys, Inc. | Dynamic host code generation from architecture description for fast simulation |
US20070201270A1 (en) * | 2005-12-30 | 2007-08-30 | Stmicroelectronics Pvt. Ltd. | Read only memory device with bitline leakage reduction |
WO2007076629A1 (en) * | 2005-12-30 | 2007-07-12 | Intel Corporation | Type checking for object-oriented programming languages |
US8601160B1 (en) | 2006-02-09 | 2013-12-03 | Mcafee, Inc. | System, method and computer program product for gathering information relating to electronic content utilizing a DNS server |
WO2007095642A2 (en) * | 2006-02-16 | 2007-08-23 | The Regents Of The University Of California | Dynamic incremental compiler and method |
KR100763199B1 (ko) * | 2006-02-20 | 2007-10-04 | 삼성전자주식회사 | 가상 머신 환경에서의 메소드 호출 방법 및 상기 방법을수행하는 가상 머신이 탑재된 시스템 |
US8266605B2 (en) * | 2006-02-22 | 2012-09-11 | Wind River Systems, Inc. | Method and system for optimizing performance based on cache analysis |
US8615743B2 (en) * | 2006-02-27 | 2013-12-24 | Microsoft Corporation | Adaptive compiled code |
US8099724B2 (en) * | 2006-02-28 | 2012-01-17 | Oracle America, Inc. | Fast patch-based method calls |
US7840950B2 (en) * | 2006-03-09 | 2010-11-23 | International Business Machines Corporation | Programmatic compiler optimization of glacial constants |
US8291395B2 (en) * | 2006-03-31 | 2012-10-16 | Apple Inc. | Fast function call dispatching |
EP2477109B1 (en) | 2006-04-12 | 2016-07-13 | Soft Machines, Inc. | Apparatus and method for processing an instruction matrix specifying parallel and dependent operations |
US7581089B1 (en) | 2006-04-20 | 2009-08-25 | The United States Of America As Represented By The Director Of The National Security Agency | Method of protecting a computer stack |
US7533237B1 (en) | 2006-05-11 | 2009-05-12 | Nvidia Corporation | Off-chip memory allocation for a unified shader |
US7533236B1 (en) | 2006-05-11 | 2009-05-12 | Nvidia Corporation | Off-chip out of order memory allocation for a unified shader |
GB0609843D0 (en) * | 2006-05-18 | 2006-06-28 | Ibm | Launcher for software applications |
US7756911B2 (en) * | 2006-06-09 | 2010-07-13 | International Business Machines Corporation | Method and system for executing a task and medium storing a program therefor |
US7480782B2 (en) | 2006-06-14 | 2009-01-20 | Sun Microsystems, Inc. | Reference-updating using per-chunk referenced-address ranges in a compacting garbage collector |
US20080052691A1 (en) * | 2006-06-29 | 2008-02-28 | Naveen Neelakantam | Communicating with and recovering state information from a dynamic translator |
US8405662B2 (en) * | 2006-07-04 | 2013-03-26 | Iti Scotland Limited | Generation of video |
GB0613275D0 (en) * | 2006-07-04 | 2006-08-16 | Codeplay Software Ltd | Distributed computer system |
US20090144713A1 (en) * | 2006-07-04 | 2009-06-04 | George Russell | Techniques for program performance analysis |
US20090150872A1 (en) * | 2006-07-04 | 2009-06-11 | George Russell | Dynamic code update |
US20080126625A1 (en) * | 2006-07-17 | 2008-05-29 | International Business Machines Corporation | Just-in-time buffer allocation for use in event completion style input/output models |
EP1881404A1 (fr) * | 2006-07-20 | 2008-01-23 | Gemplus | Procédé de protection dynamique des données lors de l'exécution d'un code logiciel en langage intermédiaire dans un appareil numérique |
CN101110020B (zh) | 2006-07-21 | 2011-01-26 | 国际商业机器公司 | 维护关于可编辑对象中的元素的与原创性有关的信息的方法和系统 |
US8020149B2 (en) * | 2006-08-04 | 2011-09-13 | Apple Inc. | System and method for mitigating repeated crashes of an application resulting from supplemental code |
US7506218B2 (en) * | 2006-08-18 | 2009-03-17 | International Business Machines Corporation | Timeout request scheduling using grouping and nonsynchronized processing to enhance performance |
CA2557343C (en) * | 2006-08-28 | 2015-09-22 | Ibm Canada Limited-Ibm Canada Limitee | Runtime code modification in a multi-threaded environment |
US8566812B1 (en) * | 2006-08-31 | 2013-10-22 | Oracle America, Inc. | Using observed object patterns to dynamically tune a virtual machine for responsiveness |
US8479004B2 (en) | 2006-08-31 | 2013-07-02 | Ricoh Co., Ltd | Paper-based document logging |
US9665970B2 (en) * | 2006-09-19 | 2017-05-30 | Imagination Technologies Limited | Variable-sized concurrent grouping for multiprocessing |
US7913236B2 (en) * | 2006-09-29 | 2011-03-22 | Intel Corporation | Method and apparatus for performing dynamic optimization for software transactional memory |
US8799876B2 (en) * | 2006-09-29 | 2014-08-05 | Intel Corporation | Method and apparatus for assigning subroutines |
US8065670B2 (en) * | 2006-10-03 | 2011-11-22 | Oracle America, Inc. | Method and apparatus for enabling optimistic program execution |
US8082542B2 (en) * | 2006-10-04 | 2011-12-20 | International Business Machines Corporation | Load time in-lining of subroutines |
US7934208B2 (en) * | 2006-10-13 | 2011-04-26 | International Business Machines Corporation | Method for transparent on-line dynamic binary optimization |
CN101165684A (zh) * | 2006-10-18 | 2008-04-23 | 国际商业机器公司 | 指示内容查找结果的方法和装置 |
US20080126766A1 (en) | 2006-11-03 | 2008-05-29 | Saurabh Chheda | Securing microprocessors against information leakage and physical tampering |
EP2523101B1 (en) | 2006-11-14 | 2014-06-04 | Soft Machines, Inc. | Apparatus and method for processing complex instruction formats in a multi- threaded architecture supporting various context switch modes and virtualization schemes |
US8683453B2 (en) * | 2006-11-30 | 2014-03-25 | Motorola Mobility Llc | System for overriding interpreted byte-code with native code |
US8370818B2 (en) * | 2006-12-02 | 2013-02-05 | Time Warner Cable Inc. | Methods and apparatus for analyzing software interface usage |
US7783681B1 (en) * | 2006-12-15 | 2010-08-24 | Oracle America, Inc. | Method and system for pre-marking objects for concurrent garbage collection |
US9645915B2 (en) * | 2006-12-27 | 2017-05-09 | The Mathworks, Inc. | Continuous evaluation of program code and saving state information associated with program code |
US8578347B1 (en) * | 2006-12-28 | 2013-11-05 | The Mathworks, Inc. | Determining stack usage of generated code from a model |
FR2911971B1 (fr) * | 2007-01-26 | 2009-04-24 | Commissariat Energie Atomique | Procede et systeme de verification de proprietes d'un programme informatique. |
US8413125B2 (en) * | 2007-01-26 | 2013-04-02 | Oracle International Corporation | Asynchronous dynamic compilation based on multi-session profiling to produce shared native code |
US8006094B2 (en) | 2007-02-21 | 2011-08-23 | Ricoh Co., Ltd. | Trustworthy timestamps and certifiable clocks using logs linked by cryptographic hashes |
EP2118823B1 (en) * | 2007-03-01 | 2020-04-15 | Zipcar, Inc. | Multi-tiered fleet management cache |
US8495708B2 (en) * | 2007-03-22 | 2013-07-23 | The Invention Science Fund I, Llc | Resource authorizations dependent on emulation environment isolation policies |
JP4339371B2 (ja) * | 2007-03-22 | 2009-10-07 | 株式会社ソニー・コンピュータエンタテインメント | 情報処理装置および情報処理方法 |
US8438609B2 (en) * | 2007-03-22 | 2013-05-07 | The Invention Science Fund I, Llc | Resource authorizations dependent on emulation environment isolation policies |
US8874425B2 (en) * | 2007-03-22 | 2014-10-28 | The Invention Science Fund I, Llc | Implementing performance-dependent transfer or execution decisions from service emulation indications |
US9558019B2 (en) * | 2007-03-22 | 2017-01-31 | Invention Science Fund I, Llc | Coordinating instances of a thread or other service in emulation |
US9378108B2 (en) * | 2007-03-22 | 2016-06-28 | Invention Science Fund I, Llc | Implementing performance-dependent transfer or execution decisions from service emulation indications |
US20080235000A1 (en) * | 2007-03-22 | 2008-09-25 | Searete Llc, A Limited Liability Corporation Of The State Of Delaware | Implementing security control practice omission decisions from service emulation indications |
US8996483B2 (en) * | 2007-03-28 | 2015-03-31 | Ricoh Co., Ltd. | Method and apparatus for recording associations with logs |
US20080243688A1 (en) * | 2007-03-28 | 2008-10-02 | Hart Peter E | Method and Apparatus for Recording Transactions with a Portable Logging Device |
US7937695B2 (en) * | 2007-04-27 | 2011-05-03 | International Business Machines Corporation | Reducing number of exception checks |
US8332819B2 (en) * | 2007-05-03 | 2012-12-11 | Siemens Industry, Inc. | Diagnostic and trouble-shooting methods in a wireless control and sensor network |
US7937621B2 (en) * | 2007-05-07 | 2011-05-03 | Intel Corporation | Transient fault detection by integrating an SRMT code and a non SRMT code in a single application |
US7937620B2 (en) * | 2007-05-07 | 2011-05-03 | Intel Corporation | Transient fault detection by integrating an SRMT code and a non SRMT code in a single application |
US7685182B2 (en) * | 2007-05-08 | 2010-03-23 | Microsoft Corporation | Interleaved garbage collections |
CN101681266B (zh) * | 2007-05-22 | 2014-06-18 | 皇家飞利浦电子股份有限公司 | 用于包括多个设备的联网控制系统的编译器和编译方法 |
US8819673B1 (en) * | 2007-05-24 | 2014-08-26 | United Services Automobile Association (Usaa) | Systems and methods for java virtual machine management |
US8533686B2 (en) * | 2007-06-14 | 2013-09-10 | Red Hat, Inc. | Methods and systems for porting Sysprof |
US7949637B1 (en) * | 2007-06-27 | 2011-05-24 | Emc Corporation | Storage management for fine grained tiered storage with thin provisioning |
US8024315B2 (en) * | 2007-07-20 | 2011-09-20 | International Business Machines Corporation | Method of dynamically providing a compound object's source information during its development |
US8543866B2 (en) * | 2007-07-20 | 2013-09-24 | Qualcomm Incorporated | Remote access diagnostic mechanism for communication devices |
US8291393B2 (en) * | 2007-08-20 | 2012-10-16 | International Business Machines Corporation | Just-in-time compiler support for interruptible code |
US8266607B2 (en) * | 2007-08-27 | 2012-09-11 | International Business Machines Corporation | Lock reservation using cooperative multithreading and lightweight single reader reserved locks |
US20090063595A1 (en) * | 2007-09-05 | 2009-03-05 | Mark Graham Stoodley | Method and apparatus for updating references to objects in a garbage collection operation |
US9483405B2 (en) * | 2007-09-20 | 2016-11-01 | Sony Interactive Entertainment Inc. | Simplified run-time program translation for emulating complex processor pipelines |
US20090089772A1 (en) * | 2007-09-28 | 2009-04-02 | International Business Machines Corporation | Arrangement for scheduling jobs with rules and events |
GB2454885B (en) * | 2007-11-21 | 2012-06-06 | Advanced Risc Mach Ltd | Interrupt jitter suppression |
US8196110B2 (en) * | 2007-11-30 | 2012-06-05 | International Business Machines Corporation | Method and apparatus for verifying a suspect return pointer in a stack |
EP2240867A4 (en) * | 2007-12-13 | 2011-02-09 | Redknee Inc | METHOD AND SYSTEM FOR STORAGE |
US8321840B2 (en) * | 2007-12-27 | 2012-11-27 | Intel Corporation | Software flow tracking using multiple threads |
US20090182689A1 (en) * | 2008-01-15 | 2009-07-16 | Microsoft Corporation | Rule-based dynamic operation evaluation |
US8839225B2 (en) | 2008-01-23 | 2014-09-16 | International Business Machines Corporation | Generating and applying patches to a computer program code concurrently with its execution |
US9298568B2 (en) * | 2008-02-07 | 2016-03-29 | International Business Machines Corporation | Method and apparatus for device driver state storage during diagnostic phase |
US7925640B2 (en) * | 2008-02-14 | 2011-04-12 | Oracle America, Inc. | Dynamic multiple inheritance method dispatch data structure including an m-table size, i-table containing one or more holder addressor regions and type extension testing by frugal perfect hashing |
US8539468B2 (en) * | 2008-02-18 | 2013-09-17 | International Business Machines Corporation | System and methods for replacing software application classes using transparent object adapters |
US8566797B2 (en) * | 2008-02-27 | 2013-10-22 | Red Hat, Inc. | Heuristic backtracer |
US20090217246A1 (en) * | 2008-02-27 | 2009-08-27 | Nce Technologies, Inc. | Evaluating Software Programming Skills |
US20090228875A1 (en) * | 2008-03-04 | 2009-09-10 | Devries Alex | Method and System for Reducing Disk Allocation by Profiling Symbol Usage |
US8239836B1 (en) * | 2008-03-07 | 2012-08-07 | The Regents Of The University Of California | Multi-variant parallel program execution to detect malicious code injection |
US8869109B2 (en) * | 2008-03-17 | 2014-10-21 | Microsoft Corporation | Disassembling an executable binary |
US8434064B2 (en) * | 2008-03-28 | 2013-04-30 | Microsoft Corporation | Detecting memory errors using write integrity testing |
US8473935B2 (en) * | 2008-04-21 | 2013-06-25 | Microsoft Corporation | Just-ahead-of-time compilation |
US7987215B2 (en) * | 2008-04-22 | 2011-07-26 | Microsoft Corporation | Efficiently marking objects with large reference sets |
US8453129B2 (en) * | 2008-04-24 | 2013-05-28 | International Business Machines Corporation | Using hardware interrupts to drive dynamic binary code recompilation |
US8386664B2 (en) * | 2008-05-22 | 2013-02-26 | International Business Machines Corporation | Reducing runtime coherency checking with global data flow analysis |
US8281295B2 (en) * | 2008-05-23 | 2012-10-02 | International Business Machines Corporation | Computer analysis and runtime coherency checking |
US8166041B2 (en) * | 2008-06-13 | 2012-04-24 | Microsoft Corporation | Search index format optimizations |
US8099721B2 (en) * | 2008-06-17 | 2012-01-17 | Microsoft Corporation | Parsing of declarations in all branches of preprocessor conditionals |
RU2495476C2 (ru) | 2008-06-20 | 2013-10-10 | Инвенсис Системз, Инк. | Системы и способы для иммерсивного взаимодействия с действительными и/или имитируемыми техническими средствами для управления технологическим процессом, контроля состояния окружающей среды и производственного контроля |
US7921280B2 (en) * | 2008-06-27 | 2011-04-05 | Intel Corporation | Selectively powered retirement unit using a partitioned allocation array and a partitioned writeback array |
US8793671B2 (en) * | 2008-06-28 | 2014-07-29 | Microsoft Corporation | Interface optimization in a closed system |
US8065349B2 (en) * | 2008-06-30 | 2011-11-22 | Oracle America, Inc. | Method and apparatus for performing concurrent garbage collection |
US20100017246A1 (en) * | 2008-07-20 | 2010-01-21 | Farrell Glenn H | Software user interface for specification of project task dependencies and deadlines |
US8285670B2 (en) | 2008-07-22 | 2012-10-09 | International Business Machines Corporation | Dynamically maintaining coherency within live ranges of direct buffers |
EP2315126A4 (en) * | 2008-08-11 | 2012-06-20 | Fujitsu Ltd | PEST INFORMATION COLLECTION PROGRAM, PASSING INFORMATION COLLECTION METHOD, AND PASSING INFORMATION COLLECTION SYSTEM |
US8307353B2 (en) * | 2008-08-12 | 2012-11-06 | Oracle America, Inc. | Cross-domain inlining in a system virtual machine |
US20100064061A1 (en) * | 2008-09-05 | 2010-03-11 | Apple Inc. | Providing substantially immediate action in response to input event |
US8301672B2 (en) * | 2008-09-22 | 2012-10-30 | Advanced Micro Devices, Inc. | GPU assisted garbage collection |
US8185733B2 (en) * | 2008-10-02 | 2012-05-22 | Ricoh Co., Ltd. | Method and apparatus for automatically publishing content based identifiers |
US8914781B2 (en) * | 2008-10-24 | 2014-12-16 | Microsoft Corporation | Scalability analysis for server systems |
US8417903B2 (en) | 2008-12-19 | 2013-04-09 | International Business Machines Corporation | Preselect list using hidden pages |
US8307350B2 (en) | 2009-01-14 | 2012-11-06 | Microsoft Corporation | Multi level virtual function tables |
US8776032B2 (en) * | 2009-01-29 | 2014-07-08 | Microsoft Corporation | Automatic region-based verification of garbage collectors |
US8341602B2 (en) * | 2009-01-29 | 2012-12-25 | Microsoft Corporation | Automated verification of a type-safe operating system |
US8782607B2 (en) * | 2009-02-20 | 2014-07-15 | Microsoft Corporation | Contract failure behavior with escalation policy |
US8239842B2 (en) * | 2009-02-24 | 2012-08-07 | Microsoft Corporation | Implicit line continuation |
US9134973B2 (en) * | 2009-02-26 | 2015-09-15 | Red Hat, Inc. | Dynamic compiling and loading at runtime |
US9052984B2 (en) * | 2009-02-26 | 2015-06-09 | International Business Machines Corporation | Exception declaration refactoring to reduce memory footprint |
US10152504B2 (en) | 2009-03-11 | 2018-12-11 | Actian Netherlands B.V. | Column-store database architecture utilizing positional delta tree update system and methods |
US8397219B2 (en) * | 2009-03-31 | 2013-03-12 | Oracle America, Inc. | Method and apparatus for tracking enregistered memory locations |
US8112674B2 (en) * | 2009-04-01 | 2012-02-07 | International Business Machines Corporation | Device activity triggered device diagnostics |
KR101663545B1 (ko) * | 2009-04-06 | 2016-10-07 | 시게이트 테크놀로지 엘엘씨 | 코드의 동적 재배치 방법 및 이를 이용한 디스크 드라이브 |
US8139504B2 (en) * | 2009-04-07 | 2012-03-20 | Raytheon Bbn Technologies Corp. | System, device, and method for unifying differently-routed networks using virtual topology representations |
US8949103B2 (en) * | 2009-05-01 | 2015-02-03 | Microsoft Corporation | Program code simulator |
US8103850B2 (en) * | 2009-05-05 | 2012-01-24 | International Business Machines Corporation | Dynamic translation in the presence of intermixed code and data |
US20100306751A1 (en) * | 2009-05-28 | 2010-12-02 | James Paul Schneider | Execution result caching and searching |
US8127060B2 (en) | 2009-05-29 | 2012-02-28 | Invensys Systems, Inc | Methods and apparatus for control configuration with control objects that are fieldbus protocol-aware |
US8463964B2 (en) | 2009-05-29 | 2013-06-11 | Invensys Systems, Inc. | Methods and apparatus for control configuration with enhanced change-tracking |
US8677329B2 (en) * | 2009-06-03 | 2014-03-18 | Apple Inc. | Methods and apparatuses for a compiler server |
US9117071B2 (en) | 2009-06-03 | 2015-08-25 | Apple Inc. | Methods and apparatuses for secure compilation |
TWM376919U (en) * | 2009-06-08 | 2010-03-21 | Hon Hai Prec Ind Co Ltd | Antenna |
US8572589B2 (en) * | 2009-06-30 | 2013-10-29 | Agilent Technologies, Inc. | Programming language translator and enabling translation of machine-centric commands for controlling instrument |
US8473900B2 (en) * | 2009-07-01 | 2013-06-25 | Advanced Micro Devices, Inc. | Combining classes referenced by immutable classes into a single synthetic class |
US20110099439A1 (en) * | 2009-10-23 | 2011-04-28 | Infineon Technologies Ag | Automatic diverse software generation for use in high integrity systems |
US9355144B2 (en) * | 2009-12-10 | 2016-05-31 | Nokia Technologies Oy | Method and apparatus for recycling information fragments in information spaces |
US8972994B2 (en) * | 2009-12-23 | 2015-03-03 | Intel Corporation | Method and apparatus to bypass object lock by speculative execution of generated bypass code shell based on bypass failure threshold in managed runtime environment |
US9043769B2 (en) * | 2009-12-28 | 2015-05-26 | Hyperion Core Inc. | Optimization of loops and data flow sections in multi-core processor environment |
US8578343B2 (en) * | 2010-01-15 | 2013-11-05 | Oracle America, Inc. | System and method for overflow detection using partial evaluations |
CN102147734B (zh) * | 2010-02-10 | 2016-01-13 | 甲骨文国际公司 | 运行时类提取的方法和系统 |
US8397217B2 (en) * | 2010-02-22 | 2013-03-12 | International Business Machines Corporation | Integrating templates into tests |
US20110208948A1 (en) * | 2010-02-23 | 2011-08-25 | Infineon Technologies Ag | Reading to and writing from peripherals with temporally separated redundant processor execution |
US8327109B2 (en) * | 2010-03-02 | 2012-12-04 | Advanced Micro Devices, Inc. | GPU support for garbage collection |
US8887142B2 (en) * | 2010-03-10 | 2014-11-11 | Microsoft Corporation | Loop control flow diversion |
US20110252216A1 (en) * | 2010-04-12 | 2011-10-13 | Tatu Ylonen Oy Ltd | Thread-local hash table based write barrier buffers |
CN101923510B (zh) * | 2010-04-13 | 2012-07-04 | 张克东 | 软件探测方法和应用该方法的软件探测器及软件探测系统 |
CN102662827B (zh) * | 2010-04-13 | 2015-02-04 | 张溟 | 一种软件探测方法 |
CN102622299B (zh) * | 2010-04-13 | 2014-10-01 | 张溟 | 一种软件探测系统的工作方法 |
US8365156B2 (en) * | 2010-04-17 | 2013-01-29 | Microsoft Corporation | Intermediate language support for change resilience |
US8375373B2 (en) | 2010-04-19 | 2013-02-12 | Microsoft Corporation | Intermediate language support for change resilience |
US8997049B1 (en) * | 2010-05-21 | 2015-03-31 | Cadence Design Systems, Inc. | Method and system for debugging of compiled code using an interpreter |
US9038038B1 (en) * | 2010-06-01 | 2015-05-19 | Google Inc. | Just in time cloud compilation |
FR2961922B1 (fr) * | 2010-06-29 | 2013-12-13 | Flexycore | Procede de compilation selective, dispositif et produit programme d'ordinateur correspondant. |
US9095002B2 (en) | 2010-07-12 | 2015-07-28 | Invensys Systems, Inc. | Methods and apparatus for process control with improved communication links |
US8331855B2 (en) | 2010-07-12 | 2012-12-11 | Invensys Systems, Inc. | Methods and apparatus for process control with improved communication links |
US8516356B2 (en) | 2010-07-20 | 2013-08-20 | Infineon Technologies Ag | Real-time error detection by inverse processing |
US9195486B2 (en) * | 2010-07-30 | 2015-11-24 | Apple Inc. | Observation and analysis based code optimization |
US8862613B2 (en) * | 2010-07-30 | 2014-10-14 | Sap Ag | Extensibility of business process and application logic |
US9146759B2 (en) * | 2010-07-30 | 2015-09-29 | Apple Inc. | Assumption-based compilation |
JP5583514B2 (ja) * | 2010-08-11 | 2014-09-03 | インターナショナル・ビジネス・マシーンズ・コーポレーション | バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム |
US8359496B1 (en) * | 2010-08-31 | 2013-01-22 | Google Inc. | Fault-resistant just-in-time compiler |
US8893306B2 (en) | 2010-08-31 | 2014-11-18 | International Business Machines Corporation | Resource management and security system |
US20120054773A1 (en) * | 2010-08-31 | 2012-03-01 | International Business Machines Corporation | Processor support for secure device driver architecture |
US8495750B2 (en) | 2010-08-31 | 2013-07-23 | International Business Machines Corporation | Filesystem management and security system |
EP2616928B1 (en) | 2010-09-17 | 2016-11-02 | Soft Machines, Inc. | Single cycle multi-branch prediction including shadow cache for early far branch prediction |
JP5148674B2 (ja) * | 2010-09-27 | 2013-02-20 | 株式会社東芝 | プログラム並列化装置およびプログラム |
CA2719653A1 (en) * | 2010-11-05 | 2011-01-18 | Ibm Canada Limited - Ibm Canada Limitee | Partial inlining with software based restart |
CN102479155B (zh) * | 2010-11-30 | 2014-07-02 | 国际商业机器公司 | 用于网络应用服务器系统的内存过载管理的方法和系统 |
US8806465B2 (en) | 2010-12-03 | 2014-08-12 | International Busines Machines Corporation | Refactor exception class hierarchy for reduced footprint and faster application start |
KR101166803B1 (ko) | 2010-12-31 | 2012-07-26 | 세종대학교산학협력단 | 비휘발성 메모리 및 휘발성 메모리를 포함하는 메모리 시스템 및 그 시스템을 이용한 처리 방법 |
WO2012103253A2 (en) * | 2011-01-27 | 2012-08-02 | Soft Machines, Inc. | Multilevel conversion table cache for translating guest instructions to native instructions |
WO2012103209A2 (en) | 2011-01-27 | 2012-08-02 | Soft Machines, Inc. | Guest instruction to native instruction range based mapping using a conversion look aside buffer of a processor |
WO2012103359A2 (en) | 2011-01-27 | 2012-08-02 | Soft Machines, Inc. | Hardware acceleration components for translating guest instructions to native instructions |
WO2012103367A2 (en) | 2011-01-27 | 2012-08-02 | Soft Machines, Inc. | Guest to native block address mappings and management of native code storage |
WO2012103245A2 (en) | 2011-01-27 | 2012-08-02 | Soft Machines Inc. | Guest instruction block with near branching and far branching sequence construction to native instruction block |
US8595701B2 (en) * | 2011-02-04 | 2013-11-26 | Fujitsu Limited | Symbolic execution and test generation for GPU programs |
US9280439B2 (en) * | 2011-02-11 | 2016-03-08 | Sap Se | Usage analysis of productive environment to establish new data source for process optimization and project planning |
US8782644B2 (en) * | 2011-02-15 | 2014-07-15 | Oracle International Corporation | Preventing unsafe sharing through confinement of mutable captured variables |
US20120233605A1 (en) * | 2011-03-07 | 2012-09-13 | Microsoft Corporation | Application Compatibility Leveraging Successful Resolution of Issues |
JP5614348B2 (ja) | 2011-03-18 | 2014-10-29 | 富士通株式会社 | 命令処理方法、命令処理装置、及び命令処理プログラム |
US9069893B2 (en) * | 2011-03-23 | 2015-06-30 | International Business Machines Corporation | Automatic verification of determinism for parallel programs |
EP2689326B1 (en) | 2011-03-25 | 2022-11-16 | Intel Corporation | Memory fragments for supporting code block execution by using virtual cores instantiated by partitionable engines |
WO2012135031A2 (en) | 2011-03-25 | 2012-10-04 | Soft Machines, Inc. | Executing instruction sequence code blocks by using virtual cores instantiated by partitionable engines |
WO2012135041A2 (en) | 2011-03-25 | 2012-10-04 | Soft Machines, Inc. | Register file segments for supporting code block execution by using virtual cores instantiated by partitionable engines |
CA2738422C (en) * | 2011-04-28 | 2018-11-20 | Ibm Canada Limited-Ibm Canada Limitee | Examining concurrent system states |
US9183111B2 (en) | 2011-05-10 | 2015-11-10 | Microsoft Technology Licensing, Llc | Methods and computer program products for collecting storage resource performance data using file system hooks |
CN103649932B (zh) | 2011-05-20 | 2017-09-26 | 英特尔公司 | 资源的分散分配以及用于支持由多个引擎执行指令序列的互连结构 |
WO2012162189A1 (en) | 2011-05-20 | 2012-11-29 | Soft Machines, Inc. | An interconnect structure to support the execution of instruction sequences by a plurality of engines |
US9063749B2 (en) * | 2011-05-27 | 2015-06-23 | Qualcomm Incorporated | Hardware support for hashtables in dynamic languages |
US8650537B2 (en) | 2011-05-30 | 2014-02-11 | International Business Machines Corporation | Optimizing an object-oriented program by transforming invocations of synthetic accessor methods |
US8578080B2 (en) * | 2011-07-01 | 2013-11-05 | Intel Corporation | Secure handling of interrupted events utilizing a virtual interrupt definition table |
US9116685B2 (en) * | 2011-07-19 | 2015-08-25 | Qualcomm Incorporated | Table call instruction for frequently called functions |
US8527544B1 (en) | 2011-08-11 | 2013-09-03 | Pure Storage Inc. | Garbage collection in a storage system |
US8549498B2 (en) * | 2011-08-23 | 2013-10-01 | International Business Machines Corporation | Integration of trace selection and trace profiling in dynamic optimizers |
US9063673B2 (en) * | 2011-08-30 | 2015-06-23 | Uniquesoft, Llc | System and method for implementing application code from application requirements |
US9053017B2 (en) | 2011-09-09 | 2015-06-09 | Microsoft Technology Licensing, Llc | Managing object lifetime in a cyclic graph |
US8819649B2 (en) * | 2011-09-09 | 2014-08-26 | Microsoft Corporation | Profile guided just-in-time (JIT) compiler and byte code generation |
US8990546B2 (en) | 2011-10-31 | 2015-03-24 | Freescale Semiconductor, Inc. | Data processing system with safe call and return |
US9043765B2 (en) * | 2011-11-09 | 2015-05-26 | Microsoft Technology Licensing, Llc | Simultaneously targeting multiple homogeneous and heterogeneous runtime environments |
US20130132061A1 (en) * | 2011-11-18 | 2013-05-23 | Michael J. Rieschl | Just-in-time static translation system for emulated computing environments |
KR101703401B1 (ko) | 2011-11-22 | 2017-02-06 | 소프트 머신즈, 인크. | 다중 엔진 마이크로프로세서용 가속 코드 최적화기 |
US20150039859A1 (en) | 2011-11-22 | 2015-02-05 | Soft Machines, Inc. | Microprocessor accelerated code optimizer |
US9411616B2 (en) * | 2011-12-09 | 2016-08-09 | Ca, Inc. | Classloader/instrumentation approach for invoking non-bound libraries |
US8789033B2 (en) | 2012-02-03 | 2014-07-22 | International Business Machines Corporation | Reducing application startup time by optimizing spatial locality of instructions in executables |
US20130205282A1 (en) * | 2012-02-07 | 2013-08-08 | Microsoft Corporation | Transferring program execution from compiled code to interpreted code |
US9155139B2 (en) | 2012-03-09 | 2015-10-06 | Rockwell Automation Technologies, Inc. | LED driver circuits and methods |
US9922090B1 (en) | 2012-03-27 | 2018-03-20 | Actian Netherlands, B.V. | System and method for automatic vertical decomposition of a table for improving input/output and memory utilization in a database |
GB2500707B (en) * | 2012-03-30 | 2014-09-17 | Cognovo Ltd | Multiprocessor system, apparatus and methods |
US10559123B2 (en) * | 2012-04-04 | 2020-02-11 | Qualcomm Incorporated | Patched shading in graphics processing |
US9628438B2 (en) * | 2012-04-06 | 2017-04-18 | Exablox | Consistent ring namespaces facilitating data storage and organization in network infrastructures |
US10037212B2 (en) * | 2012-04-20 | 2018-07-31 | Nxp Usa, Inc. | Information processing device and method for protecting data in a call stack |
JP2013235386A (ja) * | 2012-05-08 | 2013-11-21 | Internatl Business Mach Corp <Ibm> | 最適化装置、最適化方法、及び最適化プログラム |
US20130332434A1 (en) * | 2012-06-11 | 2013-12-12 | Actian Netherlands, B.V. | System and method using partial just-in-time complation to resolve memory access pattern problems in hash table probing |
US8782620B2 (en) * | 2012-06-12 | 2014-07-15 | International Business Machines Corporation | Processing reified generics in object-based programming environments |
US9182984B2 (en) | 2012-06-15 | 2015-11-10 | International Business Machines Corporation | Local clearing control |
US8881126B2 (en) * | 2012-07-31 | 2014-11-04 | Oracle International Corporation | Systems and methods for testing a compiler through compile-time decision feedback |
US9274772B2 (en) | 2012-08-13 | 2016-03-01 | Microsoft Technology Licensing, Llc. | Compact type layouts |
TWI477970B (zh) * | 2012-08-24 | 2015-03-21 | Realtek Semiconductor Corp | 電子裝置的模式切換方法與相關的電子裝置 |
JP5998764B2 (ja) * | 2012-09-04 | 2016-09-28 | 富士通株式会社 | 情報処理装置、ログ出力方法およびログ出力プログラム |
US9753846B2 (en) * | 2012-09-06 | 2017-09-05 | Red Hat, Inc. | Adjusting the operating memory used by a virtual machine during runtime |
US20150199228A1 (en) * | 2012-09-06 | 2015-07-16 | Google Inc. | Conditional branch programming technique |
US8826240B1 (en) * | 2012-09-29 | 2014-09-02 | Appurify, Inc. | Application validation through object level hierarchy analysis |
US9069902B2 (en) | 2012-10-12 | 2015-06-30 | Vmware, Inc. | Software test automation |
US10067858B2 (en) | 2012-10-12 | 2018-09-04 | Vmware, Inc. | Cloud-based software testing |
US10387294B2 (en) | 2012-10-12 | 2019-08-20 | Vmware, Inc. | Altering a test |
US8839201B2 (en) * | 2012-10-12 | 2014-09-16 | Vmware, Inc. | Capturing test data associated with error conditions in software item testing |
US9684587B2 (en) | 2012-10-12 | 2017-06-20 | Vmware, Inc. | Test creation with execution |
US8839202B2 (en) * | 2012-10-12 | 2014-09-16 | Vmware, Inc. | Test environment managed within tests |
US9292422B2 (en) | 2012-10-12 | 2016-03-22 | Vmware, Inc. | Scheduled software item testing |
US9292416B2 (en) | 2012-10-12 | 2016-03-22 | Vmware, Inc. | Software development kit testing |
US8949794B2 (en) | 2012-10-12 | 2015-02-03 | Vmware, Inc. | Binding a software item to a plain english control name |
US9015832B1 (en) | 2012-10-19 | 2015-04-21 | Google Inc. | Application auditing through object level code inspection |
US9231615B2 (en) * | 2012-10-24 | 2016-01-05 | Seagate Technology Llc | Method to shorten hash chains in Lempel-Ziv compression of data with repetitive symbols |
KR20140054948A (ko) * | 2012-10-30 | 2014-05-09 | 한국전자통신연구원 | 임베디드 시스템을 위한 오픈씨엘 응용 소프트웨어 개발 지원 도구 구성 및 방법 |
US9389868B2 (en) | 2012-11-01 | 2016-07-12 | International Business Machines Corporation | Confidence-driven selective predication of processor instructions |
US9436475B2 (en) * | 2012-11-05 | 2016-09-06 | Nvidia Corporation | System and method for executing sequential code using a group of threads and single-instruction, multiple-thread processor incorporating the same |
US8826254B2 (en) * | 2012-11-08 | 2014-09-02 | Concurix Corporation | Memoizing with read only side effects |
US9113358B1 (en) | 2012-11-19 | 2015-08-18 | Google Inc. | Configurable network virtualization |
US8984542B2 (en) * | 2012-11-30 | 2015-03-17 | Facebook, Inc. | Method and system for binding objects in dynamic programming languages using caching techniques |
US9268668B1 (en) | 2012-12-20 | 2016-02-23 | Google Inc. | System for testing markup language applications |
US9274935B1 (en) | 2013-01-15 | 2016-03-01 | Google Inc. | Application testing system with application programming interface |
US10496775B2 (en) * | 2013-01-31 | 2019-12-03 | General Electric Company | Method and system for use in dynamically configuring data acquisition systems |
US9052888B2 (en) | 2013-02-21 | 2015-06-09 | International Business Machines Corporation | Vectorization in an optimizing compiler |
US11507574B1 (en) | 2013-03-13 | 2022-11-22 | Actian Netherlands B.V. | Adaptive selection of a processing method based on observed performance for improved and robust system efficiency |
US10275255B2 (en) | 2013-03-15 | 2019-04-30 | Intel Corporation | Method for dependency broadcasting through a source organized source view data structure |
WO2014150806A1 (en) | 2013-03-15 | 2014-09-25 | Soft Machines, Inc. | A method for populating register view data structure by using register template snapshots |
US9811342B2 (en) | 2013-03-15 | 2017-11-07 | Intel Corporation | Method for performing dual dispatch of blocks and half blocks |
US9886279B2 (en) | 2013-03-15 | 2018-02-06 | Intel Corporation | Method for populating and instruction view data structure by using register template snapshots |
WO2014151652A1 (en) | 2013-03-15 | 2014-09-25 | Soft Machines Inc | Method and apparatus to allow early dependency resolution and data forwarding in a microprocessor |
US9632825B2 (en) | 2013-03-15 | 2017-04-25 | Intel Corporation | Method and apparatus for efficient scheduling for asymmetrical execution units |
US10140138B2 (en) | 2013-03-15 | 2018-11-27 | Intel Corporation | Methods, systems and apparatus for supporting wide and efficient front-end operation with guest-architecture emulation |
WO2014150991A1 (en) | 2013-03-15 | 2014-09-25 | Soft Machines, Inc. | A method for implementing a reduced size register view data structure in a microprocessor |
US9569216B2 (en) | 2013-03-15 | 2017-02-14 | Soft Machines, Inc. | Method for populating a source view data structure by using register template snapshots |
WO2014150971A1 (en) * | 2013-03-15 | 2014-09-25 | Soft Machines, Inc. | A method for dependency broadcasting through a block organized source view data structure |
US9891924B2 (en) | 2013-03-15 | 2018-02-13 | Intel Corporation | Method for implementing a reduced size register view data structure in a microprocessor |
CN105122206B (zh) | 2013-03-15 | 2018-11-09 | 英特尔公司 | 用于支持推测的访客返回地址栈仿真的方法和装置 |
KR102063656B1 (ko) | 2013-03-15 | 2020-01-09 | 소프트 머신즈, 인크. | 블록들로 그룹화된 멀티스레드 명령어들을 실행하기 위한 방법 |
KR102083390B1 (ko) | 2013-03-15 | 2020-03-02 | 인텔 코포레이션 | 네이티브 분산된 플래그 아키텍처를 이용하여 게스트 중앙 플래그 아키텍처를 에뮬레이션하는 방법 |
US9904625B2 (en) | 2013-03-15 | 2018-02-27 | Intel Corporation | Methods, systems and apparatus for predicting the way of a set associative cache |
US9021443B1 (en) | 2013-04-12 | 2015-04-28 | Google Inc. | Test automation API for host devices |
US9552382B2 (en) | 2013-04-23 | 2017-01-24 | Exablox Corporation | Reference counter integrity checking |
US9298433B2 (en) * | 2013-05-02 | 2016-03-29 | Facebook, Inc. | Optimizing intermediate representation of script code for fast path execution |
US10127138B2 (en) | 2013-06-06 | 2018-11-13 | Microsoft Technology Licensing, Llc. | Debugging native code by transitioning from execution in native mode to execution in interpreted mode |
WO2014201270A1 (en) | 2013-06-12 | 2014-12-18 | Exablox Corporation | Hybrid garbage collection |
WO2014205286A1 (en) | 2013-06-19 | 2014-12-24 | Exablox Corporation | Data scrubbing in cluster-based storage systems |
US9934242B2 (en) | 2013-07-10 | 2018-04-03 | Exablox Corporation | Replication of data between mirrored data sites |
US10453534B2 (en) * | 2013-08-07 | 2019-10-22 | Qualcomm Technologies International, Ltd. | Patching of programmable memory |
US9268670B1 (en) | 2013-08-08 | 2016-02-23 | Google Inc. | System for module selection in software application testing including generating a test executable based on an availability of root access |
US9740716B2 (en) * | 2013-08-21 | 2017-08-22 | Oracle International Corporation | System and method for dynamically selecting a garbage collection algorithm based on the contents of heap regions |
US9229858B2 (en) | 2013-10-08 | 2016-01-05 | Red Hat, Inc. | Concurrent garbage collector thread |
US10248556B2 (en) | 2013-10-16 | 2019-04-02 | Exablox Corporation | Forward-only paged data storage management where virtual cursor moves in only one direction from header of a session to data field of the session |
US9053228B1 (en) | 2013-10-22 | 2015-06-09 | The Mathworks, Inc. | Determining when to evaluate program code and provide results in a live evaluation programming environment |
US9985829B2 (en) | 2013-12-12 | 2018-05-29 | Exablox Corporation | Management and provisioning of cloud connected devices |
DE102013021655A1 (de) * | 2013-12-18 | 2015-06-18 | Giesecke & Devrient Gmbh | Verfahren und Vorrichtung zur Bearbeitung von Wertdokumenten |
US20150186168A1 (en) * | 2013-12-30 | 2015-07-02 | Unisys Corporation | Dedicating processing resources to just-in-time compilers and instruction processors in a dynamic translator |
US9524178B2 (en) * | 2013-12-30 | 2016-12-20 | Unisys Corporation | Defining an instruction path to be compiled by a just-in-time (JIT) compiler |
US9213563B2 (en) * | 2013-12-30 | 2015-12-15 | Unisys Corporation | Implementing a jump instruction in a dynamic translator that uses instruction code translation and just-in-time compilation |
WO2015102631A1 (en) * | 2014-01-02 | 2015-07-09 | Hewlett Packard Development Company, L.P. | Distributed kernel thread list processing for kernel patching |
US9367415B1 (en) | 2014-01-20 | 2016-06-14 | Google Inc. | System for testing markup language applications on a device |
US9491229B1 (en) | 2014-01-24 | 2016-11-08 | Google Inc. | Application experience sharing system |
US9170922B1 (en) | 2014-01-27 | 2015-10-27 | Google Inc. | Remote application debugging |
US9774582B2 (en) | 2014-02-03 | 2017-09-26 | Exablox Corporation | Private cloud connected device cluster architecture |
US9830324B2 (en) | 2014-02-04 | 2017-11-28 | Exablox Corporation | Content based organization of file systems |
JP5988444B2 (ja) | 2014-02-14 | 2016-09-07 | インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation | 最適化したバイナリー・モジュールをテストする方法、並びに、当該最適化したバイナリー・モジュールをテストするためのコンピュータ及びそのコンピュータ・プログラム |
US9703948B2 (en) * | 2014-03-28 | 2017-07-11 | Intel Corporation | Return-target restrictive return from procedure instructions, processors, methods, and systems |
WO2015163931A1 (en) * | 2014-04-24 | 2015-10-29 | Hewlett-Packard Development Company, L.P. | Dynamically applying a patch to a computer application |
US10261889B2 (en) | 2014-06-25 | 2019-04-16 | Microsoft Technology Licensing, Llc | Techniques for edit-and-continue and enhanced optimized debugging on optimized code |
US9690626B2 (en) * | 2014-06-27 | 2017-06-27 | Vmware, Inc. | Processing workloads in single-threaded environments |
KR101703984B1 (ko) * | 2014-07-18 | 2017-02-09 | 주식회사 큐램 | 메모리 처리 방법, 및 메모리 처리 시스템 |
US10338914B2 (en) * | 2014-09-01 | 2019-07-02 | Hewlett Packard Enterprise Development Lp | Dynamically applying a patch to a shared library |
US9268543B1 (en) * | 2014-09-23 | 2016-02-23 | International Business Machines Corporation | Efficient code cache management in presence of infrequently used complied code fragments |
US9772824B2 (en) * | 2015-03-25 | 2017-09-26 | International Business Machines Corporation | Program structure-based blocking |
US9389851B1 (en) * | 2015-06-02 | 2016-07-12 | Oracle International Corporation | System and method for providing consistency between software library repositories |
US9880787B2 (en) * | 2015-08-06 | 2018-01-30 | Dialog Semiconductor B.V. | System and method for memory patching circuits |
US20170060924A1 (en) | 2015-08-26 | 2017-03-02 | Exablox Corporation | B-Tree Based Data Model for File Systems |
US9632755B1 (en) | 2015-10-06 | 2017-04-25 | International Business Machines Corporation | Interface method resolution in object oriented programming models |
KR102079499B1 (ko) * | 2015-10-20 | 2020-02-21 | 엘에스산전 주식회사 | Plc 위치 결정 시스템의 축별 제어주기 독립 할당 방법 |
US9864655B2 (en) | 2015-10-30 | 2018-01-09 | Google Llc | Methods and apparatus for mobile computing device security in testing facilities |
US9733930B2 (en) * | 2015-12-21 | 2017-08-15 | Successfactors, Inc. | Logical level difference detection between software revisions |
US9696973B1 (en) * | 2016-02-24 | 2017-07-04 | Semmle Limited | Compilation cache with imports scanner |
US9846553B2 (en) | 2016-05-04 | 2017-12-19 | Exablox Corporation | Organization and management of key-value stores |
FR3056782B1 (fr) * | 2016-09-26 | 2019-12-13 | Airbus Operations | Generation de codes applicatifs a partir d'une specification formelle |
JP6433468B2 (ja) * | 2016-09-28 | 2018-12-05 | 本田技研工業株式会社 | プログラム作成支援方法 |
US10108406B2 (en) * | 2016-10-24 | 2018-10-23 | International Business Machines Corporation | Linking optimized entry points for local-use-only function pointers |
US10169016B2 (en) * | 2016-10-24 | 2019-01-01 | International Business Machines Corporation | Executing optimized local entry points |
US10108407B2 (en) * | 2016-10-24 | 2018-10-23 | International Business Machines Corporation | Loading optimized local entry points for local-use-only function pointers |
US10169011B2 (en) * | 2016-10-24 | 2019-01-01 | International Business Machines Corporation | Comparisons in function pointer localization |
US10108404B2 (en) | 2016-10-24 | 2018-10-23 | International Business Machines Corporation | Compiling optimized entry points for local-use-only function pointers |
US10338932B2 (en) | 2016-11-15 | 2019-07-02 | Google Llc | Bootstrapping profile-guided compilation and verification |
US10025694B1 (en) * | 2016-12-22 | 2018-07-17 | SafeDK Mobile Ltd. | Monitoring activity of software development kits using stack trace analysis |
US10244010B2 (en) * | 2017-02-16 | 2019-03-26 | Nokia Of America Corporation | Data processing apparatus configured to recover a network connection, a method, a system and a non-transitory computer readable medium configured to perform same |
US20180275976A1 (en) * | 2017-03-22 | 2018-09-27 | Qualcomm Innovation Center, Inc. | Link time optimization in presence of a linker script using path based rules |
US10846196B1 (en) | 2017-06-09 | 2020-11-24 | Azul Systems, Inc. | Code optimization for connected managed runtime environments |
CN107562775B (zh) * | 2017-07-14 | 2020-04-24 | 创新先进技术有限公司 | 一种基于区块链的数据处理方法及设备 |
US10642971B2 (en) * | 2017-09-04 | 2020-05-05 | Cisco Technology, Inc. | Methods and systems for ensuring program code flow integrity |
CN109710396B (zh) | 2017-10-26 | 2023-08-22 | 华为技术有限公司 | 一种信息采集及内存释放的方法及装置 |
US10564955B2 (en) * | 2018-01-03 | 2020-02-18 | Huawei Technologies Co., Ltd. | Method to manage multiple versions of parts of a software application and to retire older versions in a dynamically updatable software system |
US10402320B1 (en) | 2018-02-27 | 2019-09-03 | Oracle International Corporation | Verifying the validity of a transition from a current tail template to a new tail template for a fused object |
US10613864B2 (en) | 2018-03-16 | 2020-04-07 | Texas Instruments Incorporated | Processor with hardware supported memory buffer overflow detection |
US11716558B2 (en) | 2018-04-16 | 2023-08-01 | Charter Communications Operating, Llc | Apparatus and methods for integrated high-capacity data and wireless network services |
US10908910B2 (en) | 2018-07-27 | 2021-02-02 | Oracle International Corporation | Lazy copying of runtime-managed stack frames |
CN110908790B (zh) * | 2018-09-14 | 2022-02-22 | 旺宏电子股份有限公司 | 存储器存储装置及其操作方法 |
US11175802B2 (en) * | 2018-09-21 | 2021-11-16 | Sap Se | Configuration object deletion manager |
US11129213B2 (en) | 2018-10-12 | 2021-09-21 | Charter Communications Operating, Llc | Apparatus and methods for cell identification in wireless networks |
KR20200053318A (ko) * | 2018-11-08 | 2020-05-18 | 삼성전자주식회사 | 인공 신경망의 연산 처리 그래프를 관리하는 시스템 및 이를 이용한 연산 처리 그래프를 관리하는 방법 |
US10956133B2 (en) * | 2018-11-28 | 2021-03-23 | International Business Machines Corporation | Static optimization of production code for dynamic profiling |
US11182205B2 (en) * | 2019-01-02 | 2021-11-23 | Mellanox Technologies, Ltd. | Multi-processor queuing model |
US11129171B2 (en) | 2019-02-27 | 2021-09-21 | Charter Communications Operating, Llc | Methods and apparatus for wireless signal maximization and management in a quasi-licensed wireless system |
US11048549B2 (en) * | 2019-04-04 | 2021-06-29 | Google Llc | Transferral of process state and/or components in computing environments |
CN112015491B (zh) * | 2019-05-30 | 2022-08-09 | 华为技术有限公司 | 实现函数跳转的方法、装置及计算机存储介质 |
CN114375313A (zh) * | 2019-07-19 | 2022-04-19 | 帝人株式会社 | 热塑性树脂和包含该热塑性树脂的光学构件 |
US11720340B2 (en) | 2019-07-30 | 2023-08-08 | Hewlett-Packard Development Company, L.P. | Hash map of executable control blocks |
CN110443053B (zh) * | 2019-07-31 | 2023-03-14 | 四川效率源信息安全技术股份有限公司 | 一种基于密钥循环表及映射表的密钥生成方法 |
US11070420B2 (en) * | 2019-09-13 | 2021-07-20 | Pacific Track, LLC | System, device, and method for configuring the handling of events |
US11182149B2 (en) * | 2019-09-30 | 2021-11-23 | International Business Machines Corporation | Just-in-time code patching |
US11526358B2 (en) * | 2019-10-15 | 2022-12-13 | Raytheon Company | Deterministic execution replay for multicore systems |
US11026205B2 (en) | 2019-10-23 | 2021-06-01 | Charter Communications Operating, Llc | Methods and apparatus for device registration in a quasi-licensed wireless system |
US11301221B2 (en) * | 2019-12-13 | 2022-04-12 | Sap Se | Rapid code compiling system |
US11537429B2 (en) * | 2019-12-19 | 2022-12-27 | Red Hat, Inc. | Sub-idle thread priority class |
RU2729210C1 (ru) * | 2020-01-28 | 2020-08-05 | Акционерное общество «Информационные спутниковые системы» имени академика М.Ф. Решетнёва» | Комплекс тестирования программного обеспечения электронных устройств |
CN111680289B (zh) * | 2020-04-29 | 2023-04-14 | 中国科学院信息工程研究所 | 一种链式哈希栈运算方法及装置 |
EP3940565A1 (en) * | 2020-07-15 | 2022-01-19 | Hewlett-Packard Development Company, L.P. | System management states |
US11573894B2 (en) | 2020-10-29 | 2023-02-07 | Oracle International Corporation | Tracking garbage collection states of references |
US11573794B2 (en) * | 2021-03-25 | 2023-02-07 | Oracle International Corporation | Implementing state-based frame barriers to process colorless roots during concurrent execution |
US11875193B2 (en) | 2021-03-25 | 2024-01-16 | Oracle International Corporation | Tracking frame states of call stack frames including colorless roots |
US11513954B2 (en) | 2021-03-25 | 2022-11-29 | Oracle International Corporation | Consolidated and concurrent remapping and identification for colorless roots |
CN113127001B (zh) * | 2021-04-28 | 2024-03-08 | 上海米哈游璃月科技有限公司 | 一种代码编译过程监控方法、装置、设备和介质 |
US11734171B2 (en) | 2021-05-19 | 2023-08-22 | Oracle International Corporation | Snapshot at the beginning marking in Z garbage collector |
CN113190466A (zh) * | 2021-06-08 | 2021-07-30 | 科东(广州)软件科技有限公司 | 自动化测试方法、装置、设备及介质 |
CN117377949A (zh) * | 2021-06-30 | 2024-01-09 | 华为技术有限公司 | 用于提供上下文敏感的、非侵入性数据处理优化框架的方法和系统 |
US11847035B2 (en) | 2021-08-23 | 2023-12-19 | International Business Machines Corporation | Functional test of processor code modification operations |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH11237991A (ja) * | 1997-10-06 | 1999-08-31 | Sun Microsyst Inc | コンパイル済アクティベーションを動的に逆最適化する方法及び装置 |
JPH11327906A (ja) * | 1998-03-24 | 1999-11-30 | Sun Microsyst Inc | 動的リンキング及び動的ロ―ディングの存在下において動的にディスパッチされたコ―ルの静的結合 |
Family Cites Families (167)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4367685A (en) * | 1980-09-08 | 1983-01-11 | Frame Scott W | Process and apparatus for precisely metering quantities of granular or pulverulent solids |
US4525780A (en) * | 1981-05-22 | 1985-06-25 | Data General Corporation | Data processing system having a memory using object-based information and a protection scheme for determining access rights to such information |
US4675829A (en) | 1984-07-27 | 1987-06-23 | Intellicorp Corporation | Method and apparatus for building knowledge-based systems |
JPS6260037A (ja) * | 1985-09-09 | 1987-03-16 | Nec Corp | コンパイラの目的プログラムの自動検査方式 |
US4831517A (en) * | 1986-10-10 | 1989-05-16 | International Business Machines Corporation | Branch and return on address instruction and methods and apparatus for implementing same in a digital data processing system |
JPH01155438A (ja) * | 1987-12-12 | 1989-06-19 | Hitachi Ltd | コンパイラ試験方式 |
JP2666847B2 (ja) * | 1988-06-06 | 1997-10-22 | 日本電気株式会社 | 異種言語間連絡方式 |
US4924408A (en) * | 1988-08-19 | 1990-05-08 | International Business Machines Corporation | Technique for compilation of knowledge bases |
EP0416331B1 (en) | 1989-08-31 | 1995-05-17 | Yokogawa Electric Corporation | Line computer |
JPH03186945A (ja) * | 1989-12-18 | 1991-08-14 | Oki Electric Ind Co Ltd | プログラム実行特性の測定方法 |
JPH04540A (ja) * | 1990-04-17 | 1992-01-06 | Toshiba Corp | デバック装置 |
JPH044434A (ja) * | 1990-04-21 | 1992-01-08 | Mitsubishi Electric Corp | プログラムのトレース方法 |
GB2246883B (en) * | 1990-08-07 | 1995-01-11 | Matsushita Electric Ind Co Ltd | Inference processor |
JP2901720B2 (ja) * | 1990-08-10 | 1999-06-07 | 株式会社日立製作所 | オブジェクトコード比較方法 |
US5301325A (en) | 1991-03-07 | 1994-04-05 | Digital Equipment Corporation | Use of stack depth to identify architechture and calling standard dependencies in machine code |
US5450575A (en) | 1991-03-07 | 1995-09-12 | Digital Equipment Corporation | Use of stack depth to identify machine code mistakes |
JPH04287134A (ja) * | 1991-03-15 | 1992-10-12 | Nec Corp | 簡易トレース情報取得方式 |
US5293614A (en) * | 1991-04-08 | 1994-03-08 | Texas Instruments Incorporated | System and method for hard real-time garbage collection requiring a write barrier but no read barrier |
US5193180A (en) * | 1991-06-21 | 1993-03-09 | Pure Software Inc. | System for modifying relocatable object code files to monitor accesses to dynamically allocated memory |
JP2921190B2 (ja) | 1991-07-25 | 1999-07-19 | 日本電気株式会社 | 並列実行方式 |
JPH05233326A (ja) * | 1991-12-19 | 1993-09-10 | Internatl Business Mach Corp <Ibm> | コンピュータシステムにおいて事象を取り扱う方法及びシステム |
JPH05324399A (ja) * | 1992-03-23 | 1993-12-07 | Toshiba Corp | 情報監視装置 |
US5515538A (en) * | 1992-05-29 | 1996-05-07 | Sun Microsystems, Inc. | Apparatus and method for interrupt handling in a multi-threaded operating system kernel |
US5457681A (en) * | 1992-06-05 | 1995-10-10 | Washington University | ATM-Ethernet portal/concentrator |
US5442792A (en) | 1992-08-07 | 1995-08-15 | Hughes Aircraft Company | Expert system compilation method |
JPH06119203A (ja) * | 1992-10-06 | 1994-04-28 | Oki Electric Ind Co Ltd | デバック行削除装置 |
EP0664905B1 (de) * | 1992-10-15 | 1996-04-03 | Siemens Aktiengesellschaft | Verfahren zur durchfürhung von tests an auf einem rechner parallel ablauffähigen objekten eines objektorientierten programmes |
JPH06187143A (ja) * | 1992-10-23 | 1994-07-08 | Sony Corp | 電子装置 |
JPH06139107A (ja) * | 1992-10-30 | 1994-05-20 | Nec Corp | ブレイクアドレス検出回路 |
JP3199876B2 (ja) * | 1992-11-20 | 2001-08-20 | 株式会社東芝 | プログラム解析システムおよび方法 |
JPH06168111A (ja) * | 1992-11-30 | 1994-06-14 | Fuji Facom Corp | デバッグ文の自動作成方式 |
US5560003A (en) * | 1992-12-21 | 1996-09-24 | Iowa State University Research Foundation, Inc. | System and hardware module for incremental real time garbage collection and memory management |
DE69327448T2 (de) | 1992-12-21 | 2004-03-04 | Sun Microsystems, Inc., Mountain View | Verfahren und Vorrichtung für Teilaufgaben in verteiltem Verarbeitungssystem |
US5367685A (en) | 1992-12-22 | 1994-11-22 | Firstperson, Inc. | Method and apparatus for resolving data references in generated code |
US5603030A (en) | 1993-01-07 | 1997-02-11 | Microsoft Corporation | Method and system for destruction of objects using multiple destructor functions in an object-oriented computer system |
JPH06222952A (ja) * | 1993-01-27 | 1994-08-12 | Toshiba Corp | デバッグ支援装置 |
US5452457A (en) | 1993-01-29 | 1995-09-19 | International Business Machines Corporation | Program construct and methods/systems for optimizing assembled code for execution |
JPH06274375A (ja) * | 1993-03-20 | 1994-09-30 | Hitachi Ltd | システム評価装置 |
US5537573A (en) * | 1993-05-28 | 1996-07-16 | Rambus, Inc. | Cache system and method for prefetching of data |
US5632034A (en) * | 1993-06-01 | 1997-05-20 | International Business Machines Corporation | Controlling method invocation sequence through virtual functions in an object-oriented class library |
CA2123924A1 (en) * | 1993-06-02 | 1994-12-03 | Charles Douglas Blewett | Specifying contexts in callback style programming |
US6126329A (en) * | 1993-06-08 | 2000-10-03 | Rational Software Coporation | Method and apparatus for accurate profiling of computer programs |
US5469574A (en) | 1993-06-18 | 1995-11-21 | International Business Machines Corporation | Method and system for interfacing interpreted applications with compiled procedures using signature files |
US5748961A (en) * | 1993-07-12 | 1998-05-05 | Digital Equipment Corporation | Efficient method and apparatus for compiling and linking modules of computer code in a large software system |
US5892944A (en) * | 1993-07-20 | 1999-04-06 | Kabushiki Kaisha Toshiba | Program execution and operation right management system suitable for single virtual memory scheme |
US5721854A (en) | 1993-11-02 | 1998-02-24 | International Business Machines Corporation | Method and apparatus for dynamic conversion of computer instructions |
JP3480973B2 (ja) * | 1993-11-30 | 2003-12-22 | 富士通株式会社 | 並列処理システムの動作解析装置 |
US5761511A (en) * | 1994-01-28 | 1998-06-02 | Sun Microsystems, Inc. | Method and apparatus for a type-safe framework for dynamically extensible objects |
US5590329A (en) * | 1994-02-04 | 1996-12-31 | Lucent Technologies Inc. | Method and apparatus for detecting memory access errors |
US5732273A (en) * | 1995-08-11 | 1998-03-24 | Digital Equipment Corporation | System for monitoring compute system performance |
JPH07262044A (ja) * | 1994-03-25 | 1995-10-13 | Hitachi Ltd | イベントトレース解析方法 |
JPH07271631A (ja) * | 1994-03-31 | 1995-10-20 | Fujitsu Ltd | デバッガ |
AUPM519694A0 (en) * | 1994-04-19 | 1994-05-12 | Griffith University | Method for testing and debugging computer programs |
US5835743A (en) * | 1994-06-30 | 1998-11-10 | Sun Microsystems, Inc. | Application binary interface and method of interfacing binary application program to digital computer |
US6341293B1 (en) * | 1994-07-13 | 2002-01-22 | Object Technology Licensing Corp | Real-time computer “garbage collector” |
US6006033A (en) * | 1994-08-15 | 1999-12-21 | International Business Machines Corporation | Method and system for reordering the instructions of a computer program to optimize its execution |
US5613120A (en) | 1994-10-20 | 1997-03-18 | Silicon Graphics, Inc. | System and method for enabling, without recompilation, modification of class definitions and implementations in an object-oriented computer program |
US5590332A (en) | 1995-01-13 | 1996-12-31 | Baker; Henry G. | Garbage collection, tail recursion and first-class continuations in stack-oriented languages |
US5511190A (en) * | 1995-01-20 | 1996-04-23 | Tandem Computers, Inc. | Hash-based database grouping system and method |
JPH08202579A (ja) * | 1995-01-23 | 1996-08-09 | Toshiba Corp | プログラミング支援装置及びプログラミング支援方法 |
EP0729097A1 (en) * | 1995-02-07 | 1996-08-28 | Sun Microsystems, Inc. | Method and apparatus for run-time memory access checking and memory leak detection of a multi-threaded program |
US5655122A (en) * | 1995-04-05 | 1997-08-05 | Sequent Computer Systems, Inc. | Optimizing compiler with static prediction of branch probability, branch frequency and function frequency |
US5619698A (en) * | 1995-05-05 | 1997-04-08 | Apple Computer, Inc. | Method and apparatus for patching operating systems |
JPH08320795A (ja) * | 1995-05-24 | 1996-12-03 | Fuji Xerox Co Ltd | プログラム制御システム |
US5835771A (en) * | 1995-06-07 | 1998-11-10 | Rogue Wave Software, Inc. | Method and apparatus for generating inline code using template metaprograms |
US5805899A (en) * | 1995-07-06 | 1998-09-08 | Sun Microsystems, Inc. | Method and apparatus for internal versioning of objects using a mapfile |
US5675804A (en) | 1995-08-31 | 1997-10-07 | International Business Machines Corporation | System and method for enabling a compiled computer program to invoke an interpretive computer program |
GB9526129D0 (en) * | 1995-12-21 | 1996-02-21 | Philips Electronics Nv | Machine code format translation |
US6301652B1 (en) * | 1996-01-31 | 2001-10-09 | International Business Machines Corporation | Instruction cache alignment mechanism for branch targets based on predicted execution frequencies |
US5848274A (en) | 1996-02-29 | 1998-12-08 | Supercede, Inc. | Incremental byte code compilation system |
US5764989A (en) * | 1996-02-29 | 1998-06-09 | Supercede, Inc. | Interactive software development system |
US5815720A (en) | 1996-03-15 | 1998-09-29 | Institute For The Development Of Emerging Architectures, L.L.C. | Use of dynamic translation to collect and exploit run-time information in an optimizing compilation system |
US6138238A (en) * | 1997-12-11 | 2000-10-24 | Sun Microsystems, Inc. | Stack-based access control using code and executor identifiers |
US6151703A (en) * | 1996-05-20 | 2000-11-21 | Inprise Corporation | Development system with methods for just-in-time compilation of programs |
US5815718A (en) | 1996-05-30 | 1998-09-29 | Sun Microsystems, Inc. | Method and system for loading classes in read-only memory |
US5946487A (en) * | 1996-06-10 | 1999-08-31 | Lsi Logic Corporation | Object-oriented multi-media architecture |
US6189048B1 (en) * | 1996-06-26 | 2001-02-13 | Sun Microsystems, Inc. | Mechanism for dispatching requests in a distributed object system |
US5761513A (en) * | 1996-07-01 | 1998-06-02 | Sun Microsystems, Inc. | System and method for exception handling in dynamically linked programs |
US6067577A (en) * | 1996-09-30 | 2000-05-23 | Apple Computer, Inc. | Dynamic method resolution for native methods in a dynamic object-oriented programming language |
US6041179A (en) * | 1996-10-03 | 2000-03-21 | International Business Machines Corporation | Object oriented dispatch optimization |
US5835958A (en) * | 1996-10-29 | 1998-11-10 | Sun Microsystems, Inc. | Method and apparatus for dynamically sizing non-contiguous runtime stacks |
US5857104A (en) | 1996-11-26 | 1999-01-05 | Hewlett-Packard Company | Synthetic dynamic branch prediction |
US5950221A (en) * | 1997-02-06 | 1999-09-07 | Microsoft Corporation | Variably-sized kernel memory stacks |
US5905855A (en) * | 1997-02-28 | 1999-05-18 | Transmeta Corporation | Method and apparatus for correcting errors in computer systems |
JPH10240581A (ja) * | 1997-02-28 | 1998-09-11 | Fujitsu Ltd | Cpu時間測定装置 |
US5948059A (en) * | 1997-03-21 | 1999-09-07 | International Business Machines Corporation | Method and apparatus for synchronizing multimedia messages in different servers |
US5920876A (en) | 1997-04-23 | 1999-07-06 | Sun Microsystems, Inc. | Performing exact garbage collection using bitmaps that identify pointer values within objects |
US5757690A (en) * | 1997-04-23 | 1998-05-26 | Exponential Technology, Inc. | Embedded ROM with RAM valid bits for fetching ROM-code updates from external memory |
JP3138658B2 (ja) * | 1997-04-28 | 2001-02-26 | 日本電気アイシーマイコンシステム株式会社 | タスク・トレース装置 |
US6175916B1 (en) * | 1997-05-06 | 2001-01-16 | Microsoft Corporation | Common-thread inter-process function calls invoked by jumps to invalid addresses |
US6330659B1 (en) * | 1997-11-06 | 2001-12-11 | Iready Corporation | Hardware accelerator for an object-oriented programming language |
US5842016A (en) * | 1997-05-29 | 1998-11-24 | Microsoft Corporation | Thread synchronization in a garbage-collected system using execution barriers |
US6094664A (en) | 1997-05-30 | 2000-07-25 | Sun Microsystems | Method and apparatus for optimizing the null pointer exception in an object-oriented programming environment with statically typed variables |
US6199075B1 (en) * | 1997-05-30 | 2001-03-06 | Sun Microsystems, Inc. | Method and apparatus for generational garbage collection of a heap memory shared by multiple processors |
US6138210A (en) * | 1997-06-23 | 2000-10-24 | Sun Microsystems, Inc. | Multi-stack memory architecture |
US5873105A (en) * | 1997-06-26 | 1999-02-16 | Sun Microsystems, Inc. | Bounded-pause time garbage collection system and method including write barrier associated with a source instance of a partially relocated object |
US5873104A (en) | 1997-06-26 | 1999-02-16 | Sun Microsystems, Inc. | Bounded-pause time garbage collection system and method including write barrier associated with source and target instances of a partially relocated object |
US6513156B2 (en) * | 1997-06-30 | 2003-01-28 | Sun Microsystems, Inc. | Interpreting functions utilizing a hybrid of virtual and native machine instructions |
US6105040A (en) | 1997-06-30 | 2000-08-15 | Sun Microsystems, Inc. | Method and apparatus for managing stored objects |
US6317872B1 (en) * | 1997-07-11 | 2001-11-13 | Rockwell Collins, Inc. | Real time processor optimized for executing JAVA programs |
US6173276B1 (en) * | 1997-08-21 | 2001-01-09 | Scicomp, Inc. | System and method for financial instrument modeling and valuation |
GB9717715D0 (en) * | 1997-08-22 | 1997-10-29 | Philips Electronics Nv | Data processor with localised memory reclamation |
US6557091B2 (en) * | 1997-08-22 | 2003-04-29 | Koninklijke Philips Electronics N.V. | Data processor with localized memory reclamation |
US6112304A (en) * | 1997-08-27 | 2000-08-29 | Zipsoft, Inc. | Distributed computing architecture |
US6275938B1 (en) * | 1997-08-28 | 2001-08-14 | Microsoft Corporation | Security enhancement for untrusted executable code |
US6366876B1 (en) * | 1997-09-29 | 2002-04-02 | Sun Microsystems, Inc. | Method and apparatus for assessing compatibility between platforms and applications |
US6072953A (en) * | 1997-09-30 | 2000-06-06 | International Business Machines Corporation | Apparatus and method for dynamically modifying class files during loading for execution |
US6047125A (en) * | 1997-10-01 | 2000-04-04 | Sun Microsystems, Inc. | Garbage collection system for improved use of memory by removal of reference conflicts |
US5970249A (en) * | 1997-10-06 | 1999-10-19 | Sun Microsystems, Inc. | Method and apparatus for performing byte-code optimization during pauses |
US6079018A (en) * | 1997-10-08 | 2000-06-20 | Agorics, Inc. | System and method for generating unique secure values for digitally signing documents |
GB9721659D0 (en) * | 1997-10-14 | 1997-12-10 | Philips Electronics Nv | Space-limited marking structure for tracing garbage collectors |
US6260077B1 (en) * | 1997-10-24 | 2001-07-10 | Sun Microsystems, Inc. | Method, apparatus and program product for interfacing a multi-threaded, client-based API to a single-threaded, server-based API |
US5966702A (en) | 1997-10-31 | 1999-10-12 | Sun Microsystems, Inc. | Method and apparatus for pre-processing and packaging class files |
JP3377419B2 (ja) * | 1997-11-11 | 2003-02-17 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 命令列生成方法及び装置、変換方法、及びコンピュータ |
US6170083B1 (en) * | 1997-11-12 | 2001-01-02 | Intel Corporation | Method for performing dynamic optimization of computer code |
US6664978B1 (en) * | 1997-11-17 | 2003-12-16 | Fujitsu Limited | Client-server computer network management architecture |
US6175957B1 (en) * | 1997-12-09 | 2001-01-16 | International Business Machines Corporation | Method of, system for, and computer program product for providing efficient utilization of memory hierarchy through code restructuring |
US6108797A (en) * | 1997-12-11 | 2000-08-22 | Winbond Electronics Corp. | Method and system for loading microprograms in partially defective memory |
US6349406B1 (en) * | 1997-12-12 | 2002-02-19 | International Business Machines Coporation | Method and system for compensating for instrumentation overhead in trace data by computing average minimum event times |
US6081665A (en) * | 1997-12-19 | 2000-06-27 | Newmonics Inc. | Method for efficient soft real-time execution of portable byte code computer programs |
US6412105B1 (en) * | 1997-12-31 | 2002-06-25 | Elbrus International Limited | Computer method and apparatus for compilation of multi-way decisions |
US6044403A (en) * | 1997-12-31 | 2000-03-28 | At&T Corp | Network server platform for internet, JAVA server and video application server |
US6141768A (en) * | 1998-03-12 | 2000-10-31 | Winbond Electronics Corp. | Self-corrective memory system and method |
US6658492B1 (en) | 1998-03-20 | 2003-12-02 | Sun Microsystems, Inc. | System and method for reducing the footprint of preloaded classes |
US6704927B1 (en) * | 1998-03-24 | 2004-03-09 | Sun Microsystems, Inc. | Static binding of dynamically-dispatched calls in the presence of dynamic linking and loading |
US6148391A (en) * | 1998-03-26 | 2000-11-14 | Sun Microsystems, Inc. | System for simultaneously accessing one or more stack elements by multiple functional units using real stack addresses |
US6052739A (en) * | 1998-03-26 | 2000-04-18 | Sun Microsystems, Inc. | Method and apparatus for object-oriented interrupt system |
US6374286B1 (en) * | 1998-04-06 | 2002-04-16 | Rockwell Collins, Inc. | Real time processor capable of concurrently running multiple independent JAVA machines |
US6189141B1 (en) * | 1998-05-04 | 2001-02-13 | Hewlett-Packard Company | Control path evaluating trace designator with dynamically adjustable thresholds for activation of tracing for high (hot) activity and low (cold) activity of flow control |
US6047295A (en) * | 1998-05-05 | 2000-04-04 | International Business Machines Corporation | Computer system, program product and method of managing weak references with a concurrent mark sweep collector |
US6098080A (en) * | 1998-05-05 | 2000-08-01 | International Business Machines Corporation | Computer system, program product and method of collecting interned data with a mark sweep collector |
US6735761B1 (en) * | 1998-05-15 | 2004-05-11 | International Business Machines Corporation | Compile method frame detection method and device code discarding method and computer |
US6223202B1 (en) * | 1998-06-05 | 2001-04-24 | International Business Machines Corp. | Virtual machine pooling |
US6209066B1 (en) * | 1998-06-30 | 2001-03-27 | Sun Microsystems, Inc. | Method and apparatus for memory allocation in a multi-threaded virtual machine |
US6205465B1 (en) * | 1998-07-22 | 2001-03-20 | Cisco Technology, Inc. | Component extensible parallel execution of multiple threads assembled from program components specified with partial inter-component sequence information |
ATE323305T1 (de) * | 1998-07-24 | 2006-04-15 | Sun Microsystems Inc | Verfahren und vorrichtung zur durchführung einer deterministischen speicherzuordnungsantwort in einem computer-system |
US6327704B1 (en) * | 1998-08-06 | 2001-12-04 | Hewlett-Packard Company | System, method, and product for multi-branch backpatching in a dynamic translator |
US6253215B1 (en) * | 1998-08-17 | 2001-06-26 | Sun Microsystems | Method, apparatus, and article of manufacture for facilitating resource management for applications having two types of program code |
US6269425B1 (en) * | 1998-08-20 | 2001-07-31 | International Business Machines Corporation | Accessing data from a multiple entry fully associative cache buffer in a multithread data processing system |
US6327701B2 (en) * | 1998-09-15 | 2001-12-04 | Sun Microsystems, Inc. | Method and apparatus for finding bugs related to garbage collection in a virtual machine |
DE19843640A1 (de) * | 1998-09-23 | 2000-03-30 | Siemens Ag | Verfahren zum Konfigurieren eines konfigurierbaren Hardware-Blocks |
US6381735B1 (en) * | 1998-10-02 | 2002-04-30 | Microsoft Corporation | Dynamic classification of sections of software |
US6499137B1 (en) * | 1998-10-02 | 2002-12-24 | Microsoft Corporation | Reversible load-time dynamic linking |
US6308318B2 (en) * | 1998-10-07 | 2001-10-23 | Hewlett-Packard Company | Method and apparatus for handling asynchronous exceptions in a dynamic translation system |
US6317756B1 (en) * | 1998-10-07 | 2001-11-13 | International Business Machines Corporation | On-the-fly garbage collector |
US6654953B1 (en) * | 1998-10-09 | 2003-11-25 | Microsoft Corporation | Extending program languages with source-program attribute tags |
US20020147969A1 (en) * | 1998-10-21 | 2002-10-10 | Richard A. Lethin | Dynamic optimizing object code translator for architecture emulation and dynamic optimizing object code translation method |
US6625635B1 (en) * | 1998-11-02 | 2003-09-23 | International Business Machines Corporation | Deterministic and preemptive thread scheduling and its use in debugging multithreaded applications |
US6351844B1 (en) * | 1998-11-05 | 2002-02-26 | Hewlett-Packard Company | Method for selecting active code traces for translation in a caching dynamic translator |
GB9825102D0 (en) * | 1998-11-16 | 1999-01-13 | Insignia Solutions Plc | Computer system |
US6463580B1 (en) * | 1998-11-18 | 2002-10-08 | Intel Corporation | Parallel processing utilizing highly correlated data values |
US6353829B1 (en) * | 1998-12-23 | 2002-03-05 | Cray Inc. | Method and system for memory allocation in a multiprocessing environment |
US6412081B1 (en) * | 1999-01-15 | 2002-06-25 | Conexant Systems, Inc. | System and method for providing a trap and patch function to low power, cost conscious, and space constrained applications |
US7111290B1 (en) * | 1999-01-28 | 2006-09-19 | Ati International Srl | Profiling program execution to identify frequently-executed portions and to assist binary translation |
US6317816B1 (en) * | 1999-01-29 | 2001-11-13 | International Business Machines Corporation | Multiprocessor scaleable system and method for allocating memory from a heap |
US6338133B1 (en) * | 1999-03-12 | 2002-01-08 | International Business Machines Corporation | Measured, allocation of speculative branch instructions to processor execution units |
US6629113B1 (en) * | 1999-06-30 | 2003-09-30 | International Business Machines Corporation | Method and system for dynamically adjustable and configurable garbage collector |
US6480862B1 (en) * | 1999-04-23 | 2002-11-12 | International Business Machines Corporation | Relation-based ordering of objects in an object heap |
US6381738B1 (en) * | 1999-07-16 | 2002-04-30 | International Business Machines Corporation | Method for optimizing creation and destruction of objects in computer programs |
US6615253B1 (en) * | 1999-08-31 | 2003-09-02 | Accenture Llp | Efficient server side data retrieval for execution of client side applications |
US6529909B1 (en) * | 1999-08-31 | 2003-03-04 | Accenture Llp | Method for translating an object attribute converter in an information services patterns environment |
US6539396B1 (en) * | 1999-08-31 | 2003-03-25 | Accenture Llp | Multi-object identifier system and method for information service pattern environment |
US6529948B1 (en) * | 1999-08-31 | 2003-03-04 | Accenture Llp | Multi-object fetch component |
US6457111B1 (en) * | 1999-12-14 | 2002-09-24 | International Business Machines Corporation | Method and system for allocation of a persistence indicator for an object in an object-oriented environment |
US6671795B1 (en) * | 2000-01-21 | 2003-12-30 | Intel Corporation | Method and apparatus for pausing execution in a processor or the like |
US6651248B1 (en) * | 2000-09-01 | 2003-11-18 | International Business Machines Corporation | Method and apparatus for efficient interface method dispatch |
US6978285B2 (en) * | 2002-08-22 | 2005-12-20 | Intel Corporation | Methods and apparatus for concurrent enumeration of an object reference root set |
-
1998
- 1998-11-16 GB GBGB9825102.8A patent/GB9825102D0/en not_active Ceased
-
1999
- 1999-03-16 EP EP99909100A patent/EP1208425B1/en not_active Expired - Lifetime
- 1999-03-16 WO PCT/GB1999/000788 patent/WO2000029937A2/en active IP Right Grant
- 1999-03-16 JP JP2000582880A patent/JP2003526135A/ja not_active Withdrawn
- 1999-03-16 AU AU28469/99A patent/AU2846999A/en not_active Abandoned
- 1999-03-16 DE DE69939495T patent/DE69939495D1/de not_active Expired - Fee Related
-
2001
- 2001-05-16 US US09/859,133 patent/US6862728B2/en not_active Expired - Lifetime
- 2001-05-16 US US09/859,072 patent/US6901587B2/en not_active Expired - Lifetime
- 2001-05-16 US US09/858,578 patent/US7069549B2/en not_active Expired - Lifetime
- 2001-05-16 US US09/859,134 patent/US7039738B2/en not_active Expired - Lifetime
- 2001-05-16 US US09/858,426 patent/US7007005B2/en not_active Expired - Lifetime
- 2001-05-16 US US09/859,162 patent/US6691303B2/en not_active Expired - Lifetime
- 2001-05-16 US US09/859,135 patent/US7058929B2/en not_active Expired - Lifetime
- 2001-05-16 US US09/858,826 patent/US6925637B2/en not_active Expired - Lifetime
- 2001-05-16 US US09/858,827 patent/US7080366B2/en not_active Expired - Lifetime
- 2001-05-16 US US09/859,161 patent/US6766513B2/en not_active Expired - Lifetime
- 2001-05-16 US US09/859,163 patent/US20020032719A1/en not_active Abandoned
-
2007
- 2007-06-29 US US11/771,629 patent/US8127280B2/en not_active Expired - Fee Related
-
2010
- 2010-07-09 JP JP2010156628A patent/JP4783471B2/ja not_active Expired - Lifetime
-
2012
- 2012-02-03 US US13/365,936 patent/US8631219B2/en not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH11237991A (ja) * | 1997-10-06 | 1999-08-31 | Sun Microsyst Inc | コンパイル済アクティベーションを動的に逆最適化する方法及び装置 |
JPH11327906A (ja) * | 1998-03-24 | 1999-11-30 | Sun Microsyst Inc | 動的リンキング及び動的ロ―ディングの存在下において動的にディスパッチされたコ―ルの静的結合 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102955735A (zh) * | 2011-08-24 | 2013-03-06 | 英业达股份有限公司 | 基本输入输出系统测试方法 |
Also Published As
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4783471B2 (ja) | クラスが有するメソッドを呼出して実行するコンピュータ・システムが行う方法 | |
US6093216A (en) | Method of run-time tracking of object references in Java programs | |
US8402224B2 (en) | Thread-shared software code caches | |
KR101872625B1 (ko) | 동적 타입 어레이 객체들에 액세스할 시의 크기 의존적 타입 | |
US6968546B2 (en) | Debugging support using dynamic re-compilation | |
US7934204B2 (en) | Partitioning code in program code conversion | |
US20020144245A1 (en) | Static compilation of instrumentation code for debugging support | |
US20060095483A1 (en) | Modified computer architecture with finalization of objects | |
EP1190315B1 (en) | Facilitating garbage collection during object versioning for space and time dimensional computing | |
KR100577366B1 (ko) | 이종의 자바 메소드를 실행하는 방법 및 장치 | |
GB2404044A (en) | Partitioning code in program code conversion to account for self-modifying code | |
US6931638B2 (en) | Method and apparatus to facilitate sharing optimized instruction code in a multitasking virtual machine | |
US9898268B2 (en) | Enhanced local commoning | |
KR20070083024A (ko) | 가상 머신 환경에서의 메소드 호출 방법 및 상기 방법을수행하는 가상 머신이 탑재된 시스템 | |
Stilkerich | An OSEK Operating System Interface and Memory Management for Java | |
Matthews | Papers on Poly/ML | |
AU2005236088A1 (en) | Modified computer architecture with finalization of objects |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20101201 |
|
A601 | Written request for extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20110221 |
|
A602 | Written permission of extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20110224 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20110519 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20110609 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20110708 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20140715 Year of fee payment: 3 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
S531 | Written request for registration of change of domicile |
Free format text: JAPANESE INTERMEDIATE CODE: R313531 |
|
R350 | Written notification of registration of transfer |
Free format text: JAPANESE INTERMEDIATE CODE: R350 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
EXPY | Cancellation because of completion of term |