Erken ve geç bağlanma nedir?


77

Erken ve geç bağlanma hakkında duymaya devam ediyorum ama ne olduklarını anlamıyorum. Anlamadığım şu açıklamayı buldum:

Erken bağlama, tasarım süresi boyunca değişkenlere değer atanması anlamına gelirken geç bağlama, çalışma süresi boyunca değişkenlere değer atanması anlamına gelir.

Birisi iki bağlayıcı türünü tanımlayıp karşılaştırabilir mi?


1
çalışma zamanı vs zaman derleme.
barlop

Yanıtlar:


84

Karışıklıkta iki ana kavram vardır: bağlama ve yükleme. Ortada bir yerde olan ve her ikisini de yapan DataBinding kavramı ile karıştırılmaktadır. Bunu düşündükten sonra, trifecta'yı tamamlamak, dağıtmak için bir tane daha konsept ekleyeceğim.

Türleri

Geç Bağlanma : Değişken çalışma süresi boyunca kullanılıncaya kadar tip bilinmiyor ; genellikle atama yoluyla ancak bir türü zorlamanın başka yolları vardır; dinamik olarak yazılmış diller buna temel özellik olarak adlandırılır, ancak statik olarak yazılmış birçok dilde geç bağlama için bazı yöntemler vardır.

[Özel] dinamik türler, iç gözlem / yansıtma, bayraklar ve derleyici seçenekleri veya dinamik gönderimi ödünç alarak veya genişleterek sanal yöntemler kullanarak sık sık uygulanır

Erken Bağlanma : Değişken çalışma süresi boyunca, genellikle statik, bildirimsel araçlar yoluyla kullanılmadan önce tür bilinmektedir.

Genellikle standart ilkel türler kullanılarak uygulanır

Fonksiyonlar

Statik Sevkiyat : derleme zamanında bilinen, belirli bir fonksiyon veya alt yordam; belirsizdir ve imza ile eşleştirilir

Statik fonksiyonlar olarak uygulanır; hiçbir yöntem aynı imzayı alamaz

Dinamik Sevk : derleme zamanında belirli bir işlev veya alt yordam değil ; yürütme sırasında bağlam tarafından belirlenir. Uygun fonksiyon uygulamasını seçmek için hangi bağlamsal bilgilerin kullanıldığının ayırt edilmesiyle “dinamik gönderme” için iki farklı yaklaşım vardır.

İçinde tek [ dinamik ] sevk , örneğin tek tip uygun işlevi uygulama belirlemek için kullanılır. Statik olarak yazılmış dillerde, pratikte bunun anlamı, değişken tipi bildirildiğinde / atandığında belirtilen referans tipine bakılmaksızın, örnek tipinin hangi yöntem uygulamasının kullanıldığına karar vermesidir. Uygun bir uygulamayı elde etmek için yalnızca tek bir tür - nesne örneğinin türü - kullanıldığı için, bu yaklaşıma "tek gönderme" denir.

Ayrıca, giriş parametre türlerinin de hangi fonksiyon uygulamasının çağrılacağını belirlemeye yardımcı olduğu çoklu [ dinamik ] gönderim vardır . Çok tip için - örneğin type hem ve parametre (ler) in bir tip (ler) - etkisi seçildiği yöntem uygulaması, bu yaklaşım "çoklu gönderim" olarak adlandırılan bir.

Sanal veya soyut fonksiyonlar olarak uygulanır; diğer ipuçları, geçersiz kılınmış, gizli veya gölgeli yöntemleri içerir.

Not: Metod aşırı yüklenmesinin dinamik gönderimi içerip içermediği, dile özgüdür. Örneğin, Java'da aşırı yüklenmiş yöntemler statik olarak gönderilir.

Değerler

Tembel Yükleme : ihtiyaç duyulana kadar değer tahsisini savunan nesne başlatma stratejisi ; bir nesnenin esasen geçerli ancak bilerek eksik bir durumda olmasına ve verilerin yüklenmeden önce gerekli olana kadar beklemesine izin verir; genellikle büyük veri kümelerini yüklemek veya harici kaynakları beklemek için özellikle yararlı bulundu

Yapıcı veya başlatma çağrıları sırasında bir derleme veya listenin bir kompozit nesneye yüklenmemesi veya uygulama çağrıları sırasında aşağı doğru bir arayan kişi bu koleksiyonun içeriğini görmeyi isteyinceye kadar (ör. Get_value_at, get_all_as, vb.) Sık sık uygulanır. Varyasyonlar, koleksiyonla ilgili meta bilgileri (boyut veya anahtarlar gibi) yüklemeyi, ancak gerçek verileri atlamayı içerir; ayrıca, geliştiricilere oldukça güvenli ve verimli bir tekil uygulama programı sağlamak için bazı çalışma sürelerine bir mekanizma sağlar

İstekli Yükleme : Geçerli bir durumda olduğunu düşünmeden önce gerekli olan tüm verilerin eksiksiz olması için hemen tüm değer atamalarını gerçekleştiren nesne başlatma stratejisi .

Yapıcı çağrısı veya başlatma sırasındaki gibi, en kısa sürede bilinen tüm verileri içeren bir bileşik nesneler sağlayarak uygulanır

Veri Bağlama : genellikle iki uyumlu bilgi akışı arasında aktif bir bağlantı veya harita oluşturmayı içerir, böylece birindeki değişiklikler diğerine geri yansır ve bunun tersi de geçerlidir; Uyumlu olmaları için genellikle ortak bir temel tipe veya arayüze sahip olmaları gerekir.

Genellikle farklı uygulama yönleri arasında (örneğin, görüntülemek için görünüm modeli, denetleyiciye model, vb.) Daha temiz ve tutarlı bir senkronizasyon sağlama girişimi olarak uygulanmış ve kaynak ve hedef, uç noktalar, bağlama / ayırma, güncelleme ve benzeri olaylar hakkında konuşur on_bind, on_property_change, on_explicit, on_out_of_scope


DÜZENLEME NOT: Bunların sıkça meydana geldiğine dair örneklerin açıklamasını sağlamak için son ana düzenleme. Özel kod örnekleri tamamen uygulamaya / çalışma zamanına / platforma bağlıdır.


2
Bu cevap nesne yönelimli dillere çok özel görünüyor.
Jack,

27

Derleme yapılırken derleyici tarafından karar verilenlere EARLY / COMPILE TIME Binding denilebilir ve RUNTIME'da karar verilmesi gerekenlere LATE / RUNTIME bağlaması denir .

Örneğin,

Metod Aşırı Yükleme ve Metot Geçersiz Kılma .

1) Yöntem Aşırı Yüklemede yönteminize çağrılar yöntemlere derleyici tarafından derlenecek zamanda hangi işlevin çağrılacağı anlamında derleyici tarafından karar verilir. Bu nedenle erken bağlama .

2) Geçersiz kılma yönteminde, RUNTIME seçeneğine hangi yöntemin çağrılacağına karar verilir. Bu yüzden LATE BINDING olarak tekrarlanır .

Basit ve kolay elde tutmaya çalıştım. Bu yardımcı olur umarım.


9

Geç bağlama, davranışın çalışma zamanında değerlendirildiği zamandır. Gerçekten sadece program çalışırken sahip olduğunuz bilgilere dayanarak nasıl davranacağınızı belirlemek istediğinizde gereklidir. Bence en net örnek sanal fonksiyon mekanizması, özellikle C ++ 'da.

class A
{
public:
    void f() {}
    virtual void g() {}
};

class B : public A
{
    void f() {}
    virtual void g() {}
};

int main()
{
    A* a = new B;
    a->f();
    a->g();
}

Bu örnekte, a->f()gerçekte arayacak void A::f(), çünkü erken (veya statik olarak) bağlanmış ve çalışma zamanında programın bir tür değişkenine sadece bir işaretçi olduğunu düşündüğünü düşünüyorA , oysa derleyici, görmek için sanal kod a->g()içerecek. çalışma zamanında çağrılacak doğru işlevin adresini bulun.void B::g()g()


1
"Çalışma zamanı"? C ++ hakkında konuşuyorsun. C ++ doğrudan makine koduna derlenir, sanal yöntemleri çözmek için çalışma zamanına gerek yoktur.
tdammers

3
@tdammers C ++ aslında sanal çağrılar için olmasa da çalışma zamanı kitaplığına ihtiyaç duyar. Eğer dikkatli okursanız, bu cevap derleyici diyor fark edeceksiniz "Doğru fonksiyonu [...] adresine bakmak için kod enjekte de çalışma zamanı".

Eh, ama bu "doğru fonksiyonun adresini aramak için kod" temelde sadece bir fonksiyon çağrısının takip ettiği tip-agnostik iki aşamalı bir işaretçi referansıdır. Dahil olan bir "düşünme" yoktur; Güvenilir bir şekilde çalışmasının tek nedeni, derleyicinin derleme zamanında denetleme türü yapmasıdır ; Çalışma zamanında, oluşturulan kod, derleyiciye tip kontrol ödevini yapması için güvenir. Eğer güvensiz yayınları (örneğin C tarzı işaretçi atmalarını) kullanıyorsanız, olabilir yasal olarak yanlış sınıfın nesnesi olarak C ++ nesneleri tedavi ama onların vtables tamamen berbat olacak ve kod sadece kırar.
tdammers

@tdammers Bu tür cevaplardan uzak durmaya çalıştım, çünkü bu bazı ezoterik derleyiciler için geçerli olabilecek ya da olmayabilir derleyicilerin bir uygulama detayı. Önemli olan kavramdır.
Yam Marcovic

1
@tdammers Ve "çalışma zamanı" derken "çalışma zamanı program" ı kastediyorum. Açıkçası C ++ yönetilmez. Ama bana kargaşaya neden olabileceğini gösterdiğinden beri, tüm ifadeleri değiştiriyorum.
Yam Marcovic

5

İşlev işaretçilerine aşina iseniz bu bir örnek olacaktır. Tanımlanan fonksiyonların Erken bağlanma olduğu söylenebilir. Eğer Function kullanırsanız geç Bağlamalarını gösterir.

  int add(int x,int y)
  {
    return x+y;
  }
  int sub(int x,int y)
  {
      return x-y;
  }


    int main()
    {
     //get user choice
     int(*fp)(int,int);
     //if add
      fp=add;
     //else if sub
     fp=sub;
     cout<<fp(2,2);
    }

burada fonksiyonlar add ve sub fonksiyonlardır (adresi derleme zamanlayıcısında bağlanmıştır)

ancak işlev işaretçisi geç bağlanırsa, fp kullanıcı isteğine bağlı olarak [çalışma zamanında] ya bağlı ya da alt olarak çağırabilir.


3

Erken ve geç bağlanma sadece türler bağlamında anlam ifade eder, onu tarif ettiğiniz şekilde değil. Neredeyse tüm modern diller, tüm değerlerin sabit tiplere sahip olduğu anlamında yazılmıştır. Dinamik ve statik olarak yazılmış dillere baktığımızda fark gelir. Dinamik olarak yazılan dillerde değişkenler tiplere sahip değildir, bu yüzden herhangi bir tipin değerlerine başvurabilirler ve bu, bazı değişkenler tarafından belirtilen bir nesne üzerinde bir yöntem çağırdığınızda, bu çağrının geçerli olup olmadığını belirlemenin tek yolu anlamına gelir. Nesne için sınıfa bakın ve bu yöntemin gerçekten var olup olmadığını görün. Bu, çalışma zamanında sınıflara yeni yöntemler eklemek gibi bazı serin şeylere izin verir, çünkü gerçek yöntem araması son ana kadar ertelenir. Çoğu insan bu durumlara geç bağlanma diyor.

Statik olarak yazılmış bir dilde değişkenlerin türleri vardır ve bildirildikten sonra aynı türde olmayan herhangi bir değere atıfta bulunamazlar. Bu kesinlikle doğru değil ama şimdilik bunu varsayalım. Şimdi, değişkenin yalnızca belirli bir türün değerlerine atıfta bulunacağını biliyorsanız, kod çalıştırılmadan önce geçerliliğini belirleyebildiğinizden, bir çalışma çağrısının çalışma zamanında geçerli olup olmadığını anlamak için bir neden yoktur. Buna erken bağlama denir.

Yakutta geç bağlanmayı gösteren bir örnek:

a = 1 # a is an integer at this point
a.succ # asking for its successor is valid

class A
  def method_a
    # some code
  end
end

a = A.new
a.method_a # this is also valid
a.succ # this is not valid


class A # we can re-open the class and add a method
  def succ
    # some more code
  end
end
a.succ # now this is valid

Yukarıdaki işlemler dizisi Java gibi bir dilde tüm türlerin çalışma zamanında sabitlendiği için mümkün değildir.


1

Size akademik bir tanım vermek yerine VBA kullanarak gerçek bir dünya örneği kullanarak size bazı farklılıkları göstermeye çalışacağım:

Erken bağlama:

Dim x As FileSystemObject
Set x = New FileSystemObject
Debug.Print x.GetSpecialFolder(0)

Bu, tasarım zamanında "Microsoft Komut Dosyası Çalıştırma Zamanı" bileşenine ayarlanacak bir referans gerektirir . Bir yazım hatası olduğunda FileSystemObjectveya derleme adlarında bir derleme zamanında zaten bir hata mesajı alma avantajınız vardır GetSpecialFolder.

Geç bağlama

Dim x As Object
Set x = CreateObject("Scripting.FileSystemObject")
Debug.Print x.GetSpecialFolder(0)

Bu, önceden ayarlanmış bir referans gerektirmez, örnek oluşturma ve tür belirleme sadece çalışma zamanında gerçekleşir. Derleyici olmayan bir yöntem çağırmaya çalıştığınızda derleyici şikayet edemez x, bu yalnızca belirli bir satır yürütüldüğünde çalışma zamanı hatasına neden olur.

Bu nedenle, geç bağlamanın dezavantajı, burada güçlü bir kontrol yapmamanızdır. Ancak bu aynı zamanda avantajdır - diyelim ki birkaç versiyonun bulunduğu bir bileşeniniz var ve her yeni sürüm bazı ek işlevler sunuyor. (Gerçek dünyaya örnek, MS COM bileşenleridir, Excel COM arayüzü gibi) Geç bağlama, bu sürümlerin tümü ile birlikte çalışan bir kod yazmanıza olanak tanır - önce belirli bileşen sürümünü belirleyebilirsiniz, ve yalnızca eski bir sürüm mevcutsa, o sürümle çalışmayan işlev çağrıları yapmaktan kaçının.


-2

Belki de en sık karşılaşılan geç bağlanma örneği İnternet URL'lerini çözmektir. Herhangi bir yere ulaşmadan önce, dünyadaki her siteyi birbirine bağlayıp bağlamaya çalışmadan dinamik sistemleri ve büyük sistemleri destekler, ancak diğer yandan çalışma zamanında bir miktar ek yük (DNS araması, daha az IP yönlendirmesi) gerektirir.

Bu ışıkla, dil ortamlarındaki bağlayıcı çeşitlerinin çoğu, derleme zamanında veya bağlantı zamanında, az çok erkendir.

Her türün faydaları ve faydaları vardır.


Bu ciltleme tanımı için başvuruda bulunabilir misiniz? İnternet adreslerinin "bağlayıcı" olarak çözülmediğini duymadım, her ne kadar ciltleme isimleri çözme eylemi olsa da, birilerinin erken / geç ciltleme kavramının URI'yi internet adreslerine çözümlemek için uygulanabileceğini savundum. Ancak bu yaygın bir yorum değildir ve erken / geç bağlama kavramı, bilgisayarların internete yaygın olarak bağlanma zamanını önceden gösterir.
Jay Elston,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.