Ad bağlama - Name binding
Olarak programlama dilleri , adı bağlayıcı ile işletmeler (veriler ve / veya kod) ilişki olduğunu tanımlayıcılar . Bir nesneye bağlı bir tanımlayıcının o nesneye başvurduğu söylenir . Makine dillerinde yerleşik bir tanımlayıcı kavramı yoktur, ancak bir hizmet olarak ad-nesne bağlamaları ve programcı için gösterim, programlama dilleri tarafından uygulanır. Bağlama, kapsam belirleme ile yakından bağlantılıdır , çünkü kapsam , hangi adların hangi nesnelere bağlanacağını belirler - program kodunda hangi konumlarda ( sözlük olarak ) ve olası yürütme yollarından birinde ( geçici olarak ).
id
Bir bağlama oluşturan bir bağlamda bir tanımlayıcının kullanımına id
bağlama (veya tanımlayıcı) oluşum denir. Diğer tüm durumlarda (örneğin, ifadelerde, atamalarda ve alt program çağrılarında), bir tanımlayıcı, bağlı olduğu şeyi temsil eder; bu tür olaylara uygulamalı olaylar denir.
bağlama süresi
- Statik bağlama (veya erken bağlama ), program çalıştırılmadan önce gerçekleştirilen ad bağlamadır.
- Dinamik bağlama (veya geç bağlama veya sanal bağlama ), program çalışırken gerçekleştirilen ad bağlamadır.
Statik bağlamaya bir örnek, doğrudan bir C işlev çağrısıdır: tanımlayıcı tarafından başvurulan işlev, çalışma zamanında değişemez.
Ancak dinamik bağlamanın bir örneği, bir C++ sanal yöntem çağrısında olduğu gibi dinamik göndermedir . Çalışma zamanından önce (genel olarak) bir polimorfik nesnenin belirli türü bilinmediğinden, yürütülen işlev dinamik olarak bağlıdır. Örneğin, aşağıdaki Java kodunu alın:
public void foo(java.util.List<String> list) {
list.add("bar");
}
List
bir interface , bu nedenle onun list
bir alt tipine atıfta bulunmalıdır . Bir bir referans mı LinkedList
bir, ArrayList
veya başka bir alt tipi arasında List
? tarafından başvurulan gerçek yöntem add
, çalışma zamanına kadar bilinmemektedir. C'de, böyle bir dinamik bağlama örneği, bir değişken tarafından işaret edilen bir işleve yapılan bir çağrı veya çalışma zamanında gerçekten değerlendirilene kadar değeri bilinmeyen bir işlev işaretçisi türünün ifadesi olabilir .
Yeniden bağlama ve mutasyon
Yeniden bağlama, mutasyonla karıştırılmamalıdır.
- Yeniden bağlama , referans tanımlayıcıda yapılan bir değişikliktir .
- Mutasyon , başvurulan varlıkta bir değişikliktir .
Aşağıdaki Java kodunu göz önünde bulundurun :
LinkedList<String> list;
list = new LinkedList<String>();
list.add("foo");
list = null;
Tanımlayıcı list
başlangıçta hiçbir şeye atıfta bulunmaz ( başlatılmamış ); daha sonra bir nesneye (bağlı bir diziler listesi) başvurmak üzere geri döner. Tarafından başvurulan bağlantılı liste list
daha sonra mutasyona uğratılarak listeye bir dize eklenir. Son olarak, ' list
a geri tepiyor null
.
Geç statik
Geç statik bağlama, statik ve dinamik bağlama arasında bir yerde bağlamanın bir çeşididir. Aşağıdaki PHP örneğini düşünün :
class A
{
public static $word = "hello";
public static function hello() { print self::$word; }
}
class B extends A
{
public static $word = "bye";
}
B::hello();
Bu örnekte, PHP yorumlayıcısı self
içindeki anahtar kelimeyi A::hello()
sınıfa bağlar A
ve böylece çağrı B::hello()
"merhaba" dizesini üretir. Anlamı self::$word
geç statik bağlamaya dayalı olsaydı, sonuç "güle güle" olurdu.
PHP sürüm 5.3'ten başlayarak, geç statik bağlama desteklenir. Spesifik olarak, self::$word
yukarıdakiler static::$word
, anahtar kelimenin static
yalnızca çalışma zamanında bağlanacağı aşağıdaki blokta gösterildiği gibi değiştirilirse , çağrının sonucu B::hello()
"güle güle" olur:
class A
{
public static $word = "hello";
public static function hello() { print static::$word; }
}
class B extends A
{
public static $word = "bye";
}
B::hello();
Ayrıca bakınız
- Geç bağlama
- Dal tablosu veya işlev işaretçileri aracılığıyla ad bağlama uygulamak için dal tablosu yöntemi
- Dinamik gönderme
- Daha yüksek dereceli soyut sözdizimi (HOAS)