プログラミング言語において、名前のバインディングとは、エンティティ(データやコード)と識別子との関連付けです。[1]オブジェクトにバインドされた識別子は、そのオブジェクトを参照すると言われます。機械語には識別子の概念が組み込まれていませんが、プログラミング言語では、プログラマ向けのサービスおよび表記法として、名前とオブジェクトのバインディングが実装されています。バインディングはスコープと密接に関係しており、スコープによって、どの名前がどのオブジェクトにバインドされるか(プログラムコードのどの場所(語彙的)と、可能な実行パスのどれか(時間的))が決まります。
idのバインディングを確立するコンテキストで識別子id を使用することは、バインディング (または定義) 発生と呼ばれます。その他のすべての発生 (式、割り当て、サブプログラム呼び出しなど) では、識別子はそれがバインドされているものを表します。このような発生は適用発生と呼ばれます。
拘束時間
- 静的バインディング(または早期バインディング)は、プログラムが実行される前に実行される名前バインディングです。[2]
- 動的バインディング(または遅延バインディング、仮想バインディング)は、プログラムの実行中に実行される名前バインディングです。[2]
静的バインディングの例としては、直接的なC関数呼び出しがあります。識別子によって参照される関数は実行時に変更できません。
動的バインディングの例としては、 C++仮想メソッド呼び出しのような動的ディスパッチがあります。ポリモーフィックオブジェクトの特定の型は実行時までは不明であるため (一般に)、実行される関数は動的にバインドされます。たとえば、次のJavaコードを見てみましょう。
public void foo ( java.util.List <String> list ) { list.add ( " bar " ) ; }
Listはインターフェースなので、そのサブタイプlistを参照する必要があります。は、 、またはのその他のサブタイプを参照できます。 が参照するメソッドは、実行時までわかりません。 動的バインディングを持たない C では、同様の目的が、関数ポインター型の変数または式によって指される関数の呼び出しによって達成される場合があります。その値は、実行時に評価されるまでわかりません。
listLinkedListArrayListListadd
再結合と突然変異
再バインドは、変更や割り当てと混同しないでください。
- 再バインドは参照識別子の変更です。
- 代入は(参照先の)変数への変更です。
- ミューテーションとは、変数によって参照されるか、識別子にバインドされる可能性のある、メモリ内のオブジェクトに対する変更です。
次のJavaコードを検討してください。
LinkedList < String > list ; list = new LinkedList < String > (); list . add ( "foo" ); list = null ; { LinkedList < Integer > list = new LinkedList < Integer > (); list . add ( Integer ( 2 )); }
最初の行では、識別子がlist変数にバインドされています。2 行目では、オブジェクト (文字列のリンク リスト) が変数に割り当てられています。次に、変数によって参照されるリンク リストが変更され、リストに文字列が追加されます。次に、変数に定数が割り当てられますnull。最後の行では、識別子がブロックのスコープに再バインドされています。ブロック内の操作では、以前に にバインドされた変数ではなく、新しい変数にアクセスしますlist。
遅れての静電気
遅延静的バインディングは、静的バインディングと動的バインディングの中間に位置するバインディングの一種です。次のPHP の例を考えてみましょう。
クラス A
{
public static $word = "hello" ;
public static function hello () { print self :: $word ; }
}
クラス B は Aを拡張します { public static $word = "bye" ; }
B ::こんにちは();
この例では、PHP インタープリタは、self内のキーワードをA::hello()クラス にバインドしA、 の呼び出しによってB::hello()文字列 "hello" が生成されます。 のセマンティクスがself::$word遅延静的バインディングに基づいていた場合、結果は "bye" になります。
PHP バージョン 5.3 以降では、遅延静的バインディングがサポートされています。[3] 具体的には、self::$word上記のを次のブロックに示すように変更しstatic::$word、キーワードがstatic実行時にのみバインドされるようにすると、の呼び出しの結果はB::hello()"bye" になります。
クラス A
{
public static $word = "hello" ;
public static function hello () { print static :: $word ; }
}
クラス B は Aを拡張します { public static $word = "bye" ; }
B ::こんにちは();
参照
参考文献
- ^ Microsoft (2007 年 5 月 11 日)、「オートメーションにおける早期バインディングと遅延バインディングの使用」、Microsoft 、 2009 年5 月 11 日取得
- ^ ab システムおよびソフトウェアエンジニアリング — 語彙 ISO/IEC/IEEE 24765:2010(E)、IEEE、2010 年 12 月 15 日
- ^ 「Late Static Bindings」 。2013年7 月 3 日閲覧。
