(57)【特許請求の範囲】
【請求項１】
ホスト・アプリケーション内で実行するために開発されたユーザ・スクリプト・コードのデバッグ可能性を実行可能にするための方法であって、
前記ユーザ・スクリプト・コード内の１つまたは複数の位置において、コールバックを挿入するステップであって、前記コールバックは、前記ホスト・アプリケーションが協働して動作し、前記ホスト・アプリケーションのユーザ・インターフェースを更新しながら、前記ユーザ・スクリプト・コードをデバッッグすることを可能とするよう構成されたトレースバック・メソッドを呼び出すよう構成される、ステップと
を含むことを特徴とする方法。
【請求項２】
前記トレースバック・メソッドを作成するステップを含むことを特徴とする請求項１に記載の方法。
【請求項３】
前記挿入するステップは、デバッギングのために停止動作をインストールし得る、前記ユーザ・スクリプト・コード内の位置において、前記コールバックを挿入するステップを含むことを特徴とする請求項１に記載の方法。
【請求項４】
第２のトレースバック・メソッドへの第２のコールバックを含む、デバッギング機能を有する前記ユーザ・スクリプト・コードを備えるステップを含むことを特徴とする請求項１に記載の方法。
【請求項５】
イテレータ・パターンを使用することにより、前記ユーザ・スクリプト・コード内の前記デバッギング機能と１または複数の他のデバッギング機能を組み合わせるステップを含むことを特徴とする請求項４に記載の方法。
【請求項６】
前記挿入を実行することにより、前記ユーザ・スクリプト・コードを変換するステップを含むことを特徴とする請求項１に記載の方法。
【請求項７】
前記変換するステップは、１または複数の言語レベル・コンストラクタを実行するステップを含むことを特徴とする請求項６に記載の方法。
【請求項８】
前記１または複数の言語レベル・コンストラクタは、仮想マシンからの協働を利用しないよう構成されることを特徴とする請求項７に記載の方法。
【請求項９】
前記デバッギング機能は、スクリプト・コードを含むことを特徴とする請求項４に記載の方法。
【請求項１０】
前記第２のトレースバック・メソッドが、
停止動作を求めるデバッガ要求を検出するステップ、および
停止動作を求めるデバッガ要求を検出しないステップ
のうちの１つを実行するよう構成されることを特徴とする請求項４に記載の方法。
【請求項１１】
ホスト・アプリケーション内で実行するために開発された、ユーザ・スクリプト・コードのデバッグ可能性を実行可能にするためのシステムであって、
処理ユニットと、
前記処理ユニットに、
第１のトレースバック・メソッドへの第１のコールバックを含む、第１のデバッギング機能を有する前記ユーザ・スクリプト・コードを備えるステップと、
イテレータ・パターンを使用することにより、前記ユーザ・スクリプト・コード内の前記第１のデバッギング機能と第２のデバッギング機能を組み合わせるステップであって、前記第２のデバッギング機能は、第２のトレースバック・メソッドへの第２のコールバックを含み、前記第１のトレースバック・メソッドおよび前記第２のトレースバック・メソッドの少なくとも１つが、前記ホスト・アプリケーションが動作しながら、前記ユーザ・スクリプト・コードをデバッッグすることを可能とするよう構成る、ステップと
を実行させるためのプログラムを記録したメモリと
を備えたことを特徴とするシステム。
【請求項１２】
前記第１のデバッギング機能および前記第２のデバッギング機能の少なくとも１つが、割り当てられたデバッガ・スタック・フレームの作成を可能にする、変換されたユーザ・スクリプト・コードを含むことを特徴とする請求項１１に記載のシステム。
【請求項１３】
前記割り当てられたデバッガ・スタック・フレームは、１または複数の局所変数の辞書に関連することを特徴とする請求項１２に記載のシステム。
【請求項１４】
前記備えるステップは、ファンクションをコンパイルして、ヘッダおよび本体にするステップを含むことを特徴とする請求項１１に記載のシステム。
【請求項１５】
コンピュータに、ホスト・アプリケーション内で実行するために開発されたユーザ・スクリプト・コードのデバッグ可能性を実行可能にするための方法を実行させるためのプログラムを記録したコンピュータ可読記録媒体であって、前記方法は、
前記ユーザ・スクリプト・コード内の１つまたは複数の位置において、コールバックを挿入するステップであって、前記コールバックは、前記ホスト・アプリケーションが協働して動作し、前記ホスト・アプリケーションのユーザ・インターフェースを更新しながら、前記ユーザ・スクリプト・コードをデバッッグすることを可能とするよう構成されたトレースバック・メソッドを呼び出すよう構成される、ステップ
を含むことを特徴とするコンピュータ可読記録媒体。
【請求項１６】
前記方法は、ファンクションをコンパイルするとき、当該ファンクションにスクリプト・コード変換を適用するステップを含むことを特徴とする請求項１５に記載のコンピュータ可読記録媒体。
【請求項１７】
前記方法は、前記前記挿入を実行することにより、前記ユーザ・スクリプト・コードを変換するステップを含むことを特徴とする請求項１５に記載のコンピュータ可読記録媒体。
【請求項１８】
前記変換するステップは、１または複数の言語レベル・コンストラクタを実行するステップを含むことを特徴とする請求項１７に記載のコンピュータ可読記録媒体。
【請求項１９】
前記１または複数の言語レベル・コンストラクタは、仮想マシンからの協働を利用しないよう構成されることを特徴とする請求項１８に記載のコンピュータ可読記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デバッギングのためのユーザ・スクリプト・コードの変換に関する。
【背景技術】
【０００２】
コンピュータ・プログラム・アプリケーションのユーザは、時として何度も何度もアプリケーション内の特定のタスクを実行する必要があることにしばしば気づく。たとえば、自社の財務問題を管理している会社は、アプリケーション内のスプレッドシートに読み込むデータに、ある種の計算を実行しようとすることがある。これらタスクの実行は、ホスト・アプリケーションによってサポートすることができるが、アプリケーションにより、所望のタスクを自動化するためのカスタム・ソリューションを開発者／ユーザが作成できるようにもなる。
【０００３】
アプリケーションのユーザまたは開発者は、そのアプリケーション内のサポートされた機能を実行するマクロを作成し、それにより所望のタスクを自動化することができる。マクロは、アプリケーションにおいてユーザが実行する一連の動作を記録することによって作成することができ、またはホスト・アプリケーションがサポートするソース・コードで開発することができる。開発者／ユーザは、使用する前に、またはホスト・アプリケーション内のマクロの望ましくない動作を検出した後に、マクロをデバッグしようとすることがある。ホスト・アプリケーションは、統合開発環境（ｉｎｔｅｇｒａｔｅｄ  ｄｅｖｅｌｏｐｍｅｎｔ  ｅｎｖｉｒｏｎｍｅｎｔ：ＩＤＥ）でのプログラミング言語の枠組みの一実装形態を含むプラットフォーム上で実行してもよく、この環境により、ユーザ／開発者は、ソース・コードを書き、そのコードをコンパイルし、ホスト・アプリケーション内で実行されるコードをデバッグすることができるようになる。
【発明の概要】
【０００４】
この発明の概要は、発明を実施するための形態において以下でさらに説明する簡略化された形態での選ばれた概念を紹介するために提供される。この発明の概要は、特許請求される主題の主要因または本質的な特徴を特定するものではなく、特許請求される主題の範囲を限定するために使用されるものでもない。
【０００５】
自身のユーザ・スクリプト・コードをデバッギングしている間、開発者は、テスト環境を検査して、それが予想通り機能しているかどうか判定することのできるブレークポイントをしばしば挿入する。さらに、ブレークポイントにおいて、開発者は、とりわけ、変数を検査し、間のコードを実行することなく異なるファンクション（ｆｕｎｃｔｉｏｎ）に入り、コードを編集して、それを実行継続し、例外処理を見直そうとすることがある。現在、ほとんどの新規のデバッギング操作（たとえば、Ｃ＃および．ＮＥＴスクリプトを使用して）を実行している間、デバッガは、アプリケーション（デバッグ対象）内のブレークポイントにヒットするとき、デバッガが再始動されるまで（たとえば、再始動がユーザによって選択されるとき）デバッグ対象がフリーズするようにする。ホスト・アプリケーション用の比較的古いＩＤＥにより、ホスト・アプリケーションには、ブレークポイントがヒットするときに、応答を継続することができるようになるものがあり、このことが望ましいこともある。しかし、ホスト・アプリケーションが、比較的古いスクリプティング・プラットフォームから新規のスクリプティング・プラットフォームに移された場合、ユーザは、デバッギング・ブレークポイントでそのホスト・アプリケーションに応答を継続させることができないことがある。
【０００６】
本明細書において説明するように、ユーザ・スクリプト・コードをデバッグ可能なコードに変換することにより、ホスト・アプリケーション内で実行するように開発されたユーザ・スクリプト・コードのデバッグ可能性を実現するための技法およびシステムが提供される。たとえば、ユーザ・スクリプト・コードには、ユーザ・スクリプト・コードをデバッグ可能なものにすることのできるスクリプト・コードを備えることができ、デバッガが、ホスト・アプリケーションに影響を及ぼす可能性があるデバッギングＡＰＩからの代わりにユーザ・コードからデバッギング情報を得ることができるようになる。
【０００７】
一実施形態では、ホスト・アプリケーションにコールバックするトレースバック・メソッド（ｔｒａｃｅｂａｃｋ  ｍｅｔｈｏｄ）を作り出すことができ、この方法により、ホスト・アプリケーションは、協働して動作し、そのユーザ・インターフェースを更新することができるようになり、また、デバッギング停止動作（たとえば、ブレークポイント）においてさえも、機能を継続するように見えることになる。さらに、デバッギングのために停止動作を挿入し得るユーザ・スクリプト・コード内の１つまたは複数の位置において、トレースバック・メソッドにコールバックを挿入することにより、ユーザ・スクリプト・コードを変換することができる。さらに、たとえば、ユーザが望む各デバッグ可能性機能（たとえば、スタック・フレーム管理、変数検査、ｓｅｔ−ｎｅｘｔ命令など）に対してコードを変換する代わりに、共通ヘルパ・ファンクション（たとえば、イテレータ・タイプのファンクション）を用いてユーザ・スクリプト・コードを変換することにより、デバッグ可能性機能をユーザ・スクリプト・コード内に組み合わせてもよい。
【０００８】
前述の目的および関連した目的を達成するために、以下の説明および添付図面により、ある種の例示的な態様および実装形態を説明する。これらは、１つまたは複数の態様を利用してもよい、ほんのいくつかの互いに異なる方式を示す。本開示の他の態様、利点、および新規の特徴は、添付図面とともに考察すると、以下の詳細な説明から明らかとなろう。
【図面の簡単な説明】
【０００９】
【図１】デバッグ可能性のために、ホスト・アプリケーション内で実行するために開発されたユーザ・スクリプト・コードを実行可能にすることができる、例示的な方法の流れ図である。
【図２】本明細書に記載の技法を利用する、例示的なスクリプト・コードの変換を示す図である。
【図３】本明細書に記載の技法を利用する、例示的なスクリプト・コードの変換を示す図である。
【図４】本明細書に記載の技法を利用する、例示的なスクリプト・コードの変換を示す図である。
【図５】本明細書に記載の技法を利用する、例示的なスクリプト・コードの変換を示す図である。
【図６】本明細書に記載の技法を利用する、例示的なスクリプト・コードの変換を示す図である。
【図７】本明細書に記載の技法を利用する、例示的なスクリプト・コードの変換を示す図である。
【図８】本明細書に記載の技法を利用する、例示的なスクリプト・コードの変換を示す図である。
【図９】本明細書に記載の技法を利用する、例示的なスクリプト・コードの変換を示す図である。
【図１０】ホスト・アプリケーション内で実行するように開発されたユーザ・スクリプト・コードを、デバッグ可能なコードに変換するための例示的なシステムのブロック図である。
【図１１】本明細書に記載の例示的なシステムの実装例の一実施形態を示す図である。
【図１２】本明細書に記載の条項のうちの１つまたは複数を実施するように構成されたプロセッサ実行可能な命令を含む、例示的なコンピュータ可読媒体を示す図である。
【図１３】本明細書に記載の条項のうちの１つまたは複数を実施してもよい、例示的なコンピューティング環境を示す図である。
【発明を実施するための形態】
【００１０】
ここで、各図面を参照して、特許請求される主題を説明する。同じ参照番号は、全体を通して同じ要素を指すために使用する。以下の記述において説明するために、特許請求される主題を完全に理解するために、数多くの具体的な詳細を説明する。しかし、場合によっては、特許請求される主題は、これらの具体的な詳細がなくても実施できることが明らかになる可能性がある。他の例では、特許請求される主題の説明を容易にするために、各構造体および各装置がブロック図の形で示してある。
【００１１】
図１は、デバッグ可能性のために、ホスト・アプリケーション内で実行するために開発されたユーザ・スクリプト・コードを実行可能にすることができる、例示的な方法１００の流れ図である。たとえば、カスタム・アドオンの開発をサポートするアプリケーションのユーザは、このアプリケーション用のカスタム・マクロのためのユーザ・スクリプト・コードを書いてもよく、このカスタム・マクロをデバッグしようとしてもよい。この例では、例示的な方法１００を使用して、ユーザ・スクリプト・コードをデバッグ可能なスクリプト・コードに変換することができる。
【００１２】
例示的な方法１００は、１０２で開始し、１０４でホスト・アプリケーションにコールバックして、ホスト・アプリケーションが協働して動作し、そのユーザ・インターフェース（ｕｓｅｒ  ｉｎｔｅｒｆａｃｅ：ＵＩ）を更新することを可能とする、トレースバック・メソッドを作成するステップを含む。一実施形態では、トレースバック・メソッドは、アプリケーション実行および開発枠組み（たとえば、「．ＮＥＴ」、Ｊａｖａ）のライブラリにおいて作成することができ、次いで、その枠組み内で実行されるスクリプト・コードによってコールすることができる。この実施形態では、トレースバック・メソッドは、コールされると、ホスト・アプリケーションにそのＵＩを動作させるようにすることにより、デバッギング停止動作においてホスト・アプリケーションが機能を継続するように見えるようにできる。
【００１３】
現在のところ、一例として、デバッガがデバッグ対象（たとえば、ユーザ・スクリプト・コードを実行しているホスト・アプリケーション）においてブレークポイントにヒットするとき、このデバッグ対象は、ユーザによって検査され、デバッガが再始動されるまで、フリーズすることができる。この例では、デバッグ対象は、デバッガによって制御されているので、通常はフリーズするが、このデバッガは、ホスト・アプリケーションをブレークポイントにおいて停止させ、データを検査し、ユーザがデバッガに継続するよう命令すると単にデバッグ対象を再始動する。従来、デバッギング・ブレークポイントは、アプリケーション内のスレッドを停止する。たとえば、メッセージ・ポンプ（たとえば、メッセージ・ポンプが、制御コマンドを取得し、コマンドに関連するイベントを実行する）がＵＩ内のコマンドに応答することをブロックする。
【００１４】
一方、トレースバック・メソッドを使用して、たとえばブレークポイントで、ホスト・アプリケーションに制御を戻すことができる。ホスト・アプリケーションは、デバッガにオペレーティング・システムをコールさせて、従来のデバッギング・ブレークポイントと同様に、スレッドをブレークポイントのための演算コードに置く代わりに、ＵＩからのメッセージ（たとえば、またはコンソール・ホスト用のコンソール入力）の取出しを継続してもよい。この例では、スレッドをトレースバック・メソッドに置くことができ、この方法が、ホスト・アプリケーションに制御を戻す。
【００１５】
１０６において、例示的な方法１００では、ホスト・アプリケーションで使用するためにユーザによって作成されたスクリプト・コードは、コールバックを挿入することによって変換することができ、このコールバックは、デバッギングするために停止動作をインストールし得る、ユーザ・スクリプト・コード内での１つまたは複数の位置で、トレースバック・メソッドにコールする。トレースバック・メソッドへのコールバックは、デバッギングにおいて潜在的なブレークポイントを使用し得る、それぞれの位置で挿入することができる。このようにして、たとえば、ユーザ・スクリプト・コードのデバッギング中にブレークポイントが生じるときはいつでも、トレースバック・メソッドをコールすることができ、このことにより、ブレークポイント中に、ホスト・アプリケーションが機能を継続することが可能になる。
【００１６】
１０８において、ユーザ・スクリプト・コードは、トレースバック・メソッドへのコールバックを含む、所望のスクリプト・コード・デバッギング機能を備える。たとえば、ホスト・アプリケーションにおいてマクロとして実行されるスクリプト・コードを開発するユーザは、ユーザ・スクリプト・コード用の所望のデバッギング機能を可能にしようとする。この例では、（たとえば、枠組みの高水準言語コンパイラ、またはこの枠組みの動的実行時環境により）ユーザ・スクリプト・コードをコンパイルしている間、ユーザの所望のデバッギング機能をユーザ・スクリプト・コード内に備えることができ、ユーザ・スクリプト・コードを、所望の機能向けのデバッグ可能なコードに変換することができる。
【００１７】
一実施形態では、ホスト・アプリケーションのマクロ開発プラットフォームは、ユーザ・コード内に備えることのできる機能のメニューをユーザに提供してもよい。このようにして、たとえば、ユーザは、単にそうした所望のデバッギング機能を選択することができ、ユーザ・スクリプト・コードは、そうした選択されたデバッギング機能をユーザ・スクリプト・コードに備えることによって変換することができる。
【００１８】
１１０において、例示的な方法１００では、共通ヘルパ・ファンクション変換を使用することにより、ユーザ・スクリプト・コード内で、２つ以上の別々のスクリプト・コード・デバッギング機能を組み合わせることができる。たとえば、ユーザがそのユーザ・スクリプト・コード内に含めたいと考えるデバッギング機能は、コードの共通ヘルパ変換の中に一体化してもよく、これが、それぞれのデバッギング機能をサポートすることができる。一実施形態では、たとえば、２つ以上のデバッギング機能を、同じ位置でユーザ・スクリプト・コード内に備えてもよい場合には、それらデバッギング機能は、それぞれの機能をサポートするコードの共通ヘルパ・ファンクション変換の中で組み合わせることができる。
【００１９】
各デバッギング機能を組み合わせると、例示的な方法１００は、１１２で終了する。
【００２０】
一態様では、ユーザ・スクリプト・コードを変換することは、高水準言語には限定しないものとすることもできる。一実施形態では、ユーザ・スクリプト・コードは、アプリケーション実行および開発の枠組みの一部分である言語コンパイラによって変換することができ、このコンパイラは、高水準言語を、この枠組みで利用される中間言語（ｉｎｔｅｒｍｅｄｉａｔｅ  ｌａｎｇｕａｇｅ：ＩＬ）にコンパイルする。他の実施形態では、スクリプト・コード変換は、枠組みの動的実行時環境（たとえば、共通言語実行時での．ＮＥＴジャストインタイム・コンパイル・サービス）で実行してもよく、これが、枠組みのＩＬを、実行すべき機械語にコンパイルする。これらの実施形態では、各変換は、枠組みのコンパイル・サービスを使用してコンパイルしている間に実行されるので、言語には限定されなくてもよい。
【００２１】
他の態様では、トレースバック・メソッドへのコールは、停止動作（たとえば、ブレークポイント、ステッピング動作、非同期ブレイクなど）をデバッガが使用し得る位置で、ユーザ・スクリプト・コードに挿入される。一実施形態では、この態様において、ユーザ・スクリプト・コード変換は、トレースバック・メソッドに対する引き数が停止動作のコンテキストを含むことのできる、それぞれの潜在的な停止ポイントで、トレースバック・メソッドにコールを挿入することができる。
【００２２】
図２は、コード内の潜在的な停止ポイントでトレースバック・メソッドへのコールが挿入される、例示的なスクリプト・コード２００の図である。ユーザによって書かれたスクリプト・コード２０２（たとえば、ホスト・アプリケーション内のマクロとして使用するための）は、コード２０６の３つのライン、ラインＡ、Ｂ、およびＣから構成される。デバッグ中、デバッガは、コード２０６のラインのそれぞれの前でブレークポイントを利用してもよい。この例では、ユーザ・スクリプト・コード２０２は、コード２０６のそれぞれのラインの前で、トレースバック・メソッド２０８にコールバックを挿入することにより、（たとえば、コンパイラによって）２０４に変換することができる。ここで、トレースバック１、２、および３（２０８）へのコールが挿入されており、潜在的なブレークポイントの位置を識別することができる。
【００２３】
一実施形態では、たとえば、デバッガがブレークポイントにおいてデバッグ対象を停止させているように見えるとき、ハードモードのブレークポイントにおいて、実際にスレッドは停止されない。代わりに、この例では、スレッドを、ホストが機能を継続できるようにする協働制御デリゲータ（たとえば、メッセージ・ポンプ）において、ホスト・アプリケーションによって実装される、コールされたトレースバック・メソッドの内部に置くことができる。さらに、この例では、スレッドは、デバッガがブレークポイントから継続する後まで、トレースバック・メソッドから再開しなくてもよい。
【００２４】
さらに、この実施形態では、トレースバックは、ノー・オペレーション（ｎｏｐ）とすることができ、その結果、実行コードにはほとんど影響を及ぼさない。たとえば、デバッガが停止動作（たとえば、ブレークポイント）を要求するとき、トレースバック・メソッドは、要求された停止を適切に検出することができる。しかし、デバッガから停止動作の要求がない場合、トレースバック・メソッドは、いかなる動作も実行しない。
【００２５】
他の態様では、様々なユーザ・スクリプト・コード変換を実行して、デバッギング機能を可能にしてもよい。以下の実施形態および例は、スクリプト・コード用のいくつかの共通のデバッギング機能を特定するが、本明細書において説明する各技法およびシステムは、特定のいかなるデバッギング機能にも限定されないことが理解されよう。ユーザ・スクリプト・コードをデバッグ可能なコードに変換することにより、ホスト・アプリケーション内で実行するために開発された、ユーザ・スクリプト・コード内に備えることのできる代替デバッギング機能を、当業者であれば考案することができる。
【００２６】
図３は、ユーザ・スクリプト・コードを変換して、スクリプト・コードのデバッギング中にステッピングを実行することのできる、例示的なスクリプト・コード３００の図である。ユーザ・スクリプト・コードのラインの一例３０２は、１ステップずつ実行することのできる、またはデバッギング中にブレークポイントをセットし得る位置を含むことができる。すなわち、ソース・レベルのブレークポイントのためにユーザ・スクリプト・コード３０２の開始３０４において、Ａｌｐｈａのステップ・アウト後に、Ｂｅｔａのステップ・イン前に（３０６）、Ｂｅｔａのステップ・アウト後に、またＦｏｏ（）のステップ・アウト後に、停止することができる。
【００２７】
ユーザ・スクリプト・コードのラインの一例３０２は、ユーザ・スクリプト・コード内のそれぞれのステップ実行ポイントまたは停止ポイントにおける、トレースバック・メソッドへのコールを含むデバッグ可能なコード３１２に変換することができる。したがって、トレースバック１へのコール３１４は、ラインの始め３０４に挿入することができ、トレースバック２へのコール３１６は、Ａｌｐｈａの後およびＢｅｔａの前３０６に挿入することができ、トレースバック３へのコールは、Ｂｅｔａの後３０８に挿入することができ、トレースバック４へのコールは、Ｆｏｏ（）の後３１０に挿入することができる。
【００２８】
従来、デバッギング中のスクリプト・コードを通してのステップ実行は、フラグを使用し、単一命令を実行するＣＰＵによってサポートされる。この実施形態では、実行されるステップ実行のタイプ（たとえば、ステップ・イン、ステップ・アウト、ステップ・オーバ）に応じて、それぞれのトレースバックのスタック・ステップが知られており、その指示に基づいて次のトレースバックが知られる。たとえば、ステップ・インは、次のトレースバック（たとえば、トレースバック２から３）で単に停止することができ、このトレースバックを含む関数（ｆｕｎｃｔｉｏｎ）には関係ない。さらに、この例では、ステップ・オーバは、次のトレースバックおよび現在の（またはそれ以前の）スタック・レベルを停止してもよい。さらに、この例では、ステップ・アウトは、次のトレースバックにおいて、より浅いスタック・レベルで停止してもよい。
【００２９】
図４は、ある関数がそれ自体のコールスタックを維持することを可能にし得る、変換された例示的なスクリプト・コード４００の図であり、このスクリプト・コードは、ユーザ・コードからのスクリプト・フレームをデバッガ用に含む。この例では、ファンクションＦｏｏ（）４０２についてのスクリプト・コードが変換され、それにより、スレッドのデバッガ・スタック＄ｔｈｒｅａｄ４０６は、ファンクションＦｏｏ（）によって維持することができ、デバッガ・フレーム４０４をプッシュまたはポップすることができるようにする。変換は、トレースバック・メソッド４０８へのコールを利用して、デバッガがフレームをプッシュまたはポップしている間、ホスト・アプリケーションの継続機能を可能にする。
【００３０】
一実施形態では、スレッドのデバッガ・スタック＄ｔｈｒｅａｄ４０６は、スレッド・ローカル記憶装置に記憶することができる。他の実施形態では、スレッドのデバッガ・スタック＄ｔｈｒｅａｄ４０６は、隠されたパラメータとしてそれぞれのユーザ・コード・ファンクションに渡すことができる。このようにして、たとえば、デバッガのコールスタック窓は、スレッドのデバッガ・スタック＄ｔｈｒｅａｄ４０６内のユーザ・データ上の検査動作でもよい。
【００３１】
図５は、ユーザ・スクリプト・コードを変換して、単一ファンクションが分離して別々のヘッダと本体になるようにすることができる、例示的なスクリプト・コード５００の図である。この例では、ファンクションｆｏｏ（）についてのユーザ・スクリプト・コード５０２は、ファンクションのヘッダ５０６およびその本体５０８を含む。ユーザ・スクリプト・コード５０２は、デバッグ可能なスクリプト・コード５０４に変換することができ、これは、たとえばコンパイル中に、ファンクションを分割して、そのヘッダ５０６と本体５０８にする。
【００３２】
デバッグ可能なスクリプト・コード５０４では、ファンクション・ヘッダ５０６が、参照「ｆｏｏ」５１２によってヘッダを特定するファンクションに変換され、ファンクション本体５０８が、ファンクションｆｏｏの本体５１４に変換されている。ヘッダ・ファンクション５１２を本体ファンクション５１４とリンクするグローバル・テーブル５１０について、参照が作成されている。これにより、ファンクション本体５１４は、たとえば、グローバル・テーブル内に記憶され、更新されることが可能になってもよい。さらに、この例では、ヘッダ・ファンクション５１２を使用して、グローバル・テーブルから、対応する本体の最新バージョンを取り出すことができる。
【００３３】
一実施形態では、ファンクション本体に様々な変換を適用してもよい。ファンクション本体は、たとえば、「エディットコンティニュー」デバッギング機能での編集目的でスワップアウトしてもよい。この例では、第１のファンクション本体をスワップアウトすることができ、ｓｅｔ−ｎｅｘｔ命令を使用して、第１のファンクション本体から第２のファンクション本体にマッピングすることができる。他の例では、デオプティマイゼーション目的でファンクション本体をスワップアウトしてもよいが、他のファンクションは、ファンクション・ヘッダに対して安定した参照をもち続けることができる。
【００３４】
他の実施形態では、本体から分割されたファンクション・ヘッダ内で、共通のデバッギング・インフラストラクチャを記憶し共用することができる。たとえば、ファンクション・ヘッダ内に記憶されたインフラストラクチャ・コードは、デバッガが使用するノーティフィケーション・フックを含むこともできる。他の例では、ファンクション・ヘッダ内に記憶されるインフラストラクチャ・コードは、デバッギングでのｓｅｔ−ｎｅｘｔ命令のために使用してもよいスイッチ・テーブル用のドライバを含むこともできる。
【００３５】
図６は、ユーザ・スクリプト・コードを変換して、デバッギング中の値の検査を可能にすることのできる、例示的なスクリプト・コード６００の図である。たとえば、ファンクションは、その局所変数をフレーム・オブジェクトに公開してもよく、これは様々な方式で実行することができる。この例では、ファンクションｆｏｏ（）６０２は、文字列変数「ｘ」、および局所変数を読み書きするための命令を含む。
【００３６】
一実施形態６０４では、ｌｏｃａｌｓは、閉止オブジェクトまたは辞書オブジェクト６０８に上げることができる。一例では、この実施形態において、ｌｏｃａｌｓを辞書オブジェクトにまで上げることにより、ｌｏｃａｌｓの記憶領域を調整してもよく、またｌｏｃａｌｓをヒープに移してもよい。６０４では、命令は、局所変数を読み（６１２）書き（６１０）するための、トレースバック・メソッドへのコールを含む。
【００３７】
他の実施形態６０６では、ｌｏｃａｌｓのアドレスは、カスタマイズされた表示フレーム６１４を介して記述してもよい。一例では、この実施形態において、ｌｏｃａｌｓは、カスタマイズされたフレーム６１４を含むスタック上に存在できるようにすることもでき、ｌｏｃａｌｓの記憶領域にほとんど影響を及ぼさなくてもよい。ファンクションｆｏｏ（）については、検証不能なポインタ・コードを含む新規フレームを作成することができる（６１６）。局所変数を読み（６２０）書き（６１８）するための命令は、それぞれコール・トレースバック・メソッドを含み、たとえば、デバッギング中に、ホスト・アプリケーションが、そのＵＩを動作させることを継続できるようにする。
【００３８】
両方の実施形態において、変数ｈｏｍｅｓが表示オブジェクト６１０、６１２、６１８、６２０に記述されており、デバッガ用のトレースバックにおいて利用可能にすることができる。一例として、ｌｏｃａｌｓは、ファンクションがトレースバックに達するまで、表示オブジェクトに「流出」させる必要がなくてもよく、デバッギング中に、ホスト・アプリケーションが、そのＵＩを動作させることを継続できるようにする。６０４において、ｌｏｃａｌｓは、たとえば、トレースバック・ファンクション・コールにわたって保存するために、スタックに「流出」させることができる。
【００３９】
図７は、ユーザ・スクリプト・コードを変換して、デバッギング中の「ｓｅｔ−ｎｅｘｔ」命令の使用を可能にすることのできる、例示的なスクリプト・コード７００の図である。一実施形態では、ｓｅｔ−ｎｅｘｔ命令を使用して、デバッガは、中間でのユーザ・コードを実行することなく、現在のフレームにおいて次のアクティブな命令をセットすることができる。この実施形態では、ソース命令およびターゲット命令が、同じファンクション内にあり、いずれも、もう一方の前または後に位置することができる。たとえば、スレッドがラインＢ７１０におけるトレースバックに位置している場合、デバッガのユーザは、中間でのユーザ・コードを実行することなく、このスレッドをラインＡ７０８におけるトレースバックに移動することができる。
【００４０】
このタイプのｓｅｔ−ｎｅｘｔ命令は、例示的なスクリプト・コード７００で示すように、スイッチ・テーブル７１４をファンクションに挿入することによって実施することができる。この例では、デバッグのユーザが、トレースバック７０８、７１０、７１２にある間にｓｅｔ−ｎｅｘｔ命令を実行する場合、デバッガは、疑似ｌｏｃａｌ「＄ｎｅｘｔＬｉｎｅ」７１４をターゲット・ラインにセットすることでき、適切なトレースバックが「ｔｒｕｅ」に戻ることができる。この例では、これにより、ポインタ用の制御が次のスイッチ・テーブル（スイッチ・ラベルにおいて）７１４にジャンプし、次いで、適切なライン７０２、７０４、７０６にジャンプする。
【００４１】
上記実施形態は、スイッチ・テーブルを実装してデバッギングのためのｓｅｔ−ｎｅｘｔ命令を利用することの、単なる一例に過ぎないことが理解されよう。本明細書で述べる各技法およびシステムは、上記実施形態に限定されるものではない。たとえば、ＰｙｔｈｏｎにおけるＣ＃「イテレータ」または「ジェネレータ」も、スイッチ・テーブルで実施してよい。この例では、ユーザ・コード変換は、スイッチ・テーブルを得る手段として、ユーザ・コード・ファンクションをイテレータに変換することを利用できることがある。デバッギングにおけるｓｅｔ−ｎｅｘｔファンクション用のスイッチ・テーブルを利用するための代替手段を、当業者であれば考案できるであろう。
【００４２】
図８は、ユーザ・スクリプト・コードを変換して、デバッギング中の例外処理を可能にすることのできる、例示的なスクリプト・コード８００の図である。一実施形態では、８０２での例示的なコードと同様に、同期した例外向けに明示的な「ｔｈｒｏｗ」キーワードを使用することができる。この実施形態では、同期した例外のためにトレースバック・メソッドへのコールを挿入することができ、その結果、「ｔｈｒｏｗ」の例外の例が変換されて８０８になり、ここで、明示的な例外＄ｔのためにトレースバックがコールされる。
【００４３】
他の実施形態では、明示的なチェックを使用して、非同期の例外を同期にすることができ、０による除算またはヌル・レファレンスなどが非同期の例外の原因になる。この例では、例示的なユーザ・コード８０４は、ファンクションによる除算をコールする。このコードは８１０に変換することでき、その結果、ある値による除算が０である場合に、この例外についてのトレースバック・ファンクションがコールされる。そうでない場合には、この値を分割して、元のファンクション値にすることができる。
【００４４】
他の実施形態では、スクリプト・コードは、ノン・スクリプト・コード８０６にコール・アウトしてもよい。この実施形態では、たとえば、ノン・スクリプト・コードでの例外は、それらがスクリプト・コードに入るまで、スクリプト・デバッガには見えないことがある。この実施形態では、スクリプト・コードは、８１２に変換することができ、その結果、送出コールがｔｒｙ−ｃａｔｃｈブロック８１２でラップされる。さらに、前述のように、変換されたコードは、例外処理のためのトレースバック・メソッドへのコールを含む。
【００４５】
共通のデバッギング機能を含むスクリプト・コードへのユーザ・スクリプトの変換のいくつかの実施形態を上述してきたが、本明細書に記載の各技法およびシステムは、これらのデバッギング機能に限定されるものではないことが理解されよう。デバッギング機能は数多く、また変化に富んでおり、前述のようにユーザ・スクリプト変換を実行することにより、スクリプト・コードに持ち込むことのできる代替のデバッギング機能を、当業者であれば考案できるであろう。
【００４６】
他の態様では、変換は、ファンクション・ヘッダ／本体分割、例外処理ガード、スイッチ・テーブル、明示的なスタック・フレーム作成、ローカル変数のホイスティング、トレースバック、他など、１つまたは複数のデバッギング機能を組み合わせて、共通ヘルパ・ファンクションなどイテレータのパターンに基づいて、ユーザ・スクリプト・コードの単一変換にしてもよい。図９は、ユーザ・スクリプト・コードを変換して、イテレータ・パターンを使用し、２つ以上のデバッギング機能を組み合わせることを可能にすることのできる、例示的なスクリプト・コード９００の図である。
【００４７】
この機能組合せ変換の例は、ファンクション本体９０２のグローバル・テーブルにファンクションの本体をマッピングするスクリプト・コードを挿入することを含む。この例では、グローバル・テーブル「ｇ＿ｆｕｎｃｔｓ」は、ファンクション・ヘッダ「ｆｏｏ」を、その対応する本体「ｆｏｏ＿ｂｏｄｙ.」でマッピングする。共通ヘルパ・ファンクション９０４は、様々な実装にわたって共有することのできる変換内に挿入することができる。たとえばファンクション本体がすでに編集されていた可能性がある場合、ヘルパ・ファンクション９０４は、ファンクション・ヘッダについてファンクション本体の最新版を求めて、グローバル・テーブル９０６にコールすることができる。さらに、ヘルパ・ファンクション９０４は、トレースバック、ｓｅｔ−ｎｅｘｔ命令、例外処理など、ユーザ・スクリプト・コードについて２つ以上のデバッギング機能変換９０８を含むことができる。
【００４８】
この例では、ファンクション「ｆｏｏ」が、ストリング「ｆｏｏ」９１０で、共通ヘルパ・ファンクション９０４にコールする。「ｆｏｏ  ｂｏｄｙ」９１２は、初期の本体に似ているが、デバッギング機能のためにブレークポイントが開始されるｙｉｅｌｄを含む。本体９１２はイテレータに変換され、ここで、ヘッダ９１０がイテレータを駆動し、ファンクションの命令ラインの前に、それぞれのｙｉｅｌｄｓが、トレースバック・メソッドへのコールになることができる。このようにして、この例では、イテレータ・パターンを使用して、２つ以上のデバッギング機能をユーザ・スクリプト・コード変換に組み合わせることができる。
【００４９】
ホスト・アプリケーションでの使用向けに開発されたユーザ・スクリプト・コードが、たとえば、ホスト・アプリケーションにそのユーザ・インターフェース（ＵＩ）を動作させながら、デバッグできるようにすることのできるシステムを考案してもよい。図１０は、ホスト・アプリケーション内で実行するように開発されたユーザ・スクリプト・コードを、デバッグ可能なコードに変換するための例示的なシステム１０００のブロック図である。たとえば、ユーザ／開発者は、ホスト・アプリケーション内のマクロとして実行するように自分が開発したユーザ・スクリプト・コードをデバッグしようと考えることがある場合、この例示的なシステム１０００は、ユーザ・スクリプト・コードをデバッグ可能なコードに変換し、その結果、ホスト・アプリケーションは、デバッギング時の停止動作中にＵＩイベントに応答し続けることができる。
【００５０】
例示的なシステム１０００は、ホスト・アプリケーションにコールバックして、このホスト・アプリケーションが協働して動作し、そのＵＩを更新して、たとえば、デバッギング停止動作において機能を継続するように見えるよう構成することができるトレースバック・メソッド１００８を含む。一実施形態では、トレースバック・メソッドは、ホスト・アプリケーションに制御を戻し、このホスト・アプリケーションが、ＵＩイベントを実行するためにメッセージ・ポンプの動作を継続することができる。
【００５１】
例示的なシステム１０００はさらに、ユーザ・スクリプト・コード変換構成要素１００２を含み、この構成要素は、ホスト・アプリケーション内で実行するために開発されたユーザ・スクリプト・コード１０５０を変換するように構成することができる。ユーザ・スクリプト・コード変換構成要素１００２は、トレースバック・メソッド・コールバック実装構成要素１００４を含む。この要素は、コールバックを挿入するように構成され、このコールバックは、デバッギングのために停止動作をインストールし得る、ユーザ・スクリプト・コード１０５０内の１つまたは複数の位置でトレースバック・メソッド１００８にコールする。たとえば、トレースバック・メソッド・コールバック実装構成要素１００４は、それぞれのファンクション、および／またはユーザ・スクリプト・コード１０５０のファンクション内の命令の前で、トレースバックにコールを挿入することにより、ユーザ・スクリプト・コード１０５０を変換してもよい。
【００５２】
ユーザ・スクリプト・コード変換構成要素１００２はさらに、イテレータ・パターン変換を使用することにより、ユーザ・スクリプト・コード１０５０内の２つ以上のスクリプト・コード・デバッギング機能を結合するように構成することのできる、ユーザ・スクリプト・コード・デバッギング機能コンバイナ１００６を含む。たとえば、スクリプト・コード１０５０のユーザ／開発者が、トレースバック、ｓｅｔ−ｎｅｘｔ命令、変数検査など、コードのデバッギング中にいくつかのデバッギング機能を利用し、他で、編集、継続しようと考える場合、イテレータ・パターンを使用して、これらの変換を組み合わせて１つの変換にすることができる。この例では、イテレータ・パターンを使用して２つ以上のデバッギング機能の組合せを可能にするコードに、共通ヘルパ・ファンクションを挿入することができる。このようにして、たとえば、ユーザ・スクリプト・コード変換構成要素１００２は、ユーザ・スクリプト・コード１０５０を、デバッグ可能な変換されたユーザ・スクリプト・コード１０５２に変換することができるが、ホスト・アプリケーションは、オペレーティング・システムの仮想マシンからの協働を利用することなく、機能を継続することができる。
【００５３】
一実施形態では、ユーザ・スクリプト・コード・デバッギング機能コンバイナは、ファンクション本体のグローバル・テーブルに、ファンクション・ヘッダをマッピングするスクリプト・コードを挿入するように構成することができる。さらに、ユーザ・スクリプト・コード・デバッギング機能コンバイナは、それぞれのファンクション・ヘッダを有し、組み合わせるデバッギング機能を有し、イテレータ・パターン・ファンクションをコールする、スクリプト・コードを挿入するように構成することができる。さらに、ユーザ・スクリプト・コード・デバッギング機能コンバイナは、イテレータ・パターン・ファンクションを使用してデバッギング機能を可能にするコードを含むように変換された、対応する更新されたファンクション本体を取り出すように構成することができる。このようにして、たとえば、２つ以上のデバッギング機能を含んでもよいファンクションは、それぞれのデバッギング機能を組み合わせる単一変換を有することができる。
【００５４】
他の実施形態では、ユーザ・スクリプト・コード変換構成要素１００２はさらに、ファンクション分離構成要素を含むことができ、この構成要素は、ファンクションを別々のヘッダと本体にコンパイルし、ファンクション本体を、対応するファンクション・ヘッダにマッピングされたファンクション本体を含むグローバル・テーブルに記憶するように構成することができる。このようにして、たとえば、ファンクション本体はデバッギング中に編集してもよく、本体はやはり、グローバル・テーブルを使用して、その対応するヘッダにマッピングすることができる。
【００５５】
図１１は、前述の例示的なシステムの実装例１１００の一実施形態の図である。例示的な実装形態１１００では、ホスト・アプリケーション１１０２（たとえば、スプレッドシート・アプリケーション）は、アプリケーション実行および開発枠組み１１１４内で実行される。実行および開発の枠組み１１１４は、通常、この枠組み１１１４内で書かれ、実行されるコードがコールすることのできるファンクションを含んでもよい開発ライブラリ１１１２を有する。
【００５６】
この例では、ユーザは、ホスト・アプリケーション１１０２で実行することのできる、マクロなどのスクリプト・コード１１０６を書くことができる。ユーザ・スクリプト・コード１１０６は、高水準言語（たとえば、Ｃ＃）で書くことができ、枠組み１１１４によってサポートされているコンパイラ１１０８は、ユーザ・スクリプト・コード１１０６を、枠組み１１１４内の実行時環境に送ってもよい中間言語にコンパイルすることができる。
【００５７】
この例１１００では、ユーザ・スクリプト・コード変換器１１１０は、コンパイラ１１０８に含まれてもよく、デバッグ可能な機能をコード内に挿入することにより、ユーザ・スクリプト・コード１１０６を、変換されたデバッグ可能なユーザ・スクリプト・コード１１０４に変換してもよい。たとえば、ライブラリ１１１２内のトレースバック・ファンクションへのコールをユーザ・スクリプト・コードに挿入して、ホスト・アプリケーションが、デバッギング中に機能を継続できるようにしてもよい。さらに、ホスト・アプリケーション１１０２は、ユーザが、そのコードをデバッグできるようにするデバッガを含んでもよく、変換されたデバッグ可能なユーザ・スクリプト・コード１１０４は、ホスト・アプリケーションのＵＩが、デバッギング・プロセス中に動作を継続できるようにすることが可能である。
【００５８】
他の実施形態では、ユーザ・スクリプト・コード変換構成要素は、ホスト・アプリケーション用の動的言語実行時構成要素に動作可能なように結合されてもよく、これは、ユーザ・スクリプト・コードのジャスト・イン・タイム・コンパイルおよびその実行中に、ユーザ・スクリプト・コードを変換するように構成することができる。たとえば、ユーザ・スクリプト・コードは、コンパイルして、アプリケーション開発および実行枠組みのための中間コードにしてもよく、次いで、枠組み内の実行時環境に送ってもよい。ジャスト・イン・タイム・コンパイル・サービスは、通常、コードの実行中に、中間言語をコンパイルして機械語にする。この実施形態では、ジャスト・イン・タイム・コンパイラは、実行中に、ユーザ・スクリプト・コードを、変換されたデバッグ可能なコードに変換するためのユーザ・スクリプト・コード変換構成要素を含むことができる。
【００５９】
さらに他の実施形態では、本明細書において提示した各技法のうちの１つまたは複数を実施するように構成されたプロセッサ実行可能な命令を含む、コンピュータ可読媒体を含む。このようにして考案することのできる例示的なコンピュータ可読媒体が図１２に示してあるが、実装形態１２００は、コンピュータ可読媒体１２０８（たとえば、ＣＤ−Ｒ、ＤＶＤ−Ｒ、またはハード・ディスク・ドライブのプラッタ）を含み、これらの媒体上に、コンピュータ可読データ１２０６が符号化される。次に、コンピュータ可読データ１２０６は、本明細書において説明する原理のうちの１つまたは複数に従って動作するように構成された、１組のコンピュータ命令１２０４を含む。こうした一実施形態１２０２では、プロセッサ実行可能な命令１２０４は、たとえば、図１の例示的な方法１００などの方法を実行するように構成してもよい。こうした他の一実施形態では、プロセッサ実行可能な命令１２０４は、たとえば、図１０の例示的なシステム１０００などのシステムを実装するように構成してもよい。本明細書に提示した各技法に従って動作するように構成された、こうした多くのコンピュータ可読媒体が、当業者によって考案することができる。
【００６０】
構造上の特徴および／または方法論的な作用に特有の用語で、主題について述べてきたが、添付の特許請求の範囲で定義される主題は、必ずしも前述の具体的な特徴または作用を限定するものではないことを理解されたい。むしろ、前述の具体的な特徴および作用は、特許請求の範囲を実施する例示的な形態として開示されている。
【００６１】
本出願で使用されているように、用語「構成要素」、「モジュール」、「システム」、「インターフェース」などは、全体として、ハードウェア、ハードウェアとソフトウェアの組合せ、ソフトウェア、または実行時のソフトウェアのいずれかのコンピュータ関連の構成要素を指すものである。たとえば、構成要素は、それだけには限定されないが、プロセッサ上で実行されるプロセス、プロセッサ、オブジェクト、実行可能なもの、実行のスレッド、プログラム、および／またはコンピュータである。例として、制御装置上で実行されているアプリケーションおよび制御装置ともに、構成要素である。１つまたは複数の構成要素は、プロセスおよび／または実行のスレッド内に存在してもよく、また構成要素は、１つのコンピュータ上に配置してもよく、かつ／または２つ以上のコンピュータの間に分散してもよい。
【００６２】
さらに、特許請求される主題は、方法、装置、または、ソフトウェア、ファームウェア、もしくはそれらの任意の組合せを生成して、開示された主題をコンピュータが実施するように制御するための標準のプログラミングおよび／またはエンジニアリング技法を使用する製品として実施してもよい。本明細書で使用の用語「製品」は、任意のコンピュータ可読装置、キャリア、または媒体からアクセス可能なコンピュータ・プログラムを包含するものである。もちろん、特許請求される主題の精神または範囲から逸脱することなく、この構成に対して多くの修正形態を実施してもよいことが、当業者なら理解されよう。
【００６３】
図１０および以下の議論により、本明細書に記載の規定のうちの１つまたは複数での実施形態を実施するための、適切なコンピューティング環境の簡潔で全般的な説明が示される。図１０の動作環境は、適切な動作環境の一例に過ぎす、この動作環境の使用または機能の範囲に関して、いかなる限定をも示唆するものではない。コンピュータ装置の例には、それだけには限らないが、パーソナル・コンピュータ、サーバ・コンピュータ、ハンドヘルドまたはラップトップ装置、移動装置（移動電話、携帯型情報端末（Ｐｅｒｓｏｎａｌ  Ｄｉｇｉｔａｌ  Ａｓｓｉｓｔａｎｔ：ＰＤＡ）、メディア・プレーヤなど）、マルチプロセッサ・システム、家庭用電化製品、ミニ・コンピュータ、メインフレーム・コンピュータ、上記のシステムまたは装置などのうち任意のものを含む分散コンピューティング環境などが含まれる。
【００６４】
必要とされてはいないが、各実施形態は、１つまたは複数のコンピュータ装置によって実行される「コンピュータ可読命令」との一般的な関連で説明してある。コンピュータ可読命令は、（以下で議論される）コンピュータ可読媒体を介して分散してもよい。コンピュータ可読命令は、特定のタスクを実行し、または特定の抽象データ型を実装する、ファンクション、オブジェクト、アプリケーション・プログラム・インターフェース（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ：ＡＰＩ）、データ構造などのプログラム・モジュールとして実施してもよい。通常、コンピュータ可読命令の機能は、様々な環境において要望される通り、組み合わせても、または分散してもよい。
【００６５】
図１３には、本明細書において提供された１つまたは複数の実施形態を実施するように構成されたコンピュータ装置１３１２を備える、システム１３１０の一例が示してある。一実施形態において、コンピュータ装置１３１２は、少なくとも１つの処理ユニット１３１６およびメモリ１３１８を備える。コンピュータ装置の正確な構成およびタイプに応じて、メモリ１３１８は、揮発性（たとえば、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）など）、不揮発性（たとえば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、フラッシュ・メモリなど）またはこれら２つの何らかの組合せでもよい。この構成が、図１３に破線１３１４で示してある。
【００６６】
他の実施形態では、装置１３１２は、追加の特徴および／または機能を含んでもよい。たとえば、装置１３１２はまた、磁気記憶装置、光記憶装置などを含むが、ただしそれだけに限定されない、（たとえば、取外し可能および／または取外し不可能な）追加の記憶装置を備えてもよい。こうした追加の記憶装置が、図１３に記憶装置１３２０で示してある。一実施形態では、本明細書において提供される１つまたは複数の実施形態を実施するためのコンピュータ可読命令は、記憶装置１３２０内に存在してもよい。記憶装置１３２０はまた、他のコンピュータ可読命令を記憶して、オペレーティング・システム、アプリケーション・プログラムなどを実施してもよい。コンピュータ可読命令は、たとえば、処理ユニット１３１６が実行するように、メモリ１３１８内にロードしてもよい。
【００６７】
本明細書では、用語「コンピュータ可読媒体」は、コンピュータ記憶媒体を含む。コンピュータ記憶媒体には、コンピュータ可読命令、または他のデータなど、情報を記憶するための任意の方法または技術で実装された、揮発性および不揮発性、取外し可能および取外し不可能な媒体が含まれる。メモリ１３１８および記憶装置１３２０は、コンピュータ記憶媒体の例である。コンピュータ記憶媒体は、それだけには限定されないが、ＲＡＭ、ＲＯＭ、電気的に消去可能な読取り専用メモリ（Ｅｌｅｃｔｒｉｃａｌｌｙ  Ｅｒａｓａｂｌｅ  ａｎｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ：ＥＥＰＲＯＭ）、フラッシュ・メモリ、もしくは他のメモリ技術、ＣＤ−ＲＯＭ、デジタル多用途ディスク（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｃ：ＤＶＤ）もしくは他の光記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置、もしくは他の磁気記憶装置、または、所望の情報を記憶するのに使用することができ、装置１３１２からアクセスすることのできる任意の他の媒体が含まれる。任意のこうしたコンピュータ記憶媒体は、装置１３１２の一部分でもよい。
【００６８】
装置１３１２はまた、装置１３１２が他の装置と通信できるようにする、通信接続１３２６（複数可）を含んでもよい。通信接続１３２６（複数可）には、それだけには限定されないが、モデム、ネットワーク・インターフェース・カード（Ｎｅｔｗｏｒｋ  Ｉｎｔｅｒｆａｃｅ  Ｃａｒｄ：ＮＩＣ）、集積化されたネットワーク・インターフェース、無線周波数の送信機／受信機、赤外線ポート、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）接続、またはコンピュータ装置１３１２を他のコンピュータ装置に接続するための他のインターフェースが含まれ得る。通信接続１３２６（複数可）には、有線接続または無線接続が含まれ得る。通信接続１３２６（複数可）は、通信媒体を送信および／または受信してもよい。
【００６９】
用語「コンピュータ可読媒体」には、通信媒体が含まれ得る。通信媒体は通常、搬送波もしくは他の搬送機構など、「変調されたデータ信号」内の、コンピュータ可読命令または他のデータを取り入れ、任意の情報送達媒体を含む。用語「変調データ信号」は、信号内の情報を符号化するように設定された、または変更された、その特性のうちの１つまたは複数を有する信号を含んでもよい。
【００７０】
装置１３１２には、キーボード、マウス、ペン、音声入力装置、タッチ入力装置、赤外線カメラ、ビデオ入力装置、および／または他の任意の入力装置など、入力装置１３２４（複数可）が含まれ得る。表示装置（複数可）、スピーカ、プリンタ、および／または他の任意の出力装置など、出力装置１３２２（複数可）はまた、装置１３１２内に含まれてもよい。入力装置１３２４（複数可）、および、出力装置１３２２（複数可）は、有線接続、無線接続、またはその任意の組合せを介して、装置１３１２に接続してもよい。一実施形態では、他のコンピュータ装置からの入力装置または出力装置は、コンピュータ装置１３１２用の入力装置１３２４（複数可）または出力装置１３２２（複数可）として使用してもよい。
【００７１】
コンピュータ装置１３１２の構成要素は、バスなどの様々な相互接続部によって接続されてもよい。こうした相互接続部には、ＰＣＩ  Ｅｘｐｒｅｓｓなどの周辺装置相互接続（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ：ＰＣＩ）、ユニバーサル・シリアル・バス（ＵＳＢ）、ファイアワイヤ（ＩＥＥＥ  １３９４）、光バス構造などが含まれ得る。他の実施形態では、コンピュータ装置１３１２の構成要素は、ネットワークによって相互接続されてもよい。たとえば、メモリ１３１８は、ネットワークによって相互接続された様々な物理的な位置に配置された、複数の物理メモリ・ユニットから構成されてもよい。
【００７２】
コンピュータ可読命令を記憶するのに利用される記憶装置は、ネットワークを介して分散してもよいことが、当業者には理解されよう。たとえば、ネットワーク１３２８を介してアクセス可能なコンピュータ装置１３３０は、コンピュータ可読命令を記憶して、本明細書において提供される１つまたは複数の実施形態を実施してもよい。コンピュータ装置１３１２は、コンピュータ装置１３３０をアクセスし、実行のためのコンピュータ可読命令の一部分またはそのすべてをダウンロードしてもよい。あるいは、コンピュータ装置１３１２は、必要に応じて、コンピュータ可読命令の各部分をダウンロードしてもよく、または、命令によってはコンピュータ装置１３１２で実行してもよく、命令によってはコンピュータ装置１３３０で実行してもよい。
【００７３】
実施形態の様々な動作が、本明細書で提供される。一実施形態では、記述された動作のうちの１つまたは複数が、１つまたは複数のコンピュータ可読媒体上に記憶されたコンピュータ可読命令を構成し、この命令は、コンピュータ装置によって実行される場合、コンピュータ装置が、記述された動作を実行するようにする。各動作のいくつかまたはそのすべてが記述される順序は、これらの動作が必然的に順序に依存することを意味するものと解釈すべきではない。代替の順序付けが、この記述の恩恵を受ける当業者には理解されよう。さらに、本明細書で提供される各実施形態においては、必ずしもすべての動作が存在しなくてもよいことが理解されよう。
【００７４】
さらに、用語「例示的」は、本明細書では、代表例、具体例、または例証として働くことを意味するために使用される。本明細書で「例示的」と記述されたいかなる態様または設計も、必ずしも、他の態様または設計に勝って有利であると解釈されるものではない。むしろ、例示的という用語を使用することは、具体的に概念を提供するものである。本出願で使用されているように、用語「または」は、排他的な「または」ではなく、包含的な「または」を意味するものである。すなわち、別段の指定がない限り、または文脈から明らかでない限り、「ＸはＡまたはＢを利用する」は、自然な包含的順列のいずれをも意味するものである。すなわち、ＸがＡを利用する、ＸがＢを利用する、またはＸがＡとＢの両方を利用する場合、「ＸがＡまたはＢを利用する」は、前述の場合のいずれにおいても満たされる。さらに、本出願および添付の請求の範囲で使用する冠詞「ａ」および「ａｎ」は、一般に、別段の指定がない限り、または単数形を指すと文脈から明らかでない限り、「１つまたは複数」を意味するものと解釈してもよい。
【００７５】
また、本開示は、１つまたは複数の実装形態に関して図示し、説明してきたが、この明細書および添付図面を読み、理解することに基づいて、同等な変更形態および修正形態が、当業者には思いつくことになる。本開示は、こうしたすべての修正形態および変更形態を含み、以下の特許請求の範囲に記載の範囲によってのみ限定される。特に、上記構成要素（たとえば、要素、リソースなど）によって実行される様々な機能に関しては、本明細書で示した本開示の例示的な実装形態において機能を実行する、開示された構造とは構造的に同等ではないが、こうした構成要素を記述するのに使用される用語は、別段の定めがない限り、記述された構成要素（たとえば、すなわち機能的に同等の）の指定された機能を実行する任意の構成要素に対応するものである。さらに、本開示の特定の特徴が、いくつかの実装形態のうちのほんの１つに関して開示されてきたが、こうした特徴は、必要に応じて、また任意の所与のまたは特定の用途にとって有利になるよう、その他の実装形態の１つまたは複数の他の特徴と組み合わせてもよい。さらに、用語「ｉｎｃｌｕｄｅｓ」、「ｈａｖｉｎｇ」、「ｈａｓ」、「ｗｉｔｈ」、またはそれらの変化形が、詳細な説明または特許請求の範囲のいずれかにおいて使用される限りにおいて、こうした用語は、用語「ｃｏｍｐｒｉｓｉｎｇ」と同様にして包含的であることを意図している。
【図１】
0005415557.tif 000002
【図２】
0005415557.tif 000003
【図３】
0005415557.tif 000004
【図４】
0005415557.tif 000005
【図５】
0005415557.tif 000006
【図６】
0005415557.tif 000007
【図７】
0005415557.tif 000008
【図８】
0005415557.tif 000009
【図９】
0005415557.tif 000010
【図１０】
0005415557.tif 000011
【図１１】
0005415557.tif 000012
【図１２】
0005415557.tif 000013
【図１３】
0005415557.tif 000014