(57)【要約】【課題】  ランタイムホスティングを拡張するためのシステムおよび方法を提供する。【解決手段】  一態様では、ランタイムが、ホストアプリケーションによって公開された任意のアブストラクションインタフェースを識別する。アブストラクションインタフェースは、ホスティングアプリケーションによって実装された各実行環境機能に対応する。ランタイムマネージコードの実行中、各実行環境アブストラクションのうち識別した１つに関連するアクションまたはイベントに応答して、ランタイムは、アブストラクションインタフェースのうち特定の１つに対応する特定のインタフェースまたはオブジェクトを呼び出す。これにより、ホストアプリケーションが、実装するアブストラクションに応じて、ランタイムを含むその実行環境をカスタマイズ／機能強化することが可能となる。【選択図】  図６
2004310776.tif 000002
【特許請求の範囲】
【請求項１】
拡張ランタイムホスティングのための方法であって、
ホストアプリケーションによって公開された、前記ホスティングアプリケーションによってサポートされる各実行環境アブストラクションに対応する１つまたは複数のホストアブストラクションインタフェース（ＨＡＩ）を識別するステップと、
ランタイムマネージコードの実行中、前記各実行環境アブストラクションのうちの識別した１つに関連するアクションまたはイベントに応答して、前記ランタイムにより、前記ＨＡＩのうち特定の１つに対応する少なくとも１つの特定のインタフェースまたはオブジェクトを呼び出すステップとを備え、
識別し呼び出す前記オペレーションは、前記ホスティングアプリケーションに対してホストアプリケーションカスタマイズ可能ランタイムホスティング環境を提供する
ことを特徴とする方法。
【請求項２】
前記１つまたは複数の実行環境アブストラクションは、メモリ、スレッド／タスク、Ｉ／Ｏ完了、同期、ランタイムエントリ／退出通知、および／またはガーベッジコレクション（ＧＣ）に関する管理サービスに対応する
ことを特徴とする請求項１に記載の方法。
【請求項３】
前記呼び出すステップは、前記ランタイムにより、前記ホストアプリケーションによって実装された前記少なくとも１つの特定のインタフェースまたはオブジェクトを介してメモリ割振りを要求するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項４】
前記呼び出すステップは、
前記ランタイムにより、前記少なくとも１つの特定インタフェースまたはオブジェクトを介して前記ＯＳから前記ホストアプリケーションにメモリ不足通知を通信するステップ、および／または
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して特定のメモリ割振りが失敗したという結果を前記ホストアプリケーションに通知し、それによって前記ホストアプリケーションが、メモリ割振りが失敗したに間違いない場合に前記ランタイムが取るべきアクションをカスタマイズすることが可能となるステップとをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項５】
前記呼び出すステップは、前記ランタイムにより、前記ホストアプリケーションによって実装された前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して新しいスレッド／タスクを作成するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項６】
前記呼び出すステップは、前記ランタイムにより、前記ホストアプリケーションによって実装された前記少なくとも１つの特定のインタフェースまたはオブジェクトを介してタスクのランタイム実装部分を再利用またはプールするステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項７】
前記呼び出すステップは、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトあるいはプーリングを介して、タスクを異なる物理ＯＳスレッドに移動することができず、指定の時間ウィンドウの間、前記タスクの実行をブロックすることができないことを、前記ホストアプリケーションに通知するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項８】
前記呼び出すステップは、
タスクが動作可能状態または動作不能状態に移行したときに前記ランタイムに通知するために、前記ランタイムにより、前記少なくとも１つの特定のオブジェクトまたはインタフェースを介して前記ホストアプリケーションに対するコールバックを指示するステップと、
前記タスクが動作不能状態に移行した場合、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、可能な限り早く前記タスクを前記ホストアプリケーションによって再スケジュールすべきであることを指定するステップとをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項９】
前記呼び出すステップは、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、スレッド／タスクをホストアプリケーション実装スレッドプールにキューイングするステップ、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、前記ホストアプリケーション実装スレッドプールのサイズを設定するステップ、および／または
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して前記ホストアプリケーション実装スレッドプールに照会するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項１０】
前記呼び出すステップは、
タスクが異なるロケールに移行したこと、またはロケールが前記タスクに関して変化したことを前記ランタイムに通知するために、前記ホストアプリケーションに対するコールバックを提供するステップ、および／または
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスクが異なるロケールに移行したこと、またはロケールが前記タスクに関して変化したことを前記ホストアプリケーションに通知するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項１１】
前記呼び出すステップは、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、ホストアプリケーションのタスク打切りを遅延するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項１２】
前記呼び出すステップは、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスクの優先順位を調整するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項１３】
前記呼び出すステップは、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドが前記ランタイムからアンマネージコードに退出すべきであることを前記ホストアプリケーションに通知するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項１４】
前記呼び出すステップは、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドが前記ランタイムからアンマネージコードに逆退出すべきであることを前記ホストアプリケーションに通知するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項１５】
前記呼び出すステップは、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドがアンマネージコードから前記ランタイムに進入すべきであることを前記ホストアプリケーションに通知するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項１６】
前記呼び出すステップは、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドがアンマネージコードから前記ランタイムに逆進入すべきであることを前記ホストアプリケーションに通知するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項１７】
前記呼び出すステップは、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、１つまたは複数のＩ／Ｏ完了ポート上のサービス要求にとって利用可能となる最大スレッド／タスク数を指定するステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項１８】
前記呼び出すステップは、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、ハンドルをＩ／Ｏ完了ポートまたは前記ホストアプリケーションにバインドするステップをさらに含む
ことを特徴とする請求項１に記載の方法。
【請求項１９】
前記呼び出すステップは、前記ホストアプリケーションに対するランタイム実装コールバックを供給するステップをさらに含み、前記ランタイム実装コールバックは、非同期Ｉ／Ｏオペレーションが完了したときに前記ホストアプリケーションによって起動すべきである
ことを特徴とする請求項１に記載の方法。
【請求項２０】
前記呼び出すステップは、
前記ホストアプリケーションに対するランタイム実装コールバックを供給するステップであって、前記ランタイム実装コールバックは、非同期Ｉ／Ｏオペレーションが完了したときに前記ホストアプリケーションによって起動すべきであるステップをさらに含み、
前記供給するステップにより、前記ホストアプリケーションが、前記ホストアプリケーションによって前記ランタイム実装コールバックに渡された構造の終りに、状態情報を提供するカスタムデータを挿入することが可能となる
ことを特徴とする請求項１に記載の方法。
【請求項２１】
前記呼び出すステップは、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介してタスクを生成するステップをさらに含み、
前記方法は、前記ランタイムにより、前記少なくとも１つの特定のオブジェクトまたはインタフェースを介して、前記タスクが前記タスクに対するロックのホストアプリケーション知識を実質上保証するための１つまたは複数の同期オブジェクトを作成するステップをさらに備え、前記１つまたは複数の同期オブジェクトは、クリティカルセクション、手動および／または自動リセットイベント、セマフォー、リーダ／ライタロック、および／またはタスクモニタを含む
ことを特徴とする請求項１に記載の方法。
【請求項２２】
前記ランタイムにより、前記ランタイムによって公開される１つまたは複数のランタイムインタフェースを前記ホストアプリケーションに通知するステップをさらに備え、前記ランタイムインタフェースにより、前記ホストが、一定のイベントを前記ランタイムに通知し、かつ／またはプロセス実行中に追加の情報を得ることが可能となることを特徴とする請求項１に記載の方法。
【請求項２３】
拡張ランタイムホスティングのためのコンピュータ可読媒体であって、
ランタイムにより、前記ホスティングアプリケーションによってサポートされる任意の実行環境アブストラクションを識別するようホストアプリケーションに要求し、
要求に応答して、１つまたは複数のホストアブストラクションインタフェース（ＨＡＩ）を受け取り、
ランタイムマネージコードの実行中、前記ランタイムにより、前記ＨＡＩのうち特定の１つに対応する少なくとも１つの特定のインタフェースまたはオブジェクトを呼び出す
ための、プロセッサで実行可能なコンピュータプログラム実行可能命令を備えたことを特徴とするコンピュータ可読媒体。
【請求項２４】
前記１つまたは複数の実行環境アブストラクションは、ホスト実装メモリ、スレッド／タスク、Ｉ／Ｏ完了、同期、イベント通知、および／またはガーベッジコレクション（ＧＣ）機能に対応する
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項２５】
判定のための前記コンピュータプログラム命令は、前記ランタイムにより、インタフェース識別子（ＩＩＤ）を前記ホスティングアプリケーションに通信するための命令をさらに含み、前記ＩＩＤは、アブストラクション特有のインタフェースに対応する
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項２６】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して前記ＯＳから前記ホストアプリケーションにメモリ不足通知を通信するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項２７】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して特定のメモリ割振りが失敗したという結果を前記ホストアプリケーションに通知し、それによって前記ホストアプリケーションが、メモリ割振りが失敗したに間違いない場合に前記ランタイムが取るべきアクションをカスタマイズすることが可能となる命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項２８】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記ホストアプリケーションによって実装される前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して新しいスレッド／タスクを作成するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項２９】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記ホストアプリケーションによって実装された前記少なくとも１つの特定のインタフェースまたはオブジェクトを介してタスクのランタイム実装部分を再利用またはプールするための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項３０】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトあるいはプーリングを介して、タスクを異なる物理ＯＳスレッドに移動することができず、指定の時間ウィンドウの間、前記タスクの実行をブロックすることができないことを、前記ホストアプリケーションに通知するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項３１】
呼出しのための前記コンピュータプログラム命令は、
タスクが動作可能状態または動作不能状態に移行したときに前記ランタイムに通知するために、前記ランタイムにより、前記少なくとも１つの特定のオブジェクトまたはインタフェースを介して前記ホストアプリケーションに対するコールバックを指示し、
前記タスクが動作不能状態に移行した場合、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、可能な限り早く前記タスクを前記ホストアプリケーションによって再スケジュールすべきであることを指定する
ための命令をさらに含むことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項３２】
呼出しのための前記コンピュータプログラム命令は、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、スレッド／タスクをホストアプリケーション実装スレッドプールにキューイングし、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、前記ホストアプリケーション実装スレッドプールのサイズを設定し、かつ／または
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して前記ホストアプリケーション実装スレッドプールに照会する
ための命令をさらに含むことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項３３】
呼出しのための前記コンピュータプログラム命令は、タスクが異なるロケールに移行したことを前記ランタイムに通知する目的で、前記ホストアプリケーションに対するコールバックを提供するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項３４】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスクが異なるロケールに移行したことを前記ホストアプリケーションに通知するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項３５】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、ホストアプリケーションのタスク打切りを遅延するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項３６】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスクの優先順位を調整するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項３７】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドが前記ランタイムからアンマネージコードに退出すべきであることを前記ホストアプリケーションに通知するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項３８】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドが前記ランタイムからアンマネージコードに逆退出すべきであることを前記ホストアプリケーションに通知するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項３９】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドがアンマネージコードから前記ランタイムに進入すべきであることを前記ホストアプリケーションに通知するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項４０】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドがアンマネージコードから前記ランタイムに逆進入すべきであることを前記ホストアプリケーションに通知するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項４１】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、１つまたは複数のＩ／Ｏ完了ポート上のサービス要求にとって利用可能となる最大スレッド／タスク数を指定するための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項４２】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、ハンドルをＩ／Ｏ完了ポートまたは前記ホストアプリケーションにバインドするための命令をさらに含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項４３】
呼出しのための前記コンピュータプログラム命令は、前記ホストアプリケーションに対するランタイム実装コールバックを供給するための命令をさらに含み、前記ランタイム実装コールバックは、非同期Ｉ／Ｏオペレーションが完了したときに前記ホストアプリケーションによって起動すべきである
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項４４】
呼出しのための前記コンピュータプログラム命令は、
前記ホストアプリケーションに対するランタイム実装コールバックを供給するための命令であって、前記ランタイム実装コールバックは、非同期Ｉ／Ｏオペレーションが完了したときに前記ホストアプリケーションによって起動すべきである命令をさらに含み、
前記供給により、前記ホストアプリケーションが、前記ホストアプリケーションによって前記ランタイム実装コールバックに渡された構造の終りに、状態情報を提供するカスタムデータを挿入することが可能となる
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項４５】
呼出しのための前記コンピュータプログラム命令は、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介してタスクを生成するための命令をさらに含み、
前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のオブジェクトまたはインタフェースを介して、前記タスクが前記タスクに対するロックのホストアプリケーション知識を実質上保証するための１つまたは複数の同期オブジェクトを作成するための命令をさらに含み、前記１つまたは複数の同期オブジェクトは、クリティカルセクション、手動および／または自動リセットイベント、セマフォー、リーダ／ライタロック、および／またはタスクモニタを含む
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項４６】
前記ランタイムにより、前記ランタイムによって公開される１つまたは複数のランタイムインタフェースを前記ホストアプリケーションに通知するためのコンピュータプログラム命令をさらに備え、前記ランタイムインタフェースにより、前記ホストが、一定のイベントを前記ランタイムに通知し、かつ／またはプロセス実行中に追加の情報を得ることが可能となる
ことを特徴とする請求項２３に記載のコンピュータ可読媒体。
【請求項４７】
拡張ランタイムホスティングのためのコンピューティング装置であって、請求項２３に記載のコンピュータ可読媒体に結合されたプロセッサを備え、前記プロセッサが、前記コンピュータ可読媒体上に格納された前記コンピュータプログラム命令を実行するように構成される
ことを特徴とするコンピューティング装置。
【請求項４８】
拡張ランタイムホスティングのためのコンピューティング装置であって、
プロセッサと、
前記プロセッサに結合されたメモリとを備え、
前記メモリは、前記プロセッサで実行可能なコンピュータプログラム命令を含み、前記コンピュータプログラム命令は、
ホストアプリケーションによって公開された、前記ホスティングアプリケーションによってサポートされる各実行環境アブストラクションに対応する１つまたは複数のホストアブストラクションインタフェース（ＨＡＩ）を識別し、
ランタイムマネージコードの実行中、前記各実行環境アブストラクションのうちの識別した１つに関連するアクションまたはイベントに応答して、前記ランタイムにより、前記ＨＡＩのうち特定の１つに対応する少なくとも１つの特定のインタフェースまたはオブジェクトを呼び出すための命令であり、
前記１つまたは複数の実行環境アブストラクションは、メモリ、スレッド／タスク、Ｉ／Ｏ完了、同期、ランタイムエントリ／退出通知、および／またはガーベッジコレクション（ＧＣ）に関する管理サービスに対応する
ことを特徴とするコンピューティング装置。
【請求項４９】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して特定のメモリ割振りが失敗したという結果を前記ホストアプリケーションに通知し、それによって前記ホストアプリケーションが、メモリ割振りが失敗したに間違いない場合に前記ランタイムが取るべきアクションをカスタマイズすることが可能となる命令をさらに含む
ことを特徴とする請求項４８に記載のコンピューティング装置。
【請求項５０】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記ホストアプリケーションによって実装された前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して新しいスレッド／タスクを作成するための命令をさらに含む
ことを特徴とする請求項４８に記載のコンピューティング装置。
【請求項５１】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記ホストアプリケーションによって実装された前記少なくとも１つの特定のインタフェースまたはオブジェクトを介してタスクのランタイム実装部分を再利用またはプールするための命令をさらに含む
ことを特徴とする請求項４８に記載のコンピューティング装置。
【請求項５２】
呼出しのための前記コンピュータプログラム命令は、前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトあるいはプーリングを介して、タスクを異なる物理ＯＳスレッドに移動することができず、指定の時間ウィンドウの間、前記タスクの実行をブロックすることができないことを、前記ホストアプリケーションに通知するための命令をさらに含む
ことを特徴とする請求項４８に記載のコンピューティング装置。
【請求項５３】
呼出しのための前記コンピュータプログラム命令は、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、スレッド／タスクをホストアプリケーション実装スレッドプールにキューイングし、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、前記ホストアプリケーション実装スレッドプールのサイズを設定し、かつ／または
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して前記ホストアプリケーション実装スレッドプールに照会する
ための命令をさらに含むことを特徴とする請求項４８に記載のコンピューティング装置。
【請求項５４】
呼出しのための前記コンピュータプログラム命令は、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、ホストアプリケーションのタスク打切りを遅延し、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスクの優先順位を調整する
ための命令をさらに含むことを特徴とする請求項４８に記載のコンピューティング装置。
【請求項５５】
呼出しのための前記コンピュータプログラム命令は、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドが前記ランタイムからアンマネージコードに退出すべきであることを前記ホストアプリケーションに通知し、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドが前記ランタイムからアンマネージコードに逆退出すべきであることを前記ホストアプリケーションに通知する
ための命令をさらに含むことを特徴とする請求項４８に記載のコンピューティング装置。
【請求項５６】
呼出しのための前記コンピュータプログラム命令は、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドがアンマネージコードから前記ランタイムに進入すべきであることを前記ホストアプリケーションに通知し、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、タスク／スレッドがアンマネージコードから前記ランタイムに逆進入すべきであることを前記ホストアプリケーションに通知する
ための命令をさらに含むことを特徴とする請求項４８に記載のコンピューティング装置。
【請求項５７】
呼出しのための前記コンピュータプログラム命令は、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、ハンドルをＩ／Ｏ完了ポートまたは前記ホストアプリケーションにバインドし、
前記ランタイムにより、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介して、１つまたは複数のＩ／Ｏ完了ポート上のサービス要求にとって利用可能となる最大スレッド／タスク数を指定する
ための命令をさらに含むことを特徴とする請求項４８に記載のコンピューティング装置。
【請求項５８】
呼出しのための前記コンピュータプログラム命令は、
前記ホストアプリケーションに対するランタイム実装コールバックを供給するための命令であって、前記ランタイム実装コールバックは、非同期Ｉ／Ｏオペレーションが完了したときに前記ホストアプリケーションによって起動すべきである命令をさらに含み、
供給のための前記命令により、前記ホストアプリケーションが、前記ホストアプリケーションによって前記ランタイム実装コールバックに渡された構造の終りに、状態情報を提供するカスタムデータを挿入することが可能となる
ことを特徴とする請求項４８に記載のコンピューティング装置。
【請求項５９】
呼出しのための前記コンピュータプログラム命令は、前記少なくとも１つの特定のインタフェースまたはオブジェクトを介してタスクを生成するための命令をさらに含み、前記方法は、前記ランタイムにより、前記少なくとも１つの特定のオブジェクトまたはインタフェースを介して、前記タスクがＯＳスレッドのロックのホストアプリケーション知識を実質上保証するための１つまたは複数の同期オブジェクトを作成し、前記１つまたは複数の同期オブジェクトは、クリティカルセクション、手動および／または自動リセットイベント、セマフォー、リーダ／ライタロック、および／またはタスクモニタを含む
ことを特徴とする請求項４８に記載のコンピューティング装置。
【請求項６０】
拡張ランタイムホスティングのためのソフトウェアアーキテクチャであって、
アプリケーションと、
前記アプリケーションがホストするように構成されたランタイムとを備え、
前記ランタイムは、ランタイムアプリケーションプログラムインタフェース（ＲＩ）を公開し、前記ＲＩにより、前記アプリケーションが、前記ランタイムに対するホストアブストラクションインタフェース（ＨＡＩ）に指示することが可能となり、前記ＨＡＩは、アプリケーション抽象化実行環境機能を識別し、
前記ランタイムは、前記ＨＡＩのうち１つまたは複数の部分を介して前記アプリケーション抽象化実行環境機能を実装するために、プロセス実行中にアクションおよび／またはイベントを前記アプリケーションに戻すようにさらに構成される
ことを特徴とするソフトウェアアーキテクチャ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータソフトウェア開発に関する。より詳細には、本発明は、アプリケーションとホストランタイムサービスとの間の実行環境の統合を高めるアプリケーションプログラムインタフェース（ＡＰＩ）に関する。
【背景技術】
【０００２】
今日の複合コンピュータプログラム／ネットワーキング環境では、コード共用、スケーラビリティ、および他のクロスプラットフォームフレームワークとの統合が、一般に非常に望ましい。ホスティングアプリケーション（すなわち、以後しばしば「ホスト」と呼ぶ）によるランタイムの使用により、一般には、アプリケーション開発者が、クロスプラットフォーム互換性を有し、スケーラビリティが向上し、共通タイプシステムを有し、多言語サポートを有し、自動メモリ管理を有するなどのマネージコードを書くことが可能となる。ランタイムには、例えば共通言語ランタイム（ＣＬＲ）および／またはＪａｖａ（登録商標）仮想マシン（ＶＭ）などが含まれる。
【０００３】
大部分のホストは、マネージコードとアンマネージコードの両方からなる。マネージコードは、ランタイムの制御下で実行されるコードである。逆に、アンマネージコードは、ランタイムの外部で動作するコードである。ＣＯＭ（Common Object Model）コンポーネント、ＡｃｔｉｖｅＸ（登録商標）インタフェース、およびＷＩＮ３２（登録商標）ＡＰＩ関数は、アンマネージコードの例である。非管理ホスティングコードは、共通言語ランタイムを構成し、それをプロセス（すなわち実行中プログラム）内にロードし、プログラムをマネージコードに移行するのに使用される。
【０００４】
こうした基本的な対話を除くと、プロセスが実行中は、ホストとランタイムとの間の対話は通常、ホストがあるタスクを実行するようにランタイムに指示することに限定される。ある場合には、ホストは、要求したランタイムタスクが完了したことを知らせるイベントまたはメッセージを受け取ることができる。そのような限定されたホスト／ランタイム対話は、プロセス実行中のホストとランタイムとの統合が本質的に欠けていることを表している。こうした理由で、ホストとランタイムは実質上、プロセスにおいて別々のエンティティを表すと言うことができる。このようなホストとランタイムとの実行環境統合の欠乏は、ランタイムによって提供されるサービスの多くにわたってホスティングアプリケーションがほとんどまたは全く制御を有さないという意味で、かなり制約が多い。
【０００５】
例えば、ホストが、ホストの実行環境で動作中の全スレッドの知識を少なくとも有することを一般にホストに要求する連携的スレッディングまたは非プリエンプティブスレッディングを利用すると仮定する。ランタイムがＯＳ（operating system）の非連携的スレッディングモデルまたはプリエンプティブスレッディングモデルに依拠するとも仮定する（ランタイムは、一般にオペレーティングシステム（ＯＳ）スレッディング、メモリ管理、同期、セキュリティの各実装に依拠する）。このシナリオでは、ホストはランタイム内にスレッドを送ることができる。この時で、ＯＳのプリエンプティブタスク処理が、ホストの非プリエンプティブスレッドをブロックすることができ、かつ／またはホストが、全く異なる物理的スレッドにタスクを移動することができる。より悪いことに、ホストスレッドは、ランタイムから、ホストまたはランタイムに属さないコードに退出することができ、その結果、ホスト知識を有さないホストスレッドにほぼどんな事も生じる可能性がある。このような非統合ホスト／ランタイムスレッド管理は、ホストランタイム性能およびスケーラビリティをかなり損なう可能性があり、データコヒーレンスが消失し、ホストが検出することができないデッドロックを生み出し、かつ／または予測不能なホスト／システム挙動を引き起こす可能性がある。
【０００６】
上記の例は、ホストとランタイムとの実行環境統合の欠乏によりホストアプリケーションの期待される実装が破壊される可能性があることを示している。これは特に、スケーラビリティの向上および高性能のためにホストが経時的にスレッディング、メモリ、同期、および／またはセキュリティ実装を調整しているときにそうである。したがって、ホストはランタイム使用の利点（例えば、クロスプラットフォーム互換性、コーディング労力の削減など）を望むことがあるが、ホストの特別に調整した実装が、対応するランタイムサービスと非互換である可能性がある。したがって、ホストは、ホスト供給のサービスに依拠するランタイムのロードだけを行うことがあり、または基礎となるＯＳサービスに直接アクセスすることによってランタイムサービスを完全に迂回することがある。このような予備手段では、アプリケーション設計者が、それを提供するようにランタイムシステムサービスが設計された利点を活用することができず、製品の統合性および移植性が低くなる。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
したがって、ホストとランタイムの間の実行環境制御を向上させるシステムおよび方法が非常に望まれている。
【０００８】
本発明は、このような状況に鑑みてなされたもので、その目的とするところは、ランタイムホスティングを拡張するためのシステムおよび方法を提供することにある。
【課題を解決するための手段】
【０００９】
ランタイムホスティングを拡張するためのシステムおよび方法を説明する。一態様では、ランタイムが、ホストアプリケーションによって公開された任意のアブストラクション（abstraction）インタフェースを識別する。アブストラクションインタフェースは、ホスティングアプリケーションによって実装された各実行環境機能に対応する。ランタイムマネージコードの実行中、各実行環境アブストラクションのうち識別した１つに関連するアクションまたはイベントに応答して、ランタイムは、アブストラクションインタフェースのうち特定の１つに対応する特定のインタフェースまたはオブジェクトを呼び出す。これにより、ホストアプリケーションが、実装するアブストラクションに応じて、ランタイムを含むその実行環境をカスタマイズ／機能強化することが可能となる。
【発明を実施するための最良の形態】
【００１０】
以下、図面を参照して本発明を適用できる実施形態を詳細に説明する。添付の図を参照しながら以下の詳細な説明を述べる。図では、構成要素参照番号の左端の桁により、その構成要素が最初に現れる特定の図が識別される。
【００１１】
［概説］  
拡張ランタイムホスティングを説明する。ランタイムをホストするアプリケーション（ホスティングアプリケーション）とランタイムとの間の従来の統合は、ホスティングアプリケーションの実行環境のかなりの部分にわたって制御が存在する場合であっても、ホスティングアプリケーションが制御をほとんど有さないという点でかなり限定される。本発明は、ホストとランタイムとの間の実行環境統合を大幅に向上させることにより、統合のこの欠点に対処する。この統合の向上は、ホストアプリケーションが制御を実施およびトレーニングし、実行環境機能、イベント通知、およびランタイムオペレーションをカスタマイズすることを可能にする複数のレベルの抽象化された（abstracted）インタフェースで実施される。このようなアブストラクションには、例えばメモリ管理、スレッディング、入出力（Ｉ／Ｏ）完了、同期、イベント通知（例えば、スレッドがランタイムに進入するとき、およびランタイムから出るとき）サービスアブストラクションが含まれる。
【００１２】
加えて、ランタイムインタフェースは、イベント通知を含むホストアプリケーションの実装の特定の側面にわたってかなりの制御をランタイムに提供する。ランタイムの機能は、ホストアプリケーションがそのような拡張ランタイムホスティングインタフェースを実施するよう判断したか否かに依存しない。
【００１３】
［例示的動作環境］  
図面を参照すると、同様の参照符号は同様の要素を指しており、本発明が適切なコンピューティング環境で実装されるものとして示されている。必須ではないが、パーソナルコンピュータによって実行されるプログラムモジュールなどのコンピュータ実行可能命令の一般的状況で本発明を説明する。プログラムモジュールは一般に、特定のタスクを実行し、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。
【００１４】
図１に、後で説明する拡張ランタイムホスティングのためのシステム、装置、および方法を（完全または部分的に）実施することができる適切なコンピューティング環境１００の例を示す。例示的なコンピューティング環境１００は、適切なコンピューティング環境の一例に過ぎず、本明細書で説明するシステムおよび方法の使用範囲および機能範囲に関して何らかの制限を示唆するものではない。コンピューティング環境１００に図示する構成要素のうちのいずれか１つ、あるいはそれらの組合せに関係する何らかの依存関係または要件をコンピューティング環境１００が有すると解釈すべきでもない。
【００１５】
本明細書の方法およびシステムは、その他の多数の汎用／特殊目的コンピューティングシステムの環境／構成で動作可能である。使用に適した周知のコンピューティングシステム、環境、および／または構成の例には、限定はしないが、パーソナルコンピュータ、サーバコンピュータ、マルチプロセッサシステム、マイクロプロセッサベースのシステム、ネットワークＰＣ（personal computer）、ミニコンピュータ、メインフレームコンピュータ、ならびに上記のシステムまたは装置のいずれかを含む分散コンピューティング環境などが含まれる。携帯電話、携帯情報端末、ハンドヘルドコンピュータ、またはその他の通信／コンピューティング装置などの、資源が限定されたクライアントに、フレームワークのコンパクト版またはサブセット版を実装することもできる。本発明は、通信ネットワークを介してリンクされるリモートプロセッサによってタスクが実行される分散コンピューティング環境でも実施することができる。分散コンピューティング環境では、プログラムモジュールは、ローカルメモリ記憶装置とリモートメモリ記憶装置のどちらにも位置することができる。
【００１６】
図１に示すように、コンピューティング環境１００は、コンピュータ１０２の形態の汎用コンピューティング装置を含む。コンピュータ１０２の構成要素には、限定はしないが、１つまたは複数のプロセッサまたは処理装置１０４と、システムメモリ１０６と、システムメモリ１０６を含む様々なシステム構成要素をプロセッサ１０４に結合するバス１０８とを含めることができる。
【００１７】
システムバス１０８は、メモリバスまたはメモリコントローラと、周辺バスと、アクセラレーテッドグラフィックスポートと、様々なバスアーキテクチャのうちのいずれかを用いるプロセッサバスまたはローカルバスとを含むいくつかのタイプのバス構造のうちのいずれか１つまたは複数を表す。例えば、限定はしないが、このようなアーキテクチャには、ＩＳＡ（Ｉｎｄｕｓｔｒｙ  Ｓｔａｎｄａｒｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＭＣＡ（Ｍｉｃｒｏ  Ｃｈａｎｎｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＥＩＳＡ（Ｅｎｈａｎｃｅｄ  ＩＳＡ）バス、ＶＥＳＡ（Ｖｉｄｅｏ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｓｔａｎｄａｒｄｓ  Ａｓｓｏｃｉａｔｉｏｎ）ローカルバス、およびメザニンバスとも呼ばれるＰＣＩ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）バスが含まれる。
【００１８】
コンピュータ１０２は、一般に様々なコンピュータ可読媒体を含む。このような媒体は、コンピュータ１０２でアクセス可能な入手可能などんな媒体でもよく、揮発性媒体と不揮発性媒体の両方、リムーバブル媒体とノンリムーバブル媒体の両方が含まれる。図１では、システムメモリ１０６は、ランダムアクセスメモリ（ＲＡＭ）１１０などの揮発性メモリの形態のコンピュータ可読媒体、および／または読取り専用メモリ（ＲＯＭ）１１２などの不揮発性メモリの形態のコンピュータ可読媒体を含む。起動時などにコンピュータ１０２内の要素間で情報を転送する助けとなる基本ルーチンを含むＢＩＯＳ（Basic Input/Output System）１１４が、ＲＯＭ１１２内に格納される。ＲＡＭ１１０は一般に、プロセッサ１０４にとって直ちにアクセス可能であり、かつ／またはプロセッサ１０４が現在操作中のデータおよび／またはプログラムモジュールを含む。
【００１９】
コンピュータ１０２は、その他のリムーバブル／ノンリムーバブルな、揮発性／不揮発性コンピュータ記憶媒体をさらに含むことができる。例えば、図１に、ノンリムーバブル不揮発性磁気媒体（図示せず。一般には「ハードドライブ」と呼ばれる。）を読み書きするためのハードディスクドライブ１１６と、リムーバブル不揮発性磁気ディスク１２０（例えば「フロッピー（登録商標）ディスク」）を読み書きするための磁気ディスクドライブ１１８と、ＣＤ（compact disc）−ＲＯＭ／Ｒ／ＲＷ（Recordable／Re-writable）、ＤＶＤ−ＲＯＭ／Ｒ／ＲＷ／＋Ｒ／ＲＡＭやそのその他の光媒体などのリムーバブル不揮発性光ディスク１２４を読み書きするための光ディスクドライブ１２２とを示す。ハードディスクドライブ１１６、磁気ディスクドライブ１１８、および光ディスクドライブ１２２はそれぞれ、１つまたは複数のインタフェース１２６によってバス１０８に接続される。
【００２０】
ドライブと、関連するコンピュータ可読媒体とにより、コンピュータ１０２に対するコンピュータ可読命令、データ構造、プログラムモジュール、およびその他のデータの不揮発性記憶が実現される。本明細書で説明する例示的環境ではハードディスク、リムーバブル磁気ディスク１２０、およびリムーバブル光ディスク１２４を利用するが、磁気カセット、フラッシュメモリカード、デジタルビデオディスク、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）などの、コンピュータでアクセス可能な、データを格納することができるその他のタイプのコンピュータ可読媒体もこの例示的動作環境で使用できることを当業者は理解されたい。
【００２１】
ユーザは、キーボード１４０やポインティングデバイス１４２（「マウス」など）などの入力装置を介して、コンピュータ１０２にコマンドおよび情報を与えることができる。その他の入力装置（図示せず）には、マイクロフォン、ジョイスティック、ゲームパッド、サテライトディッシュ、シリアルポート、スキャナ、カメラなどを含めることができる。上記およびその他の入力装置は、バス１０８に結合されるユーザ入力インタフェース１４４を介してプロセッサ１０４に接続されるが、パラレルポート、ゲームポート、ユニバーサルシリアルバス（ＵＳＢ）などのその他のインタフェース構造およびバス構造で接続することもできる。
【００２２】
モニタ１４６またはその他のタイプのディスプレイ装置もまた、ビデオアダプタ１４８などのインタフェースを介してバス１０８に接続される。モニタ１４６に加えて、パーソナルコンピュータは一般に、スピーカやプリンタなどのその他の周辺出力装置（図示せず）を含む。これらは、出力周辺インタフェース１５０を介して接続することができる。
【００２３】
コンピュータ１０２は、リモートコンピュータ１５２などの１つまたは複数のリモートコンピュータへの論理接続を使用して、ネットワーク環境で動作することができる。リモートコンピュータ１５２は、コンピュータ１０２に関して本明細書で説明する要素および機能のうちの多く、またはすべてを含むことができる。図１に示す論理接続は、ローカルエリアネットワーク（ＬＡＮ）１５４および汎用の広域ネットワーク（ＷＡＮ）１５６である。このようなネットワーキング環境は、オフィス、企業全体のコンピュータネットワーク、イントラネット、およびインターネットで一般的なものである。
【００２４】
ＬＡＮネットワーキング環境で使用するとき、コンピュータ１０２は、ネットワークインタフェース／アダプタ１５８を介してＬＡＮ１５４に接続される。ＷＡＮネットワーキング環境で使用するとき、コンピュータは一般に、モデム１６０、またはＷＡＮ１５６を介して通信を確立するその他の手段を含む。モデム１６０は内蔵でも外付けでもよく、ユーザ入力インタフェース１４４またはその他の適切な機構を介してシステムバス１０８に接続することができる。
【００２５】
図１には、インターネットを介するＷＡＮの特定の実装を示す。この場合、コンピュータ１０２は、インターネット１６２を介して少なくとも１つのリモートコンピュータ１５２との通信を確立するためにモデム１６０を利用する。
【００２６】
ネットワーク環境では、コンピュータ１０２に関して示したプログラムモジュール、またはその一部は、リモートメモリ記憶装置内に格納することができる。したがって、例えば図１に図示するように、リモートアプリケーションプログラム１６４は、リモートコンピュータ１５２のメモリ装置上に常駐することができる。図示し、説明したネットワーク接続は例示的なものであり、コンピュータ間の通信リンクを確立するその他の手段も使用できることを理解されよう。
【００２７】
例えばオペレーティングシステム（ＯＳ）１２８、ランタイム１３０、ホストアプリケーション１３２（以後しばしば「ホスト」１３２と呼ぶ）、他のプログラムモジュール１３６、およびプログラムデータ１３８を含むいくつかのプログラムモジュールを、ハードディスク、磁気ディスク１２０、光ディスク１２４、ＲＯＭ１１２、またはＲＡＭ１１０上に格納することができる。ＯＳは、ファイル管理、イベント処理、プロセスおよびスレッド、メモリ管理、ユーザインタフェース（例えばウィンドウ操作、メニュー、ダイアログなど）、セキュリティ、認証、および／または検証などの従来の機能を提供する。
【００２８】
ランタイム１３０およびホストアプリケーション１３２は、アプリケーション開発者に対して、ホスティングアプリケーションとランタイムとの間のプロセス実行をカスタマイズし、緊密に統合するための拡張ランタイムホスティングアブストラクションインタフェース１３１を公開する。この解説では、「アブストラクション」とは、アプリケーション開発者によってホストアプリケーション内に任意選択で実装された関数／メソッドである。ホスト実装関数は、ホストがその関数を実装しなかった場合にランタイムが追従する、実行のスレッドを本質的に置き換えるので、抽象的（abstract）である。これに調和して、ランタイムがサービスをホスト実装関数にリダイレクトするための、ホスト１３２によって公開されるＡＰＩ、および／またはホストがホストアクションをランタイムに通知するための、ランタイム１３０によって公開されるＡＰＩは、「抽象化された」、または「アブストラクションインタフェース」（すなわちアブストラクションインタフェース１３１）と呼ばれる。
【００２９】
ホストによって実装されたアブストラクションインタフェース１３１（以後しばしば「ランタイムホスティングインタフェース」（ＲＨＩ）１３１と呼ぶ）は、ホストアブストラクションインタフェース（ＨＡＩ）１３３と呼ばれる。ＨＡＩは、メモリ、スレッディング、Ｉ／Ｏ完了、同期、および／またはホストによって提供されるその他のサービス機能の任意の組合せにマッピングされる。ＲＨＩ１３１は、ホストアプリケーションが既存の実装で可能であるよりも多くのランタイム１３０の側面をカスタマイズおよび制御することを可能にすることにより、ランタイムとホストとの間のこうした従来のインタフェースの機能を大幅に拡張する。これにより、かなり制限され、問題の多い従来のホスト／ランタイム実行環境統合と比較して、ランタイム１３０／ホスト１３２実行モデル間のかなり緊密な実行環境統合が実現される。
【００３０】
ランタイム１３０とホストアプリケーション１３２との間のＨＡＩ１３３の連携的交換により、それぞれのエンティティが、どの機能をホストで実行すべきか、およびどの機能をランタイムで実施するように抽象化すべきかを折衝することが可能となる。したがって、ホストアプリケーションは、その実行環境をカスタマイズすることができる。公開ＨＡＩにより、ランタイムが一定のホスト実行環境パラメータを構成し、特定のランタイムイベント（例えば、資源割振り失敗、スレッド状態など）を（例えば、供給されるコールバックを介して）ホストに通知することがさらに可能となる。
【００３１】
ランタイム１３０は、ホストアプリケーション１３２がランタイムオペレーションを構成し、ランタイムに一定のイベントを通知し、プロセス実行中に追加の情報を得るためなどに使用する目的でランタイムインタフェース（ＲＩ）１３４を公開する。プロセスの実行中、ＲＩに対するホストアプリケーション呼出しが、特定のサービスのホスト特有の実装向けの１つまたは複数のＨＡＩ１３３を介してホストアプリケーションに戻され、実行のためにオペレーティングシステム１２８に渡され、ランタイムによってローカルに処理され、かつ／またはオブジェクトモデルサービス（すなわち「他のプログラムモジュール」１３６）に通信される。
【００３２】
メモリアブストラクションインタフェース
ランタイムホスティングインタフェース（ＲＨＩ）１３１のメモリ管理部分により、以下のことが行われる。
【００３３】
・ホスト１３２が、ランタイム１３０がすべてのメモリ割振りをそれを介して要求するインタフェース（すなわち、公開ホストアブストラクションインタフェース（ＨＡＩ）１３３）を提供することが可能となる。一実装では、ホストアブストラクションインタフェース１３３は、ＯＳのメモリＡＰＩと標準Ｃランタイムの割振りルーチンをどちらも置き換えるメソッドを提供する。
【００３４】
・ホスト１３２が、ランタイム１３０が現在ＯＳから得ている、メモリの不足通知を、抽出する機構が提供される。これにより、例えばガーベッジコレクションサービスを介して、ランタイム１３０に追加のメモリを使用可能にするよう依頼する機構がホストに与えられる。
【００３５】
・ランタイム１３０が、特定の割振りが失敗した結果をホスト１３２に通知することが可能となり、さらに、割振りが失敗したことに間違いない場合にランタイムが取るべきアクションをホストがカスタマイズすることが可能となる。例えば、ランタイムがアプリケーション領域をアンロードし、またはそれが「不具（ｃｒｉｐｐｌｅｄ）」状態となった場合である。
【００３６】
以下のシナリオは、ＲＨＩ１３１のメモリ部分の例示的使用法を与えるものである。ホスト１３２が、ＲＡＭ１１０の構成可能な量（例えば、コンピュータ１０２上の物理メモリの一部またはほぼ全部）の中で動作すると仮定する。性能を最大にするために、ホストが、すべてのメモリ割振りを追跡し、ページングが決して行われないよう保証する（この例のホストは、ディスク１１６にページングするよりもむしろメモリ割振りを失敗させる）。すべての割振りを正確に追跡するために、ホストは、公開ホストアブストラクションインタフェース（ＨＡＩ）１３３を呼び出してメモリを割り振るようランタイム１３０に指示する。これにより、ホストが、ページングが行われる前にランタイムのメモリ割振りを失敗させることが可能となる。
【００３７】
図２は、ランタイム１３０とホストアプリケーション１３２のメモリアブストラクションインタフェース２０２との間の、例示的アーキテクチャ関係を示す。この解説では、「アブストラクション」とは、アプリケーション開発者によってホストアプリケーション内に任意選択で実装された関数／メソッドである。ホスト実装関数は、ホストがその関数を実装しなかった場合にランタイムが追従する、実行のスレッドを本質的に置き換えるので、抽象的である。これに調和して、ホスト実装関数にアクセスするのに使用されるアプリケーションプログラムインタフェースは、「抽象化された」、または「アブストラクションインタフェース」と呼ばれる。
【００３８】
アブストラクションインタフェースのスレッディング
本節は、ＲＨＩ１３１のスレッド管理部分を詳述する。こうしたスレッド管理ホスティングＡＰＩは、ＯＳスレッドの概念を抽象化し、本質的に、スケジューリング単位および実行単位をホスト１３２に定義させる。これは、それ自体のファイバベース（fiber-based）のスケジューリング機構を実装するホストをサポートする。「タスク」という用語はしばしば、このアブストラクションを定義するのに使用され、特定のホストアプリケーションの実行単位およびスケジューリング単位から「スレッド」という語を切り離すのに使用される。これに鑑みて、スレッド管理ＡＰＩにより、以下のことが行われる。
【００３９】
・ホスト１３２が、ランタイム１３０が新しいタスク（スレッド）を作成および開始するのに使用するインタフェース１３３を、提供することが可能となる。
【００４０】
・タスクのランタイム実行部分を「再利用」またはプールする機構がホスト１３２に提供される。これにより、ホストアプリケーションがホスト実行タスク作成／セットアップオペレーションを最小限に抑えるのに使用することができる性能最適化が可能となる。
【００４１】
・タスクが実行可能状態に移行し、または実行可能状態から移行するときにランタイム１３０に通知するためのコールバックが実装される。呼出しが実行可能状態から移行したとき、ホストＡＰＩ１３３により、ランタイム１３０が、可能な限り早くタスクをホスト１３２によって再スケジュールすべきであると指定することが可能となる。
【００４２】
・所与のタスクを異なる物理的なＯＳスレッドに移動することができず、指定の時間ウィンドウの間、所与のタスクがその実行をブロックできないことを、ランタイム１３０がホスト１３２に通知する手段が提供される。
【００４３】
・ホスト１３２が、スレッドプールの実装を提供することが可能となり、ランタイム１３０が作業項目をキューイングし、スレッドプールのサイズを設定および照会できるようになる。
【００４４】
・ホスト１３２側とランタイム１３０側の両方に対して、所与のタスクに関して「ロケール」が変更されたことが通知される。ロケールは、ソフトウェアのローカライズに関係する。ランタイム１３０は、現ロケールの概念を含み、大部分のホストアプリケーション１３２もそうである。こうした通知インタフェースにより、ランタイム１３０とホスト１３２が、ロケールがどちらかの側でプログラム式に変更された場合に互いに連絡し合うことが可能となり、したがって両者は同期状態に保たれる。ロケールがランタイム側で変更された場合、ホスト１３２で実装されるデータベースのソート順に影響を及ぼす可能性がある。
【００４５】
・ランタイム１３０が、所与のタスクのホスト１３２のアボート（abort）を遅延させることが可能となる。
【００４６】
・ランタイム１３０（およびユーザコード）がタスクの優先順位を調整するための手段が提供される。
【００４７】
以下のシナリオは、ＲＨＩ１３１のスレッド管理部分の例示的使用法を与えるものである。特定のホストアプリケーション１３２が「ファイバモード」実行を実装すると仮定する。ファイバモードでは、特定のホスト（例えばＳＱＬサーバ）が、コンピュータ１０２上のプロセッサ１０４の数、または他のホスト特有の基準に基づいて、いくつかのスレッドを作成することができる。次いでそのホストは、ユーザコード（「他のプログラムモジュール」１３６の一部）を実行するスレッド上にファイバを作成する。ホストは、連携的に（ホスト用語では非プリエンプティブと呼ばれる）こうしたファイバをスケジュールし、あるオペレーションに対してファイバがブロックするとき、そのファイバが「スイッチアウト」され、スレッドは別のファイバを実行する。その後、ファイバは、必ずしも同一スレッド上ではないが、再スケジュールされ、実行される。ランタイム１３０がホスティングＡＰＩ１３４を介して「タスク」を作成したとき、タスクはホスト１３２内のファイバとなり、ホストのスケジューラがネイティブに理解する。
【００４８】
図３は、ランタイム１３０とホスティングアプリケーション１３２のスレッドアブストラクションインタフェースとの間の、例示的アーキテクチャ関係を示す。図４は、ホストアプリケーションによってＯＳスレッド上にスケジュールされるファイバとして処理されるランタイムタスクの例示的タスクスケジューリングを示すブロック図である。
【００４９】
Ｉ／Ｏ完了アブストラクションインタフェース
本節は、ＲＨＩ１３１のＩ／Ｏ完了管理部分を詳述する。ＲＨＩ１３１のＩ／Ｏ完了管理部分では、
・ホスト１３２が、ランタイム１３０がハンドルをＩ／Ｏ完了ポートにバインドするために、ＨＡＩ１３３を提供する。
【００５０】
・ホスト１３２が、ランタイム１３０がコールバックを供給するために、ＨＡＩ１３３を提供する。このコールバックは例えば、非同期Ｉ／Ｏオペレーションが完了したときにホスト１３２によって起動される。
【００５１】
・ランタイム１３０が、ホスト１３２がランタイムサービスＩ／Ｏルーチンに渡されるＯＶＥＲＬＰＰＥＤ構造体の終りにカスタムデータを挿入するために、ＲＩ１３４を提供する。ＯＶＥＲＬＰＰＥＤ構造体は、データ状のファイルポインタの位置を提供する。
【００５２】
同期 
ランタイム１３０がＨＡＩ１３３を介して（すなわち、ホストアプリケーション１３２の指示を介して）１つまたは複数のタスクを作成した場合、ランタイムはまた、対応するＨＡＩを介して、こうしたタスクに対する同期オブジェクトも作成する。これにより、ホストの認識なしに、ＯＳスレッドに対してロックが行われないように保証される。これにより、ランタイム１３０のタスクがホストのスレッドスケジューリング機構とさらに統合することが可能となり、ホストがデッドロック検出を実施することが可能となる。この目的で、ＲＨＩ１３１の同期管理部分により、ランタイム１３０が、ＨＡＩ１３３を介して、クリティカルセクション、イベント（手動および自動リセット）、セマフォー、リーダ／ライタのロック、およびモニタの、各同期（「ｓｙｎｃ」）プリミティブを作成することが可能となる。
【００５３】
ランタイムに進入および退出するためのアブストラクションインタフェース 
図５は、アンマネージコードへ／からマネージコードを退出／を逆退出するため、およびアンマネージコードから／へマネージコードへ進入／を逆進入するための、例示的マネージ／アンマネージコード呼出しシーケンスを示す。マネージコードを実行中のスレッドは、ランタイム１３０を退出してアンマネージコードを実行することができる。ランタイム１３０を退出してアンマネージコードを実行するスレッドに対するロックは、ＲＨＩ１３１を通過せず、したがってロックは、ホストアプリケーション１３２のスレッディング／同期モデルと統合することができない。したがって、スレッドがアンマネージコードからランタイム１３０に進入し、またはランタイム１３０からアンマネージコードに退出するとき、ランタイムは、ホスト実装コールバック（ホストにより、対応するＲＩ１３４を介してランタイムに提供されるコールバック）を介してホストアプリケーションに通知する。これに鑑みて、ランタイムによって以下のことが行われる。
【００５４】
・スレッドがランタイム１３０に移行し、またはランタイム１３０の外に移行したときにホスト１３２に通知される。このような通知は、コードがＪｕｓｔ−Ｉｎ−Ｔｉｍｅ（ＪＩＴ）コンパイルシナリオでコンパイルされたか、それともネイティブイメージコンパイルシナリオ（例えばｎｇｅｎ）でコンパイルされたかにかかわらず、呼出しをランタイム外およびランタイム内にフックすることによって実施される。一実装では、この通知は、呼び出されるルーチンのアドレスを含む。
【００５５】
・ホスト１３２が、そのような通知のために、アンマネージコードへの特定の関数呼出し、および対応するランタイム再エントリをランタイム１３０によってフックすべきでないことを指定することが可能となる。そのようなホスト指定により、ランタイムが、最適化された形で（例えば呼出しインラインを実施して）特定の呼出しを実施することが可能となる。ホストは、このインタフェースを使用して、ホストが「知っている」呼出し（すなわち、ホスト自体の実装の一部であるか、または緊密に統合された機能の一部である呼出し）を求めるフックを迂回することができる。
【００５６】
例えば、そのようなホスト実装コールバックにより、ランタイム１３０が、特定のスレッドがランタイム１３０からユーザコードに退出したのでその特定のスレッドの挙動をもはや予測することができないことをホストに伝える「通知」（フックに対する呼出し）をホスト１３２に送ることが可能となる。このような通知に応答して、ホスト１３２は、スレッドがランタイムに戻るまで、その特定のスレッドがホストの特定の実装に特有の任意の非プリエンプティブスケジューリング活動に参加するようホスト１３２によってスケジュールされないことを保証するために、予防ステップを行うことができる。
【００５７】
一実装では、ホスト１３２でそのようなフックを使用して、プロセッサ１０４の浮動小数点状態を調整することができる。ホスト１３２はまた、ＲＩ１３４を使用して、例えばホストがデータアクセスＡＰＩを呼び出したときにランタイム通知を回避するために、１つまたは複数の特定の関数呼出しをランタイム１３０でフックすべきでないと指示することができる。
【００５８】
拡張ランタイムホスティングのための例示的手順 
図６に、拡張ランタイムホスティングのための例示的手順を示す。この解説では、図１の機能を参照しながら図６のオペレーションを論じる。図６に特定の数値的順序のオペレーション６０２〜６１２を示すが、こうした各オペレーションは、ホストアプリケーション１３２とランタイム１３０の対話、実行環境の特性などに応じて、どんな順序でも論理的に行うことができる。
【００５９】
ブロック６０２では、ホストアプリケーション１３２（図１）がランタイム１３０（図１）をプロセス内にロードした後（すなわちスタートアップ時）、ランタイム１３０は、任意のホスト実装実行環境アブストラクション（すなわちホストサポートアブストラクション）を判断する。この解説では、プロセスが、ＲＡＭ１１０（図１）内のホスト１３２コンポーネントおよびランタイム１３０コンポーネントによって表される（特定のアブストラクションがホストでサポートされるか否かは、ランタイムがどのように実行されるかにとって重要ではない）。一実装では、このオペレーションは、対象の実行環境アブストラクションを指示するリストを有する公開ＨＡＩ１３３に対するランタイムによる要求／呼出しで実施される。このような要求は、図１の「プログラムデータ」１３８の一部として表される。この要求／呼出しに応答して、ホストは、ホスト実装実行環境アブストラクション（例えば、メモリ、スレッド、同期、Ｉ／Ｏ完了、ポリシー、および／またはその他の実装アブストラクション）にアクセスするための１つまたは複数のアブストラクション特有のインタフェース（ＨＡＩ１３３内の各ＡＰＩ）をランタイム１３０に提供する。
【００６０】
ブロック６０４では、実行環境アブストラクションが存在する場合にどの実行環境アブストラクションがホストアプリケーション１３２によって実装／サポートされているかに関する情報を求めるランタイム要求に応答して、ランタイム１３０は、抽象化された機能に対応するＨＡＩ１３３のリストを受け取る。そのようなＨＡＩは、オブジェクトおよび／またはインタフェースを参照することができる。ブロック６０６では、ランタイムは、受け取ったＨＡＩのうち１つまたは複数を介して、抽象化された機能実装を構成することができる。
【００６１】
ブロック６０８では、ランタイム１３０は、ランタイムによって公開された１つまたは複数のランタイムインタフェース１３４（ＲＩ）をホストアプリケーション１３２に通知する。この実装では、このような通知は、ホストアプリケーション１３２によってランタイム１３０に送られた要求に応答する。このような通知および要求は、図１の「プログラムデータ」１３８の各部分として表される。このようなＲＩにより、ホストが、一定のイベントをランタイムに通知し、かつ／またはプロセス実行中に追加の情報を得ることが可能となる。一実装では、ＲＩは、ホストが一定のイベントをランタイムに通知し、またはプロセス実行中に追加の情報を得るのに使用されるコールバックである。ブロック６１０では、ランタイムは、任意のホストアプリケーションの構成要求、コールバック、ランタイムデータなどを求める要求に応答する。
【００６２】
ブロック６１２では、マネージコードの実行中に、ホストアプリケーション抽象化機能に関連する１つまたは複数のアクションまたはイベントに応答して、ランタイムは、返されたＨＡＩのうち特定の１つに対応する少なくとも１つの特定のインタフェースまたはオブジェクトを呼び出す。そのようなアクションおよびイベントは、例えばメモリ、スレッド／タスク、Ｉ／Ｏ完了、同期、イベント通知、および／またはガーベッジコレクション（ＧＣ）などに関する管理サービスに対応する。
【００６３】
［結論］
記載のシステムおよび方法は、拡張ランタイムホスティングを提供する。構造的特徴および／または動作に特有の専門用語で、システムおよび方法を説明したが、添付の特許請求の範囲で定義される主題は、記載の特定の機能および動作に必ずしも限定されない。むしろ、特許請求の範囲の主題を実施する例示的形態としてこの特定の特徴および操作を開示する。
【００６４】
［関連技術］  
上述した本発明を適用できる実施形態に関連した技術として、以下では「複数言語のコンパイル方法及びシステム」について説明しておく。
【００６５】
本関連技術は、プログラムソースの言語をコンパイルする技術に関する。特に、ランタイムライブラリ、及び実行時環境で実行可能なプログラム又はアプリケーションを生成するのに用いられるプログラムソースの言語と独立した環境を生成するためのコンパイラの使用方法に関する。
【００６６】
コンパイラは、一つの言語、すなわち高水準プログラミング言語のようなソース言語で書かれたアプリケーション又はプログラムを読み取り、当該ソース言語プログラムを第２の言語、すなわちターゲット言語へと変換するコンピュータプログラムである。さらに、コンパイラは、エラーを記録したり、他のファイル又はライブラリをソース言語ファイルによる使用のためにインポートしたりするような、典型的な他のファンクションを実行する。コンパイルプロダクトは、典型的には、特定の動作環境における特定のプロセッサ上で直接実行することができる機械コード言語である。
【００６７】
一般に、コンパイルプロセスは２つの部分を含んでいる。それは、解読を行うフロントエンド部分と、組立を行うバックエンド部分である。フロントエンド解読は、ソース言語ファイルを構文解析し、語彙上、文法上又はシンタックス上の問題を調べ、ソース言語ファイルの中間表示ファイルを生成する。組立ステップは、ソース言語ファイルの中間表示ファイルを解析し、中間表示ファイルからターゲット言語ファイルを生成する。バックエンド組立は、初期は特定のターゲットマシンに依存しており、ソースファイルを生成するのに用いられたソース言語と相対的に独立している。一方、フロントエンド解析は、初期は用いられた特定のソース言語に依存しており、ターゲットマシンと相対的に独立している。
【００６８】
今日使用されている高水準プログラミング言語には少なくとも３つのタイプがある。最初の言語タイプは、手続言語、ファンクション言語、そしてオブジェクト指向プログラミング言語として分類される。さらに、各々に固有のプログラミング言語は、その言語を使用するソフトウェア開発者により使用される関連するファンクションライブラリを有している。例えば、ほとんど全てのプログラミング言語は、ユーザにファイルやキーボードのような入力デバイスから情報を読み込むこと、及びファイルやディスプレイ又はプリンタのような出力デバイスに情報を書き込むことを許可する入出力ファンクションライブラリを有している。このファンクションライブラリを使用するために、ソース言語ファイルは、コンパイラに希望するライブラリファイルを指示する“include”ステートメント、又は“import”ステートメントを有している。
【００６９】
コンパイルをしている間は、言語固有のコンパイラがソース言語ファイルを読み込み、ライブラリ宣言ファイルが必要かどうかを判断し、ライブラリ宣言ファイルの読み込みを続行する。重要なことは、ライブラリ宣言ファイルがコンパイラによってハンドリングされるために、ライブラリ宣言ファイルは当該コンパイラのネイティブ言語、すなわちソース言語ファイルと同じ言語で書かれていなければならないことである。例えば、もしユーザがＣ＋＋でソースレベルプログラムを書き、そのプログラムが“stdio.h”のようなライブラリ宣言ファイルを使用するなら、Ｃ＋＋コンパイラがライブラリ宣言ファイルを読み込んで理解できるように、ライブラリ宣言ファイルはＣ＋＋で書かれていなければならない。実行時には、結果として実行可能なプログラムを、実際にユーザにより書かれたソース言語プログラムによって使用されるライブラリ宣言ファイルからこれらのアイテムの実行を供給するライブラリプログラムファイルとともに実行しなければならない。
【００７０】
コンパイラのフロントエンド部に関連する一つの固有の欠点は、ただ一つのタイプのソース言語ファイルだけが特定のフロントエンドとして使用することができるという事実に関連する。つまり、コンパイラは特定のソース言語で書かれたファイルのみをコンパイルし、他のソース言語ファイルを受けつける柔軟性を有していない。さらに、コンパイラによってインポートされたライブラリ宣言ファイルも、特定のコンパイラに関連する特定のソース言語で書かれていなければならない。あいにく、異なるソース言語は、他のプログラミング言語以上のファンクションを実行する点において利益又はアドバンテージを提供し、そのような利益の多くは、特有のライブラリファンクションに関連するものである。したがって、一つの言語のコンパイラは、他の言語で書かれているライブラリ宣言ファイルを使用することができず、ライブラリ宣言ファイルは、ライブラリファンクションが他のソース言語によっても使用できるようにするため、しばしば他のソース言語に翻訳又は更新される。
【００７１】
これらの事実等を考慮に入れて、以下に示す本関連技術がなされたものである。
【００７２】
本関連技術は、受け取った情報を２つの形式、すなわち同一もしくは他のフロントエンドシステムへとフィードバックされるメタデータ及び命令コードへとコンパイルするフロントエンドコンパイラシステムに関するものである。メタデータは、後半のコンパイル工程においてフロントエンドシステムによって使用される命令コードを記述する情報を含んでいる。また、命令コードは、実行可能な命令となるように、プロセッサ上で直接的に実行可能なオブジェクトコード、又はバックエンド実行環境で実行される“中間”タイプの命令コードのような多くの形式をとることができる。異なるフロントエンドは異なるソース言語を読み取り、各フロントエンドは相互のフロントエンドの出力をも読み取ることができることから、システムは、その言語に適用されるフロントエンドを使用する一つのソース言語で生成された特定のファンクションセットが、どの異なる言語に適用されるフロントエンドによって直接利用できるのか示されることになる。こうすることで、開発者は、異なるソース言語で生成されたプログラム、コンポーネント、又は他のエンティティにより直接使用されるファンクションを生成するという一つのタイプの問題に特に良く適合したソース言語を使用することが可能となる。
【００７３】
このように、本関連技術はメタデータと実行可能な命令の情報を生成するフロントエンドコンパイラシステムと、ネイティブソース言語ファイルをコンパイルすることができるのに加えて、この新しい情報をコンパイルすることができるフロントエンドコンパイラシステムの両方に関するものである。本質的には、本関連技術にかかるフロントエンドシステムは、プロセッサ又は他のバックエンド実行システム上で実行され、他のファイル、例えばターゲットコンピュータシステム又は他のフロントエンドシステム上で実行するための実行ファイルへとコンパイルされる共通言語ファイルを生成する。
【００７４】
また、本関連技術は多数のプログラミング言語を使用し、ファンクションの共通ライブラリを共有する多数のフロントエンドを有するシステムに関するものである。共通ライブラリは、多数の異なるソース言語で使用されている共通言語で示されている。フロントエンドコンパイラシステムは、共通ライブラリとライブラリを使用するソース言語ファイルを構成する共通言語ファイルを読み込む。さらに、フロントエンドシステムは共通言語ファイルを生成する。フロントエンドシステムによって生成された共通言語ファイルは、共通ライブラリの中で使用されることになる。また、共通言語ファイルは、さらに共通言語ファイルを実行可能な形式へとコンパイルし、ファイルを実行するバックエンドシステム又は実行時環境に供給される。実行時には、共通言語ライブラリファイルに対応するライブラリプログラムファイルが、実行中に使用されるオブジェクトとメソッドをレイアウトするために、実行時環境によって使用される。さらに、バックエンド部が特定のマシンをターゲットにすることになる。
【００７５】
他の見地によれば、本関連技術は、複数のフロントエンドコンパイラを有するネイティブソースコード言語で書かれているコンピュータプログラムをコンパイルするシステムに関するものである。各フロントエンドコンパイラは、他のネイティブソースコード言語と関連し、各フロントエンドコンパイラは、ネイティブソースコードに加えて、共通言語情報も使用する。また、各フロントエンドコンパイラは、特定のマシンをターゲットとした実行時環境により使用される共通言語ファイルを生成する。さらに、実行時環境は共通言語ファイルを実行時環境へロードするローダと、共通言語ファイルを検査し、実行時に用いられるクラスとオブジェクトのレイアウトを判断するレイアウトエンジンを有する。
【００７６】
さらに他の見地によれば、このシステムの実行時環境は、少なくとも実行するためにメモリに実行可能な命令をロードするローダや、実行時にスタック呼び出しのトラックを維持するスタックウォーカや、メモリ内の命令とデータのレイアウトを判断するレイアウトエンジン、環境のための機密保護サービス、デバッグやプロファイルのような開発者サービス、そして実行時のメモリ管理用のガーベジコレクタのようなメモリ管理サービスのような複数のサービスのうちの一つを提供する。
【００７７】
本関連技術はまた、共通言語ファイルを生成するフロントエンドコンパイラに関するものである。共通言語ファイルは、共通言語命令部における共通言語命令を記述する共通言語命令部とメタデータ部とを有している。フロントエンドコンパイラは、ネイティブソースコードファイルと共通言語ファイルをコンパイルするのに適用される。フロントエンドは共通言語ファイルの全てを受け取り、共通言語ファイルのメタデータ部だけか、メタデータ部と実行可能命令の両方か、いずれかを使用する。あるいは、フロントエンドは、メタデータ部だけを使用のために受け取ることができるように、共通言語ファイルを分割することを要求する。さらに、共通言語ファイルは、手続言語、ファンクション言語又はオブジェクト指向プログラミング言語のような、異なるネイティブソースコード言語に関連する異なるフロントエンドコンパイラにより使用される共通言語ライブラリの一部をなす。このように、共通言語ライブラリは、多数の異なるプログラム言語ファイルの中で使用されるファンクションを記述する。
【００７８】
さらなる他の見地によれば、本関連技術は、共通ライブラリファイルをインポートするコンピュータプログラムをコンパイルする方法に関するものである。この方法は、ソース言語ファイルが共通ライブラリファイルに関するインポートステートメントを有し、共通ライブラリファイルをシンボルテーブルに読み込み、シンボルテーブルを用いて残されているソース言語ファイルをコンパイルするものである。
【００７９】
本関連技術は、コンピュータプロセス、コンピューティングシステムとして、もしくはコンピュータプログラムプロダクトのような製造物として与えられるものであっても良い。コンピュータプログラムプロダクトは、コンピュータシステムによって読み取り可能なコンピュータ記憶媒体であり、コンピュータプロセスを実行するための命令のコンピュータプログラムをエンコードしたものであっても良い。また、コンピュータプログラムプロダクトは、コンピューティングシステムによって読み取り可能な搬送信号を伝達するものであり、コンピュータプロセスを実行するための命令のコンピュータプログラムをエンコードしたものであっても良い。
【００８０】
本関連技術及びその改良形態について、以下に概略を示している添付図面を参照すること、以下に示す本発明の好適な実施形態についての詳細な記載によって、より完全に理解することができる。
【００８１】
関連技術の実施の形態  
一般に、本関連技術の実施の形態にかかるフロントエンドコンパイルシステム及びプロセスは、同一もしくは他のフロントエンドシステムで読み取られる共通言語ファイルを生成するために、一つより多くのソース言語を構文解析し、解読することを含む。本関連技術の実施の形態は、共通ライブラリ宣言ファイルを含み、もしくはインポートするソース言語ファイルを読み取り、構文解析することができ、共通ライブラリ宣言ファイルはソース言語ファイルと異なる言語で表記されている。２つの言語ファイル（ソース言語と共通言語）は一緒に処理され、少なくとも２つの部分、すなわちメタデータと、実行可能な命令を有する中間コードとを生成する。かかる２つの部分は、１つのファイル、例えばフロントエンドで生成された共通言語ファイルになるか、もしくは分割される。フロントエンドコンパイラシステムは、他の共通言語で表されている共通ライブラリファイルを読み取り、理解するだけでなく、特定のプログラミング言語で書かれたファイルを理解して、解析できる。
【００８２】
本関連技術を組み込んだ形態であるシステム７２０のファンクションソフトウェア構成が、図７に示されている。システム７２０は、ネイティブソースファイル７２４からの情報のような情報を受け取り、コンパイルするフロントエンド部７２２を有する。ネイティブソースファイル７２４は、ソフトウェア開発に使用されている、どのタイプのソース言語ファイルでも良い。フロントエンド７２２はフロントエンドシステム７２２にフィードバックできる共通言語ファイル７２６を生成し、及び／又は実行環境７３２のような実行環境において実行される。図７に示すように、フロントエンド７２２の出力はメタデータ７２８と実行可能な命令７３０を含んでおり、実行可能な命令７３０は“命令コード”とも呼ばれる。実行可能な命令７３０は、直接的にプロセッサにより実行される命令（例えば、オブジェクトもしくはネイティブ機械コード）か、あるいは特定の実行環境で実行される“中間”タイプの命令（例えば、Java（登録商標）バイトコード、p-code、もしくは他の中間言語）かのいずれかである。ある実施の形態では、実行可能な命令７３０は、複数の異なるタイプのソース言語のコンセプトを示すのに適応した“共通（一般的という意味）”中間言語を含んでいる。一つのタイプの中間言語だけが、使用されている特定のソース言語にもかかわらず使用できるようにするためである。図７では、フロントエンドシステム７２２の出力が、メタデータ７２８と実行可能な命令７３０の両方の組合せを含む共通言語ファイル７２６になるように示されている。あるいは、フロントエンドシステム７２２は２つの分離ファイル（図示せず）を生成し、一つはメタデータ７２８用に、他方は実行可能な命令７３０用にすることもできる。他の実施の形態においては、フロントエンドシステム７２２は、メタデータ７２８か実行可能な命令７３０のどちらかのみを生成してもよい。このアプリケーションの環境下では、メタデータは実行可能な命令７３０を記述するのに役立つ情報を含んでいる。例のみによって（そして限定しない）、このようなメタデータは、実行可能な命令において使用されているシンボルもしくは名前の記述と、実行可能な命令において使用されているデータタイプの情報、もしくはフロントエンドシステム７２２か実行環境７３２に役立つ他の様々な情報を含んでいる。メタデータ部７２８は、フロントエンドシステム７２２の中にあるメタデータモジュールによって生成され、実行可能な命令７３０はフロントエンドシステム７２２の中にあるコードモジュールによって生成される。フロントエンドシステム７２２は、図７に示すような共通言語ファイル７２６のように、メタデータ７２８、実行可能な命令７３０、又はこれらの組合せのいずれかを読み取り、受け取ることになる。
【００８３】
フロントエンドシステム７２２へフィードバックされるのに加えて、共通言語ファイルは実行環境７３２へ搬送される。実行環境は、管理された実行時システムか、管理されていない実行環境か、直接的な実行環境か、のいずれかである。本質的に、実行環境は、共通言語ファイル７２６によって供給される情報を読み取ることができ、使用することができるバックエンドタイプシステムである。実際に、実行環境は、コンパイルされた情報をフロントエンドシステムから受け取り、コンパイルされた情報から実行可能なコードを生成するバックグラウンド部で記述される、より典型的なバックエンドシステムである。
【００８４】
本関連技術の他の実施の形態にかかるシステム８３４のファンクションソフトウェアの構成を図８に示す。システム８３４は、ネイティブソース言語ファイル８３８を読み取り、メタデータ８４０と実行可能な命令８４２の両方を生成するフロントエンドシステム８３６を有する。図８に示すように、メタデータ８４０と実行可能な命令８４２は、一つの共通言語ファイル８４４の中にあっても良い。あるいは、２つの部分８４０と８４２が分割ファイルの一部であっても良い。フロントエンドシステム８３６は図７に示すフロントエンドシステム７２２と、フロントエンドシステム７２２と８３６の両方がメタデータと実行可能な命令を生成する点において似ている。しかし、フロントエンドシステム８３６は、ネイティブ言語ソースファイル８３８に加えて、共通言語ファイルを受け取るように構成されているかもしれないし、されていないかもしれない。
【００８５】
フロントエンドシステム８３６により生成される共通言語ファイル８４４は、フロントエンドシステム８４６等の、他のフロントエンドシステムによって読み込まれる。フロントエンドシステム８４６はネイティブ言語ソースファイル８４８（ネイティブ言語ソースファイル８３８と同一か異なるかどちらか）だけでなく、共通言語ファイル８４４を読み込む。さらに、フロントエンドシステム８４６は、実行環境８５２へ搬送される中間ファイル８５０を生成する。中間ファイル８５０は、共通言語ファイル８４４及び７２６（図７）と同じフォーマットを有しても良い。もしくは実行環境８５２によって使用される実行可能な命令のみを含むものであっても良い。実行環境８５２は、管理された環境、管理されていない環境、もしくは直接的な実行環境のいずれであっても良い点において、図７に示す実行環境３２と似ている。
【００８６】
フロントエンドシステム８４６は、ファイル８４４及びネイティブ言語ソースファイル８４８のような両方の共通言語ファイルを受け取ることができる点において、図７に示すフロントエンドシステム７２２と似ている。しかし、フロントエンドシステム８４６は、メタデータと実行可能な命令の両方を有する共通言語ファイルを生成するかもしれないし、しないかもしれない点において、フロントエンドシステム７２２とは異なっている。
【００８７】
図８は、本関連技術の観点から可能ならしめる特定の機能を示している。これまで、様々なソース言語がソフトウェア開発に使用するために創られてきた。一般に、ソース言語は、特定の問題もしくは問題における特定のクラスを解決するのに、特に適応しているコンセプトと機能を表現するために発展してきた。このように、特定の言語は、特定の問題を解決し、特定のコンセプトを表現するのに、特に適応するものである。言語の人気が上がったり下がったりしている間に、すべての問題を解決するのに適応した一つのソース言語を誰も作り出さなかった。一つのフロントエンドの出力は、他のフロントエンドにより直接アクセスされ、使用されることから、システム全体のうち異なる部分は、各々、システムの部分に最も適応したソース言語で書かれている。例えば、Lispで書かれている推理又は推論エンジンは、Ｃ＋＋で書かれているプログラムに直接アクセスでき、使用することができる。
【００８８】
本関連技術の他の観点を組み入れた他のシステム９５４にかかるファンクションソフトウェア構成を図９に示す。システム９５４は、少なくとも一つのフロントエンド部分を組み入れる。本関連技術の要件を示すものではなく、単に、多数のもしくは組み合わされたフロントエンドシステムに適用される本関連技術のコンセプトを示すものであるフロントエンド部９５６、９５８、９６０である。フロントエンド部９５６、９５８、９６０は、ファイル９６２、９６４、９６６のような、おのおの異なるタイプのソース言語ファイルを構文解析し、解読することができる。フロントエンド部９５６、９５８、９６０は、おのおの共通言語ファイル９６８、９７０、９７２を生成する。共通言語ファイル９６８、９７０、９７２は、すべて同一の言語、同一のフォーマットで表される。以下に詳細について説明する。
【００８９】
ひとたびコンパイルされると、各ファイル９６８、９７０、９７２は、実行環境９７４に供給されるようなオプションプロセスを経ても良い。実行環境９７４は図７及び図８に示される実行環境７３２及び８５２に似ている。また、実行環境９７４は直接実行環境、管理された実行時環境ましくは管理されていない実行時環境のいずれであっても良い。さらに、実行環境はコンパイルされたファイル９６８、９７０、９７２を読み込み、実行することができる、他のどのようなタイプの環境であっても良い。
【００９０】
フロントエンド９５６、９５８、９６０は、それぞれのソース言語ファイル９６２、９６４、９６６を読み込んで解析できることに加えて、共通言語に表されているファイルを読み込んで解析することができる。さらに、共通言語で表されているファンクションのライブラリ宣言ファイル９７６は、フロントエンド部９５６、９５８、９６０により使用するのに利用可能である。ある実施の形態では、共通ライブラリ宣言は、フロントエンド９５６、９５８、９６０のようなシステム９５４のフロントエンド部によりコンパイルされたファイルを含んでおり、ライブラリ９７６を通じて、他の開発者にも利用可能となる。本質的には、ライブラリ７６で利用可能なファイルは、ファイル９６８、９７０、９７２に類似する共通言語フォーマットである。さらに、共通言語ファイル９６８、９７０、９７２は、図９に示されるように宣言の共通ライブラリ９７６の一部になっても良い。
【００９１】
ソース言語ファイル９６２、９６４、９６６は、特定のフロントエンドに特化したソース言語とシステム９５４の共通言語の両方に関係する組合せ要素を組み立てても良い。より詳しくは、ソース言語９６２、９６４、９６６が、共通ライブラリ宣言ファイル９７６の使用を宣言する“include”又は“import”タイプのステートメントを有する。フロントエンドのコンパイル中において、インポートステートメントは、コンパイラに、利用可能なタイプ、クラス、メソッド、及びファイル９７６からの他の必要な情報を得るように通知し、それによってライブラリ９７６により提供される全てのファンクションの使用を可能にする。残されたソースファイルは、ライブラリで提供されるファンクションを呼び出して使用するために、ネイティブソース言語構文を使っても良い。本関連技術の実施の形態において、ライブラリ９７６は、Pascal、Ｃ、Ｃ＋＋等のようなプログラミング言語のうち、選択されたグループから利用可能なファンクションの代表的なもの（cross section）を含んでいる間は、特定のプログラミング言語用のライブラリファンクションのスーパーセットになりうる。他の実施の形態においては、異なるライブラリ（図示せず）が特定のファンクションをターゲットにするように生成される。例えば、あるライブラリは、インターネット又はワールドワードウェブのアプリケーション開発者をターゲットにしている。他の例としては、ライブラリが、携帯電話のアプリケーション開発者をターゲットにして生成されていること等も考えられる。
【００９２】
実行時には、ファイル９６８、９７０、及び／又は９７２は実行環境９７４にロードされる。一般に、オプションプロセスはファイル上で実行され、当該プロセスは、ファイル９６８、９７０、９７２のような受け取った共通言語ファイルを翻訳し、解釈し、さもなければ実行環境９７４で実行可能なオブジェクトコードに変換する。このように、実行環境９７４は共通言語ファイル９６８、９７０、及び／又は９７２をロードし、これら共通言語ファイルを実行するのに必要な処理を実行する。
【００９３】
さらに、実行環境９７４が実行時環境により管理されている場合には、実行環境９７４はプログラム実行中に他の多くのサービスを提供する。一例としてシステムがローダを提供し、ローダが実行可能ファイルを受け取って、必要なリファレンスを解釈し、コードをロードする。実行環境はスタックウォーカを提供しても良い。すなわちスタックウォーカは、メソッドコールを管理し、与えられた時点におけるスタック上で連続したメソッドコールの識別子を提供するコードピースである。レイアウトエンジンもまた、提供されても良い。レイアウトエンジンは、メモリ内において、実行されるアプリケーションの一部として、様々なオブジェクト及び他の要素のレイアウトを設定する。さらに、実行環境は、承認されていない資源使用やデバッガやプロファイリングのような他の開発者向けサービスを避けるために、機密保護手段を提供しても良い。管理された実行環境によって提供される他のタイプのサービスは、実行前のコードベリファイ、特定のコードが特定のシステム資源をアクセスする（もしくは実行さえできる）許可を受けているか判断する機密保護機構、及びガーベジコレクションのようなメモリ管理サービスを含んでいる。
【００９４】
さらに、実行環境は、共通ライブラリ宣言９７６の機能を実行するための実際の具体化情報を有する共通ライブラリプログラムファイル（図示せず）を使用する。実行環境９７４は、オブジェクト固有の組合せを実行するために、従来のローダ／リンカを使用しても良い。実行環境９７４が、ファイル９６８、９７０、９７２のようなロードされたファイルの様々な要素を理解できるように、実行環境９７４はロードされたファイルのフォーマットを理解する必要がある。実行時環境は、メタデータのような実行時環境に提供される情報を用いて、実行する前にオブジェクトを形成しても良い。
【００９５】
ファイル９６８、９７０、９７２に類似する典型的な共通言語ファイル１０８０のフォーマットを図１０に示す。図１０に示すフォーマットは、単なる例示であって、限定されるものではなく、共通言語ファイルの他の多くのフォーマットが使用可能である。図１０に示すファイル１０８０は、“PE”ファイルであり、共通COFFフォーマットである。ここで、COFFとは、共通オブジェクトファイルフォーマット(Common Object File Format)である。COFFファイルは、ヘッダ１０８２や、セグメント１０８４、１０８６、１０８８、１０９０、１０９２に示す複数セグメントのような、比較的標準化された要素を有する。実際は、ファイル１０８０は、COFFがフォーマットを拡張する方法を定義するものであることから、（ブレーキ１０９４に示すように）より多くのセグメントを有しても良い。図１０に示されているセグメントは、準備において、フロントエンドにより生成されたメタデータと実行可能な命令が、上述したように同一ファイルの中に、もしくは異なるファイルの中にあるようにする必要があることを除いては、本関連技術に特有の実施形態を必ずしも要求されない。図１０に示す例では、ファイル１０８０が、プログラムデータ情報として、セクション１０８６の読み書きデータとセクション１０８８の読み取り専用データのように、セクション１０８６と１０８８を使用している。さらに、ファイル１０８０は、現存するネイティブコードを有するセクション１０９０のようなセクションを有しても良い。セクション１０８４と１０９２は共通言語情報に関するものである。
【００９６】
セクション１０８４は、セクション１０９２に存在する共通言語命令を記述するメタデータ情報を有する。セクション１０９２は、フロントエンド９５６、９５８、９６０のうちの１つのようなフロントエンドで実行されたコンパイルプロセスにおける現在の中間言語コードでも良い。この中間言語コードもしくは共通言語命令は、ファイルを実行可能な命令にコンパイルし、及び／又はファイルを実行する実行環境で使用される。メタデータ情報は、セクション１０９２の命令におけるタイプ、クラス、メソッド、プロパティ、及びイベント提起の概略を記述することによって、セクション１０９２における命令を記述する。ある実施の形態においては、メタデータセクション１０８４は単に構成のリストをタイプしたものにすぎない。
【００９７】
メタデータセクション１０８４は実行時環境によってヘッダ１０８２を通じて、特にヘッダ１０８２に追加された部分１０９８を通じて見つけられる。追加部分１０９８は、ファイル１０８０の中のメタデータセクション１０８４の位置に関する情報を提供する。メタデータセクション１０８４は、実行時環境９７４に実行時にインスタンス化されたオブジェクトのタイプ、形態、サイズに関する重要な情報を提供する。実行時環境７４はこの情報を用い、レイアウトエンジンを用いて、メソッドテーブルを生成し、実行時のオブジェクトに必要なスペースを割り当てる。
【００９８】
さらに、メタデータセクション１０８４は、ファイル１０８０のような共通言語ファイルを呼び出すソースファイルのコンパイルプロセスの間、フロントエンド７２２、８４６、９５６、９５８、９６０（図７から図９）により使用される情報の一部である。つまり、フロントエンド７２２、８４６、９５６、９５８、９６０（図７から図９）は、主に利用可能なファンクション記述に関係していることから、一般にファイル１０８０の残存部分を読み込まず、ファンクションの実行詳細には関係なくシンボルテーブルはロードされ得る。これら実行詳細は共通ライブラリプログラムファイル（図示せず）に保存されており、必要なときに実行環境９７４にロードされる。本関連技術のある実施の形態においては、ファイル１０８０が共通ライブラリ宣言９７６（図９）に追加されると、セクション１０８６、１０８８、１０９０、１０９２は、必要がなくなることから、ファイルから除去される。他の実施の形態においては、フロントエンドシステムは他のセクションの情報を使用しても良いし、それゆえに除去されることもない。
【００９９】
図１０は、適しているファイルフォーマットの一つのタイプのみを示しており、他のファイルフォーマットもまた使用できる。例えば、フロントエンドがネイティブタイプの実行可能コードとメタデータのみを生成するならば、ファイルのセグメントの数も内容も違ったものになるだろう。他の例によれば、メタデータが自分自身のセグメント（１０８４）に存在するように設計されている。しかし、メタデータはまた、一つあるいは多くの他のセグメントと結合されている。さらに、メタデータは自分自身のセグメントに存在しても良いし、他のセグメント内に散在していても良い。
【０１００】
図１１及び以下の記述は、本関連技術を具現化するのに適しているコンピュータ環境についての一般的な記述を提供することを意図するものである。要求されなかったとしても、本関連技術は、パーソナルコンピュータによって実行されるプログラムモジュールのように、コンピュータで実行可能な命令の一般的なコンテキストの中に記述されるだろう。一般に、プログラムモジュールは、特定のタスクを実行し、又は特定の概要データタイプを具現化するルーチンと、プログラムと、オブジェクトと、構成要素と、データ構造等を含んでいる。さらに、当業者なら、本関連技術が、携帯型デバイスやマルチプロセッサシステム、マイクロプロセッサを基調としたあるいはプログラム可能な消費家電、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ等を含む他のコンピュータシステム構成で実施できることを認めるだろう。本関連技術はまた、通信ネットワークを通じてリンクされているリモートプロセスデバイスによってタスクが実行される分散コンピューティング環境においても実施することができる。分散コンピューティング環境においては、プログラムモジュールは、ローカル及びリモートのメモリ保存デバイスの両方に配置することができる。
【０１０１】
図１１を参照すれば、関連技術を実施するための典型的なシステム１１１００は、プロセスユニット１１１０４と、システムメモリ１１１０６と、システムメモリを含む様々なシステム構成要素をプロセスユニット１１１０４とつなぐシステムバス１１１０８を含む従来のパーソナルコンピュータ１１１０２の形態で、一般的な目的のコンピューティングデバイスを含んでいる。システムバス１１１０８は様々な形式のバス構成であり、多様なバス体系を使用しているメモリバス、メモリコントローラ、ペリフェラルバス、ローカルバスを含んでいる。システムメモリ１１１０６は再生専用メモリ（ROM）１１１１０とランダムアクセスメモリ（RAM）１１１１２を含んでいる。基本入出力システム（BIOS）１１１１４は、起動時のように、パーソナルコンピュータ１１１０２における要素間の情報の伝達を助ける基本ルーチンを含んでおり、ROM１１１１０に保存されている。
【０１０２】
パーソナルコンピュータ１１１０２は、さらに、ハードディスクの読み出し及び書き込みを行うハードディスクドライブ１１１１６、着脱可能な磁気ディスク１１１２０の読出し及び書込みを行う磁気ディスクドライブ１１１１８、及びCD-ROM又は他の光学媒体のような着脱可能な光ディスク１１１２４の読出し及び書込みを行う光ディスクドライブ１１１２２を含んでいる。ハードディスクドライブ１１１１６、磁気ディスクドライブ１１１１８、及び光学ディスクドライブ１１１２２は、それぞれ、ハードディスクドライブインタフェース１１１２６、磁気ディスクドライブインタフェース１１１２８、及び光ディスクドライブインタフェース１１１３０によって、システムバス１１１０８に接続されている。ドライブ及びその関連コンピュータ読み取り可能媒体が、パーソナルコンピュータ１１１０２のコンピュータ読み取り可能命令、データ構造、プログラムモジュール、及び他のデータの不揮発性記憶部を提供している。上述した典型的な環境では、ハードディスク、着脱可能な磁気ディスク１１１２０、及び着脱可能な光ディスク１１１２４を用いているが、当業者には言うまでもなく、コンピュータによりアクセス可能なデータを保存できる他のタイプのコンピュータ読み取り可能媒体もまた、典型的な実行環境に使用することができる。他のタイプのコンピュータ読み取り可能媒体としては、磁気カセット、フラッシュメモリカード、デジタルビデオディスク、ＣＤ、ＤＶＤ、ランダムアクセスメモリ（RAM）、再生専用メモリ（ROM）等がある。
【０１０３】
多数のプログラムモジュールが、ハードディスク、磁気ディスク１１１２０、光ディスク１１１２４、ROM１１１１０、又はRAM１１１１２に格納され、これらは、オペレーティングシステム１１１３２、１つ以上のアプリケーションプログラム１１１３４、他のプログラムモジュール１１１３６、及びプログラムデータ１１１３８を含んでいる。ユーザは、コマンド及び情報を、パーソナルコンピュータ１１１０２に、キーボード１１１４０、及び（マウスのような）ポインティングデバイス１１１４２のような入力デバイスを通じて入力することができる。また、一連の画像を取り込むことができるカメラ１１１４４も、システムバス１１１０８に接続されている適当なカメラインタフェース１１１４６を通じて、パーソナルコンピュータ１１１０２への入力デバイスとして含まれる。他の入力デバイス（図示せず）としては、例えば、マイクロフォン、ジョイステック、ゲームパッド、サテライトディッシュ、及びスキャナ等が含まれる。これら及び他の入力デバイスは、システムバス１１１０８に接続されているシリアルポートインタフェース１１１４８を通じてプロセッシングユニット１１１０４に接続されていることが多い。しかし、これらの入力デバイスはまた、パラレルポート、ゲームポート、又はユニバーサルシリアルバス（USB）等の他のインタフェースによって接続されていても良い。モニタ１１１５０、又は他のタイプのディスプレイデバイスもまた、ビデオアダプタ１１１５２のようなインタフェースを通じて、システムバス１１１０８へとつながれている。モニタに加えて、パーソナルコンピュータは、典型的には、スピーカやプリンタのような他の周辺出力デバイス（図示せず）を含んでいる。
【０１０４】
パーソナルコンピュータ１１１０２は、リモートコンピュータ１１１５４のような１つ以上のリモートコンピュータへの論理的な接続を用いてネットワーク化された環境において動作することができる。図１１には、メモリ記憶デバイス１１１５６だけが示されているが、リモートコンピュータ１１１５４は、他のパーソナルコンピュータ、サーバ、ルータ、ネットワークPC、ピア（peer）デバイス、又は他の共通ネットワークノードであり、典型的にパーソナルコンピュータ１１１０２との関連で上述した要素の多くまたはすべてを含むものである。図９に描かれている論理的な接続は、ローカルエリアネットワーク（LAN）１１１５８、及びワイドエリアネットワーク（WAN）１１１６０を含んでいる。このようなネットワーク環境は、オフィス、企業規模コンピュータネットワーク、イントラネット、及びインターネットにおいて珍しいものではない。
【０１０５】
LANネットワーク環境で用いるときには、パーソナルコンピュータ１１１０２は、ネットワークインタフェース、又はアダプタ１１１６２を通じてローカルエリアネットワーク１１１５８に接続される。WANネットワーク環境で用いるときには、パーソナルコンピュータ１１１０２は、典型的に、インターネットのようなワイドエリアネットワーク１１１６０による通信を確立するためのモデム１１１６４、もしくは他の手段を含んでいる。モデム１１１６４は、内蔵でも外付けでもよく、シリアルポートインタフェース１１１４８を通じて、システムバス１１１０８と接続されている。ネットワーク化された環境において、パーソナルコンピュータ１１１０２に関連して描かれたプログラムモジュール、又はその一部は、リモートメモリ記憶デバイスに保存されてもよい。図示されたネットワーク接続は一例であって、コンピュータ間の通信リンク確立のために他の手段を用いることも認められる。
【０１０６】
ここまで論じてきたオペレーション環境の一例によれば、記述セクションの残存部分は、関連技術の実施の形態にかかるオペレーションモジュールの記述専用となる。本関連技術の様々な実施の形態における論理オペレーションは、（１）コンピュータシステム上で実行する一連のコンピュータ具現化ステップ又はプログラムモジュールとして、及び／又は（２）コンピューティングシステムの内部で接続されたハードウェアもしくは論理モジュールとして、具現化される。具現化は、関連技術を具現化するコンピューティングシステムの実行要求に依存する選択行為である。よって、上述された本関連技術の実施の形態を実現する論理オペレーションは、オペレーション、ステップもしくはモジュールとして選択的に参照される。
【０１０７】
フロントエンドシステム７２２（図７）、フロントエンドシステム８４６（図８）、又はフロントエンド９５６、９５８、９６０（図９）のように共通言語ファイルを読み込むためのフロントエンドシステムにより実行される、オペレーションの手続流れ１２２００の例を図１２に示す。流れ図は、読込オペレーション１２２０２から始まり、各々ファイル１２２４、４８、６２、６４、６６のようなネイティブソースファイルの最初のステートメントを読み込むことになる。読込オペレーション１２２０２に続いて、解析モジュール１２２０４が、適当な言葉が使用されているか、すなわち語彙の解析や、適当な文法であるかについて、ステートメントを解析する。
【０１０８】
語彙及び文法解析に続いて、エラーが無い場合には、判断オペレーション１２２０６がステートメントがインポートであるか否か、又は共通言語ファイルもしくはライブラリをインポートすることを試みるステートメントを含んでいるか否かを判断する。特にインポートコマンドが、このファイルのタイプを指示するのに使用されているかもしれないし、又はインポートファンクションを試みた後、実際のライブラリが共通言語ライブラリであるか否かを判断するために解析される。メソッドは、ファイルが共通言語ライブラリであることを検出する能力を与えるためにフロントエンド機能に提供される。
【０１０９】
もし、ライブラリが共通言語ライブラリであるならば、Yes枝へ進み、探索オペレーション１２２０８へ進む。探索オペレーション１２２０８は、本質的にファイルを捜しだし、現行のコンパイルのためのシンボルテーブルにファイルをロードするプロセスを開始する。一度探し出されたら、読込オペレーション１２２１０が共通ライブラリファイルの最初の一行を読み込む。これは、ファイルのメタデータセクションを見つけ、メタデータセクションの最初の一行を見つけるために共通言語ファイルのヘッダの解析を要求できる。重要なことは、読み込まれた共通ライブラリの中の最初の情報が、例えばセクション８４（図１０）のようなメタデータ部分であることである。上述したメタデータは、フロントエンドにシンボルテーブルをロードする能力を与えるタイプ、メソッド、アーギュメント等を記載する情報である。メソッドはフロントエンドが共通言語ファイルを読むことができるように、フロントエンド機能に提供されても良い。
【０１１０】
次に、組立オペレーション１２２１２は、読み込まれたメタデータの一行に基づいて、シンボルテーブルを組み立て、もしくはロードする。組立オペレーション１２２１２に続いて、テストオペレーション１２２１４が、現在の行が最後の行かどうかを決めることによって、メタデータ情報により多くの行があるか否かを判断する。メタデータ情報により多くの行があるならば、現在の行は最後の行ではなく、Yes枝へ進み、読込オペレーション１２２１０へ戻って次の行を読み込む。流れは、シンボルテーブルを組み立てるために、メタデータ情報のすべての行を読むように効果的にループする。最後の行がシンボルテーブルに保存されたら、テストオペレーション１２２１４によりNo枝へ進み、読込オペレーション１２２０２へ戻る。読込オペレーション１２２０２はオリジナルのソースコードファイルの次の行を読み込むことになる。
【０１１１】
もし、判断オペレーション１２２０６が、共通言語ライブラリとしてのステートメントを含まないと判断したならば、No枝へ進み、モジュール１２２１６へ進む。モジュール１２２１６は、ステートメントを解析し、情報をシンボルテーブルへロードするか、あるいは出力モジュールに情報を提供するかを判断する。つまり、ファイルの全てのステートメントにとって、シンボルテーブルはロードされるか、出力タイプステートメントが生成されるかのいずれかである。モジュール１２２１６は流れのこの面を提供する。
【０１１２】
現行のステートメントによるモジュール１２２１６の完成により、判断行為１２２１８は、現行ステートメントがソースコードファイルの中で最後のステートメントであるか否かを判断する。このオペレーションは、ファイルマーカの最後をチェックするだけでもよい。もし、ステートメントがファイルの最後のステートメントでなかったら、流れは枝Noへ進み、読取オペレーション１２２０２へ戻り、次のステートメントが読み込まれる。もし、判断行為１２２１８による判断として、ステートメントがファイルの最後のステートメントであれば、流れは枝Yesへ進み、生成オペレーション１２２２０へ進む。
【０１１３】
生成オペレーション１２２２０は、モジュール１２２１６により提供される出力ステートメントを処理する。そして、中間言語ファイルを生成する。このステップは、コンパイラに全く共通のオペレーションであり、すなわちコンパイラは、ある種のデータ構造又は中間言語ファイルを生成する。しかし、生成オペレーション１２２２０は、ファイル９６８、９７０、９７２（図９）のような出力ファイルの一部として、メタデータ情報をも提供する。そして、このメタデータは、フロントエンド７２２、８４６、９５６、９５８、９６０（図７から図９）で使用されているのと同一タイプのメタデータ情報である。
【０１１４】
一度生成オペレーション１２２２０が完了すると、流れは終了１２２２２へ進む。結果としてのファイルは、メタデータ情報と共通言語命令の両方を含む共通言語ファイルである。さらに、本関連技術の実施の形態においては、結果としてのファイルフォーマットが図１０に示されている。共通言語ファイルは、他のフロントエンドシステム７２２、８４６、９５６、９５８、９６０（図７から図９）か、実行環境９７４（図９）のような実行環境か、どちらかによって使用される。
【０１１５】
図１３は、他の実施の形態にかかるフロントエンド部のオペレーション流れ図を示す。本質的には、プロセスは、図１２と連結して上述されているプロセスと同様であるが、流れ１３３００がオペレーション１３３０４において、新しい読込ステートメントが、オペレーション１３３０６で発生する語彙又は文法解析を行う前に、インポートステートメントで有るか否かを判断する点で異なる。つまり、オペレーション１３３０２は、上述されているオペレーション２０２と、新しいステートメントが解析のために読み込まれる点において類似している。そして、判断ステップ１３３０４が、ステートメントが共通ライブラリのインポートステートメントと関連しているか否かを判断する。もし関連しているならば、オペレーション１３３０８、１３３１０、１３３１２、１３３１４が実行され、ライブラリからシンボルテーブルへと情報がロードされる。もし関連していないならば、オペレーション１３３０６、１３３１６、１３３１８が、ソースファイルの残存部分をシンボルテーブルか出力ステージのいずれかへロードする。さらに、オペレーション１３３２０は、上述したオペレーション２２０に類似しており、共通言語ファイルを生成する。共通言語ファイルは、他のフロントエンドシステム２２、４６、５６、５８、６０（図７から図９）か、実行環境９７４（図９）のような実行環境か、いずれかによって使用される。
【０１１６】
さらに他の実施の形態によれば（図示せず）、ライブラリファイル名はコマンドラインオプションとして追加できる。この場合、コンパイラは、ソース言語ファイルを構文解析する前に、メタデータ情報をシンボルテーブルにロードする。
【０１１７】
Pascal、COBOL、C++等のような現存するソース言語のための現存するフロントエンドコンパイラを変更するためには、フロントエンドシステム７２２（図７）と同じ機能を有するように、２つのステップを実行する必要がある。最初に、コンパイラのソース言語の構文が、ソース言語が他のファイルを“import”するようになっているか否かを判断するために検査されるべきである。もしそうならば、まだそのように適合されていなければ、インポート能力は、中間ファイルもしくは共通言語タイプファイルをインポートできるように変更されるべきである。もし、ソース言語が“import”ファンクションを有していない場合には、ソース構文は、インポートファンクションを実施できるように拡張されるべきである。そして、現存するフロントエンドコンパイラシステムは、少なくとも中間ファイルのメタデータ部を読み込んで、適当にメタデータをハンドリングできるように変更されるべきである。つまり、フロントエンドは、共通言語ファイルを構文解析でき、メタデータのタイプとメソッド情報を、適当な形式の特定のシンボルテーブルに変換することができる。シンボルテーブルに追加された各新しいクラスにとって、共通言語ファイルは、新しいクラスによってサポートされるメソッドとして読み込まれなければならない。もし、出力中の共通言語ファイルの実行可能な命令を直接使用したいならば、フロントエンドはまた、実行可能な命令を読み込んでハンドリングできるよう適当に変更される必要もあるかもしれない。
【０１１８】
現存するコンパイラを、中間共通言語ファイルを使用することができるように変更するのに加えて、フロントエンドシステムは、共通言語ファイルを生成するように変更することができる。大部分の現存するコンパイラは、機械語又は他のファイルを生成するバックエンド部分を有する。一般に、コンパイラを共通言語ファイルを生成するように変更するためには、バックエンドが、機械コードや生成されてきたものの代わりに、共通言語を生成するように変更される。さらに、バックエンドが、共通言語命令に沿ってメタデータを追加するように変更される。
【０１１９】
上述したシステム及び方法によって、多くの異なるプログラミング言語を使用する開発者によって使用される共通言語ライブラリを生成することができるようになる。また、開発者は、一つの言語に特有の問題あるいは他の言語についての他の問題を解決し、そして、他の言語でもってアプリケーション全体を書くことができるようになる。本質的に、本システムは、共通言語ファイルを生成する一つのソース言語コンパイラから、共通言語ファイルを使用する他のソース言語コンパイラまでの、ライブラリについての情報を伝達するために、共通言語ファイルを使用する。一つのライブラリは、ライブラリが各々の新しいプログラミング言語で再書き込みする必要がないように、多くの言語にわたって共有される。さらに、共通言語は、実行時環境が前もって、実行時に使用される異なるオブジェクトのレイアウトを決めておけるように、命令を記述するメタデータを有する。あらに、このシステムは、実行時に先だってメソッドとフィールドのレイアウトを特定する言語を、随意にハンドリングするよう構成することができる。
【０１２０】
本関連技術は、構成の特徴及び／又は方法論的なステップで特定された言語において記述されているが、特に記載された特徴又はステップに限定される必要はない。例として、他のソース言語も、最初のソース言語及び共通言語と共同で、フロントエンド部に含まれている。
【０１２１】
以上のように本関連技術にかかるシステム及び方法によれば、多くの異なるプログラミング言語を使用する開発者によって使用される共通言語ライブラリを生成することができるようになる。また、開発者は、一つの言語に特有の問題あるいは他の言語についての他の問題を解決し、そして、他の言語でもってアプリケーション全体を書くことができるようになる。
【図面の簡単な説明】
【０１２２】
【図１】拡張ランタイムホスティングを提供するためのシステムおよび方法を実施することができる例示的コンピューティング環境のブロック図である。
【図２】ランタイムとホスティングアプリケーションのメモリアブストラクションインタフェースとの間の、例示的アーキテクチャ関係を示す図である。
【図３】ランタイムとホスティングアプリケーションのスレッドアブストラクションインタフェースとの間の、例示的アーキテクチャ関係を示す図である。
【図４】ホストアプリケーションによってＯＳスレッド上にスケジュールされるファイバとして処理されるランタイムタスクの例示的タスクスケジューリングを示すブロック図である。
【図５】アンマネージコードへ／からマネージコードを退出／を逆退出するため、およびアンマネージコードから／へマネージコードへ進入／を逆進入するための、例示的マネージ／アンマネージコード呼出しシーケンスを示す図である。
【図６】拡張ランタイムホスティングを提供するための例示的手順を示す図である。
【図７】関連技術のフロントエンド部を組み入れたソフトウェア環境の機能構成を示す図である。
【図８】関連技術のフロントエンド部の他の実施の形態にかかるソフトウェア環境の機能構成を示す図である。
【図９】関連技術の他の実施の形態にかかるソフトウェア環境の機能構成を示す。共通ライブラリを生成するために多数の共通言語ファイルを用いる場合を示す図である。
【図１０】図７、図８及び図９に示すフロントエンド部を用いて生成される結果としての中間言語ファイルのフォーマットを示す図である。
【図１１】関連技術の実施の形態の実行中に使用されるコンピュータタイプにおけるコンピュータの代表例のブロックダイアグラムである。
【図１２】図１０に示す中間言語ファイルを生成するオペレーションの特徴を示す流れ図である。
【図１３】図１０に示す中間言語ファイルを生成する他の実施の形態にかかるオペレーションの特徴を示す流れ図である。
【符号の説明】
【０１２３】
１００  コンピューティング環境
１０２  コンピュータ
１０４  プロセッサ
１０６  システムメモリ
１０８  バス
１１０  ランダムアクセスメモリ（ＲＡＭ）
１１２  読取り専用メモリ（ＲＯＭ）
１１４  基本入出力システム（ＢＩＯＳ）
１１６  ハードディスクドライブ
１１８  磁気ディスクドライブ
１２０  リムーバブル磁気ディスク
１２２  光ディスクドライブ
１２４  リムーバブル光ディスク
１２６  インタフェース
１２８  オペレーティングシステム（ＯＳ）
１３０  ランタイム
１３２  ホストアプリケーション
１３４  ランタイムインタフェース（ＲＩ）
１３６  他のプログラムモジュール
１３８  プログラムデータ
１４０  キーボード
１４２  ポインティングデバイス
１４４  ユーザ入力インタフェース
１４６  モニタ
１４８  ビデオアダプタ
１５０  出力周辺インタフェース
１５２  リモートコンピュータ
１５４  ローカルエリアネットワーク（ＬＡＮ）
１５６  汎用広域ネットワーク（ＷＡＮ）
１５８  ネットワークインタフェース／アダプタ
１６０  モデム
１６２  インターネット
１６４  リモートアプリケーションプログラム
【図１】
2004310776.tif 000003
【図２】
2004310776.tif 000004
【図３】
2004310776.tif 000005
【図４】
2004310776.tif 000006
【図５】
2004310776.tif 000007
【図６】
2004310776.tif 000008
【図７】
2004310776.tif 000009
【図８】
2004310776.tif 000010
【図９】
2004310776.tif 000011
【図１０】
2004310776.tif 000012
【図１１】
2004310776.tif 000013
【図１２】
2004310776.tif 000014
【図１３】
2004310776.tif 000015
【外国語明細書】
2004310776000001.pdf