(57)【特許請求の範囲】
【請求項１】
メモリと少なくとも１つのデータ処理装置とを含むコンピュータの前記メモリにダウンロードされたバイトコードプログラムの保全性をベリファイする方法であって、
前記プログラムに含まれる一連のバイトコードの各バイトコードが、特定のデータタイプのデータに関する演算を表しかつ前記各バイトコードの扱うデータタイプのデータに関して対応するデータタイプ制約を有するとき、
（Ａ）前記プログラムの実行前に前記プログラムを前処理する過程であって、前記プログラムに含まれる前記バイトコードのいずれかを実行することが該バイトコードに対する前記データタイプ制約に違反することになるかどうかをデータタイプ適合性判定手段が判定するとともに、前記プログラムに含まれる前記バイトコードのいずれかを実行することが該バイトコードに対する前記データタイプ制約に違反することになるときには信号生成手段がプログラムフォールト信号を生成することによって、前記プログラムを前処理する該過程と、
（Ｂ）前記前処理過程で前記信号生成手段がプログラムフォールト信号を生成しなかったとき、イネーブル手段が、前記プログラムを実行可能な状態にする過程と、
（Ｃ）前記前処理過程で前記信号生成手段がプログラムフォールト信号を生成したとき、阻止手段が、前記プログラムの実行を阻止する過程と、
（Ｄ）前記プログラムが実行可能な状態になったとき、前記データ処理装置が前記バイトコードプログラムを実行する過程とを含み、
前記バイトコードプログラムが、少なくとも１つの実行ループを含み、
前記前処理過程（Ａ）が、
前記プログラムの実行中にオペランドスタックに格納されることになるオペランドに対するデータタイプ値を前記プログラムに対応する仮想スタックに格納し、前記仮想スタックに格納された前記データタイプ値を、スタックステータス追跡手段が、前記プログラムに含まれる前記各バイトコードの実行前後に特定する過程と、
前記プログラムに含まれるいずれかのループを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるかどうかをスタックオーバフロー／アンダーフロー検査手段が判定するとともに、前記プログラムに含まれる前記いずれかのループを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるときには前記信号生成手段がプログラムフォールト信号を生成する過程とを更に含み、
それによって、前記バイトコードプログラム実行過程において、前記データ処理装置が前記プログラムを実行する間の、オペランドスタックに格納されているオペランドに関するデータタイプのチェックとオペランドスタックのオーバフロー及びアンダーフローのチェックとを省略可能ならしめることを特徴とする方法。
【請求項２】
メモリと少なくとも１つのデータ処理装置とを含むコンピュータの前記メモリにダウンロードされたバイトコードプログラムの保全性をベリファイする方法であって、
前記プログラムに含まれる一連のバイトコードの各バイトコードが、特定のデータタイプのデータに関する演算を表しかつ前記各バイトコードの扱うデータタイプのデータに関して対応するデータタイプ制約を有するとき、
（Ａ）前記プログラムの実行前に前記プログラムを前処理する過程であって、前記プログラムに含まれる前記バイトコードのいずれかを実行することが該バイトコードに対する前記データタイプ制約に違反することになるかどうかをデータタイプ適合性判定手段が判定するとともに、前記プログラムに含まれる前記バイトコードのいずれかを実行することが該バイトコードに対する前記データタイプ制約に違反することになるときには信号生成手段がプログラムフォールト信号を生成することによって、前記プログラムを前処理する該過程と、
（Ｂ）前記前処理過程で前記信号生成手段がプログラムフォールト信号を生成しなかったとき、イネーブル手段が、前記プログラムを実行可能な状態にする過程と、
（Ｃ）前記前処理過程で前記信号生成手段がプログラムフォールト信号を生成したとき、阻止手段が、前記プログラムの実行を阻止する過程と、
（Ｄ）前記プログラムが実行可能な状態になったとき、前記データ処理装置が、前記バイトコードプログラムを実行する過程とを含み、
前記バイトコードプログラムが、複数のジャンプ／分岐バイトコードを含み、
前記過程（Ａ）が、
前記プログラムの実行中にオペランドスタックに格納されることになるオペランドに対するデータタイプ値を前記プログラムに対応する仮想スタックに格納し、前記プログラムに含まれる２つ以上のバイトコードが前記プログラム中の同じ位置にジャンプ／分岐するバイトコードを含むときにはいつでも、前記仮想スタックに格納された前記データタイプ値が異なるジャンプ／分岐に対し同じであるかどうかを前記各ジャンプ／分岐の実行前にジャンプ／分岐検査手段が判定するとともに、前記仮想スタックに格納された前記データタイプ値が同じでなければ前記信号生成手段がプログラムフォールト信号を生成する過程を含み、
それによって、前記バイトコードプログラムを実行する前記過程（Ｄ）において、前記データ処理装置が前記プログラムを実行する間の、オペランドスタックに格納されているオペランドに関するデータタイプのチェックと前記オペランドスタックに格納されるオペランドの数及びデータタイプが同じバイトコードに対して同一となるか否かのチェックとを省略可能ならしめることを特徴とする方法。
【請求項３】
メモリと少なくとも１つのデータ処理装置とを含むコンピュータの前記メモリにダウンロードされたバイトコードプログラムの保全性をベリファイする方法であって、
一連のバイトコードを含む前記プログラムが、複数のジャンプ／分岐バイトコードを含むとき、
（Ａ）前記プログラムの実行前に前記プログラムを前処理する過程であって、
前記プログラムの実行中にオペランドスタックに格納されることになるオペランドに対するデータタイプ値を前記プログラムに対応する仮想スタックに格納し、該仮想スタックに格納された前記データタイプ値を、スタックステータス追跡手段が、前記プログラムに含まれる前記各バイトコードの実行前後に特定し、かつ、
前記プログラムに含まれる２つ以上のバイトコードが前記プログラム中の同じ位置にジャンプ／分岐するバイトコードを含むときにはいつでも、前記仮想スタックに格納された前記データタイプ値が異なるジャンプ／分岐に対し同じであるかどうかを前記各ジャンプ／分岐の実行前にジャンプ／分岐検査手段が判定するとともに、前記仮想スタックに格納された前記データタイプ値が同じでなければ前記信号生成手段がプログラムフォールト信号を生成することによって、前記プログラムを前処理する該過程と、
（Ｂ）前記前処理過程で前記信号生成手段がプログラムフォールト信号を生成しなかったとき、イネーブル手段が、前記プログラムを実行可能な状態にする過程と、
（Ｃ）前記前処理過程で前記信号生成手段がプログラムフォールト信号を生成したとき、阻止手段が、前記プログラムの実行を阻止する過程と、
（Ｄ）前記プログラムが実行可能な状態になったとき、前記データ処理装置が前記プログラムを実行する過程とを含み、
それによって、前記プログラム実行過程における前記オペランドスタックに格納されるオペランドの数及びデータタイプが同じバイトコードに対して同一となるか否かのチェックを省略可能ならしめることを特徴とする方法。
【請求項４】
前記過程（Ａ）が、
前記プログラムに含まれるいずれかのループを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるかどうかをスタックオーバフロー／アンダーフロー検査手段が判定するとともに、前記プログラムに含まれる前記いずれかのループを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるときには前記信号生成手段がプログラムフォールト信号を生成する過程を含むことを特徴とする請求項３に記載の方法。
【請求項５】
メモリと少なくとも１つのデータ処理装置とを含むコンピュータの前記メモリにダウンロードされたバイトコードプログラムの保全性をベリファイする方法であって、
一連のバイトコードを含む前記プログラムが、複数のジャンプ／分岐バイトコードと、少なくとも１つの実行ループとを含むとき、
（Ａ）前記プログラムの実行前に前記プログラムを前処理する過程であって、前記プログラムの実行中にオペランドスタックに格納されることになるオペランドに対するデータタイプ値を前記プログラムに対応する仮想スタックに格納し、該仮想スタックに格納された前記データタイプ値を、スタックステータス追跡手段が、前記プログラムに含まれる前記各バイトコードの実行前後に特定し、前記プログラムに含まれる前記バイトコードのいずれかを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるかどうかをスタックオーバフロー／アンダーフロー検査手段が判定するとともに、前記プログラムに含まれる前記いずれかのループを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるときには、信号生成手段がプログラムフォールト信号を生成することによって、前記プログラムを前処理する該過程と、
（Ｂ）前記前処理過程で前記信号生成手段がプログラムフォールト信号を生成しなかったとき、イネーブル手段が、前記プログラムを実行可能な状態にする過程と、
（Ｃ）前記前処理過程で前記信号生成手段がプログラムフォールト信号を生成したとき、阻止手段が、前記プログラムの実行を阻止する過程と、
（Ｄ）前記プログラムが実行可能な状態になったとき、前記データ処理装置が前記プログラムを実行する過程とを含み、
それによって、前記プログラム実行過程におけるオペランドスタックのオーバフロー及びアンダーフローのチェックを省略可能ならしめることを特徴とする方法。
【請求項６】
バイトコードプログラムの保全性をベリファイするための装置であって、
前記バイトコードプログラムに含まれる一連のバイトコードの各バイトコードが、（Ａ）特定のデータタイプのデータに関する演算を表しかつ（Ｂ）前記各バイトコードの扱うデータタイプのデータに関して対応するデータタイプ制約を有するとき、
前記バイトコードプログラムを格納するためのメモリと、
前記メモリに格納されたプログラムを実行するためのデータ処理装置と、
前記プログラムに含まれる前記バイトコードのいずれかを実行することが該バイトコードに対する前記データタイプ制約に違反することになるかどうかを判定するデータタイプ適合性判定手段と、
前記プログラムに含まれる前記バイトコードのいずれかを実行することが該バイトコードに対する前記データタイプ制約に違反することになるときにプログラムフォールト信号を生成する信号生成手段と、
前記信号生成手段がプログラムフォールト信号を生成しなかったときにのみ前記プログラムを実行可能な状態にするイネーブル手段とを含み、
これによって、前記イネーブル手段が前記プログラムを実行可能な状態にした後に前記データ処理装置が前記プログラムを実行する間の、オペランドスタックに格納されているオペランドに関するデータタイプのチェックを省略可能ならしめることを特徴とする装置。
【請求項７】
前記プログラムの実行中にオペランドスタックに格納されることになるオペランドに対するデータタイプ値を格納している前記プログラムに対応する仮想スタックの状態を、前記プログラムに含まれる前記各バイトコードの実行前後に判定するスタックステータス追跡手段と、
（Ａ）前記バイトコードプログラムを実行することがオペランドスタックのオーバフローまたはアンダーフローを生じさせることになるかどうか及び（Ｂ）前記バイトコードプログラムに含まれるいずれかのループを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるかどうかを判定するスタックオーバフロー／アンダーフロー検査手段とを更に含み、
前記プログラムに含まれる前記いずれかのループを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるときには、前記信号生成手段がプログラムフォールト信号を生成し、
これによって、前記データ処理装置が前記バイトコードプログラムを実行する間の、オペランドスタックのオーバフロー及びアンダーフローのチェックを省略可能ならしめることを特徴とする請求項６に記載の装置。
【請求項８】
前記プログラムの実行中にオペランドスタックに格納されることになるオペランドに対するデータタイプ値を前記プログラムに対応する仮想スタックに格納する手段と、
前記プログラムに含まれる２つ以上のバイトコードが前記プログラム中の同じ位置にジャンプ／分岐するバイトコードを含むときにはいつでも、前記仮想スタックに格納された前記データタイプ値が異なるジャンプ／分岐に対し同じであるかどうかを前記各ジャンプ／分岐の実行前に判定するジャンプ／分岐検査手段を更に含み、
前記仮想スタックに格納された前記データタイプ値が同じでなければ、前記信号生成手段がプログラムフォールト信号を生成し、
これによって、前記データ処理装置が前記バイトコードプログラムを実行する間の、前記オペランドスタックに格納されるオペランドの数及びデータタイプが同じバイトコードに対して同一となるか否かのチェックを省略可能ならしめることを特徴とする請求項６に記載の装置。
【請求項９】
バイトコードプログラムの保全性をベリファイするための装置であって、
一連のバイトコードを含む前記バイトコードプログラムが、複数のジャンプ／分岐バイトコードを含むとき、
前記バイトコードプログラムを格納するためのメモリと、
前記メモリに格納されたプログラムを実行するためのデータ処理装置と、
前記プログラムの実行中にオペランドスタックに格納されることになるオペランドに対するデータタイプ値を前記プログラムに対応する仮想スタックに格納する手段と、
前記仮想スタックに格納された前記データタイプ値を、前記プログラムに含まれる前記各バイトコードの実行前後に特定するスタックステータス追跡手段と、
前記プログラムに含まれる２つ以上のバイトコードが前記プログラム中の同じ位置にジャンプ／分岐するバイトコードを含むときにはいつでも、前記仮想スタックに格納された前記データタイプ値が異なるジャンプ／分岐に対し同じであるかどうかを前記各ジャンプ／分岐の実行前に判定するジャンプ／分岐検査手段と、
前記仮想スタックに格納された前記データタイプ値が同じでない場合プログラムフォールト信号を生成する信号生成手段とを有し、
前記信号生成手段がプログラムフォールト信号を生成しなかったときにのみ前記プログラムを実行可能な状態にするようなイネーブル手段を更に含み、
これによって、前記イネーブル手段が前記プログラムを実行可能な状態にした後に前記データ処理装置が前記プログラムを実行する間の、前記オペランドスタックに格納されるオペランドの数及びデータタイプが同じバイトコードに対して同一となるか否かのチェックを省略可能ならしめることを特徴とする装置。
【請求項１０】
（Ａ）前記バイトコードプログラムを実行することがオペランドスタックのオーバフローまたはアンダーフローを生じさせることになるかどうか及び（Ｂ）前記バイトコードプログラムに含まれるいずれかのループを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるかどうかを判定するスタックオーバフロー／アンダーフロー検査手段を更に含み、
前記プログラムに含まれる前記いずれかのループを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるときには、前記信号生成手段がプログラムフォールト信号を生成することを特徴とする請求項９に記載の装置。
【請求項１１】
バイトコードプログラムの保全性をベリファイするための装置であって、
一連のバイトコードを含む前記バイトコードプログラムが、複数のジャンプ／分岐バイトコードと少なくとも１つの実行ループとを含むとき、
前記バイトコードプログラムを格納するためのメモリと、
前記メモリに格納されたプログラムを実行するためのデータ処理装置と、
前記プログラムの実行中にオペランドスタックに格納されることになるオペランドに対するデータタイプ値を格納している前記プログラムに対応する仮想スタックの状態を、前記プログラムに含まれる前記各バイトコードの実行前後に判定するスタックステータス追跡手段と、
（Ａ）前記バイトコードプログラムを実行することがオペランドスタックのオーバフローまたはアンダーフローを生じさせることになるかどうか及び（Ｂ）前記バイトコードプログラムに含まれるいずれかのループを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるかどうかを判定するスタックオーバフロー／アンダーフロー検査手段と、
前記プログラムに含まれる前記いずれかのループを実行することが前記オペランドスタックにオペランドの正味の増加または減少をもたらすことになるときプログラムフォールト信号を生成する信号生成手段とを有し、
前記信号生成手段がプログラムフォールト信号を生成しなかったときにのみ前記プログラムを実行可能な状態にするようなイネーブル手段を更に含み、
これによって、前記イネーブル手段が前記プログラムを実行可能な状態にした後に前記データ処理装置が前記プログラムを実行する間の、オペランドスタックのオーバフロー／アンダーフローのチェックを省略可能ならしめることを特徴とする装置。
【発明の詳細な説明】
【０００１】
【発明が属する技術分野】
本発明は、一般に、個別の基本マシン命令セットを用いる複数のコンピュータプラットフォーム上のコンピュータソフトウェアの利用法に関する。より詳細には、データタイプ及びオペランドスタックの使用に関するチェックをより効率的に行う効果的な方法及びプログラムインタープリタに関する。
【０００２】
【従来の技術】
図１に一般的に示されているように、典型的な従来のネットワーク化されたコンピュータシステム１００に於いて、第１コンピュータ１０２は、第２コンピュータ１０４にあるコンピュータプログラム１０３をダウンロードすることができる。この例では、第１ユーザノード１０２は、典型的には、中央演算装置（ＣＰＵ）１０６、ユーザインタフェース１０８、プログラム実行用の主メモリ１１０（例えばＲＡＭ）、オペレーティングシステム１１３、文献及び他のデータを格納するための補助記憶装置１１２（例えばハードディスク）、及びコンピュータネットワーク１２０（例えばインターネット、ローカルエリアネットワークまたはワイドエリアネットワーク）に接続するためのモデムなどのコミニュケーションインタフェース１１４を有するユーザワークステーションである。コンピュータ１０２及び１０４は、“ネットワーク上のノード”または“ネットワークノード”と呼ばれることもある。
【０００３】
第２コンピュータ１０４はネットワークサーバであるのが一般的だが、第２ユーザワークステーションであっても良く、通常、第１コンピュータと基本的に同じコンピュータ要素を含んでいる。
【０００４】
従来、第１コンピュータ１０２が第２コンピュータ１０４からコンピュータプログラム１０３のコピーをダウンロードした後に、第１コンピュータ１０２のユーザが、ダウンロードされたプログラム１０３の保全性をベリファイするのを支援するための標準的なツールは実質的にない。特に、第１コンピュータのユーザが、ダウンロードされたプログラムのソースコードを調べない限り、従来技術のツールを用いて、ダウンロードされたプログラム１０３がスタックに対しアンダーフローやオーバフローとならないか、或いはダウンロードされたプログラム１０３がユーザコンピュータのファイルや他のリソースに悪影響を与えないかどうかを判断することは実質的に不可能である。
【０００５】
あるコンピュータから別のコンピュータへのコンピュータソフトウェアのダウンロードに関する別の問題は、個別の基本マシン命令セットを用いているコンピュータプラットフォーム間のコンピュータソフトウェアの転送の問題である。従来も、プラットフォームに依存しないコンピュータプログラムやプラットフォームに依存しないコンピュータプログラミング言語の例はいくつかある。しかしながら、従来技術は、データタイプの使用に関する制約やオペランドスタックの使用に関する制約を破らないようにしつつ、そのようなプラットフォームに依存しないコンピュータプログラムを効率よく実行するためのツールに欠けている。
【０００６】
【発明が解決しようとする課題】
上述したように、本発明の主な目的は、データタイプの使用に関する制約やオペランドスタックの使用に関する制約を破らないようにしつつ、コンピュータプログラムを効率よく実行するためのツールを備えたコンピュータシステム及びその動作方法を提供することである。
【０００７】
【課題を解決するための手段】
本発明は、限定された、データタイプに依存したバイトコードセットを用いたバイトコード言語（“ＯＡＫ言語（ＯＡＫ language）”として商品化されている）で書かれたコンピュータプログラムのためのプログラムインタープリタに関する。この言語で使用可能なソースコードのバイトコードは、（Ａ）処理可能なデータタイプについて制約があるスタックデータ消費型バイトコードである、（Ｂ）スタックデータは使用しないが、データタイプが既知であるデータをスタックに加えたり、データタイプに関係なくスタックからデータを取り出したりすることによってスタックに影響を与える、或いは（Ｃ）スタックデータの使用も、スタックへのデータの付加もしないのいずれかである。
【０００８】
本発明のインタープリタは、バイトコードプログラムを実行する前に、バイトコードプログラムベリファイヤを実行し、指定されたプログラムの保全性を確かめる。バイトコードプログラムベリファイヤは、指定されたプログラム内のバイトコード命令のうち、不適合なデータタイプのデータを処理しようとしたり、オペランドスタックのオーバフローまたはアンダーフローを生じさせるようなバイトコード命令を識別することによって、プログラムの保全性をベリファイする。プログラムベリファイヤが、予め定められたスタックやデータタイプの使用に関する制約を破る命令を見つけた場合、そのプログラムがインタープリタによって実行されないようにされる。
【０００９】
本発明に関するバイトコードプログラムベリファイヤは、指定されたバイトコードプログラムを実行するとき、プログラムオペランドスタック内に格納されるデータを示すスタック情報を一時的に格納するための仮想スタック（virtual stack）を含んでいる。このベリファイヤは、プログラムの各ポイントに於いてオペランドスタックに格納されるであろうデータの数、順番、及びデータタイプを示すように仮想オペランドスタックを更新しながらプログラムの各バイトコード命令を順次処理していくことによって、指定されたプログラムを処理する。このベリファイヤは、仮想スタックの情報と、各バイトコード命令のデータタイプに関する制約とを比べて、プログラムを実行したときオペランドスタックにバイトコード命令のデータタイプに関する制約に適合しないデータが含まれるようなことがないかどうか判定するとともに、指定されたプログラム内のバイトコード命令によってオペランドスタックのアンダーフローやオーバフローが生じるようなことはないかどうかチェックする。
【００１０】
バイトコードプログラムの命令の流れを細かく分析しなくていいように、またバイトコード命令を何度もベリファイしなくていいように、指定されたプログラム内に於いて別個の２以上のバイトコードの実行の直後に実行され得る全てのポイント（多重エントリポイントと呼ぶ）がリストアップされる。一般に、そのような先行する２以上の別個のバイトコードの少なくとも一つは、ジャンプ／分岐バイトコードである。指定されたプログラムの処理時、ベリファイヤは、各多重エントリポイントの直前（即ち、先行するバイトコード命令の一つの後）の仮想オペランドスタックの“スナップショット”をとり、このスナップショットを、同じ多重エントリポイントに対する他の先行するバイトコード命令の各々を処理した後の仮想スタックステータスと比較して、仮想スタックステータスが同一でない場合はプログラムフォールト（program fault）を生成する。
【００１１】
ベリファイヤによるプログラムの前処理が終わり、プログラムの欠陥が見つけられなかった場合、インタープリタは、オペランドスタックのオーバフローやアンダーフローのチェック、オペランドスタック内に格納されるデータのデータタイプのチェックを行うことなく、プログラムを実行する。その結果、プログラム実効速度が大幅に向上される。
【００１２】
【発明の実施の形態】
本発明の好適実施例について詳細に説明する。これらの例は添付の図面に図示されている。本発明を好適実施例に基づいて説明するが、理解されるように、それらは本発明をそれらの実施例に限定することを意図するものではない。本発明は、特許請求の範囲によって画定される本発明の精神及び範囲に含まれるべき変形変更及び等価物を含むものである。
【００１３】
図２に示す分散型コンピュータシステム２００を参照されたい。第１コンピュータノード２０２は、例えばインターネットのようなコンピュータコミュニケーションネットワーク２２０を介して第２コンピュータノード２０４とつながっている。第１コンピュータノード２０２は、中央演算装置（ＣＰＵ）２０６、ユーザインタフェース２０８、主メモリ（ＲＡＭ）２１０、補助記憶装置（ディスク記憶装置）２１２、及び第１コンピュータノード２０２をコンピュータコミュニケーションネットワーク２２０につなげるためのモデムその他のコミュニケーションインタフェース２１４を含んでいる。ディスク記憶装置２１２は、データファイルその他の情報と共に、ＣＰＵ２０６によって実行されるプログラムを格納する。それらのプログラムの少なくとも一つは、実行可能形式のバイトコードプログラム２２１である。説明のため、第１コンピュータノード２０２が、第２コンピュータノード２０４からコンピュータコミュニケーションネットワーク２２０を介して、当業者には周知の転送プロトコルを用いて、バイトコードプログラム２２１を受け取ることとする。
【００１４】
好適実施例では、バイトコードプログラムはＯＡＫアプリケーションとして書かれており、コンパイルまたはインタープリットされて、一連の実行可能な命令になる。ＯＡＫ命令セットの全ソースコードバイトコード命令（source code bytecode instructions）のリストを表１に示す。ＯＡＫ命令セットは、データタイプに依存する（即ちデータタイプが特定されている）バイトコード命令によって特徴付けられる。詳述すると、ＯＡＫ命令セットでは、異なるデータタイプに対する同じ基本操作に別個の操作コード（opcode）を付すことによって、それらを区別している。その結果、同じ基本機能（例えば２つの数字の加算）を実行するために、それぞれ対応する特定のデータタイプのデータだけを処理する複数のバイトコードが命令セット内に含まれている。更に、ＯＡＫ命令セットに含まれていない命令についても注意されたい。例えば、ＯＡＫ言語命令セットには“計算されたｇｏｔｏ（computed goto）”命令はなく、オブジェクトリファレンスを変更したり、新たなオブジェクトリファレンスを生成する命令もない（既存のオブジェクトリファレンスのコピー命令は除く）。ＯＡＫ命令セットに関するこれらの２つの制約は、他の制約とともに、ＯＡＫ命令セットに含まれるデータタイプが特定された命令と同じようにデータを用いるバイトコードプログラムであれば、ユーザのコンピュータシステムの保全性を損なうことはないということを保証するのに役立っている。
【００１５】
好適実施例では、使用可能なデータタイプは、整数、倍長整数（long integer）、ショートインテジャ（１６ビット信号の整数）、単精度浮動小数点数、倍精度浮動小数点数、バイト、キャラクタ、及びオブジェクトポインタ（本明細書中では、オブジェクトリファレンスと呼ぶこともある）がある。各“オブジェクトリファレンス”データタイプはデータタイプの一部としてオブジェクトクラス仕様（object class specification）を含むことができるため、“オブジェクトリファレンス”データタイプに含まれるデータのサブタイプの数には実質的に制限がない。更に、プログラム内で用いられる定数もデータタイプを有しており、好適実施例で使用される定数のデータタイプには、上述したデータタイプに加えて、class、fieldref、methodref、string、及びAscizが含まれる。それらは全て特定の目的を持った２バイト以上の定数データを表す。
【００１６】
データタイプに依存しないバイトコードの中には、スタック操作機能を有するものがいくつかある。スタック操作機能には（Ａ）スタック上の１または複数のワードを複製して、それらをスタック内の特定の位置に配置し、それによってデータタイプが既知のより多くのスタックアイテム（stack item）を生成する機能、（Ｂ）１または複数のアイテムをスタックから消去する機能などが含まれる。他の少数のデータタイプに依存しないバイトコードには、スタック上のワードを全く用いずスタックを変化させなかったり、あるいは、スタック上にあるワードを使用することはないがスタックにワードを加えたりするものがある。これらのバイトコードは、それらが実効される前のスタックの内容についてデータタイプに関する制約はなく、多少の例外を除いて、全てスタックの内容を変化させ、プログラムベリフィケーションプロセスに影響を与える。
【００１７】
第２コンピュータノード２０４（ここでは、ファイルや他の情報のサーバとして構成されているものとする）は、ＣＰＵ２１８、ユーザインタフェース２２８、主メモリ（ＲＡＭ）２２２、補助記憶装置（ディスク記憶装置）２２４、及びコンピュータコミュニケーションネットワーク２２０と第２コンピュータノードとを接続するためのモデムその他のコミュニケーションインタフェース２３４を含んでいる。ディスク記憶装置２２４は、ＣＰＵ２１８によって実行されたり、及び／または他のコンピュータノードに配布されたりするプログラムを格納する。
【００１８】
第１コンピュータノード２０２及び第２コンピュータノード２０４は、それぞれが異なるコンピュータプラットフォーム及びオペレーティングシステム２３６、２３７を用い、これらの２つのコンピュータノードの一方で実行されるオブジェクトコードプログラムが、他方のコンピュータでは実行できないことがあってもよい。例えば、サーバノード２０４をＵｎｉｘオペレーティングシステムを用いたサン・マイクロシステムズ社のコンピュータとし、ユーザワークステーションノード２０２を８０４８６マイクロプロセッサとマイクロソフト社のＤＯＳオペレーティングシステムを用いたＩＢＭ互換機とすることもできる。更に、同じネットワークに接続され、同じサーバ２０４を利用する他のユーザワークステーションに於いて、様々なコンピュータプラットフォーム及びオペレーティングシステムを用いてもよい。
【００１９】
これまで、様々なタイプのコンピュータを有するネットワークでソフトウェアを配布するためのサーバ２０４は、各コンピュータプラットフォーム（例えば、Ｕｎｉｘ、ウィンドウズ、ＤＯＳ、マッキントッシュなど）に対して個別のソフトウェアライブラリを有していた。その結果、同じコンピュータプログラムの様々なバージョンが、各ライブラリに格納されることがあった。しかしながら、本発明を用いると、一種類のバイトコードバージョンのプログラムを用いることにより、サーバによって多くのプログラムを配布することができる。
【００２０】
図２に示されているように、第１コンピュータノード２０２の補助記憶装置２１２は、指定されたバイトコードプログラムの保全性をベリファイするためのバイトコードベリファイヤプログラム２４０と、指定されたバイトコードプログラムを実行するためのバイトコードインタープリタ２４２を格納している。別の方法として、または追加して、第１コンピュータノード２０２は、ベリファイされたバイトコードプログラムをオブジェクトコードプログラムに変換して、インタープリタ２４４よりバイトコードプログラム２２１をより効率よく実行するためのバイトコードコンパイラ２４４を格納していてもよい。
【００２１】
バイトコードベリファイヤ２４０は、バイトコードインタープリタ２４２の制御の下でＣＰＵ２０６によって指定されたバイトコード（ソース）プログラム２２１が実行される前に、バイトコードプログラム２２１のオペランドデータタイプコンパチビリティや、スタック操作の適正さをベリファイする実行可能プログラムである。各バイトコードプログラム１０３は、対応するベリフィケーションステータス２４５を有しており、この値はプログラムが他の場所からダウンロードされたとき、最初“偽（False）”にセットされる。プログラムに対するベリフィケーションステータス２４５は、プログラムがベリファイされ、ベリファイヤ２４０によって行われるデータタイプテスト及びスタックの使用に関するテストの全てに適合したときのみバイトコードベリファイヤ２４０によって“真（True）”にセットされる。
【００２２】
インタープリタによる通常のプログラムの実行に於いては、インタープリタは、オーバフロー（即ち、スタックが格納できるより多くのデータがスタックに加えられる）やアンダーフロー（即ち、スタックが空の時にスタックからデータをポップ（pop）しようとする）が生じていないかどうか、オペランドスタックを連続的にモニタする必要がある。そのようなスタックモニタリングは、通常、スタックのステータスを変化させる全ての命令（即ち、ほとんど全ての命令）に対して実行しなければならない。多くのプログラムで、インタープリタによって実行されるスタックモニタリング命令は、インタープリットされるコンピュータプログラムの実行時間の約８０％に達する。
【００２３】
更に、ダウンロードされたバイトコードプログラムがエラーを含んでいることもある。そのようなエラーには、オペランドのデータタイプと、それらのオペランドを用いる命令のデータタイプに関する制約とのミスマッチも含まれ、それによってプログラムが実行中にフェイル（fail）が発生することがある。より悪い場合には、バイトコードプログラムが（例えば、計算された数値をオペランドスタックにローディングし、その数値をオブジェクトハンドルとして用いることによって）オブジェクトリファレンスの生成を試み、ユーザコンピュータの保全性及び／またはセキュリティを損なうことがある。
【００２４】
本発明のバイトコードベリファイヤ２４０を用いると、バイトコードプログラムの保全性をベリファイすることが可能となり、インタープリタ２４２がプログラム実行中に通常のスタックモニタリング命令を実行しなくてもよくなり、プログラムのインタープリット速度を大幅に高めることができる。
【００２５】
バイトコードプログラムベリファイヤ
図３を参照されたい。バイトコードプログラムベリファイヤ２４０の処理について、特定のバイトコードプログラム３４０に関連して説明する。ベリファイヤ２４０は、ベリフィケーションプロセスに於いて必要とする情報を格納するため、いくつかの一時的なデータ構造（temporary data structure）を使用する。特に、ベリファイヤ２４０は、スタックカウンタ３４２、仮想スタック３４４、仮想ローカル変数アレイ３４５、及びスタックスナップショット格納構造３４６を使用する。
【００２６】
スタックカウンタ３４２は、仮想スタック操作を追跡し、その時々の仮想スタック３２０のエントリ数が反映されるように、ベリファイヤ２４０によって更新される。
【００２７】
仮想スタック３４４は、実際の実行時にバイトコードプログラム３４０によってオペランドスタック内に格納される各データに関するデータタイプ情報を格納する。好適実施例では、仮想スタック３４４は正規のスタックと同様に用いられるが、実際のデータ及び定数を記憶するのではなく、プログラムを実際に実行したときオペランドスタック内に格納される各データに対応するデータタイプを示す値を格納する点が異なる。従って、例えば、もし実際に実行したとき、スタックに３つの値：
HandleToObjectA
５
１
が格納されるとすると、対応する仮想スタックエントリは、
Ｒ
Ｉ
Ｉ
となる。ここで、仮想スタック内の“Ｒ”は、オブジェクトリファレンスを示し、仮想スタック内の各“Ｉ”は、整数を示す。更に、この例では、スタックカウンタ３４２は、仮想スタック３４４に格納されている３つの値に対応して、値３を格納する。
【００２８】
各データタイプのデータには、対応する仮想スタックマーカ値（例えば、整数（Ｉ）、倍長整数（Ｌ）、単精度浮動小数点数（Ｆ）、倍精度浮動小数点数（Ｄ）、バイト（Ｂ）、ショート（Ｓ）、オブジェクトリファレンス（Ｒ））が割り当てられる。オブジェクトリファレンスに対するマーカ値には、しばしばオブジェクトクラス値が含まれる（例えば、Ｒ：ｐｏｉｎｔ、ここで“ｐｏｉｎｔ”はオブジェクトクラスである）。
【００２９】
仮想ローカル変数アレイ３４５は、仮想スタック３４４と同じ基本機能を果たす。即ち、仮想ローカル変数アレイ３４５は、指定されたバイトコードプログラムが使用するローカル変数に対するデータタイプ情報を格納するのに用いられる。データは、しばしばプログラムによってローカル変数とオペランドスタックとの間で転送されるため、そのようなデータ転送を実行するか、あるいはそのようなデータ転送はしないがローカル変数を使用するようなバイトコード命令についてチェックすることにより、各バイトコード命令によってアクセスされるローカル変数が、これらのバイトコード命令に関するデータタイプの制約に適合するということを保証することができる。
【００３０】
指定されたバイトコードプログラムの処理に於いて、処理のためにバイトコード命令によってポップされる各データに対し、ベリファイヤは仮想スタック３４２から同じ数のデータタイプ値をポップし、それらのデータタイプ値をバイトコードのデータタイプ要求と比較する。また、バイトコード命令によってスタックにプッシュ（push）される各データに対して、ベリファイヤは、対応するデータタイプ値を仮想スタックにプッシュする。
【００３１】
本発明によるプログラムベリフィケーションの一側面によると、オペランドスタックステータス（operand stack status）に於けるオペランドの数とデータタイプが、ある特定の命令が実行されるとき常に同一となるかという点についてベリフィケーションがなされる。ある特定のバイトコード命令が２以上の異なる命令の直後に処理され得る場合、これらの異なる先行命令の各々を処理した直後の仮想スタックステータスを比較する必要がある。通常、これらの異なる先行命令の内の少なくとも一つは、条件付きまたは無条件ジャンプまたは分岐命令である。上述したような“スタックの一致（stack consistency）”を要求する結果として、各プログラムループ（program loop）によって、オペランドスタック内に格納されるオペランド数の正味の増加や減少が起こるようなことはなくなる。
【００３２】
スタックスナップショット格納構造３４６は、スタックカウンタ３４２及び仮想スタック３４４の“スナップショット”を格納するのに用いられ、プログラムの様々な点に於ける仮想スタックステータスを効果的に比較することを可能としている。格納されるスタックスナップショットの各々は、例えば：  ＳＣ、ＤＴ１、ＤＴ２、ＤＴ３、．．．、ＤＴｎのような形であり、ここでＳＣはスタックカウンタの値、ＤＴ１は仮想オペランドスタック内の最初のデータタイプ値、ＤＴ２は仮想オペランドスタック内の２番目のデータタイプ値であり、ＤＴｎまで同様である。ＤＴｎは仮想オペランドスタック内の、全アイテム中最後のアイテムに対するデータタイプ値である。
【００３３】
スタックスナップショット格納構造３４６は、ディレクトリ部３４８とスナップショット部３５０の２つに分かれる。ディレクトリ部３４８はターゲット命令識別子（例えば、各ターゲット命令の絶対または相対アドレス）を格納するのに用いられ、スナップショット部３５０は、これらのターゲット命令識別子（target instruction identifier）に関連する仮想スタック３４４のスナップショットを格納するのに用いられる。“ターゲット”命令は、ジャンプまたは分岐命令の行き先となり得るバイトコード命令として定義される。例えば、条件付き分岐命令は、条件（満たされることも満たされないこともある）と、条件が成立したとき、処理が“ジャンプ”すべきプログラム内の場所（ターゲット）を示す分岐先支持部とを含む。条件付きジャンプ命令を評価する際、ベリファイヤ３００は、スタックスナップショット格納構造３４６を用いて、ジャンプする直前の、ターゲット命令識別子をディレクトリ部３４８内に格納するとともに、仮想スタック３４４のステータスをスナップショット部３５０内に格納する。スタックスナップショット格納構造３４６の動作については、バイトコードベリファイヤプログラムの動作と共に、後により詳細に説明する。
【００３４】
上述したように、バイトコードプログラム３５０は、データタイプに依存する複数の命令を含んでおり、それらの命令の各々は、本発明のベリファイヤ３００によって評価される。バイトコードプログラム３５０は、スタック操作に関する命令３５２（スタックへの整数のプッシュ）及び３５４（スタックからの整数のポップ）、前方ジャンプ３５６とその関連するターゲット３６４、後方ジャンプ３６６とその関連するターゲット３６２、及びＤＯループ３５８とその終わり（end）３６０（ＤＯループのタイプによって、条件付きまたは無条件分岐命令であってもよい）を含んでいる。本発明の好適実施例のベリファイヤ２４０は、スタック操作及びデータタイプコンパチビリティをベリファイするだけなので、このバイトコードベリファイヤの動作は、これらの代表的な命令セットを用いることによって説明することができる。
【００３５】
図４乃至図１０、及び付録１を参照して、バイトコードベリファイヤプログラム２４０の動作について以下に詳細に説明する。付録１は、ベリファイヤプログラムを疑似コードで表したものである。付録１の疑似コードは、本質的には、従来の汎用コンピュータ言語を用いたコンピュータ言語と同等である。この疑似コードは、本発明の説明のためにのみ作られたものであって、本分野の通常の知識を有するコンピュータプログラマであれば容易に理解されるように意図して書かれている。
【００３６】
図４に示されているように、ダウンロードされたバイトコードプログラムは、処理のためバイトコードベリファイヤ３００にロードされる（４００）。ベリファイヤ３００は、オペランド及びローカル変数のデータタイプ情報を格納するため、メモリ内にアレイ状に位置を指定することによって、仮想スタック３４４及び仮想ローカル変数アレイ３４５を生成する（４０２）。同様に、ベリファイヤは、スナップショット情報を格納するため、メモリ内にアレイ上に位置を指定することによってスタックスナップショット格納構造を生成する（４０４）。最後に、ベリファイヤは、仮想スタックのエントリ数を追跡するためのスタックカウンタ３４２として働くレジスタを指定する（４０６）。
【００３７】
第１パスは、条件付き及び無条件ジャンプ及びループ命令に関連するターゲット情報を抽出するべく、バイトコードプログラム内に形成されたものである。第１パスに於いて、ベリファイヤ３００は全ての命令を順次処理していき（ステップ４０８、４１０、４１２）、命令が条件付きまたは無条件ジャンプ命令の場合（ステップ４１４）、かつそのジャンプに対するターゲット位置がまだディレクトリ３４８内に記憶されていない場合（ステップ４１８）、ターゲット位置を示す情報をスタックスナップショット格納構造３４６のディレクトリ部３４８に格納する（ステップ４１６）。例えば、ターゲット命令の絶対または相対アドレスを、ディレクトリ部３４８の次に使用可能なスロットに格納しても良い。他のタイプのバイトコード命令は、この第１パスでは無視される。
【００３８】
プログラム内の全ての命令に対し処理が終了した後、ディレクトリ部３４８をソートして、リストアップされたターゲット位置をアドレス順に並び替えることが好ましい。
【００３９】
再度図３を参照されたい。図３では、説明のため、スタックスナップショット格納構造３４６は、既にベリフィケーションの第１パスがバイトコードプログラム３５０内に示されているバイトコード命令に基づいて終了したように、ディレクトリ部３４８内に情報が格納され、ロードされている。即ち、ディレクトリ部には、バイトコードプログラム内にある条件付き及び無条件ジャンプ命令の全てのターゲットのアドレスがロードされている。
【００４０】
図５では、バイトコードプログラムによるオペランドスタック及びデータタイプの使用が適切かどうかをベリファイするため、バイトコードプログラムの第２のパスが開始される。バイトコードプログラムの最初の命令が選択されると（４３０）、ベリファイヤは、選択された命令に対するアドレスが、上述した第１パスに於いて既にスタックスナップショット格納構造３４６のディレクトリ部３４８内に格納されているかどうかチェックする（４３２）。
【００４１】
選択された命令のアドレスがディレクトリ３４８内にある場合（即ち、選択された命令が条件付きまたは無条件ジャンプのターゲットであることを意味している）、ベリファイヤは関連するスタックスナップショットがスタックスナップショット格納構造３４６のスナップショット部３５０内に格納されているかどうかをチェックする（４３４）。スタックスナップショットが格納されていない場合（即ち、命令が後方ジャンプのターゲットであることを意味する）、スタックカウンタ及び仮想スタックの内容が、スタックスナップショット格納構造３４６内に格納される（４３６）。スナップショットは、処理中の命令を実行する直前の仮想スタックのステータスに関する情報を含み、それにはスタックにプッシュされている各データに対するデータタイプ値も含まれる。
【００４２】
スタックスナップショットが、選択されている命令に対し格納されている場合（このターゲット命令に関連するジャンプ命令が既に処理されているということを意味する）、ベリファイヤは、スタックスナップショット格納構造３４６のスナップショット部３５０内に格納されている、この命令に対する仮想スタックスナップショット情報と、仮想スタックのそのときの状態とを比較する（４３８）。比較の結果、仮想スタックの状態とスナップショットとがマッチしないことが示された場合（スタックステータスミスマッチ）、スタックステータスミスマッチが発生したバイトコードプログラム内の場所を示すエラーメッセージまたは信号が生成される（４４０）。好適実施例では、仮想スタックとスナップショットが同数または同タイプのエントリを含んでいない場合にミスマッチが発生する。ベリファイヤは、その後、そのプログラムが“偽（False）”であることを示すようにベリフィケーションステータス２４５をセットし、ベリフィケーションプロセスをアボートする（４４２）。プログラムが“偽”であることを示すようにベリフィケーションステータス２４５をセットすることにより、バイトコードインタープリタ２４２によるプログラムの実行が阻止される（図３）。
【００４３】
選択されている命令に対し既に格納されているスタックスナップショットと、その時の仮想スタックの状態とがマッチする場合（４３８）、ベリファイヤはベリフィケーションプロセスを続け、後に述べるようにステップ４５０から個々の命令に対して分析を開始する。
【００４４】
選択されている命令のアドレスがスタックスナップショット格納構造３４６のディレクトリ部３４８内に見つからない場合、またはスタックステータスミスマッチが検出されない場合、ベリファイヤは、その命令特有のスタック使用法及び機能に応じて、命令に対する一連のチェックのうち、いくつかを選択して実行する。
【００４５】
図６を参照されたい。最初に行われるチェックは、オペランドスタックからデータをポップさせる命令に関する。選択されている命令によってデータがスタックからポップされる場合（４５０）、スタックカウンタが調べられ、命令のデータポップ要求を満足する十分なデータがスタック内にあるかどうかが判定される（４５２）。
【００４６】
オペランドスタックがその命令に対し十分なデータを持っていない場合（４５２）、これはスタックアンダーフローと呼ばれ、スタックアンダーフローが検出されたプログラム内の場所を示すエラー信号またはメッセージが生成される（４５４）。更にベリファイヤはプログラムが“偽”であることを示すようにベリフィケーションステータス２４５をセットし、ベリフィケーションプロセスをアボートする（４５６）。
【００４７】
スタックアンダーフロー状態が検出されない場合、ベリファイヤは、予め仮想スタック内に格納されているデータタイプコード情報と、（もしあれば）選択されている命令のデータタイプ要求とを比較する。例えば、分析されるている命令の操作コード（opcode）がスタックからポップされた値の整数型の加算（integer add）を要求する場合、ベリファイヤは、ポップされている仮想スタックのアイテムのオペランド情報を比較して、それが適切なデータタイプであること、即ち整数であることを確認する。比較がマッチする結果となった場合、ベリファイヤは、ポップされているエントリに関連する情報を仮想スタックから削除し、仮想スタック３４４からポップされたエントリ数が反映されるようにスタックカウンタ３４２を更新する。
【００４８】
仮想スタック３４４のポップされているエントリのオペランド情報と、選択されている命令のデータタイプ要求との間でミスマッチが検出された場合（４５８）は、ミスマッチがバイトコードプログラム内のどこで発生したかを示すメッセージが生成される（４６２）。更に、ベリファイヤは、プログラムが“偽”であることを示すようにベリフィケーションステータス２４５をセットし、ベリフィケーションプロセスをアボートする（４５６）。これで、ポップベリフィケーションプロセスが終了する。
【００４９】
次に、図７を参照されたい。選択されている命令がデータをスタックにプッシュしようとする場合（４７０）、スタックカウンタが調べられ、その命令がプッシュしようとするデータを格納するための十分な余地がスタックにあるかどうかが判定される（４７２）。オペランドスタックに、その命令がプッシュしようとするデータを格納するための十分な余地がない場合（４７２）、これはスタックオーバフローと呼ばれ、スタックオーバフローが検出されたプログラム内の場所を示すエラー信号またはメッセージが生成される（４７４）。更に、ベリファイヤは、プログラムが“偽”であることを示すようにベリフィケーションステータス２４５をセットし、ベリフィケーションプロセスをアボートする（４７６）。
【００５０】
スタックオーバフロー状態が検出されない場合、ベリファイヤは、選択されている命令によってスタックにプッシュされる各データに対し、（実際にプログラムが実行される際に）オペランドスタックにプッシュされるデータ（オペランド）のタイプを示すエントリを仮想スタックに加える（４７８）。この情報は、本発明の好適実施例のバイトコードプログラムで用いられている、データタイプが特定された操作コードから導かれる。また、ベリファイヤは、スタックカウンタ３４２を更新して、仮想スタックに追加された１または複数のエントリが反映されるようにする。これでスタックプッシュベリフィケーションプロセスが終了する。
【００５１】
図８を参照されたい。選択されている命令により、通常の逐次的ステップを飛び越すような、条件付きまたは無条件の前方ジャンプまたは分岐が発生する場合（４８０）、ベリファイヤは、まずそのジャンプ命令のターゲット位置に対するスナップショットがスタックスナップショット格納構造３４６内に格納されているかどうかをチェックする。スタックスナップショットが格納されていない場合、（そのジャンプに関連する仮想スタックの更新がなされた後の）仮想スタック状態が、スタックスナップショット格納構造３４６内の、そのターゲットプログラム位置に関連する位置に格納される（４８４）。このジャンプに関連するスタックポップ操作は、既に実行されているステップ４６０に於いて仮想スタック内に反映されていることに注意されたい（図６参照）。
【００５２】
スタックスナップショットが格納されている場合（このターゲットに関連する他のエントリポイント（entry point）が既に処理されていることを示す）、ベリファイヤは、スタックスナップショット格納構造３４６のスナップショット部３４０内に格納されている仮想スタックスナップショット情報と、仮想スタックのその時の状態とを比較する。比較の結果、スナップショットと仮想スタックの状態とがマッチしていないことが示された場合（スタックステータスミスマッチ）、スタックステータスミスマッチが発生したバイトコードプログラム内の場所を示すエラーメッセージが生成される（４８８）。好適実施例では、スナップショットとその時の仮想スタックが、同数または同タイプのエントリを含んでいないときミスマッチが発生する。更に、その時の仮想スタック内の１以上のデータタイプ値が、スナップショット内の対応するデータタイプ値に一致しないときにもミスマッチが発生する。ベリファイヤは、その後プログラムが“偽”であることを示すようにベリフィケーションステータス２４５をセットし、ベリフィケーションプロセスをアボートする（４９０）。ステップ４８６でスタックステータスマッチングが検出された場合、ベリファイヤはステップ５００へと処理を継続する（図９）。
【００５３】
図９を参照されたい。選択されている命令によってプログラムの後方に向かう条件付きまたは無条件ジャンプまたは分岐が発生する場合（ステップ５００）、ベリファイヤは、スタックスナップショット格納構造３４６のスナップショット部３４０内に格納されている、その後方ジャンプのターゲットに関連する仮想スタックスナップショット情報（ステップ４３６で格納した）と、仮想スタックのその時の状態とを比較する。比較の結果、スナップショットとその時のステータスがマッチしないことが示された場合（スタックステータスミスマッチ）、スタックステータスミスマッチが発生したバイトコードプログラム内の場所を示すエラーメッセージが生成される（５０４）。好適実施例では、ミスマッチは、その時の仮想スタックとスナップショットが同数または同タイプのエントリを含んでいないか、あるいは仮想スタック内のデータタイプエントリのどれかが、スナップショット内の対応するデータタイプエントリとマッチしない場合に発生する。ベリファイヤは、その後プログラムが“偽”であることを示すようにベリフィケーションステータス２４５をセットし、ベリフィケーションプロセスをアボートする（５０６）。
【００５４】
スタックステータスがマッチしていることが検出されるか（ステップ５０２）、または命令が後方ジャンプでない場合（ステップ５００）、ベリファイヤはステップ５１０へと処理を継続する。
【００５５】
選択されている命令が、ローカル変数からデータを読み出す場合（５１０）、ベリファイヤは対応する仮想ローカル変数内に予め格納されているデータタイプコード情報と、（もしあれば）選択されている命令のデータタイプ要求とを比較する。仮想ローカル変数に格納されているデータタイプ情報と選択されている命令のデータタイプ要求との間にミスマッチが検出された場合（５１２）、ミスマッチが発生したバイトコードプログラム内の場所を示すメッセージが生成される（５１４）。その後、ベリファイヤはプログラムが“偽”であることを示すようにベリフィケーションステータス２４５をセットし、ベリフィケーションプロセスをアボートする（５１６）。
【００５６】
その時選択されている命令がローカル変数からデータを読み出さない場合（５１０）、またはステップ５１２に於けるデータタイプの比較がマッチする結果となった場合、ベリファイヤは、選択されている命令の処理を更にステップ５２０へと継続する。
【００５７】
図１０を参照されたい。選択されている命令によってデータがローカル変数に格納される場合（５２０）、対応する仮想ローカル変数が調べられ、その仮想ローカル変数がデータタイプ値を格納しているかどうかが判定される（５２２）。その仮想ローカル変数がデータタイプ値を格納している場合（即ちそのデータは以前にそのローカル変数内に格納されたことを意味する）、ベリファイヤは、その仮想ローカル変数内にあるデータタイプ情報と、選択されているバイトコード命令に関するデータタイプとを比較する（５２４）。仮想ローカル変数内に格納されているデータタイプ情報と、選択されている命令によって要求されているデータタイプとの間にミスマッチが検出されると（５２４）、ミスマッチが発生したバイトコードプログラム内の場所を示すメッセージが生成される（５２６）。その後、ベリファイヤはプログラムが“偽”であることを示すようにベリフィケーションステータス２４５をセットし、ベリフィケーションプロセスをアボートする（５２８）。
【００５８】
選択されている命令が、ローカル変数にデータを格納しない場合（５２０）、選択されている命令に対する処理は終了する。選択されている命令によってデータがローカル変数内に格納されるが、その仮想ローカル変数がデータタイプ値を格納していない場合（即ち、そのローカル変数にデータを格納するような命令がベリファイヤによってまだ処理されていないことを示す）、選択されているバイトコード命令に関連するデータタイプが、その仮想ローカル変数に格納される（ステップ５３０）。
【００５９】
続いて、ベリファイヤは、その命令が処理中のバイトコードプログラム３４０の最後の命令であるかどうかをチェックする（５４０）。処理すべき命令がまだ残っている場合、ベリファイヤは次の命令をロードし（５４２）、ベリフィケーションプロセスをステップ４３２から繰り返す。それ以上処理する命令がない場合は、ベリファイヤはプログラムが“真”であることを示すようにベリフィケーションステータス２４５をセットし（５４４）、ベリフィケーションプロセスの終了を伝える。
【００６０】
バイトコードインタープリタ
図１１のフローチャート及び付録２を参照しつつ、バイトコードインタープリタ２４２の動作について説明する。付録２は、バイトコードインタープリタを疑似コードで表したものである。
【００６１】
指定されたバイトコードプログラムが与えられた場合、即ち、実行すべきプログラムとして選択された後（５６０）、バイトコードプログラムインタープリタ２４２は、指定されたバイトコードプログラムの保全性をベリファイするべく、バイトコードベリファイヤ２４０を呼び出す（５６２）。バイトコードベリファイヤについては既に上述した。
【００６２】
ベリファイヤが“ベリフィケーション失敗（verification failure）”をリターンしてきた場合（５６４）、指定されたバイトコードプログラムのインタープリタによって実行されることなくアボートされる（５６６）。
【００６３】
ベリファイヤ２４２が“ベリフィケーション成功”をリターンしてきた場合（５６４）、指定されたバイトコードプログラムはリソースユーティリティプログラムにリンクされ（５６８）、更に、そのプログラムによって参照される他のプログラム、関数、及びオブジェクトにもリンクされる。そのようなリンク過程は多くのプログラムインタープリタに於ける従来の前処理（pre-execution）過程と同様である。その後リンクされたバイトコードプログラムはインタープリタによってインタープリットされ実行される（５７０）。本発明のバイトコードインタープリタは、プログラムの実行中、オペランドスタックオーバフロー及びアンダーフローのチェックをしない。また、オペランドスタック内に格納されているデータに対するデータタイプのチェックもしない。このような従来インタープリット過程で行われていたスタックオーバフロー／アンダーフロー、及びデータタイプのチェックは、本発明では省略することができる。これは、ベリファイヤによって、このようなエラーがプログラム実行中に発生しないことが既にベリファイされているためである。
【００６４】
本発明のプログラムインタープリタは、何度も繰り返し実行される命令ループ（instruction loop）を有するバイトコードプログラムの実行に対し、特に効果的である。なぜなら、本発明では、そのような各命令ループ内の各バイトコードに対して、オペランドスタックチェック命令は一度だけしか行われないからである。対照的に、従来のインタープリタによるプログラムの実行に於いては、インタープリタは、オーバフロー（即ち、スタックが格納できるより多くのデータがスタックに加えられる）やアンダーフロー（即ち、スタックが空の時にスタックからデータをポップしようとする）が生じていないかどうか、オペランドスタックを連続的にモニタする必要がある。そのようなスタックモニタリングは、通常、スタックのステータスを変化させる全ての命令（即ち、ほとんど全ての命令）に対して実行しなければならない。多くのプログラムで、インタープリタによって実行されるスタックモニタリング命令は、インタープリットされるコンピュータプログラムの実行時間の約８０％に達する。その結果、本発明のインタープリタは、しばしば、同じコンピュータ上で実行される従来のプログラムインタープリタの２倍から５倍の速さでプログラムを実行する。
【００６５】
本発明の特定の実施例について行った上述の説明は、例示を目的としたものであり、本発明を網羅的に記載することを意図したものでも、本発明を開示した形態そのものに限定することを意図したものでもなく、上述したことから多くの変形変更が可能であることは明らかであろう。上記の実施例は、本発明の原理とその実際的な応用が最も良く説明されるように選択及び記述したものであり、それによって当業者が本発明を最も良く利用して、特定の使用に合うように様々な改良を加えた変形実施態様が可能なようにしたものである。本発明の範囲は、特許請求の範囲によって画定される。
【００６６】
【実施例】
0003868527.tif 000002
0003868527.tif 000003
0003868527.tif 000004
0003868527.tif 000005
0003868527.tif 000006
0003868527.tif 000007
【００６７】
0003868527.tif 000008
0003868527.tif 000009
0003868527.tif 000010
0003868527.tif 000011
0003868527.tif 000012
0003868527.tif 000013
【００６８】
0003868527.tif 000014
【図面の簡単な説明】
【図１】図１は、ネットワークを介して接続された２つのコンピュータを示している。
【図２】図２は、ネットワークを介して接続された２つのコンピュータを示しており、それらのコンピュータのうち少なくとも一つは、本発明によるバイトコードプログラムベリファイヤを含んでいる。
【図３】図３は、本発明によるバイトコードプログラムのベリフィケーションに於いてバイトコードベリファイヤによって維持されるデータ構造を示している。
【図４】図４は、本発明の好適実施例に於けるバイトコードプログラムベリフィケーションプロセスのフローチャートの一部である。
【図５】図５は、本発明の好適実施例に於けるバイトコードプログラムベリフィケーションプロセスのフローチャートの一部である。
【図６】図６は、本発明の好適実施例に於けるバイトコードプログラムベリフィケーションプロセスのフローチャートの一部である。
【図７】図７は、本発明の好適実施例に於けるバイトコードプログラムベリフィケーションプロセスのフローチャートの一部である。
【図８】図８は、本発明の好適実施例に於けるバイトコードプログラムベリフィケーションプロセスのフローチャートの一部である。
【図９】図９は、本発明の好適実施例に於けるバイトコードプログラムベリフィケーションプロセスのフローチャートの一部である。
【図１０】図１０は、本発明の好適実施例に於けるバイトコードプログラムベリフィケーションプロセスのフローチャートの一部である。
【図１１】図１１は、本発明の好適実施例に於けるバイトコードプログラムインタープリットプロセスのフローチャートである。
【符号の説明】
１００  分散型コンピュータシステム
１０２  第１コンピュータ
１０３  コンピュータプログラム
１０４  第２コンピュータ
１０６  ＣＰＵ
１０８  ユーザインタフェース
１１０  主メモリ（ＲＡＭ）
１１２  補助記憶装置
１１３  オペレーティングシステム
１１４  コミニュケーションインタフェース（モデム）
１２０  コンピュータネットワーク
２００  分散型コンピュータシステム
２０２  第１コンピュータノード（ユーザワークステーションノード）
２０４  第２コンピュータノード（サーバノード）
２０６  ＣＰＵ
２０８  ユーザインタフェース
２１０  主メモリ（ＲＡＭ）
２１２  補助記憶装置（ディスク記憶装置）
２１４  コミュニケーションインタフェース（モデム）
２１８  ＣＰＵ
２２０  コンピュータコミュニケーションネットワーク
２２１  バイトコードプログラム
２２２  主メモリ（ＲＡＭ）
２２４  補助記憶装置（ディスク記憶装置）
２２８  ユーザインタフェース
２３４  コミュニケーションインタフェース（モデム）
２３６  オペレーティングシステム
２３７  オペレーティングシステム
２４０  バイトコードプログラムベリファイヤ
２４２  バイトコードプログラムインタープリタ
２４４  バイトコードプログラムコンパイラ
２４５  ベリフィケーションステータス
３４０  バイトコードプログラム
３４２  スタックカウンタ
３４４  仮想スタック
３４５  仮想ローカル変数アレイ
３４６  スタックスナップショット格納構造
３４８  ディレクトリ部
３５０  スナップショット部
３５２  バイトコード命令
３５４  バイトコード命令
３５６  バイトコード命令
３５８  バイトコード命令
３６０  バイトコード命令
３６２  バイトコード命令
３６４  バイトコード命令
３６６  バイトコード命令
３６８  バイトコード命令
【図１】
0003868527.tif 000015
【図２】
0003868527.tif 000016
【図３】
0003868527.tif 000017
【図４】
0003868527.tif 000018
【図５】
0003868527.tif 000019
【図６】
0003868527.tif 000020
【図７】
0003868527.tif 000021
【図８】
0003868527.tif 000022
【図９】
0003868527.tif 000023
【図１０】
0003868527.tif 000024
【図１１】
0003868527.tif 000025