【誤訳訂正書】
【提出日】平成20年6月6日(2008.6.6)
【誤訳訂正１】
【訂正対象書類名】明細書
【訂正対象項目名】全文
【訂正方法】変更
【訂正の内容】
【書類名】      明細書
【発明の名称】  複合データ構造の永続的表現の生成
【特許請求の範囲】
【請求項１】  処理ユニット、オペレーティング・システムと少なくとも１つのプログラム・モジュールとを記憶するコンピュータ読取り可能媒体、入力装置、前記処理ユニットと前記コンピュータ読取り可能媒体及び前記入力装置とを接続するシステムバスを備え、複合データ・オブジェクトを再現するために予め定められた仮想計算機のインタプリタによって直接実行可能な前記複合データ・オブジェクトの構造表現を表すプログラムを生成するためのシステムにおいて、前記少なくとも１つのプログラム・モジュールが、
複合データ・オブジェクトを創るための１セットのメソッドを有するライブラリであって、該メソッドが実行する関数の各々の可読形式の名称を含む前記メソッドに関係する可読情報を含むように増補された、ライブラリと、
前記入力装置によりコンテンツの操作が行われる時、前記ライブラリから一続きのメソッドを呼び出すことにより、前記複合データ・オブジェクトを作成するとともに、前記一続きのメソッド呼び出しに各々関連した一続きのコード・フラグメントを発生し、前記各コード・フラグメントに、
前記ライブラリからの前記メソッドに関係する可読情報から得た、呼び出されたメソッドに関連する関数の名称と、
前記関数の引数が定数の場合におけるその定数と、
前記関数の引数が別のコード・フラグメントへの参照である場合におけるその前記別のフラグメントへの参照と、
を含めるオーサリング・ツールと、
前記一続きのコード・フラグメントを一続きの命令に翻訳して、前記予め定められた仮想計算機のインタプリタによって実行可能な命令セットで、前記プログラムを形成するプログラム・ジェネレータと、
を備え、
前記プログラム・ジェネレータは、２回の走査を行い、
１）１回目の走査において、前記各コード・フラグメントが、前記一続きのコード・フラグメント内の別のコード・フラグメントにより引数として使用される場合、その回数を表す参照カウントを生成して、該各コード・フラグメントに含め、
２）２回目の走査において、
ａ）もし前記関数に引数が存在する場合には、前記関数の各引数について、
ａ１）前記引数が定数の場合、該定数をスタックにプッシュする命令を生成し、
ａ２）前記引数が前記別のコード・フラグメントへの参照である場合、前記別のフラグメントについて、上記ａ１と当該ａ２を含む引数処理を再帰的に実行し、
ｂ）前記関数のすべての引数についての前記引数処理が完了したとき、前記関数の名称を有する関数を呼び出す命令を生成し、
ｃ）前記参照カウントが２以上の場合、
ｃ１）前記各コード・フラグメントに対し、該各コードフラグメントを表す一時変数が生成されていない場合には、前記各コード・フラグメントを表す一時変数を生成し、前記各コード・フラグメント内の前記関数による結果を前記一時変数にコピーする命令を生成し、
ｃ２）前記各コード・フラグメントを表す前記一時変数が既に生成されている場合には、前記一時変数をスタックにプッシュする命令を生成すること、
を特徴とするシステム。
【請求項２】  オーサリング・ツールを用いてデザイナが作成したマルチ・コンポーネント・データ構造の構造表現を表すプログラムを生成するための、コンピュータにより実行される方法であって、前記プログラムは、マルチ・コンポーネント・データ構造を再現するために予め定められた仮想計算機のインタプリタによって直接実行可能であり、前記コンピュータが、処理ユニット、オペレーティング・システムと少なくとも１つのプログラム・モジュールとを記憶するコンピュータ読取り可能媒体、入力装置、前記処理ユニットと前記コンピュータ読取り可能媒体及び前記入力装置とを接続するシステムバスを備え、前記方法が、
前記入力装置によりコンテンツの操作が行われる時に、前記マルチ・コンポーネント・データ構造の作成のために前記オーサリング・ツールによって行われる一続きのメソッド呼び出しを記録するステップと、
前記一続きのメソッド呼び出しに各々関連した一続きのコード・フラグメントを発生するステップと、
前記一続きのコード・フラグメントを一続きの命令に翻訳して、前記予め定められた仮想計算機のインタプリタによって実行可能な命令セットで、前記プログラムを形成するステップと、
前記マルチ・コンポーネント・データ構造の前記構造表現として前記プログラムを格納するステップと、
を含み、
Ａ．前記一続きのコード・フラグメントを発生するステップは、前記各コード・フラグメントに、
Ａ１）呼び出されたメソッドに関連する関数の名称と、
Ａ２）前記関数の引数が定数の場合におけるその定数と、
Ａ３）前記関数の引数が別のコード・フラグメントへの参照である場合におけるその前記別のフラグメントへの参照と、
を含め、
Ｂ．前記一続きのコード・フラグメントを一続きの命令に翻訳して前記プログラムを形成するステップは、２回の走査を行い、
Ｂ１）１回目の走査において、前記各コード・フラグメントが、前記一続きコード・フラグメント内の別のコード・フラグメントにより引数として使用される場合、その回数を表す参照カウントを生成して、該各コード・フラグメントに含め、
Ｂ２）２回目の走査において、
ａ）もし前記関数に引数が存在する場合には、前記関数の各引数について、
ａ１）前記引数が定数の場合、該定数をスタックにプッシュする命令を生成し、
ａ２）前記引数が前記別のコード・フラグメントへの参照である場合、前記別のフラグメントについて、上記ａ１と当該ａ２の引数処理を再帰的に実行し、
ｂ）前記関数のすべての引数についての引数処理が完了したとき、前記関数の名称を有する関数を呼び出す命令を生成し、
ｃ）前記参照カウントが２以上の場合、
ｃ１）前記各コード・フラグメントに対し、該各コード・フラグメントを表す一時変数が生成されていない場合には、前記各コード・フラグメントを表す一時変数を生成し、前記各コード・フラグメント内の前記関数による結果を前記一時変数にコピーする命令を生成し、
ｃ２）前記各コード・フラグメントを表す前記一時変数が既に生成されている場合には、前記一時変数をスタックにプッシュする命令を生成すること、
を特徴とする方法。
【請求項３】  複合データ・オブジェクトの構造表現を表すプログラムを生成するための、コンピュータで実行される方法であって、前記プログラムは、前記複合データ・オブジェクトを再現するために予め定められた仮想計算機のインタプリタによって直接実行可能であり、前記コンピュータが、処理ユニット、オペレーティング・システムと少なくとも１つのプログラム・モジュールとを記憶するコンピュータ読取り可能媒体、入力装置、前記処理ユニットと前記コンピュータ読取り可能媒体及び前記入力装置とを接続するシステムバスを備え、前記方法が、
前記入力装置によりコンテンツの操作が行われる時に、前記複合データ・オブジェクトの構造を構成するために、ライブラリから一続きのメソッドを呼び出すステップと、
前記一続きのメソッド呼び出しを記録するステップと、
前記一続きのメソッド呼び出しに各々関連した一続きのコード・フラグメントを発生するステップと、
前記一続きのコード・フラグメントを一続きの命令に翻訳して、前記予め定められた仮想計算機のインタプリタによって実行可能な命令セットで、前記プログラムを形成するステップと、
前記複合データ構造の前記構造表現として前記プログラムを格納するステップと、
を含み、
Ａ．前記一続きのコード・フラグメントを発生するステップは、前記各コード・フラグメントに、
Ａ１）呼び出されたメソッドに関連する関数の名称と、
Ａ２）前記関数の引数が定数の場合におけるその定数と、
Ａ３）前記関数の引数が別のコード・フラグメントへの参照である場合におけるその前記別のフラグメントへの参照と、
を含め、
Ｂ．前記一続きのコード・フラグメントを一続きの命令に翻訳して前記プログラムを形成するステップは、２回の走査を行い、
Ｂ１）１回目の走査において、該各コード・フラグメントが、前記一続きコード・フラグメント内の別のコード・フラグメントにより引数として使用される場合、その回数を表す参照カウントを生成して、該各コード・フラグメントに含め、
Ｂ２）２回目の走査において、
ａ）もし前記関数に引数が存在する場合には、前記関数の各引数について、
ａ１）前記引数が定数の場合、該定数をスタックにプッシュする命令を生成し、
ａ２）前記引数が前記別のコード・フラグメントへの参照である場合、前記別のフラグメントについて、上記ａ１と当該ａ２を含む引数処理を再帰的に実行し、
ｂ）前記関数のすべての引数についての前記引数処理が完了したとき、前記関数の名称を有する関数を呼び出す命令を生成し、
ｃ）前記参照カウントが２以上の場合、
ｃ１）前記各コード・フラグメントに対し、該各コード・フラグメントを表す一時変数が生成されていない場合には、前記各コード・フラグメントを表す一時変数を生成し、前記各コード・フラグメント内の前記関数による結果を前記一時変数にコピーする命令を生成し、
ｃ２）前記各コード・フラグメントを表す前記一時変数が既に生成されている場合には、前記一時変数をスタックにプッシュする命令を生成すること、
を特徴とする方法。
【請求項４】  マルチ・コンポーネント・データ構造の構造表現を表すプログラムを生成する方法を実行するための、コンピュータによって実行可能な命令とデータを含む記憶媒体であって、前記プログラムは、マルチ・コンポーネント・データ構造を再現するために予め定められた仮想計算機のインタプリタによって直接実行可能であり、前記コンピュータが、処理ユニット、オペレーティング・システムと少なくとも１つのプログラム・モジュールとを記憶するコンピュータ読取り可能媒体、入力装置、前記処理ユニットと前記コンピュータ読取り可能媒体及び前記入力装置とを接続するシステムバスを備え、前記方法が、
前記入力装置によりコンテンツの操作が行われる時に、前記マルチ・コンポーネント・データ構造の作成のためにオーサリング・ツールによって行われる一続きのメソッド呼び出しを記録するステップと、
前記一続きのメソッド呼び出しに各々関連した一続きのコード・フラグメントを発生するステップと、
前記一続きのコード・フラグメントを一続きの命令に翻訳して、前記予め定められた仮想計算機のインタプリタによって実行可能な命令セットで、前記プログラムを形成するステップと、
前記マルチ・コンポーネント・データ構造の前記構造表現として前記プログラムを格納するステップと、
を含み、
Ａ．前記一続きのコード・フラグメントを発生するステップは、前記各コード・フラグメントに、
Ａ１）呼び出されたメソッドに関連する関数の名称と、
Ａ２）前記関数の引数が定数の場合におけるその定数と、
Ａ３）前記関数の引数が別のコード・フラグメントへの参照である場合におけるその前記別のフラグメントへの参照と、
を含め、
Ｂ．前記一続きのコード・フラグメントを一続きの命令に翻訳して前記プログラムを形成するステップは、２回の走査を行い、
Ｂ１）１回目の走査において、前記各コード・フラグメントが、前記一続きコード・フラグメント内の別のコード・フラグメントにより引数として使用される場合、その回数を表す参照カウントを生成して、該各コード・フラグメントに含め、
Ｂ２）２回目の走査において、
ａ）もし前記関数に引数が存在する場合には、前記関数の各引数について、
ａ１）前記引数が定数の場合、該定数をスタックにプッシュする命令を生成し、
ａ２）前記引数が前記別のコード・フラグメントへの参照である場合、前記別のフラグメントについて、上記ａ１と当該ａ２を含む引数処理を再帰的に実行し、
ｂ）前記関数のすべての引数についての前記引数処理が完了したとき、前記関数の名称を有する関数を呼び出す命令を生成し、
ｃ）前記参照カウントが２以上の場合、
ｃ１）前記各コード・フラグメントに対し、該各コード・フラグメントを表す一時変数が生成されていない場合には、前記各コード・フラグメントを表す一時変数を生成し、前記各コード・フラグメント内の前記関数による結果を前記一時変数にコピーする命令を生成し、
ｃ２）前記各コード・フラグメントを表す前記一時変数が既に生成されている場合には、前記一時変数をスタックにプッシュする命令を生成すること、
を特徴とする記憶媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、電子データの処理に関し、具体的には、マルチメディア・プレゼンテーションと他のアプリケーション用の、マルチコンポーネント・データ・オブジェクトの構造についての永続的表現を構成することに関係する。
【０００２】
【従来の技術】
コンピュータ・アプリケーションの最も急速に成長している領域の１つに、複合マルチメディア情報のプレゼンテーションがある。テレビや映画のようなマルチメディアを配送する従来の伝達手段は、内部構造を持っていない単一で固定した情報の流れとして、そのコンテンツを提示する。すなわち、このプレゼンテーションは構造的には単一のオブジェクトであり、単一ファイルの情報であって、分離可能な部分を持っていない不可分のデータ単位である。最近、コンピュータの仲介によるデータのプレゼンテーションが、個々の部分に分割されるようになっており、例えば画像の動画シーケンスや個々のサンプルされたサウンドを組み合わせることによってつくられた音楽のようなものがある。今日では、多くの様々な種類のマルチメディア・プレゼンテーションは、実際には、要素であるデータ・オブジェクトからなる複合構造体であって、それら要素データ・オブジェクトは、コンテンツ・オブジェクトの相互関係についてのある１つの表現にしたがって、再生中リアルタイムで合成される。すなわち、１つのプレゼンテーションの個々の部分の構造は、もはやコンテンツそれ自体にハードワイヤ的に組み込まれるものではなく、別個のエンティティを形成し、そしてこの別個のエンティティは、プレゼンテーションを再現するために、そのコンテンツと一緒に伝送及び／又は格納されなければならない。
【０００３】
従来のマルチメディア・プレゼンテーションの内部形式が拡大することによってその内部形式が再生時に再現される明示的構造を備えた複数のデータ要素を含むようになると同時に、「プレゼンテーション」という用語によって包含されるものの範囲も、以前に比べてずっと広範なものとなりつつある。したがって、本発明の目的のためには、この用語は、その可能な最も広い意味で理解されなければならない。プレゼンテーションには、あらゆる種類のデータの実演、表示、実現が含まれる。映画は１つのプレゼンテーションであり、ワールド・ワイド・ウェブ・ページは１つのプレゼンテーションであり、コンピュータ・データベースに対する照会の結果も１つのプレゼンテーションと考えることができる。プレゼンテーションの他の形式には、マイクロソフト・パワー・ポイントのようなプログラムでつくられたスライド・ショーや、デスクトップにおける文書中の動画による図及びメニュー・バーのようなユーザー・インターフェースが含まれる。
【０００４】
従来のオーサリング・プログラムは、構造化されたプレゼンテーションをコンポーネント・オブジェクトから構築するものであり、それらコンポーネント・オブジェクトにはそれらを操作する標準的メソッドが含まれる。このようなメソッドには、アニメーション・ルーチン、再生ルーチンなどが含まれる。これらのメソッドは、アプリケーション・プログラム・インターフェース（ＡＰＩ）の呼び出しという形をとることできる。ＡＰＩとは、定義済みのデータタイプと個々に呼び出し可能な関数とを定義するライブラリである。それらの関数は、引数を持っていてもいなくてもよく、また結果を返しても返さなくてもよい。これらの関数は、パーソナル・コンピュータや他のデジタル・プロセッサ内のダイナミック・リンク・ライブラリ（.dll）に保存されることが多い。
【０００５】
個々のコンポーネントから１つのプレゼンテーションを構築するには、どのようにそれらコンポーネントが相互に関係するか、また再生中プレゼンテーションを再現するときどのようにこれら個々のコンポーネントが機能するかを指定するメカニズムが必要となる。１つのプレゼンテーションのこの実行時構造は、格納メカニズムであって、これをプレゼンテーションの実行中プログラムが使用してメモリ内で情報を表す。実行時構造は、一般に、その特定の構造に対し個々に設計されたＡＰＩを通して宣言型として作成される。ＡＰＩを用いて実行時構造を作成するプログラムは、関数を呼び出してデータ・オブジェクトを作成する。これらのオブジェクトは次に、データ構造が完全に定義されるまで、他の関数呼び出しなどへの引数になる。
【０００６】
プレゼンテーションを作成するこのプログラムを閉じると、その構造を表す情報のいくらかがディスク・ファイルに書き込まれる。プレゼンテーションの再現を可能にする元となる実行時構造の長期的なフォーマットは、「永続的な（persistent）」表現と呼ばれる。閲覧、編集あるいはその他の用途のために後でプレゼンテーションを再現するプログラムは、その実行時構造についてのある種の永続的表現を必要とする。
【０００７】
実行時データ構造の永続的表現に対する従来のアプローチには、その構造についてあるスタイルにした記述を書き出すことが含まれる。例えば、プレゼンテーションのデータ構造が、各オブジェクトが１以上の子を持つある階層構造のオブジェクトに似ている場合、そのファイル・フォーマットは、一般に、このファイルに含まれる情報として各オブジェクトを記述し、これに続いてそのオブジェクトの各々の子への参照が続く。
【０００８】
上記アプローチに関し、プレゼンテーションを再現するためのプログラム中へ永続的表現が読み込まれるとき、重大な問題が生じる。その永続的表現をマッピングによってそのデータ構造を構築する一続きのＡＰＩ呼び出しに変えることは、複雑なタスクとなることが多い。すなわち、このタイプの永続的表現は、実際のデータ構造自身を適切に記述するものではあるが、この構造をどのように構築するかについて記述するというジョブの実行については貧弱である。従来の表現は、時間のかかる構文解析と翻訳とを必要とする。この問題はデータ構造の複雑さの増加とともに急速に増大している。そして現代のプレゼンテーションはますます複雑なものとなる傾向がある。
【０００９】
したがって、マルチメディア及びこれと類似のマルチ・コンポーネントのプレゼンテーションの構造を表す改善されたシステムに対する要望、並びに、高速で、コンピュータ・メモリとリソースが少なくて済む、永続的表現を生成し利用する方法に対する要望が存在する。
【００１０】
【発明が解決しようとする課題】
本発明は、複合データ・プレゼンテーションの構造または他のオブジェクトの構造を指定するための新しい形式の永続的表現へと、オーサー（作者）の入力を変換する便宜を提供するものである。オーサリング・ツールは、プレゼンテーションを構築するのに使用する定義されたメソッドとデータタイプとからなるライブラリから、一続きのメソッド呼び出しとデータとをコード・フラグメントのリストとして記録する。そのため、オーサーはその構造表現を作成するための明示的アクションを行う必要がなくなる。同時に、本発明を収容するために従来のオーサリング・ツールとメソッドライブラリとを修正する必要はほとんどない。プログラム・ジェネレータは、それらフラグメントを、そのプレゼンテーションの再生を可能にするようにユーザー・コンピューター内のインタプリタで実行可能な命令セットでプログラムに変換する。すなわち、本発明は、データ構造を再現することができるプログラムを自動的に生成し、そしてそのプログラムはそれ故に、それらの構造の永続的表現として作用する。データ構造をダイナミックなプログラムとして表すこの処理は、単純で直接的なものであり、その構造についての別個の明示的な記述の生成を必要としない。
【００１１】
【課題を解決するための手段】
この基本的な発明の効率は、いくつかの追加的特徴によって高まる。例えば、一時変数を生成するためのツーパス処理によって、永続的表現を形成するプログラム内の冗長符号を回避できる。関数の結果値を示す辞書によって、プログラム内の他の命令への参照が単純化される。プログラムの全体的効果を変えない命令をリオーダ（reorder）することにより、さらに効率的な符号化が可能となる。
【００１２】
【発明の実施の形態】
以下の実施例の詳細な記述において、本明細書の一部を形成する添付図面の参照を行う。この図面には、本発明を実施することができる具体的な実施例が例示として示されている。これらの実施例は十分詳細に記述されており、この記述によって当業者による本発明の実施が可能になる。本発明の精神と範囲から逸脱することなく、他の実施例の利用も可能であり、また構造的および論理的な変更を行うことも可能であると理解すべきである。したがって、以下の詳細な記述は限定する意味で考えられるべきものではなく、よって本発明の範囲は添付の請求項によってのみ画定されるものである。
【００１３】
図１は、本発明を実施することができる好適な計算環境についての簡単な全体的説明を提供するものである。本明細書では以後、パーソナル・コンピュータ（ＰＣ）によって実行される命令を含むコンピュータで実行可能なプログラム・モジュールという一般的文脈で本発明についての説明を行う。プログラム・モジュールにはルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれ、これらによって特定のタスクが行われたりあるいは特定の抽象的なデータタイプが実行される。当業者ならば理解できるように、携帯型デバイス、マルチプロセッサ・システム、マイクロプロセッサベースのプログラムが可能な消費者用電子装置、ネットワークＰＣ、ミニコンピュータ、メインフレーム・コンピュータ及び同種のものを含む他のコンピュータ・システム構成を用いて本発明の実施が可能である。また本発明は、通信網を介してリンクされた遠隔処理装置によってタスクを行う分散型コンピュータ環境においても実施可能である。分散型コンピュータ環境では、ローカルな記憶装置と遠隔の記憶装置の双方にプログラム・モジュールを配置することもできる。
【００１４】
図１では、処理ユニット２１、システム・メモリ２２および、該システム・メモリと他のシステム構成要素を処理ユニット２１と接続するシステム・バス２３を含む、従来型のパーソナル・コンピュータ２０の形の汎用計算機が用いられている。システム・バス２３は、メモリ・バスやメモリ制御装置、周辺バス、およびローカルバスを含むタイプのものであればいずれのタイプであってもよい。また任意の様々なバス構造を用いることも可能である。システム・メモリ２２には、リード・オンリー・メモリ（ＲＯＭ）２４とランダム・アクセス・メモリ（ＲＡＭ）２５とが含まれる。ＲＯＭ２４内に格納されている基本入出力システム（ＢＩＯＳ）２４には、パーソナル・コンピュータ２０の構成要素間で情報の転送を行う基本ルーチンが含まれる。またＢＩＯＳ２４には、システム用起動ルーチンも含まれる。さらにパーソナル・コンピュータ２０には、ハードディスク（図示せず）からの読み出しとそれへの書き込みを行うためのハードディスク装置２７と、リムーバブル磁気ディスク２９からの読み出しとそれへの書き込みを行うための磁気ディスク装置２８、およびＣＤ−ＲＯＭやその他の光学媒体のようなリムーバブル光ディスク３１からの読み出しとそれへの書き込みを行うための光ディスク装置３０も含まれる。ハードディスク装置２７、磁気ディスク装置２８、光ディスク装置３０は、ハードディスク装置用インターフェース３２、磁気ディスク装置用インターフェース３３および光ディスク装置用インターフェース３４によってそれぞれシステム・バス２３と接続している。これらのディスク駆動装置およびそれと関連するコンピュータ読取り可能媒体によって、パーソナル・コンピュータ２０用のコンピュータ読取り可能命令、データ構造、プログラム・モジュール及びその他のデータの不揮発性格納が行われる。本明細書に記載の例示的環境では、ハードディスク、リムーバブル磁気ディスク２９およびリムーバブル光ディスク３１が用いられているが、当業者ならば理解できるように、コンピュータによってアクセス可能なデータの格納が可能な他のタイプのコンピュータ読取り可能媒体をこの例示的動作環境において使用することも可能である。そのような媒体には、磁気カセット、フラッシュ・メモリ・カード、デジタル多用途ディスク、ベルヌーイ・カートリッジ、ＲＡＭ、ＲＯＭおよび同種の媒体が含まれる。
【００１５】
プログラム・モジュールは、ハードディスク、磁気ディスク２９、光ディスク３１、ＲＯＭ２４およびＲＡＭ２５に保存してもよい。プログラム・モジュールには、オペレーティング・システム３５、１以上のアプリケーション・プログラム３６、その他のプログラム・モジュール３７およびプログラム・データ３８が含まれる。ユーザーは、キーボード４０やポインティング・デバイス４２のような入力装置を介してパーソナル・コンピュータ２０にコマンドと情報の入力を行うことができる。その他の入力装置（図示せず）には、マイク、ジョイ・スティック、ゲーム用パッド、衛星テレビ受信用アンテナ、スキャナあるいは同種の入力装置が含まれる。上記およびその他の入力装置は、システム・バス２３と接続したシリアルポート・インターフェース４６を介して処理ユニット２１と接続されることが多いが、パラレルポート、ゲーム用ポート、ユニバーサル・シリアル・バス（ＵＳＢ）のような図１に図示されていない他のインターフェースを介して接続することもできる。また、モニター４７あるいは他の表示装置は、ビデオ・アダプタ４８のようなインターフェースを介してシステム・バス２３と接続する。モニターに加えて、パーソナル・コンピュータには、一般にスピーカやプリンタのような他の周辺出力装置（図示せず）が含まれる。
【００１６】
パーソナル・コンピュータ２０は、遠隔コンピュータ４９のような１以上の遠隔コンピュータとの論理接続を利用するネットワーク環境で動作することもできる。遠隔コンピュータ４９は、別のパーソナル・コンピュータ、サーバー、ルータ、ネットワークＰＣ、ピア装置あるいはその他の一般的なネットワーク・ノードであってもよい。遠隔コンピュータ４９には、パーソナル・コンピュータ２０と接続する多くのあるいはすべての上述の構成要素が一般に含まれるが、図１には記憶装置５０しか例示されていない。図１に描かれている論理接続にはローカル・エリア・ネットワーク（ＬＡＮ）５１と広域ネットワーク（ＷＡＮ）５２が含まれる。このようなネットワーク環境は、オフィスや企業間コンピュータ・ネットワーク、イントラネットおよびインターネットではありふれたものである。
【００１７】
ＬＡＮネットワーク環境に設置される場合、ＰＣ２０はネットワーク・インターフェースすなわちアダプタ５３を介してローカルネットワーク５１と接続する。インターネットのようなＷＡＮネットワーク環境で使用する場合、ＰＣ２０にはモデム５４またはネットワーク５２を介して通信を確立するための他の手段が一般に含まれる。モデム５４はＰＣ２０の内部または外部のいずれにあってもよく、シリアル・ポート・インターフェース４６を介してシステム・バス２３と接続する。ネットワーク環境では、２０またはその一部に常駐するものとして描かれているプログラム・モジュールは遠隔記憶装置５０に保存してもよい。言うまでもなく、図示のネットワーク接続は例示的なものであり、コンピュータ間の通信リンクを確立する他の手段を代用することも可能である。
【００１８】
図２は、本発明による永続的表現を生成しインタプリトするためのシステム２００全体を示すものである。
【００１９】
オーサーは、従来のオーサリング・ツール２１０を用いて、画像、音、テキストおよびその他のコンテンツを操作することによりマルチメディア・プレゼンテーションのようなデータ・オブジェクトを作成する。例えば、画像を動画化し、音の流れをそのアニメーションと同期させ、テキストの挿入を行うことが可能となる。デザイナがオンスクリーン制御を行ってこれらのフィーチャを実行するとき、オーサリング・ツールは、アプリケーション・プログラム・インターフェース（ＡＰＩ）に対する関数またはメソッドの呼び出しを行う。ＡＰＩは、関数の定義済セットを実行するプログラム・コードを含むライブラリであり、この定義済セットの関数は非常に頻繁に使用されるので、これらの関数を含む単一のモジュールを書き込むことにより、他の任意のプログラムが単純なメカニズムを用いて呼び出し使用できるようになっているものである。ＡＰＩは、１セットのデータタイプと、これらのデータタイプに対して作用する１セットのメソッドまたは関数とを定義するダイナミック・リンク・ライブラリ（.dll）ファイルの形を一般にとる。しかし、本発明では、上記のデータタイプやメソッドまたは関数を何らかの特定の方法で格納することを必要とせず、あるいは概念的にグループ化することを除いてそれらを一緒にグループ化することさえ必要としない。すなわち、「ライブラリ」という用語は、上記メソッドが定義済セットまたは定義済みグループを形成することを単に意味するにすぎない。データタイプには、整数、ストリング、ブーリアンのような基本的なタイプが含まれる。またこれらのデータタイプには、JavaとＣ＋＋においてクラスと呼ばれ、また、Ｃ言語で構造体（struct）と呼ばれる基本的なタイプを集めたオブジェクトが含まれる。関数は、このセットのデータタイプから任意の数の引数(ゼロを含む)をとり、そしてゼロまたは１つの結果を返す。例えば、Javaでは、Void function1 (type1 a, type2 b)は、タイプ１とタイプ２の２つの引数ａとｂをそれぞれとり、そして結果を返すことはない。Type1 function2 ()は、引数をとらないがタイプ１を持つ結果データを返す。この文脈では、プレゼンテーションＡＰＩ（ＰＡＰＩ）には、引数で指定される量による画像オブジェクトのスケーリングと回転、一連の画像の動画化、音オブジェクトの音量の所定の量での変化、のような演算を実行するための多数の個別の関数とデータが含まれる。例えば、ファイルから画像を読み出し、その画像を回転するように設定するためには、以下のセットのＡＰＩ呼び出しを行うことができる。
ImageBvr image=importImage ("image.gif").transform(rotateRate (0.1))
音を読み込み、その音量を調節し、時間の経過と共に左から右へその音をパンさせるための１セットのＡＰＩの一例は次のようになる。
SoundBvr sound=importSound("sound.wav").gain(0.75).pan(sin(localTime))
【００２０】
本発明は、従来のＡＰＩに情報を追加して増補ＡＰＩ２１１を形成する。この追加情報には、各関数が結果を返すか否かにかかわらず各関数の可読形式の名称、そして引数が存在する場合にはその引数の数が含まれる。この情報は、公的に利用可能なコンポーネント・オブジェクト・モデル（ＣＯＭ）に基づくＡＰＩ用のタイプ・ライブラリを介し、Java言語で書かれたＡＰＩに対する反映によって容易に作成することができる。この情報には、関数が副作用を持つか否か、その関数が明示的な結果を生成することによる以外にシステムに対して影響を与えるかどうか、を示す優先フラグのような他の情報を含ませることもできる。結果を返さない関数のほとんどには副作用がある。オーサリング・ツール２１０には、必要な場合に修正を行うことによって、各々の呼出しをコード・フラグメントとして記録し、そのコード・フラグメントは、呼び出された各々のメソッドと、そのメソッドに対する引数と、オーサリング・ツールがその特定の呼出しを行った順序とを表す。ファイル２１２には、以下に一層詳しく説明するコード・フラグメントの一続き全体が含まれる。
【００２１】
プログラム・ジェネレータ２２０は、ファイル２１２からのそれらコード・フラグメントを変更しアセンブルし翻訳して、デザイナが作成したプレゼンテーションの構造についての永続的表現を具現化する圧縮ファイルでプログラム２２１を形成する。すなわち、プレゼンテーションの実際の構造を明示的に指定する代わりに、プログラム２２１は、この構造を再現するための一続きの命令を含むプログラムとしてその構造を表す。このプログラムは、実際のプロセッサ用命令セットで書かれてはいず（書くことは可能ではあるが）、この用途のために特に構成された仮想計算機(ＶＭ)によって実行可能な命令を含むものである。
【００２２】
プログラムは、ＡＰＩ関数に対する一続きの呼び出しを記述する。引数は、一定値か、他の関数から得られる結果かのいずれかである。結果値は一時変数２２３に格納することができるため、複数の関数で引数として使用可能となる。例えば、ある１つの簡単なJavaプログラムは、例えば次のようになる。
int a=3; 
int b=function1(a); 
int c=function2(b, 4); 
function3 (c, function1(c));
【００２３】
プログラム・ジェネレータ２２０は、この呼び出しシーケンスの機能的に等価な記述をその指定された出力言語で書き出さなければならない。例えば、ターゲット言語がJavaである場合、出力は例えば以下のようになる。
Int x=Function2(function1(3), 4); 
function3 (x, function1(x));
【００２４】
ターゲットが一般化されたスタックベースの仮想計算機である場合、プログラム・ジェネレータは、例えば、以下の命令を有する等価のプログラムを出力する。
Push 4 
Push 3 
Call Function1 
Call Function2 
Store stack top to Temp0 
Call Function1 
Push Temp0 to stack 
Call Function3
このシーケンスは、ある関数がその引数をスタックからポップ・オフし、そしてその結果をスタックの一番上へプッシュすることを前提としている。
【００２５】
ブロック２３０は、多くの形式のうちの任意の形式で、プレゼンテーションの再生のための伝送及び／又は記憶を表す。システム・コンポーネント２１０〜２２３がパーソナル・コンピュータ２０（図１）に配置されている場合、プログラム２２１とコンテンツ２２２は、装置５０における格納のため、ネットワーク５１または５２を介して４９のようなサーバーへアップロードすることができる。このプレゼンテーションは、ワールド・ワイド・ウェブ・ページまたはデータの他のコレクションの中に組み入れることができる。そのようにした後、同じパーソナル・コンピュータ２０または別のパーソナル・コンピュータ２０のユーザーは、プログラム２２１とプレゼンテーションのコンテンツをダウンロードすることができる。上記とは別の方法として、ディスク、ＣＤ−ＲＯＭなどのような携帯可能な記憶媒体でコンテンツとＶＭプログラム２２１とを分配することにより、あるいは、コンテンツとＶＭプログラム２２１をハードディスクやその他の固定媒体に格納することにより、伝送が行われる場合もある。
【００２６】
ブロック２３１と２３２とは、ユーザーのコンピュータで受信及び／又は格納されたプログラム２２１とコンテンツ２２２のコピーを表している。このコンピュータ内のプログラム・インタプリタ２４０は、プログラム・コピー２３１を実行して、プレゼンテーション２５２を再現するため、ＡＰＩ２５１に対するその適切な呼び出しを従来型の表示プログラムに実行させる。インタプリタ２４０が、定義済み命令セットを実行する仮想計算機として実装される。インタプリタ２４０はプログラム２３１の命令を処理して、元々そのプレゼンテーションを作成するためにオーサリング・ツール２１０が生成したのと同じ引数を持ちかつそれと同じ関数を、ＡＰＩ２５１から呼び出す。しかし、ＡＰＩ２５１は、ＡＰＩ２１１の従来のバージョンである。すなわ・BR>ソ、ＡＰＩ２５１には、上述の増補情報は含まれない。このようにして、表示プログラム２５０は、プログラム２３１の永続的表現の中に符号化された構造を、プレゼンテーション・コンテンツ２３２に対し単純で直接的な方法で吹き込む。インタプリタ２４０は一般に、非常に小さなプログラムであり、これは、感知できないほどの初期遅延しか伴わずに始動させることが可能であって、ユーザーのコンピュータ内のメモリをほとんど必要とせず、またリソースも少ししか必要としない。また、言うまでもなく、プログラム２３１は構文解析も必要とせず、また、記述形式から実行可能形式への変換も必要としない。
【００２７】
図３はプログラム２２１を生成するメソッド３００を表している。オーサーがプレゼンテーションを完成させてその発表を望むとき、ブロック３１０は、プレゼンテーションのためオーサリング・ツール２１０によって行われた一続きのメソッド呼び出しを記録する。ブロック３２０は、増補ＡＰＩ２１１のメソッドに対する各呼び出しに対しステップ３２１〜３２９を実行して、その呼び出しのためのコード・フラグメントを生成する。
【００２８】
通常、３２１のようなブロックは、この時点でＡＰＩのそのメソッドを実行することになる。しかし、本実施例では、プレゼンテーションの構築の完了後に別個の処理でそれらの呼び出しを記録するので、増補ＡＰＩは単に、従来の関数を呼び出すふりをするにすぎない。この理由のため、ブロック３２１は点線の輪郭で示してある。この時点でＡＰＩの実際の機能を行わせることは、余計なメモリを消費することになる。したがって、増補ＡＰＩは、単に実際のＡＰＩの呼び出しの結果をシミュレートするものにすぎず、ここでは呼び出しシーケンスを記録するためだけに使用されている。ブロック３２２は、このメソッドのための増補情報をＡＰＩから読み出す。この情報の中には、このメソッドが実行した関数の名称と、この関数の呼び出しに使用した引数のリストとが含まれる。この情報の中には、この関数が副作用を持つかどうかを示す優先フラグも含まれる。状況によっては、この特性は、フラグを用いて明示する代わりに推測を行うことができる。例えば、結果を返さないほとんどどの関数にも副作用がある。またこれとは別の方法として、下記の適当なブロックにおける関数テーブルによって、副作用を持つ関数の名称を特定することもできる。増補情報の中には、他の補助データを含めることもできる。
【００２９】
ブロック３２３は、現コード・フラグメントを表すキーを生成する。このキーは連続番号や任意の他の一意的記号であってもよい。ブロック３２４は、この現在の呼び出しからの関数の名称をそのコード・フラグメントに書き込み、またその優先フラグの記録も行う。後続するメソッド呼び出しは、これらのメソッド中へ渡される各引数のソースを特定することができなければならない。したがって、現在の関数が明示的な結果を生み出す関数であるとブロック３２５が判定した場合、ブロック３２６は、現コード・フラグメントのそのキーに対し参照を付ける。このキーは、辞書２１３（図２）の中に入れることができ、その辞書２１３はデータ値によって配列されたそのようなオブジェクトについてのものである。上記とは別の方法としては、その結果データ・オブジェクト自体に、上記キーを含めることもできる。
【００３０】
上記関数が引数を持たない場合、ブロック３２７は、次のメソッド呼び出しを行うためにブロック３２０へ直ちに戻る。別の関数の結果である任意の引数に対して、ブロック３２８は、その引数をキーとして用いてコード・フラグメントの辞書を探索することにより、その結果を生み出したコード・フラグメントへの参照を、引数リストの中へ挿入する。現フラグメントに挿入されたこの特定参照は、上記の適切なフラグメントのキー番号である。上記辞書中にフラグメントが見つからなかった場合、上記データ値は定数であるとみなす。定数である任意の引数に対して、ブロック３２９は、そのコード・フラグメント内の引数リスト中にこの定数を書き込む。下記のテーブルＩは、上記の短いサンプル・プログラムに対するコード・フラグメントのリストを例示するものである。
テーブルＩ
【表１】
2002517817.tif 000001
すなわち、引数は、任意のタイプの定数に対する参照として、あるいはこのリスト中の他のコード・フラグメントに対する参照として格納される。「Priority（優先順位）」、「Ref Cnt（参照カウント）」および「Temp（一時変数）」とラベルをつけた欄については、後程説明する。
【００３１】
ブロック３３０は、すべてのコード・フラグメント２１２のリスト(図２)を出力する。このリストは、本プレゼンテーションで生じるすべての関数呼び出しと、これらの関数に対する引数とを記述している。ブロック３４０は、増補ＡＰＩを呼び出す過程中において引数を保持するために一時変数が作成された場合にはそれらすべての一時変数を削除する。ブロック３５０〜３５１は、可能な場合にさらに効率を高めるためそれらフラグメントのリオーダを行う。このリオーダは、前のフラグメントからの引数の利用可能性によって制限されることは言うまでもない。しかし、追加的な要因がリオーダを制限する場合もある。ブロック３５０は、ある特定のコード・フラグメントが、明示的な結果を返すこと以外に何らかの副作用、システムに対する何らかの影響を与えるかどうかの判定を行う。そのようなフラグメントをリオーダすることは、予想できない結果をもたらすことになってしまう。ブロック３５０は、ブロック３２４において各フラグメント中に書込まれた優先フラグを用いる。上記のテーブルにおいては、フラグメント０〜２はそれらのフラグがｏｆｆとなっていて、ブロック３５１でこれらフラグメントのリオーダを行うことが可能である。フラグメント３はそのフラグがｏｎになっているので、そのリオーダを行うことはできない。前述したように、このフラグあるいはさらに別のフラグを用いて、他の理由によるリオーダの制御を行うことができ、また他のアクションの制御を行うことさえも可能である。最後に、ブロック４００は、仮想計算機プログラム２２１（図２）のための命令を生成する。
【００３２】
図４は、ブロック４００のステップを詳細に示すものである。ブロック４００の具体的な形態は、その実現のために選択される言語およびその言語をインタプリトするために用いられる仮想計算機のタイプに依存する。本実施例では、スタックベースの仮想計算機を用いている。すなわち、その命令ストリームは後入先出スタック２４１（図２）であり、これらの命令は、関数を呼び出すか定数値をプッシュするかのいずれかを行う。すなわち、引数を持つ関数は、その引数をスタックの一番上からポップオフし、結果を返す関数は、その結果をスタックの一番上にプッシュする。単純な形態では、ブロック４００は、ある関数の引数をスタックにプッシュする命令を書き、次いで、その関数を呼び出す命令を書く。詳述すると、逆順の各引数に対して、その引数が、定数であるかあるいは別のコード・フラグメントへの参照であるかどうかの判定を行う。定数の引数は、この定数データを仮想計算機のスタックの上にプッシュする命令を生成する。コード・フラグメントの引数に対しては、本ルーチンは、再帰的に自身を呼び出し、その参照するフラグメントのキーを用いることによってその引数を見つけ出す。この一連のステップは、上記リストに等価のツリーを走査して、ターゲットの仮想計算機と互換性を有する順序で、各フラグメントに対する命令を生成する。しかし、この基本アプローチは、１回より多く関数引数として使用されるフラグメントに対し複数回のビジット（visit）を行うという点で非効率的である。複数回のビジットは、同じコード・フラグメントに対する重複した命令を生成する。
【００３３】
ブロック４００に対し選択されたこの方法は、２回の走査を用い、１回目のパス中に参照カウントを生成し、２回目のパス中にだけ命令を生成することにより、冗長符号を除去する。最初、ブロック４１０は、コード・フラグメント・リスト中のすべてのフラグメントの参照カウントをゼロに設定する。これら参照カウントは、任意の都合のよいロケーションに保持することができる。上記のテーブルＩでは、これらカウントが、コード・フラグメント・リスト２１２において「Ref Cnt」とラベルをつけた列に格納されていることを示している。ブロック４１１は、各コード・フラグメントについて１回目のパス（ステップ４１２−４１３）を行う。ブロック４１２はコード・フラグメントの各引数を調べ、ブロック４１３は、現フラグメントにおいて引数として使用される各コード・フラグメントの参照カウントを増分する。テーブルＩの「Ref Cnt」列内の値は、本サンプル・リストを通る１回目のパスの後における各コード・フラグメントに対する参照カウントを示している。これの最大カウント数は２に制限されるが、その理由は、フラグメントが複数回使用されるかどうかをルーチン４００が検出する必要があるだけだからである。また、本当の参照カウントを保持し、そして再使用するための一時変数を、これらへのすべての参照が終了した後に解放することも可能である。
【００３４】
ブロック４２０は２回目のパスを行う。４３０として一緒にグループ化したブロックでは、仮想計算機２４０（図２）のターゲット言語で各コード・フラグメントに対する命令を生成する。ブロック４３０は図４において再帰的に呼び出されるので、ブロック４２０は、すべてのコード・フラグメントに対しコードを生成するために、それらすべてのコード・フラグメントで反復される必要はない。したがって、ブロック４２０は、優先フラグが設定されているフラグメントを処理するだけでよい。これらのフラグメントは、他のフラグメントが使用する可能性のある値を返さないフラグメントであり、副作用を持つフラグメントである。テーブルＩに示した例では、ブロック４２０は、フラグメント３のみでループすることになる。残りのフラグメントは、フラグメント３のパラメータについての再帰によって生成される。このアプローチは、ブロック３５１（図３）に従ってそれらフラグメントを黙示的にリオーダするというさらなる効果を有する。
【００３５】
ブロック４４０は、この現在のコード・フラグメント内の各引数について反復される。ブロック４４１が現在の引数が定数であることを検知した場合、ブロック４４２がその定数をスタックにプッシュする命令を生成する。引数が関数（すなわち、別のフラグメントに対する参照）である場合、ブロック４３０を再帰的に実行して、その参照されるフラグメントに対する命令、この参照されるフラグメントが参照するかもしれない任意のフラグメント等々に対する命令を生成する。
【００３６】
現フラグメントのすべての引数が処理されたとき、ブロック４５０は、その命令ストリームに対し、現フラグメントにおいて名称が挙げられた関数を呼び出す命令を追加する。テーブルＩでは、その名称は、「Function Name（関数名）」列におけるエントリであり、究極的には増補ＡＰＩ２１１（図２）内の名称から得られていた名称である。オブジェクト指向型プログラム言語で書かれたメソッドは、そのメソッドが呼び出されている対象のオブジェクトをプッシュすることも通常必要とする。なぜなら、スタックベースの仮想計算機は、どのオブジェクトに対しその関数を呼び出すかを知っていなければならず、したがって、スタックの一番上にこのオブジェクトを見つけることを予期しているからである。例えば、image. transform（引数）への呼び出しには、スタック上への変形すべき引数を評価するコードを生成し、次いで、スタック上への画像オブジェクトを評価するコードを生成し、そして最後にその関数を呼び出す命令を出力することが関係する。スタック上に上記オブジェクトを置くことには、他の関数呼び出しを用いて行ってもよい。オブジェクトに関して静的メソッドは定義されていないので、スタック上へとオブジェクトをプッシュする必要はない。技術的には、メソッドを呼び出す対象となるオブジェクトもまた、そのメソッドの引数である。しかし、別様に明示的に述べていない限り、本明細書における「引数（argument）」という用語には、そのようなオブジェクトは含まれない。JavaとＣ＋＋では、一般に、この余分な引数を黙示的な「この」オブジェクトと呼ぶ。
【００３７】
現フラグメントの参照カウントが２より少ない場合、ブロック４５１はブロック４３０から出る。しかし、現フラグメントが引数として２回（またはそれ以上）使用されることを参照カウントが示す場合、ブロック４５２はそのフラグメントを表す一時変数を生成する。ブロック４５３は、ブロック４５０で行われた関数呼び出しを表すところの出力スタックのトップ・エントリを、その新たな一時変数にコピーする命令を生成する。実施上の細目として、テーブルＩには、もう１つの列「Temp（一時変数）」があり、その値は、一時変数がフラグメントに対し割り当てられていない場合に−１に設定される。フラグメントへの最初のビジットに際して、Ref Cnt＝２かつTemp＝−１である場合、Tempは、次に利用可能な一時変数をポイントするように設定される。
【００３８】
現フラグメントが、２という参照カウントを有し、かつ前のフラグメントの処理からブロック４５２によって生成された一時変数を既に有する場合、ブロック４３０が再び実行される必要はない。詳しくは、ブロック４６０は、ブロック４６１に現フラグメントと関連する一時変数を発見させ、その一時変数のコピーをスタックにプッシュする命令を生成させる。この一時変数自体は、この時点で破棄されない。この一時変数は、さらに別のコード・フラグメントによって再使用される可能性があるからである。
【００３９】
ブロック４２０がすべてのフラグメントの処理を終了したとき、仮想計算機プログラム２２１（図２）は一続きの命令を含み、この一続きの命令は、元のプレゼンテーションを再現するためインタプリタ２４０の仮想計算機によって直接実行可能なプログラムを構成する。すなわち、このプログラムは、元のプレゼンテーションの構造についての永続的表現であり、静的にではなく動的に構造を記述するものである。本メソッド４００は、スタックベース・マシーンのためのプログラムを出力するものではあるが、コード・フラグメント２１２を他のタイプのインタプリタ２４０（仮想のものであれ現実のものであれ）用のプログラム２２１に変換するメソッドを、以上の記述から簡単な方法で設計することもできる。
【００４０】
この出力プログラム内の個々の命令は、ＡＰＩ２１１またはＡＰＩ２５１内のメソッドの定義済セットに対する呼び出しに対応している。同様に、この出力プログラム内のデータ項目のタイプは、その同じＡＰＩがサポートするデータタイプからすべて引き出される。関数名とデータタイプは、それら命令でフルの名称を用いる代わりに、より簡潔に表すこともできる。
【００４１】
これらのメソッドは、１乃至２バイトの数値ＩＤを含む命令コードに割り当てられる。呼び出される頻度が高いと予想されるメソッドは、１バイトのＩＤを持つ。さらに具体的には、このセットの命令コードは、各ブロックが２５５個のコードからなるｎ個のブロックに分割される。ｎは、このセット全体を含むのに十分な大きさとなるように選択される。２５６−ｎ＋１個の最も広く使用される関数には、０から２５６−ｎ個の番号が振られた１バイト・コードが割り当てられる。残りの関数には、２バイトコードが割り当てられる。これらのコードの第１のグループは、２５５に等しい第１バイトと０〜２５５の範囲の第２バイトを持つ。２５５個のコードの第２のグループは、２５４の第１バイトを持ち、０から２５５の範囲の第２バイトを持つ、などである。
【００４２】
永続的表現を持ち得る各データタイプに関して、１つの命令コードが、そのタイプの値をスタックにプッシュさせる。例えば、「整数値をプッシュせよ」、「浮動小数点値をプッシュせよ」および「ストリング値をプッシュせよ」という命令には、数値ＩＤが割り当てられる。これらの命令に関して、これと関連するデータ項目（整数、浮動小数点数あるいはストリング）がその命令コードの直後のプログラムの２進ストリーム中に置かれる。以下にさらに十分に説明する追加命令は、図２にブロック２４２として図示したようにスタックから一時記憶域へデータをポップし、次いで、一時記憶域からスタックへデータをプッシュする。整数は、１バイト〜４バイト方式を用いて符号化される。無符号整数については、第１バイトの２つの最上位ビットは、そのコード内のバイト数より１少ない。残りの６ビットは、１〜４バイトの整数の最上位バイトである。後続のバイトは、もし存在する場合には、整数の最上位の値から最下位の値へ配列される。符号付き整数は、同じ方法で符号化されるが、例外として定数０ｘ２０、０ｘ２０００、０ｘ２０００００、０ｘ２０００００００は１〜４バイト無符号値から減じられてそれぞれ最終の符号付き値を与える。
【００４３】
図５は、スタックベースの仮想計算機プログラム・インタプリタ２４０（図２）によって実行されるメソッド５００を示す図であり、このメソッドは、プレゼンテーション・コンテンツ２３２とＡＰＩ２５１とからプレゼンテーション２５２の構造を再現するためのメソッドである。本実施例では、インタプリタ２４０は、表示プログラム２５０およびその他のモジュールを包含するより大きな実行時プログラムの一部として実装される。このインタプリタは、ＣＯＭオブジェクトとして実現され、このＣＯＭオブジェクトは、マイクロソフト・インターネット・エクスプローラ・ブラウザのようなコンテナとインターフェースするマイクロソフト・アクティブＸ・コントロールによって作成され維持される。このコントローラは、ファイル２３１に含まれた命令ストリームを読み出すための任意の数の仮想計算機のインスタンス生成を管理し、そのファイル２３１は、プレゼンテーションを再現または再生するコンピュータにローカルかつ該コンピュータからリモートに格納されている。
【００４４】
ブロック５１０は、プログラム・コピー２３１（図２）から順番に命令を読み出す。ブロック５１１は、プログラム２３１のそのデータ・ストリームから現在の命令を読み出す。ブロック５２０は、現命令が定数を表すか関数呼び出しを表すかの判定を行う。前者の場合、ブロック５２１は、このインタプリタ用として定義されたスタックにその定数をプッシュする。所望の場合、異なるデータタイプ用として複数のスタックを定義することができる。ブロック５２２は、１グループの命令を実行し、これら命令は、インタプリタ用として定義された一時データ記憶域２４２（図２）を操作する。この記憶域には、いくつかの記憶場所が含まれ、その各々は一意的キーすなわちアドレス値を有する。１つの命令は、データをスタックから一時記憶域の記憶場所へポップする。また別の命令は、ある記憶場所からスタックへデータをプッシュする。双方の命令の後には命令ストリーム内で整数が続き、この整数は一時記憶域内の特定の記憶場所のキーを指定する。
【００４５】
上記の現命令が関数呼び出しである場合、ブロック５３０は、命令コード内の数値ＩＤがどのＡＰＩ関数を指定しているかの判定を行う。次いで、ブロック５３１がその関数をＡＰＩから呼び出す。この関数が引数を持つ場合、ブロック５３２は、ブロック５３２にそれら引数をスタックから１つずつ引き出させる。この関数が結果値を返したことをブロック５３３が判定した場合、ブロック５３４はその結果をスタックにプッシュする。
【００４６】
また、ブロック５２０には、他の種類の命令を実行するためのブロック５４０への分岐も含まれている。
【００４７】
可能な関数のセットは、通常は固定されているものの、追加の関数や追加のメソッドを定義することは可能である。以上の記述は、前述したコンポーネント・オブジェクト・モデル（ＣＯＭ）を用いるオブジェクトでメソッドを実装している。このモデルは、定義済セット内にないオブジェクトに対するメソッドの呼出しを可能にする"IDispatch"メカニズムを含んでいる。例えば、invokeメソッド呼び出しは、IDispatchＣＯＭインターフェース上の名称を付されたメソッドまたは関数を、スタックの値からの引数の配列と共に呼び出すことを可能にする。IDispatch呼び出しから返される結果値をスタックにプッシュすることも可能である。
【００４８】
追加命令は、ワールド・ワイド・ウェブ・ページのようなプレゼンテーション内のどこか他のところで定義されたＣＯＭオブジェクトにアクセスする。これによって、インタプリタの命令ストリームは、通常のメカニズムを介するかIDispatchインターフェースを通じるかのいずれかによって、これらのオブジェクトに作用するメソッドを呼び出すことが可能になる。
【００４９】
別の特別な命令により、インタプリタはメソッドを定義することが可能になる。この場合のメソッドは、ある時期やあるイベントの検出時のようなときに要求によって実行可能な１セットの命令コードである。例えば、表示プログラム２５０は、ユーザーがマウス・ボタンを押したときコールバックメソッドを発して、ストリングを表示させたり、新しいオブジェクトを示すようにすることもできる。インタプリタは、この命令に出会うと、その命令コードに続く整数を命令ストリームからフェッチする。この整数は、このメソッドのための命令とデータを構成するバイトのカウントである。インタプリタは、適切な数のバイトをプログラム・ストリームから読み出してバッファ中へ入れ、そしてインタプリタの新たなインスタンスを作成する。この新たなインタプリタは、元の命令ストリームからではなく、そのバッファから命令を読み出し処理する。このメソッドへの引数の引き渡しは、このメソッドの実行前に、スタックまたは一時記憶域にそれら引数を入れることにより行う。何らかの結果値は、スタックからまたは一時記憶域から返される。
【００５０】
さらに別の命令により、インタプリタは、特定の名称を持つＣＯＭオブジェクトに対するクエリを受けることが可能となる。このようにして、命令ストリームによって作成されたＣＯＭオブジェクトをエクスポートし、インタプリタの外部で（スクリプトなどで）利用することが可能となる。
【００５１】
以上の説明によって当業者は本発明を実施することができ、さらに請求項によって画定される本発明の範囲内での変更を当業者に対し示唆するものである。
【図面の簡単な説明】
【図１】
本発明の実施に適した環境を示すブロック図である。
【図２】
本発明の構成要素を示すブロック図である。
【図３】
本発明による永続的表現を生成するためのメソッドを示すフローチャートである。
【図４】
図３のコード生成ステップを詳述するフローチャートである。
【図５】
本発明の永続的表現をインタプリトするメソッドを示すフローチャートである。