OOP “nesneleri” ve “sınıfları” hafızada montaj dili açısından nasıl düzenlenir?


13

Bellekte nesneler nasıl düzenlenir?

Örneğin, bir fonksiyonun bellekte bir kod parçası olduğunu biliyorum, bu parametreler yığını ve / veya kayıtları ve kendi yığın çerçevesini işleyen bekler.

Ancak nesneler çok daha karmaşık bir yapıdır. Nasıl organize olmuşlar? Her nesnenin yöntemlere "bağlantıları" var mı ve adresi kendisine bu yönteme iletiyor mu?

Bu konunun iyi bir açıklamasını görmek harika olurdu.

UPD. Soruyu daha kesin hale getirdim ve esas olarak statik olarak yazım dilleriyle ilgileniyorum.


4
Farklı diller arasında, özellikle dinamik olarak yazılan ve statik olarak yazılan diller arasında çılgınca değişebilir. Sorunuzu en çok ilgilendiğiniz OO dillerine daraltabilir misiniz?
Bart van Ingen Schenau

Soruyu güncelledim, bu yüzden dinamik olarak yazılan dillerin anlaşılması daha zor olduğunu düşünüyorum.
Nikolai Golub

Yanıtlar:


17

Dinamik bir gönderme (polimorfizm) yoksa, "yöntemler" sadece şekerli işlevlerdir, belki de örtük bir ek parametreyle birlikte. Buna göre, polimorfik davranışı olmayan sınıfların örnekleri esasen structkod üretimi amacıyla Cs'dir.

Statik tip bir sistemde klasik dinamik dağıtım için temel olarak bir baskın strateji vardır: vtables. Her örnek türüne (sınırlı bir temsili), en önemlisi vtable'a başvuran bir ek işaretçi alır : Her yöntem için bir tane olmak üzere bir işlev işaretçisi dizisi. Her tür (miras zincirinde) için tam yöntem kümesi derleme zamanında bilindiği için, yöntemlere ardışık indeksler (N yöntemleri için 0..N) atanabilir ve içindeki işlev işaretçisini arayarak yöntemleri çağırabilir. bu dizini kullanan vtable (yine örnek başvurusunu ek parametre olarak iletir).

Daha dinamik sınıf tabanlı diller için, genellikle sınıfların kendileri birinci sınıf nesnelerdir ve her nesnenin kendi sınıf nesnesine bir başvurusu vardır. Sınıf nesnesi, sırayla, yöntemlere dile bağlı bir şekilde sahiptir (Ruby'de, yöntemler nesne modelinin temel bir parçasıdır, Python'da sadece etraflarında küçük paketlere sahip işlev nesneleri). Sınıflar tipik olarak üst sınıf (lar) ına referansları da saklar ve miras alınan metotların araştırılmasını metot ekleyen ve değiştiren meta programlamaya yardımcı olmak için bu sınıflara devreder.

Sınıflara dayanmayan birçok sistem var, ancak önemli ölçüde farklılar, bu yüzden sadece ilginç bir tasarım alternatifi seçeceğim: Programın herhangi bir yerinde tüm türlere yeni (set) yöntemler ekleyebildiğinizde ( örneğin Haskell'deki sınıflar ve Rust'taki özellikler), derleme sırasında yöntemlerin tamamı bilinmemektedir. Bu sorunu çözmek için, özellik başına bir vtable oluşturur ve özellik uygulaması gerektiğinde bunları iletir . Yani, kod şöyle:

void needs_a_trait(SomeTrait &x) { x.method2(1); }
ConcreteType x = ...;
needs_a_trait(x);

şu şekilde derlenir:

functionpointer SomeTrait_ConcreteType_vtable[] = { &method1, &method2, ... };
void needs_a_trait(void *x, functionpointer vtable[]) { vtable[1](x, 1); }
ConcreteType x = ...;
needs_a_trait(x, SomeTrait_ConcreteType_vtable);

Bu ayrıca, vtable bilgilerinin nesneye gömülmediği anlamına gelir. Örneğin, birçok farklı tür içeren veri yapılarında saklandığında doğru davranacak bir "özelliğin örneğine" başvurmak istiyorsanız, bir yağ işaretçisi oluşturulabilir (instance_pointer, trait_vtable) . Bu aslında yukarıdaki stratejinin genelleştirilmesidir.


5

Bu, atasözü anlamında bir cevaptır, eğer bir erkeğe bir gün boyunca beslediğiniz bir balık verirseniz, ona balık tutmayı öğretirseniz, onu ömür boyu beslersiniz ”sorusu çok geniştir

1. açık bilgi kaynaklarını araştırır

"Montaj nesnesine yönelik programlama" için Google, hemen hemen birçok farklı alakalı kaynağı listeler.

Örneğin Mecliste Nesneye Yönelik Programlama, Ethan J. Eldridge, 15 Aralık 2011 3. bağlantı olarak geldi ve iyi görünüyor

2. el ile yazılmış mevcut kodlardan öğrenir

OOP'nin açıkça beyan edildiği bazı popüler montaj dillerinde yazılmış kaynak kodlarını inceleyerek nasıl çalıştığını görebilirsiniz.

3. derleyiciler tarafından üretilen kod kalıplarından öğrenir

Seçtiğiniz OOP derleyicileri tarafından üretilen ara montaj dili dosyalarını inceleyerek nasıl çalıştığını görebilirsiniz. Hem C ++ hem de FreePascal derleyicileri, üst düzey OOP kodunun derleme dil koduna nasıl kopyalandığını görebileceğiniz şekilde yapılandırılabilir

4. sağduyu ile bulmaca çözmek

Diğer cevaplardan ipuçlarını zaten bildiğiniz için şimdi çok geç. Ama internette arama yapmadan önce ve zor yoldan öğrenen gönüllülerden ücretsiz olarak birkaç saat içinde herhangi bir çaba harcamadan cevabınızı alabileceğiniz siteler bulunmadan önce, herkese ücretsiz olarak kullanılabilen tek çalışma yöntemi

Kendinize şu soruyu sorun: "nasıl uygularım?"

Çoğu zaman aklınızda geçen arka plan düşünme sürecinden birkaç gün sonra ve birkaç kağıt taslak tasarımını attıktan sonra, ortaya çıkardığınız çözümün diğer programcıların ortaya çıkardığı ve zaten uyguladıkları çözüme çok benzediğini fark edersiniz.


Şimdi benim cevap düşüncem dayanıyor, OP'nin sorusuna doğrudan cevap vermiyor ve üst düzey üst düzey kullanıcılar serbestçe beni aşağı çekebilir

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.