"Thunk" nedir?


131

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?


10
Bilginize olduğu gibi, thunk da bazen 'trambolin' olarak adlandırılır (genel durumda, belki C ++ alanında olmayabilir).
Michael Burr

@MichaelBurr, kullanılan "trambolin" terimini gördüğüm tek bağlam Detours ve bu bağlamda bir trambolin bir thunk değil.
user34660

1
Terim, belirli bir tanımı olmayan şeylerin türüdür, dolayısıyla tanımı değişir.
user34660

Yanıtlar:


132

A thunkgenellikle işlev olarak adlandırılan küçük bir kod parçasına atıfta bulunur, küçük bir şey yapar ve ardından JUMParayana 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 thunkbunu yapabilir.

  • dinamik kapanışlar - dinamik bir kapanış oluşturduğunuzda, kapatma işlevinin oluşturulduğu bağlama erişebilmesi gerekir. thunkBazı 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.


13
Bu en iyi açıklamadır, çünkü tipik kullanım durumlarında farklı şeyler uygulamak için genellikle yaptığı şey yerine düşüncenin ne olduğunu açıklar . Diğer yanıtlar, genel fikir yerine bu belirli uygulamalara çok fazla odaklanır.
SasQ

Diğer derleyicilerden emin değilim, ancak özellikle Visual Studio thunks'ı çok seviyor gibi görünüyor . Bildiğim kadarıyla, şunları kullanıyor: ayarlayıcı thunks (ayarlamak için 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), vcallthunks (işaretçi üye işlevleri, sanal işlevlerle düzgün çalışır), vtordispthunks (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
Justin Time -

yerel ISO C ++ kodundan işlevler) ve " 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 thunkhayır diyemezsin ; Descartes gurur duyardı.
Justin Time - Monica'yı eski

80

Thunk kelimesinin bilgisayar biliminde en az üç ilişkili anlamı vardır. Bir "thunk" şunlar olabilir:

  • Gecikmiş bir hesaplama yapmak için bir kod parçası (kapanışa benzer)
  • bazı sanal işlev tablosu uygulamalarının bir özelliği (sarmalayıcı işlevine benzer)
  • genellikle uyumluluk nedenleriyle, bir sisteme özgü formdan diğerine makine verilerinin eşlenmesi

Genellikle üçüncü bağlamda kullanıldığını gördüm.

http://en.wikipedia.org/wiki/Thunk


3
İlginç; Genelde ikinci biçimi duyarım, ama sanırım bu daha sık ne tür bir iş yaptığına bağlı
Michael Mrozek

Spesifik olarak, otomatik olarak çok kısa makine kodu blokları oluşturularak ilişkilidir - ilk durum bile normalde sadece önceden derlenmiş bir uygulama işlevine bağlam verir.
Simon Buchan

21

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.


2
Etimoloji için teşekkürler. Tanımı bir tabloda keyfi bir arama gibi görünen programlama terimlerinden nefret ediyorum.
Ross Rogers


7

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.


2
Bana sözdizimsel şekerin tersi gibi geliyor :)
Laserallan

2
Derleyiciler için sözdizimsel şeker? Neredeyse, ama tam olarak değil, tamamen sözdizimsel şekerden farklı.
Duncan

2
Belki sözdizimsel bir ekşitici?
Justin Time - Monica'yı eski

7

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.


5

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.


1
İlginç bir ipucu. Bu kelimenin gerçek etimolojisini de merak ediyordum ve akıntıdaki kişilerden birinin sessizce (ve çoğu durumda bilmeden) yolda mesajı dönüştürdüğü "çalı telgrafı" oynayan insanları hayal ettim.
SasQ

5

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)


1

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


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.