(57)【特許請求の範囲】
【請求項１】
コンピューティングデバイスの少なくとも１つのプロセッサと、
前記コンピューティングデバイスのメモリと、
前記メモリに読み込まれる少なくとも１つのプログラムモジュールを含むデバッガと
を含み、前記プログラムモジュールが、前記少なくとも１つのプロセッサに、
前記プログラムモジュールのデバッグモードコンパイルで、前記プログラムモジュールから生成されるネイティブコードに、デバッグ脱出条件が満たされたとの判断に応じてデバッグが前記プログラムモジュールを表すネイティブコードのデバッグから前記プログラムモジュールの解釈済みコードのデバッグに移行する前記ネイティブコード内の位置である少なくとも１つの脱出条件ポイントを挿入させ、
変数の位置、脱出条件ポイントの位置に対応するバイトコード内またはソースコード内の位置を含む脱出テーブルを作成させ、
前記ネイティブコードを実行させ、
脱出条件ポイントでデバック脱出条件が満たされたか否かの検査を行わせ、
脱出条件ポイントでのデバッグ脱出条件が満たされたことの検出に応じて、前記プログラムモジュールを表すネイティブコードのデバッグから、前記プログラムモジュールを表す解釈済みコードのデバッグに移行させる、システム。
【請求項２】
前記メモリに読み込まれる少なくとも１つのプログラムモジュールをさらに含み、前記プログラムモジュールが、前記少なくとも１つのプロセッサに、
前記デバッガの下で実行される前記ネイティブコードの現在の状態を受け取らせ、
インタープリタのインスタンスを作成させ、
前記インタープリタの前記インスタンス用のインタープリタスタックフレームを作成させ、
前記インタープリタの前記インスタンス用の前記インタープリタスタックフレームに前記ネイティブコードの前記現在の状態を追加させる、請求項１に記載のシステム。
【請求項３】
前記メモリに読み込まれる少なくとも１つのプログラムモジュールをさらに含み、前記プログラムモジュールが、前記少なくとも１つのプロセッサに、
関数の先頭、ループのバックエッジ、関数が戻ったとき、ヘルパ関数の呼び出しが戻ったとき、ライブラリの呼び出しが戻ったとき、またはデバッガステートメントに遭遇したときの少なくとも１つを含む、前記プログラムモジュールの定義済みの前記脱出条件ポイントを受け取らせる、請求項１に記載のシステム。
【請求項４】
前記メモリに読み込まれる少なくとも１つのプログラムモジュールをさらに含み、前記プログラムモジュールが、前記少なくとも１つのプロセッサに、
実行制御操作を受け取ったことに応じて、前記プログラムモジュールを表す前記解釈済みコードのデバッグに移行させる、請求項１に記載のシステム。
【請求項５】
前記メモリに読み込まれる少なくとも１つのプログラムモジュールをさらに含み、前記プログラムモジュールが、前記少なくとも１つのプロセッサに、
変数の現在の値を変更するデバッグ操作を、前記プログラムモジュールを表す前記ネイティブコードのデバッグを含むネイティブモードで実行させる、請求項１に記載のシステム。
【請求項６】
コンピューティングデバイスのプロセッサにより、プログラムの少なくとも１つのデバッグ脱出条件ポイントを受け取るステップであって、前記少なくとも１つのデバッグ脱出条件ポイントが、前記プログラムから生成されたネイティブコードの位置であり、前記位置において、デバッグ脱出条件が満たされたとの判断に応じて、デバッグが前記ネイティブコードのデバッグから前記プログラムの解釈済みコードのデバッグに移行する、受け取るステップと、
前記プログラムのデバッグセッションを開始するステップと、
コンパイラで、デバッグ用のネイティブコードを生成するステップであって、前記コンパイラが、生成するコンパイル済みの前記ネイティブコードに、受け取った前記少なくとも１つの脱出条件ポイントを挿入するステップと、
変数の位置、脱出条件ポイントの位置に対応するバイトコード内またはソースコード内の位置を含む脱出テーブルを作成するステップと、
生成された前記ネイティブコードをデバッガの下で実行するステップと、
脱出条件ポイントでデバック脱出条件が満たされたか否かの検査を行うステップと、
脱出条件ポイントに関連付けられたデバッグ脱出条件が満たされたとの判断に応じて、前記デバッガの下で前記プログラムの実行を解釈済みモードで続行するステップと、
実行されている生成された前記ネイティブコードに関連する変数に対応するインタープリタ変数を復元するステップと、
実行されている生成された前記ネイティブコード内の前記ネイティブコードのデバッグが停止したポイントに対応する前記解釈済みコード内のポイントで、前記プログラムのデバッグを解釈済みモードで再開するステップと
を含む方法。
【請求項７】
前記プログラムの前記少なくとも１つのデバッグ脱出ポイントを受け取るステップをさらに含み、前記少なくとも１つのデバッグ脱出ポイントが、関数の先頭、ループのバックエッジ、関数が戻ったとき、ヘルパ関数の呼び出しが戻ったとき、ライブラリが戻ったとき、または前記ネイティブコードでデバッガステートメントに遭遇したときのいずれかを含む、請求項６に記載の方法。
【請求項８】
非同期ブレーク操作、ステップ操作、ブレークポイント、または例外操作でのブレークのいずれかを含む実行制御操作を含むデバッグ操作の受け取りに応じて、解釈済みモードのデバッグに移行するステップ
をさらに含む、請求項６に記載の方法。
【請求項９】
前記プログラムに関連するスタックのスタック深度を判断することにより、デバッグ脱出条件が満たされたと判断するステップ
をさらに含む、請求項６に記載の方法。
【請求項１０】
実行されたときに、コンピューティングデバイスの少なくとも１つのプロセッサに、請求項６から９に記載の方法の少なくとも１つを実行させるコンピュータ実行可能命令を含むコンピュータ可読ストレージ媒体。
【発明の詳細な説明】
【背景技術】
【０００１】
[0001]  コンパイラは、ソースコードを、特定のプロセッサにより実行できるコードにコンパイルすることにより、実行可能コードを作成することができる。この種のプロセッサ固有コードは、「ネイティブコード」と呼ばれる。ネイティブコードは、特定の種類のプロセッサにより実行することは可能だが、任意の種類のプロセッサにより実行することはできないマシン命令である。別の種類のコンパイラは、ソースコードを受け取り、プロセッサに固有ではない中間コードまたは仮想マシンバイトコードを作成することができる。中間コードは、典型的には、中間言語コンパイラ（たとえば、ジャストインタイム（JIT）コンパイラ）によって受け取られ、プログラムを実行する直前にネイティブコードにコンパイルされる。中間コードは、プラットフォームに固有ではない。
【０００２】
[0002]  インタープリタは、ソースコードまたは中間コードを読み取り、コードをネイティブコードに翻訳することなくステートメントごとに実行する。典型的には、コードの解釈は、ネイティブコードの実行よりも低速である。コードの解釈は、典型的には、中間コードをネイティブコードにジャストインタイムでコンパイルしてネイティブコードを実行するよりも低速である。
【０００３】
[0003]  解釈済みコードのデバッガの実装は、ネイティブコードのデバッガの実装よりも、典型的には簡単である。しかし、応答時間は、典型的にはネイティブコードのデバッガのほうが解釈済みコードのデバッガよりも高速である。デバッガは、典型的には、関数へのステップインまたはステップアウト、関数のステップオーバ、実行の中断と再開、変数またはスタック位置の現在の値の検査などにより、プログラムの実行を制御する機能をユーザに提供する。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
[0004]  本明細書で説明されるデュアルモードデバッガは、プログラムを表すネイティブコードをデバッグすることができる。デバッグされているプログラム内で定義されたデバッグ脱出条件の検出に応じて、デバッガは、プログラムを表すネイティブコードのデバッグを停止し、プログラムを表す対応する解釈済みコードのデバッグに移行することができる。ネイティブモードで、デバッガは、プログラムを表すネイティブコードをデバッグすることができる。プログラム変数および／またはスタック情報の現在の値の検査および／または変更を提供するデバッグ操作は、ネイティブモードで実行することができる。ネイティブモードのデバッグでは、変数がレジスタに保存されるたびに（たとえば、変数がプログラムで定義されるたびに）、値も関数のスタック位置に保存することができる。デバッグされている関数の変数は、デバッグされているプログラム用に予約された、スタックの特定のローカル領域に保存することができる。スタックの同じ領域を、ネイティブコードへのコンパイル中に、スピルに使用することができる（すなわち、ライブ変数がコンピューティングデバイスのレジスタよりも多いとき、変数がレジスタからメモリに「あふれ出る」ことがある）。スタック位置は、デバッガにより変数の値を取得および変更するために使用され得る。
【課題を解決するための手段】
【０００５】
[0005]  脱出条件の検出に応じて、プログラムを表すネイティブコードのデバッグを停止することができる。インタープリタは、デバッグされているネイティブコードに対応する、プログラムを表す解釈済みコードを受け取り、解釈済みモードで実行されている、プログラムの解釈済みコードのデバッグを再開することができる。たとえば、デバッグされているプログラムの実行を制御するデバッグ操作は、解釈済みモードで実行することができる。実装制御操作は、非同期ブレーク、ステップ操作、ブレークポイント、および／または例外操作でのブレークにより実装され得る。インタープリタモードのデバッグを最上位の関数（変数値がスタックの最上位フレームに位置する関数）のデバッグに使用しながら、ネイティブモードを使用してプログラムの他の部分をデバッグすることができる。
【０００６】
[0006]  デバッガは、定義された脱出ポイントで、ネイティブモードでのデバッグから解釈済みモードでのデバッグに移行することができる。デバッガに関連する脱出エンジンは、デバッガの下で実行されているネイティブコードの現在の状態を含む脱出レコードを受け取ることができる。脱出エンジンは、インタープリタのインスタンスを作成し、インタープリタのインスタンス用のインタープリタスタックフレームを作成し、インタープリタのインスタンス用に作成されたインタープリタスタックフレームに脱出レコードの変数を追加することができる。プログラムのデバッグは、プログラムの対応する類似の解釈済みコードで再開することができる。デバッグ脱出ポイントは、特定の脱出条件が満たされる場合にネイティブモードのデバッグが解釈済みモードのデバッグに移行し得る、プログラム内の位置である。関数の先頭、ループのバックエッジ、関数が戻ったとき、ヘルパ関数またはライブラリの呼び出しが戻ったとき、またはデバッガステートメントに遭遇したとき等のデバッグ脱出ポイントを、プログラムに対して定義することができる。デバッグセッションでデバッグ脱出ポイントに遭遇したとき、実行時デバッグフラグの状態と、スタックフレームのスタック深度検査とを使用して、デバッグ脱出条件が満たされるか否かを判断することができる。デバッグ脱出条件が満たされる場合、デバッガの下で実行されているネイティブコードに対応するコードをインタープリタに送り、対応する解釈済みコードでデバッグを進めることができる。
【０００７】
[0007]  この発明の概要は、以下の詳細な説明でさらに説明される概念のいくつかを、簡単な形式で紹介するために設けられている。この発明の概要は、特許請求の範囲に記載された主題の主要な特徴または必須の特徴を特定することを意図したものではなく、特許請求の範囲に記載された主題の範囲を限定するために使用されることを意図したものでもない。
【図面の簡単な説明】
【０００８】
【図１ａ】[0008]受け取ったドキュメントのページをレンダリングするブラウザアプリケーションを含むシステム１００の例を示す図である。
【図１ｂ】本明細書で開示される主題の態様に基づいて、コンパイル済みコードの実行からコードの解釈に移行できるランタイムエンジンを備えるシステム２００の例を示す図である。
【図１ｃ】本明細書で開示される主題の態様に基づいて、コンパイル済みコードの実行からコードの解釈に移行できるランタイムエンジンを含むシステム３００の例を示す図である。
【図１ｄ】本明細書で開示される主題の態様に基づいて、ネイティブモードから解釈済みモードに移行することによりコードをデバッグできるシステム４００の例を示す図である。
【図２】本明細書で開示される主題の態様に基づいて、ネイティブコードのデバッグから解釈済みコードのデバッグに移行する方法２５０の例を示す図である。
【図３】本明細書で開示される主題の態様に基づくコンピューティング環境の例のブロック図である。
【図４】本明細書で開示される主題の態様に基づく統合開発環境（IDE）の例のブロック図である。
【発明を実施するための形態】
【０００９】
概要
[0009]  プログラムは、ネイティブコードにコンパイルし、そのネイティブコードをデバッグすることで、デバッグすることができる。プログラム内の定義済みのポイントで、デバッグをネイティブモードから解釈済みモードに移行させ、デバッグを解釈済みコードで続行することができる。実行制御、すなわち実行の中断、実行の続行、コードのセクションのステップイン、ステップアウト、またはステップオーバ等を含むデバッグ操作は、解釈済みモードで発生させることができる。変数の検査および変更を含むデバッグ操作は、ネイティブモードで発生させることができる。デュアルモードデバッガは、ネイティブモードデバッグの速度と、解釈済みモードデバッグの容易さとを組み合わせることができる。
【００１０】
ネイティブモードでの実行からインタープリタモードでの実行に移行することによるネイティブコードのデバッグ
[0010]  図１ａは、本明細書で開示される主題の一部の態様に基づくウェブブラウジング環境１００の例を示す。図１ａに示すように、環境１００は、コンピューティングデバイス１０２、サーバ１０４、ネットワーク１０６、およびブラウザアプリケーション１０８の１つまたは複数を含むことができる。ウェブブラウジング環境１００は、当技術分野で知られている他の構成要素を含み得る。
【００１１】
[0011]  コンピューティングデバイス１０２は、デスクトップコンピュータ（たとえば、パーソナルコンピュータ等）、携帯型コンピュータもしくはコンピューティングデバイス（たとえば、Palm（登録商標）デバイス、RIM Blackberry（登録商標）デバイス、個人用デジタル補助装置（PDA）、ラップトップコンピュータ、ノートブックコンピュータ、タブレットコンピュータ（たとえば、Apple iPad（商標）、ネットブック等）、携帯電話（たとえば、セルラー電話や、Apple iPhone、Google Android（商標）フォン、Microsoft Windows（登録商標）フォン等のスマートフォン）、または他の種類の携帯型デバイスを含む、任意の種類の据置型または携帯型のコンピューティングデバイスであり得る。サーバ１０４は、１つまたは複数のサーバを含む、１つまたは複数のコンピュータシステムで実装され得る。このコンピュータシステムは、本明細書に記載されるか、または本明細書に記載された対応する機能を実現できることがわかっている、任意の種類のコンピューティングデバイスであり得る。
【００１２】
[0012]  コンピューティングデバイス１０２およびサーバ１０４は、ネットワーク１０６により通信可能に連結され得る。ネットワーク１０６は、ＰＡＮ（パーソナルエリアネットワーク）、ＬＡＮ（ローカルエリアネットワーク）、ＷＡＮ（ワイドエリアネットワーク）、またはインターネットのようなネットワークの組み合わせ等である、１つまたは複数の通信リンクおよび／または通信ネットワークを含むことができる。コンピューティングデバイス１０２およびサーバ１０４は、ワイヤードおよび／またはワイヤレスのリンクを含む多様なリンクを使用して、ネットワーク１０６に通信可能に連結され得る。これらのリンクは、ＩＥＥＥ  ８０２．１１ワイヤレスＬＡＮ（WLAN）ワイヤレスリンク、ワールドワイドインターオペラビリティフォーマイクロウェーブアクセス（Wi-MAX）リンク、セルラーネットワークリンク、ワイヤレスパーソナルエリアネットワーク（PAN）リンク（たとえば、Bluetooth（登録商標）リンク）、イーサネット（登録商標）リンク、ＵＳＢリンク等である。
【００１３】
[0013]  ブラウザアプリケーション１０８は、コンピューティングデバイス１０２で実行できるプログラムであり得る。ブラウザアプリケーション１０８は、ネットワーク情報リソースの取得、提示、およびトラバースを可能にすることができる。情報リソースまたはオブジェクトは、ブラウザアプリケーション１０８により、統一リソース識別子（URI）等のネットワークアドレスを使用して取得することができる。情報リソースの例として、ウェブページ、画像、ビデオ、および他の形式のコンテンツがある。情報リソースに存在するハイパーリンクは、ユーザがブラウザで関連リソースに容易に移動することを可能にする。ブラウザアプリケーション１０８の例として、ワシントン州レドモンドのＭｉｃｒｏｓｏｆｔ  Ｃｏｒｐ．により開発されたＩｎｔｅｒｎｅｔ  Ｅｘｐｌｏｒｅｒ（登録商標）、カリフォルニア州マウンテンビューのＭｏｚｉｌｌａ  Ｃｏｒｐ．により開発されたＭｏｚｉｌｌａ  Ｆｉｒｅｆｏｘ（登録商標）、カリフォルニア州クパチーノのＡｐｐｌｅ  Ｉｎｃ．により開発されたＳａｆａｒｉ（登録商標）、およびカリフォルニア州マウンテンビューのＧｏｏｇｌｅ（登録商標）Ｃｈｒｏｍｅがあるが、これらに限定されない。
【００１４】
[0014]  ブラウザアプリケーション１０８は、ネットワーク１０６を通じて、サーバ１０４からドキュメント１１２を取得することができる。ドキュメント１１２は、ハイパーテキストマークアップ言語（HTML）、ダイナミックＨＴＭＬ（DHTML）、拡張可能ＨＴＭＬ（XHTML）、拡張可能マークアップ言語（XML）等のマークアップ言語のコードを含むウェブドキュメントであり得る。ドキュメント１１２は、ＤＯＭ（ドキュメントオブジェクトモデル）オブジェクト１１４と、１つまたは複数のスクリプト１１６とを含むことができる。ＤＯＭオブジェクト１１４は、ＤＯＭ慣例に基づいてドキュメント１１２で表される１つまたは複数のオブジェクトを含むことができる。ＤＯＭ慣例は、オブジェクトを表現および対話操作するための、クロスプラットフォームな言語非依存の慣例である。ＤＯＭオブジェクト１１４は、ドキュメント１１２に直接含まれるオブジェクト、および／またはドキュメント１１２により参照されサーバ１０４もしくは他のサーバから独立して取得されるオブジェクトを含む可能性がある。スクリプト１１６は、ＤＯＭオブジェクト１１４に変更を加えることを可能にする動的言語（たとえば、JavaScript（登録商標）、VBScript、AJAX、Python、Perl等）に基づいて書式設定されたコードを含む。変更は、ユーザ入力、環境条件（たとえば、時刻または他の変数）等の要因に基づく変更を含む。スクリプト１１６のコードは、サーバ１０４に戻ることなく、ＤＯＭオブジェクト１１４のオブジェクトにその場でアクセスして変更することができる。
【００１５】
[0015]  ブラウザアプリケーション１０８は、ドキュメント１１２を受け取る（たとえば、読み込む）ことができる。ブラウザアプリケーション１０８は、ドキュメント１１２の情報を書式設定し、書式設定された情報を表示する、ブラウザエンジン（たとえば、レイアウトエンジンまたはレンダリングエンジン）を含むことができる。たとえば、図１ａに示すように、ブラウザアプリケーション１０８は、ドキュメント１１２に基づいて、コンピューティングデバイス１０２のディスプレイ１１０により表示されるページ１１８を生成することができる。ブラウザアプリケーション１０８は、ドキュメント１１２に埋め込まれるか、またはドキュメント１１２から独立しているがドキュメント１１２に関連付けられた、１つまたは複数のスクリプト１１６を実行するように構成され得る。
【００１６】
[0016]  図１ｂは、本明細書で開示される主題の一部の態様に基づくシステム２００のブロック図を示す。システム２００は、コンピューティングデバイス１０２等の１つまたは複数のコンピュータまたはコンピューティングデバイスを含むことができる。コンピューティングデバイス１０２は、プロセッサ１４３等の１つまたは複数のプロセッサと、メモリ１４５と、実行コントローラ３０９と、インタープリタ３１１と、ＪＩＴ（ジャストインタイム）コンパイラ３１３等のコンパイラと、ストレージ３１５と、マシンコード実行器３１７と、脱出エンジン３３７とを備える。実行コントローラ３０９、インタープリタ３１１、ＪＩＴコンパイラ３１３等のコンパイラ、ストレージ３１５、マシンコード実行器３１７、および脱出エンジン３３７は、メモリ１４５に読み込まれたときに１つまたは複数のプロセッサ１４３等に実行コントローラ３０９、インタープリタ３１１、ＪＩＴコンパイラ３１３等のコンパイラ、マシンコード実行器３１７、および脱出エンジン３３７にそれぞれ帰属する動作を実行させる、１つまたは複数のプログラムモジュールとして実装され得る。システム２００は、当技術分野で知られているが図示されていない他の構成要素を含み得る。
【００１７】
[0017]  実行コントローラ３０９、インタープリタ３１１、および／またはＪＩＴコンパイラ３１３は、ソースコードから生成されたバイトコードを受け取ることができる。ソースコードは、動的スクリプト言語を含むがこれらに限定されないプログラミング言語で記述された任意のソースコードであり得る。動的スクリプト言語は、ＪａｖａＳｃｒｉｐｔ、ＶＢＳｃｒｉｐｔ、Ｐｙｔｈｏｎ等を含むがこれらに限定されない。ソースコードを解析し、解析されたソースコードからバイトコードを生成することができる。バイトコード３２５と、プロファイル、ヒューリスティック、または他の情報とに基づいて、実行コントローラ３０９は、インタープリタ３１１とＪＩＴコンパイラ３１３のいずれかにバイトコード３２５を処理させることができる。インタープリタ３１１は、実行コントローラ３０９から受信されるインタープリタ制御信号により有効化されたときにバイトコード３２５を解釈するように構成され得る。ＪＩＴコンパイラ３１３は、実行コントローラ３０９から受信されるコンパイラ制御信号により有効化されたときにバイトコード３２５をコンパイルするように構成され得る。
【００１８】
[0018]  インタープリタ３１１がインタープリタ制御信号により有効化されると、インタープリタ３１１は、バイトコード３２５を解釈して実行することができる。インタープリタ３１１は、ＪａｖａＳｃｒｉｐｔインタープリタ、ＶＢＳｃｒｉｐｔインタープリタ、Ｐｙｔｈｏｎインタープリタ、または本明細書に記載されるかもしくは公知である別の動的言語もしくは動的スクリプト言語のインタープリタとして実装され得る。これにより、ソースコードを、インタープリタ３１１の動作により少なくとも部分的に実行することができる。同様に、有効化のコンパイラ制御信号の受信に応じて、ＪＩＴコンパイラ３１３はバイトコード３２５をコンパイルすることができる。ＪＩＴコンパイラ３１３は、ＪａｖａＳｃｒｉｐｔコンパイラ、ＶＢＳｃｒｉｐｔコンパイラ、Ｐｙｔｈｏｎコンパイラ、または本明細書に記載されるかもしくは公知である別の動的言語もしくは動的スクリプト言語のコンパイラとして実装され得る。ＪＩＴコンパイラ３１３は「ジャストインタイム」コンパイラと呼ばれる。これは、バイトコード３２５の全体を実行前に事前コンパイルするのではなく、コンパイル済みのバイトコードが必要なとき（たとえば、実行が差し迫っているとき）に、特定のバイトコード部分がＪＩＴコンパイラ３１３によりコンパイルされ得るからである。ＪＩＴコンパイラ３１３は、マシン実行可能コードまたは命令の形式を備えたコンパイル済みバイトコード３３３を生成することができる。
【００１９】
[0019]  ＪＩＴコンパイラ３１３は、上述した仮定に基づいて、コードの最適化を実行することができる。ＪＩＴコンパイラ３１３は、生成するコンパイル済みバイトコードに、１つまたは複数の予め定義された脱出ポイントを挿入することができる。脱出ポイントごとに、脱出テーブル３０３等の脱出テーブルを作成することができる。脱出テーブルには、変数の位置、脱出ポイントの位置に対応するバイトコード３２５内またはソースコード内の位置、および他の情報を記録することができる。脱出テーブル３０３等は、スタックまたはレジスタで変数を見つけることができる場所を記述することができる。ＪＩＴコンパイラ３１３は、１つまたは複数の脱出テーブルを生成し、それらを（たとえば、マシンコードとしての）最適化されたコンパイル済みバイトコードと共に保存することができる。脱出テーブルは、脱出テーブルの情報を符号化して変数の寿命が不必要に延びるのを避けることにより、最適化することができる。たとえば、変数ｘの値が定数１０であることがわかっている場合、脱出時に、ｘ＝１０を脱出テーブルで符号化して、値１０をメモリまたはレジスタに格納しなくても復活させられるようにすることができる。同様に、複数の変数が同じ値である場合（たとえば、x=y）、その情報が脱出テーブルで符号化されていれば、脱出ポイントで、同じ値のすべての変数に対して脱出テーブルで同じ位置を使用することができる（たとえば、脱出テーブルの同じ位置を、xおよびyに使用できる）。これらの手法により、レジスタの割り当てが効率化される。最適化されたコンパイル済みバイトコードは、ストレージ３１５にコンパイル済みバイトコード３３３として格納して、プログラムの以降の実行中にシステム２００からアクセスできるようにすることが可能である。
【００２０】
[0020]  最適化されたコンパイル済みバイトコードを実行するときは、最適化されたコンパイル済みバイトコード３３３がマシンコード実行器３１７（プロセッサ１４３等の１つまたは複数のプロセッサであり得る）により受け取られ得る。コンパイル済みバイトコードの実行は、スタック３５５のコンパイラフレーム３４１と関連付けることができる。各脱出ポイントで、最適化の基になった仮定が妥当であるか否かを判断することができる。仮定が妥当であるとの判断に応じて、最適化されたコンパイル済みコードを引き続き実行することができる。仮定が妥当でないとの判断に応じて、最適化されたコンパイル済みコードの実行を停止することができる。その脱出ポイントの脱出テーブルを、脱出エンジン３３７に渡すことができる。脱出エンジン３３７は、インタープリタが必要とする変数の状態（たとえば、値）を復元することができる。脱出エンジンは、スタック３３５の新しいフレーム（たとえば、インタープリタフレーム３３９）を作成することができる。インタープリタが必要とする変数が非アクティブになっている場合、脱出エンジン３３７は、変数の状態を非アクティブからアクティブに変更することにより、変数を復活させることができる。脱出エンジン３３７は、インタープリタ３１１のインスタンスを作成し、最適化されたコンパイル済みコードの脱出ポイントに対応するバイトコード内の位置と、すべての復元されたアクティブ変数の値を含む新たに作成されたインタープリタフレームとを、インタープリタに渡すことができる。よって、バイトコード３２５の生成元のソースコードをＪＩＴコンパイラ３１３およびマシンコード実行器３１７の動作により部分的に実行し、インタープリタ３１１により部分的に実行することができる。
【００２１】
[0021]  図１ｃは、本明細書で開示される主題の態様に基づくシステムの別の例である、システム３００を示す。システム３００は、コンピューティングデバイス１０２等のコンピューティングデバイスを含むことができる。コンピューティングデバイス１０２は、プロセッサ１４２等の１つまたは複数のプロセッサと、メモリ１４４と、ランタイムエンジンとを備える。ランタイムエンジンは、エンジンインターフェイス３０２、パーサ３０４、バイトコード生成器３０６、実行コントローラ３０８、インタープリタ３１０、ＪＩＴ（ジャストインタイム）コンパイラ３１２等であるがこれに限定されないコンパイラ、ストレージ３１４、マシンコード実行器３１６、脱出エンジン３３６、およびスクリプトライブラリ３１８の１つまたは複数を備える。システム３００は、当技術分野で知られているが図示されていない他の構成要素を含み得る。
【００２２】
[0022]  図１ｃに示すように、エンジンインターフェイス３０２は、スクリプトソースコード２０８を受け取ることができる。エンジンインターフェイス３０２は、存在していても、存在していなくてもよい。エンジンインターフェイス３０２が存在する代わりに、パーサ３０４をランタイムエンジンのインターフェイスとして構成することができる。存在する場合、エンジンインターフェイス３０２は、ホストを図１ｃのランタイムエンジンに結び付けるための１つまたは複数の方法を提供する通信インターフェイスであり得る。本明細書で開示される主題の一部の態様によると、エンジンインターフェイス３０２は、ワシントン州レドモンドのＭｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎにより開発されたＩＡｃｔｉｖｅＳｃｒｉｐｔに基づいて実装され得る。エンジンインターフェイス３０２は、ソースコード２０８をパーサ３０４に提供することができる。
【００２３】
[0023]  パーサ３０４は、ソースコード２０８を受け取って解析することができる。パーサ３０４は、ソースコード２０８に対してトークン生成または字句解析を実行して、ソースコード２０８をシンボルまたはトークンとして書式設定することができる。パーサ３０４は、トークンのエラー検査を実行して、許容可能な式が形成されているか、構文エラーが存在しないか等を判断することができる。パーサ３０４は、解析されたソースコードを解析済みソースコード（図示せず）として出力することができる。解析済みソースコードは、任意の適切な形式を備えることができる。これには、パーサ３０４によりＡＳＴ（抽象構文ツリー）コードとして生成された形式が含まれる。ＡＳＴコードは、当業者であればわかるように、ソースコード２０８の抽象構文構造のツリー表現を含む。
【００２４】
[0024]  バイトコード生成器３０６は、解析済みソースコードを受け取ることができる。バイトコード生成器３０６は、解析済みソースコードをバイトコードに変換するように構成され得る。バイトコードは、インタープリタによる効率的な実行と、マシンコードへのさらなるコンパイルとを可能にするように構成された命令セットを含む。生成されたバイトコードは、解析済みソースコードを、数値コードおよび対応する任意選択のパラメータとして表すことができる。バイトコード生成器３０６は、生成されたバイトコード（図示せず）を出力することができる。バイトコードは、任意の適切な形式を備えることができる。これには、当業者であればわかるように、バイトコード生成器３０６によりｐコード（移植可能コード）のかたちで生成された形式が含まれる。
【００２５】
[0025]  実行コントローラ３０８、インタープリタ３１０、およびＪＩＴコンパイラ３１２は、生成されたバイトコードをそれぞれ受け取ることができる。インタープリタ３１０またはマシンコード実行器３１６は、プロファイル生成器２０４を含むことができる。プロファイル生成器２０４は、生成されたバイトコードを分析してソースコード２０８に関する統計情報および追加の情報を収集するように構成され得る。プロファイル生成器２０４は、プロファイル情報３２０を生成することができる。プロファイル情報３２０は、収集された情報を含むことができ、ストレージ３１４に格納することができる。
【００２６】
[0026]  実行コントローラ３０８は、プロファイル情報３２０にアクセスすることができ、インタープリタ３１０およびＪＩＴコンパイラ３１２に通信可能に連結され得る。生成されたバイトコードおよびプロファイル情報３２０に基づき、実行コントローラ３０８はインタープリタ３１０およびＪＩＴコンパイラ３１２のいずれかを有効にして、生成されたバイトコードを処理させることができる。インタープリタ３１０は、実行コントローラ３０８から受信されるインタープリタ制御信号により有効化されたときに、生成されたバイトコードを解釈するように構成され得る。ＪＩＴコンパイラ３１２は、実行コントローラ３０８から受信されるコンパイラ制御信号により有効化されたときに、生成されたバイトコードをコンパイルするように構成され得る。たとえば、ソースコード２０８の最初の実行時に、プロファイル情報３２０はまだ存在しない可能性がある。そのような場合、実行コントローラ３０８は、インタープリタ３１０を有効にして、生成されたバイトコードを解釈し、プロファイル情報３２０を生成することができる。ソースコード２０８の以降の実行時（たとえば、ソースコード２０８の最初の実行時の以降の時点、および／またはソースコード２０８の以降の実行時）に、実行コントローラ３０８は、プロファイル情報３２０に基づき、インタープリタ３１０を有効にしてソースコード２０８の一部を解釈し、ＪＩＴコンパイラ３１２を有効にしてソースコード２０８の他の部分をコンパイルすることができる。
【００２７】
[0027]  インタープリタ３１０がインタープリタ制御信号により有効化されると、インタープリタ３１０は、生成されたバイトコードを解釈して実行することができる。インタープリタ３１０は、ＪａｖａＳｃｒｉｐｔインタープリタ、ＶＢＳｃｒｉｐｔインタープリタ、Ｐｙｔｈｏｎインタープリタ、または本明細書に記載されるかもしくは公知である他の動的言語のインタープリタとして実装され得る。これにより、ソースコード２０８を、インタープリタ３１０の動作により少なくとも部分的に実行することができる。
【００２８】
[0028]  ＪＩＴコンパイラ３１２がコンパイラ制御信号により有効化されると、ＪＩＴコンパイラ３１２は、生成されたバイトコードをコンパイルすることができる。ＪＩＴコンパイラ３１２は、ＪａｖａＳｃｒｉｐｔコンパイラ、ＶＢＳｃｒｉｐｔコンパイラ、Ｐｙｔｈｏｎコンパイラ、または本明細書に記載されるかもしくは公知である別の動的言語のコンパイラとして実装され得る。ＪＩＴコンパイラ３１２は「ジャストインタイム」コンパイラと呼ばれる。これは、バイトコードの全体を実行前に事前コンパイルするのではなく、コンパイル済みのバイトコードが必要なとき（たとえば、実行が差し迫っているとき）に、特定のバイトコード部分がＪＩＴコンパイラ３１２によりコンパイルされ得るからである。ＪＩＴコンパイラ３１２は、マシン実行可能コードまたは命令の形式を備え得るコンパイル済みバイトコード３３２を生成することができる。
【００２９】
[0029]  ＪＩＴコンパイラ３１２は、上述した仮定に基づいて、コードの最適化を実行することができる。ＪＩＴコンパイラ３１２は、生成するコンパイル済みバイトコードに、１つまたは複数の予め定義された脱出ポイントを挿入することができる。脱出ポイントごとに、脱出テーブル３０３等の脱出テーブルを作成することができる。脱出テーブルには、変数の位置、脱出ポイントの位置に対応する生成されたバイトコード内の位置等を記録することができる。脱出テーブルは、スタックまたはマシンコードのレジスタで変数を見つけることができる場所を記述することができる。ＪＩＴコンパイラ３１２は、テーブルを生成し、最適化されたコンパイル済みバイトコード３３２（たとえば、マシンコード）と共に保存することができる。最適化されたコンパイル済みバイトコード３３２は、ストレージ３１４にコンパイル済みバイトコード３３２として格納して、プログラムの以降の実行中にシステム３００からアクセスできるようにすることが可能である。
【００３０】
[0030]  最適化されたコンパイル済みバイトコードを実行するときは、最適化されたコンパイル済みバイトコード３３２がマシンコード実行器３１６（プロセッサ１４２等の１つまたは複数のプロセッサであり得る）により受け取られ得る。各脱出ポイントで、最適化の基になった仮定が妥当であるか否かを判断することができる。仮定が妥当であるとの判断に応じて、最適化されたコンパイル済みバイトコード３３２を引き続き実行することができる。仮定が妥当でないとの判断に応じて、最適化されたコンパイル済みコードの実行を停止することができる。その脱出ポイントの脱出テーブルを、脱出エンジン３３６に渡すことができる。脱出エンジン３３６は、インタープリタが必要とする変数の状態（たとえば、値）を復元することができる。インタープリタが必要とする変数が非アクティブになっている場合、脱出エンジン３３６は、変数の状態を非アクティブからアクティブに変更することにより、変数を復活させることができる。脱出エンジン３３６は、インタープリタ３１０のインスタンスを作成し、最適化されたコンパイル済みコードの脱出ポイントに対応するバイトコード内の位置と、変数およびその位置とを、インタープリタに渡すことができる。よって、バイトコードの生成元のソースコードをＪＩＴコンパイラ３１２およびマシンコード実行器３１６の動作により部分的に実行し、インタープリタ３１０により部分的に実行することができる。
【００３１】
[0031]  脱出を使用することで、複数の最適化が可能となる。多くの動的プログラミング言語における変数は、日付、文字列、配列、整数等であり得る。一部の動的言語では、変数用のオブジェクトが作成され、レジスタおよび後にテーブルに格納される位置が、オブジェクトへのポインタを含む。オブジェクト自体は、オブジェクトの説明およびオブジェクトのデータを格納することができる。よって、変数ａが文字列である場合、その文字列のオブジェクトを作成し、オブジェクトへのポインタを格納し、オブジェクト自体で変数ａが文字列であることを特定し、文字列自体（たとえば、「Hello World」）を指定することができる。変数がプロファイルデータに基づいて整数であると仮定される場合、この方式の最適化の１つは、整数用に作成されたオブジェクトへのポインタ、またはその整数オブジェクトを表現および記述する符号化された値ではなく、整数自体を変数に格納することである。整数オブジェクトを直接符号化する方式の１つは、単語のビットの１つを使用して、値が整数であることを示すインジケータを格納することである。よって、３２ビットプロセッサの場合、３２ビットのうちの１ビットで、残りの３１ビットの内容が整数値を表していることを示すか、または残りの３１ビットの内容が整数値を表していないことを示すことができる。
【００３２】
[0032]  図１ｄは、本明細書で開示される主題の態様に基づいて、ネイティブモードでの実行から解釈済みモードでの実行に移行することによりネイティブコードをデバッグできるシステム４００の例を示す。システム４００のすべてまたは一部は、図３に関連して以下に説明するコンピュータ等の、１つまたは複数のコンピュータまたはコンピューティングデバイスに存在し得る。システム４００は、本明細書に記載されたデバッガ等が追加された図１ｂおよび／または図１ｃに示すシステムを含むことができる。システム４００またはその一部は、スタンドアロンシステム、またはプラグインもしくはアドインとして提供され得る。システム４００は、図４に関連して説明するソフトウェア開発コンピュータなどのソフトウェア開発コンピュータで全体的または部分的に実行され得る。システム４００のすべてまたは一部は、プログラム開発ツールにより操作され得る。たとえば、システム４００のすべてまたは一部は、図４に関連して詳細に説明する統合開発環境（IDE）や別のＩＤＥ等のＩＤＥ内で実行され得る。システム４００は、ＩＤＥの外部で全体的または部分的に実行することができる。システム４００は、Ｍｉｃｒｏｓｏｆｔ  Ｉｎｔｅｒｎｅｔ  Ｅｘｐｌｏｒｅｒ（登録商標）、ＭｏｚｉｌｌａのＦｉｒｅｆｏｘ、または既知もしくは将来開発される任意のブラウザ等のブラウザ内で動作するか、またはそれらのブラウザに関連付けられ得る。システム４００はブラウザ内での動作またはブラウザとの関連付けに限定されないことが理解される。
【００３３】
[0033]  システム４００またはその一部は、（たとえば、クラウド内の）サービスから取得した情報を含み得るか、またはクラウドコンピューティング環境で動作し得る。クラウドコンピューティング環境は、コンピューティングサービスが所有されるのではなくオンデマンドで提供される環境であり得る。たとえば、情報はネットワーク化されたクラウドの複数のデバイスに存在する可能性があり、および／またはデータをクラウド内の複数のデバイスに保存することができる。
【００３４】
[0034]  システム４００は、プロセッサ１４２等の１つまたは複数のプロセッサと、メモリ１４４と、言語コンパイラ４０４、ＪＩＴコンパイラ４０８、脱出エンジン４１４、デバッガ４１６、インタープリタ４１８、および／またはデバッグ情報を表示できるデバッガディスプレイ４２０の１つまたは複数とを含むことができる。言語コンパイラ４０４、ＪＩＴコンパイラ４０８、脱出エンジン４１４、デバッガ４１６、およびインタープリタ４１８は、メモリ１４４に読み込まれたときに１つまたは複数のプロセッサ１４２等に言語コンパイラ４０４、ＪＩＴコンパイラ４０８、脱出エンジン４１４、デバッガ４１６、および／またはインタープリタ４１８にそれぞれ帰属する動作を実行させる、１つまたは複数のプログラムモジュールとして実装され得る。システム４００は、当技術分野で知られているが図示されていない他の構成要素を含み得る。
【００３５】
[0035]  図１ｄに示すように、システム４００は、言語コンパイラ４０４等の言語コンパイラを含むことができる。言語コンパイラ４０４は、特定のプログラミング言語で記述されたソースコードを受け取り、そのソースコードから中間言語（IL）４０６等の中間言語を生成することができるコンパイラであり得る。ソースコードの一部またはすべてを言語コンパイラ４０４で処理して、ＩＬ４０６等の中間言語を生成することができる。言語コンパイラ４０４は、ソースコード４０２等のソースコードまたはその一部を受け取ることができる。ソースコード４０２は、任意のプログラミング言語で記述することができる。ソースコード４０２またはその一部は、ソースコード４０２をインタープリタ４１８に送ることで解釈することができる。よって、ソースコード４０２の一部がコンパイルされ得る。ソースコード４０２の一部が解釈され得る。プログラム部分がコンパイルされるか解釈されるかは、パフォーマンスのヒューリスティックに基づき得る。特定のプログラム部分がネイティブモードでより速く実行される場合、そのプログラム部分はネイティブモードにコンパイルされ得る。特定のプログラム部分が解釈済みモードでより速く実行される場合、そのプログラム部分は解釈され得る。
【００３６】
[0036]  図１ｄに示すように、システム４００は、ＪＩＴコンパイラ４０８等のＪＩＴコンパイラを含むことができる。ＪＩＴコンパイラ４０８は、ＩＬ４０６等の中間言語を受け取り、その中間言語からネイティブコード４１０等のネイティブコードを生成することができる。ネイティブコード４１０は、実行のためにプロセス４１２等のプロセスに読み込まれ得る。ＪＩＴコンパイラ４０８は、ＪａｖａＳｃｒｉｐｔコンパイラ、ＶＢＳｃｒｉｐｔコンパイラ、Ｐｙｔｈｏｎコンパイラ、または本明細書に記載されるかもしくは公知である別の動的言語もしくは動的スクリプト言語のコンパイラとして実装され得る。ＪＩＴコンパイラ４０８は「ジャストインタイム」コンパイラと呼ばれる。これは、ネイティブコード全体を実行前に事前コンパイルするのではなく、コンパイル済みのネイティブコードが必要なとき（たとえば、実行が差し迫っているとき）に、特定のプログラム部分がＪＩＴコンパイラ４０８によりコンパイルされ得るからである。ＪＩＴコンパイラ４０８は、マシン実行可能コードまたは命令の形式を備えたコンパイル済みネイティブコードを生成することができる。
【００３７】
[0037]  ＪＩＴコンパイラ４０８は、上述した仮定に基づいて、コードの最適化を実行することができる。ＪＩＴコンパイラ４０８は、生成したコンパイル済みコードに、１つまたは複数の定義済みのデバッグ脱出ポイントを挿入することができる。デバッグ脱出ポイントは、特定のデバッグ脱出条件が満たされる場合にネイティブモードのデバッグが解釈済みモードのデバッグに移行し得る、プログラム内の位置である。関数の先頭、ループのバックエッジ、関数が戻ったとき、ヘルパ関数またはライブラリの呼び出しが戻ったとき、またはデバッガステートメントに遭遇したとき等のデバッグ脱出ポイントを、プログラムに対して定義することができる。デバッグ脱出が発生したとき、ネイティブコードの実行を停止することができる。ネイティブコードで実行されているプログラムの現在の状態を、デバッグ脱出レコードにキャプチャすることができる。デバッグ脱出レコードは、現在の実行ポイント、デバッグ脱出ポイントの位置に対応するソースコード４０２内の位置、変数値、ならびに変数値がレジスタのどこに配置されているかおよび／もしくは変数値がスタックのどこに配置されているかを記録することができる。そのデバッグ脱出ポイントのデバッグ脱出レコードを、脱出エンジンに渡すことができる。
【００３８】
[0038]  図１ｄに示すように、システム４００は、脱出エンジン４１４等の脱出エンジンを含むことができる。脱出エンジン４１２は、１つまたは複数のデバッグ脱出レコードを受け取ることができる。脱出エンジン４１４は、インタープリタが必要とする変数の状態（たとえば、値）を復元することができる。脱出エンジン４１４は、スタックの新しいフレームを作成することができる。インタープリタが必要とする変数が非アクティブになっている場合、脱出エンジン４１４は、変数の状態を非アクティブからアクティブに変更することにより、非アクティブな変数を復活させることができる。脱出エンジン４１４は、インタープリタ４１８のインスタンスを作成し、ネイティブコードのデバッグ脱出ポイントに対応するソースコード内の位置と、すべての復元されたアクティブ変数の値を含む新たに作成されたインタープリタフレームとを、インタープリタに渡すことができる。デバッグ脱出位置が関数等のコードセクション内に位置している場合、デバッグが解釈済みモードで再開するポイントは、そのコードセクションの先頭であり得る（たとえば、デバッガは、デバッグ脱出ポイントに遭遇したポイントではなく、関数の先頭で再開することができる）。
【００３９】
[0039]  デバッグ脱出がトリガされたとき、ネイティブコードのデバッグを停止することができる。ネイティブコードの実行を停止することができる。状態をデバッグ脱出レコードにキャプチャすることができる。デバッグ脱出レコードは、現在の実行ポイント、変数値、および変数値が配置されている場所を記録する。変数値は、ＣＰＵのレジスタに格納するか、またはネイティブスタックに格納することができる。その脱出ポイントのデバッグ脱出レコードを、脱出エンジン４１４に渡すことができる。脱出エンジン４１４は、インタープリタ用に作成されたスタックで、インタープリタが必要とする変数の状態（たとえば、値）を復元することができる。脱出エンジン４１４は、スタックの新しいインタープリタフレームを作成することができる。インタープリタが必要とする変数が非アクティブになっている場合、脱出エンジン４１４は、変数の状態を非アクティブからアクティブに変更することにより、変数を復活させることができる。脱出エンジン４１４は、インタープリタ４１８のインスタンスを作成し、ネイティブコード内のデバッグ脱出ポイントに対応するソースコード内の位置と、すべての復元されたアクティブ変数の値を含む新たに作成されたインタープリタフレームとを、インタープリタに渡すことができる。
【００４０】
[0040]  図１ｄに示すように、デバッガ４１６等のデバッガは、ネイティブコードをデバッグ用に受け取ることができる。本明細書に記載されるデバッガは、ネイティブモードで実行することができる。つまり、デバッガは、ネイティブコードでデバッグ操作を実行することができる。本明細書で開示される主題の一部の態様に基づくデバッガは、プログラム変数の現在の値とスタック情報とを、デバッグディスプレイでの表示用に提供することができる。変数の検査、式の評価、および変数の変更を含むデバッグ操作では、呼び出しスタックのネイティブフレームを使用することができる。変数がレジスタに保存される（たとえば、変数がプログラムで定義される）たびに、値も関数のスタック位置に保存することができる。特定のローカル変数の値の位置を追跡するために、本明細書に記載される主題の態様に基づいて、ローカル変数が定義される（すなわち、ローカル変数に値が割り当てられる）たびに、そのローカル変数をスタック位置に書き込むことができる。関数のローカル変数に使用されるスタック位置は、グループにまとめて、関数のローカル変数を１つのスタック領域で見つけられるようにすることが可能である。よって、特定の関数の任意のローカル変数の現在の値は、たとえネイティブコードがその変数にレジスタを使用していても、対応するスタック位置に常に存在する。スタックの同じ領域を、スピルに使用することができる（すなわち、ライブ変数がコンピューティングデバイスのレジスタよりも多いとき、変数がレジスタからメモリに「あふれ出る」ことがある）。スタック位置は、デバッガにより変数の値を取得および変更するために使用され得る。デバッガでの変数の変更をサポートするために、ローカル変数が格納されているスタックの領域に隣接して、インジケータを配置することができる。インジケータは、設定された場合に、デバッグされている関数のローカル変数がユーザによって変更されたことを示すフラグであり得る。デバッグされる関数は、最上位のスタックフレームの関数または下位のスタックフレームの関数であり得る。たとえば、ブレークポイントに遭遇したと仮定する。ユーザは、現在のスタックフレームではないスタックフレームに関連付けられた関数をネイティブモードで実行しながら、その関数に属するローカル変数の値を変更することができる。関数のローカル変数が変更されたことを示すフラグが、ユーザによりローカル変数が変更された関数に関連付けられたスタックフレームに設定される。
【００４１】
[0041]  関数メタデータは、関数で使用されるローカル変数の数に関する情報を含む。本明細書で開示される主題の一部の態様に基づき、ローカル変数の値を取得するために、デバッガは、ローカル変数の識別子と等価であるスタックの開始位置からのオフセットに存在するスタック位置の値を読み取ることで、ローカル変数の値を判断することができる。ローカル変数の値を変更するために、デバッガは、新しい値を対応するスタック位置に書き込み、変更済みローカル変数フラグ（スタックのローカル変数を格納できる領域に隣接して配置される）を設定して、関数のローカル変数が変更されたことを示すことができる。
【００４２】
[0042]  ネイティブモードで実行されている関数に実行が戻ると、脱出エンジンは、変更済みローカル変数フラグを検査することができる。実行が戻った関数に対応するスタックフレームに対してローカル変数値が変更された場合、フラグが設定され、解釈済みモードへの脱出がトリガされる。脱出時に、ローカル変数の値を（レジスタからではなく）スタック位置から復元することができ、解釈済みモードで実行されているデバッガは、変更されたローカル変数の変更後の値を受け取る。
【００４３】
[0043]  デバッガは、デバッグ脱出ポイントと呼ばれる、プログラム内の定義されたポイントで、ネイティブモードでの実行から解釈済みモードでの実行に移行することができる。デバッグ脱出ポイントは、関数の先頭、ループのバックエッジ（たとえば、カウンタがインクリメントされ、カウンタが範囲外であるか検査された後）、関数の呼び出しから戻ったとき、ライブラリの呼び出しから戻ったとき、ヘルパ関数の呼び出しから戻ったとき、デバッガ言語ステートメントに遭遇したとき等を含むが、これらに限定されない。本明細書に記載されるデバッガは、解釈済みモードで実行することができる。解釈済みモードで、デバッガは解釈済みコードをデバッグすることができる。たとえば、デバッグされているプログラムの実行を制御するデバッグ操作は、解釈済みモードで実行することができる。実行制御操作は、非同期ブレーク、ステップ操作、ブレークポイント、および／または例外操作でのブレークを通じて実装され得る。
【００４４】
[0044]  非同期ブレークは、たとえば、デバッグセッションのユーザが（たとえば、デバッガユーザインターフェイスで中断オプションをアクティブ化することにより）実行を中断したときに発生し得る。中断は、任意のタイミングで発生し得る。デバッガは、ユーザ操作から妥当な時間が経過した後に、プログラムの実行をブレークすることが予想される。関数の先頭、ループ等を含むがこれらに限定されないコード内の位置に検査を挿入することにより、ユーザ操作に対してタイムリーな応答を提供することができる。これに応じて、デバッガは、設定されたときにネイティブモードのデバッグから解釈済みモードのデバッグへの移行を強制する移行フラグを設定することができる。プロセスのスレッドごとに１つの移行フラグが提供され得る。ネイティブコードの実行が関数に入るか、またはループの先頭に移動したときに、移行フラグを調べることができる。移行フラグが設定されている場合、デバッグの脱出をトリガすることができ、実行をネイティブモードのデバッグから解釈済みモードのデバッグに移行することができる。関数に類似するソースコードを取得し、インタープリタに送ることができる。デバッガは、非同期ブレークを検出し、移行フラグをクリアすることができる。非同期ブレークは、実行をブレーク（停止）し、現在のプログラム状態をデバッガディスプレイに表示することにより、完了することができる。
【００４５】
[0045]  ステップ操作は、関数にステップインするか、関数からステップアウトするか、または関数もしくは命令をステップオーバする、ユーザ指示の動作であり得る。各ステップデバッグ操作の開始時に、デバッガはステップ種類フラグとステップフレームベースフラグとを設定することができる。ステップフレームベースフラグは、現在の関数スタックフレームベースに設定することができる。ステップフレームフラグは、スタック深度を調べて再帰を検出するために使用することができる。本明細書で開示される主題の一部の態様に基づき、インタープリタモードへの移行は、実行によってステップ操作が開始されたときと同じ関数がスタックの上位のフレームに残るときは行われない。たとえば、現在の位置が関数Ａであり、ユーザがステップアウトを実行し、それによって関数Ａの呼び出し元である関数Ｂに戻ると仮定する。関数Ａが、関数Ａまたは関数Ｂであり得る別の関数を呼び出す場合、ステップが開始されたときの関数Ａの最初のスタックフレームが依然としてスタックに存在する間に制御が関数Ａ、関数Ｂ、または別の関数に戻ったときに、デバッグ脱出はトリガされない。
【００４６】
[0046]  ステップアウト操作の場合、デバッガは、ステップ種類フラグをステップアウトに設定することができる。プログラムの実行は再開することができる。実行が現在の関数からネイティブモードで実行している別の関数に戻るとき、脱出エンジンは、ステップ種類フラグおよびステップフレームフラグが設定されているか否かを判断することができる。設定されている場合、現在のスタックフレームベースを、ステップフレームフラグに格納された値と比較することができる。現在のスタックフレームベースがステップフレームフラグに格納された値よりも大きい場合、スタックが小さいアドレスに向かって成長すると仮定すると、スタック深度が減少している。スタック深度の減少に応じて、インタープリタモードへの脱出をトリガすることができる。デバッガは、解釈済みコードのデバッグに移行することができる。実行を停止し、現在のプログラム状態をデバッガディスプレイに表示することができる。
【００４７】
[0047]  ネイティブコードがネイティブモードで実行されている別の関数に入ったとき、またはステップイン操作が関数の最後のステートメントで行われて関数から戻る場合、これらのフラグの脱出検査が発生し、インタープリタモードデバッグへの脱出がトリガされる。デバッガは解釈済みモードで動作し、現在のプログラム状態をデバッガディスプレイに表示することができる。
【００４８】
[0048]  ステップオーバデバッグ操作の場合、ステップオーバする関数は、インタープリタモードでの実行を強制されず、通常はネイティブモードで実行される。脱出は、ステップ操作が現在の関数の最後のステートメントで行われ、関数からの戻りにつながるときにのみ、トリガされ得る。スタック深度の減少に応じて、インタープリタモードのデバッグへの脱出がトリガされる。デバッガは、現在のプログラム状態をデバッガディスプレイに表示することができる。
【００４９】
[0049]  ユーザが関数にブレークポイントを設定すると、デバッガは関数のブレークポイントの数を追跡するカウンタをインクリメントすることにより、関数メタデータを更新することができる。関数が実行されると（関数の実行が開始されるか、または関数が別の関数を呼び出し、呼び出された関数が呼び出した関数に戻ると）、デバッグ脱出をトリガする条件が検査される。現在の関数のブレークポイントカウントがゼロより大きい場合、デバッグ脱出をトリガすることができ、デバッガは解釈済みモードでの実行に移行することができる。デバッガは、ブレークポイントが設定されたステートメントで停止し、現在の実行ポイントをデバッガディスプレイに表示することができる。
【００５０】
[0050]  例外／例外後の続行のブレークポイントに遭遇した場合、デバッガの下で実行されているプログラムは、例外イベントをデバッガに通知し、例外を発生させたステートメントの後ろの次のステートメントから実行を続行するか、または実行を特定のステートメントで再開するように設定し、そのステートメントから続行することができる。デバッガに通知するために、ネイティブコードは「スローイングヘルパ」関数を使用し、すべてのスローがその関数を通じて転送されるようにすることができる。デバッガは、例外をスローしたステートメントで停止し、変数の値をデバッガディスプレイに表示することができる。
【００５１】
[0051]  （例外がスローされたときにプログラムがネイティブモードで実行されていた場合に）次のステートメントに続行するために、コンパイラは、プログラム内の例外が発生し得るすべての場所を特定することができる。例外は、ヘルパ関数の呼び出しが行われたとき、またはライブラリ関数の呼び出しが行われたときに、明示的なスローステートメントによりスローされ得る。たとえば、オブジェクトからプロパティを削除するＪａｖａＳｃｒｉｐｔのｄｅｌｅｔｅステートメントは、オブジェクトがｎｕｌｌであるか、または未定義であるときに、例外をスローすることができる。この例外がスローされるのは、ｎｕｌｌまたは未定義のオブジェクトは、いかなるプロパティも持たないからである。ここで、「ヘルパ」とは、典型的にはネイティブコードを使用して言語で（たとえば、JavaScriptエンジンで）実装された関数を意味し、オブジェクトからのプロパティの削除など、何らかの操作または言語コンストラクトを実行するために使用される。「ライブラリ関数」とは、ライブラリルーチンを実装する関数を意味する。たとえば、ＪａｖａＳｃｒｉｐｔには、「ｓｔｒｉｎｇ」など、複数のライブラリオブジェクトがある。「ｓｔｒｉｎｇ」オブジェクトは、ｓｔｒｉｎｇ．ｃｏｎｃａｔなど、複数の操作を含む。ｓｔｒｉｎｇ．ｃｏｎｃａｔは、純粋な言語ルーチンではない。言語によっては、ライブラリ関数とヘルパ関数とを区別するのは合理的でないこともある。しかし、ＪａｖａＳｃｒｉｐｔを含むがこれに限定されない一部の言語では、ライブラリの呼び出しは技術的にはスクリプト（すなわち、ユーザ）関数の呼び出しと同じであり、よってインターセプトされ得るという点で、ライブラリ関数とヘルパ関数は異なる。たとえば、ユーザはスクリプト関数をｓｔｒｉｎｇ．ｃｏｎｃａｔに割り当てることができる。ｓｔｒｉｎｇ．ｃｏｎｃａｔが次回呼び出されたとき、エンジンは元のｓｔｒｉｎｇ．ｃｏｎｃａｔ関数ではなく、新たに割り当てられたユーザ関数を呼び出す。ヘルパ関数はインターセプトされることはなく、典型的にはネイティブ／コンパイル済みコードで直接呼び出される。
【００５２】
[0052]  ネイティブコードで例外が発生した後に続行するために、各ヘルパ呼び出しおよび各ライブラリ呼び出しを、ｔｒｙ−ｃａｔｃｈステートメントブロックで囲むことができる。ｔｒｙ−ｃａｔｃｈブロックの「ｔｒｙ」部分で、ヘルパ関数を呼び出すことができる。元のヘルパ関数により返された値は、ローカル変数に保存することができる。ｔｒｙ−ｃａｔｃｈブロックの「ｃａｔｃｈ」部分で、解釈済みモードのデバッガで「例外の後に続行」オプションが有効になっている場合、例外続行フラグを設定することができる。ｔｒｙ−ｃａｔｃｈブロックの「ｃａｔｃｈ」部分の後、元のヘルパの値を返すことができる。例外の後に続行するためのデバッガ脱出検査を、ヘルパ関数の各呼び出しからの各戻りの後、またはライブラリの呼び出しからの各戻りの後に、挿入することができる。デバッグ脱出検査では、例外続行フラグを検査し、フラグが設定されている場合に、インタープリタモードへのデバッグ脱出をトリガすることができる。デバッガは、インタープリタモードに移行して、デバッガ内で続行のための実行制御を行えるようにすることができる。たとえば、「例外でブレーク」へのユーザ応答が命令のステップオーバである場合、デバッガは次のステートメントにステップする。「例外でブレーク」へのユーザ応答が続行である場合、デバッガは関数の残りの部分の実行を解釈済みモードで続行する。
【００５３】
[0053]  デバッガは、デバッガディスプレイ４２０等のデバッガディスプレイデバイスに、デバッグ情報を表示することができる。デバッガは、呼び出しスタックからの情報、ローカル変数の値等をデバッガディスプレイに表示することができる。
【００５４】
[0054]  図２は、本明細書で開示される主題の態様に基づいて、ネイティブモードのデバッグから解釈済みモードのデバッグに移行することができる方法２５０を示す。図２に示す方法は、図１ｄに関連して説明したシステムを含むがこれに限定されないシステムにより実行することができる。方法２５０は順番に実行される一連の操作を示しているが、方法２５０は順序によって限定されないことが理解される。たとえば、一部の操作は、図示された順序とは異なる順序で発生し得る。加えて、ある操作が、別の操作と同時に発生することがあり得る。一部の例では、図示されたすべての操作が実行されるとは限らない。
【００５５】
[0055]  動作時に、図１ｄに示すシステム等のシステムは、以下のように動作することができる。操作２５１で、デバッグ脱出ポイントをプログラムに対して定義することができる。デバッグ脱出ポイントは、ネイティブモードのデバッグから解釈済みモードのデバッグへの移行が発生し得る、プログラム内のポイントである。デバッグ脱出ポイントは、関数の先頭、ループのバックエッジ（たとえば、カウンタがインクリメントされ、カウンタが範囲外であるか確認された後）、関数の呼び出しから戻ったとき、ライブラリの呼び出しから戻ったとき、ヘルパ関数の呼び出しから戻ったとき、デバッガ言語ステートメントに遭遇したとき等を含むが、これらに限定されない。プログラムがコンパイルされるときに、デバッグ脱出ポイントでデバッグ処理を挿入することができる。
【００５６】
[0056]  操作２５２で、デバッグセッションを開始することができる。デバッグセッションが開始されると、デバッガがアタッチされたプロセスで実行されているプログラムに対して以前に生成されたネイティブコードをすべて破棄することができる。操作２５４で、デバッグモードのネイティブコードを、デバッガがアタッチされたプログラムから生成することができる。デバッグモードのネイティブコードは、ネイティブコードのデバッグから解釈済みコードのデバッグへの移行に関連する処理を含み得る。デバッグモードのネイティブコードは、プロセスに読み込むことができる。関数がデバッグモードでネイティブコードにコンパイルされるとき、関数の各脱出ポイントで、１つまたは複数の脱出条件検査をネイティブコードに挿入することができる。脱出条件検査は、プログラムの内部ネイティブ表現を生成するコンパイル段階で挿入することができる。脱出条件検査は、脱出レコードのデータがキャプチャされるときに、コードに挿入することができる。脱出条件検査は、デバッガにより制御される多様なフラグまたはインジケータの状態（設定または未設定）もしくは値の検査を含み得る。
【００５７】
[0057]  デバッグ脱出のインジケータまたはフラグは、設定された場合にデバッガがネイティブモードから解釈済みモードに移行することを示すインジケータ、設定された場合に関数にブレークポイントが含まれていることを示すインジケータ、再帰を検出するためのスタックアドレスを指定するインジケータ、実行されるステップ操作の種類を示すインジケータ、設定された場合にデバッガが実行しているステップ（ステップイン、ステップアウト、ステップオーバ）操作の種類を示すインジケータ、設定された場合に現在のスタックフレームでフィールドが変更されたこと示すスタックのインジケータ、および設定された場合に明示的な無条件の脱出を注入するために使用されるインジケータを含み得るが、これらに限定されない。
【００５８】
[0058]  操作２５６で、ネイティブコードをデバッグモードで実行することができる。実行がデバッグ脱出ポイントに到達したとき、多様な脱出条件を検査することができる。ある種類のデバッグ脱出シナリオで検査される脱出条件は、他の種類の脱出で検査される脱出条件と異なる可能性がある。たとえば、ユーザがデバッガの下で実行されているプログラムの実行を、関数の先頭またはループのバックエッジ（ループのカウンタがインクリメントされ、カウンタが範囲内であるか検査されるとき）で中断したと仮定する。デバッガは、関数の先頭またはループのバックエッジに挿入されたネイティブコードがネイティブコードをインタープリタモードに脱出させるフラグが設定されているか確認する場合に、ネイティブコードをインタープリタモードに脱出させるフラグを設定することができる。一方、ユーザがデバッガのＵＩで、関数にステップインするオプションを選択したと仮定する。デバッガは、要求されたステップ操作の種類を示すステップフラグを設定することができる。ネイティブコードにより実行される検査は、ステップフラグの値が「ステップイン」に設定されているとの判断に応じた脱出であり得る。ユーザ操作により、関数のどこかにブレークポイントが配置されたと仮定する。デバッガは、関数のブレークポイントの数を追跡するフラグをインクリメントすることができる。現在の関数のブレークポイントカウントがゼロより大きい場合、脱出がトリガされ、実行が解釈済みモードに移行する。
【００５９】
[0059]  実行がブレークポイントを含むフレームに到達すると、ネイティブコードでのプログラムの実行が停止し、脱出エンジンがデバッグ脱出レコードを受け取り、関数がインタープリタに送られ、解釈された関数のデバッグが関数の先頭から続行される。操作２６０で、少なくとも１つの脱出条件が操作２５８で満たされたとの判断に応じて、ネイティブモードでのデバッグを停止し、デバッグを解釈済みモードに移行することができる。ネイティブコードのデバッグから対応する解釈済みコードへの移行は、ユーザが開始した操作によりトリガされ得り、または明示的な無条件の脱出に遭遇したときにトリガされ得る。
【００６０】
[0060]  操作２６２で、インタープリタ変数を脱出レコードから復元することができる。いずれかの脱出条件が満たされる場合、実行状態（変数の位置および値、一時変数の位置および値、ならびにスタック値のスナップショットを作成し、デバッグ脱出レコードに保存することができる。デバッグ脱出レコードは、脱出エンジンに送ることができる。脱出エンジンは、インタープリタのインスタンスを作成し、インタープリタのインタープリタスタックフレームを設定することができる。操作２６４で、デバッグを解釈済みモードで再開することができる。操作２５８で脱出条件が検出されなかった場合、操作２６６で、ネイティブモードでのデバッグを続行することができる。
【００６１】
適切なコンピューティング環境の例
[0061]  本明細書で開示される主題の多様な態様のコンテキストを提供するために、図３および以下の説明は、本明細書で開示される主題の多様な実施形態が実装され得る適切なコンピューティング環境５１０について簡単に概説することを目的としている。本明細書で開示される主題について、１つもしくは複数のコンピュータまたは他のコンピューティングデバイスにより実行されるプログラムモジュール等のコンピュータ実行可能命令の文脈で説明するが、当業者は、本明細書で開示される主題の一部が他のプログラムモジュールとの組み合わせおよび／またはハードウェアとソフトウェアの組み合わせでも実装され得ることを理解する。一般に、プログラムモジュールは、特定のタスクを実行するか、または特定のデータ型を実装する、ルーチン、プログラム、オブジェクト、物理的アーチファクト、データ構造等を含む。典型的には、プログラムモジュールの機能は、多様な実施形態で必要に応じて組み合わされるか、または分散され得る。コンピューティング環境５１０は、適切な動作環境の一例に過ぎず、本明細書で開示される主題の使用または機能の範囲を限定することを意図したものではない。
【００６２】
[0062]  図３を参照すると、コンピュータ５１２の形式のコンピューティングデバイスが示されている。コンピュータ５１２は、少なくとも１つの処理ユニット５１４と、システムメモリ５１６と、システムバス５１８とを備え得る。少なくとも１つの処理ユニット５１４は、システムメモリ５１６等であるがこれに限定されないメモリに格納された命令を実行することができる。処理ユニット５１４は、利用できる多様なプロセッサのいずれかであり得る。たとえば、処理ユニット５１４は、グラフィック処理ユニット（GPU）であり得る。命令は、上述した１つまたは複数の構成要素またはモジュールにより実行される機能を実装する命令、または上述した１つまたは複数の方法を実行する命令であり得る。デュアルマイクロプロセッサおよび他のマルチプロセッサアーキテクチャを処理ユニット５１４として利用することもできる。コンピュータ５１２は、ディスプレイ画面でのグラフィックのレンダリングをサポートするシステムで使用され得る。別の例では、コンピューティングデバイスの少なくとも一部は、グラフィック処理ユニットを備えたシステムで使用され得る。システムメモリ５１６は、揮発性メモリ５２０と、不揮発性メモリ５２２とを含み得る。不揮発性メモリ５２２は、読み取り専用メモリ（ROM）、プログラム可能ＲＯＭ（PROM）、電気的プログラム可能ＲＯＭ（EPROM）、またはフラッシュメモリを含み得る。揮発性メモリ５２０は、外部キャッシュメモリとして機能し得るランダムアクセスメモリ（RAM）を含み得る。システムバス５１８は、システムメモリ５１６を含むシステムの物理的アーチファクトを処理ユニット５１４に連結する。システムバス５１８は、メモリバス、メモリコントローラ、周辺機器バス、外部バス、またはローカルバスを含む複数の種類のいずれかであり得り、利用可能なバスアーキテクチャの任意の種類を使用し得る。コンピュータ５１２は、処理ユニット５１４によりシステムバス５１８を通じてアクセスされ得るデータストアを含み得る。データストアは、グラフィックレンダリングのための実行可能命令、３Ｄモデル、マテリアル、テクスチャ等を含み得る。
【００６３】
[0063]  コンピュータ５１２は、典型的には、揮発性媒体、不揮発性媒体、リムーバブル媒体、非リムーバブル媒体等の多様なコンピュータ可読媒体を含む。コンピュータ可読媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、その他のデータ等の情報を格納するための任意の方法または技術で実装され得る。コンピュータ可読媒体は、コンピュータ可読記憶媒体（コンピュータ記憶媒体とも呼ばれる）および通信媒体を含む。コンピュータ記憶媒体は、所望のデータを格納でき、コンピュータ５１２によりアクセスできる、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリもしくは他のメモリ技術、ＣＤＲＯＭ、デジタル多用途ディスク（DVD）もしくは他の光学ディスクストレージ、磁気カセット、磁気テープ、および磁気ディスクストレージもしくは他の磁気ストレージデバイスを含むがこれらに限定されない物理（有形）媒体を含む。通信媒体は、所望の情報を伝えるために使用でき、コンピュータ５１２によりアクセスできる、通信信号、変調搬送波、または任意の他の無形媒体を含むがこれらに限定されない媒体を含む。
【００６４】
[0064]  図３は、ユーザとコンピュータリソースとの間の仲介として機能することができるソフトウェアを示していることが理解される。このソフトウェアは、ディスクストレージ５２４に格納することができ、コンピュータ５１２のリソースを割り当てることができる、オペレーティングシステム５２８を含み得る。ディスクストレージ５２４は、インターフェイス５２６等の非リムーバブルメモリインターフェイスを通じてシステムバス５１８に接続されるハードディスクドライブであり得る。システムアプリケーション５３０は、システムメモリ５１６またはディスクストレージ５２４に格納されたプログラムモジュール５３２およびプログラムデータ５３４を通じて、オペレーティングシステム５２８によるリソースの管理を利用する。コンピュータは多様なオペレーティングシステムまたはオペレーティングシステムの組み合わせにより実装され得ることが理解される。
【００６５】
[0065]  ユーザは、入力デバイス５３６を通じて、命令または情報をコンピュータ５１２に入力することができる。入力デバイス５３６は、マウス、トラックボール、スタイラス、タッチパッド等のポインティングデバイス、キーボード、マイク、音声認識システム、ジェスチャ認識システム等を含むが、これらに限定されない。これらの入力デバイスおよび他の入力デバイスは、インターフェイスポート５３８経由でシステムバス５１８を通じて処理ユニット５１４に接続される。インターフェイスポート５３８は、シリアルポート、パラレルポート、ユニバーサルシリアルバス（USB）等を表し得る。出力デバイス５４０は、入力デバイスと同じ種類のポートを使用し得る。モニタ、スピーカ、プリンタなど、特定のアダプタを必要とする出力デバイス５４０が存在することを示すために、出力アダプタ５４２が提供されている。出力アダプタ５４２は、出力デバイス５４０とシステムバス５１８との間の接続を提供するビデオカードおよびサウンドカードを含むが、これらに限定されない。他のデバイスおよび／もしくはシステム、またはリモートコンピュータ５４４等のデバイスは、入力機能と出力機能の両方を備え得る。
【００６６】
[0066]  コンピュータ５１２は、リモートコンピュータ５４４等の１つまたは複数のリモートコンピュータへの論理接続を使用したネットワーク環境で動作することができる。リモートコンピュータ５４４は、パーソナルコンピュータ、サーバ、ルータ、ネットワークＰＣ、ピアデバイスまたは他の共通ネットワークノードであり得る。図３ではメモリストレージデバイス５４６のみが示されているが、リモートコンピュータ５４４は、典型的には、コンピュータ５１２に関連して上述した要素の多数またはすべてを含む。リモートコンピュータ５４４は、通信接続５５０を介して論理的に接続され得る。ネットワークインターフェイス５４８は、ローカルエリアネットワーク（LAN）やワイドエリアネットワーク（WAN）などの通信ネットワークを包含するが、他のネットワークも含み得る。通信接続５５０は、ネットワークインターフェイス５４８をバス５１８に接続するために利用されるハードウェア／ソフトウェアを示す。通信接続５５０は、コンピュータ５１２に対して内的または外的であり得り、モデム（電話、ケーブル、DSL、およびワイヤレス）、ＩＳＤＮアダプタ、イーサネットカード等の内的および外的な技術を含む。
【００６７】
[0067]  図示されたネットワーク接続は単なる例であり、コンピュータ間の通信リンクを確立する他の手段が使用され得ることが理解される。当業者は、コンピュータ５１２または他のクライアントデバイスをコンピュータネットワークの一部として展開できることを理解することができる。これに関し、本明細書で開示される主題は、任意の数のメモリまたはストレージユニットと、任意の数のストレージユニットまたはボリュームで発生する任意の数のアプリケーションおよびプロセスとを備えた任意のコンピュータシステムに関し得る。本明細書で開示される主題の態様は、サーバコンピュータおよびクライアントコンピュータがネットワーク環境で展開され、リモートまたはローカルのストレージが含まれる環境に当てはまり得る。本明細書で開示される主題の態様は、プログラミング言語機能、解釈機能、および実行機能を備えたスタンドアロンのコンピューティングデバイスにも当てはまり得る。
【００６８】
[0068]  図４は、統合開発環境（IDE）６００と、共通言語ランタイム環境６０２とを示す。ＩＤＥ６００は、ユーザ（たとえば、開発者、プログラマ、設計者、コーダ等）が、プログラム、一群のプログラム、ウェブサイト、ウェブアプリケーション、およびウェブサービスをコンピュータシステムで設計、コーディング、コンパイル、テスト、実行、編集、デバッグ、またはビルドすることを可能にし得る。ソフトウェアプログラムは、１つまたは複数のソースコード言語（たとえば、Visual Basic、Visual J#、C++、C#、J#、Java Script、APL、COBOL、Pascal、Eiffel、Haskell、ML、Oberon、Perl、Python、Scheme、Smalltalk等）で作成されたソースコード（構成要素６１０）を含み得る。ＩＤＥ６００は、ネイティブコード開発環境を提供するか、仮想マシンで実行されるマネージコード開発を提供するか、またはそれらの組み合わせを提供し得る。ＩＤＥ６００は、Ｍｉｃｒｏｓｏｆｔ．ＮＥＴ（商標）Ｆｒａｍｅｗｏｒｋを使用したマネージコード開発環境を提供し得る。ソースコード構成要素６１０およびネイティブコード構成要素６１１から、モデリングツール６５２およびモデルストア６５３を使用する言語固有のソースコンパイラ６２０を使用して、中間言語構成要素６５０が作成され得り、アプリケーションの実行時に、中間言語構成要素６５０から、中間言語コンパイラ６６０（たとえば、ジャストインタイム（JIT）コンパイラ）を使用して、ネイティブコード構成要素６１１（たとえば、マシン実行可能命令）が作成される。つまり、中間言語（IL）アプリケーションが実行されると、中間言語（IL）アプリケーションは実行されているプラットフォームの適切なマシン語に実行中にコンパイルされる。よって、コードは複数のプラットフォームに移植可能となる。代替で、他の実施形態では、プログラムは目的のプラットフォームの適切なネイティブコードマシン語（図示せず）にコンパイルされ得る。
【００６９】
[0069]  ユーザは、ＩＤＥ６００のユーザインターフェイス６４０およびソースコードエディタ６５１を使用して、既知のソフトウェアプログラミング手法と、特定のソース言語に関連する固有の論理的および構文的ルールとに基づき、ソースコード構成要素を作成および／または編集することができる。その後、ソースコンパイラ６２０を介してソースコード構成要素６１０をコンパイルすることができ、それによってアセンブリ６３０等のプログラムの中間言語表現が作成され得る。アセンブリ６３０は、中間言語構成要素６５０と、メタデータ６４２とを含み得る。アプリケーション設計を展開前に検証することが可能となり得る。
【００７０】
[0070]  本明細書に記載された多様な手法は、ハードウェアもしくはソフトウェアと関連して、または必要に応じてそれらの組み合わせと関連して、実装され得る。よって、本明細書に記載された方法および装置、またはそれらの方法および装置の特定の態様もしくは部分は、フロッピー（登録商標）ディスク、ＣＤ−ＲＯＭ、ハードドライブ、任意の他のマシン可読記憶媒体等の有形の媒体に埋め込まれたプログラムコード（すなわち、命令）の形態をとり得る。このプログラムコードがコンピュータ等のマシンに読み込まれて実行されると、そのマシンが本明細書で開示される主題の態様を実行する装置となる。本明細書で使用される「マシン可読記憶媒体」という用語は、任意の形態の伝搬信号を提供する（すなわち、格納および／または送信する）すべての機構を除外すると解釈されるべきである。プログラム可能なコンピュータでプログラムコードを実行する場合、コンピューティングデバイスは、通常、プロセッサと、プロセッサにより読み取ることができる記憶媒体（揮発性および不揮発性のメモリおよび／またはストレージ要素を含む）と、少なくとも１つの入力デバイスと、少なくとも１つの出力デバイスとを備える。たとえばデータ処理ＡＰＩ等の使用を通じて、領域固有のプログラミングモデル態様の作成および／または実装を利用できる１つまたは複数のプログラムは、コンピュータシステムとやり取りする高水準の手続き型またはオブジェクト指向型のプログラミング言語で実装され得る。ただし、プログラムは、必要に応じて、アセンブリまたはマシン語で実装され得る。いずれの場合も、言語はコンパイル形式またはインタープリタ形式の言語であり得り、ハードウェア実装と組み合わせられ得る。
【００７１】
[0071]  主題について構造的特徴および／または方法的行為に特有の文言で説明したが、添付の特許請求の範囲で定義される主題は、上述した特定の特徴または行為に必ずしも限定されないことを理解されたい。
【図１ａ】
0006573875.tif 000002
【図１ｂ】
0006573875.tif 000003
【図１ｃ】
0006573875.tif 000004
【図１ｄ】
0006573875.tif 000005
【図２】
0006573875.tif 000006
【図３】
0006573875.tif 000007
【図４】
0006573875.tif 000008