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 ).

idBir bağlama oluşturan bir bağlamda bir tanımlayıcının kullanımına idbağ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");
}

Listbir interface , bu nedenle onun listbir alt tipine atıfta bulunmalıdır . Bir bir referans mı LinkedListbir, ArrayListveya 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ı listbaş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 listdaha sonra mutasyona uğratılarak listeye bir dize eklenir. Son olarak, ' lista 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ı selfiçindeki anahtar kelimeyi A::hello()sınıfa bağlar Ave böylece çağrı B::hello()"merhaba" dizesini üretir. Anlamı self::$wordgeç 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::$wordyukarıdakiler static::$word, anahtar kelimenin staticyalnı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

Referanslar