(57)【特許請求の範囲】
【請求項１】
コンピュータプログラムを通常処理プログラムと複数の例外処理ハンドラに分離してコード化し、例外検出時において上記通常処理プログラムの実行状態に基づいて上記例外処理ハンドラを動的に選択して実行する制御を行う情報処理装置であって、
所定の規則に則った第１の例外処理ハンドラから第２の例外処理ハンドラへの制御の移動の行程と、
例外処理ハンドラの実行制御状態の消去及び当該例外処理ハンドラを定義した実行環境の回復の行程と、
例外処理ハンドラから例外起動点への制御の復帰の行程と、
例外処理ハンドラと例外起動点のパラメータ交換の行程と、
例外処理ハンドラが定義された実行環境での当該例外処理ハンドラの実行の行程と、
例外処理を多重化する多重例外の行程と
を行う制御手段を有し、
上記例外処理ハンドラを選択するために、各例外処理ハンドラに選択されるべき通常処理プログラムの実行状態情報を付加し、コード化されたプログラムに予め情報として含めておき、
上記例外検出時に、例外検出時の通常プログラムの実行状態と各例外処理ハンドラに付加された上記通常処理プログラムの実行状態情報とを比較することにより例外処理ハンドラを選択し、実行制御を行う
ことを特徴とする情報処理装置。
【請求項２】
上記制御手段を、１本のスタックで制御することを特徴とする請求項１記載の情報処理装置。
【請求項３】
コンピュータプログラムを通常処理プログラムと複数の例外処理ハンドラに分離してコード化し、例外検出時において上記通常処理プログラムの実行状態に基づいて上記例外処理ハンドラを動的に選択して実行する制御を行う情報処理方法であって、
所定の規則に則った第１の例外処理ハンドラから第２の例外処理ハンドラへの制御の移動のステップと、
例外処理ハンドラの実行制御状態の消去及び当該例外処理ハンドラを定義した実行環境の回復のステップと、
例外処理ハンドラから例外起動点への制御の復帰のステップと、
例外処理ハンドラと例外起動点のパラメータ交換のステップと、
例外処理ハンドラが定義された実行環境での当該例外処理ハンドラの実行のステップと、
例外処理を多重化する多重例外のステップとを行う制御ステップを有し、
上記例外処理ハンドラを選択するために、各例外処理ハンドラに選択されるべき通常処理プログラムの実行状態情報を付加し、コード化されたプログラムに予め情報として含めておき、
上記例外検出時に、例外検出時の通常プログラムの実行状態と各例外処理ハンドラに付加された上記通常処理プログラムの実行状態情報とを比較することにより例外処理ハンドラを選択し、実行制御を行う
ことを特徴とする情報処理方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、例外処理機構を実現するプログラム言語のコンパイラやインタプリタ、及びＣＰＵ（中央処理ユニット）を有する情報処理装置とその情報処理方法に関するものである。
【０００２】
【従来の技術】
従来より、コンピュータのプログラムにおいて例外的状況が検出された場合の処理プログラムを、通常の処理プログラムとは別のプログラム、すなわち例外ハンドラとして分離しておき、このハンドラを制御する手段を言語やＣＰＵが提供することで、プログラムの頑強性や一般性、及び正しさを高め、複雑さを低減させることに役立つことがよく知られている。
【０００３】
そのなかで、例外ハンドラを通常処理プログラムの実行に伴って動的に定義し、プログラムが例外状況に遭遇した場合に例外ハンドラが動的に選択されて実行される制御形態がいくつかの言語のために提案され、実装も行われている。
【０００４】
その例としては、ＡＮＳＩ  Ｘ３Ｊ１６  Ｃ＋＋言語標準化委員会では  ｔｒｙ、ｃａｔｃｈ  とｔｈｒｏｗ  が提案され、また同じくＡＮＳＩ  Ｘ３Ｊ１３  Ｃｏｍｍｏｎ  Ｌｉｓｐ言語標準化委員会ではコンディションシステムが仕様として提案されている。
【０００５】
実装としては、Ｍｉｃｒｏｓｏｆｔ  社のＣ／Ｃ＋＋  Ｖｅｒｓｉｏｎ  ７．０  が  ＡＮＳＩ  Ｃ＋＋  での仕様を従来のＣ言語ライブラリにあるｓｅｔｊｍｐ／ｌｏｎｇｊｍｐ関数を使ってマクロとして実装し、またＣ＋＋  やＬｉｓｐ言語とは異なるが、ＰａｒｃＰｌａｃｅ  Ｓｙｓｔｅｍｓ  社のＳｍａｌｌｔａｌｋ  Ｒｅｌｅａｓｅ  ４  ではハンドラ定義メソッドでブロッククロージャをコンテクストにリンクしておくことで同様な例外処理機構を実装している例が挙げられる。
【０００６】
【発明が解決しようとする課題】
ところで、前述したような従来の実装方法においては次のような欠点がある。すなわち、ｓｅｔｊｍｐや例外ハンドラを定義する関数等を呼び出して例外時に制御を移す場所を保存し、例外が検出されて例外ハンドラを実行する時に保存された制御移行場所を復元する方法では、通常処理において実行状態と例外ハンドラの結合と分離の処理とを行わなければならず、実行されない可能性がある例外処理の準備のために余分な処理を通常処理が行う必要がある。この余分な処理は、例外処理が行われる確率は通常処理に比べて非常に低いという性質を考慮すれば通常処理に負わせるオーバヘッドとして好ましくない。
【０００７】そこで、本発明は、上記のオーバヘッドの問題を解決するためのものであり、例外処理プログラムを付加するための通常処理プログラムに必要なオーバヘッドをゼロにすることを可能にすること、すなわち例外処理の有無が通常処理プログラムの処理量に全く影響を与えない例外処理機能を実現する情報処理装置及び方法を提供することを目的とするものである。
【０００８】
【課題を解決するための手段】
本発明に係る情報処理装置は、上述の課題を解決するために、コンピュータプログラムを通常処理プログラムと複数の例外処理ハンドラに分離してコード化し、例外検出時において上記通常処理プログラムの実行状態に基づいて上記例外処理ハンドラを動的に選択して実行する制御を行う情報処理装置であって、所定の規則に則った第１の例外処理ハンドラから第２の例外処理ハンドラへの制御の移動の行程と、例外処理ハンドラの実行制御状態の消去及び当該例外処理ハンドラを定義した実行環境の回復の行程と、例外処理ハンドラから例外起動点への制御の復帰の行程と、例外処理ハンドラと例外起動点のパラメータ交換の行程と、例外処理ハンドラが定義された実行環境での当該例外処理ハンドラの実行の行程と、例外処理を多重化する多重例外の行程とを行う制御手段を有し、上記例外処理ハンドラを選択するために、各例外処理ハンドラに選択されるべき通常処理プログラムの実行状態情報を付加し、コード化されたプログラムに予め情報として含めておき、上記例外検出時に、例外検出時の通常プログラムの実行状態と各例外処理ハンドラに付加された上記通常処理プログラムの実行状態情報とを比較することにより例外処理ハンドラを選択し、実行制御を行うことを特徴としている。
また、本発明に係る情報処理方法は、上述の課題を解決するために、コンピュータプログラムを通常処理プログラムと複数の例外処理ハンドラに分離してコード化し、例外検出時において上記通常処理プログラムの実行状態に基づいて上記例外処理ハンドラを動的に選択して実行する制御を行う情報処理方法であって、所定の規則に則った第１の例外処理ハンドラから第２の例外処理ハンドラへの制御の移動のステップと、例外処理ハンドラの実行制御状態の消去及び当該例外処理ハンドラを定義した実行環境の回復のステップと、例外処理ハンドラから例外起動点への制御の復帰のステップと、例外処理ハンドラと例外起動点のパラメータ交換のステップと、例外処理ハンドラが定義された実行環境での当該例外処理ハンドラの実行のステップと、例外処理を多重化する多重例外のステップとを行う制御ステップを有し、上記例外処理ハンドラを選択するために、各例外処理ハンドラに選択されるべき通常処理プログラムの実行状態情報を付加し、コード化されたプログラムに予め情報として含めておき、上記例外検出時に、例外検出時の通常プログラムの実行状態と各例外処理ハンドラに付加された上記通常処理プログラムの実行状態情報とを比較することにより例外処理ハンドラを選択し、実行制御を行うことを特徴としている。
ここで、上記例外検出時において上記通常処理プログラムの実行状態に基づいて上記例外処理ハンドラを動的に選択して実行する制御を行うとは、後述する Raise Exception命令の実行に対応し、上記所定の規則に則った第１の例外処理ハンドラから第２の例外処理ハンドラへの制御の移動の行程とは、後述するContinue Exception命令の実行に対応し、上記通常処理プログラムの実行状態情報を付加するとは、後述する例外ハンドラテーブルに実行ブロックの先頭命令アドレスと最終命令の次命令のアドレスとを付加することに対応し、上記例外検出時の通常プログラムの実行状態と各例外処理ハンドラに付加された上記通常処理プログラムの実行状態情報とを比較することにより例外処理ハンドラを選択することは、後述する Raise Exception命令の実行中に行われるものである。
【０００９】
ここで、本発明の情報処理装置では、上記例外処理ハンドラを選択するために、各例外処理ハンドラに選択されるべき通常処理プログラムの実行状態情報を付加し、コード化されたプログラムに予め情報として含めておくようにしている。また、上記例外検出時には、例外検出時の通常プログラムの実行状態と各例外処理ハンドラに付加された上記通常処理プログラムの実行状態情報とを比較することにより例外処理ハンドラを選択し、実行制御を行うようにする。さらに、上記制御手段は、１本のスタックで制御するようにしている。
【００１０】
言い換えれば、本発明の情報処理装置では、例外処理機構を実現するために、通常処理プログラム及び複数の例外処理ハンドラのプログラムと共に、各例外ハンドラが選択されて実行する必要のある通常処理プログラムの実行状態と例外状況を予めコード化して各例外ハンドラ毎に用意し、各例外ハンドラと結合してプログラムコード中の情報として付加しておくようにしている。
【００１１】
より具体的に言うと、本発明による例外処理機構は、処理プログラムや例外ハンドラの実行状態を保持して実行し制御する実行制御手段と、例外状況を検出する検出手段と、例外検出時の通常処理プログラムの実行状態及び例外状況と例外ハンドラにコード化されて付加された実行状態及び例外状況を比較し複数の例外ハンドラの中から実行すべき例外ハンドラを検索し選択する検索手段により実現されるものである。
【００１２】
すなわち、本発明による例外処理機構は、複数準備されて動的に定義された例外処理ハンドラが通常処理プログラムの実行状態に基づいて動的に選択されるような動的スコープを持つ前述した例外処理形態のためのものであって、検出された例外状況は例外コードとしてコード化され、その例外コードに対応した例外ハンドラが例外検出時の通常処理プログラムの実行状態に応じて選択され実行される形態のためのものである。
【００１３】
なお、前記プログラムの実行状態とは、例えば、Ｃ言語では、どの関数のどの式や文から呼び出された関数がその時点でどの式や文を実行しているかを表し、ＣＰＵのレベルから見た場合はその時点のスタックの内容やプログラムカウンタ（ＰＣ）の内容である。  上記の形態によりプログラムされた例外ハンドラは、通常の処理プログラムの実行に伴って有効になったり無効になったりする。
【００１４】
【作用】
本発明によれば、通常処理プログラム及び複数の例外処理ハンドラのプログラムと共に、各例外処理ハンドラが選択されて実行する必要のある通常処理プログラムの実行状態と例外状況を予めコード化して各例外処理ハンドラ毎に用意し、各例外処理ハンドラと結合してプログラムコード中の情報として付加しておくようにしており、例外検出時に、例外検出時の通常プログラムの実行状態と各例外処理ハンドラに付加された通常処理プログラムの実行状態情報とを比較することにより例外処理ハンドラを選択し、実行制御を行うことで、例外処理ハンドラの有無が通常処理プログラムの処理量に影響を与えない。
【００１５】
【実施例】
以下、本発明の一実施例を図面を参照しながら説明する。
【００１６】
図１には本発明の情報処理装置の概略的な構成を示す。
【００１７】
本発明実施例の情報処理装置は、コンピュータプログラムを通常処理プログラムと複数の例外処理ハンドラに分離してコード化し、上記例外処理ハンドラの定義を上記通常処理プログラムの実行により動的に行い、例外検出時において上記通常処理プログラムの実行状態に基づいて上記例外処理ハンドラを動的に選択して実行する制御を行うものであり、図１に示す制御手段であるＣＰＵ１００は、所定の規則に則った第１の例外処理ハンドラから第２の例外処理ハンドラへの制御の移動（すなわち例えば、第１の例外処理ハンドラから当該第１の例外処理ハンドラよりも一般的な第２の例外処理ハンドラへの制御の移動）の行程と、例外処理ハンドラの実行制御状態の消去及び当該例外処理ハンドラを定義した実行環境の回復の行程と、例外処理ハンドラから例外起動点への制御の復帰の行程と、例外処理ハンドラと例外起動点のパラメータ交換の行程と、例外処理ハンドラが定義された実行環境での当該例外処理ハンドラの実行の行程と、例外処理を多重化する多重例外の行程とを行い、例外処理ハンドラの有無が通常処理プログラムの処理量に影響を与えないことを特徴とするものである。
【００１８】
先ず、図１の構成の具体的な説明に先立ち、本実施例の情報処理装置における例外処理機構の実現方法について説明する。
本発明実施例装置における例外処理機構は、仮想ＣＰＵのアーキテクチャにおける例外処理用の仮想ＣＰＵ命令及び例外シーケンスとして実現しており、その詳細について説明する。なお、以下の説明では、本発明の理解のみを目的とし、無用な複雑さを避けるため、通常の汎用ＣＰＵなら必ず持っていると考えられるようなＣＰＵの機能及び、関数呼び出し等の実現方法などについては詳細に説明していない。
【００１９】図２及び図３には、仮想ＣＰＵにおけるレジスタ（図１のＲＡＭ１３０の仮想ＣＰＵメモリ格納領域１０３及びＣＰＵ１００のレジスタの一部に対応する）を示し、プログラミングモデルを示している。
【００２０】
この仮想ＣＰＵのワードサイズは、３２ビットである。図２及び図３のように、仮想ＣＰＵは、１個のスタック７とスタックポインタ（ＳＰ）１を持ち、実行しているプログラムの命令をポイントするプログラムカウンタ（ＰＣ）２を持つ。また、この仮想ＣＰＵは、関数定義と呼び出しをサポートし、スタック上に関数の呼び出し状態とローカル変数の保存場所を示すためのフレームポインタ（ＦＰ）４を持っている。また、現在実行が行われている関数のアドレスをポイントする関数ワードフレームポインタ（ＷＰ）３をも持つ。例外状態フレームポインタ（ＥＳ）５と例外引数フレームポインタ（ＥＰ）６は、例外処理のためのスタックフレームがスタックに置かれた場合に、その例外状態と例外引数の保存場所をそれぞれポイントする。
【００２１】
次に、図４〜図６を用いて、関数のデータ構造について説明する。
図４には関数ワードフレーム８を、図５には関数命令フレーム９（例えばＮ個のハンドラ付き実行ブロックを持つ）を、図６には例外ハンドラテーブル１２を示している。なお図４の関数ワードフレーム８のｅｘｔｂｌｅフィールド１９のｅｘｔｂｌ  は例外ハンドラテーブルアドレスが格納されているフィールドのワードオフセット値［Ｉ］であり、ｌｏｃａｌｓは関数の引数とローカル変数の個数の合計、ｌｖａｒｓ  は関数のローカル変数の数である。
【００２２】
定義された関数は、この図４〜図６で示すような構造でメモリに置かれ、関数が参照される場合は、図４の関数ワードフレーム８のアドレスにより参照される。図４の関数のワードフレーム８には関数が参照するワード単位の定数が並んで配置され、図５の関数命令フレーム９にはバイト単位でコード化された仮想ＣＰＵ命令による関数の命令列（ｉｎｓｔｒｕｃｔｉｏｎ  ）が配置される。
【００２３】
実行中の関数の関数ワードフレーム８は、常に図２のＷＰレジスタ（関数ワードフレームポインタ）３でポイントされ、実行中の命令は図２のＰＣレジスタ（プログラムカウンタ）２でポイントされている。
【００２４】
例外処理を行う部分は、２個の命令ブロックすなわち図５の実行ブロック１０と例外ハンドラブロック１１で構成する。実行ブロックの命令は、連続したアドレスに置く。実行ブロックの命令を実行している途中に例外が検出された場合、対応する例外ハンドラブロックが起動対象となる。例外ハンドラブロックと実行ブロックとは必ず同一関数内にある。
【００２５】
１個の実行ブロックには、必ず対応する１個の例外ハンドラブロックを持つため、２個合わせて例外ハンドラ付きブロックと呼ぶ。１つの関数は複数の例外ハンドラ付きブロックを持つことができる。例外ハンドラ付きブロックを持つ関数は、必ず１個の図６に示す例外ハンドラテーブル１２を持つ。例外ハンドラテーブルのエントリ１３は、実行ブロックの命令が置かれているアドレスの範囲１４，１５とそれに対応する例外ハンドラブロックの先頭アドレス１７及び処理する例外の例外コード（処理受付可能な例外コード）１６で構成される。１つの関数は、複数の例外ハンドラ付きブロックを持つ場合、このハンドラテーブルエントリ１３が複数配置される。
【００２６】
例外ハンドラテーブルのアドレスは関数ワードフレーム８内の任意のオフセット［Ｉ］１８にあるワードにセットし、関数ワードフレーム８の０番目のワードの  下から１６ビット目から２３ビット目の８ビット（ｅｘｔｂｌ  フィールド）１９にテーブルアドレスをセットしたワードのオフセット値［Ｉ］  をセットしておく。また、例外ハンドラ付きブロックを持たない関数ではこのｅｘｔｂｌｅフィールド１９にはゼロをセットする。
【００２７】
例外ハンドラ付きブロックは、ネストすることも可能である。１個の関数内でネストすることもでき、また例外ハンドラ付きブロックを実行中に他の関数の呼び出しを行い、その呼び出された関数内で例外ハンドラ付きブロックを実行することでもネストされる。１個の関数内でネストする場合も例外ハンドラテーブルに複数のハンドラエントリを保持し、エントリの順番はネストの内側のものから外側のものになるように並べる。
【００２８】
関数が呼び出された場合のスタックフレーム２０の構造は、図７のように、各ローカル変数，Ｃａｌｌｅｒ  ＷＰ  ，  Ｃａｌｌｅｒ  ＰＣ  ，  Ｃａｌｌｅｒ  ＦＰ  等からなっている。
【００２９】
また、例外が検出され例外シーケンスが起動された場合に作られるスタックフレーム２１の構造は、図８に示すように、例外引数フレームと、例外状態フレームとからなり、上記例外引数フレームには例外引数が、上記例外状態フレームには、Ｉｎｉｔｉａｔｏｒ  ＥＳ，  Ｉｎｉｔｉａｔｏｒ  ＥＰ，  Ｉｎｉｔｉａｔｏｒ  ＷＰ，  Ｉｎｉｔｉａｔｏｒ  ＰＣ，  Ｉｎｉｔｉａｔｏｒ  ＦＰ，  Ｃａｔｃｈｅｒ  ＷＰ，  Ｃａｔｃｈｅｒ  ＰＣ，  Ｃａｔｃｈｅｒ  ＦＰ、予約（未使用）、ハンドラエントリインデックス、例外コードからなっている。
【００３０】
また、仮想ＣＰＵでの例外処理のための命令として、以下に示す４個の命令が用意されている。
【００３１】
１）  Ｒａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ
２）  Ｃｏｎｔｉｎｕｅ  Ｅｘｃｅｐｔｉｏｎ
３）  Ｒｅｔｕｒｎ  Ｅｘｃｅｐｔｉｏｎ
４）  Ｕｎｗｉｎｄ  Ｓｔａｃｋ
【００３２】
例外シーケンスは  Ｒａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ命令により起動されるか、あるいは、通常の命令実行時に仮想ＣＰＵがＣＰＵ内部で例外検出を行って起動する場合もあるが、両者とも例外処理のための部分の動作は同じであるため、ここでは、Ｒａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ  での起動を例にして説明する。
【００３３】
以上に示す４個の命令のなかで、１）を除く２），  ３），  ４）の命令は例外ハンドラ内だけで実行できる命令であり、１）は通常処理プログラムと例外ハンドラのどちらにおいてでも実行できる命令である。
【００３４】
図９と図１４は例外シーケンスでのいくつかの時点でのスタックスナップショットの例を示すものである。なお、図９については、図を見やすくするためにこの図９を図中一点鎖線で４分割し、それぞれを拡大して図１０〜図１３に示す。また、図１４についても同様に、図を見やすくするためにこの図１４を図中一点鎖線で４分割し、それぞれを拡大して図１５〜図１８に示す。
【００３５】
以下、この図９と図１４のスタックスナップショットの例と、図１９〜図２４のフローチャートを参照して各例外処理命令と例外シーケンスの詳細な動作について説明する。
【００３６】
図１９に例外の起動を行うプログラムのシーケンスフローを示す。
先ず、ステップＳ１７で例外ハンドラへのパラメータとなる例外引数をスタックにプッシュし、ステップＳ１８で例外の種類と理由を識別するための例外コードをスタックにプッシュする。そして、ステップＳ１９でＲａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ  命令を実行する。この時点でのスタックの状態とレジスタのポイント位置を図９と図１４の図中Ｐ１に示す。
【００３７】
図２０は、Ｒａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ  命令が実行された時の仮想ＣＰＵの動作のフローチャートを示している。
この図２０において、Ｒａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ  命令が実行開始されると、先ずステップＳ１において仮想ＣＰＵは、例外スタックフレームをスタックにプッシュし、ＥＳレジスタ（例外状態フレームポインタ５）は例外状態フレームをポイントするように設定され、ＥＰレジスタ（例外引数フレームポインタ６）は例外引数フレームをポイントするように設定される。この段階ではフレーム内のＩｎｉｔｉａｔｏｒ  ＥＳ，Ｉｎｉｔｉａｔｏｒ  ＥＰ，Ｉｎｉｔｉａｔｏｒ  ＦＰ，  Ｉｎｉｔｉａｔｏｒ  ＰＣ，  Ｉｎｉｔｉａｔｏｒ  ＷＰのフィールドにはＲａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ  が実行された時点でのレジスタの内容がセーブされて設定が行われるが、ハンドラエントリインデックスとＣａｔｃｈｅｒ  ＦＰ，  Ｃａｔｃｈｅｒ  ＰＣ，  Ｃａｔｃｈｅｒ  ＷＰには内容が設定されず、フレーム内にその領域だけが確保されている状態である。また、この時点でのＷＰ，ＰＣ，ＦＰレジスタ（関数ワードフレームポインタ３，プログラムカウンタ２，フレームポインタ４）はＲａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ  命令を実行した時点での関数の実行状態を示している。
【００３８】
その後、仮想ＣＰＵはステップＳ２に進む。このステップＳ２のステップＳ２Ａにおいて、ＷＰ（関数ワードフレームポインタ３）でポイントされている関数が例外ハンドラテーブルを持っている場合（Ｙｅｓ）は、ステップＳ２Ｂに進む。このステップＳ２Ｂにおいては、ＰＣレジスタ（プログラムカウンタ２）の内容が実行ブロックのアドレス範囲内にあって、かつ例外コードを処理受付可能な例外コードして持っているか、あるいはゼロの処理受付可能な例外コードを持つ例外ハンドラのエントリがその例外ハンドラテーブルの先頭から順番にサーチされる。その後、ステップＳ２Ｃに進む。
【００３９】
また、ステップＳ２Ａにおいて、ＷＰ（関数ワードフレームポインタ３）でポイントされている関数が例外ハンドラテーブルを持たない（Ｎｏの場合）か、或いはステップＳ２Ｂの次のステップＳ２Ｃにおいてテーブル内をサーチしてもエントリが見つからなかった場合（Ｎｏ）は、ステップＳ３にすすむ。仮想ＣＰＵはこのステップＳ３において、現在実行中の関数を呼び出した関数が関数からリターンするためにスタックに保存している仮想ＣＰＵの実行状態を関数スタックフレームからＦＰレジスタ（フレームポインタ４）をベースにしてアクセスし、ＷＰ，ＰＣ，ＦＰレジスタ（関数ワードフレームポインタ３，プログラムカウンタ２，フレームポインタ４）に回復した後、ステップＳ２に戻ってハンドラのサーチが繰り返される。関数の呼び出しチェインをたどってサーチを繰り返した結果、呼び出し元がなくなった場合の動作についてはフローに示されていないが、その場合の仮想ＣＰＵは致命的エラー状態となる。
【００４０】
また、上記ステップＳ２Ｃにおいて、例外ハンドラテーブルをサーチして条件を満たすハンドラエントリが見つかった場合（Ｙｅｓ）は、ステップＳ４に進む。仮想ＣＰＵは、このステップＳ４において、そのハンドラを持つ関数が実行されていた時点のＷＰ，ＰＣ，ＦＰレジスタ（関数ワードフレームポインタ３，プログラムカウンタ２，フレームポインタ４）を、例外状態フレームのＣａｔｃｈｅｒ  ＷＰ，Ｃａｔｃｈｅｒ  ＰＣ，Ｃａｔｃｈｅｒ  ＦＰの各フィールドにセーブし、見つかったエントリのテーブル上でのインデックスを同様に例外状態フレームのハンドラエントリインデックスに設定する。
【００４１】
その後、ステップＳ５に進み、このステップＳ５において、ハンドラエントリのハンドラブロック先頭アドレスを参照してそれをＰＣレジスタ（プログラムカウンタ２）に設定し、Ｒａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ  命令の実行は終了する。この時点でのスタックの状態とレジスタのポイント位置を図９と図１４の図中Ｐ２に示す。その後は、ＰＣ（プログラムカウンタ２）でポイントされたハンドラブロックの先頭の仮想ＣＰＵ命令から逐次実行が開始される。
【００４２】
なお、図２０のフローチャート中の  ＊ＸＸは、ＸＸでポイントされているメモリの内容を表し、ＸＸ．ＹＹはメモリＸＸのＹＹというフィールドの内容を表している。
【００４３】図２１には、例外ハンドラブロックでの処理シーケンスフローを示している。
この図２１において、ステップＳ２１は例外ハンドラでの処理の本体で、ここでは例外ハンドラのブロックがある関数と同じコンテクストで実行されるので、その関数の引数とローカル変数は例外起動時の内容を保持したままでアクセスでき、その他ＥＰ，ＥＳレジスタ（例外引数フレームポインタ６，例外状態フレームポインタ５）をベースにした例外引数と例外状態フレームの参照も可能である。その後、例外ハンドラブロックでの処理を終了するには、フローチャートでは条件判断を図示していないが例外ハンドラでの処理結果や例外の種類による条件を判断をしたうえで、３つの選択が可能である。
【００４４】
この例外ハンドリングシーケンスにおいて、ステップＳ２２を選択した場合は、Ｃｏｎｔｉｎｕｅ  Ｅｘｃｅｐｔｉｏｎ命令を実行する。
【００４５】
上記Ｃｏｎｔｉｎｕｅ  Ｅｘｃｅｐｔｉｏｎ命令が実行された場合の仮想ＣＰＵの動作フローチャートを図２２に示す。
この図２２のフローチャートにおいて、Ｃｏｎｔｉｎｕｅ  Ｅｘｃｅｐｔｉｏｎ命令が実行開始されると、先ず、ステップＳ６において仮想ＣＰＵは、ＥＳレジスタ（例外状態フレームポインタ５）でポイントされている例外状態フレームより、Ｃａｔｃｈｅｒ  ＦＰ，  Ｃａｔｃｈｅｒ  ＰＣ，  Ｃａｔｃｈｅｒ  ＷＰフィールドの内容をそれぞれＦＰ，ＰＣ，ＷＰレジスタ（関数ワードフレームポインタ３，プログラムカウンタ２，フレームポインタ４）に回復し、ハンドラエントリインデックスフィールドから、ハンドラテーブルのサーチ続行のためのテーブルインデックスを取り出す。
【００４６】
その後、上記仮想ＣＰＵはステップＳ７内のステップＳ７Ａにおいて、Ｒａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ  命令でのハンドラ検索条件ステップＳ２Ｂと同じ条件に合致するハンドラエントリをＷＰ（回数ワードフレームポインタ３）でポイントされている関数の例外ハンドラテーブルのテーブルインデックスで示される位置からからサーチする。
【００４７】
次のステップＳ７Ｂにおいてサーチして見つからなかった場合（Ｎｏ）は、ステップＳ８に進む。このステップＳ８において、ハンドラテーブルサーチのためのテーブルインデックスはゼロに設定し、次回のサーチに備える。
【００４８】
その後、ステップＳ９に進む。このステップＳ９のステップＳ９Ａにおいては、現在実行中の関数を呼び出した関数が関数からリターンするためにスタックに保存している仮想ＣＰＵの実行状態をＦＰレジスタ（フレームポインタ）をベースにして関数スタックフレームからアクセスし、ＷＰ，ＰＣ，ＦＰレジスタ（関数ワードフレームポインタ３，プログラムカウンタ２，フレームポインタ４）に回復し、次のステップＳ９ＢではＷＰ（関数ワードフレームポインタ３）でポイントされている関数が例外ハンドラテーブルを持つ関数であるまで関数呼び出しチェイン上でのサーチが行われる。このステップＳ９Ｂで、例外ハンドラテーブルが見つかった場合（Ｙｅｓ）は、ステップＳ７に戻ってハンドラエントリのサーチが繰り返される。
【００４９】
また、ステップＳ７において例外ハンドラテーブルをサーチして条件を満たすハンドラエントリが見つかった場合（ステップＳ７ＢでＹｅｓとなる場合）、仮想ＣＰＵはステップＳ１０に進む。このステップＳ１０においては、そのハンドラを持つ関数が実行されていた時点のＷＰ，ＰＣ，ＦＰレジスタ（関数ワードフレームポインタ３，プログラムカウンタ２，フレームポインタ４）を例外状態フレームのＣａｔｃｈｅｒ  ＷＰ，  Ｃａｔｃｈｅｒ  ＰＣ，  Ｃａｔｃｈｅｒ  ＦＰの各フィールドにセーブし、見つかったエントリのテーブル上でのインデックスを同様に例外状態フレームのハンドラエントリインデックスに設定する。
【００５０】
その後、ステップＳＳ１１において、ハンドラエントリのハンドラブロック先頭アドレスを参照してそれをＰＣレジスタ（プログラムカウンタ２）に設定し、Ｃｏｎｔｉｎｕｅ  Ｅｘｃｅｐｔｉｏｎ命令の実行は終了する。この時点でのスタックの状態とレジスタのポイント位置を図９と図１４の図中Ｐ３に示す。その後は、ＰＣ８プログラムカウンタ２）でポイントされた例外ハンドラブロックの先頭の仮想ＣＰＵ命令から新たな例外ハンドラシーケンスとして逐次実行が開始される。
【００５１】
また、図２１の例外ハンドリングシーケンスにおいてステップＳ２３を選択した場合、Ｕｎｗｉｎｄ  Ｓｔａｃｋ命令を実行する。
【００５２】
Ｕｎｗｉｎｄ  Ｓｔａｃｋ命令が実行された場合の仮想ＣＰＵの動作フローチャートを図２３に示す。
【００５３】
このフローチャートにおいて、Ｕｎｗｉｎｄ  Ｓｔａｃｋ命令が実行開始されると、ステップＳ１２のステップＳ１２ＡにおいてＥＳとＥＰレジスタ（例外状態フレームポインタ５と例外引数フレームポインタ６）をＥＳレジスタでポイントされている例外状態フレームのＩｎｉｔｉａｔｏｒ  ＥＳ，  Ｉｎｉｔｉａｔｏｒ  ＥＰフィールドから回復し、次のステップＳ１２Ｂで現在実行中の関数の実行の途中で生成された例外フレームをスタックからすべて取り除かれたか否かの判断を行い、取り除かれていないときはすべてスタックより取り除く。
【００５４】
その後、ステップＳ１３において、現在実行中の関数の局所的なスタックの状態を空にする。すなわちここでは、スタックはこの関数が最初に呼び出された状態と同じに戻り、Ｕｎｗｉｎｄ  Ｓｔａｃｋ命令の実行は終了する。この時点でのスタックの状態とレジスタのポイント位置を図９の図中Ｐ４に示す。
【００５５】
その後は、図２１において示した例外ハンドラブロックの処理シーケンスに戻り、Ｕｎｗｉｎｄ  Ｓｔａｃｋ命令の次の仮想ＣＰＵ命令から逐次実行が行われるが、ステップＳ２４のように関数内のどこかの通常処理プログラムにブランチを行うのが一般的である。このように、例外ハンドリングシーケンスにおいてステップＳ２３が選択された場合、図１９の例外起動シーケンスのステップＳ２０へ戻るための情報をすべて消滅させるので、決して例外起動シーケンスが回復されて終了することはない。
【００５６】
上述のＵｎｗｉｎｄ  Ｓｔａｃｋ命令の機構例では、スタック内容をポップして削除するだけであったが、関数スタックフレームをポップすることで制御の継続が消滅してしまうと問題を生じる関数の後処理を行わせるため、Ｕｎｗｉｎｄ  Ｓｔａｃｋの実行時に起動されるＵｎｗｉｎｄプロテクションハンドラをその関数内に定義させておき、それをＵｎｗｉｎｄ  Ｓｔａｃｋ命令実行時に起動させることが、Ｒａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ命令でのハンド  ラのサーチと同様な機構をＵｎｗｉｎｄ  Ｓｔａｃｋ命令においても同様に適用して付加することが可能である。
【００５７】
図２１の例外ハンドリングシーケンスにおいてステップＳ２５を選択した場合、ハンドラのリターン値をスタックにプッシュし、ステップＳ２６においてＲｅｔｕｒｎ  Ｅｘｃｅｐｔｉｏｎ命令を実行する。
【００５８】
Ｒｅｔｕｒｎ  Ｅｘｃｅｐｔｉｏｎ命令が実行された場合の仮想ＣＰＵの動作フローチャートを図２４に示す。また、Ｒｅｔｕｒｎ  Ｅｘｃｅｐｔｉｏｎ命令の実行直前でのスタックの状態とレジスタのポイント位置を図１４のＰ５に示す。
【００５９】
図２４のフローチャートにおいて、Ｒｅｔｕｒｎ  Ｅｘｃｅｐｔｉｏｎ命令が実行されると、仮想ＣＰＵはステップＳ１４において、スタックのトップにある例外ハンドラのリターン値を取っておく。そして、ステップＳ１５においてＥＳ（例外状態フレームポインタ５）でポイントされている例外状態フレームのＩｎｉｔｉａｔｏｒ  ＷＰ，  Ｉｎｉｔｉａｔｏｒ  ＰＣ，  Ｉｎｉｔｉａｔｏｒ  ＦＰ，  Ｉｎｉｔｉａｔｏｒ  ＥＰ，  Ｉｎｉｔｉａｔｏｒ  ＥＳフィールドの内容をそれぞれＷＰ，ＰＣ，ＦＰ，ＥＰ，ＥＳレジスタ（関数ワードフレームポインタ３，プログラムカウンタ２，フレームポインタ４，例外引数フレームポインタ６，例外状態フレームポインタ５）に回復し、例外状態フレームと例外引数フレームをスタックからポップして取り除く。
【００６０】
次のステップＳ１６において、ステップＳ１４で取っておいた例外ハンドラのリターン値をスタックのトップに置き、Ｒｅｔｕｒｎ  Ｅｘｃｅｐｔｉｏｎ命令の実行は終了する。この時点でのスタックの状態とレジスタのポイント位置を図１４の図中Ｐ６に示す。その後は、例外ハンドラを起動したＲａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ命令を実行した関数  の実行状態での例外起動シーケンスに戻るので図１９のステップＳ２０において、Ｒａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ命令の次の仮想ＣＰＵ命令からの逐次実行が再開され、例外  ハンドラのリターン値をポップして受け取り、例外起動シーケンスが終了する。
【００６１】
上述した本実施例で多重例外が発生した場合も、例外処理状態はスタックフレームとしてスタックされるので、例外起動点に復帰も矛盾なく可能であり、また、Ｕｎｗｉｎｄ  Ｓｔａｃｋ命令では多重の例外スタックフレームをまとめて消去することも可能となっている。
【００６２】
図１に戻って、本実施例装置のＣＤ−ＲＯＭドライブ１０６は、装荷されたソフトウェアパッケージのメディア（上記ＣＤ−ＲＯＭディスク１１１）からデータを読み出す。ここで、このディスク１１１に記録されているデータには、前述した通常処理プログラム及び複数の例外処理ハンドラのプログラムと共に、各例外ハンドラが選択されて実行する必要のある通常処理プログラムの実行状態と例外状況を予めコード化して各例外処理ハンドラ毎に用意し、各例外処理ハンドラと結合してプログラムコード中の情報として付加しておくようにしている。上記通常処理プログラム及び例外処理ハンドラのプログラムと、当該例外処理ハンドラに付加された情報が、仮想ＣＰＵ命令（仮想ＣＰＵプログラム）として、例えばディスク１１１の最内周の上記仮想ＣＰＵプログラム領域１１２に記録されている。当該仮想ＣＰＵプログラムが、ＲＡＭ１３０の仮想ＣＰＵメモリ格納領域１０３に格納される。
【００６３】
また、本実施例装置のＣＰＵ１００は、バス１０８に接続された各装置（例えばキーボード等のキー入力装置７、ＣＤ−ＲＯＭドライブ１０６、後述するＭＰＥＧデコーダ１０５、ＣＲＴディスプレイコントローラ１０９等）の制御や、各種データの送受を中心的に行う。このＣＰＵ１００は、仮想ＣＰＵインタプリタプログラム格納領域１０２に格納されている仮想ＣＰＵインタプリタプログラムに基づいて、上記バス１０８に接続された上記ＲＡＭ１３０の仮想ＣＰＵメモリ格納領域１０３に格納された上記仮想ＣＰＵプログラムを解釈して実行することで前述したように例外処理機構を実現する。
【００６４】
また、仮想ＣＰＵプログラムは、上記バス１０８に接続された各装置の制御を高レベルで行い、ＣＤ−ＲＯＭ製作者の意図した制御が最終的に行われる。
【００６５】
なお、本実施例装置は、いわゆるＭＰＥＧ（Ｍｏｖｉｎｇ  Ｐｉｃｔｕｒｅ  Ｅｘｐｅｒｔ  Ｇｒｏｕｐ）デコーダ１０５をも有しており、上記ＣＤ−ＲＯＭディスク１１１上に記録された圧縮画像データを当該ＭＰＥＧデコーダ１０５によってデコードし、この画像データが画像バッファメモリ１０４を介してＣＲＴディスプレイコントローラ１０９により制御されるＣＲＴディスプレイ１１０に表示されるようになっている。また、上記ディスプレイ１１０は、ＣＲＴ（陰極線管）のみならず、他の表示装置（例えば液晶表示装置）を用いることも可能である。この場合、コントローラ１０９はその表示装置に応じた制御を行う。
【００６６】
以上説明してきた本発明の実施例では、例外ハンドラが有効な処理プログラムのアドレス範囲とそれに対応する例外ハンドラのアドレスをテーブルにして予め用意しておく。そして、例外が起動された時点になって初めてこのテーブルとスタックフレームのサーチが行われる。従って、通常処理プログラムのＣＰＵ命令内容は例外ハンドラの有無には全く無関係であり、例外ハンドラの定義を有効にしたり無効にしたりする処理は、通常処理プログラムでは行う必要がない。また、本実施例で説明したような柔軟で多様な制御形態を持つ例外処理機構を提供するような言語やＣＰＵにおいて、通常処理での例外処理付加のための処理オーバヘッドをゼロとさせることが本発明によって実現可能となる。
【００６７】
さらに、以上の実施例は関数定義とその呼び出し機構を持つような言語及びＣＰＵでの一実施例にすぎないが、言語やＣＰＵによって必要とされる実行状態やその概念が異なるものであっても、実行状態の概念を持つ言語やＣＰＵであれば、同様な例外処理機構を実現するために本発明を適用することはいくらでも可能である。
【００６８】
【発明の効果】
本発明の情報処理装置及び方法においては、通常処理プログラム及び複数の例外処理ハンドラのプログラムと共に、各例外処理ハンドラが選択されて実行する必要のある通常処理プログラムの実行状態と例外状況を予めコード化して各例外処理ハンドラ毎に用意し、各例外処理ハンドラと結合してプログラムコード中の情報として付加しておくようにしているため、例外処理プログラムを付加するための通常処理プログラムに必要なオーバヘッドをゼロにすることが可能となっている。すなわち例外処理の有無が通常処理プログラムの処理量に全く影響を与えない例外処理機能が実現可能となっている。
【図面の簡単な説明】
【図１】本発明実施例の情報処理装置の概略構成を示すブロック回路図である。
【図２】仮想ＣＰＵが持っているレジスタについて説明するための図である。
【図３】仮想ＣＰＵのスタックについて説明するための図である。
【図４】関数ワードフレームの構造を示す図である。
【図５】関数命令フレームの構造を示す図である。
【図６】例外ハンドラテーブルの構造を示す図である。
【図７】関数が呼び出された場合のスタックフレームの構造を示す図である。
【図８】例外が検出され例外シーケンスが起動された場合に作られるスタックフレームの構造を示す図である。
【図９】例外シーケンスでのスタックスナップショットの一例を示す図である。
【図１０】図９を４分割した場合の左上の部分を拡大して示す図である。
【図１１】図９を４分割した場合の左下の部分を拡大して示す図である。
【図１２】図９を４分割した場合の右上の部分を拡大して示す図である。
【図１３】図９を４分割した場合の右下の部分を拡大して示す図である。
【図１４】例外シーケンスでのスタックスナップショットの他の例を示す図である。
【図１５】図１４を４分割した場合の左上の部分を拡大して示す図である。
【図１６】図１４を４分割した場合の左下の部分を拡大して示す図である。
【図１７】図１４を４分割した場合の右上の部分を拡大して示す図である。
【図１８】図１４を４分割した場合の右下の部分を拡大して示す図である。
【図１９】例外の起動を行うプログラムのシーケンスを示すフローチャートである。
【図２０】Ｒａｉｓｅ  Ｅｘｃｅｐｔｉｏｎ  命令が実行された時の仮想ＣＰＵの動作を示すフローチャートである。
【図２１】例外ハンドラブロックでの処理シーケンスを示すフローチャートである。
【図２２】Ｃｏｎｔｉｎｕｅ  Ｅｘｃｅｐｔｉｏｎ命令が実行された場合の仮想ＣＰＵの動作を示すフローチャートである。
【図２３】Ｕｎｗｉｎｄ  Ｓｔａｃｋ命令が実行された場合の仮想ＣＰＵの動作を示すフローチャートである。
【図２４】Ｒｅｔｕｒｎ  Ｅｘｃｅｐｔｉｏｎ命令が実行された場合の仮想ＣＰＵの動作を示すフローチャートである。
【符号の説明】
１・・・・・・・・・・スタックポインタ
２・・・・・・・・・・プログラムカウンタ
３・・・・・・・・・・関数ワードフレームポインタ
５・・・・・・・・・・例外状態フレームポインタ
６・・・・・・・・・・例外引数フレームポインタ
７・・・・・・・・・・スタック
８・・・・・・・・・・関数ワードフレーム
９・・・・・・・・・・関数命令フレーム
１２・・・・・・・・・例外ハンドラテーブル
２０・・・・・・・・・関数スタックフレーム
２１・・・・・・・・・例外スタックフレーム
１００・・・・・・・・ＣＰＵ
１０２・・・・・・・・仮想ＣＰＵインタプリタプログラム格納領域
１０３・・・・・・・・仮想ＣＰＵメモリ格納領域
１０４・・・・・・・・画像バッファメモリ
１０５・・・・・・・・ＭＰＥＧデコーダ
１０６・・・・・・・・ＣＤ−ＲＯＭドライブ
１０７・・・・・・・・キー入力装置
１０８・・・・・・・・バス
１０９・・・・・・・・ＣＲＴディスプレイコントローラ
１１０・・・・・・・・ＣＲＴディスプレイ
１１１・・・・・・・・ＣＤ−ＲＯＭディスク
１１２・・・・・・・・仮想ＣＰＵプログラム領域
１２０・・・・・・・・ＲＯＭ
１３０・・・・・・・・ＲＡＭ
【図１】
0003603314.tif 000002
【図２】
0003603314.tif 000003
【図３】
0003603314.tif 000004
【図４】
0003603314.tif 000005
【図５】
0003603314.tif 000006
【図６】
0003603314.tif 000007
【図７】
0003603314.tif 000008
【図８】
0003603314.tif 000009
【図９】
0003603314.tif 000010
【図１０】
0003603314.tif 000011
【図１１】
0003603314.tif 000012
【図１２】
0003603314.tif 000013
【図１３】
0003603314.tif 000014
【図１４】
0003603314.tif 000015
【図１５】
0003603314.tif 000016
【図１６】
0003603314.tif 000017
【図１７】
0003603314.tif 000018
【図１８】
0003603314.tif 000019
【図１９】
0003603314.tif 000020
【図２０】
0003603314.tif 000021
【図２１】
0003603314.tif 000022
【図２２】
0003603314.tif 000023
【図２３】
0003603314.tif 000024
【図２４】
0003603314.tif 000025