"データと、少なくとも1つのプロセッサによって実行された時に、前記プロセッサにユーザ定義型のコンパイル時境界検査の処理を実行させる命令と、によって構成されるコンピュータ可読の持続性記憶媒体であって、前記処理は、ソースコードから中間言語コードを通じて実行可能コードとなるプログラムのコンパイル中に実行されるステップであって、メモリに安全にアクセスするために前記ソースコード内のユーザ定義クラス、即ち、ユーザ定義の境界検査の注釈で注釈付けられるメモリアクセスコードを注釈メンバとして有し、さらに前記メモリアクセスコードにおける境界検査を生成するための境界情報を提供することを示すように注釈付けられる境界提供メンバを別の注釈メンバとして有するユーザ定義クラスを特定するステップと、前記ユーザ定義の境界検査の注釈の境界検査表現を前記中間言語コードに挿入するステップと、前記実行可能コードで発生するであろう重複した境界検査を減らす最適化を適用するステップとを備えることを特徴とするコンピュータ可読の持続性記憶媒体。境界検査表現に応答して境界検査コードを前記中間言語コードに挿入するステップをさらに備え、前記適用するステップは、前記最適化を境界検査表現に適用するよりはむしろ、前記最適化を、挿入された境界検査コードに適用すること、を特徴とする請求項1に記載のコンピュータ可読の持続性記憶媒体。前記適用するステップは、前記最適化を前記中間言語コード内の境界検査コードに適用するよりはむしろ、前記最適化を境界検査表現に適用することを特徴とする請求項1に記載のコンピュータ可読の持続性記憶媒体。前記特定するステップは、明示的に割り当てられるメモリへのアクセスの注釈で注釈付けられたメモリアクセスメソッドを特定することを特徴とする請求項1に記載のコンピュータ可読の持続性記憶媒体。前記特定するステップは、内蔵型のシステム定義の境界検査を補足することを、ユーザ定義の境界検査に示す注釈を特定することを特徴とする請求項1に記載のコンピュータ可読の持続性記憶媒体。前記特定するステップは、ガーベジコレクタ管理型のシステム定義の境界検査を補足することを、ユーザ定義の境界検査に示す注釈を特定することを特徴とする請求項1に記載のコンピュータ可読の持続性記憶媒体。ユーザ定義型、即ち、内蔵ではない型のコンパイル時境界検査を管理するプログラム開発者のための処理であって、コンピュータプログラムのソースコードを取得するステップと、ユーザ定義のデータ型を前記ソースコードで特定するステップと、前記ユーザ定義のデータ型によって定義されるメモリアクセスメソッドを見つけるステップと、前記メモリアクセスメソッドを、明示的に割り当てられるメモリへのアクセスの注釈で注釈付けるステップと、前記ユーザ定義のデータ型によって定義されるフィールドが前記メモリアクセスメソッドについての境界を包含することを示す境界を包含するフィールドの注釈、および前記ユーザ定義のデータ型によって定義される境界取得メソッドが前記メモリアクセスメソッドについての境界を返すことを表示した境界取得メソッドの注釈、のうちの少なくとも1つによって前記ソースコードを注釈付けるステップと、を備えることを特徴とする処理。前記ユーザ定義型は、内蔵配列型および内蔵管理型のうちの少なくとも1つをラップすることを特徴とする請求項7に記載の処理。論理プロセッサと、前記論理プロセッサと動作可能に通信するメモリと、前記メモリに常駐し、ユーザ定義型を有するソースコードであって、前記ユーザ定義型は、ユーザ定義の境界検査の注釈で注釈付けられるメモリアクセスメソッドを有し、前記ユーザ定義型は、少なくとも1つの境界指定子をも有する、ソースコードと、前記メモリに常駐し、前記ユーザ定義の境界検査の注釈の境界検査表現を、中間言語コードに挿入するように構成されたコンパイラと、前記メモリに常駐し、重複した境界検査を減らすために最適化を中間言語コードに適用するように構成されたオプティマイザと、を備えるコンピュータシステム。前記注釈付けられるソースコードは、デバイスドライバのソースコードを備え、前記ユーザ定義型は、メモリマップドバッファに対応することを特徴とする請求項9に記載のシステム。前記ソースコードは、ガーベジコレクトされたデータ型を備え、前記ユーザ定義型は、明示的に割り当てられるメモリに対応することを特徴とする請求項9に記載のシステム。前記ユーザ定義型は、多要素配列型ではない、構成型として定義されることを特徴とする請求項9に記載のシステム。前記境界指定子は、ユーザ定義のデータ型におけるフィールドが、前記メモリアクセスメソッドについての境界を包含することを示す境界を包含するフィールドの注釈、およびユーザ定義のデータ型における境界取得メソッドが、前記メモリアクセスメソッドについての境界を返すことを示す境界ゲッタメソッドの注釈、のうちの少なくとも1つを備えることを特徴とする請求項9に記載のシステム。前記メモリに常駐し、前記ユーザ定義の境界検査の注釈の境界検査表現で注釈付けられる中間言語コードをさらに備えることを特徴とする請求項9に記載のシステム。前記ユーザ定義型は、前記コンパイラによって制御されないデータレイアウトを有することを特徴とする請求項9に記載のシステム。概要今日の管理コードシステム、例えば、Microsoft登録商標.NETやJava登録商標環境それぞれ、マイクロソフト社、オラクルアメリカ社の登録商標であるのような管理コードシステムは、管理コードプログラムによって使用されるすべてのメモリが割り当てられ、そして自動的に管理されることを前提としていることが多い。しかし、システムプログラミングにおいて、特にデバイスドライバプログラミングにおいて、この前提が成り立たないこともある。いくつかの事例において、デバイスドライバによって使用されるメモリは、デバイスのバッファが特定のアドレスセットにメモリマップされる時などに、物理的デバイスによって位置が固定される。他の事例において、メモリは、データの不必要な複製を回避するように、または一定の制限時間内にバッファを再使用するように明示的に管理される。Cなどのいくつかの言語において、プログラムが明示的に割り当てられるメモリを使用する場合、プログラマは、unsafeポインタを管理されていないデータ構造に利用することが多い。ポインタにアクセスするまたはポインタ演算を行う時にエラーを回避するように細心の注意が必要となる。unsafeポインタは、誤ったポインタ演算がメモリ破損またはプログラムクラッシュにつながる恐れがあるので、管理コードの正確性の利点を否定することがある。そのようなエラーは、特にガーベジコレクションが機能している中でデバックするのが困難になる。プログラマがカスタムデータ構造を書き込み、且つ安全のために境界検査を実行したいと望む場合、プログラマは、ソースコードの行に境界検査を明示的に書き込むこともある。そのようなコードの用途は、コンパイラによってそのコードの他の行の用途と区別できない。この事例において、コンパイラは、コンパイラに明示的な境界検査を解除するようにさせる情報に欠ける。本明細書で説明するいくつかの実施形態は、管理コードが明示的に割り当てられるメモリに安全且つ効率的にアクセスするようにさせる。管理コードは、従ってシステムプログラミングに効率的に使用されることができる。本明細書で説明するように、コンパイル時に最適化される境界検査を用いて管理コードをシステムプログラミングに使用することによって、プログラマは、管理コードで効率的なデバイスドライバを書き込み、そしてオペレーティングシステムクラッシュの原因になることが多いデバイスドライバの共通のエラーをなくすことができる。本明細書で説明するいくつかの実施形態は、より広い文脈で見られてもよい。例えば、メモリアクセス、変数境界、ソースコードの注釈、およびコンパイルなどの概念は、特定の実施形態と関連することもある。しかし、それでは、発明の独占権が、本明細書では抽象的な考えに求められる広い文脈の利用から得られない。発明の独占権は、抽象的な考えではない。むしろ、本開示は、特定の実施形態を適切に提供することに重点を置いている。例えば、他の媒体、システム、およびメモリアクセスを伴うメソッド、境界検査、コンパイル、および/またはソース注釈は、本発明の範囲外である。従って、曖昧さおよびそれに付随する証明問題も、本開示の適切な理解によって回避される。図面に例示したような模範的な実施形態を言及するにあたり、特定の用語を本明細書では同じ説明に使用する。しかし、本開示の従来技術複数およびそれを占有している当業者が思い付くであろう、本明細書で例示した機能の改変およびさらなる変更、および本明細書で例示した発明の原理の付加的な適用を特許請求の範囲の範囲内と見なさなければならない。用語の意味は、本開示で明確にされ、従ってこのような明確化に十分注意しながら特許請求の範囲を読まなければならない。特定の例が与えられているが、従来技術複数の当業者は、他の例も、使用される用語の意味の範囲内であり、且つ1または複数の特許請求の範囲の範囲内であってよいことを理解するであろう。用語は、ここでは一般的な用法、特定の産業の用法、または特定のディクショナリまたはディクショナリのセットの用法を有するものと必ずしも同じ意味ではない。用語の意味の幅を示すのに役立つように、さまざまな言い回しを用いて参照番号を使用してよい。参照番号を所与の文章から省略するのは、図面の内容が文字によって論じられていないことを必ずしも意味するわけではない。発明者は、自身で辞書編集する自分の権利を主張して行使する。用語は、ここでは発明を実施するための形態および/またはアプリケーションファイル内のどこかで明示的または暗示的のいずれかで定義されてもよい。本明細書で使用される際、コンピュータシステムは、例えば、1または複数のサーバ、マザーボード、処理ノード、パーソナルコンピュータ携帯用またはそれ以外のもの、パーソナルデジタルアシスタント、セルまたはモバイル電話、および/または少なくとも一部は命令によって制御される1または複数のプロセッサを提供するデバイス複数を含んでよい。その命令は、メモリおよび/または専用回路内のソフトウェアの形式であってよい。特に、ワークステーションまたはラップトップコンピュータ上で実行する多くの実施形態を思い付くかもしれないが、他の実施形態を計算デバイス上で実行でき、そのような任意のデバイスの1または複数は、所与の実施形態の一部であってよい。マルチスレッドコンピュータシステムは、複数の実行スレッドをサポートするコンピュータシステムである。用語スレッドは、同期する能力があるまたは同期に従う任意のコードを含むことを理解しておく必要があり、例えば、タスク、処理、またはコルーチンなどの、他の呼び名も知っておいた方がよい。スレッドは、並行して、逐次に、または並行実行例えば、多重処理と逐次実行例えば、時間スライスとを組み合わせて実行できる。マルチスレッド環境は、さまざまな構成で設計されている。実行スレッドは、並行して実行してよいし、または実行スレッドは、並行実行に組織されてもよいが、実際には順番に逐次に実行する。マルチスレッディングは、例えば、多重処理環境において異なるスレッドを異なるコア上で実行することによって、異なるスレッドを単一のプロセッサコア上で時間スライスすることによって、または時間スライスとマルチプロセッサスレッディングとをいくつか組み合わせることによって実装されてもよい。スレッドの文脈切り替えを、例えば、カーネルのスレッドスケジューラによって、ユーザ空間信号によって、またはユーザ空間の動作とカーネルの動作との組み合わせによって開始できる。スレッドは、例えば、順番に共有データに動作できるし、または各スレッドは、自身のデータに動作できる。論理プロセッサまたはプロセッサは、単一の独立したハードウェアスレッド処理ユニットである。例えば、1コア当たり2スレッドを実行するハイパースレッドクアドコアのチップは、8つの論理プロセッサを有する。プロセッサは、汎用であってよいし、またはグラフィック処理、信号処理、浮動小数点演算、暗号化、I/O処理などの、特定の使用に合わせてもよい。マルチプロセッサコンピュータシステムは、複数の論理プロセッサを有するコンピュータシステムである。マルチプロセッサ環境は、さまざまな構成で発生する。所与の構成において、すべてのプロセッサが機能的に同等であることもあれば、一方別の構成において、いくつかのプロセッサが異なるハードウェア能力、異なるソフトウェア割り当て、またはその両方を有することによって他のプロセッサと異なることもある。構成に応じて、プロセッサを単一のバスに互いに強固に結合してもよいし、緩く結合してもよい。ある構成において、プロセッサは、中央メモリを共有し、ある構成において、プロセッサは、それぞれが自身のローカルメモリを有し、そしてある構成において、共有メモリとローカルメモリとの両方が存在する。カーネルは、オペレーティングシステム、ハイパーバイザ、仮想マシン、および同様のハードウェアインタフェースソフトウェアを含む。コードは、プロセッサの命令、データ定数、変数、およびデータ構造を含む、または命令とデータとの両方を意味する。プログラムは、本明細書では広範に使用され、アプリケーション、カーネル、ドライバ、割り込みハンドラ、ライブラリ、およびプログラマ開発者とも呼ばれるによって書き込まれる他のコードを含む。自動的には、自動化していないものとは対照的に、自動化の使用例えば、本明細書で説明する特定の演算を行うソフトウェアによって構成される汎用計算ハードウェアの使用を意味する。特に、自動的に実行されるステップは、手書きまたは誰かの考えによって実行されない。それらのステップは、マシンを用いて実行される。しかし、自動的には、必ずしも即時にを意味するわけではない。この文書全体を通じて、任意の複数sは、示された機能のうちの1または複数が存在することを意味する。例えば、注釈複数は、1または複数の注釈または同等に少なくとも1つの注釈を意味する。この文書全体を通じて、明示的に別段の定めをした場合を除き、処理中のどのステップの基準も、受益者によって直接実行され、および/または中間機構および/または中間エンティティを通じて受益者によって間接的に実行されてもよく、なおもステップの範囲内であると仮定する。即ち、受益者によってステップを直接実行することは、直接の実行が明示的に定められた用件でない限り要求されない。例えば、送信する、送る、通信する、適用する、挿入する、注釈付ける、表す、指定するなどの、受益者による動作を伴うステップ、あるいは送り先を対象とするステップは、別の受益者によって転送する、複製する、アップロードする、ダウンロードする、符号化する、復号する、圧縮する、展開する、暗号化する、解読するなどの、中間動作を伴う場合もあり、なおも受益者によって直接実行されると理解してよい。データまたは命令の参照が行われる時はいつも、それらの項目は、コンピュータ可読メモリを構成し、それよって、例えば、単に紙上に存在し、誰かの考えによるものとは対照的に、または有線の一過性信号とは対照的に、そのメモリを特定の項目に変換することが理解されよう。オペレーティング環境図1に関して、実施形態のオペレーティング環境100は、コンピュータシステム102を含む。コンピュータシステム102は、マルチプロセッサコンピュータシステムであってもよいし、そうでなくてもよい。オペレーティング環境は、所与のコンピュータシステム内に1または複数のマシンを含むことができ、そのコンピュータシステムは、クラスタ、クライアントサーバネットワーク、および/またはピアツーピアネットワークであってもよい。人間ユーザ104は、ディスプレイ、キーボード、および他の周辺機器106を使用することによってコンピュータシステム102と対話できる。システムの管理者、開発者、技術者、およびエンドユーザは、それぞれ特定のタイプのユーザ104である。1または複数の人間の代わりに動作する自動化されるエージェントもユーザ104にしてよい。いくつかの実施形態において、記憶デバイスおよび/またはネットワークデバイスを周辺機器と見なしてよい。図1に示していない他のコンピュータシステムは、コンピュータシステム102と対話できるし、または例えば、ネットワークインタフェース機器経由で1または複数の接続を使用して、別のシステムの実施形態と対話できる。コンピュータシステム102は、少なくとも1つの論理プロセッサ110を含む。コンピュータシステム102は、他の適したシステムのように、1または複数のコンピュータ可読の持続性記憶媒体112も含む。媒体112は、異なる物理的タイプであってよい。媒体112は、揮発性メモリ、不揮発性メモリ、位置が固定されている媒体、取り外し可能な媒体、磁気媒体、光媒体、および/または他のタイプの持続性媒体単に信号を伝搬する有線などの一過性媒体とは対照的であるであってよい。特に、CD、DVD、メモリスティックなどの、構成媒体configuredmedium114、または他の取り外し可能な不揮発性メモリ媒体は、挿入あるいはインストールされた時にコンピュータシステムの機能的部分になり、そのコンテンツがプロセッサ110によって使用されるようアクセス可能にすることができる。取り外し可能な構成媒体114は、コンピュータ可読記憶媒体112の一例である。コンピュータ可読記憶媒体112のその他の例は、内蔵RAM、ROM、ハードディスク、およびユーザ104によって容易に取り外すことができない他の記憶デバイスを含む。構成媒体114は、プロセッサ110によって実行可能である命令116によって構成される。実行可能は、本明細書では、例えば、マシンコード、解釈可能コード、および仮想マシン上で実行するコードを含む広い意味で使用される。構成媒体114は、データ118によっても構成され、そのデータは、作成され、変更され、参照され、および/あるいは命令116の実行によって使用される。命令116およびデータ118は、それらが常駐する構成媒体114を構成する。そのメモリが所与のコンピュータシステムの機能部分である場合、命令116およびデータ118は、そのコンピュータシステムも構成する。いくつかの実施形態において、データ118の部分は、製品特性、在庫、物理的測定、設定、画像、読み取り、ターゲット、ボリュームなどの、現実世界の項目表現である。そのようなデータはまた、本明細書で説明する柔軟性のあるコンパイル時最適化境界検査によって変換され、例えば、挿入する、適用する、指定する、注釈付ける、表す、結合する、展開する、実行する、変更する、表示する、作成する、読み込む、および/または他の動作によって変換される。プログラム120例えば、ソースコード122、中間言語コード124、および実行可能コード126を用いる、デバッガ、コンパイラおよび他の展開ツール136、他のソフトウェア、および図に示した他の項目は、1または複数の媒体112内に部分的または完全に常駐でき、それによってそのような媒体を構成する。中間言語コード124は、中間表現と呼ばれることもある。プログラム120は、例えば、内蔵型128およびガーベジコレクタ管理型130を含むことができる。多くの展開構成において、配列型132は、内蔵型と管理型との両方である。プロセッサ複数110に加え、オペレーティング環境は、例えば、ディスプレイ、メモリマップドデバイス134、バス、電源、およびアクセラレータなどの、他のハードウェアを含んでよい。所与のオペレーティング環境100は、調整されたソフトウェア開発ツールのセットを開発者に提供する、統合開発環境IDE138を含むことができる。特に、いくつかの実施形態に適したオペレーティング環境のうちのいくつかは、プログラム開発をサポートするように構成されたMicrosoft登録商標VisualStudio登録商標開発環境マイクロソフト社の登録商標であるを含むまたはその作成に役立つ。いくつかの適したオペレーティング環境は、Java登録商標環境オラクルアメリカ社の登録商標であるを含み、いくつかのオペレーティング環境は、CまたはCCシャープなどの、言語を利用する環境を含む。しかし、本明細書の教示は、各種のプログラミング言語、プログラミングモデル、およびプログラムに適用可能である。図1の概略図に1または複数の項目を示し、それらの項目が必ずしも例示されたオペレーティング環境の一部というわけではないことを強調しているが、本明細書で論じるようなオペレーティング環境の項目と相互運用できる。いずれの図またはいずれの実施形態においても、概略図にない項目が必然的に必要ということではない。システム図2は、いくつかの実施形態の使用に適しているアーキテクチャを示す。ユーザ定義クラス202などのユーザ定義型204は、開発者の境界検査の意思を、コンパイラに境界検査だけでなく冗長な境界検査の解除も提供するようにさせる方法でコンパイラ224に伝達する注釈206を有する。注釈は、例えば、ユーザ定義型のメモリアクセス208コードおよび境界提供210コードを特定できる。メモリアクセスコードを、例えば、インライン化ステートメントおよび/または個別メソッドにできる。境界提供コードは、境界218を包含するフィールド212および/または呼び出されると境界218を返すメソッド214であってよい。配列インデックス検査は、非常に有用であるに違いないが、本明細書の重点は、他の種類の境界検査、即ち、単なる配列ではないユーザ定義構造の境界検査に置かれる。よく知られた配列型132とは違って、クラス202または他のユーザ定義型204は、内蔵型ではなく、それゆえコンパイラ224によって制御されないデータレイアウト216を有することができる。いくつかの実施形態において、コンパイラ224は、注釈206に応答して中間言語コード124で境界検査表現220を挿入する。境界検査コード222は、その後、境界検査表現220に応答して実行可能コード126内に置かれる。中間言語コードのよく知られた表記法は、境界検査表現220によって遵守され、生成された境界検査コード222は、よく知られた条件付きジャンプ命令などを含むことができる。しかし、このようなよく知られた表記法および命令の文脈は、本用途では、単なる配列ではなく、且ついくつかの実施形態においてその配列を構成型としても使用していない、ユーザ定義型である。いくつかの実施形態において、オプティマイザ226は、実行可能コード126で発生するであろう冗長な境界検査を解除するために、最適化複数228を境界検査表現220、境界検査コード222、またはその両方に適用する。オプティマイザ226は、コンパイラ224に統合されてもよいし、またはコンパイラ224によってまたは開発者によって呼び出される別個のツールであってもよいが、実施形態によって異なる。配列境界検査に使用される最適化を、代わりにユーザ定義型に適応させて適用することができる。例えば、注釈206の利点が型204に与えられれば、オプティマイザは、そのユーザ定義型204の変数に対するループ内のすべてのアクセスは、その変数が許容可能なメモリアドレス境界内であると判定でき、従ってオプティマイザは、ループを実行する結果として発生するであろう複数の境界検査を解除することができる。図2で提案したように、ユーザ定義型および最適化されたコンパイル時境界検査は、デバイスドライバ230コードを開発する際のプログラム120として特に有用である。管理コードをシステムプログラミングに使用することができ、そしてデバイスドライバを、明示的に割り当てられないメモリのガーベジコレクションを提供するシステムで実行するIDE138を使用して開発することができる。明示的に割り当てられるメモリ、それゆえガーベジコレクトされないメモリは、境界検査を犠牲にせずに、且つ極めて非効率な境界検査を強いることをせずに開発者のコードによって管理されることができる。例えば、クラス202を、注釈付けられたバッファアクセス208メソッドまたはバッファを読み取る/書き込むメソッドを用いて、デバイス134に明示的に割り当てられるメモリマップドバッファ232を含むように定義することができる。バッファのサイズを、動的に判定し、その後bufferBoundフィールド212またはgetBufferBoundメソッド214などの、注釈206および境界提供210機構を経て境界検査コードに提供できる。図1に関して、いくつかの実施形態は、本明細書で説明するように最適化されたコンパイル時境界検査のサポートによってコード122、コード124、コード126を変換するために回路、ファームウェア、および/またはソフトウェアによって構成される論理プロセッサ110およびメモリ媒体112をコンピュータシステム102に提供する。そのメモリは、論理プロセッサと動作可能に通信する。メモリに常駐するソースコード122は、ユーザ定義型204を有する。ユーザ定義型は、ユーザ定義の境界検査注釈206で注釈付けられる、メモリアクセス208メソッドを有する。ユーザ定義型は、境界提供210フィールドまたはメソッドなどの、少なくとも1つの境界指定子も有する。メモリに常駐するコンパイラ224は、ユーザ定義の境界検査注釈による中間言語コード124の境界検査表現220に挿入するように構成される。メモリに常駐するオプティマイザ226は、重複した境界検査を減らすために、最適化228を中間言語コードに適用するように構成される。いくつかの実施形態において、注釈付けられたソースコードは、デバイスドライバ230のソースコード122を含み、そしてユーザ定義型204は、メモリマップドバッファ232に対応する。メモリマップドバッファは、単なる一例であり、いくつかの実施形態において、注釈付けられたデバイスドライバコードは、明示的に割り当てられた他のメモリ112にアクセスする。いくつかの実施形態において、注釈付けられたソースコードは、ガーベジコレクトされたデータ型130を含み、そしてユーザ定義型は、明示的に割り当てられるメモリに対応する。いくつかの実施形態において、ユーザ定義型204は、コンパイラ224によって制御されないデータレイアウト216を有する。いくつかの実施形態において、ユーザ定義型204は、どの多要素配列型も構成型としないように定義される。他の実施形態において、ユーザ定義型204は、1または複数の配列を構成型として有するが、配列よりも複雑である。いくつかの実施形態において、ユーザ定義型204は、配列型をラップし、そして補足的な境界検査、例えば、配列に割り当てられた空間内にあるだけでなく、更新された要素を保持している空間内にあるか、または指定された値のセットを保持するように開発者によって意図された配列の下位部分内にある、配列アクセスの検査を提供する。いくつかの実施形態において、境界指定子例えば、境界提供210機構は、以下の、ユーザ定義のデータ型204のフィールド212がメモリアクセス208メソッドの境界218を包含することを示したフィールド包含境界注釈206と、ユーザ定義のデータ型204の境界取得メソッド214がメモリアクセス208メソッドの境界218を返すことを示した境界ゲッタメソッド注釈206とのうちの少なくとも1つを含む。いくつかの実施形態において、システム102は、メモリに常駐する中間言語コード124を含み、そしてそのコード124は、ユーザ定義の境界検査注釈206の境界検査表現220で注釈付けられる。いくつかの実施形態において、コンパイラ224は、ユーザ定義の境界検査注釈206だけでなく、内蔵型128にも境界検査コード222を挿入するように構成される。いくつかの実施形態において、ユーザ定義の境界検査注釈206は、補足的な境界検査を示し、その中でユーザ定義型204は、任意のユーザ定義の境界検査注釈206が存在しているかどうかにかかわらず、コンパイラ224が境界検査を終了するように構成された内蔵型128をラップする。いくつかの実施形態において、人間ユーザのI/Oデバイススクリーン、キーボード、マウス、タブレット、マイクロフォン、スピーカ、動きセンサなどなどの周辺機器106は、1または複数のプロセッサ110およびメモリと動作可能に通信する際に存在する。しかし、ある実施形態は、どの人間ユーザ104もその実施形態と直接対話しないように、システムに深く組み込まれることもある。ソフトウェアの処理はユーザ104が行ってもよい。いくつかの実施形態において、システムは、ネットワークによって接続される複数のコンピュータを含む。ネットワークインタフェース機器は、例えば、パケット交換ネットワークインタフェースカード、無線トランシーバ、または電話ネットワークインタフェースなどの、コンポーネントを使用して、ネットワーク108へのアクセスを提供することができ、それらのコンポーネントは、コンピュータシステムに存在する。しかし、ある実施形態は、直接メモリアクセス、取り外し可能な不揮発性媒体、または他の情報記憶-読み出しおよび/または送信アプローチを通じて通信することもできるし、またはコンピュータシステムの実施形態は、他のコンピュータシステムと通信せずに動作できる。処理図3は、いくつかの処理の実施形態をフローチャート300で例示している。図面に示した処理は、いくつかの実施形態で自動的に、例えば、ユーザ入力をほとんどまたはまったく必要としないスクリプトの制御下でコンパイラ224およびオプティマイザ226によって、またはユーザ定義型204をユーザ供給仕様から生成する自動化されたソースコード122ジェネレータによって実行されることができる。処理を、一部では自動的に、および表示がなければ一部では手動で実行することもできる。所与の実施形態において、例示された0または1以上の処理のステップを繰り返してもよく、恐らく動作する異なるパラメータまたはデータを用いるであろう。実施形態のステップは、図3に並べられた上から下への順序とは異なる順序で行われてもよい。ステップは、順次に、部分的に重なる方法で、または完全に並行して実行されてもよい。フローチャート300が処理中に実行されるステップを示すためにトラバースする順序は、ある処理の実行から別の処理の実行までさまざまになり得る。フローチャートのトラバース順序も、ある処理の実施形態から別の処理の実施形態までさまざまになり得る。ステップは、実行される処理が動作可能で、且つ少なくとも1つの特許請求の範囲に従うという条件で、省略され、組み合わされ、名前を変えられ、再グループ化され、あるいは例示されたフローから離れてもよい。テクノロジーの態様を明らかにするのに役立つ例を本明細書で与えるが、本文書内で与えられる例は、考えられる実施形態をすべて説明しているわけではない。実施形態は、本明細書で与えられる特定の実装、配置、表示、機能、アプローチ、またはシナリオに限定されない。所与の実施形態は、例えば、付加的または異なる機能、機構、および/またはデータ構造を含んでもよく、本明細書で与えられた例から逸脱しなければよい。ユーザ定義型を特定するステップ302において、実施形態は、ソースコードのユーザ定義型204を特定する。ステップ302は、本明細書で説明するようなユーザ定義型204を特定するように適応した、例えば、字句アナライザ、パーサおよび/または他の機構を使用して実現できる。具体的には、よく知られたソースコードの注釈を認識するのに使用される機構を適応させて、キーワードによって注釈206を認識できる。境界検査表現を挿入するステップ304において、実施形態は、対応する注釈付けられたソースコードのコンパイル中、境界検査表現220を中間言語コード124に挿入する。ステップ304は、本明細書で説明するような境界検査注釈206を表現するために適応した、例えば、解析木、抽象構文木、属性、汎用のドープベクトル、および/または他の機構を使用して実現できる。最適化を適用するステップ306において、実施形態は、最適化複数228を適用して、冗長な境界検査を減らすまたはなくす。最適化をソースコード、中間コード、および/または実行可能コードに適用して、実行可能コードで発生するであろう重複した境界検査を減らすことができる。ステップ306は、境界検査に従うメモリアクセスは、実行中、結果として許可された境界外のメモリアクセスになるであろう値を想定することができないと分析的に判定することによって実現できる。例えば、ポインタが、コードの第1のポイントにおいて境界検査された場合、およびその境界およびポインタ値が、コードの実行の後に第2のポイントにおいて変更されなかった場合、第2のポイントにおける境界検査は必要ない。別の例として、、ポインタが、コードの第1のポイントにおいて境界検査された場合、および所与の指示で変更されたポインタ値が、コードの実行の後に第2のポイントにおいてその指示で変更された境界ほど変更されなかった場合、第2のポイントにおける境界検査は必要ない。さらに別の例として、メモリアクセスが、コードの実行中にどのフロー制御によっても到達不可能な場合、そのメモリアクセスの境界検査は必要ない。境界検査コードを挿入するステップ308において、実施形態は、対応する注釈付けられたソースコードのコンパイラ中に境界検査コード222を実行可能コード126に挿入する。いくつかの実施形態は、中間言語コード124および実行可能コード126を別個に、例えば、別個のファイルに保持し、一方他の実施形態は、中間言語コード124および実行可能コード126を混合する。従って、ステップ308は、中間言語コード124として作業しているメモリの同じファイルまたは同じブロックに示される実行可能コード126に境界検査コード222を挿入することも起こり得る。ステップ308は、例えば、解析木、抽象構文木、選択命令、スケジューリング命令、レジスタ割り当て、および/または他の機構を使用して、境界検査コード222を挿入するように適応することを実現できる。境界検査を補足するステップ310において、実施形態は、例えば、内蔵型の境界検査または単純な配列型の境界検査などの、すでに提供された境界検査を補足する。ステップ310は、例えば、境界検査された構成型を有する型204を定義することによって、またはそのような型をコンパイルすることによって実現できる。従って、境界検査を補足するステップ310は、境界検査表現を挿入するステップ304中および/または境界検査コードを挿入するステップ308中に、その挿入が以前に提供された境界検査を補足する場合に発生し得る。境界検査を補足するステップ310は、以前に示した境界検査にさらに境界検査を追加するように注釈付けられる型204を定義する開発者によって実行されることもできる。特定の型を定義するステップ312において、ユーザは、配列型132でない型204、即ち、配列型を持たない型204を構成型として定義する。クラス202は、ユーザ定義型204の一例であると見なされる。整数変数などの単一値の変数は、配列の特殊な例と見なされない。ステップ312の用途として、配列は、少なくとも2つの要素を有する。ステップ312によって定義される型の配列の欠如は、よく知られた配列専用の境界検査と比較して、本明細書で説明するようなコンパイル時境界検査による柔軟性の改善を強調する働きをする。よく知られたソースコード編集ツールおよび開発環境138を、開発者によってステップ312中に定義される型204を受け取るのに使用されてもよい。ソースコードを取得するステップ314において、開発者または開発者の代わりに動作する実施形態は、ソースコード122を取得する。ステップ314は、ファイルシステム、ネットワーク、IDE138、および/または他のよく知られた機構を使用して実現できる。型を指定するステップ316において、開発者または開発者の代わりに動作する実施形態は、ソースコード122のユーザ定義型204例えば、ユーザ定義クラス202であってよいを指定する。よく知られたソースコード編集ツールおよび開発環境138は、開発者によってステップ316中に型204を指定するのに使用されてもよい。特定の実施形態において、ステップ316は、特定の型を定義するステップ312および/または境界検査を補足するステップ310を含むことができる。メソッドを見つけるステップ318において、開発者または開発者の代わりに動作する実施形態は、ユーザ定義型204によって定義される例えば、指定されるステップ316メモリにアクセスするメソッド320を見つける。そのようなメソッド320は、一般にメモリアクセスコードの例である。ステップ318は、よく知られたソースコード編集ツールおよび開発環境138を使用して実現でき、特に、キーワード検索能力で実現できる。注釈付けるステップ複数322において、開発者または開発者の代わりに動作する実施形態は、ユーザ定義型204のオブジェクトまたは他の変数を保持するために明示的に割り当てられるメモリの境界検査情報をコンパイラ224に提供するソースコードを注釈付ける。例えば、メモリアクセスコードは、ユーザ定義の境界検査324の注釈206で注釈付けられ、それは、注釈206を持たない言語環境によってどんな検査が提供されても、そのコードが、明示的に境界検査に割り当てられるおよび/あるいは従うメモリにアクセスするまたはアクセスできることを示す。明示的に割り当てられるメモリにアクセスするまたはアクセスできるコードは、明示的に割り当てられるメモリへのアクセス326の注釈206によってコンパイラ224に特定されることができる。境界提供210の注釈206は、境界を包含するフィールド328の注釈206で注釈付けるステップ322のフィールド212によって、または境界ゲッタメソッドboundgettermethod330の注釈206で注釈付けるステップ322のメソッド214によってなどで境界を示す、注釈付けるステップ322の機構に置かれてもよい。ラップするステップ332において、開発者または開発者の代わりに動作する実施形態は、ユーザ定義型204の既存の型をラップする。即ち、ユーザは、既存の型を構造型として有する、型204を定義指定するし、それによって、必要であれば、既存の型の境界検査を補足するステップ310を用いる。ステップ322は、よく知られたソースコード編集ツールおよび開発環境138を使用して実現できる。第2の境界を表すステップ334において、開発者または開発者の代わりに動作する実施形態は、ユーザ定義型204の第2の境界218の条件を表す。即ち、ユーザは、異なる境界を指定することによってユーザ定義型の境界検査を補足するステップ310を用いる。例えば、型は、割り当てられた全メモリを反映する第1の境界を有し、および割り当てられたメモリの実際の使用を反映する第2の境界も有することができ、例えば、古いとマークされたレコードは、たとえメモリに常駐していてレコードを保持するために割り当てられていても、境界外と見なされる。ステップ324は、よく知られたソースコード編集ツールおよび開発環境138を使用して実現できる。重複した境界検査を減らすステップ336において、実施形態は、例えば、少なくとも1つの冗長な境界検査を見つけて、そして解除するのに成功した、最適化複数228を適用するステップ306によって、重複した境界検査を減らす。コンパイルするステップ338において、実施形態は、注釈付けるステップ322のソースコードをコンパイルする。ステップ338は、よく知られたコンパイルツール、および本明細書で説明するようなユーザ定義型のコンパイル時に最適化される境界検査を提供するように適応された技術を使用して実現できる。メモリを構成するステップ340において、メモリ媒体112は、ユーザ定義型204と、コンパイラ224を最適化する226と、および/あるいは本明細書で説明するようなユーザ定義型のコンパイル時最適化境界検査に接続することによって構成される。前述のステップおよびそれらの相互関係は、さまざまな実施形態に関連して以下により詳細に論じる。いくつかの実施形態は、ユーザデータ型のコンパイル時境界検査の処理を提供する。この処理は、ソースコードから中間言語コードを通じて実行可能コードに流れるプログラムのコンパイル中に実行されるステップを含む。ソースコードのユーザ定義クラス202または他の型204の特定は、特定するステップ302を用いる。ユーザ定義クラスは、例えば、明示的に割り当てられるメモリに安全にアクセスすることを意図する場合もある。いくつかの実施形態において、ユーザ定義クラスは、多要素配列型でない任意の型を構成型として定義されるステップ312を用いる。ユーザ定義クラスは、メモリアクセス208コードを注釈メンバとして有することができ、そのコードの注釈は、ユーザ定義の境界検査324の注釈206で注釈付けるステップ322を用いる。クラス202は、境界提供210メンバを注釈メンバとしても有することができ、その提供メンバの注釈は、メモリアクセスコードの境界検査を生成するための境界218情報を提供することを示すように注釈付けるステップ322を用いる。注釈付けられた型204に応答して、ユーザ定義の境界検査の注釈の境界検査表現220は、中間言語コードに挿入されるステップ304を用いて、場合によっては、最適化228は、実行可能コードで発生するであろう重複した境界検査を減らすために適用するステップ306を用いる。いくつかの実施形態において、処理は、境界検査表現に応答して、境界検査コードを中間言語に挿入するステップ308を含み、ステップの適用は、最適化を境界検査表現複数に適用するよりはむしろ、挿入された境界検査コードに最適化を適用するステップ306を用いる。いくつかの実施形態において、ステップの適用は、最適化を境界検査コード222に適用するよりはむしろ、最適化を境界検査表現複数220に適用するステップ306を用いる。いくつかの実施形態において、ステップの特定は、明示的に割り当てられるメモリへのアクセス326の注釈で注釈付けられたステップ322のメモリにアクセスするメソッド320を特定するステップ302を用いる。いくつかの実施形態において、ステップの特定は、内蔵型128のシステム定義の境界検査を補足するステップ310を意図する、ユーザ定義の境界検査を示す注釈206を特定するステップ302を用いる。いくつかの実施形態において、ステップの特定は、ガーベジコレクタ管理型130のシステム定義の境界検査を補足するステップ310を意図した、ユーザ定義の境界検査を示す注釈206を特定するステップ302を用いる。いくつかの実施形態は、ユーザ定義型、即ち、内蔵ではない型のコンパイル時境界検査を管理する処理をプログラム開発者に提供する。その処理は、コンピュータプログラムのソースコード取得するステップ314と、例えば、型204を書き込むことによってまたは以前に書き込まれた型を受け取ることによってそのソースコードのユーザ定義型を指定するステップ316とを含む。処理はまた、ユーザ定義のデータ型によって定義される、メモリにアクセスするメソッド320を見つけるステップ318と、例えば、明示的に割り当てられるメモリへのアクセス326または他の注釈206でメモリにアクセスするメソッドを注釈付けるステップ322とを含む。さらに、処理は、以下の、ユーザ定義のデータ型204によって定義されるフィールド212が、メモリにアクセスするメソッドの境界218の値を包含することを示した、境界を包含するフィールド328の注釈206と、ユーザ定義のデータ型によって定義される境界取得メソッド214が、メモリにアクセスするメソッドの境界218の値を返すことを示した、境界ゲッタメソッド330の注釈206とのうちの少なくとも1つでソースコードを注釈付けるステップ322を含む。いくつかの実施形態において、開発者は、メモリにアクセスするメソッドの第2の境界を表すステップ334の注釈206でソースコードを注釈付けるステップ322を用いる。いくつかの実施形態において、ユーザ定義型204は、内蔵された128の配列型132をラップするステップ332を用いる。いくつかの実施形態において、ユーザ定義型204は、内蔵された128の管理型130をラップするステップ332を用いる。構成媒体いくつかの実施形態は、構成されたコンピュータ可読記憶媒体112を含む。媒体112は、ディスク磁気ディスク、光ディスクその他、RAM、EEPROMまたは他のROM、および/または、特に持続性のコンピュータ可読媒体有線または他の伝搬信号媒体とは対照的であるを含む、他の構成可能メモリを含んでもよい。構成される記憶媒体は、特に、CD、DVD、またはフラッシュメモリなどの、取り外し可能な記憶媒体114であってもよい。取り外し可能でも取り外し不能でもよく、且つ揮発性でも不揮発性でもよい、汎用メモリは、ユーザ定義型204それらの注釈206を含む、および/または注釈206を処理するように適応したオプティマイザ226などの、項目を使用した実施形態に、取り外し可能な媒体114および/またはネットワーク接続などの別のソースから読み取って構成媒体を形成する、データ118および命令116の形式で構成されることができる。構成媒体112は、コンピュータシステムに、本明細書で説明するような注釈とコンパイル時に最適化される柔軟性のある境界検査とを通じて、ソースコードまたは他のコードを変換する処理ステップを実行するようにさせる能力がある。従って図1から図3までは、構成された記憶媒体の実施形態および処理の実施形態、ならびにシステムおよび処理の実施形態を明らかにするのに役立つ。特に、図3に例示した、あるいは本明細書で教示した処理ステップのいずれも、構成媒体の実施形態を形成する記憶媒体を構成するのに役立つように使用できる。付加的な例付加的な詳細および設計考察を以下に与える。本明細書の他の例と同様に、説明する機能は、所与の実施形態において、個々におよび/または組み合わせて使用されてもよいし、または全く使用されなくてもよい。当業者は、実装の詳細は、専用APIおよび専用サンプルプログラムなどの、特定のコードに関連する場合もあり、従って、それぞれの実施形態で示す必要がないことを理解するであろう。当業者は、詳細を論じるのに用いるプログラム識別子および他のテクノロジーは、実装時固有のものであり、従ってそれぞれの実施形態に関連する必要がないことも理解するであろう。それらの詳細は、必ずしもここで提示される必要があるわけではないが、そのような詳細は、一部の読み手に文脈を与えて読み易くできるし、および/または本明細書で論じたテクノロジーの多くの考えられる実装のうちのいくつかを明らかにできるため、提供される。本明細書で説明するいくつかの実施形態は、以下の態様を与える。第一に、プログラマに、明示的に割り当てられるメモリに安全な形でアクセスするデータ型204例えば、クラス202を定義するようにさせる方法である。プログラマは、プログラマがデータ型によって定義されるメソッドに置く、注釈206のセットを使用することができる。ある種類の注釈206は、注釈付けられたメソッドが、明示的に割り当てられるメモリにアクセスし、そして境界検査によって保護されなければならないことを示す。別の種類の注釈206は、データ型のフィールド212が、メモリアクセスの境界218を包含することを示す。3番目の種類の注釈206は、データ型のメソッド214が、メモリアクセスの境界を返すことを示す。2番目の種類の注釈または3番目の種類の注釈のいずれかまたは両方を、第1の種類の注釈の特定のインスタンスに使用できる。第二に、コンパイラ224は、このような注釈206を、その中間表現で、即ち、中間言語コードで表現する。第三に、中間表現の注釈に基づいて、コンパイル224は、明示的に割り当てられるメモリにアクセスするメソッド320を呼び出す前に、境界検査を挿入する。第四に、境界検査を挿入するステップ304/308の後、コンパイラは、不必要な境界検査を減らすなくすこともあり得るステップ336の最適化を行う。このような最適化228は、注釈付けられた中間表現を理解し、そして単なる配列よりも複雑である明示的に割り当てられるメモリにアクセスするメソッドを呼び出す前に挿入される境界検査をなくすように配列の最適化を拡張することによって、リテラチャーによくある最適化によって現在の文脈で使用されるように適応されることができる。コンパイラ224または他のオプティマイザ226は、境界アクセスまたは境界アクセスを返すメソッドを包含するフィールド、および機能を呼び出す前に挿入される検査を比較して特定し、その後その検査を安全になくすことができるかどうかをアレイの不必要な境界検査をなくすためのよく知られた技術によって適応されるアプローチを経てシンボルで判定する。このようにして、プログラマは、明示的に割り当てられるメモリを比較的安全な形で使用することができる。これによって、明示的に割り当てられるメモリに管理コードで効率的よく、安全にアクセスすることができるようになる。いくつかの実施形態において、コンパイラ224は、単なる配列ではないデータ構造を含む、データ構造に任意に適用することができる属性のセットを提供する。この方法で、これらの実施形態は、一般化され、そして例えば、内蔵言語型のような配列に特有な作業などの、境界検査の初期作業に柔軟性を付加する。これらの実施形態は、プログラマが、境界検査をそのプログラマによって定義される代替データ構造に適用できるようにさせ、特に、コンパイラおよび言語システムがデータレイアウト216を制御しないか、またはそこでのデータレイアウト216が任意であってよい状況で境界検査ができるようにさせる。いくつかの実施形態は、プログラミング言語による配列の実装に使用されたドープベクトルの考えから思い付いたものであり、プログラマが、プログラミング言語の実装によって定義されるデータ構造の代わりに、境界検査されるデータ構造を定義できる実施形態に到達する過程でその概念を変更している。よく知られたドープベクトルは、配列要素、配列境界、および可能であれば他の情報を包含するメモリブロックのポインタを包含する。いくつかの実施形態は、プログラムが、よく知られた配列境界検査と本明細書で教示した柔軟性のあるユーザ定義型204の境界検査との両方に対してより効率的になるように、配列境界検査をなくす、よく知られた作業に統合されるまたは統合されることができる。いくつかの実施形態において、注釈206は、必要に応じてランタイム時に強制される、ライブラリ動作のハイレベルではない意味のプロパティの正確性検査を記述する。オプティマイザ226は、不必要な検査をなくすように試みる。他の作業では、対照的に、オプティマイザは、ライブラリの意味のプロパティを記述する注釈を使用して、そのライブラリの使用法を、本明細書で説明するような不必要で安全な検査を減らすステップ336を用いずに、最適化する。いくつかの実施形態は、ジャストインタイムJITコンパイル、ガーベジコレクションGC、ランタイムリフレクション他などの、サービスおよび機能を含む比較的大規模なランタイムである、Microsoft登録商標の共通言語ランタイムCLRを包含したオペレーティング環境100を有する。一部のGCが、型安全性のために提供されることもあるが、いくつかの実施形態は、従来のコンパイル事前コンパイルと呼ばれることもあるを用いてC言語モデルに密接に従う。いくつかの実施形態において、Cは、以下のメソッドの属性に従って使用することができるように、返り値を注釈付けできるようにする。[return;SomeAttribute]intSomeMethod{...}いくつかの実施形態において、コンパイラ生成およびコンパイラ解除の境界検査は、、管理されていないリソース、典型的には、メモリのインデックスプールを有するデータ構造に利用可能であるが、これに限定されない。プログラマは、コンパイラ224が、ランタイム時に例えば、境界違反の例外を送出することによって配列境界検査と同様にふるまう境界検査と、よく知られたオンデマンドの配列境界検査ABCDアプローチまたはABCDの代わりとなるよく知られた最適化で適応したアプローチによって解除される境界検査とを生成するように、プログラマのデータ構造を注釈付けることができる。いくつかの実施形態において、3つのカスタム属性を提供する。BoundsChecking属性は、注釈付けられるメソッド320に適用される。それに応じて、コンパイラ224は、呼位置における境界検査をBoundsCheckingとマークされたメソッドに挿入する。一実施形態において、コンパイラ224は、BoundsCheckingメソッドに、少なくとも1つの引数を有することを要求し、そしてその第1の引数がInt32型であることを要求する。境界検査は、第1の引数がゼロとBoundとマークされたフィールド以下を参照との間であることを検査する。この実施形態において、BoundsCheckingメソッドを有するすべての型は、Boundとマークされたのと同じ1つのInt32フィールドを有する。BoundsCheckingを付加することによる安全検査の解除は、ブレイク変更と見なさなければならない。Bound属性は、注釈付けられるフィールド212に適用される。一実施形態において、そのフィールドは、Int32であり、同じ型204のBoundsCheckingメソッドによって生成される境界検査によって使用される。BoundGetter属性は、注釈付けられるメソッド214に適用される。一実施形態において、Boundを返すメソッドがインライン化されない場合、そのメソッドは、BoundGetterとマークされ、そしてそのメソッドの呼は、そのBoundへのアクセスとして処理される。いくつかの実施形態において、コンパイラ224は、上記の要件を検査するが、Boundが意味のあるフィールドに唯一適用されること、およびBoundGetterがBoundまたはそのBound未満の値を返すメソッド複数に唯一適用されることを確認するのは、プログラマの責任である。境界検査を解除するための最適化に基づいて適応した配列を有する一実施形態において、その境界検査は、Boundフィールドが変化していない場合、安全でない解除が行われる恐れがある。いくつかの実施形態は、アプローチに基づく型をとり、そしてユーザが配列に似た形の型を書き込むことを予測し、そしてユーザにその形レングスメソッドの場所、アクセス機構の場所をコンパイラに記述するように求める。しかし、構造型は、それぞれの実施形態では必要ない。いくつかの実施形態において、関与する特性は、ユーザコードの位置が、あるユーザ変数の検査を必要とし、そしてコンパイラは、その検査を構築する方法を命令されるという要因を含む。いくつかの実施形態は、実装の選択として、配列検査[0,長に似た利用可能な検査の形をとる。いくつかの実施形態は、メソッド320に[BoundsChecking]を付ける。いくつかの実施形態はまた、以下の例のような、他のメモリアクセス208コードでそれらを直接ソースコードに置く。voidFoointi{bytep=...[BoundsChecking]or[BoundsCheckingi]...pi...}実際、この種類の注釈は、あるソース言語の標準から外れているかもしれない。それは、ECMA335標準の実装である、マイクロソフト中間言語MSILに従っていないが、他の言語に従うことができる。いくつかの実施形態は、明示的に注釈付けられるメモリの保護に限定されない。例えば、ある実施形態では、ラップするステップ332の管理配列がこのようになる。classList{int[]arr=newint[20];[Bound]intcount=0;voidAあddinti{arr[coount]=i;count=count1;}[BoundsChecking]voidGetinti{returnarr[i];}}この例において、プログラム言語は、arrで既存の配列境界検査を提供するが、開発者は、iが20未満であることだけでなく、リストに付加された項目数よりも少ないことも確認するためにより強固な補足的な検査も必要とする。両方の検査は、配列境界検査および/または他の最適化が済むと解除の候補となる。排除本明細書で説明される柔軟性のあるコンパイル時境界検査と先行アプローチとの違いをさらに明らかにするために、よく知られた配列境界検査の考察を以下に与える。この考察で説明する概念およびテクノロジーは、本明細書で教示された実施形態と互いに使用されないようにするという点において、実際に置き換えられるが、それらは、ここでは保護が求められる実施形態の範囲外にある。境界属性の収束の文脈において、あるアプローチは、ポインタまたはC配列または配列型のフィールド、パラメータ、または返り値で示すことができる属性を記す。[StaticBoundn]、ここでのnは、ある整数リテラルである。[BoundedByident]、ここでのidentは、以下のいずれかの識別子である。即座に構造を包含する同じメンバである整数型のその他のフィールド。または、同じ手順/メソッドのその他の仮パラメータ。または、返り値の例において、実際にメソッドにアタッチされる返り値。これらの識別子は、引数が{string|int}と定義されることが許可される場合、単一の属性に折り畳まれる。第2の属性名を必要としなくてもよい。これらの属性を搬送するフィールド/パラメータがポインタである場合、属性のプレゼンスは、そのポインタを通じたインデックス動作を検査しなければならないというコントラクトを搬送する。社会的観点から、バックオフを適合した方が逆のやり方よりも簡単であることに留意されたい。パラメータ、フィールド、またはインデックスある整数型によって構成されなければならないとして機能する返り値で示すことができる属性。[Rangebegin,end]、ここでのbeginおよびendは、整数リテラル、またはstringで符号化される識別子のいずれであってもよく、そして通常の予測では、beginは、ゼロのリテラル定数になる。この属性が、仮パラメータで表示される時、仮パラメータは、コーラが実パラメータを範囲検査/解除しなければならないことを示す。この属性が、フィールドで表示される時、フィールドは、右側の割り当てまたは初期化が範囲検査または同等に解除されなければならないことを示す。この属性が、メソッドで表示される時、メソッドは、そのメソッドが値を返す前に検査/解除しなければならないという返り値の用件を示す。マングリングおよびラッピングを通じたバブルバージョンに関して、それが望ましいと証明されれば、関与しないコーラと互換するようにダウンロードすることが可能である。範囲をより精密に保存できる。[RangeinclusiveBase,ExclusiveBound]排他境界の損得に関して、ある不利点は、intsでの符号化例MAXINTが不可能なことである。代替[RangeinclusiveBase,InclusiveBound]は、ユースケース形式:[Range0,bound|dent-1]にほとんど変換しないであろう。それによって、動作がぎこちなく見え、属性の表現に問題が生じる。その問題は、表現可能な最大値を範囲に含めなければならない場合に、異なる属性を使用することによって直接解決することができる。[AtLeastlowerBound]or[GreaterThanOrEqualTolowerBound]どのC型もその型の結果として範囲境界を元来有するという事実に基づいて、下位のパラメータを解放して、上位境界を暗示的に指定する。BoundedByおよびRange属性を分離することができる。属性は、所与のパラメータの位置においてint関数またはstring関数をとるように指定されてよい。ある属性は、その属性が同じ位置で異なる型をとることができるように、複数のコンストラクタをカスタム属性用に書き込むか、またはこれを名前付きパラメータで行うことができる。これで排除の考察を終了する。結論特定の実施形態を、本明細書では、処理として、構成媒体として、またはシステムとして明確に説明しているが、ある種類の実施形態の考察はまた、概して別の種類の実施形態にまで及ぶことが認識されよう。例えば、図3と関連した処理の説明も、構成媒体を説明するのに役立ち、そして他の図面と関連して論じたようなシステムおよび製品の動作を説明するのにも役立つ。それは、一実施形態の制限を、必然的に別の実施形態を制限する意味に解釈するということではない。特に、処理は、システムまたは構成メモリなどの製品を論じている間に提示されたデータ構造および配置に必ずしも限定されるというわけではない。図面に示したすべての項目が、どの実施形態にも存在するというわけではない。反対に、1つの実施形態は、図面に明確に示した項目複数を包含してよい。いくつかの可能性を、ここでは特定の例による文章および図で説明しているが、実施形態は、そのような例から逸脱してもよい。例えば、1つの例の特定の機能は、省略され、名前を変えられ、異なってグループ化され、繰り返され、ハードウェアおよび/またはソフトウェアに異なってインスタンス生成され、または例のうちの2または3以上に示される機能の組み合わせにされてもよい。いくつかの実施形態において、ある場所で示した機能性は、異なる場所で提供されてもよい。参照は、参照番号によって図全体で行われている。所与の参照番号と関連する言い回しにおいて、図面においてまたは文章においての明白な矛盾のいずれも、その番号によって参照された内容の範囲を単に広げたものとして理解されたい。本明細書では、1つのまたはそのなどの用語は、示された項目またはステップのうちの1または複数を包括する。特に、特許請求の範囲において、項目への言及は、概してそのような項目の少なくとも1つが存在することを意味し、そしてステップへの言及は、そのステップのうちの少なくとも1つのインスタンスが実行されることを意味する。見出しは、唯一便宜上のものである。所与の論説についての案内は、見出しがその論説を示す節の外側に見られる。出願されるすべての特許請求の範囲は、この明細書部分である。模範的な実施形態を上記に図示して説明しているが、多くの変更は、本発明の原理および特許請求の範囲に記載した概念から逸脱せずに行うことが可能であり、そしてそのような変更は、すべての抽象的概念を網羅する必要がないことが当業者には明らかであろう。本発明の主題は、構造的特徴および/または手順の動作に特有の用語で説明されているが、添付の特許請求の範囲で定義された本発明の主題は、特許請求の範囲の上記で説明された特定の特徴または動作に必ずしも限定されるわけではないことを理解されたい。所与の定義または例で特定されたすべての手段または態様が、必ずしもすべの実施形態において提示されまたは利用される必要があるわけではない。むしろ、説明した特定の特徴または動作は、特許請求の範囲を実装する場合に考慮される例として開示される。すべての抽象的考えを網羅する範囲内であるが、特許請求の範囲の等価の意味および範囲内であるすべての変更は、法律の及ぶ限りそれらの範囲内に包含されるものとする。"