(57)【要約】インタラクティブ・テレビジョン環境でＨＴＭＬページに組み込まれたスクリプトとして記述されたものなどの機能を実施するインタープリタ言語を抽出し、コンパイルする方法および装置。ＨＴＭＬページは、放送とオンラインの両方から受け取られる。コンパイラは、サーバで走行する。コンパイルされたスクリプトは、より高速に走行し、実行により少ない処理能力を必要とする。コンパイラは、サーバで走行する。スクリプトが、サーバで保管されたコンテンツを表すＨＴＭＬから抽出される。コンパイルされたスクリプト・コードが、放送を介してまたはオンラインで、クライアント・デバイスでのコンテンツ表示中の実行のために、サーバからクライアント・デバイスに送信される。コンパイルされたスクリプトは、より高速に走行し、実行により少ない処理能力を必要とし、その言語のインタープリタを有しないクライアント・デバイスで走行する。
2004528626.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータによって実行される時に、コンピュータに、
サーバで、少なくとも１つのスクリプトを含むＨＴＭＬページをサービス・プロバイダから受け取ることと、
フィルタ内でＨＴＭＬページからスクリプトを抽出することと、
スクリプトを、クライアント・デバイスでの実行のためにクライアント互換コードにコンパイルすることと、
コンパイルされたスクリプトをクライアント・デバイスに送ることと、
コンパイルされたスクリプトをクライアント・デバイスで実行することと
を行わせる命令を含む、コンピュータ可読媒体。
【請求項２】
コンピュータによって実行される時に、コンピュータに、
ＨＴＭＬページからの言語のスクリプト・ページ要素を少なくとも１つのパッケージに集めることと、
ＨＴＭＬページのスクリプト要素が一緒にコンパイルされるように、集められたスクリプト・ページ要素の少なくとも１つのパッケージをスクリプト・コンパイラに渡すことと
を行わせる命令をさらに含む請求項１に記載の媒体。
【請求項３】
スクリプトのうちで、クライアント・デバイスで実行される部分だけが、抽出され、コンパイルされ、クライアント・デバイスに送られる請求項１に記載の媒体。
【請求項４】
コンピュータによって実行される時に、コンピュータに、
ＨＴＭＬページのコンパイルされたスクリプトをキャッシングすることと、
着信ページ・スクリプトが既にキャッシュ内にあるかどうかを判定するために、コンパイラ内で着信ＨＴＭＬページ・スクリプトを検査することと、
着信ＨＴＭＬページがキャッシュ内で見つからない場合に、着信ＨＴＭＬページのスクリプトをコンパイルし、着信ＨＴＭＬページのコンパイルされたスクリプトをキャッシングすることと、
コンパイルされたページがキャッシュ内で見つかる場合に、コンパイルされたページをキャッシュから検索し、コンパイルされたページをクライアント・デバイスに送ることと
を行わせる命令をさらに含む請求項１に記載の媒体。
【請求項５】
コンピュータによって実行される時に、コンピュータに、
ＨＴＭＬページの着信スクリプトを中間フォーマットにコンパイルすることと、
中間フォーマットをクライアント互換コードにコンパイルすることと
を行わせる命令をさらに含む請求項１に記載の媒体。
【請求項６】
コンピュータによって実行される時に、コンピュータに、
サーバ内でスクリプト要素ツリーを生成することと、
スクリプト要素ツリーからクライアント互換オペコードを生成することと
を行わせる命令をさらに含む請求項１に記載の媒体。
【請求項７】
コンピュータによって実行される時に、コンピュータに、
アセンブルされた表現のアセンブリのためにクライアント互換オペコードをバイナリ・アセンブラに送ること
を行わせる命令をさらに含む請求項６に記載の媒体。
【請求項８】
コンピュータによって実行される時に、コンピュータに、
アセンブルされた表現から少なくとも１つのクライアント互換コード・モジュールを生成することと、
実行のためにクライアント互換コード・モジュールをクライアント・デバイスに渡すことと
を行わせる命令をさらに含む請求項７に記載の媒体。
【請求項９】
コンピュータによって実行される時に、コンピュータに、
複製スクリプトのコピーをコンパイルすることと、
複数ＨＴＭＬページによる外部オブジェクトとしての使用のために、複製スクリプトのコンパイルされたコピーをクライアントに送ることと
を行わせる命令をさらに含む請求項１に記載の媒体。
【請求項１０】
コンピュータによって実行される時に、コンピュータに、
事前定義オブジェクトを定義するインターフェースを提供すること
を行わせる命令をさらに含む請求項１に記載の媒体。
【請求項１１】
事前定義オブジェクトが、ＯＳＤおよびチャネルの少なくとも１つを含む請求項１０に記載の媒体。
【請求項１２】
コンピュータによって実行される時に、コンピュータに、
クライアント定義のオブジェクトを操作するクライアント互換オブジェクト・モデル・スクリプト・インターフェースを提供すること
を行わせる命令をさらに含む請求項１に記載の媒体。
【請求項１３】
コンピュータによって実行される時に、コンピュータに、
クライアント・デバイスで実行されるスクリプトだけをＨＴＭＬページから言語のスクリプトを抽出し、集め、その集められたスクリプトを少なくとも１つのクライアント互換コード・モジュールにコンパイルするために集められたスクリプトをスクリプト・コンパイラに渡すことと、
ＨＴＭＬページのコンパイルされたスクリプトをキャッシングし、着信ページがコンパイルされたスクリプト・キャッシュ内にあるかどうかを判定するために着信ＨＴＭＬページ・スクリプトを検査し、キャッシュ内で見つからない場合に、ＨＴＭＬページのスクリプトをコンパイルしてコンパイルされたスクリプトをキャッシングし、コンパイルされたスクリプトがキャッシュ内で見つかる場合に、コンパイルされたスクリプトをキャッシュから検索してコンパイルされたスクリプトをクライアント・デバイスに送ることと、
コンパイルされたスクリプトをクライアント・デバイスで実行することと
を行わせる命令をさらに含む請求項１に記載の媒体。
【請求項１４】
前記命令が、
スクリプト要素ツリーを生成し、スクリプト要素ツリーからのクライアント互換オペコードを生成することと、
ＨＴＭＬページの着信スクリプトを中間フォーマットにコンパイルし、その後、中間フォーマットをクライアント互換コードにコンパイルすることと、
アセンブルされた表現のアセンブリのためにクライアント互換オペコードをバイナリ・アセンブラに送ることと、
クライアント・デバイスでの実行のためにアセンブルされた表現からクライアント互換コード・モジュールを生成することと
をさらに実行する含む請求項１に記載の媒体。
【請求項１５】
コンピュータによって実行される時に、コンピュータに、
複製スクリプトのコピーをコンパイルし、かつ複数のＨＴＭＬページによる外部オブジェクトとしての使用のために、クライアント・デバイスへ複製スクリプトのコンパイルされたコピーを送ることと、
ＯＳＤまたはチャネルの少なくとも１つである事前定義オブジェクトを定義するインターフェースを提供することと、
クライアント定義オブジェクトを操作するクライアント互換オブジェクト・モデル・スクリプト・インターフェースを提供することと
を行わせる命令をさらに含む請求項１に記載の媒体。
【請求項１６】
ＨＴＭＬページが、ヘッド・エンドからサーバに送られる請求項１に記載の媒体。
【請求項１７】
ＨＴＭＬが、サービス・プロバイダとクライアント・デバイスのユーザとの間のｅコマース・トランザクションの一部である請求項１６に記載の媒体。
【請求項１８】
分散コンピュータ・システムのクライアント・デバイスでの実行のためにスクリプトをコンパイルする方法であって、
サーバで、少なくとも１つのスクリプトを含むＨＴＭＬページをサービス・プロバイダから受け取ることと、
フィルタ内でＨＴＭＬページからスクリプトを抽出することと、
スクリプトを、クライアント・デバイスでの実行のためにクライアント互換コードにコンパイルすることと、
コンパイルされたスクリプトをクライアント・デバイスに送ることと、
コンパイルされたスクリプトをクライアント・デバイスで実行することと
を含む方法。
【請求項１９】
ＨＴＭＬページからの言語のスクリプト・ページ要素を少なくとも１つのパッケージに集めることと、
ＨＴＭＬページのすべてのスクリプト要素が一緒にコンパイルされるように、集められたスクリプト・ページ要素の少なくとも１つのパッケージをスクリプト・コンパイラに渡すことと
をさらに含む請求項１８に記載の方法。
【請求項２０】
スクリプトのうちで、クライアント・デバイスで実行される部分だけが、抽出され、コンパイルされ、クライアント・デバイスに送られる請求項１８に記載の方法。
【請求項２１】
ＨＴＭＬページのコンパイルされたスクリプトをキャッシングすることと、
着信ページ・スクリプトが既にキャッシュ内にあるかどうかを判定するために、コンパイラ内で着信ＨＴＭＬページ・スクリプトを検査することと、
着信ＨＴＭＬページがキャッシュ内で見つからない場合に、着信ＨＴＭＬページのスクリプトをコンパイルし、着信ＨＴＭＬページのコンパイルされたスクリプトをキャッシングすることと、
コンパイルされたページがキャッシュ内で見つかる場合に、コンパイルされたページをキャッシュから検索し、コンパイルされたページをクライアント・デバイスに送ることと
をさらに含む請求項１８に記載の方法。
【請求項２２】
ＨＴＭＬページの着信スクリプトを中間フォーマットにコンパイルすることと、
中間フォーマットをクライアント互換コードにコンパイルすることと
をさらに含む請求項１８に記載の方法。
【請求項２３】
サーバ内でスクリプト要素ツリーを生成することと、
スクリプト要素ツリーからクライアント互換オペコードを生成することと
をさらに含む請求項１８に記載の方法。
【請求項２４】
アセンブルされた表現のアセンブリのためにクライアント互換オペコードをバイナリ・アセンブラに送ること
をさらに含む請求項２３に記載の方法。
【請求項２５】
アセンブルされた表現から少なくとも１つのクライアント互換コード・モジュールを生成することと、
実行のためにクライアント互換コード・モジュールをクライアント・デバイスに渡すことと
をさらに含む請求項２４に記載の方法。
【請求項２６】
複製スクリプトのコピーをコンパイルすることと、
複数ＨＴＭＬページによる外部オブジェクトとしての使用のために、複製スクリプトのコンパイルされたコピーをクライアントに送ることと
をさらに含む請求項１８に記載の方法。
【請求項２７】
事前定義オブジェクトを定義するインターフェースを提供すること
をさらに含む請求項１８に記載の方法。
【請求項２８】
事前定義オブジェクトが、ＯＳＤおよびチャネルの少なくとも１つを含む請求項２７に記載の方法。
【請求項２９】
クライアント定義のオブジェクトを操作するクライアント互換オブジェクト・モデル・スクリプト・インターフェースを提供すること
をさらに含む請求項１８に記載の方法。
【請求項３０】
クライアント・デバイスで実行されるスクリプトだけをＨＴＭＬページから言語のスクリプトを抽出し、集め、かつその集められたスクリプトを少なくとも１つのクライアント互換コード・モジュールにコンパイルするために、集められたスクリプトをスクリプト・コンパイラに渡すことと、
ＨＴＭＬページのコンパイルされたスクリプトをキャッシングし、着信ページがコンパイルされたスクリプト・キャッシュ内にあるかどうかを判定するために着信ＨＴＭＬページ・スクリプトを検査し、キャッシュ内で見つからない場合に、ＨＴＭＬページのスクリプトをコンパイルしてコンパイルされたスクリプトをキャッシングし、コンパイルされたスクリプトがキャッシュ内で見つかる場合に、コンパイルされたスクリプトをキャッシュから検索してコンパイルされたスクリプトをクライアント・デバイスに送ることと、
コンパイルされたスクリプトをクライアント・デバイスで実行することと
をさらに含む請求項１８に記載の方法。
【請求項３１】
スクリプト要素ツリーを生成し、スクリプト要素ツリーからクライアント互換オペコードを生成することと、
ＨＴＭＬページの着信スクリプトを中間フォーマットにコンパイルし、その後、中間フォーマットをクライアント互換コードにコンパイルすることと、
アセンブルされた表現のアセンブリのためにクライアント互換オペ・コードをバイナリ・アセンブラに送ることと、
クライアント・デバイスでの実行のためにアセンブルされた表現からクライアント互換コード・モジュールを生成することと
をさらに含む請求項１８に記載の方法。
【請求項３２】
複製スクリプトのコピーをコンパイルすることと、複数のＨＴＭＬページによる外部オブジェクトとしての使用のために、クライアント・デバイスに複製スクリプトのコンパイルされたコピーを送ることと、
ＯＳＤまたはチャネルの少なくとも１つである事前定義オブジェクトを定義するインターフェースを提供することと、
クライアント定義オブジェクトを操作するクライアント互換オブジェクト・モデル・スクリプト・インターフェースを提供することと
をさらに含む請求項１８に記載の方法。
【請求項３３】
ＨＴＭＬページが、ヘッド・エンドからサーバに送られる請求項１８に記載の方法。
【請求項３４】
ＨＴＭＬが、サービス・プロバイダとクライアント・デバイスのユーザとの間のｅコマース・トランザクションの一部である請求項３３に記載の方法。
【請求項３５】
コンピュータに、
コンパイル時に、スクリプト変数名を、ラン・タイムにクライアント・デバイスで変数名値を含むメモリ位置にバインドすること
を行わせる命令をさらに含む請求項１に記載の媒体。
【請求項３６】
コンピュータに、
コンパイル時に、スクリプト変数名を、ラン・タイムのクライアント・デバイスでの実行のための値にバインドすること
を行わせる命令をさらに含む請求項１に記載の媒体。
【請求項３７】
コンパイル時に、スクリプト変数名を、ラン・タイムにクライアント・デバイスで変数名値を含むメモリ位置にバインドすること
をさらに含む請求項１８に記載の方法。
【請求項３８】
コンパイル時に、スクリプト変数名を、ラン・タイムのクライアント・デバイスでの実行のための値にバインドすること
をさらに含む請求項１８に記載の方法。
【請求項３９】
コンピュータに、
スクリプトの部分がクライアント・デバイスで実行されるかどうかを判定するためにスクリプト内のキーワードを検出すること
を行わせる命令をさらに含む請求項３に記載の媒体。
【請求項４０】
スクリプトの部分がクライアント・デバイスで実行されるかどうかを判定するためにスクリプト内のキーワードを検出すること
をさらに含む請求項２０に記載の方法。
【請求項４１】
分散コンピュータ・システムのクライアント・デバイスでの実行のためにスクリプトをコンパイルする装置であって、
サーバで、少なくとも１つのスクリプトを含むＨＴＭＬページをサービス・プロバイダから受け取るサーバ・メモリと、
フィルタ内でＨＴＭＬページからスクリプトを抽出する抽出構成要素と、
スクリプトを、クライアント・デバイスでの実行のためにクライアント互換コードにコンパイルするコンパイラ構成要素と、
コンパイルされたスクリプトをクライアント・デバイスに送る通信リンクと、
コンパイルされたスクリプトを実行するクライアント・デバイスと
を含む装置。
【請求項４２】
ＨＴＭＬページからの言語のスクリプト・ページ要素を少なくとも１つのパッケージに集めるプログラム構成要素と、
ＨＴＭＬページのすべてのスクリプト要素が一緒にコンパイルされるように、スクリプト・コンパイラによるアクセスのためにスクリプト・ページ要素を集めるメモリと
をさらに含む請求項４１に記載の装置。
【請求項４３】
スクリプトのうちで、クライアント・デバイスで実行される部分だけが、抽出され、コンパイルされ、クライアント・デバイスに送られる請求項４１に記載の装置。
【請求項４４】
ＨＴＭＬページのコンパイルされたスクリプトをキャッシングするキャッシュ
をさらに含み、コンパイラが、着信ページ・スクリプトが既にキャッシュ内にあるかどうかを判定するために、コンパイラ内で着信ＨＴＭＬページ・スクリプトを検査するプログラム構成要素をさらに含み、着信ＨＴＭＬページがキャッシュ内で見つからない場合に、着信ＨＴＭＬページのスクリプトをコンパイルし、着信ＨＴＭＬページのコンパイルされたスクリプトをキャッシングし、コンパイルされたページがキャッシュ内で見つかる場合に、コンパイルされたページをキャッシュから検索し、コンパイルされたページをクライアント・デバイスに送る
請求項４１に記載の装置。
【請求項４５】
ＨＴＭＬページの着信スクリプトを中間フォーマットにコンパイルするコンパイラ構成要素と、
中間フォーマットをクライアント互換コードにコンパイルするコンパイラ構成要素と
をさらに含む請求項４１に記載の装置。
【請求項４６】
サーバ内でスクリプト要素ツリーを含むメモリと、
スクリプト要素ツリーからクライアント互換オペコードを生成するプログラム構成要素と
をさらに含む請求項４１に記載の装置。
【請求項４７】
アセンブルされた表現のアセンブリのためのバイナリ・アセンブラへのクライアント互換オペコードを受け取るバイナリ・アセンブラ
をさらに含む請求項４６に記載の装置。
【請求項４８】
実行のためにクライアント・デバイスに渡される、アセンブルされた表現から生成された少なくとも１つのクライアント互換コード・モジュール
をさらに含む請求項４７に記載の装置。
【請求項４９】
複数ＨＴＭＬページによる外部オブジェクトとしての使用のためにクライアントに送られる、複製スクリプトのコンパイルされたコピー
をさらに含む請求項４１に記載の装置。
【請求項５０】
事前定義オブジェクトを定義するインターフェース
をさらに含む請求項４１に記載の装置。
【請求項５１】
事前定義オブジェクトが、ＯＳＤおよびチャネルの少なくとも１つを含む請求項５０に記載の装置。
【請求項５２】
クライアント定義のオブジェクトを操作するクライアント互換オブジェクト・モデル・スクリプト・インターフェース
をさらに含む請求項４１に記載の装置。
【請求項５３】
ＨＴＭＬページから言語のスクリプトを抽出し、集めるプログラム構成要素であって、クライアント・デバイスで実行されるスクリプトだけが抽出され、集められたスクリプトを少なくとも１つのクライアント互換コード・モジュールにコンパイルするために、集められたスクリプトをスクリプト・コンパイラに渡す、プログラム構成要素と、
ＨＴＭＬページのコンパイルされたスクリプトを保管するキャッシュであって、着信ページがコンパイルされたスクリプト・キャッシュ内にあるかどうかを判定するために着信ＨＴＭＬページ・スクリプトを検査し、キャッシュ内で見つからない場合に、ＨＴＭＬページのスクリプトをコンパイルしてコンパイルされたスクリプトをキャッシングし、コンパイルされたスクリプトがキャッシュ内で見つかる場合に、コンパイルされたスクリプトをキャッシュから検索してコンパイルされたスクリプトをクライアント・デバイスに送る、キャッシュと
コンパイルされたスクリプトを実行するクライアント・デバイスと
をさらに含む請求項４１に記載の装置。
【請求項５４】
スクリプト要素ツリーからクライアント互換オペコードを生成するスクリプト要素ツリーと、
ＨＴＭＬページの着信スクリプトを中間フォーマットにコンパイルし、その後、中間フォーマットをクライアント互換コードにコンパイルする中間フォーマット構成要素と、
クライアント・デバイスでの実行のためにアセンブルされた表現からクライアント互換コード・モジュールを生成する、アセンブルされた表現のクライアント互換オペ・コードへのアセンブリのためのアセンブリのためバイナリ・アセンブラと
をさらに含む請求項４１に記載の装置。
【請求項５５】
複製スクリプトのコピーをコンパイルし、複数のＨＴＭＬページによる外部オブジェクトとしての使用のために、複製スクリプトのコンパイルされたコピーをクライアント・デバイスに送ることと、
ＯＳＤまたはチャネルの少なくとも１つである事前定義オブジェクトを定義するインターフェースを提供することと、
クライアント定義オブジェクトを操作するクライアント互換オブジェクト・モデル・スクリプト・インターフェースを提供することと
をさらに含む請求項４１に記載の装置。
【請求項５６】
ＨＴＭＬページが、ヘッド・エンドからサーバに送られる請求項４１に記載の装置。
【請求項５７】
ＨＴＭＬが、サービス・プロバイダとクライアント・デバイスのユーザとの間のｅコマース・トランザクションの一部である請求項５６に記載の装置。
【請求項５８】
コンパイル時に、スクリプト変数名を、ラン・タイムにクライアント・デバイスで変数名値を含むメモリ位置にバインドするコンパイラ構成要素
をさらに含む請求項４１に記載の装置。
【請求項５９】
スクリプトの部分がクライアント・デバイスで実行されることをスクリプト内で示すキーワード
をさらに含む請求項４３に記載の装置。
【発明の詳細な説明】
【著作権表示】
【０００１】
この特許文書の開示の一部に、著作権保護の請求が行われるもの（コード・リスティングおよびメッセージ・リスティング）が含まれる。著作権所有者は、米国特許商標局の書類綴りまたは記録に現れるこの特許文書または特許開示の何人によるそのままの複製にも異議を唱えないが、他のすべての権利を留保する。Ｃｏｐｙｒｉｇｈｔ  ２００１  ＯｐｅｎＴＶ，Ｉｎｃ．
【技術分野】
【０００２】
本発明は、インタラクティブ・テレビジョン・コンテンツ表示の分野に関し、具体的には、たとえばＨＴＭＬページなどのテキスト・マーク・アップ言語からの、たとえばＪａｖａ（登録商標）Ｓｃｒｉｐｔなどのインタープリタ言語を抽出し、かつダウンロードするためそのＪａｖａＳｃｒｉｐｔをサーバでコンパイルすることに関し、さらに放送、インターネット、またはキャッシュによって提供されるコンテンツのインタラクティブ・テレビジョン表示空間内での表示を実行するクライアント・デバイスに関する。
【背景技術】
【０００３】
インタラクティブ・テレビジョン・システムを使用して、視聴者にさまざまなサービスを提供することができる。インタラクティブ・テレビジョン・システムは、通常のビデオ番組ストリーム、インタラクティブ・テレビジョン・アプリケーション、テキストおよびグラフィック・イメージ、ウェブ・ページ、およびその他のタイプの情報を配信することができる。インタラクティブ・テレビジョン・システムは、視聴者の動作または反応を登録することもでき、マーケティング、エンターテイメント、および教育などの目的に使用することができる。ユーザまたは視聴者は、宣伝された製品またはサービスの注文、ゲーム・ショーの参加者との競争、特定の番組に関する特殊化された情報の要求、または情報のページを介するナビゲーションによって、システムと対話することができる。
【０００４】
通常、放送サービス・プロバイダまたはネットワーク・オペレータは、視聴者のテレビジョンへの送信のためにインタラクティブ・テレビジョン信号を生成する。そのインタラクティブ・テレビジョン信号は、アプリケーション・コードまたは制御情報からなるインタラクティブ部分ならびにテレビジョンジョン番組またはその他の情報表示からなるオーディオ／ビデオ部分を含む。放送サービス・プロバイダは、ユーザのテレビジョンに接続された受信器へ送信するために、オーディオ／ビデオ部分とインタラクティブ部分を組み合わせて単一の信号にする。この信号は、一般に、送信の前に圧縮され、ケーブル・テレビジョン（ＣＡＴＶ）回線または直接衛星送信システムなどの通常の放送チャネルを介して放送される。
【０００５】
通常、テレビジョンに接続されたセットトップ・ボックスによって、テレビジョンのインタラクティブ機能が制御される。セットトップ・ボックスは、放送サービス・プロバイダによって送信された放送信号を受信し、インタラクティブ部分をオーディオ−ビデオ部分から分離し、信号のそれぞれの部分を圧縮解除する。セットトップ・ボックスは、インタラクティブ情報を使用して、たとえば、オーディオ／ビデオ情報がテレビジョンに送られている間にアプリケーションを実行する。セットトップ・ボックスでは、オーディオ／ビデオ情報を、テレビジョンへの情報の送出の前にインタラクティブ・アプリケーションによって生成されたインタラクティブなグラフィックスまたはオーディオと組み合わせることができる。インタラクティブなグラフィックスまたはオーディオによって、追加情報を視聴者に提示することができ、あるいは、視聴者に入力を促すことができる。セットトップ・ボックスによって、モデム接続またはケーブルを介する放送サービス・プロバイダに、視聴者の入力または他の情報を供給することができる。
【０００６】
寄せ集め的な性質に従って、インタラクティブ・テレビジョン・システムは、放送サービス・プロバイダ／ネットワーク・オペレータから情報を受け取るクライアントまたは視聴者が理解できることが好ましいさまざまな異なる通信プロトコルでコンテンツを提供する。典型的には、クライアントは、限られた処理能力と通信帯域幅しか持たないプロセッサを備えたセット・トップ・ボックスである。さまざまなプロトコルの変換は、通常のセット・トップ・ボックス・プロセッサで使用可能な限られた処理能力を超える。さらに、コンテンツを作成するための複数のウェブ・オーサリング・ツールを使用する複数のソースが存在する。これらのソースは、ＨＴＭＬページに組み込まれたＪａｖａＳｃｒｉｐｔに関する標準規格としてハイパーテキスト・マーク・アップ言語（ＨＴＭＬ）を使用する傾向がある。ＪａｖａＳｃｒｉｐｔは、通常は、インタプリートされる。クライアント・デバイスは、通常は、限られた処理能力および帯域幅を有し、高速で効率的な形でインタープリタ言語を解釈し、実行することができない。したがって、ＨＴＭＬコードに組み込まれたＪａｖａＳｃｒｉｐｔのインタプリートの必要をなくし、その結果、過大な量の処理能力または通信帯域幅を必要とせずに、クライアントまたはセット・トップ・ボックス・プロセッサによってＨＴＭＬエンコードされたコンテンツを表示できるようにする、堅牢なクライアント・アンド・サーバ・アーキテクチャの必要がある。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
本発明は、上で説明したインタラクティブ・テレビジョン環境の必要に対処する。
【課題を解決するための手段】
【０００８】
本発明は、ＨＴＭＬなどの入力言語からＪａｖａＳｃｒｉｐｔなどのインタープリタ言語を受け入れ、抽出し、クライアント・デバイスでの表示のためにインタープリタ言語をコンパイルするソフトウェアおよびハードウェアを含む方法および装置を提供する。複数のページに共通するコンパイルされたＪａｖａＳｃｒｉｐｔページが、１回だけ送信され、コンパイルされたページによって外部ページとして参照され、したがって、送信されるデータの量および関連する帯域幅が減る。視聴者またはクライアントは、（ＳＴＢ）の視聴者、セル電話ユーザ、デジタル・アシスタント、ポケットＰＣ、または他の電子受信デバイスとすることができる。
【０００９】
本発明は、既知のシステムに対する明確な利益を提供する。本発明は、クライアント・デバイスでの実行のために、サーバ・サイドでＨＴＭＬページからスクリプトを抽出し、スクリプトをコンパイルする。これは、同じデバイスでブラウザがスクリプトをインタプリートし、かつ実行する既知のシステムに対する改善である。本発明は、スクリプトの一部またはすべてが一緒にコンパイルされるように、ＨＴＭＬ文書からの、たとえばＪａｖａＳｃｒｉｐｔまたは他のスクリプト言語など、各言語のスクリプトを単一のパッケージに集め、コンパイラに渡す。スクリプトは様々な形でＨＴＭＬ文書に組み込まれる。たとえば、＜ＳＣＲＩＰＴ＞タグおよび＜／ＳＣＲＩＰＴ＞タグの対の間、またはイベント・ハンドラの属性値としてである。本発明は、ＨＴＭＬ文書を解析し、（指定された言語、たとえばＪａｖａＳｃｒｉｐｔの）スクリプトを１つのパッケージに集約し、コンパイラを呼び出す。スクリプトの一部（たとえばインクルードされたスクリプト）が、異なるモジュールに別々にコンパイルされ、すべてのモジュールが、実行のためにクライアント・デバイスに送信される。これによって、たとえば、コンパイルされたスクリプトを異なるＨＴＭＬページで共用できるようになる。これは、コンパイラが、主文書のスクリプトをコンパイルするためのインターフェースとおそらくは異なる、インクルードされたスクリプトをコンパイルするインターフェースを有することを意味する。したがって、単一のコンパイルされたモジュールを作成することがより容易で単純になる。
【００１０】
クライアント・デバイスは、複数のコンパイルされたスクリプトを、それらが単一のスクリプトであるかのようにリンクし、実行する方法を知っている。コンパイルされたスクリプトを、キャッシングすることができ、その結果、スクリプトが既にキャッシュ内にある場合にはコンパイルが行われない。本発明は、通常のＨＴＭＬブラウザでのみコードが実行されるように（すなわち、クライアント・デバイスでは絶対に実行されない）、スクリプト内にコンパイル時マーカーも設ける。従来のシステムでは、スクリプトが、実行時にどのブラウザが走行しているか（Ｉｎｔｅｒｎｅｔ  Ｅｘｐｌｏｒｅｒ、Ｎｅｔｓｃａｐｅなど）をテストできるようにする。本発明では、好ましいコンパイラが、たとえば「ＪＳ２Ｏ」などのキーワードを認識する。したがって、次のコード「ｉｆ（ＪＳ２Ｏ）ＤＯ＿Ａ；ｅｌｓｅ  ＤＯ＿Ｂ；」では、コンパイラは、「ｉｆ（ＪＳ２Ｏ）」が必ず真になることを知っているので、「ＤＯ＿Ｂ」をコンパイルしない。したがって、このコード全体が、「ＤＯ＿Ａ」としてコンパイルされる。スクリプト・コンパイラは、クライアント・デバイスで絶対に実行されないコードをコンパイルせず、したがって、コンパイルされたコードのサイズが減り、コード実行時間が改善される。コンパイラは、クライアント・デバイスでのより高速の実行のために、一部のレイト・バインディング（ｌａｔｅ  ｂｉｎｄｉｎｇ）参照をコンパイル時バインディングに置換する。従来のシステムは、実行時に参照をレゾルブする。たとえば、ＪａｖａＳｃｒｉｐｔでは、識別子「ｆｏｏ」にアクセスする時に、スクリプト・エンジンが、スコープ・チェーン内で名前「ｆｏｏ」を探す。もちろん、これには時間がかかる。本発明では、コンパイラが、ランタイムの高速アクセスのために、識別子「ｆｏｏ」を特定のアドレスにバインドする（いくつかの場合に）。たとえば、ＪＳ２Ｏでは、（いくつかの）プロパティが、Ｃ言語の通常のグローバル変数としてメモリ空間を割り振られ、（いくつかの）他のプロパティは、Ｃの通常のローカル変数としてスタック内のスロットを割り当てられる。コンパイラは、クライアント・デバイスでのより高速な実行のために、いくつかのレイト・バインディング参照を絶対値に置換する。この実施形態では、アドレスへのバインディングの代わりに、コンパイラが、識別子を直接に値に置換する。たとえば、ＪａｖａＳｃｒｉｐｔでは、識別子「ＮａＮ」が、オブジェクトのプロパティである。本発明では、コンパイラが、「ＮａＮ」への参照をその値に直接に置換する。
【００１１】
好ましいコンパイラは、オブジェクトの新しいクラスを定義するインターフェースをサポートする。これによって、コンパイラが、これらのオブジェクトにアクセスし、かつ／またはその作成および操作を最適化することができるようになり、ランタイムにそのクラスのコードにリンクできるようになる。クラス・コードは、Ｏｐｅｎ  ＴＶモジュールとして実装することができる。好ましい実施態様では、Ｈ２Ｏによって、オブジェクトの新しいクラスを宣言するＨＴＭＬ構文が定義される。コンパイラは、オブジェクトの事前定義の／外部のインスタンスを定義するインターフェースをサポートし、これによって、コンパイラが、これらのオブジェクトにアクセスでき、かつ／またはその操作を最適化できるようになり、ランタイムにこれらのオブジェクトにアクセスできるようになる。これらのオブジェクトは、スクリプト実行の外部で作成される。好ましい実施形態では、Ｈ２Ｏによって、オブジェクトの事前定義の／外部のインスタンスを宣言するＨＴＭＬ構文が定義される。
【００１２】
本発明の他の目的および長所は、以下の詳細な説明を読み、添付図面を参照する時に明白になる。
【００１３】
本発明は、さまざまな修正形態および代替形態を許すが、本発明の特定の実施形態を、図面で例として示し、本明細書で詳細に説明する。しかし、図面およびそれに対する詳細な説明が、開示される特定の形態に本発明を制限することを意図されたものではなく、逆に、本発明が、請求項によって定義される本発明の趣旨および範囲に含まれるすべての修正形態、同等形態、および代替形態を含むことを理解されたい。
【発明を実施するための最良の形態】
【００１４】
図１を参照すると、サービス・プラットフォーム５０に、おおまかに３つのカテゴリすなわち、コンテンツ変換２０４、トランザクション制御／ビジネス機能２０６、およびトランスポート変換２０７に分割されたアプリケーションのグループが含まれる。サービス・プラットフォームによって、サービス２００がクライアント２１２と対話できる。サービス２００は、サービス・プラットフォーム５０への通信リンク２０２を介して通信する。次に、サービス・プラットフォーム５０がクライアント２１２と通信する。クライアント２１２は、ＳＴＢ、デジタル・アシスタント、セル電話、または、通信リンク２３０を介してサービス・プラットフォームと通信できる他の通信デバイスとすることができる。コンテンツ変換２０４サービスおよびトランスポート変換２０７サービスは、トランスポートおよび通信の機能を提供し、ビジネス機能サービスが、ビジネス制御機能を提供する。
【００１５】
図２からわかるように、トランザクション制御／ビジネス機能２０６は、サービス・プラットフォームとクライアント２１２の間で分散される。たとえば、クライアントが、いくつかのビジネス機能を実行（たとえば、視聴される宣伝を選択するために、宣伝キャンペーン・ルールおよび宣伝／ビジネス・フィルタを実施）でき、クライアント２１２により適するコンテンツを選択（たとえば、ユーザ・プロファイルに適する宣伝またはプログラムを選択）することができる。図２の機能を、図３で展開する。図３からわかるように、ビジネス機能２０６に、４つの主要な構成要素すなわち、サービス・マネージャ２３８、視聴者マネージャ２４０、トランザクション・マネージャ２４２、および宣伝（Ａｄ）マネージャ２４４が含まれる。好ましい実施形態の高水準オペレーション・フローの１つの例を、下で示す。
【００１６】
ここで図３を参照すると、サービス２００は、ネットワーク・オペレータと交渉して、ヘッドエンド・オペレータのサービス・プラットフォームを介して加入者にサービスを提供する。ネットワーク・オペレータまたはヘッド・エンド・オペレータは、サービス・マネージャ２３８を使用して、サービスと、そのサービスに関連する交渉されたビジネス・ルール２２２（たとえば、スケジュール、帯域幅要件、視聴者情報へのサービス・アクセス）を登録する。サービス・マネージャ２３８は、サービス・データ２１６（たとえば、ＵＲＬアドレス、コンテンツ）を保管する。ビジネス・ルール２２２およびサービス・データ２１６に基づいて、サービス・マネージャ２３８は、放送通信２３４機能と通信して、コンテンツ・プロバイダからコンテンツを検索する。
【００１７】
サービス２００からコンテンツが検索される時に、コンテンツ変換２０４およびコンテンツ・フィルタ２２４によってそのコンテンツを処理して、コンテンツをクライアント・デバイス２１２に適する形に変換する。放送２３４機能はコンテンツを放送２３４網に適する形に変換する。クライアント２１２は変換されたコンテンツを放送リンク２１１を介して受け取る。クライアント２１２およびサービス２００は、トランスポート変換２０７の一部である、ポイントツーポイント・リンク２１０とポイントツーポイント機能２３２を介して対話する。サービス２００に、ショッピング、オーディオ／ビデオ、ゲーム、投票、宣伝、メッセージング、または他の任意のサービスを含めることができる。
【００１８】
クライアント２１２は、ポイントツーポイント２３２通信リンクを介して、サービス・プラットフォーム５０およびサービス２００と通信する。ロード・バランサ２３６が、ビジネス機能２０６と対話して、放送２３４通信リンク２１１とポイントツーポイント２３２通信リンク２１０の間での最適の負荷分散を判定する。プラットフォーム・ビジネス・エージェント２２６は、ビジネス・ルール２２２を使用して、サービス２００とクライアント２１２の間の対話および情報の交換を制御する。たとえば、ネットワーク・オペレータは、ユーザ情報へのサービス２００アクセスを防止することを選択することができる。サービス２００は、ビジネス・ルール２２２およびサービス・データ２１６に基づいて、ユーザ情報へのアクセスのために料金を支払うことが好ましい。
【００１９】
視聴者マネージャ２４０は、クライアント／ユーザ情報をユーザ・データ２２０に保管する。プラットフォーム・ビジネス・エージェント２２６は、サービス２００への視聴者情報の流れを制御する。トランザクション・マネージャ２４２は、サービス２００とクライアント２１２の間で交換されたトランザクション情報を記録する。ビジネス・ルール２２２およびユーザ・データ２２０に基づいて、宣伝マネージャ２４４は、どの宣伝およびどのタイプの宣伝が、放送リンク２１１およびポイントツーポイント・リンク２１０を介してクライアントに提示されるかを決定する。
【００２０】
図４に、サービス・プラットフォーム５０の好ましい実施形態のもう１つの例を示す。サービス２００は、インターネットを介して、またはネットワーク・オペレータがアクセス可能な別のネットワークまたは通信チャネルを介してのいずれかで、ショッピング、チャット、および他のサービスを提供する。サービス・プラットフォームを使用して、ネットワーク・オペレータが、これらのサービスにアクセスする。サービス・マネージャ２３８を含むビジネス機能２０６が、カルーセル・マネージャ２５４と対話して、サービス２００からコンテンツを検索する。カルーセルには、サービス・プラットフォーム５０からクライアントへ放送されるオーディオ／ビデオ／インタラクティブ・データの繰り返されるストリームが含まれる。カルーセル・マネージャ２５４、トランザクション・マネージャ２４２、およびサービス・マネージャ２３８は、放送カルーセルへのコンテンツの挿入および削除を制御する。サービス・コンテンツは、Ｈ２Ｏ  ２４８によって検索され、クライアントに適するフォーマットに変換される。Ｈ２Ｏ  ２４８は、コンテンツ変換２０４およびコンテンツ・フィルタ２２４の可能な実施形態である。Ｈ２Ｏは、ＨＴＭＬコンテンツを、サービス・プラットフォーム／クライアント可読コンテンツに変換する。変換されたコンテンツは、データ・カルーセルにフォーマットされ、クライアント２１２への放送のためにオープン・ストリーマ２５６によって多重化される。クライアント２１２は、サービスと対話し、必要な場合に、サービス・プラットフォームやサービス２００と通信する。ポイントツーポイント通信はサービス・ゲートウェイ２４６を介して進む。サービス・ゲートウェイ２４６は、トランスポート変換を実行して、ＳＴＢプロトコルを、プラットフォーム・ビジネス・エージェント２２６やＨ２Ｏ  ２４８が期待し理解する形に変換する。ロード・バランサ２３６は、ビジネス機能２０６、カルーセル・マネージャ２５４、およびサービス・ゲートウェイ２４６と対話して、放送リンク２４１とポイントツーポイント通信リンク２１０の間の最適負荷を判定する。ビジネス機能２０６は、プラットフォーム・ビジネス・エージェント２２６と対話して、サービス２００とクライアント２１２の間のアクセスおよび情報交換を制御する。
【００２１】
本発明の好ましい実施形態では、Ｈ２Ｏがクライアント／サーバ・ソリューションであり、これによって、インターネット・コンテンツ開発者が、サービス・プラットフォームを稼動させるネットワーク・オペレータ用のインタラクティブ・テレビジョンのアプリケーションやサービスを作成できるようになる。サービス・プラットフォームによって、視聴者が、インタラクティブ・テレビジョン・アプリケーションの膨大に拡大している全世界市場を利用できるようにするインターネットのタレントおよびコンテンツの大きいプールにアクセスできる。Ｈ２Ｏサーバ・プロセスは、インターネット・コンテンツ（ＨＴＭＬページ、ＥＣＭＡスクリプト、およびＨＴＭＬページ・フォーマット）を、サービス・プラットフォーム・アセット（ａｓｓｅｔ）に変換する。Ｈ２Ｏクライアント・プロセスは、アセットをレンダリングし、クライアント２１２と対話する。Ｔコマース／Ｅコマース・ケース・シナリオでは、Ｈ２Ｏによって、Ｅコマース・ショップが、既存のウェブ・ツールを使用し、標準ウェブ・プロトコルを使用して、ショッピング・サービスを作成でき、好ましいサービス・プラットフォーム（オペレータ）と対話できるようになる。
【００２２】
Ｈ２Ｏは、サービス・ゲートウェイおよび放送ツールへのプロキシとして働いて、ウェブ・コンテンツを変換する。Ｈ２Ｏは、放送とオンライン・ソースの両方からＨＴＭＬを受信する。本発明では、ウェブ・サイトが、現在のＨＴＴＰサーバを使用でき、アプリケーション・サーバが、インタラクティブ・テレビジョン・コンテンツを生成できるようにする。好ましい実施形態では、ＨＴＭＬ、ＪａｖａＳｃｒｉｐｔ、およびインターネット・グラフィックスを、セット・トップ・ボックスの仮想マシンで走るクライアント互換コード、好ましくはＣベースのＯｐｅｎＴＶコードであるＯｃｏｄｅにＨ２Ｏが変換する。他の既知のまたはこれから開発されるプロトコルも、Ｈ２Ｏの機能に追加することができる。Ｈ２Ｏによって、サービス・プラットフォームが、ブラウザの全機能を備えてはいないクライアントのＳＴＢと通信でき、オリジナル・ユーザ・インターフェースを作成できるようになる。Ｈ２Ｏによって、ＨＴＭＬだけを使用する任意のコマース・エンジンへのサービス・プラットフォーム接続が可能になる。Ｈ２Ｏは、ＨＴＭＬページ、ＪＰＧピクチャ、ｗａｖｅオーディオ・ファイルなどのウェブ・コンテンツを、クライアント・サイドの最小限の処理機能および帯域幅で簡単に使用できるクライアント・フレンドリなリソースに変換する責任を負う。
【００２３】
Ｈ２Ｏのサーバ・サイドは、ＨＴＴＰプロキシであり、Ｈ２ＯＳと称する。他の目的のために、Ｈ２ＯＳをＤＬＬまたはバッチ・ツールとしてパッケージ化することができる。Ｈ２Ｏのクライアント・サイドであるＳＴＢ  ＯＣＯＤアプリケーションは、Ｈ２ＯＣである。Ｈ２ＯＣは、サービス・ゲートウェイ・ライブラリまたはカルーセル・ロード・ライブラリなど、他のサービス・プラットフォーム・クライアント構成要素の上に構築される。Ｈ２Ｏによって、ＵＲＬを使用して、文書およびサービスをアドレッシングできるようになる。Ｈ２Ｏによって、放送およびオンライン環境での追跡が可能になる。Ｈ２ＯＳは、ＨＴＴＰプロキシの機能を提供する。サービス・プラットフォーム・アプリケーションは、Ｈ２Ｏを介して文書を要求する。Ｈ２Ｏは、文書を検索し、解析し、コンパイルし、要求元にその文書を返す。このＨ２Ｏの機能によって、同一のエンジンを、異なる用途すなわちオンラインおよび放送に使用でき、スケーラビリティが容易になり、Ｈ２Ｏの柔軟性が可能になる。解析は、文書のタイプに依存し、たとえば、Ｈ２Ｏ解析を、ＨＴＭＬ解析、ＧＩＦピクチャ、またはＪＰＥＧイメージなどとすることができる。Ｈ２Ｏを拡張可能にするために、Ｈ２Ｏは、新しいサード・パーティのコンバータおよびフィルタを「プラグイン」し、実行する機能を提供する。
【００２４】
Ｈ２Ｏは、Ａ／Ｖ制御、チャネル制御、オン・スクリーン・ディスプレイ（ＯＳＤ）制御、およびトリガを含む特殊なタグをサポートする。Ｈ２ＯがサポートするＷ３Ｃタグには、グラフィカル要素の制御された位置決め（ｘ、ｙ、ｚ）が含まれる。ＪａｖａＳｃｒｉｐｔライブラリに、Ｍａｔｈ、ＤＯＭ、およびＤａｔｅが含まれる。Ｈ２Ｏのクライアント・サイドであるＨ２ＯＣは、クライアントまたはＳＴＢのグラフィックス・アセットを構成する。Ｈ２Ｏによって、受信時の、ユーザが見るページの更新表示が可能になる。Ｈ２ＯＣでは、他のサービス・プラットフォーム構成要素によって提供されるライブラリ（通信、カルーセル他）が使用される。Ｈ２Ｏによって、単一の更新でのページのリフレッシュが可能になるが、アセットがロードされる時の部分更新と、すべてのまたはいくつかのアセットがロードされるまで待つことの間での選択のオプションも提供される。Ｈ２Ｏによって、サード・パーティ・クラスの動的リンク／アンリンクが可能になる。
【００２５】
放送モードでは、新しいページを開始する時にクリアされない、グローバルなパーマネント・オブジェクトが提供される。パーマネント・オブジェクトがページ間のコンテキストを維持する。サービス・プラットフォームによって提供される他の基本オブジェクトも、推移（たとえばステーション・コントロール（ｓｔａｔｉｏｎ  ｃｏｎｔｒｏｌ）、ＯＳＤなど）の際にパーマネントにされる。ガジェットは、クライアントによって定義されるメソッドである。ガジェットは、新しいガジェットの作成、ガジェットの修正、および本発明のＪＳ２Ｏ  コンパイラ４０００を変更しないメソッドの追加を可能にするインターフェース定義言語を介して定義される。
【００２６】
図５および６に移って、主要なＨ２Ｏ構成要素の説明を以下に示す。Ｈ２Ｏトランスコーダ２００１がＨＴＭＬ入力２０６２をＨ２Ｏトランスコードに変換する。このＨ２Ｏトランスコードは、クライアント・デバイス内、たとえばＯｐｅｎＴＶ  ＳＴＢ内のＨ２Ｏブラウザによって効果的にインタラクティブに表示される。Ｈ２Ｏブラウザは、制限付きダイナミックＨＴＭＬ４の形でＨ２Ｏトランスコードを表示する。ＨＴＴＰプロキシ２００３などのホストがＨ２Ｏトランスコーダ２００１を呼び出す。Ｈ２Ｏトランスコーダ２００１は、非ＨＴＭＬ  ＭＩＭＥタイプのコンテンツ情報について、ＭＩＭＥハンドラ２０３６およびＭＩＭＥ情報２０２８と対話する。ＪＳ２Ｏ  コンパイラ４０００はマルチスレッド・セーフである。Ｈ２Ｏトランスコーダが、Ｈ２Ｏ  ＪａｖａＳｃｒｉｐｔハンドラ２０００を呼び出して、入力としてスクリプトをとり、外部スクリプトまたはクラスＵＲＩを取り出し、ＪＳ２Ｏ  コンパイラを呼び出し、ＪａｖａＳｃｒｉｐｔを事前リンクする。ＪＳハンドラ２０００がＪＳカスタム・クラス２０７０とＪＳ共用スクリプト２０６６を処理する。
【００２７】
図６に移ると、Ｈ２Ｏブラウザ２１００が、ＪａｖａＳｃｒｉｐｔサポートのためにＪＳ２Ｏ  ＪａｖａＳｃｒｉｐｔランタイム２１２９とインターフェースする。Ｈ２Ｏトランスコーダは、タスクとして走行し、ホストＨＴＴＰプロキシを介してＭＩＭＥコンテンツを取り出し、要求に応じてＭＩＭＥコンテンツを処理する。よりよい効率のために、キャッシング機構を処理するインターフェースが、プロキシ・ホストと共に設けられることが好ましい。Ｈ２Ｏトランスコーダは同期して実行する。
【００２８】
Ｈ２Ｏトランスコーダは、ＨＴＭＬ４．０１  Ｗ３標準規格の選択されたサブセットをサポートする。Ｈ２Ｏトランスコーダは、段落、行、句などのテキストのサブセットと、リストのサブセットと、テーブルのサブセットと、リンクのサブセットとをサポートする。Ｈ２Ｏトランスコーダは、Ｏｂｊｅｃｔ要素およびＩｍａｇｅ要素のサブセットもサポートする。Ｈ２Ｏトランスコーダは、フィルタ・オーサリング側オブジェクト（たとえばＩＥ（Ｉｎｔｅｒｎｅｔ  Ｅｘｐｌｏｒｅｒ）カスタム・オブジェクト）もサポートし、ＳＴＢのランタイム・カスタム・オブジェクト、オーサリング側（ＰＣ）とＳＴＢの両方のカスタム・オブジェクト・クラス開発、イメージ・マップのサブセット（クライアント・サイド、サーバ・サイド）、フォームおよびフォーム・コントロールのサブセット、Ｓｃｒｉｐｔ要素、およびＪａｖａＳｃｒｉｐｔのサブセットをサポートする。
【００２９】
Ｈ２Ｏトランスコーダでは、ＨＴＭＬノードが、要素ノード内の一度計算されたＣＳＳ情報を含む。追加のＣＳＳは、存在するとしても非常に限られたものが保存される。これは、ＣＳＳの動的カスケーディング・ルールとは基本的に異なる。スタイル変更が、１つのノードだけに適用されることが好ましいので、動的スタイルは制限される。これは、ＤＯＭを介して特定の要素のスタイルのプロパティを照会し、それによって有効な値が返されると期待するために、スタイル・プロパティ（たとえばｓｔｙｌｅ＝ｃｏｌｏｒ：  ｒｅｄ）が、インライン・スタイルの内部で要素について明示的に指定されるか、ＪａｖａＳｃｒｉｐｔコードで明示的に作成され、ＰＣエミュレーションが同様に振る舞うことを意味する。
【００３０】
本発明では、Ｈ２Ｏ  ＪａｖａＳｃｒｉｐｔハンドラ・タスクを呼び出して、Ｓｃｒｉｐｔ要素データを処理する。ＪａｖａＳｃｒｉｐｔハンドラ・タスクは、スクリプトＵＲＩを取り出し、ＪＳ２Ｏ  ＪａｖａＳｃｒｉｐｔコンパイラを呼び出す。ＪＳ２Ｏは、コンパイルされたＪａｖａＳｃｒｉｐｔコード・モジュールを含むデータ・パッケージを返す。ＪＳ２Ｏは、コンパイルされたＪａｖａＳｃｒｉｐｔスクリプトをキャッシングし、繰り返して、類似するまたは同一のＪａｖａＳｃｒｉｐｔスクリプトと突き合わせる。
【００３１】
本発明では、パーサ・エンジン内部データ・モデルからの、レイアウト情報および制限されたスタイル情報を伴うクライアント互換リソース並びにＪａｖａＳｃｒｉｐｔコードを使用して、Ｈ２Ｏトランスコードを生成する。Ｈ２Ｏトランスコード・フォーマットの全般的な指定には、クライアントまたはＳＴＢのために文書およびＪａｖａＳｃｒｉｐｔコードを表すクライアント互換リソースのトランスコード・セクションが含まれる。トランスコード・フォーマットに、ツリー構造での文書に関する情報が含まれる。このフォーマットは、効率的でコンパクトで拡張可能である。フォーマットはクライアントまたはＳＴＢにおけるコンフォーマンスを保証するバージョン番号を与える。
【００３２】
たとえば、好ましい実施形態では、開発者がカスタム・クラスを作成するために、ＯＴＶオブジェクト・モデル（ＯＯＭ）であるクライアント互換オブジェクト・モデルが提供される。ＯＯＭによって、カスタム・オブジェクト・クラスを開発し、クラスをロード／登録／登録解除／アンロードし、カスタム・オブジェクトを操作するためにクラス・インターフェース・コードにアクセスする機構が提供される。ＯＯＭの設計および実装では、ＪａｖａＳｃｒｉｐｔオブジェクト・モデルを使用して、労力の重複を避ける。ＯＯＭによって、ＪａｖａＳｃｒｉｐｔとＣプログラムの両方がオブジェクトを操作できるようにするインターフェースが提供される。ＨＴＭＬ、ＯＯＭ、およびＣのプログラムは、ＪａｖａＳｃｒｉｐｔなしで機能することができる。本発明は、選択されたネーミング方式を有する軽量クライアント・サイド・クラス・レジストリを提供する。レジストリによって、クラス・モジュールを名前およびルックアップに関連付けることができる。ＯＯＭによって、クラス・モジュールがロードされ、そのモジュールが登録される。クラスに関するインターフェースは１つだけがある。このインターフェースには、メソッドだけが含まれる。各メソッドは、このインターフェースのスコープ内で一意のストリング名に関連する。ＯＯＭによって、機構を参照するクラスおよびＰｒｏｖｉｄｅクラスからオブジェクト・インスタンスを作成する機構が提供される。ＯＯＭは、クラスのアンロードを処理する。ＯＯＭでは、Ｈ２Ｏ  ＨＴＭＬとＪａｖａＳｃｒｉｐｔエンジンの間の制御フローおよびデータ・フローが定義される。ＯＯＭによって、ＪａｖａＳｃｒｉｐｔエンジンのブラウザ・オブジェクトがインスタンス化される。ＯＯＭによって、ＤＯＭオブジェクトのアクセスが、ＪａｖａＳｃｒｉｐｔエンジンに公開される。あるクラスのオブジェクトは、そのメソッド・プロパティがクラス・インターフェースのメソッドであるオブジェクトである。ＯＯＭでは、ビュー構造体、ビュー更新、イベント処理、フォーカス、および共用システム・リソースへのアクセスにカスタム・オブジェクトを統合するＳＤＫ  ＡＰＩのインターフェース、ガイドライン、サブセットが定義される。
【００３３】
コントローラが、ブラウザの挙動および構成要素を指示し、イベントを処理する。このコントローラは、スタートアップ中のビジュアル表示などのさまざまな技法によって達成される、高速スタートアップ時応答を提供する。本発明の好ましいコントローラでは、システム・リソースすなわち、イベント、ダウンロード、ｍｐｅｇ、ｏｓｄ、Ａ／Ｖなどが使用され、データ・モデルおよび視聴が制御される。このコントローラは、生のイベントを処理し、クライアント（好ましくはＯｐｅｎＴＶ）イベント２１４６を処理する。このコントローラは、プリミティブ・オブジェクト・イベントを処理し、このイベントによって、ＤＯＭイベント２１４０および２１３４を生成する。本発明は、ＤＯＭイベント・バブリング２１３８の処理をサポートし、開始ノードとしてフォーカスがあるノードを使用する。ＤＯＭイベントは、ＪａｖａＳｃｒｉｐｔイベント・ハンドラ２１２８コードによって処理することができる。
【００３４】
好ましいコントローラによって、要素クラスが事前に定義され、したがって、好ましいコントローラは、カスタム・クラスより効率的である。コントローラは、ＵＲＩリトリーバを使用して、ＵＲＩコンテンツを入手し、ＨＴＴＰ：  ｇｅｔ  ａｎｄ  ｐｏｓｔ  （ｆｏｒｍ  ｐｏｓｔ）要求を行い、応答を入手し、文書のオープン機能および後退／前進機能を提供する。好ましい実施形態では、データ・モデルが、主に、ランタイムＨＴＭＬ  ＤＯＭおよびランタイム・データ・モデルの他のカテゴリである。ＨＴＭＬ  ＤＯＭには、所期の効果を反映する視聴情報も含まれる。
【００３５】
視聴では、異なるカラー・スタイルがサポートされることが好ましく、カラー・テーブルが共用リソースとして扱われる。好ましい実施形態では、ＭＩＭＥタイプ・ハンドラの制限された組が、メモリを節約するために、構成に応じて提供される。ＰＣ環境用の人気のあるＨＴＭＬブラウザでは、通常は、ＪａｖａＳｃｒｉｐｔランタイムが操作するために、ブラウザ固有のホスト・オブジェクトが公開される。本発明では、ＪａｖａＳｃｒｉｐｔランタイム用のＭｉｃｒｏｓｏｆｔ  Ｉｎｔｅｒｎｅｔ  Ｅｘｐｌｏｒｅｒ  ５（ＩＥ５）ホスト・オブジェクトのサブセットがサポートされる。
【００３６】
本発明は、Ｈ２Ｏ  ＪａｖａＳｃｒｉｐｔタイプ・ハンドラ（ＪＳハンドラ）を呼び出す。ＪＳハンドラは、要素ツリーをトラバースして、ＪａｖａＳｃｒｉｐｔグローバル・コード、関数、外部スクリプトへのリンク参照、オブジェクト・クラス・リンク参照、およびホスト・コードを集める（イベント・ハンドラ属性から）。Ｈ２Ｏは、Ｈ２Ｏ  ＪａｖａＳｃｒｉｐｔハンドラを呼び出し、このコレクションを渡す。ＪａｖａＳｃｒｉｐｔハンドラ・タスクは、スクリプトおよびクラスＭＩＭＥコンテンツを取り出し、ＪＳ２Ｏ  ＪａｖａＳｃｒｉｐｔコンパイラを呼び出し、このコンパイラは、コンパイルされたＪａｖａＳｃｒｉｐｔコードを含むクライアント互換コード・モジュールを返す。スクリプト・コレクションは、コードへハンドルを戻し返す。この関数は、ソフトウェア付録に示されているように呼び出される。
【００３７】
トランスコーダは、要素ノード・ツリーをトラバースし、内部クライアント互換リソース・ジェネレータを使用して、クライアント互換性、たとえばＯＴＶ  Ｈ２Ｏトランスコードを生成する。本発明では、構成要素、ディスプレイ、スタートアップなどが構成される。静的構成および動的構成は、コンパイル時に静的に判定される。
【００３８】
図７および８に移る。ＪＳ２Ｏ  コンパイラ３９０４は、Ｈ２Ｏ  ３９００エンジンとインターフェース３９０２して、ＪＳコードをクライアント互換コード・モジュール３９０６、好ましくはＯｐｅｎＴＶ  ｏｃｏｄｅモジュールにコンパイルする。ＪＳコンパイラ４０００は、下で説明するＣ／Ｃ＋＋  ＡＰＩを使用してＨ２Ｏエンジンとインターフェースする。ＪＳ２Ｏ  コンパイラは再入可能であり、ＪＳ２Ｏページ要素コンパイラ４００２、ＪＳ２Ｏキャッシュ４００４、ＪＳ２Ｏフロント・エンド４００６、ＪＳ２Ｏバックエンド４００８、Ｏｃｏｄｅバイナリ・アセンブラ４０１０、およびコード・モジュール・ジェネレータ４０１２という構成要素に分割される。すべてのコンパイラ構成要素が再入可能であり、互いにデータを渡すのにメモリ・バッファを使用する。
【００３９】
図８に移り、図５も参照すると、Ｈ２Ｏフィルタ２０６４は、着信ＨＴＭＬページ２０６２から着信ＪａｖａＳｃｒｉｐｔを抽出し、それらをページ要素コンパイラ４００２に送って、単一の表示ページ内で集約させる。Ｈ２Ｏは、放送リンクおよびオンライン接続の両方からＨＴＭＬページを受け取る。ページ要素コンパイラ４００２は、Ｈ２Ｏ  ２０３０からＪＳ要素を受け取り（ＨＴＭＬページから来る）、ＨＴＭＬページに関するすべての要素を内部でＪＳコードの単一のブロックに集め、ＪＳコンパイラ４０００を呼び出して、ＪＳページをコード・モジュールにコンパイルする。ＪＳページは、１つまたは複数のＨＴＭＬページからのすべてのＪＳコードの集約である。Ｈ２ＯとＪＳ２０ページ要素コンパイラの間のインターフェース３９０２および３９０６を、下で説明する。
【００４０】
ＪＳ２Ｏの任意選択のキャッシュ４００４は、１つのＪＳページを受け取り、そのページを、他のキャッシングされたコンパイルされたページと比較する。キャッシングされている場合には、キャッシングされたページが使用される。まだキャッシングされていない場合には、ＪＳ２０は、ＪＳコンパイラ４００６を呼び出す。キャッシングは、最後の１００個のコンパイルされたページについて実行されることが好ましい。すべてのＪＳ２０コンパイラ・スレッドが、キャッシュを共用し、したがって、キャッシュへのアクセスが保護される。ＪＳ２Ｏ  コンパイラ・フロント・エンド４００６は、ＪＳコードを、まず中間フォーマットにコンパイルし、その後、ＪＳ２０用の固有のコード・ジェネレータ４０１２を使用してクライアント互換コード・モジュールにコンパイルする。
【００４１】
ＪＳコンパイラ・バック・エンド４００８は、ＪＳページ全体を、事前に解析され事前にコンパイルされたツリーとして受け取る。ＪＳコンパイラ・バック・エンドは、クライアント互換オペコード、たとえばＯｃｏｄｅオペコードを、バイナリ・アセンブラ４０１０からの出力を使用してバイナリ・フォーマットで直接生成する。ＪＳコンパイラ・バック・エンドは、コード・モジュール・ジェネレータ４０１２でクライアント互換コード・モジュールを生成する。クライアント互換バイナリ・アセンブラ４０１０、たとえばＯｃｏｄｅ（ＯＴＶに固有の）バイナリ・アセンブラは、クライアント互換バイナリ・オペコードを生成するＡＰＩを提供する。このアセンブラは、ＪＳコンパイラが必要とするオペコードをサポートする。
【００４２】
本発明は、あるオプションが指定される時に、ソース・アセンブリ・ファイルも作成する。このファイルには、すべてのデバッグ情報（．ｓｔａｂ）と、バイナリ・コンパイラと正確に同一のコード／データが含まれる。このアセンブリ・ファイルは、ＪＳページ・ソース・コードをデバッグしたい人が別にコンパイルすることができる。コード・モジュール・ジェネレータ４０１２は、バイナリ・オペコードを入力し、クライアント互換コード・モジュール４１０２を出力するＡＰＩを提供する。
【００４３】
本発明は、メタ情報を保持するクライアント互換モジュール・ヘッダ（メモリ内の）も生成することが好ましい。ＪＳ２Ｏ  コンパイラは、ＪＳコンパイラのテストおよび受け入れを可能にし、クライアント互換Ｏｃｏｄｅジェネレータおよびページ要素コンパイラ４００２のテストを可能にする。図９に移ると、オペレーションの１つのモードで、ＪＳ２Ｏコマンド・ライン・コンパイラ４１００は、入力としてＪＳソース・ファイルをとり、クライアント互換Ｏｃｏｄｅアセンブリ・ファイル４１１２を出力する単純なコマンド・ライン・インターフェースとして動作する。ＪＳ２Ｏ  コンパイラは、任意選択として、外部オブジェクト・クラス定義も入力することができる。
【００４４】
コマンド・ライン・インターフェース４１０４は、Ｈ２Ｏと同一のＡＰＩすなわち、（ＪＳ２Ｏ  ＦＦＳで定義されるｊｓ２ｏ＿ｃｏｍｐｉｌｅ．．．ＡＰＩ）を用いてＪＳ２Ｏページ要素コンパイラ４００２と通信する。下記のオプションが、コマンド・ラインＪＳ２Ｏ  コンパイラについて使用可能である。
Ｊｓ２ｏ−ｇ−Ｏ−ｉ  ｉｎｐｕｔｆｉｌｅ−ｏ  ｏｕｔｐｕｔｆｉｌｅ−ｃ  ｃｌａｓｓｍｏｄｕｌｅ−ｐ  ｎａｍｅ  ｃｌａｓｓｍｏｄｕｌｅ−ｉ：入力ファイル、−ｏ：出力ファイル、−ｇ：デバッグ情報を生成する、−Ｏ：最適化、−ｃ：外部オブジェクト・クラスを定義する、「ｃｌａｓｓｍｏｄｕｌｅ」は、特殊ヘッダ情報を有するクライアント互換コード・モジュールである、−ｐ：「ｎａｍｅ」という名前で「ｃｌａｓｓｍｏｄｕｌｅ」コード・モジュールによって定義されるクラスの事前定義のオブジェクトを定義する。
【００４５】
出力ファイルは、クライアント互換コンパイラ、たとえばＯｐｅｎＴＶ  Ｓｏｆｔｗａｒｅ  Ｄｅｖｅｌｏｐｍｅｎｔ  Ｋｉｔ（ＳＤＫ＃）のＯｃｏｄｅアセンブラを用いて、またはＣコンパイラ・フロント・エンド（たとえばｇｃｃｏ）を用いてコンパイルされる。Ｏｃｏｄｅバイナリ・アセンブラおよびコード・モジュール・ジェネレータは、同一のバイナリ・オブジェクト・フォーマットで動作する。ＳＤＫツールは、ｏｃｏｄｅオブジェクト・ファイルについて「ａ．ｏｕｔ」フォーマットを提供する。
【００４６】
Ｈ２Ｏランタイム４２０２およびＪＳ２Ｏランタイム４２０４は、同一のクライアント互換コード・モジュールの一部とすることができる。好ましい実施形態では、事前定義のクラス・モジュール４２００が、組込みのＯＯＭオブジェクト・クラスおよびＤＯＭオブジェクト・クラスのコードである。ＪＳ２Ｏランタイムには、組込みＪＳクラスが含まれる。ＪＳ２Ｏ  コンパイラ４０００は、ＪＳメイン・コード・モジュール４２０６およびＪＳ外部コード・モジュール４２０８を生成する。外部クラス・モジュール４２１０および他のモジュールは、Ｃモジュールであることが好ましい。
【００４７】
ＪＳ２Ｏは、すべてのＪＳコンパイル済みコード・モジュールとリンクするクライアント互換ライブラリ、たとえばＯｃｏｄｅライブラリを提供する。このライブラリは、小さい関数からなる。大きい関数は、ＪＳ２Ｏランタイム・モジュールに保管される。たとえば、「２つの整数を加算する」関数は、Ｏｃｏｄｅライブラリにあるが、すべての型の「汎用の加算」関数は、ＪＳランタイム・モジュールにある。
【００４８】
スタックにプッシュされるすべての値が、ガーベジ・コレクションの便宜のためにｊｓ２ｏ型であることが好ましい。いくつかの場合に、ガーベジ・コレクションが発生する前に確実に値がポップされる時に、非ｊｓ２ｏ値をプッシュすることが可能である。これは、ソフトウェア付録に示されているように、コンパイラがアトミック命令の組を出力する時にも真である。
【００４９】
ガーベジ・コレクション
ガーベジ・コレクタ（ＧＣ）は、ＪＳ２Ｏの動的なオブジェクトとストリングのメモリ割振りを管理する。ＧＣは、新しいページが開始されるたびに、新たに開始される（前に割り振られたメモリのすべてが、破棄されることが好ましい）。ＧＣでは、マーク・アンド・スイープ・アルゴリズムが使用される。マーク値は、新しいガーベジ・コレクションが開始されるたびに１つ増分される。したがって、ＧＣが、マークをクリアする第２パスを必要としない。
【００５０】
ＪＳ２Ｏランタイム・エンジンは、オブジェクトとストリングを動的に作成する。これらが、ガーベジ・コレクションの対象である。動的に作成されるオブジェクトとストリングは、（ローカルまたはグローバル）変数を介して、スタック内ではテンポラル値、オブジェクト・プロパティを介して参照される。マーク・アンド・スイープ・アルゴリズムは、これらのすべてを処理して、使用されている項目をマークしなければならない。
【００５１】
ページ持続オブジェクトは、これらの、複数のページにまたがって生存するオブジェクトである。ページ持続オブジェクトは、モジュールがリンクされていない時のページ切替時の問題を避けるために、（オブジェクトまたはストリングまたは他の）ＪＳ値への参照を保持しないことが好ましい。ページ持続オブジェクトは、データのそれ自体のコピーを作ることが好ましい。
【００５２】
図１１および図１２に移ると、ページ内で使用されるＪＳグローバル変数と、あるページで参照されるオブジェクト（事前定義オブジェクトでも）は、ＪＳコード・メイン・コード・モジュールのデータ・セグメント４３００内でスロットを割り振られる（コンパイル時に）。ローカル変数およびパラメータのそれぞれが、実行スタック内に１つのスロットを有する。コンパイラは、スタック内に、中間値または「テンポラル値」も生成する。マーク・アルゴリズムは、これらのスロットのすべてを調べ、動的なオブジェクトとストリングのすべてをマークすると同時に、オブジェクトのいずれかのプロパティで参照されるオブジェクトとストリングのすべてを再帰的にマークする。
【００５３】
ガーベジ・コレクタは、たとえば下記のＡＰＩを提供する。
ｖｏｉｄ  ｊｓ２ｏ＿ｍａｒｋ＿ｖａｌ（ｊｓ２ｏ＿ｖａｌ  ｊｓｖａｌ，ｉｎｔ  ｍａｒｋｖａｌｕｅ）；
ｖｏｉｄ  ｊｓ２ｏ＿ｇｃ＿ｍａｒｋ（ｉｎｔ＊ｊｓ２ｏ＿ｆｐ，ｉｎｔ＊ｊｓ２ｏ＿ｓｐ，ｉｎｔ＊ｊｓ２ｏ＿ｆｉｒｓｔ＿ｆｐ，ｉｎｔ  ｍａｒｋｖａｌｕｅ）
【００５４】
ｊｓ２ｏ＿ｍａｒｋ＿ｖａｌ関数は、ｊｓ２ｏ値を指定された値でマークする。この関数は、値がオブジェクトである場合にオブジェクトのＭａｒｋＰｒｏｐｅｒｔｉｅｓ  ｖｔａｂｌｅ関数の呼出しを処理し、プロトタイプ値があれば、それにマークすることを処理する。ｊｓ２ｏ＿ｇｃ＿ｍａｒｋ関数は、すべてのＪＳグローバルおよびすべてのＪＳコールスタックを調べ、図１２に示されている、テンポラル値、ローカル、引数、およびグローバルのすべてをマークする。ＧＣは、「引数の個数」スロットも検査するが、これはｊｓ２ｏ＿ｉｎｔ型なので、ＧＣでの相違は生じない。
【００５５】
本発明は、動的プロパティを単一のストリングに保管する汎用ＡＰＩを提供する。このＡＰＩには、プロパティの名前およびインデックスへの高速アクセスのために、ストリング内のプロパティ名およびプロパティ・インデックスが含まれる。このコードでは、２５５個というプロパティの最大個数と、１２７バイトというプロパティ名の最大長さ（最後の０の文字を含まない）が前提になっている。
【００５６】
各プロパティ名は、「Ｎ−ｎａｍｅ／」というフォーマットで単一のストリングの中に保管され、ここで、Ｎは、単一のバイトであり、インデックス・プロパティ番号＋１を保持する。ｎａｍｅは、プロパティ名自体である。このフォーマットでは、「／」および「−」が、名前には許可されない文字であることが前提である。Ｎには、１から２５５までのインデックスが含まれる。文字「／」および「−」は、有効な名前および数に使用されない任意の文字に置換することができる。
【００５７】
下記の関数では、プロパティ名に、指定された値がセットされる。プロパティが存在しない場合には、そのプロパティが追加される。
ｖｏｉｄ  ｐｒｏｐ＿ｓｅｔ（ｊｓ２０＿ｐｒｏｐ＊ｐｒｏｐ，ｃｈａｒ＊ｎａｍｅ，ｊｓ２ｏ＿ｖａｌ  ｖａｌ）；
【００５８】
下記の関数では、名前を指定されたプロパティが取得される。プロパティが存在しない場合には、この関数はＪＳ２Ｏ＿ＮＵＬＬを返す。
Ｊｓ２ｏ＿ｖａｌ  ｐｒｏｐ＿ｇｅｔ（Ｊｓ２ｏ＿ｐｒｏｐ＊ｐｒｏｐ，ｃｈａｒ＊ｎａｍｅ）；
【００５９】
下記の関数では、名前を指定されたプロパティが削除される。プロパティが存在しない場合には、この関数は何もしない。
ｖｏｉｄ  ｐｒｏｐ＿ｒｅｍｏｖｅ（ｊｓ２ｏ＿ｐｒｏｐ＊ｐｒｏｐ，ｃｈａｒ＊ｎａｍｅ）；
【００６０】
下記の関数では、インデックス（０からｎまで）を指定されたプロパティの名前が取得される。この関数は、インデックスが存在しない場合にＪＳ２Ｏ＿ＮＵＬＬを返す。この関数では、０から始まる連続するインデックス番号を用いて呼び出されることが前提になっている。
ｊｓ２ｏ−ｖａｌ  ｐｒｏｐ−ｉｎｄｅｘ＿ｇｅｔ＿ｎａｍｅ（ｊｓ２ｏ＿ｐｒｏｐ＊ｐｒｏｐ，ｉｎｔ  ｉｎｄｅｘ）
【００６１】
下記の関数は、指定されたマーカー値を用いてすべてのプロパティをマークし、ガーベジ・コレクションに使用される。
ｖｏｉｄ  ｐｒｏｐ＿ｍａｒｋ（ｊｓ２ｏ＿ｐｒｏｐ＊ｐｒｏｐ，ｉｎｔ  ｍａｒｋｖａｌｕｅ）；
【００６２】
下記の関数では、このプロパティ・リストによって内部的に使用されていたすべてのメモリが解放される。
ｖｏｉｄ  ｐｒｏｐ＿ｆｒｅｅ（ｊｓ２ｏ＿ｐｒｏｐ＊ｐｒｏｐ）
【００６３】
ｊｓ２ｏランタイムは、下記のＡＰＩを提供する。
ｊｓ２ｏ＿ｏｂｊ＊ｊｓ２ｏ＿ｆｕｎｃｏｂｊ＿ｃｒｅａｔｅ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｖｏｉｄ＊ｆｕｎｃ）；
【００６４】
この関数は、指定された「ｔｈｉｓ」ポインタおよび関数アドレスを有する関数オブジェクトを作成する。この関数が呼び出されるたびに、指定された「ｔｈｉｓ」ポインタが第１パラメータとして渡される。
【００６５】
ｖｏｉｄ  ｊｓ２ｏ＿ｆｕｎｃｏｂｊ＿ｄｅｌｅｔｅ（ｊｓ２ｏ＿ｏｂｊ＊ｏｂｊｆ）；
この関数は、関数オブジェクトを削除する。この関数は、実際には関数オブジェクトを削除しない。削除は、後に、この関数を削除するものがなくなった場合に、ガーベジ・コレクションによって行われる。この関数は、オブジェクトをｎｕｌｌ値にリセットし、その結果、このオブジェクトにアクセスしても安全にする（任意選択として、ランタイム警告またはエラーを生成するが、存在しないコードを実行しようとしてもクラッシュしない）。
【００６６】
ｖｏｉｄ  ｊｓ２ｏ＿ｔｏ＿ｎｕｌｌ＿ｏｂｊｅｃｔ（ｊｓ２ｏ＿ｏｂｊ＊ｏｂｊ，ｓｉｚｅ＿ｔ  ｓｉｚｅ）；
この関数は、既存のオブジェクトをＪＳ２Ｏ＿ＮＵＬＬ＿ＯＢＪＥＣＴ型のオブジェクトに変更するのに使用される。ｓｉｚｅによって、元のオブジェクトが、ｎｕｌｌオブジェクトに変換されるのに十分に大きいことが保証される。この関数は、ある変数によって参照されている可能性があるオブジェクトを安全に「除去」するのにも使用することができる。
【００６７】
ｊｓ２ｏ＿ｖａｌ  ｊｓ２ｏ＿ｄｓｔｒ＿ｃｒｅａｔｅ（ｃｈａｒ＊ｓｔｒ）；
この関数は、指定されたストリングｃｈａｒを有するＪＳ２Ｏストリング型を作成する。この関数では、ストリングがコピーされる。
【００６８】
ｊｓ２ｏ＿ｖａｌ  ｊｓ２ｏ＿ｄｓｔｒ＿ｃｒｅａｔｅ＿ｓｔａｔｉｃ（ｃｈａｒ＊ｓｔｒ）；
この関数は、指定されたストリングｃｈａｒを有するＪＳ２Ｏストリング型を作成する。この関数では、ストリングはコピーされない。ｓｔｒポインタが有効であることが前提である。
【００６９】
ＪＳ２ＯのＪａｖａＳｃｒｉｐｔ言語は、ＥＣＭＡＳｃｒｉｐｔ  Ｌａｎｇｕａｇｅ  ＥＣＭＡ−２６２のサブセットである。ＪＳ２Ｏのサポートされないいくつかのフィーチャがクライアント・デバイスでのコンパイルを必要とするものである。他のフィーチャのサポート考慮事項は、コンパイラ最適化の可能性を含むランタイム速度、ランタイム・サイズ、およびＳＴＢ／クライアント・デバイス環境での有用性である。下記のＪＳフィーチャは、好ましい実施形態の現在の例のＪＳ２Ｏでサポートされない。
【００７０】
ＲｅｇＥｘｐクラス、Ｅｖａｌ関数、入れ子になった関数定義、Ｃａｌｌオブジェクト、Ａｒｇｕｍｅｎｔオブジェクト、「ｗｉｔｈ」ステートメント、動的引数または本体を有する関数コンストラクタ、Ｗａｔｃｈ／ｕｎｗａｔｃｈメソッド、＿ｐａｒｅｎｔ＿ａｎｄ＿ｐｒｏｔｏ＿（Ｎａｖｉｇａｔｏｒフィーチャ）、ＩｍｐｌｉｃｉｔＴｈｉｓ属性、ＩｍｐｌｉｃｉｔＰａｒｅｎｔｓ属性、Ｔｒｙ／Ｃａｔｃｈ／Ｔｈｒｏｗステートメントおよびすべてのエラー・オブジェクト、事前定義のＪＳオブジェクトの他の選択されたメソッドおよびプロパティ。
【００７１】
好ましい実施形態では、ＪＳ２Ｏで下記の制限が実装されるが、望みに応じて異なるパラメータ値または制限値を選択することができる。プロパティ名最大長：１２７バイト（最後のヌル文字を含まない）；単一のオブジェクトごとのプロパティの最大個数：２５５個；整数値は２９ビット符号付き（−２６８４３５４５６から＃＋２６８４３５４５５）；および、Ｆｌｏａｔ値は３１ビット。
【００７２】
コンストラクタの戻り値（ある場合に）は、コンストラクタが異なるオブジェクトを返さない場合に破棄される。動的オブジェクトは、事前定義のオブジェクトより優先されない。これらの事前定義オブジェクトの名前は予約済みの単語である。静的に定義された関数より、他の関数を優先させることはできない（これらのメソッドが、グローバル・オブジェクトの読取専用プロパティであることを意味する）。限られた組の名前が予約済みである。アンダースコア・プレフィックスの有無を問わずに、ＪＳ２Ｏから始まるすべての名前が予約済みである。事前定義のグローバル関数など、一部の関数はＪＳオブジェクトとしてアクセス可能でない。
【００７３】
ＪＳ２Ｏスクリプトのランタイム実行は下記の好ましい挙動を有する。例外処理：ランタイム・エラーは、何もしない、ＪＳ実行を停止させる、またはページレンダリングを停止させる、のいずれかである。計算オーバーフロー：ランタイムは、整数のオーバーフローをテストしない。
【００７４】
下記のＪＳオブジェクトは、ＪＳ２Ｏによってサポートされる。
Ｏｂｊｅｃｔ、Ｍａｔｈ、Ｓｔｒｉｎｇ、Ｎｕｍｂｅｒ、Ｂｏｏｌｅａｎ、Ａｒｒａｙ、およびＦｕｎｃｔｉｏｎ。ＪＳ２Ｏには、ＯＳＤ、チャネルなど、事前定義のクライアント互換の特定のオブジェクトのサポートが含まれる。ウィンドウ・オブジェクトは、それ自体がオブジェクトであるプロパティ「ｅｖｅｎｔ」、「ｄｏｃｕｍｅｎｔ」、および「ｎａｖｉｇａｔｏｒ」を有する。ウィンドウ・オブジェクトは多数のメソッド（たとえばｂａｃｋ（））を有する。ウィンドウ・オブジェクトのプロパティおよびメソッドのすべてが直接アクセス可能である。
【００７５】
Ｈ２Ｏ（ＨＴＭＬからたとえばＯｃｏｄｅなどのクライアント互換コードへ）エンジンは、複数のＨＴＭＬページを、たとえばＯｐｅｎＴＶフォーマットなどのクライアント互換フォーマットイン並列に変換する。再入可能ＪＳコンパイラを有することによって、インターフェースが単純になり、性能が改善される。コンパイラは、再入可能であり、できる限り多数の最適化を実行するために、コンパイラは、単一のＨＴＭＬページからのすべてのＪＳコードを、１回のコンパイルでコンパイルする。
【００７６】
ＪＳ２Ｏおよび他の機能性に関する最適化を実行するために、コンパイラは、下記のフィーチャを備える：コンパイラは、サポートされないフィーチャおよび制限に関する特定のエラー・メッセージを与え、コード生成を開始する前にファイル全体を解析する（具体的には、その定義の前に呼び出される関数について必要）。関数へのコンパイラ参照では、現在のコンパイルで定義される関数、グローバルに定義される関数、およびそれ以外の関数を区別することが好ましい。
【００７７】
関数オブジェクト：オブジェクトへのアクセスまたは関数への呼出しを区別するために、変数への参照を、ローカル変数、グローバル変数、および他の変数へのアクセスとして区別する。コンパイラは、名前が既知の関数または既知の変数のどちらを参照するかに関する判定を可能にする。デバッグ・メッセージをオンまたはオフにするデバッグ・オプションを設けることが好ましい。最適化オプションを設けて、さまざまなコンパイル最適化をオンまたはオフにする。コンパイラは、関数呼出しの引数が欠けている場合に警告を発行する。
【００７８】
変数の型：いくつかの場合に、コンパイラは、使用される変数の型を知る。コンパイラは、コード内の変数の型を維持する。型が、「未知」になる可能性もある。コンパイラは、メタ・データ（ソース・ファイル、行番号など）を維持し、その結果、コード・ジェネレータが、プログラムおよびデータに関するデバッグ情報を出力できるようにする。具体的に言うと、コンパイラは、下記の要素への静的にコンパイルされるアクセスを提供する：ローカル変数、グローバル変数（現在のコンパイルで定義される）、関数（現在のコンパイルで定義される）、および事前定義のオブジェクトおよびそのプロパティ。コンパイラは、事前定義のオブジェクト定義をインポートするインターフェースを提供する。ＪＳ関数の内部に「ブロック・スコープ」がある（関数内で定義されるすべてのローカル変数は、どこで宣言されるかに無関係に、その関数全体を通じて有効である）ので、コンパイラは、関数プロローグの内側のすべてのローカル変数のための空間を予約することに留意されたい。デフォルトでは、すべての変数が、値ＪＳ２Ｏ＿ＵＮＤＥＦＩＮＥＤを有する。コンパイラ・プロローグによって、すべてのローカル変数の値がセットされる。すべての「初期化されない」グローバル変数に、その値がセットされる。
【００７９】
ＪＳ２Ｏ  コンパイラは、ソフトウェア付録に示されているように、Ｈ２ＯパーサにＡＰＩを提供する。
【００８０】
このＡＰＩは、マルチスレッド・セーフである。これらのＡＰＩが呼び出される順序は、秩序だったコード生成を保証するために、明らかに重要である。
【００８１】
メソッド「ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｃｒｅａｔｅ」によって、コンパイル・ハンドラが作成される。ファイル名はＪａｖａＳｃｒｉｐｔソース・ファイルの名前である。このファイル名はエラー・メッセージだけに使用される。コンパイルされるオプションは、コンパイラ用（たとえば、最適化、外部ファイル、デバッグなど）である。この関数は、エラーの場合にＮＵＬＬを返す。メソッド「ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｄｅｓｔｒｏｙ」は、ハンドルを破壊し、すべての関連するメモリを解放する。メソッド「ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｇｅｎｅｒａｔｅ」は、登録されたすべてのものの１つのコンパイルされるチャンクへの実際のコンパイルを実行する。この後には、ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｅｒｒｏｒ＿ｍｓｇまたはｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｄｅｓｔｒｏｙだけを呼び出さなければならない。コンパイルされるデータに、Ｏｐｅｎ  ＴＶコード・モジュール（バイナリ・フォーマットの）が含まれることが好ましい。メソッド「ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｅｒｒｏｒ＿ｍｓｇ」は、ｓｔｄｅｒｒでのｆｐｒｉｎｔｆに適する最新のエラー・メッセージを返す。このエラー・メッセージは、ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｄｅｓｔｒｏｙへの呼出しの後に解放される。
【００８２】
メソッド「ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｗａｒｎｉｎｇ＿ｃａｌｌｂａｃｋ」では、警告メッセージのコールバック関数が登録される。「ｃａｌｌｂａｃｋ」はコールバック関数へのポインタであり、「ｄａｔａ」は値であり、この値がコールバック関数に渡される。コールバック関数のプロトタイプは「ｖｏｉｄ  ｆｕｎｃ（ｖｏｉｄ＊ｄａｔａ，ｃｈａｒ＊ｍｓｇ，ｊｓ２ｏ＿ｈａｎｄｌｅ  ｊｈ）」である。警告メッセージは、コールバック呼出しの後に破壊される。コールバックを除去するには、ヌルのコールバックを登録する。デフォルトでは、コールバック関数がない。
【００８３】
メソッド「ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｓｒｃ」では、コンパイルにテキスト・コードが追加され、「ｌｉｎｅｎｕｍ」は、このコードの最初の行の行番号であり、これは、ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｃｒｅａｔｅで指定されたファイルからのものであると仮定される。ハンドル・パラメータは、イベントハンドラ・コードに使用され、その場合に、ハンドルは、ハンドル値を返すのに使用されるポインタである。このハンドル値は、ランタイムに、このコードを実行するのに使用されることが好ましい（ｊｓ２ｏ＿ｅｘｅｃｕｔｅも参照されたい）。他の場合、すなわちイベント・ハンドラでない場合に、このハンドルはヌルである。この関数では、コードの内部コピーが維持される。
【００８４】
最適化：同一のコードを使用する複数のイベントハンドラについて、ｊｓ２ｏは、ハンドラ・コードの１つのインスタンスを生成する。このコードは、元のソース・コードからのすべてのニューライン（＼ｎ文字）を有し、その結果、行番号が意味を有するようにすることが好ましい。
【００８５】
メソッド「ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｂｉｎ」には、事前コンパイルされたｊｓ２ｏファイルが含まれる。事前コンパイルされたファイル内のすべてのグローバル・ステートメントが、ランタイムにこの場所で実行される。名前は、ＪＳ２Ｏによって、ランタイムに外部モジュールを突き止めるのに使用される。同一のファイルが、１つのＨＴＭＬページの複数の場所に含まれる場合には、このＡＰＩが、同一の名前を用いてそのたびに呼び出されることが好ましい。モジュールは、クライアント互換コード、たとえばＯｐｅｎ  ＴＶコード・モジュール（ヘッダを含む）をポイントする。
【００８６】
メソッド「ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｏｂｊ」は使用可能な事前定義のオブジェクトを定義する。「ｏｂｊｎａｍｅ」はオブジェクトの名前である。クラスは、「ｃｌａｓｓｍｏｄｕｌｅ」によってポイントされるクライアント互換コード、たとえば．ｏｔｖモジュール（ヘッダを含む）によって定義される。モジュールは、ランタイムにＪＳ２Ｏによって参照されない（オブジェクトは、Ｈ２Ｏによって作成される）。このＡＰＩで、ＪＳソース・コードからアクセス可能な新しいクラスが定義されないことに留意されたい。
【００８７】
メソッド「ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｃｌａｓｓ」は使用可能な事前定義のクラスを定義する。クラスは、ｃｌａｓｓｍｏｄｕｌｅによってポイントされるクライアント互換コード、たとえば．ｏｔｖモジュールによって定義される。クラス名（「ｎｅｗ」ＪＳステートメントで使用される）も、モジュールの内部（モジュール・ヘッダ）で指定される。クラス名は、ランタイムに、このクラスの関数コンストラクタを得るためにＪＳ２Ｏによって使用される。
【００８８】
メソッド「ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｅｌｅｍｅｎｔ」では、新しいＤＯＭ要素を定義する。これによって、指定された名前を有するグローバル変数が追加される。この関数は、変数ハンドルを返す。このハンドルは、ランタイムに、そのオブジェクトのアドレスを初期化するためにＨ２Ｏによって使用される。外部ＪａｖａＳｃｒｉｐｔソース・ファイルをＨＴＭＬページに含めることができる。Ｈ２Ｏは、このＪＳソース・ファイルをＨＴＭＬページ自体をコンパイルする前にコンパイルする。Ｈ２Ｏが最終的にｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｂｉｎ  ＡＰＩに渡すもの（ＨＴＭＬページ内のＪＳコードのコンパイルに関して）は、既にコンパイルされたＪＳファイルである。外部ソース・ファイルをコンパイルするために、Ｈ２Ｏエンジンは、「ａ  ｓｐｅｃｉａｌ  ｏｐｔｉｏｎ「ｅｘｔｅｒｎａｌ  ｒｅｆ」ｉｓ  ｕｓｅｄ  ｉｎ  ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｃｒｅａｔｅ（ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｃｒｅａｔｅで特殊なオプション「ｅｘｔｅｒｎａｌ  ｒｅｆ」が使用された）」という警告と共にｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ＡＰＩを呼び出す。このＡＰＩには、外部ファイルが含まれない（ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｂｉｎへの呼出しがない）。
【００８９】
ＪＳ２Ｏ  コンパイラは、前にコンパイルされたＪＳページ、たとえば最後の１００ページのキャッシュ（メモリ内）を維持することが好ましい。キャッシングは、ＪＳ２Ｏの内部で実行される。というのは、いくつかのページが、異なるＨＴＭＬを有するが、同一のＪＳスクリプトがそのＨＴＭＬに組み込まれているからである。したがって、本発明は、ＪＳ２Ｏ内部のそのようなＪＳコードのコンパイルをキャッシングする。ここで、ＪＳページは、単に、１つのＨＴＭＬページからのすべてのＪＳコードの集約である。Ｈ２Ｏ内部のｈｔｔｐプロキシでもキャッシングが実施されることに留意されたい。ＪＳページをキャッシングすることによって、複数の表示ページの間での共通するＪＳの使用が可能になる。これによって、ＳＴＢまたはクライアントに送る必要があるデータの量が減る。
【００９０】
ＪＳコードは、クライアント互換コード・モジュール、たとえばＯｐｅｎ  ＴＶコード・モジュールの内部でカプセル化される。ＨＴＭＬ＋ＪＳの場合に、クライアント互換コード・モジュール、たとえばＯｐｅｎ  ＴＶコード・モジュールが、Ｈ２Ｏリソースの内部に組み込まれる（「ｂｉｇ  ｃｈａｒ」配列として）ことが好ましい。コード・モジュール・フォーマットは、ソース・コード・デバッグができるようになっている。コンパイラは、デバッグ情報を．ｏｄｂファイルに出力する。しかし、デバッガが、ＪＳ２Ｏの型を知らないことに留意されたい。サポートが、ＪＳ２Ｏの型についてｇｄｂｏ内で提供されることが好ましい。ＪａｖａＳｃｒｉｐｔコードは、複数の形でＨＴＭＬページの内部で使用され、ＪａｖａＳｃｒｉｐｔコードを、１つまたは複数の＜ＳＣＲＩＰＴ＞＜／ＳＣＲＩＰＴ＞タグを使用してＨＴＭＬページの内部に組み込むことができる。構文は、＜ＳＣＲＩＰＴ  ＬＡＮＧＵＡＧＥ＝”ＪａｖａＳｃｒｉｐｔ”＞ＪａｖａＳｃｒｉｐｔステートメント．．．＜／ＳＣＲＩＰＴ＞であることが好ましい。
【００９１】
ページのインライン・コードおよびイベントハンドラのすべてが、単一のメイン・クライアント互換の、たとえばＯｐｅｎ  ＴＶモジュールにコンパイルされる。Ｈ２ＯおよびＪＳ２Ｏは、外部ＪａｖａＳｃｒｉｐｔファイルへの参照をサポートする。Ｈ２Ｏでは、性能を強化するために、外部ＪＳソース・ファイルが、コンパイルされ、保管され、別々にロードされる。これによって、このファイルが多数のページで使用される場合であっても、単独のコードを送ることが可能になる。同一のファイルを単一のＨＴＭＬページに含めることが許容される。Ｊ２Ｏでは、メインＪＳコードをコンパイルする前に、外部ＪＳファイルを事前コンパイルする。外部ファイルは、ＤＬＬクライアント互換、たとえばＯｐｅｎ  ＴＶモジュールにコンパイルされる。対応するＨＴＭＬ構文は：＜ＳＣＲＩＰＴ  ＳＲＣ＝”ＵＲＩ”ＬＡＮＧＵＡＧＥ＝”ＪａｖａＳｃｒｉｐｔ”＞＜／ＳＣＲＩＰＴ＞であり、ここで、「ＵＲＩ」は、ＪａｖａＳｃｒｉｐｔソース・ファイルをポイントする。
【００９２】
外部ＪａｖａＳｃｒｉｐｔソース・ファイルに、任意の有効なＪＳステートメントを含めることができるが、他の走行中のＪＳモジュールとの名前衝突がありうる。たとえば、複数の「ｖａｒ  ｘ；」ステートメントが、衝突の観点から問題であるが、複数の「ｘ＝ｖａｌｕｅ」ステートメントはそうでない。グローバル・コード・リンケージ：ファイルは、モジュールにコンパイルされる。このモジュールによって、すべてのグローバル・コードを含む１つの関数がエクスポートされる。この関数は、外部コードが「インライン化」されているかのように、ランタイムに呼び出される。
【００９３】
変数リンケージ：事前コンパイルされるファイルでは、そのコードによって使用されるすべてのグローバル変数を、外部（たとえばｙ＝５）または内部（たとえばｖａｒ  ｘ＝４）のいずれかとしてエクスポートすることが好ましい。コンパイルされるメインＪＳコードでは、これらのエクスポートされる変数のすべてのために、そのグローバル変数で、あるスロットが予約される。事前コンパイルされるコードには、それがエクスポートするグローバル変数のスロットも含まれるが、これらのスロットは、実際には、メイン・コード内の実際の変数へのポインタを保持する。アドレスはランタイムに初期化される。
【００９４】
モジュール・リンケージ：ランタイムに、Ｈ２Ｏは、事前コンパイルされたモジュールをロードし、ＪＳ２Ｏ  コンテキストを作成し、その後、事前コンパイルされたモジュールを初期化する（ｊｓ２ｏ＿ｄｌｌ＿ｉｎｉｔを参照されたい）。この初期化では、メインＪＳコードから事前コンパイルされたモジュールへの変数のアドレス更新が実行される。ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｂｉｎで指定された名前は、ランタイムにモジュールを参照するのに使用される。
【００９５】
Ｈ２ＯおよびＪＳ２Ｏは、外部の事前コンパイルされたファイルへの参照をサポートする。対応するＨＴＭＬ構文は次の通りである。
＜ＳＣＲＩＰＴ  ＳＲＣ＝”ＵＲＩ”ＬＡＮＧＵＡＧＥ＝”Ｏｐｅｎ  ＴＶ”＞＜／ＳＣＲＩＰＴ＞
ここで、「ＵＲＩ」は、クライアント互換の、たとえばＯｐｅｎ  ＴＶ  ＪＳコード・モジュール・ファイルをポイントする。このコード・モジュールによって、特定のＪＳ２Ｏ要件が定義され、サポートされる。リンケージは、外部ＪＳソース・ファイルと同一である。ＪＳコードのセグメントを、特定のイベントが発生する時に実行されるＨＴＭＬ属性（たとえばｏｎＣｌｉｃｋ）の値として指定することができる。ＥＣＭＡの用語では、これは、「ホスト・コード」である。構文は次の通りである。
ＯｎＡｔｔｒｉｂｕｔｅ＝”任意のＪａｖａＳｃｒｉｐｔステートメント”
【００９６】
あるページのインライン化されたコードおよびイベントハンドラのすべてが、単一のメイン・クライアント互換モジュール、たとえばＯｐｅｎ  ＴＶモジュールにコンパイルされる。イベント・ハンドラは、Ｔｒｕｅ、Ｆａｌｓｅ、または他の状況値を返すことができる。リンケージ、ＪＳ２Ｏに対して、コンパイル時に、ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｓｒｃは、そのイベント・ハンドラのＨ２Ｏへのハンドルを返す。このハンドルは、ランタイムに、イベント・ハンドラ・コードを参照するのに使用される。ＪＳコードは、クライアント互換オブジェクト、たとえばＯｐｅｎ  ＴＶ事前定義オブジェクト（ＤＯＭオブジェクトを含む）にアクセスすることができる。ＨＴＭＬページで必要な宣言はない。
【００９７】
リンケージに対して、ランタイムに、Ｈ２Ｏが、事前定義オブジェクト・アドレスの配列をＪＳに渡すことが好ましい。その配列内の事前定義オブジェクトのリストおよび順序は、事前定義である（Ｈ２ＯおよびＪＳ２Ｏの両方に既知）。Ｈ２Ｏは、グローバル関数の配列も渡すことが好ましい。これらのグローバル関数によって、事前定義オブジェクトのメソッドを実装することができる（たとえば、ＳｅｔＶｉｓｉｂｉｌｉｔｙメソッド）。
【００９８】
下記の構文の例を、ＪａｖａＳｃｒｉｐｔで使用される新しいオブジェクト・クラスを宣言するのに使用することができる。ＪＳコードは、「ｎｅｗ」ＪＳ演算子を使用して、そのクラスのインスタンスを作成する。「＜ＯＢＪＥＣＴ  ＣＬＡＳＳＩＤ＝ｏｔｖ＿ｍｏｄｕｌｅ＿ｕｒｉ  ＤＥＣＬＡＲＥ＞＜／ＯＢＪＥＣＴ＞」
【００９９】
この例では、ｏｔｖ＿ｍｏｄｕｌｅ＿ｕｒｉが、Ｏｐｅｎ  ＴＶコード・モジュールをポイントする。このコード・モジュールは、ＪＳクラス・オブジェクト・モジュール定義に従うことが好ましい。Ｈ２Ｏ層は、この．ｏｔｖモジュールが、そのページからのＪＳスクリプトを開始する前にロードされるようにすることが好ましい。
【０１００】
リンケージに対して、ランタイムに、ＪＳ２Ｏは、クラス名を使用して、そのモジュールのアドレスについてＨ２Ｏに質問する。クラス名は、Ｏｐｅｎ  ＴＶコード・モジュールに組み込まれる（コンパイル時にＪＳ２Ｏに渡される）。ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｃｌａｓｓも参照されたい。一意のＩＤによって、ＤＯＭ要素が識別される。たとえば、＜ａｎｃｈｏｒ  ｉｄ＝“ｆｏｏ”．．．＞，＜ｓｒｃ＝”ｘｘｘ．ｏｔｖ”ｉｄ＝“ｇｌｏｐ”＞
【０１０１】
ＤＯＭ要素は、ＪＳコード内で、通常のグローバル変数として、ＩＤ名を使用してアクセスされる。どちらの場合でも、オブジェクトは、ＪＳ２ＯではなくＨ２Ｏによって作成される。リンケージ：コンパイル時に、Ｈ２Ｏは、この要素をＪＳ２Ｏに登録し、ＪＳ２Ｏはハンドルを返す。このハンドルは、ランタイムに、ＪＳ２Ｏにそのオブジェクトのアドレスを知らせるために、Ｈ２Ｏによって使用される。
【０１０２】
ＪＳ２Ｏは、それ自体のデータ型（ｉｎｔ、ｂｏｏｌ、ｆｌｏａｔ、オブジェクトなど）を提供するが、これらの型は、標準Ｃの型ではない。ＪａｖａＳｃｒｉｐｔに関する汎用Ｃ型が「ｊｓ２ｏ＿ｖａｌ」である。これには、他のすべてのＪＳ型が含まれる、すなわち、ｊｓ２ｏ＿ｉｎｔ：整数型、ｊｓ２ｏ＿ｆｌｏａｔ：浮動小数点値、ｊｓ２ｏ＿ｂｏｏｌ：ブール値、およびｊｓ２ｏ＿ｐｔｒ：オブジェクト、ストリングなどへのポインタである。
【０１０３】
高速で効率的な実行のために、本発明は、スタック内のすべてのＪＳ２Ｏデータ型を表す単一の３２ビット・ワードを提供する。下記は、すべてのＪＳ２Ｏ変数の６つの基本型である。どのＪＳ２Ｏ値でも、６つの基本型の１つとの互換性を有することが好ましい。値によって渡されるすべての型が、単純にするために、この単一の３２ビット・データにおさまる。
【０１０４】
好ましい浮動小数点フォーマットは、ｓｅｅｅｅｅｅｅｅｆｆｆｆｆｆｆｆｆｆｆｆｆｆｆｆｆｆｆｆｆｆであり、１ビットのｓは符号ビットであり、０は正、１は負を表す。８ビットのｅは、指数フィールドである。指数バイアスは１２７である。２３ビットのｆは、小数フィールドである。これは、好ましい浮動小数点で、２３ではなく２２ビットの小数フィールドが使用されることを意味する。マクロは、ソフトウェア付録で定義される。
【０１０５】
すべてのＪＳオブジェクト・クラスが共通の構造体を共用する。オブジェクト構造体定義は、同一のフィールドから始まり、クラスのｖｔａｂｌｅのすべてが、同一の一次関数から始まる。ＪＳ２Ｏ  ＡＰＩおよびメソッドへの高速アクセスのために、コンパイラは、すべてのガジェットの構造体、または少なくとも構造体の先頭を知っている。好ましいＯｃｏｄｅ「ｖｃａｌｌ」オペコードのゆえに、仮想テーブル・ポインタは、その構造体の最初のフィールドである。ｖｔａｂｌｅ自体には、ガジェットごとに必須のすべての関数のアドレスと、おそらくはその後の、そのクラスに固有の関数のアドレスが含まれる。ＪＳ２Ｏランタイムは、型と、各ガジェット構造体への「プロトタイプ」ポインタも必要とする。提供される場合のＪＳ２Ｏオブジェクトの先頭の定義が、ソフトウェア付録にある。ｖｔａｂｌｅは、すべてのＪＳ２Ｏオブジェクト・クラスの必須関数の配列をポイントする。必須の関数はソフトウェア付録にある。
【０１０６】
これらのＡＰＩは、Ｃのようなコンテキストで、ＪＳコンパイラの内部によってのみ呼び出される。パラメータの一部は、Ｃ型（たとえば、ｉｎｔ  ｉｎｄｅｘ，ｃｈａｒ＊ｎａｍｅ）であり、一部はＪＳ２Ｏ型（たとえば、「ｔｈｉｓ」および戻り型）である。パラメータの順序が、ＪＳコンパイラによって使用される順序を反映することに留意されたい。
【０１０７】
下記のｖｔａｂｌｅ関数が提供される。
【０１０８】
ｊｓ２ｏ＿ｖａｌ  ＧｅｔＰｒｏｐｅｒｔｙ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｃｈａｒ＊ｎａｍｅ）関数は、指定されたプロパティのプロパティ値を返す。この関数は、プロパティが存在するが、定義された値がない場合に、ＪＳ２Ｏ＿ＵＮＤＥＦＩＮＥＤを返す。この関数は、プロパティが存在しない場合に、ＪＳ２Ｏ＿ＮＵＬＬを返す。この関数は、プロトタイプ・ポインタを完全に調べるのではなく、これは、必要な場合にＪＳ２Ｏランタイム・エンジンによって自動的に行われる。この関数では、「ｐｒｏｔｏｔｙｐｅ」プロパティがＪＳ２Ｏ  コンパイラによって直接に処理されると仮定することができる。しかしＶａｌｕｅＯｆプロパティおよびＴｏＳｔｒｉｎｇプロパティは、この関数によって処理される。下のＶａｌｕｅＯｆ  ＡＰＩおよびＴｏＳｔｒｉｎｇ  ＡＰＩも参照されたい。プロパティがメソッドに対応する場合には、戻り値は、関数のｊｓ２ｏ型になる。
【０１０９】
ガジェット・クラスでは、周知のプロパティ名の一部だけをサポートし、リテラル名を有するものだけをサポートすると決定することができる。その場合には、プロパティが、ＧｅｔＮｕｍｂｅｒＰｒｏｐｅｒｔｙ／ＳｅｔＮｕｍｂｅｒＰｒｏｐｅｒｔｙ  ＡＰＩを用いてアクセスされ、ＧｅｔＰｒｏｐｅｒｔｙ  ＡＰＩは、ＪＳ２Ｏ＿ＵＮＤＥＦＩＮＥＤを返す。
【０１１０】
ｎａｍｅは、プロパティ名であることが好ましい。オブジェクトが配列型である場合には、「ｎａｍｅ」も配列内のインデックスにすることができる。ｎａｍｅは、有効なストリング数（たとえば「１」）を表す場合にインデックスになる。オブジェクトが配列をサポートし、ｎａｍｅがインデックスである場合に、この関数は対応する項目番号を返す。
【０１１１】
ｖｏｉｄ  ＳｅｔＰｒｏｐｅｒｔｙ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｃｈａｒ＊ｎａｍｅ，ｊｓ２ｏ＿ｖａｌ  ｖａｌｕｅ）関数は、指定されたプロパティに値をセットする。プロパティが存在しない場合には、ガジェットは、（その値を用いて）それを作成する、または何も行わないのいずれかを行うことができる。この関数は値を返さない。この関数では、「ｐｒｏｔｏｔｙｐｅ」プロパティがＪＳ２Ｏ  コンパイラによって直接に処理されると仮定することができるが、ＶａｌｕｅＯｆプロパティおよびＴｏＳｔｒｉｎｇプロパティはこの関数によって処理される。
【０１１２】
ｎａｍｅは、通常はプロパティ名である。オブジェクトが配列型である場合には、「ｎａｍｅ」も配列内のインデックスにすることができる。ｎａｍｅは、有効なストリング数（たとえば「１」）を表す場合にインデックスになる。オブジェクトが配列をサポートし、ｎａｍｅがインデックスである場合に、この関数は、対応する項目番号をセットし、その「ｌｅｎｇｔｈ」プロパティを更新する（適当である場合に）。
【０１１３】
ｖｏｉｄ＊ＧｅｔＭｅｔｈｏｄ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｃｈａｒ＊ｎａｍｅ）関数は、このメソッドの関数アドレスを返す。ｔｈｉｓプロパティが存在しない場合、またはｔｈｉｓプロパティに関数が含まれない場合には、ランタイム例外が生成される（ｊｓ２ｏ＿ｒｕｎｔｉｍｅ＿ｅｒｒｏｒを参照されたい）。このメソッドは、ｊｓ２ｏ＿ｖａｌ値を返す。このメソッドは、次の引数を用いて呼び出される：ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｊｓ２ｏ＿ｉｎｔ  ｎｂａｒｇ，ｊｓ２ｏ＿ｖａｌ  ａｒｇ１，．．．，ｊｓ２ｏ＿ｖａｌ  ａｒｇＮ。ｎａｍｅは、通常は、プロパティ名である。オブジェクトが配列型である場合には、「ｎａｍｅ」も配列内のインデックスにすることができる。ｎａｍｅは、有効なストリング数（たとえば「１」）を表す場合にインデックスになる。オブジェクトが配列をサポートし、ｎａｍｅがインデックスである場合に、この関数は、項目番号に対応する関数アドレスを返す。
【０１１４】
ｊｓ２ｏ＿ｖａｌ  ＧｅｔＩｎｄｅｘＰｒｏｐｅｒｔｙＮａｍｅ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｉｎｔ  ｉｎｄｅｘ）関数は、そのインデックス（０からＮまで）を有するプロパティ／メソッドの名前を返す。この関数は、プロパティ／メソッドが存在しない場合にＪＳ２Ｏ＿ＮＵＬＬを返す。そうでない場合には、ＪＳ２Ｏストリング値を返す。この関数は、主に、「ｆｏｒ／ｉｎ」ＪａｖａＳｃｒｉｐｔステートメントによって使用される。この関数は、インデックスのシーケンス：０、１、２、．．．で呼び出されると仮定される。
【０１１５】
ｊｓ２ｏ＿ｖａｌ  ＶａｌｕｅＯｆ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ）関数は、オブジェクトの値を返す。オブジェクトの値はオブジェクト固有である。返される方は、数値、ブール値、ストリング、関数、またはオブジェクトになる可能性がある。このＡＰＩは、ＧｅｔＰｒｏｐｅｒｔｙ（ｔｈｉｓ，“ＶａｌｕｅＯｆ”）とその後のそのメソッドへの呼出しのショートカットである。
【０１１６】
ｊｓ２ｏ＿ｓｔｒ  ＴｏＳｔｒｉｎｇ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ）関数は、オブジェクト値のストリング表現を返す。この関数は、ＧｅｔＰｒｏｐｅｒｔｙ（ｔｈｉｓ，“ＴｏＳｔｒｉｎｇ”）とその後のそのメソッドへの呼出しのショートカットである。
【０１１７】
ｖｏｉｄ＊ＧｅｔＣａｌｌ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ）関数は、実行される関数のアドレスを返す。これは、通常はＦｕｎｃｔｉｏｎオブジェクトのみについて呼び出される。他のオブジェクトに対してこの関数を呼び出すことは、ランタイム・エラーと見なされる可能性がある。ｊｓ２ｏ＿ｒｕｎｔｉｍｅ＿ｅｒｒｏｒを参照されたい。関数について、このＡＰＩはＶａｌｕｅｏｆ（）と関数のアドレス取得のショートカットである。
【０１１８】
ｖｏｉｄ  ＤｅｌｅｔｅＰｒｏｐｅｒｔｙ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｃｈａｒ＊ｎａｍｅ）関数は、指定されたプロパティを削除する。プロパティが存在しないか削除できない場合には、何も行われない。
【０１１９】
ｖｏｉｄ  ＭａｒｋＰｒｏｐｅｒｔｉｅｓ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｉｎｔ  ｍａｒｋｖａｌｕｅ）関数は、このガジェットによって参照されるすべてのｊｓ２ｏ＿ｖａｌ値（ＪＳ２Ｏエンジンによって自動的に行われる「ｐｒｏｔｏｔｙｐｅ」フィールドからの値を除く）をマークするのにＪＳ２Ｏガーベジ・コレクタによって使用される。ほとんどの場合に、ｊｓ２ｏ＿ｖａｌ値は、単に、ガジェット・プロパティに保管された値である。ガジェットは、ｊｓ２ｏ＿ｍａｒｋ＿ｖａｌ関数を呼び出して、各ｊｓ２ｏ＿ｖａｌをマークする。動作の失敗は、ｊｓ２ｏ＿ｖａｌ（まだガジェットによって参照される）の解放をもたらす可能性がある。
【０１２０】
ｊｓ２ｏ＿ｖａｌ  ＧｅｔＮｕｍｂｅｒＰｒｏｐｅｒｔｙ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｉｎｔ  ｐｒｏｐｅｒｔｙ＿ｎｕｍｂｅｒ）関数は、プロパティ名の代わりにプロパティ番号が指定されることを除いて、ＧｅｔＰｒｏｐｅｒｔｙと同一である。このＡＰＩは、事前定義プロパティを有する事前定義オブジェクトに使用される。プロパティ番号は、周知の名前のリストから与えられる。
【０１２１】
ｖｏｉｄ  ＳｅｔＮｕｍｂｅｒＰｒｏｐｅｒｔｙ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｉｎｔ  ｐｒｏｐｅｒｔｙ＿ｎｕｍｂｅｒ，ｊｓ２ｏ＿ｖａｌ  ｖａｌｕｅ）関数は、プロパティ名の代わりにプロパティ番号が指定されることを除いて、ＳｅｔＰｒｏｐｅｒｔｙと同一である。このＡＰＩは、事前定義プロパティを有する事前定義オブジェクトに使用される。プロパティ番号は、周知の名前のリストから与えられる。
【０１２２】
ｖｏｉｄ＊ＧｅｔＮｕｍｂｅｒＭｅｔｈｏｄ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｉｎｔ  ｐｒｏｐｅｒｔｙ＿ｎｕｍｂｅｒ）関数は、このメソッドの関数アドレスを返す。このプロパティが存在しない場合、またはこのプロパティに関数が含まれない場合には、ランタイム例外が生成される（ｊｓ２ｏ＿ｒｕｎｔｉｍｅ＿ｅｒｒｏｒを参照されたい）。
【０１２３】
ｖｏｉｄ  ＤｅｌｅｔｅＯｂｊｅｃｔ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ）関数は、オブジェクトによって内部的に割り振られたすべてのリソースを解放する。これは、オブジェクト・クラスのｏｂｊｅｃｔ＿ｎｅｗ関数の逆である。この関数は、オブジェクト自体を解放する。ガーベジ・コレクタは、あるオブジェクトがもはや使用されないことがわかった時に、この関数を呼び出す。ガジェット・メソッドは、通常、ＧｅｔＭｅｔｈｏｄ  ＡＰＩを介してアクセスされる。ガジェットは、関数アドレスを返す。
【０１２４】
各メソッドは、ＪＳ２Ｏ  コンテキストで実行される。各メソッドは、下記の制限付きで実装される。各入力パラメータは、通常のＣ型ではなく、型「ｊｓ２ｏ＿ｖａｌ」である。戻り値は必須である（ＪＳ２Ｏ＿ＮＵＬＬにすることができる）。戻り値は、ｊｓ２ｏ型でなければならず、各メソッドは、少なくとも、「ｔｈｉｓ」オブジェクト・ポインタおよび解析されるパラメータの数という最初の２つのパラメータを有する。たとえば、２つのパラメータｘおよびｙを有するＪＳ２Ｏメソッド「ｆｏｏ」は、Ｃで、ｊｓ２ｏ＿ｖａｌ  ｆｏｏ（ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｊｓ２ｏ＿ｉｎｔ  ｎｂａｒｇ，ｊｓ２ｏ＿ｖａｌ  ｘ，ｊｓ２ｏ＿ｖａｌ  ｙ，．．．）と宣言することができる。
【０１２５】
外部オブジェクトまたは外部オブジェクト・クラスを定義する時に、いくつかの事前定義のプロパティおよびメソッドを宣言することが可能である。
【０１２６】
事前定義の「ｖｔａｂｌｅ」メソッドは、名前によって、およびインデックスによって定義される。このインデックスは、クラスのｖｔａｂｌｅ内の関数番号である。すべてのｖｔａｂｌｅの先頭に必要な関数のゆえに、最初の使用可能なインデックスは１３である。コンパイラは、可能な時に、これらの事前定義のメソッドへのアクセスを最適化する。事前定義の関数、たとえばｓｈｏｗを有する事前定義のオブジェクト、たとえばＯＳＤを定義する時には、ＪＳコード「ＯＳＤ．ｓｈｏｗ（）；」が最適化される（ｘとＯＳＤが等しい場合であっても、「ｘ．ｓｈｏｗ（）；」は最適化されない）。
【０１２７】
ＪＳ２Ｏ＋Ｈ２Ｏによって、周知のプロパティ名のリストが定義される。各名前は、ストリング数に関連する。コンパイラは、オブジェクトのＧｅｔＮｕｍｂｅｒＰｒｏｐｅｒｔｙ  ＡＰＩおよびＳｅｔＮｕｍｂｅｒＰｒｏｐｅｒｔｙ  ＡＰＩを呼び出すことによって、これらの周知のプロパティへのアクセスを最適化する。メソッドが、「事前定義のｖｔａｂｌｅメソッド」として定義されていない場合でも、そのメソッドを、周知のプロパティ名の１つにすることができる。その場合に、コンパイラは、ＧｅｔＮｕｍｂｅｒＭｅｔｈｏｄ  ＡＰＩを呼び出すことによって、ｇｅｔメソッドを最適化する。プロパティとしてそのメソッドにアクセスする時に、コンパイラは、ＧｅｔＮｕｍｂｅｒＰｒｏｐｅｒｔｙ  ＡＰＩおよびＳｅｔＮｕｍｂｅｒＰｒｏｐｅｒｔｙ  ＡＰＩを使用する。
【０１２８】
メソッドが「事前定義のグローバル・メソッド」として定義されると、そのメソッドはグローバル関数として実装される。その関数では、オブジェクト・クラスがそのメソッドにとって正しいことを検査し、その後、実際の機能性を実行する。オブジェクトが誤ったクラスに属する場合には、エラーが生成される。「事前定義のグローバル・メソッド」のリストは周知であり、すべてのＨ２Ｏ構成要素によって共用される。これらのメソッドのアドレスは、ランタイムにＨ２Ｏによって渡される（アドレスの単一の配列）。
【０１２９】
周知のプロパティ名のリストがある。このリストは、コンパイラおよびオブジェクトに既知である。このリストには、事前定義のオブジェクト（ＤＯＭオブジェクトを含む）のプロパティ（およびメソッド）名のほとんど（すべてではないとしても）が含まれる。このリストは、コンパイラによってアクセスされるメソッドおよびプロパティのみについて使用され、他のストリングについては使用されない。
【０１３０】
ＣＳＳプロパティへのアクセスを最適化するために、周知のプロパティ名に、「．」文字を含めることができる。たとえば、「ｓｔｙｌｅ．ｃｏｌｏｒ」を、単一のプロパティ名として宣言することができる。ＪＳ２Ｏランタイムに、動的に作成されるオブジェクトおよび動的に作成されるストリングのガーベジ・コレクションが含まれる。マーク・アンド・スイープ機構が、ガーベジ・コレクションのために実装される。これは、ランタイム速度に関して、参照カウンタよりコストが低い。
【０１３１】
ガーベジ・コレクションでは、ストリングおよびオブジェクト（たとえば、ｖｔａｂｌｅ、関数、スタティック・ストリングなど）によって参照されるモジュール（クラス定義、外部コード・モジュール）も記憶することが好ましい。パーマネント・オブジェクトによって、ページを変更する時に外部参照をクリーンアップするリセット機能が提供される（すなわち、モジュールのアンロード）。
【０１３２】
Ｈ２Ｏは、たとえばキャッシング・モジュール用のメモリ・マネージャを提供する。ＪＳ２Ｏおよびそのガーベジ・コレクタはＨ２Ｏと協力して動作する。ＪＳ２Ｏでは、多数の小さいチャンク（オブジェクト、ストリング）が割り振られ、Ｈ２Ｏでは、少数の大きいチャンクが割り振られる。ＪＳ２Ｏは、何も起こらない（ユーザ入力がない）間に実行されるアイドル関数をＨ２Ｏに提供する。このアイドル関数が、ガーベジ・コレクションを呼び出す。
【０１３３】
間数名：同一ファイル内で定義される関数へのアクセスは、関数アドレスへの直接呼出しに最適化される。これは、具体的には、関数を動的に変更できないことを意味する。ローカル変数は、スタック内の直接スロットにコンパイルされる。グローバル変数は、データ・セクション・メモリ内の直接変数にコンパイルされる。すべての事前定義のオブジェクトが、ＪＳグローバル・スコープの一部である。事前定義のオブジェクトならびにその事前定義のメソッドおよびプロパティは、直接参照される。ウィンドウ・オブジェクトおよびそのすべてのプロパティ／メソッドは、直接に、グローバル・スコープの一部である。たとえば、「ｗｉｎｄｏｗ．ｄｏｃｕｍｅｎｔ」プロパティに、単に「ｄｏｃｕｍｅｎｔ」によってアクセスすることができる。
【０１３４】
メインＪＳコードおよびすべてのＪＳイベントハンドラ（ページの）は、単一のコード・モジュールにコンパイルされる。Ｈ２Ｏ層はそのモジュールの初期化関数を呼び出す。この初期化関数はＪＳ２Ｏ  コンテキスト・ポインタを返す。
ｊｓ２ｏ＿ｃｘ＊ｊｓ２ｏ＿ｃｘ＿ｃｒｅａｔｅ（ｖｏｉｄ＊ｍｏｄｕｌｅ，ｉｎｔ＊＊ＤＯＭＯｂｊｅｃｔＨａｎｄｌｅ，ｊｓ２ｏ＿ｏｂｊ＊＊ＤＯＭＯｂｊｅｃｔｓ，ｊｓ２ｏ＿ｏｂｊ＊＊ＰｒｅｄｅｆｉｎｅｄＯｂｊｅｃｔｓ，ｖｏｉｄ＊＊ＧｌｏｂａｌＭｅｔｈｏｄｓ）；
【０１３５】
パラメータは、メイン・モジュールへのポインタ、作成されるＤＯＭオブジェクトへのポインタ（ハンドルおよびアドレス）、事前定義のオブジェクト・アドレスの配列へのポインタ、および事前定義のグローバル関数の配列へのポインタである。ＤＯＭオブジェクト・ハンドルは、ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｅｌｅｍｅｎｔによって返されるハンドルである。この関数は、エラーの場合にＮＵＬＬを返す。
【０１３６】
「ｍｏｄｕｌｅ」パラメータは、ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ｇｅｎｅｒａｔｅによって返されるものと同一のデータをポイントすることが好ましい。ＪＳ２Ｏは、そのデータのコピーを作り、したがって、ｄｅｓｔｒｏｙ関数によって除去されるまで有効であることが好ましい。このデータは、読取専用（ＪＳ２Ｏは、そのデータに書き込まない）であることにも留意されたい。少なくとも「ｗｉｎｄｏｗ」オブジェクトが定義されることに留意されたい。
【０１３７】
ＪＳ２Ｏ  コンテキストは、ｊｓ２ｏ＿ｃｘ＿ｄｅｓｔｒｏｙすなわち、ｖｏｉｄ  ｊｓ２ｏ＿ｃｘ＿ｄｅｓｔｒｏｙ（ｊｓ２ｏ＿ｃｘ＊ｃｏｎｔｅｘｔ）；を呼び出すことによって破壊される（もはや必要でない時に）。
【０１３８】
メインＪＳコードを実行するために、Ｈ２Ｏ層は、ｉｎｔ  ｊｓ２ｏ＿ｍａｉｎ（ｊｓ２ｏ＿ｃｘ＊ｃｏｎｔｅｘｔ）；というＡＰＩを呼び出す。
【０１３９】
この関数は、エラーがない場合に０を返し、ランタイム・エラーの場合には負の数を返す。イベントハンドラを実行するために、Ｈ２Ｏ層は、ｉｎｔ  ｊｓ２ｏ＿ｅｘｅｃｕｔｅ（ｊｓ２ｏ＿ｃｘ＊ｃｏｎｔｅｘｔ，ｊｓ２ｏ＿ｏｂｊ＊ｔｈｉｓ，ｉｎｔ  ｈａｎｄｌｅ）；というＡＰＩを呼び出して、ハンドラを実行する。
【０１４０】
ｈａｎｄｌｅの値は、コンパイル時にｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｓｒｃ  ＡＰＩによって提供される。関数ｊｓ２ｏ＿ｅｘｅｃｕｔｅは、以下の値を返す：ハンドラが真を返す場合にＪＳ２Ｏ＿ＴＲＵＥ、ハンドラが偽を返す場合にＪＳ２Ｏ＿ＦＡＬＳＥ、ランタイム・エラーが発生する場合にＪＳ２Ｏ＿ＮＵＬＬ、エラーがなくハンドラが値を返さない場合には任意のｊｓ２ｏ＿ｖａｌ。ＪＳ実行エンジンが、再入可能でないことが好ましいことに留意されたい。好ましい実施形態では、別のＪＳハンドラが実行中である間に、関数ｊｓ２ｏ＿ｍａｉｎおよびｊｓ２ｏ＿ｅｘｅｃｕｔｅを呼び出すことができない。
【０１４１】
外部ＪＳファイルは、Ｏｐｅｎ  ＴＶ  ＤＬＬコード・モジュールにコンパイルされる。Ｈ２Ｏ層は、そのモジュールの初期化関数を呼び出す。この初期化関数は、入力としてＪＳ２Ｏのコンテキストを受け取る。したがって、メインＪＳコード・モジュールは、まず、下記のように初期化される：ｉｎｔ  ｊｓ２ｏ＿ｄｌｌ＿ｉｎｉｔ（ｊｓ２ｏ＿ｃｘ＊ｃｏｎｔｅｘｔ，ｃｈａｒ＊ｎａｍｅ，ｖｏｉｄ＊ｍｏｄｕｌｅ）。ｎａｍｅパラメータは、コンパイル時に渡される（ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｂｉｎで）名前である。この呼出しの後に、そのモジュールで定義された関数が、ＪＳコンテキストから使用可能になる。外部ＪＳコード・モジュールは、このファイルのグローバルＪＳステートメントを実行するＡＰＩも有する。好ましい実施形態では、外部ＪＳコード・モジュールが、ＪＳ２Ｏ固有情報をＯｐｅｎ  ＴＶモジュール・ヘッダに保管されたＯｐｅｎ  ＴＶ  Ｃｏｄｅモジュールである。オブジェクト・クラス・モジュールによって、オブジェクトの新しいクラスが定義される。このモジュールは、ＨＴＭＬページ内でＯＢＪＥＣＴ宣言を用いて宣言され、ｊｓ２ｏ＿ｃｏｍｐｉｌｅ＿ａｄｄ＿ｃｌａｓｓ  ＡＰＩを使用してコンパイラに宣言される。ＪＳ２Ｏエンジンは、このモジュールによって提供される下記のＣ  ＡＰＩを呼び出して、そのオブジェクト・クラスの関数コンストラクタを得る。
【０１４２】
ｊｓ２ｏ＿ｏｂｊ＊ｍｏｄｕｌｅ＿ｃｌａｓｓ＿ｇｅｔ＿ｃｏｎｓｔｒｕｃｔｏｒ（ｊｓ２ｏ＿ｃｘ＊ｃｏｎｔｅｘｔ，ｃｈａｒ＊ｃｌａｓｓｎａｍｅ）関数は、エクスポートされる関数＃０である。好ましい実施形態のオブジェクト・クラス・モジュールは、ＪＳ２Ｏ固有情報をＯｐｅｎ  ＴＶモジュール・ヘッダに保管されたＯｐｅｎ  ＴＶ  Ｃｏｄｅモジュールである。
【０１４３】
ＪＳランタイムは、Ｈ２Ｏランタイム・フレームワークによって提供される下記の関数にアクセスする：ｊｓ２ｏ＿ｏｂｊ＊ｈ２ｏ＿ｇｅｔ＿ｃｌａｓｓ＿ｃｏｎｓｔｒｕｃｔｏｒ（ｊｓ２ｏ＿ｃｘ＊ｃｏｎｔｅｘｔ，ｃｈａｒ＊ｃｌａｓｓｎａｍｅ）。この関数は、指定されたクラスの関数コンストラクタ・オブジェクトを返すことが好ましい。クラス名は、ＯＢＪＥＣＴ宣言のＣＬＡＳＳＩＤで渡されたものと同一の値である。この関数は、内部で、クラス・モジュールを突き止め、ｍｏｄｕｌｅ＿ｃｌａｓｓ＿ｇｅｔ＿ｃｏｎｓｔｒｕｃｔｏｒ関数を呼び出す。下記のステートメントが、ＪＳが外部クラスのオブジェクトを作成するために使用可能である。ｎａｍｅは、ＯＢＪＥＣＴ宣言のＣＬＡＳＳ  ＩＤで渡されたものと同一の値である。下記のＣ  ＡＰＩが、オブジェクト・クラスおよびライブラリの開発のために使用可能である。ｖｏｉｄ  ｊｓ２ｏ＿ｒｕｎｔｉｍｅ＿ｅｒｒｏｒ（ｊｓ２ｏ＿ｃｘ＊ｃｏｎｔｅｘｔ）関数は、ガジェット・メソッドまたはｖｔａｂｌｅ関数内でランタイム・エラーが発生する時、およびｊｓ２ｏライブラリの内部でエラー条件が発生する時に実行される。ｃｈａｒ＊ｊｓ２ｏ＿ｇｅｔ＿ｎｕｍｂｅｒ＿ｐｒｏｐｅｒｔｙ＿ｓｔｒｉｎｇ（ｉｎｔ  ｐｒｏｐｅｒｔｙＮｕｍｂｅｒ）関数は、周知のプロパティ番号に関連するストリングを返す。
【０１４４】
本発明を、好ましい実施形態のインタラクティブ・テレビジョンで説明したが、本発明は、サーバおよびクライアント・デバイスを含む分散コンピュータ・システムでも実施することができる。もう１つの実施形態では、本発明が、現在既知または未知である、ＲＯＭ、ＲＡＭ、ＣＤ  ＲＯＭ、フラッシュ、または他のコンピュータ可読媒体を含むコンピュータ可読媒体上の、実行される時にコンピュータに本発明の方法を実施させる命令の組として実施される。
【０１４５】
本発明の好ましい実施形態を、上の発明によって示したが、これは例のみの目的であり、本発明の範囲を制限することを意図されておらず、本発明の範囲は、請求項によって定義される。
【図面の簡単な説明】
【０１４６】
【図１】クライアント・デバイスにコンテンツを供給するヘッドエンドを示す図である。
【図２】クライアント・デバイスにコンテンツを供給するヘッドエンドを示す図である。
【図３】クライアント・デバイスにコンテンツを供給するヘッドエンドを示す図である。
【図４】クライアント・デバイスにコンテンツを供給するヘッドエンドを示す図である。
【図５】Ｈ２ＯのＨＴＭＬトランスコーダ・アーキテクチャを示す図である。
【図６】Ｈ２Ｏのブラウザの処理およびデータ・フローを示す図である。
【図７】Ｈ２ＯとＪＳ２Ｏの間のインターフェースを示す図である。
【図８】ＪＳ２Ｏ  コンパイラの構成要素を示す図である。
【図９】ＪＳ２Ｏコマンド・ライン・コンパイラとしてのコンパイラを示す図である。
【図１０】クライアントでのコンパイルされたＪＳメイン・コード・モジュールの実行を示す図である。
【図１１】好ましいデータ・セグメントを示す図である。
【図１２】好ましいスタック・セグメントを示す図である。
【図１】
2004528626.tif 000003
【図２】
2004528626.tif 000004
【図３】
2004528626.tif 000005
【図４】
2004528626.tif 000006
【図５】
2004528626.tif 000007
【図６】
2004528626.tif 000008
【図７】
2004528626.tif 000009
【図８】
2004528626.tif 000010
【図９】
2004528626.tif 000011
【図１０】
2004528626.tif 000012
【図１１】
2004528626.tif 000013
【図１２】
2004528626.tif 000014
【国際公開パンフレット】
2004528626.tif 000015
2004528626.tif 000016
2004528626.tif 000017
2004528626.tif 000018
2004528626.tif 000019
2004528626.tif 000020
2004528626.tif 000021
2004528626.tif 000022
2004528626.tif 000023
2004528626.tif 000024
2004528626.tif 000025
2004528626.tif 000026
2004528626.tif 000027
2004528626.tif 000028
2004528626.tif 000029
2004528626.tif 000030
2004528626.tif 000031
2004528626.tif 000032
2004528626.tif 000033
2004528626.tif 000034
2004528626.tif 000035
2004528626.tif 000036
2004528626.tif 000037
2004528626.tif 000038
2004528626.tif 000039
2004528626.tif 000040
2004528626.tif 000041
2004528626.tif 000042
2004528626.tif 000043
2004528626.tif 000044
2004528626.tif 000045
2004528626.tif 000046
2004528626.tif 000047
2004528626.tif 000048
2004528626.tif 000049
2004528626.tif 000050
2004528626.tif 000051
2004528626.tif 000052
2004528626.tif 000053
2004528626.tif 000054
2004528626.tif 000055
2004528626.tif 000056
2004528626.tif 000057
2004528626.tif 000058
2004528626.tif 000059
2004528626.tif 000060
2004528626.tif 000061
2004528626.tif 000062
2004528626.tif 000063
2004528626.tif 000064
2004528626.tif 000065
2004528626.tif 000066
2004528626.tif 000067
2004528626.tif 000068
2004528626.tif 000069
2004528626.tif 000070
2004528626.tif 000071
【国際公開パンフレット（コレクトバージョン）】
2004528626.tif 000072
2004528626.tif 000073
【国際調査報告】
2004528626.tif 000074
2004528626.tif 000075
2004528626.tif 000076