(57)【特許請求の範囲】
【請求項１】
オブジェクトを参照するポインタを介してメモリへのアクセスが行われるプロセッサアーキテクチャが実装されたプロセッサであって、
前記オブジェクト中で互いに別々に、ポインタがポインタエリアに格納され、データがデータエリアに格納され、
前記ポインタは、該ポインタが参照する前記オブジェクトのメモリアドレスを含み、生成される前記オブジェクトの前記ポインタエリアの長さと前記データエリアの長さとをパラメータとして受け取り、それらを属性として前記オブジェクト自身に格納する、プロセッサの特別なオブジェクト生成命令により前記オブジェクトは生成され、生成された前記オブジェクトは、オブジェクトのサイズを決定し、オブジェクト内のポインタとデータとを区切るために、前記オブジェクト自身に格納される、前記ポインタエリアの長さ及び前記データエリアの長さを表わす前記属性が与えられており、
前記プロセッサは、別々のデータレジスタとポインタレジスタとを有するレジスタセットを備え、前記ポインタレジスタは、前記メモリ内のオブジェクトへのアクセスのために用いられることを特徴とするプロセッサ。
【請求項２】
いずれのポインタにも、所定の空値又は存在するオブジェクトの前記メモリアドレスのいずれかのみが書き込まれることを特徴とする請求項１に記載のプロセッサ。
【請求項３】
データ操作とポインタ操作のための別々の命令を持つ命令セットが用いられることを特徴とする請求項１又は２に記載のプロセッサ。
【請求項４】
ポインタのロード操作が、前記オブジェクトの前記ポインタエリアから前記ポインタレジスタにポインタを排他的にロードし、ポインタの格納操作が、前記ポインタレジスタの内容を前記オブジェクトの前記ポインタエリアに排他的に格納し、
データのロード操作が、データレジスタ内の前記オブジェクトの前記データエリアからデータを排他的にロードし、データの格納操作が、前記オブジェクトの前記データエリア内に前記データレジスタの内容を排他的に格納することを特徴とする請求項１から３までのいずれか１項に記載のプロセッサ。
【請求項５】
前記オブジェクト生成命令を持つ命令セットであって、生成されるオブジェクトにアクセスすることができる前に、生成される該オブジェクトの前記ポインタエリアのすべてのポインタを空値で初期化する命令セットが用いられることを特徴とする請求項１から４までのいずれか１項に記載のプロセッサ。
【請求項６】
前記オブジェクト生成命令が、割り込みとその後の再開が可能であることを特徴とする請求項５に記載のプロセッサ。
【請求項７】
前記オブジェクト生成命令が割り込みがあった場合に、不完全に初期化されたオブジェクトが生成され、該オブジェクトは、完全に初期化されたオブジェクトとは前記プロセッサによって明確に区別されることを特徴とする請求項６に記載のプロセッサ。
【請求項８】
前記プロセッサが、プログラムの実行時に排他的に読み出される別々のメモリエリアにおいて保持されるコンスタントなオブジェクトをサポートし、
コンスタントなオブジェクトへのポインタが、前記プロセッサによって明確に識別されることを特徴とする請求項１から７までのいずれか１項に記載のプロセッサ。
【請求項９】
ポインタスタックエリアとデータスタックエリアに分けられるプログラムスタックであって、前記２つのスタックエリアのそれぞれにおける占有部分の長さがデータレジスタで管理されるスタックインデックスによって示されるプログラムスタックが用いられることを特徴とする請求項１から８までのいずれか１項に記載のプロセッサ。
【請求項１０】
前記ポインタスタック上にポインタをプッシュするための命令であって、割り込みを許さずに前記ポインタスタック上に対応するポインタを格納し、また前記ポインタスタックインデックスを増加する命令が用いられることを特徴とする請求項９に記載のプロセッサ。
【請求項１１】
前記プロセッサが、オペレーティングシステムによって管理される別々のメモリエリアに保持されるスタティックなオブジェクトをサポートし、
スタティックなオブジェクトへのポインタが前記プロセッサによって明確に識別されることを特徴とする請求項１から１０までのいずれか１項に記載のプロセッサ。
【請求項１２】
スタティックなオブジェクトが前記プログラムスタックのために使用され、前記オブジェクトに含まれる属性は、前記プログラムスタックが活動していない場合に前記スタックエリアの実際の占有部分の長さを表わすことを特徴とする請求項９に従属する請求項１１、又は請求項１０に従属する請求項１１に記載のプロセッサ。
【請求項１３】
属性レジスタがポインタレジスタ毎に割り当てられており、前記ポインタレジスタ中の前記ポインタが参照する前記オブジェクトの属性がその中に記述されていることを特徴とする請求項１から１２までのいずれか１項に記載のプロセッサ。
【請求項１４】
追加パイプラインステージを持つパイプラインが前記属性をロードするために用いられることを特徴とする請求項１３に記載のプロセッサ。
【請求項１５】
属性キャッシュが用いられることを特徴とする請求項１３又は１４に記載のプロセッサ。
【請求項１６】
ＲＩＳＣ命令セットが用いられることを特徴とする請求項１から１５までのいずれか１項に記載のプロセッサ。
【請求項１７】
前記プロセッサが自動ガーベッジコレクションを実行することを特徴とする請求項１から１６までのいずれか１項に記載のプロセッサ。
【請求項１８】
請求項１から１６までのいずれか１項に係るプロセッサが実装されたメインプロセッサ（１）と、自動ガーベッジコレクションを実行し、効率的な同期のために前記メインプロセッサ（１）に密結合するコプロセッサ（２）とを持つデバイス。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はプロセッサアーキテクチャに関し、メモリへのアクセスがオブジェクトを参照するポインタを介して行われるものに関する。
【０００２】
ソフトウェアの複雑さを管理することは、ソフトウェア開発における最大の要求である。ソフトウェアが、理解可能であって制御可能であるモジュールに分解されて理論的に表わされる場合、高品質で信頼性の高いシステムだけが実行されることとなる。これを達成するために、オブジェクト指向プログラミング言語が何年にもわたって使用されてきた。
【０００３】
オブジェクト指向プログラミング言語の実行における主要な問題はダイナミックメモリ管理である。Ｃ＋＋のようないくつかのオブジェクト指向言語は、いまだに、例えばプログラマの責任の下でメモリが要求され、また再び解放されるような、マニュアルメモリ管理に基づいている。しかしながら、このアプローチは、その問題に合わせて調整されるシステムの自然なモデリングがしばしば可能でないという欠点を持つ。これは、メモリ管理がそのシステムの設計の間においても実行されるためである。さらに、メモリのマニュアル解放はプログラムエラーの全クラスの原因である。例えば、メモリエリアに対する参照がいまだ存在しているにもかかわらず、メモリエリアが解放された場合、このことはさらなるプログラムの実行において壊滅的な結果となるかもしれない。すでに解放されたメモリエリアに対していまだ存在しているポインタ（ダングリング参照）によって引き起こされるエラーの連続が多くの要因の機能であって、それゆえほとんど再生不可能であり、辛うじてローカライズできるということは、この場合には特に深刻である。これらの理由のため、Ｊａｖａ（登録商標）のような、ほとんどすべての最新のプログラミング言語は、自動ガーベッジコレクションを実行するダイナミックメモリ管理に基づいている。このダイナミックメモリ管理を持つシステムにおいて、メモリエリアはそのプログラムの責任の下で復帰されないかもしれない。その代わりに、メモリエリアがプログラムによってもはや確実に参照されないときには、ガーベッジコレクターが自動的にそのメモリエリアの解放だけを行う。この原則のおかげで、"ダングリング参照"が発生することはない。さらに、プログラマが実際の問題の解決に全力で取り組むために、この技術の使用はプログラマの生産性を上昇させる。最終的に、ダイナミックメモリ管理を持つシステムにおける隠れたプログラムエラーの可能性がマニュアルメモリ管理を持つシステムにおけるものよりも著しく低くなるので、用意されるプログラムが高品質なものとなる。
【０００４】
関連技術
ダイナミックに構築されるメモリエリアの自動解放に関するアルゴリズムは多数存在し、参照カウント、コピー、及びマークスイープコレクションの概念の下の技術として知られている。これらのアルゴリズムの概観については「Ｒ．ジョーンズ、Ｒ．リンズ："ガーベッジコレクション：自動ダイナミックメモリ管理のためのアルゴリズム"、ジョン・ウィリー＆ソンズ、１９９６年」を参照している。
【０００５】
これらのアルゴリズムの単純な実行は、ガーベッジコレクションサイクルの全期間にわたってそのアプリケーションプログラムを中断する。それらは、典型的には、プログラムの実行において長く予測不可能なポーズを引き起こす。それゆえ、それらは、インタラクティブシステムやリアルタイム環境にはふさわしくない。
【０００６】
インクリメンタルでありコンカレントな方法は、当該プログラムの実行をガーベッジコレクションサイクルの間にわたって継続することを許可する。しかしながら、それらは、アプリケーションプログラムとガーベッジコレクターとの間の同期を要求する。しかしながら、ソフトウェアにおけるこの同期のコストは深刻なものである。なぜならば、使用される方法によって、関連するオブジェクトがすでにガーベッジコレクターによって処理されたかどうかを決定するために、各ポインタロード（リードバリア）前又は各ポインタストア（ライトバリア）前のいずれかに、ショートコードシーケンスを組み込まなければならないからである。
【０００７】
多くのインクリメンタルな方法は"リアルタイムケーパブル"として表わされる。なぜならば、ガーベッジコレクターによって引き起こされるポーズはほとんどの場合において短すぎて、ユーザによって登録することはできないからである。しかしながら、ハードなリアルタイムケーパビリティは、そのシステムのレスポンスタイムのコンスタントな上限の保証を要求する。ソフトウェアベースの方法は、典型的には、ルートセット（レジスタ及びスタック）のすべてのポインタの試験やオブジェクト全体の処理のような割り込み可能でないオペレーションに依存するので、それらはハードなリアルタイム要求を満たさない。無期限の不可分オペレーションなしで管理するソフトウェア解法が知られているが、時間やメモリを計算するこれらの解法に費やすコストは深刻なものである。
【０００８】
自動ガーベッジコレクションのためのすべての技術の基本的な問題は、ポインタを発見し識別することである。もしもポインタが非ポインタと明確に区別することができなければ、コンサバティブなガーベッジコレクションだけが実行される。このことは、ポインタを表現できる各ビットパターンが、いまだ使用中であるメモリの解放を避けるために、ポインタとして見なされなければならないということを意味する。それゆえ、オブジェクトを移動してポインタをアップデートするようなコンパクト化方法はコンサバティブなガーベッジコレクションにおいては使用されない。しかしながら、そのメモリは、コンパクト化方法を用いなければ断片化される。
【０００９】
これらの問題を避け、正確なガーベッジコレクションを実行するために、より多くの経費がポインタのサーチ及び識別に使用される。多くのオブジェクト指向言語において、ポインタやオブジェクトは、オブジェクト毎に含まれるタイプデスクリプタを介して識別される。しかしながら、プログラムスタックやプロセスレジスタにおけるポインタを突き止めることは、特にコンパイラを最適化することに関しては、より困難である。スタックポジションや、ポインタを現在含んでいるプロセッサレジスタが特定されるデータ構造を維持することは可能であるが、プログラムが実行されている間にわたってこの種のデータ構造を提供するためのコストはとても高いものである。この理由から、ほとんどのソフトウェアベースの方法では、プログラムスタックやレジスタ内のポインタの位置を表現するコンプライヤによって生成されるテーブルを使用する。ガーベッジコレクションの実行対象である各プログラムポイントで、このタイプのテーブルのセットが準備される。しかしながら、この技術の実施によって、プログラムコードの膨張が深刻なものになってしまう。さらに、停止しているスレッドが、制限された時間内にこのタイプの次のプログラムポイントに届くことを、リアルタイムシステムは保証しなければならない。
【００１０】
それゆえ、多くの問題が、自動ガーベッジコレクションを主としてソフトウェアで使用する現在のシステムを用いて克服されなければならない。これは、とりわけ、ハードウェアが根本的に提供しない機能をソフトウェアがシミュレートするからである。もしも、プロセッサ自身がハードウェアにおいて、全体的に或いは部分的に、自動ガーベッジコレクションを実行すれば、効率性やリアルタイムケーパビリティに関する多くの問題が克服されるであろう。しかしながら、プロセッサがこの目的のためにポインタを識別することができることが絶対に必要である。
【００１１】
以下では、多くの既知のアーキテクチャのうちの２つ、すなわち、正確なポインタ識別及び／又は自動ガーベッジコレクションをサポートする模範的な目的と、本発明の主題が重要であることを記述する。
【００１２】
このように、メモリエリアをアドレス指定するためにダイレクトなポインタに代わってケーパビリティを使用するアーキテクチャが１９９６年以来知られている。ケーパビリティには、アクセス権限やオブジェクトの識別に関するステートメントが含まれる。それらにはオブジェクトの物理的なアドレスではなく、むしろオブジェクトの位置、大きさ及び属性を表現するデスクリプタへの参照が含まれる。このタイプのアーキテクチャを持つプロセッサの例として、例えば、「Ｈ．Ｍ．レビィ：ケーパビリティベースのコンピュータシステム、ディジタルプレス、１９８４年、１５９〜１８６ページ」に記述されているような、インテルｉＡＰＸ４３２がある。このアーキテクチャにおいて、ケーパビリティは２段階のマッピングプロセスを通して、関連するオブジェクトに関連付けられる。オブジェクトテーブルにおけるユニークなエントリが各オブジェクト毎に存在するが、それはオブジェクトの位置、大きさ及びステータスを表わす。各オブジェクトは２つのエリア、すなわち、データエリアとケーパビリティのためのエリアとから構成される。正確なケーパビリティの識別はこのように行われる。
【００１３】
ｉＡＰＸ４３２は、レジスタセットの欠落と、ケーパビリティとオブジェクトデスクリプタとを介したオブジェクトの二重の間接的なアドレス指定のために、極めて非効率なものである。さらに、それは自動ガーベッジコレクション自身を実行しない。当該ガーベッジコレクションはソフトウェア内で実行されるべきであり、リアルタイムケーパブルでない。
【００１４】
ダイレクトポインタを識別するための全ての既知の方法は、ポインタと非ポインタとの間を差別化するためにあらゆるメモリワードに特別な識別ビット（タグ）を使用する。この一例としては、米国特許第５，５６０，００３号に記載されたリアルタイムでのインクリメンタルガーベッジコレクションのためのシステム及びハードウェアモジュールがある。これは、２つのメモリバンクと、ガーベッジコレクションを実行する１つのローカルプロセッサとから構成される。各メモリバンクは、それぞれのメモリアクセスに対応するオブジェクトの開始アドレスにアドレスをマップするオブジェクト空間マネージャによってサポートされる。その複雑性のために、このオブジェクト空間マネージャは、類似するチップエリアをメモリとして占有する、分離したＡＳＩＣとして実行される。この種のシステムは大変コストが高くなる。さらに、識別ビットを用いたポインタの識別は、要求されるコンピューティング時間やメモリという形で追加費用が必要になる。
【００１５】
組み込みシステムにおけるソフトウェアの複雑性の連続する増加のため、自動ガーベッジコレクションの利点をこの経済的に重要な分野にさらに使用するために、何年もの間にわたって大きな努力がなされてきた。重要である最大の点は、最新の情報技術のこのエリアで正確に達成されることである。製品のサイクルは連続するイノベーションを通じてますます短くなっているので、現在のオブジェクト指向言語のための組み込みシステムのロバストでリアルタイムケーパブルなプラットフォームの要求は増加する一方である。しかしながら、これらのアプリケーションにとって、自動ガーベッジコレクションは、ほとんどの場合において贅沢であると考えられ、その議論の余地もない利点があるにもかかわらず自動ガーベッジコレクションを持つ余裕はない。
【００１６】
この関連技術から続けると、本発明の目的は、オブジェクトベースのオブジェクト指向プログラムのためのプロセッサアーキテクチャを明確にすることである。それは、費用対効果が高く正確なポインタ識別を可能とし、それゆえにハードウェア内の全部又は一部で実行される、効率的でリアルタイムケーパブルな自動ガーベッジコレクションのためのパスを開くものである。
【００１７】
発明の詳細
目的は、請求項１に係るプロセッサアーキテクチャによって達成される。このプロセッサアーキテクチャの有利な実施態様は従属請求項の主題であって、或いは下記の詳細や模範的な実施態様から参照される。
【００１８】
本特許出願の範囲において、用語ワードは、単一のプロセッサ命令を用いて当該メモリからロードできる、或いはメモリ内に格納できるデータユニットとして理解される。オブジェクトは、メモリワードのコヒーレントなセットとして理解され、そのメモリワード中の全てのワードは単一のオブジェクトに排他的に関連付けられている。ポインタは、オブジェクトを参照するワードとして理解される。用語空値は、オブジェクトがないことを参照するために使用される、不変に定められたポインタ値を表わす。
【００１９】
オブジェクトベースのオブジェクト指向プログラムのための本プロセッサアーキテクチャにおいて、メモリは、オブジェクトを直接参照するポインタを介して排他的にアクセスされる。オブジェクトは、コヒーレントなメモリエリア、例えば重なり合わない２つのオブジェクトによって占有されるメモリエリア、に排他的に格納される。それぞれのオブジェクトにおいて、ポインタはポインタエリアに、データはデータエリアに、互いに別々に格納される。さらに、ポインタエリアの長さやデータエリアの長さについての情報が、それぞれのオブジェクトに格納される。この長さ情報は、後述するような属性として参照される。その属性を用いて、オブジェクトのサイズを決定したり、オブジェクト内のポインタとデータとを互いから一意に区切ることが、いつでも可能である。
【００２０】
本プロセッサアーキテクチャは、別々のポインタレジスタとデータレジスタのセットを提供する。この場合、ポインタレジスタは、オブジェクトを用いるオペレーション、例えばメモリアクセスに排他的に提供され、他のタスクに対しては用いられない。それゆえ、特に、ポインタレジスタには任意の値を書き込めないことや、ポインタレジスタを用いて算術演算を実行できないことが保証される。
【００２１】
オブジェクトのポインタエリアやポインタレジスタにおけるポインタは、メモリ内のオブジェクトのアドレスを直接的に含んでいる。
【００２２】
本オブジェクトベースプロセッサアーキテクチャを使用して、ポインタと非ポインタ（データ）の厳格な分離がこのように実行され、その結果、識別ビットを必要とせずに正確なポインタ識別ができる。プロセッサレジスタ内やメモリ内のポインタを識別するためのこの正確な能力、それはハードウェアによって保証されるものであるが、その能力を通して、ハードウェアにおいて全体的に或いは部分的に実行できる自動ガーベッジコレクションが、プロセッサレベルで統合される。この基盤上に、特に効果的に実行される自動ガーベッジコレクションを持つリアルタイムケーパブルなシステムが実行できる。それゆえ、そのプロセッサ上で実行しなければならないソフトウェアは、ガーベッジコレクションアルゴリズムそのもののためにも、プロセッサとガーベッジコレクターとの間で必要な同期のためにも、必要ない。プロセッサは単に、ガーベッジコレクターに対してメモリ帯域幅の一部分を譲るだけにすぎない。
【００２３】
当該アーキテクチャのさらなる利点は、ガーベッジコレクションがコンプライヤ及び／又はランタイムシステムの協力なしで遂行でき、それゆえ特にロバストに実行できることである。
【００２４】
ガーベッジコレクションの実行に対するハードウェア上の努力は、プロセッサ自身に対する努力と比較して比較的低い。この理由から、そのようなプロセッサは、典型的なマイクロプロセッサやマイクロコントローラと同様に、費用対効果を高くして製造される。
【００２５】
本プロセッサアーキテクチャにおいて、ポインタとして識別されるあらゆるワードは、存在するオブジェクトのアドレスを含むか空値かのいずれかであることが、プロセッサによって好ましくは保証される。本好適な実施態様では、それゆえに固定ルール（システムの不変条件）がプロセッサアーキテクチャによって維持される。ここで、固定ルールとは、それぞれのメモリワードやレジスタが、それがポインタであるか否か、さらには、それぞれのポインタ値が空値か、存在するオブジェクトのアドレスを含むかどうかについて、識別することである。これらのシステムの不変条件を維持することにより、システムにおけるポインタの正確な識別が各クロックサイクルで可能である。
【００２６】
好ましくは、生成されるオブジェクトの属性がパラメータとして転送される特別なオブジェクト生成命令によって新たなオブジェクトが生成される。このオブジェクト生成命令は、オブジェクトがアクセスされる前に、空値でポインタエリアの全てのポインタを初期化する。システム不変条件は、このように侵されることはない。
【００２７】
ハードなリアルタイム要求のための改良において、オブジェクト生成命令が割り込み可能に実行される。もしオブジェクト生成命令が割り込まれた場合、不完全に初期化されたオブジェクトは、割り込まれた生成命令が後で再開できるように、生成される。不完全に初期化されたオブジェクトは、プロセッサによって一意に識別される。
【００２８】
好ましくは、プログラムが開始する前にも、リードオンリーメモリエリアの部分として存在するコンスタントなオブジェクトがプロセッサアーキテクチャによってサポートされる。コンスタントなオブジェクトへのポインタは、プロセッサによって一意に識別される。
【００２９】
本プロセッサアーキテクチャにおいて、メモリのエリアは、好ましくは既知の方法でプログラムスタックとして用意される。プログラムスタックは、この目的のためにポインタスタックエリア、データスアックエリアに分けられる。そこでは、それぞれのケースにおいてスタックによって占有されない第１の位置が、それぞれのケースにおいて用意されたデータレジスタ内で管理されるスタックインデックスによって特定される。
【００３０】
もし複数のスタックが使用された場合は、現在非活動のスタックのスタックインデックスが、好ましくは関連するスタックオブジェクト内で属性として格納される。さらに、スタックオブジェクトは、ヒープ内ではなく、むしろオペレーティングシステムによって管理されるスタティックなメモリの中に、スタティックなオブジェクトとして好ましくは格納され、この種のオブジェクトへのポインタ（スタティックなポインタ）は特別な方法で識別される。
【００３１】
プロセッサアーキテクチャの効率的な実行のために、各ポインタレジスタは、ポインタレジスタ中のポインタによって参照されるオブジェクトに属するオブジェクトの属性が格納される属性レジスタを、好ましくは伴っている。本実施態様では、属性をロードするための追加パイプラインステージが提供される。さらに、アクセスを加速するための属性キャッシュが、このパイプラインで好ましくは使用される。
【００３２】
本プロセッサアーキテクチャの実行に関する関連技術によれば、命令及びデータキャッシュ、或いは分岐予測のためのユニットのような、プログラムの実行や典型的な最適化を要求する全てのさらなるパイプラインステージや機能ユニットが実行される。
【００３３】
発明を実行する方法
以下では、本発明に係るプロセッサアーキテクチャの実施態様の一例が説明される。それは、中でも、識別ビット（タグ）を使用することなく正確なポインタ識別を達成するオブジェクトに基づくものであり、一般に適用可能な、効果的に適用され得るＲＩＳＣ命令セットに基づくものであり、実行時間がいくつかのクロックサイクルを超える不可分のオペレーションを要求しないものである。
【００３４】
説明されるプロセッサアーキテクチャは、以下のシステムの不変条件を保証する。すなわち、
１．すべてのメモリワード又はレジスタは、それがポインタを表わすか否かについて識別し得ること、
２．すべてのポインタ値が、空値であるか、又は存在するオブジェクトに一意に関連付けられること。
【００３５】
本プロセッサアーキテクチャは、図１に概略的に示されるように、分離したデータレジスタ及びポインタレジスタのセットを提供する。右側に示されるデータレジスタは多目的レジスタとして使用され、一方、左側に示されるポインタレジスタはメモリ内のオブジェクトにアクセスするために使用される。Ｎpはポインタレジスタ数を特定し、Ｎdはデータレジスタ数を特定する。システムの不変条件を満足するために、ポインタレジスタ内に任意の値をライトすること、例えばポインタレジスタ内にデータレジスタの値をコピーしたり、ポインタレジスタを用いて算術的なオペレーションを実行するようなこと、はできないことが保証されなければならない。
【００３６】
本プロセッサアーキテクチャのメモリモデルはオブジェクトベースである。各オブジェクトは、互いに厳格に分離されているデータエリアとポインタエリアとから構成される。図２は、オブジェクトのポインタエリア（図の左側）における対応するポインタワードとデータエリア（図の右側）におけるデータワードを持つこの種のオブジェクトの概略構造を示す。データエリアにおけるデータワード数はδ属性（δ≧０）によって記述される。また、ポインタエリアにおけるポインタ数はπ属性（π≧０）によって記述される。オブジェクトが生成されて後ほど変化しない場合、その属性によって記述されるオブジェクトのサイズは固定される。その属性はオブジェクトの一部分であり、分離した属性エリアのその中に格納される。
【００３７】
本プロセッサアーキテクチャのための命令セットの特定部分は、ロード及び格納命令を含むポインタ関連の命令だけから構成される。算術命令やプログラムコントロールの命令のような他の命令の実施態様は、記述されるアーキテクチャとは無関係に選択され、本発明の部分ではない。
【００３８】
説明されるアーキテクチャの命令セットは、新しいオブジェクトやこのオブジェクトへのポインタを生成するために用いられる特別なオブジェクト生成命令を持つ。オブジェクト生成命令（オブジェクトの割り当て）は引数として、生成されるオブジェクトのπ及びδ属性の値を受け取り、新たに生成されたオブジェクトへのポインタをポインタレジスタ内に格納する。生成されたオブジェクトのポインタエリア内のそれぞれのポインタ値は、そのオブジェクトへのポインタがプログラムに見えるようになる前に、空値を用いて初期化される。オブジェクトを削除する命令はない。オブジェクトはプロセッサレベル上で自動ガーベッジコレクションによってのみ削除され得る。
【００３９】
ロード及び格納命令は、オブジェクト内でのワードへのアクセスのために使用される。プロセッサアーキテクチャは、ポインタ値やデータワードへのアクセスための、異なるロード及び格納命令を提供する。"ロードデータ"及び"格納データ"命令は、オブジェクトのデータエリアとデータレジスタとの間で排他的にデータワードを移動する。"ロードポインタ"及び"格納ポインタ"命令は、オブジェクトのポインタエリアとポインタレジスタとの間で排他的にポインタを移動する。ロード及び格納命令は、オブジェクトへのポインタを含むポインタレジスタを用いて、及び正の整数インデックスを用いて、アクセスされるメモリワードを識別する。インデックスを計算するために、従来のアーキテクチャのアドレス指定モードに対するものと同じように、例えば、データレジスタ、コンスタントオフセット及びスケーリンクファクターを用いて、異なる"インデキシングモード"が使用され得る。
【００４０】
オブジェクトへのアクセスにおいて、特定の参照されたオブジェクトの外部のワードへのアクセスが不可能であることを保証するために、範囲のチェックが実行される。このようなアクセスは壊滅的な結果となり、システムの不変条件を侵すこととなる。この理由のため、バウンスバイオレーションの場合には、メモリアクセスが終了して、対応する例外的な取り扱いが開始される。同様の理由のため、空値ポインタの参照先を取得しようとする命令は打ち切られる。
【００４１】
オブジェクトの属性は２つの"リード属性"命令によって問い合わせされ得る。
【００４２】
データレジスタに関するオペレーションを典型的に実行する複数の"レジスタからレジスタ"への命令に対比して、ポインタ関連の"レジスタからレジスタ"への命令のための２つの命令から成る強く制限されたセットが、本アーキテクチャによって定義される。"コピーポインタ"命令は、あるポインタレジスタの内容を他のポインタレジスタにコピーする。一方、"比較ポインタ"命令は、２つのポインタが同じオブジェクトを参照するか否かをチェックする。
【００４３】
図４は、本プロセッサアーキテクチャによって定義されるポインタ関連の命令の概要を示しており、それらがポインタレジスタをリードするか、ポインタレジスタをライトするか、或いはポインタレジスタの参照先を取得するかどうかによって分類するものである。それぞれの場合においてリードされ、ライトされ、或いは参照先を取得されるレジスタは、ボールド体でプリントされている。
【００４４】
プログラムスタックの体系化されていない、高度にダイナミックな特性のために、これらは、自動ガーベッジコレクションの範囲におけるポインタ識別に関して、最高度の要求の一つを表わす。本プロセッサアーキテクチャにおいて、プログラムスタックは、何らかのオブジェクトのようにデータエリアやポインタエリアを持つスタックオブジェクトとして見なされ、それゆえ２つの分離したスタックとして見なされ得る。ポインタレジスタは、スタックオブジェクトへのポインタを維持するために用意される。スタックインデックスは、対応するエリアを実際のスタックエリアと現在占有されていないエリアとに分けるために、２つのスタックエリアのそれぞれにおいて使用される。スタックインデックスは、本例において、第１の占有されていないメモリ位置に関連する。０のスタックインデックスは空スタックを表わす。２つのスタックインデックスは、データスタックインデックス（ｄｓｉｘ）とポインタスタックインデックス（ｐｓｉｘ）として識別される。これらのインデックスのそれぞれは、この目的のために用意される特別のデータレジスタ内に維持される。
【００４５】
スタックオブジェクトが典型的なオブジェクトように取り扱われる場合、システムは、ポインタが現在占有されているポインタスタックに属するか、又は、ポインタスタックエリアの占有されていない部分に属しているかを、区別しないかもしれない。ポインタスタックエリアにおける各ワードがポインタとして識別されるので、ポインタスタックエリアの未使用エリアがもはや必要とされていないオブジェクトを参照する多くのポインタを含んでいるかもしれない。ガーベッジコレクターは、これらのオブジェクトへのポインタがまだ存在しているので、これらのオブジェクトを解放しないかもしれない。このオブジェクトの可能性のある解決策は、対応するポインタがスタックから取り除かれると同時に、空値で各ポインタ値を上書きすることである。しかしながら、例えばサブプログラムの終わりでスタックフレームのディスアロケーション間の場合のように、特にもし複数のポインタがスタックから取り除かれた場合、このことは不要な経費がかかるという結果をもたらす。
【００４６】
本プロセッサアーキテクチャの有利な実施態様についてここで述べた例として、スタックのダイナミックなサイズを考慮するオブジェクトの達成がそれゆえ選択される。この目的のため、図３に示されるようなスタックオブジェクトは２組の属性によって表現される。一つ目の組の（π，δ）は現在のスタックサイズを特定し、二つ目の組の（Π，Δ）は最大スタックサイズを特定する。この場合において、π属性はポインタスタックインデックスｐｓｉｘの値に対応し、δ属性はデータスタックインデックスｄｓｉｘの値に対応する。スタック属性Π及びΔは、ユーザプログラムに見えないシステムレジスタにおいて維持される。πよりも小さなインデックスを持つポインタのみがポインタ識別及びシステムの不変条件に関連するポインタとして見なされる。
【００４７】
スタック内のメモリワードは標準的なロード及び格納命令によってアドレス指定される。標準の算術的な命令を用いてスタックインデックスに対応する値を減少することにより、スタックからワードが取り除くことができる。システムの不変条件を維持するために、特別な命令がポインタスタックへポインタをプッシュするために提供される。ここで、当該命令は、ポインタスタックエリアの第１の占有されていないメモリ位置上に、割り込みを許さずにポインタを格納し、ポインタスタックインデックスを増加する。これは、ポインタスタックインデックスを増加するために許可される唯一の命令である。
【００４８】
この点について説明されたプロセッサアーキテクチャにおいて、メモリはポインタを介して独占的にアクセスされ、ポインタを生成するための唯一つの可能性は、オブジェクト生成命令を用いて新たなオブジェクトを生成することである。しかしながら、例えばプログラムの開始前であっても、プログラムコードのような部分として存在するコンスタントなデータをアクセスすることもまた可能である。そのようなコンスタントなデータの例が、ブランチテーブルやタイプデスクリプタのようなコンパイラによって生成される、コンスタントにリンクされたリストや構造である。
【００４９】
それゆえに、プロセッサアーキテクチャの有利な実施態様の本例が、コンスタントなオブジェクトを紹介する。コンスタントなオブジェクトは不変のオブジェクトであり、プログラムコードの一部分として、或いはコンスタントなオブジェクトのために用意される特別なエリア内に格納される。特別な"コンスタントなポインタの生成"命令は、コンスタントなオブジェクトへのポインタの生成のために使用され、コンスタントなポインタとして以下のように参照される。コンスタントなポインタを介したメモリアクセスは、リードアクセスに限定され、コンスタントなオブジェクトのポインタエリアはコンスタントなポインタ又は空値ポインタを独占的に含む。コンスタントなオブジェクトは、オブジェクトの特別なタイプを区別するために提供されるφ属性によって、普通のオブジェクトから区別される。
【００５０】
多くのシステムにおいて、分離したプログラムスタックが、ユーザモードやオペレーティングシステムモードのようなオペレーションの異なるタイプのために使用される。さらに、複数のコンカレントな実行スレッドを持つシステム（マルチスレッドシステム）が、それぞれの実行スレッドのための分離したプログラムスタックを要求する。
【００５１】
これらのスタックの全てが典型的にオペレーティングシステムによって管理され、ガーベッジコレクション（ヒープ）によって監視されるメモリエリア内に位置付けられない。
【００５２】
オペレーティングシステムにヒープメモリエリアの外側のメモリエリアを管理させるために、スタティックなオブジェクトが提供される。スタティックなオブジェクトは、オペレーティングシステムモードにおいて独占的に生成され、この目的のために特に提供されたメモリエリア内に配置される。スタティックなオブジェクトはまた、φ属性を介して識別される。スタティックなオブジェクトへのポインタ（スタティックなポインタ）は決してユーザプログラムからは見えない。
【００５３】
システムの不変条件を維持するために、関連するオブジェクト生成命令が終了する前に、新たに生成されたオブジェクトにおける各ポインタが空値で初期化される。それゆえ、オブジェクト生成命令のための実行時間は、少ない時間定数によって制限されない。これはハードなリアルタイムアプリケーションのためには認められない。
【００５４】
オブジェクト生成命令を割り込み可能なように実行するために、イニシャライズされていない（より正確には、不完全に初期化された）オブジェクトが、述べられたプロセッサアーキテクチャの有利な実施態様に取り入れられる。イニシャライズされていないオブジェクトは、オブジェクト生成命令が完結する前に割り込まれた場合にだけ、生成される。イニシャライズされていないオブジェクトへのポインタは、オペレーティングシステムモードにおいてのみ見ることができ、それは決して参照先が取得されることはない。イニシャライズされていないオブジェクトは、スタティックでコンスタントなオブジェクトのように、φ属性によって識別される。
【００５５】
それゆえに述べられたプロセッサアーキテクチャの模範的な有利な実施態様は、４つの異なるタイプのオブジェクト、すなわち、通常のダイナミックなオブジェクト、イニシャライズされていないダイナミックなオブジェクト、コンスタントなオブジェクト、及びスタティックなオブジェクト、をサポートする。φ属性は、オブジェクトのタイプを区別するために使用され、４つの値（ｎｏｒｍ，ｕｉｎｉ，ｃｏｎｓｔ，ｓｔａｔ）の一つを担う。アーキテクチャの実行において、φ属性はオブジェクトへのポインタ内、及び／又は、オブジェクト自身内に格納される。
【００５６】
通常のダイナミックなオブジェクトとイニシャライズされていないダイナミックなオブジェクトはヒープメモリエリア内に位置付けられ、スタティックなオブジェクトはスタティックなメモリエリア内に位置付けられ、コンスタントなオブジェクトはプログラムコード及び／又はコンスタントなデータのために提供されるメモリエリア内に位置付けられる。スタティックでイニシャライズされていないオブジェクトはオペレーションシステムモードに限定されるので、それらはシステムオブジェクトとして識別される。
【００５７】
自動ガーベッジコレクションの観点からすれば、オブジェクトの４つのタイプは、それらが、コンパクト化を行うガーベッジコレクターによってどのように取り扱われるかによって特徴付けられる。典型的なダイナミックなオブジェクトはポインタが探索され、コンパクト化の間中移動する。スタティックなオブジェクトはポインタが探索されるが、移動はしない。その一方で、イニシャライズされていないオブジェクトはコンパクト化の間中移動するが、正しくないポインタを含んでいるので、ポインタは探索されない。最後に、コンスタントなオブジェクトは、ガーベッジコレクターによるポインタの探索も移動もされない。
【００５８】
以下では、示唆的なプロセッサアーキテクチャの可能性のある実行が、模範的な目的のために説明される。３２ビットのワード値がその実行のために仮定される。バイトやハーフワードをデータエリア内でアクセス可能にするために、メモリはバイト単位でアドレス指定可能である。ワードは４つに分割可能にアドレス指定するために一列に並べられる。
【００５９】
メモリ内のオブジェクトの模範的なレイアウトが図５に示される。各オブジェクトは、データエリア、ポインタエリア及び属性エリアから構成される。効率性の理由から、２つのオブジェクト間のパディングエリアがある環境下で要求されるように、オブジェクトは８つに分割可能にアドレス指定するために一列に並べられている。属性エリアは、ユーザプログラムからは見えておらず、オブジェクトのπ及びδ属性を含む。バイト及びハーフワードオペランドのサポートによって、本実行は、π及びδが対応するエリアにおけるワード数の代わりにバイト数を表わしているので、それらの定義をわずかに変える。
【００６０】
πは４の倍数であるので、２ビットがπ属性のために使用されるメモリワード内で非占有のままになっている。これらはφ属性（或いは、その部分）を格納するために使用され、及び／又は、ガーベッジコレクターに使用される。
【００６１】
ポインタは直接的にオブジェクトの物理的なメモリアドレスを含んでいる。オブジェクトは２倍のワードに従って一列に並べられているので、オブジェクトアドレスはポインタワードの２９ビットのみを占有する。残りの３ビットはφ属性（或いは、その部分）を格納するために使用され、及び／又は、ガーベッジコレクターによって使用される。
【００６２】
オブジェクトへのアクセス前に、オブジェクトの属性が知られる。これらは、アクセス前に範囲のチェックのために必要であり、図５に係るオブジェクトレイアウトの場合において、データアクセスの場合でのアドレス生成にさらに要求されるからである。
【００６３】
それぞれのオブジェクトアクセス前のメモリからの属性のロードが膨大な経費に結び付くので、図６に概略的に示されるように、複数の属性レジスタが各ポインタレジスタに提供される。もしポインタレジスタが空値でない値を含んでいる場合、対応する属性レジスタは、ポインタレジスタが参照するオブジェクトの属性を含んでいる。このように、ポインタレジスタの参照先を取得するための費用は、通常のアーキテクチャにおけるアドレス生成のための費用と同じくらい少ない。範囲のチェック自身は、アドレス計算に並行して実行されるので、どんなパフォーマンスロスにも結び付かない。
【００６４】
しかしながら、属性レジスタは自身の対価を持っている。すなわち、ポインタがメモリからロードされる場合、関連する属性もまた属性レジスタにロードされる。さらに、メモリ内の属性の位置は、ポインタのロードが終了した場合にだけ知られる。
【００６５】
この問題は、ＲＩＳＣアーキテクチャの場合における典型的なメモリステージの後の追加的なパイプラインステージによって効果的に解決されるであろう。この追加的なステージは属性ステージとして参照され、属性アクセスを実行するために、パフォーマンスロスなしで、ほとんどの場合で属性キャッシュを使用する。属性キャッシュの構成は、典型的なデータキャッシュの構成と類似している。属性キャッシュは、ポインタの最大２９ビットによってアドレス指定され、単一のステップにおいてπ及びδ属性のリード又はライトを許可する。データキャッシュからの本質的な差異は、キャッシュラインのサイズである。データキャッシュにおけるキャッシュラインは典型的に８ワードから構成される一方で、属性キャッシュのラインは２ワードの幅を持ち、単一のオブジェクトの属性のみを含んでいる。
【００６６】
図７は実行されるパイプラインの基本的な構成を示す図であり、図８は個々のパイプラインステージへの全てのポインタ関連の命令を示す分解図である。２つの最も複雑な命令の処理が模範的な目的のために図示されている。
【００６７】
１．"ポインタロード"命令：
パイプラインの実行ステージにおいて、アドレス生成ユニット（ＡＧＵ）は、ロードされるポインタのメモリアドレスを計算し、それと並行して、アーキテクチャによって規定された、範囲のチェックや空値ポインタテストのようなランタイムテストを実行する。メモリステージでは、計算されたアドレスがオブジェクトキャッシュからポインタをリードするために使用される。そして、ロードされたポインタは、ロードされたポインタが参照するオブジェクトからその属性をロードするために、属性キャッシュをアドレス指定する。最後に、ロードされたポインタは、ロードされた属性と共にレジスタセット内にライトされる。
【００６８】
２．オブジェクト生成命令：
生成されるオブジェクトのサイズは、デコードステージから実行ステージまでを中継する２つのデータオペランドを利用して決定される。実行ステージにおいて、ポインタ生成ユニット（ＰＧＵ）は新たなオブジェクトへのポインタの生成する責任がある。コンパクト化ガーベッジコレクターの場合において、ＰＧＵは、新たなオブジェクトの生成のために使用されるヒープのエリア内で最後に占有したワードを常に参照するアシスタントレジスタの内容にオブジェクトサイズを付加することによって、新たなオブジェクトの開始アドレスを大変簡単に決定する。ＰＧＵは、ポインタの初期化を要求するアドレスを生成するＡＧＵによってサポートされる。８ワードのキャッシュラインを持つオブジェクトキャッシュにおいて、８ポインタワードまでが一クロックサイクル内で同時に初期化される。このように、もしオブジェクトの開始アドレスが一クロックサイクル内で計算された場合、及び、もしオブジェクト内の全てのポインタが同じキャッシュラインに属する場合は、オブジェクト生成命令は遅れることなく実行ステージを通過する。もしこれがその場合でなければ、初期化が終了するか割り込みが発生するまで、パイプラインは停止する。最終的に、新たに生成されたオブジェクトの属性が属性キャッシュにライトされ、レジスタセット内にその属性と共にポインタがライトされる。もし割り込まれたオブジェクト生成命令がパイプラインの終端に到達した場合、割り込まれたオブジェクト生成のステータスはシステムレジスタ内にライトされ、不完全に初期化されたオブジェクトは、イニシャライズされていないオブジェクトのφ属性により識別される。割り込まれたプログラムの実行のコンテキスト（命令カウンター、システムレジスタ）が再度回復するとすぐに、初期化が再開される。
【００６９】
提案されたアーキテクチャの機能的な可能性は、機能するプロトタイプに基づいて証明される。このプロトタイプにおいて、ガーベッジコレクターは、メインプロセッサのパイプラインと緊密に連携するマイクロプログラム式コプロセッサとして実行される。プロセッサとコプロセッサとの間の同期は、完全にハードウェア内で実行される。ガーベッジコレクションのためのプロセッサとコプロセッサは、ＶＨＤＬにおいて表わされ、最新のプログラム可能な論理回路に対して連帯して合成される。さらに、原型的なＪａｖａ（登録商標）コンプライヤーやアーキテクチャのＪａｖａ（登録商標）クラシックライブラリーのサブセットの実行がある。
【００７０】
図９は本装置の一例を示す概略図である。ガーベッジコレクターはマイクロプログラム可能なコプロセッサによって本例のように形成される。本発明に係るプロセッサアーキテクチャは、メインプロセッサ１内で実行される。メインプロセッサ１及びコプロセッサ２のために複数の別々のポートを持つメモリコントローラ３は、メインメモリとの接続を実現する。メインプロセッサとコプロセッサとの間の同期は、異なるレベルで発生する。キャッシュコヒーレンスを確保するために必要な場合には、ガーベッジコレクターはフラッシュし、データや属性キャッシュの複数ラインを空にする。プロセッサパイプラインに組み込まれたハードウェアリードバリアは、ガーベッジコレクター内で割り込みを引き起こす。ガーベッジコレクターはまた、マイクロコード内のクリティカルなエリアを保護するために、メインプロセッサ１を停止する。
【００７１】
本発明に係るプロセッサアーキテクチャは、下記図面に関連して模範的な実施態様に基づいてより詳細に記載される。
【図面の簡単な説明】
【００７２】
【図１】本プロセッサアーキテクチャのレジスタモデルを示す概略図である。
【図２】本プロセッサアーキテクチャのオブジェクトモデルを示す概略図である。
【図３】スタックオブジェクトとしてプログラムスタックの実行を概略的に示す図である。
【図４】ポインタに関連する命令の分類を持つテーブルを示す図である。
【図５】本プロセッサアーキテクチャのためのオブジェクトレイアウトの実行の一例を示す図である。
【図６】属性を持つポインタレジスタを示す概略図である。
【図７】本プロセッサアーキテクチャのためのパイプラインの実行の一例を示す概略図を示す図である（簡略図示）。
【図８】図７に係るパイプラインのステージへのポインタ関連命令の分解を示す概略図である。
【図９】本装置の一例を示す概略図である。
【図１】
0004763598.tif 000002
【図２】
0004763598.tif 000003
【図３】
0004763598.tif 000004
【図４】
0004763598.tif 000005
【図５】
0004763598.tif 000006
【図６】
0004763598.tif 000007
【図７】
0004763598.tif 000008
【図８】
0004763598.tif 000009
【図９】
0004763598.tif 000010