Programlamada kullanıldığını gördüm (özellikle C ++ alanında) ve ne olduğu hakkında hiçbir fikrim yok. Muhtemelen bir tasarım deseni, ama yanılıyor olabilirim. Herhangi biri iyi bir thunk örneği verebilir mi?
Programlamada kullanıldığını gördüm (özellikle C ++ alanında) ve ne olduğu hakkında hiçbir fikrim yok. Muhtemelen bir tasarım deseni, ama yanılıyor olabilirim. Herhangi biri iyi bir thunk örneği verebilir mi?
Yanıtlar:
A thunk
genellikle işlev olarak adlandırılan küçük bir kod parçasına atıfta bulunur, küçük bir şey yapar ve ardından JUMP
arayana dönmek yerine başka bir konuma (genellikle bir işlev) gider. JUMP hedefinin normal bir işlev olduğunu varsayarsak, geri döndüğünde, thunk'ı arayan kişiye geri dönecektir.
Thunks, birçok yararlı şeyi verimli bir şekilde uygulamak için kullanılabilir
protokol çevirisi - farklı bir arama kuralı kullanan koda bir arama kuralı kullanan koddan arama yapılırken thunk
, bağımsız değişkenleri uygun şekilde çevirmek için a kullanılabilir. Bu yalnızca dönüş kuralları uyumluysa işe yarar, ancak bu genellikle böyledir
sanal işlev işleme - C ++ 'da çoğaltılmış miras alınan bir temel sınıfın sanal bir işlevini çağırırken this
, doğru yere işaret etmesi için işaretçinin düzeltilmesi gerekir. A thunk
bunu yapabilir.
dinamik kapanışlar - dinamik bir kapanış oluşturduğunuzda, kapatma işlevinin oluşturulduğu bağlama erişebilmesi gerekir. thunk
Bazı kayıt (lar) da bağlam bilgisini ayarlayan ve ardından kapanış işlevini uygulayan statik bir kod parçasına atlayan küçük bir yapı (genellikle yığın üzerinde) oluşturulabilir. Buradaki düşünce, arama sitesi tarafından sağlanmayan işleve etkili bir şekilde bir veya daha fazla gizli ekstra argüman sağlamaktır.
this
), varsayılan / kopya yapıcı kapanışları (kullanıcı tarafından sağlananların varsayılan parametrelerle daha iyi CRT entegrasyonu için, özellikle DLL dışa aktarma veya diziler oluşturma için), vcall
thunks (işaretçi üye işlevleri, sanal işlevlerle düzgün çalışır), vtordisp
thunks (sanal tabanlardan sanal işlevleri devralan ve geçersiz kılan ve ayrıca kullanıcı tarafından sağlanan ctors ve / veya dtors olan sınıflar için), yerel sarmalayıcılar (yönetilen C ++ / CLI'yi çağırmak için
UDT returning
" adlı bir şey (operatörler tarafından döndürülen kullanıcı tanımlı türleri ayarlamak için bir şey gibi görünüyor, ancak bunu nasıl oluşturacağımı bilmiyorum; kullanımdan kaldırıldığını düşünüyorum). Muhtemelen başkaları da vardır. Sanırım asla Microsoft'un thunk
hayır diyemezsin ; Descartes gurur duyardı.
Thunk kelimesinin bilgisayar biliminde en az üç ilişkili anlamı vardır. Bir "thunk" şunlar olabilir:
Genellikle üçüncü bağlamda kullanıldığını gördüm.
Thunk terimi, aslında Algol60 derleyicisinde Royal Radar Establishment tarafından pass-by-name uygulaması tarafından kullanılan mekanizmaya gönderme yapıyordu . Genel olarak, görünüşte statik bir nesneye atıfta bulunurken dinamik davranışı tetiklemenin herhangi bir yolunu ifade eder. Bu terim, adıyla açıklanması istendiğinde "Hafızadan değeri yüklemek için dışarı çıkarsınız ve sonra aniden - thunk - orada bir ifadeyi değerlendiriyorsunuz" diyen Brian Wichmann tarafından icat edildi.
Thunk'lar donanıma yerleştirildi (cf. KDF9, Burroughs mainframe'leri). Bunları yazılımda uygulamanın birkaç yolu vardır, hepsi çok makineye, dile ve derleyiciye özeldir.
Bu terim, görünürde veya nominal olarak statik bir veri referansının dinamik davranışa neden olduğu herhangi bir durumu içerecek şekilde, adla geçişin ötesinde genelleştirilmiştir. İlgili terimler "trambolin" ve "gelecek" terimlerini içerir.
C ++ gibi nesne yönelimli diller için bazı derleyiciler, çoklu veya sanal miras varlığında sanal işlev çağrılarının optimizasyonu olarak "thunks" adı verilen işlevler üretir.
Alınan: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
Kullanımda önemli farklılıklar var. Neredeyse evrensel olarak, thunk (en azından kavramsal olarak) alışılmadık derecede küçük ve basit bir işlevdir. Genellikle size bir şeye veya başka bir şeye (bazı veriler, başka bir işlev, vb.) Doğru arabirimi veren, ancak en azından başka bir şey yapmadığı görülen bir tür adaptördür.
Neredeyse bir tür sözdizimsel şeker gibidir, ancak (en azından genellikle kullanıldığı gibi) sözdizimsel şekerin şeyleri insan okuyucunun görmek istediği gibi göstermesi gerekir ve bir şey, bir şeyi derleyicinin istediği gibi göstermektir. bak.
Bu soru SO'da zaten sorulmuştu, bakınız:
Scheme'de veya genel olarak kullanıldığı şekliyle 'thunk' nedir?
Söyleyebileceğim kadarıyla, bu bir lambda ifadesine benziyor; burada, onu değerlendirmeniz gerekene kadar değeri döndürmek istemeyebilirsiniz; veya tasarım gereği bir değer döndürmek için bazı kodlar yürüten, ancak daha çok bir değişken gibi karşımıza çıkan arayüz formuna sahip olan, ancak aynı zamanda kalıtım yoluyla veya kalıtım yoluyla değiştirilebilen polimorfik davranışa sahip olan bir özellik alıcı ile de karşılaştırılabilir. derleme zamanı veya çevresel özelliklere göre çalışma zamanında bir değeri değerlendirecek ve döndürecek işlev işaretçisini değiştirerek.
Tarihsel olarak benim için bilindiği şekliyle fiili kullanımıyla eşleşen bu terimin genel bir 'bilgisayar bilimi' tanımı bulamadığım için üzüldüm. Gerçek hayattaki ilk karşılaşmanın gerçekte nerede adlandırıldığını hatırlayabiliyorum, OS / 2 günlerinde ve 16-32 bit geçişinde. Görünüşe göre "thunking" bugünkü uygulamasında ironi gibi.
Benim kaba genel anlayışım, thunk'ın, bahsedilen tarihsel durumlarda olduğu gibi, sistemler arasında ayni olarak bazı temel sınırları aşan hiçbir şey yapmayan veya yol alan bir saplama rutini olduğudur.
Yani duyu, bir ortamdan diğerine düşürülmenin (metaforik olarak / benzetme olarak) bir "thunk" sesi çıkarması gibi bir sinestezi gibidir.
Buna bakacağım, ancak thunking'in eski 16 bit kodu çalıştırmak için 32 bitlik bir işlemci tarafından kullanılan süreç olduğunu düşündüm .
Bunu, ne kadar hızlı konuştuğunuzu ve aptal insanlarla konuşurken hangi kelimeleri kullandığınızı nasıl kısıtlamanız gerektiğine dair bir benzetme olarak kullanırdım.
Evet, Wikipedia bağlantısında (32-bit ile ilgili kısım, benim nerdalogy değil ).
https://en.wikipedia.org/wiki/Thunk
Birlikte çalışabilirlik ile ilgili literatürün çoğu, MS-DOS, OS / 2, [8] Windows [9] [10] ve .NET dahil olmak üzere çeşitli Wintel platformları ve 16-bit'ten 32-bit bellek adreslemesine geçiş ile ilgilidir. . Müşteriler bir platformdan diğerine geçtikçe, thunks eski platformlar için yazılmış eski yazılımları desteklemek için çok önemli hale geldi.
(vurgu benim tarafımdan eklendi)
Bildiğim en eski "thunk" kullanımı, 50'li yılların sonlarında Algol60'ın işlev çağrılarında geçiş-adıyla bağımsız değişken değerlendirmesine atıfta bulunmaktır. Algol başlangıçta bir programlama dili değil, bir belirtim diliydi ve bir bilgisayarda geçiş adının nasıl uygulanabileceğine dair bazı sorular vardı.
Çözüm, aslında bir lambda olan şeyin giriş noktasını geçmekti. Aranan uç parametreyi değerlendirdiğinde, kontrol düştü - thunk! - Lambda'nın değerlendirildiği ve bunun sonucu, aranan uçtaki parametrenin değeri haline geldiği arayanın bağlamına.
Burroughs makineleri gibi etiketli donanımlarda değerlendirme örtüktü: bir bağımsız değişken, sıradan değerle geçişte olduğu gibi bir veri değeri olarak veya bağımsız değişken meta verilerinde farklı etiketlerle addan geçirme için thunk ile iletilebilirdi. . Bir yükleme işlemi donanımı etiketi kontrol etti ve basit değeri döndürdü veya otomatik olarak lambda thunk'ı çağırdı.
Başına Kyle Simpson tanımı, bir thunk soyut bileşenine bir yoldur zaman asenkron kod dışarı.