Co to jest „thunk”?


132

Widziałem go w programowaniu (szczególnie w domenie C ++) i nie mam pojęcia, co to jest. Prawdopodobnie jest to wzorzec projektowy, ale mogę się mylić. Czy ktoś może podać dobry przykład odruchu?


10
Podobnie jak FYI, thunk jest czasami nazywany „trampoliną” (w ogólnym przypadku może nie w domenie C ++).
Michael Burr,

@MichaelBurr, jedyny kontekst, w jakim widziałem termin „trampolina”, to Objazdy iw tym kontekście trampolina nie jest bzdurą.
user34660

1
Termin jest typem rzeczy, który nie ma określonej definicji, więc ma różne definicje.
user34660

Odpowiedzi:


134

A thunkzwykle odnosi się do małego fragmentu kodu, który jest wywoływany jako funkcja, robi małą rzecz, a następnie JUMPs do innej lokalizacji (zwykle funkcji) zamiast zwracać się do wywołującego. Zakładając, że cel JUMP jest normalną funkcją, kiedy powróci, powróci do wywołującego thunk.

Thunks może być używany do efektywnego wdrażania wielu przydatnych rzeczy

  • translacja protokołów - podczas wywoływania z kodu, który używa jednej konwencji wywoływania do kodu, który używa innej konwencji wywoływania, thunkmożna użyć a do odpowiedniego przetłumaczenia argumentów. Działa to tylko wtedy, gdy konwencje powrotu są zgodne, ale często tak jest

  • obsługa funkcji wirtualnych - podczas wywoływania funkcji wirtualnej z wielokrotnie dziedziczonej klasy bazowej w C ++ konieczne jest poprawienie thiswskaźnika, aby wskazywał we właściwym miejscu. thunkMoże to zrobić.

  • domknięcia dynamiczne - kiedy tworzysz domknięcie dynamiczne, funkcja domknięcia musi mieć możliwość dotarcia do kontekstu, w którym została utworzona. thunkMożna zbudować small (zwykle na stosie), który ustawia informacje o kontekście w niektórych rejestrach, a następnie przeskakuje do statycznego fragmentu kodu, który implementuje funkcję zamknięcia. Chodzi tutaj o efektywne dostarczenie jednego lub więcej ukrytych dodatkowych argumentów do funkcji, których nie dostarcza strona wywołania.


13
Jest to najlepsze wyjaśnienie, ponieważ wyjaśnia, czym jest thunk, zamiast tego, co zwykle robi w typowych przypadkach użycia, aby zaimplementować różne rzeczy. Inne odpowiedzi zbytnio koncentrują się na tych konkretnych wdrożeniach, zamiast na ogólnej idei.
SasQ

Nie jestem pewien co do innych kompilatorów, ale w szczególności Visual Studio wydaje się bardzo lubić bzdury. O ile mi wiadomo, używa on: korektorów (do regulacji this), domyślnych / kopiujących domknięć konstruktora (dla lepszej integracji CRT dostarczonych przez użytkownika z domyślnymi parametrami, głównie do eksportu DLL lub tworzenia tablic), vcallthunks (aby upewnić się, że wskaźnik -member-functions działają poprawnie z funkcjami wirtualnymi), vtordispthunks (dla klas, które dziedziczą i zastępują funkcje wirtualne z wirtualnych baz, a także mają dostarczone przez użytkownika ctors i / lub dtors), natywne opakowania (do wywoływania zarządzanego C ++ / CLI
Justin Time - Przywróć Monikę

funkcje z natywnego kodu ISO C ++) i coś, co nazywa się „ UDT returning” (co wydaje się być gratką w dostosowywaniu typów zdefiniowanych przez użytkownika zwracanych przez operatorów, ale nie jestem pewien, jak to wygenerować; myślę, że jest przestarzała). Prawdopodobnie są też inni. Chyba nigdy nie można powiedzieć, że Microsoft thunknie; Kartezjusz byłby dumny.
Justin Time - Przywróć Monikę

80

Słowo thunk ma co najmniej trzy powiązane znaczenia w informatyce. „Przypadek” może być:

  • fragment kodu do wykonania opóźnionych obliczeń (podobny do zamknięcia)
  • cecha niektórych implementacji tabel funkcji wirtualnych (podobna do funkcji opakowującej)
  • odwzorowanie danych maszynowych z jednej formy specyficznej dla systemu na inną, zwykle ze względu na kompatybilność

Zwykle widziałem to używane w trzecim kontekście.

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


3
Ciekawy; Zwykle słyszę drugą formę, ale myślę, że to zależy, jaką pracę wykonujesz częściej
Michał Mrozek

W szczególności związane z automatycznym generowaniem bardzo krótkich bloków kodu maszynowego - nawet pierwszy przypadek zwykle podaje kontekst wstępnie skompilowanej funkcji implementacji.
Simon Buchan,

24

Termin thunk pierwotnie odnosił się do mechanizmu używanego przez implementację pass-by-name przez Royal Radar Establishment w ich kompilatorze Algol60 . Ogólnie odnosi się do dowolnego sposobu wywoływania dynamicznego zachowania podczas odwoływania się do pozornie statycznego obiektu. Termin został wymyślony przez Briana Wichmanna, który zapytany o wyjaśnienie przechodzenia powiedział: „No cóż, wychodzisz, aby załadować wartość z pamięci, a potem nagle - bzdury - oceniasz wyrażenie”.

Thunks został umieszczony w sprzęcie (por. KDF9, mainframe Burroughs). Istnieje kilka sposobów implementacji ich w oprogramowaniu, wszystkie bardzo specyficzne dla maszyny, języka i kompilatora.

Termin został uogólniony poza przekazywaniem nazwy, obejmujący każdą sytuację, w której pozornie lub nominalnie statyczne odniesienie do danych wywołuje dynamiczne zachowanie. Powiązane terminy to „trampolina” i „przyszłość”.


2
Dzięki za etymologię. Nienawidzę terminów programistycznych, których definicja wydaje się być przypadkowym wyszukiwaniem w tabeli.
Ross Rogers


8

To pytanie zostało już zadane na SO, zobacz:

Co to jest „thunk”, jak jest używane w Scheme lub ogólnie?

Z tego, co wiem, jest to podobne do wyrażenia lambda, w którym możesz nie chcieć zwracać wartości, dopóki nie będziesz musiał jej oszacować; lub można go również porównać do metody pobierającej właściwości, która zgodnie z projektem wykonuje kod w celu zwrócenia wartości, a jednocześnie ma postać interfejsu, która przypomina bardziej zmienną, ale ma również polimorficzne zachowanie, które można zamienić, czy to przez dziedziczenie, czy przez zamianę wskaźnika funkcji, który obliczałby i zwracał wartość w czasie wykonywania na podstawie czasu kompilacji lub charakterystyki środowiska.


7

Istnieją znaczne różnice w użyciu. Niemal powszechnie, thunk to funkcja, która (przynajmniej koncepcyjnie) jest niezwykle mała i prosta. Zwykle jest to jakiś rodzaj adaptera, który zapewnia właściwy interfejs do czegoś lub innego (niektóre dane, inna funkcja itp.), Ale przynajmniej postrzegany jest jako robiący niewiele więcej.

To prawie jak forma cukru syntaktycznego, z tą różnicą, że (przynajmniej tak, jak zwykle jest używany) cukier syntaktyczny ma sprawiać, że rzeczy wyglądają tak, jak chce je widzieć ludzki czytelnik, a myśl jest taka, aby coś wyglądało tak, jak chce kompilator Zobacz to.


2
Brzmi jak przeciwieństwo cukru syntaktycznego :)
Laserallan

2
Zatem cukier syntaktyczny dla kompilatorów? Prawie, ale nie do końca, w przeciwieństwie do cukru syntaktycznego.
Duncan,

2
Może sourener składniowy?
Justin Time - Przywróć Monikę

5

Byłem zmartwiony, że żadna ogólna „informatyczna” definicja tego terminu nie pasowałaby do jego faktycznego użycia jako znanego mi historycznie. Pierwsze spotkanie z prawdziwym życiem, jakie pamiętam, gdzie tak naprawdę się nazywało, czyli w dniach systemu operacyjnego / 2 i przejściu 16-32 bitów. Wygląda na to, że dzisiejsze „dudnienie” jest ironią.

Moje ogólne ogólne zrozumienie jest takie, że thunk jest rutynową odgałęzieniem, która po prostu nic nie robi lub przekracza jakąś fundamentalną granicę w naturze między systemami, jak we wspomnianych przypadkach historycznych.

Tak więc poczucie jest jak synestezja bycia wyrzuconym z jednego środowiska do drugiego, tworząc (metaforycznie / jako porównanie) dźwięk „dudnienia”.


1
Ciekawa wskazówka. Zastanawiałem się również nad faktyczną etymologią tego słowa i wyobrażałem sobie ludzi grających w „krzakowy telegraf”, w którym jedna z osób w strumieniu po cichu (iw wielu przypadkach nieświadomie) przekształca przekaz po drodze.
SasQ

5

Idę szukać tego, ale myślałem thunking był proces zatrudniony przez procesor 32-bitowy kod do uruchomienia starszych 16-bitowym.

Używałem tego jako analogii do tego, jak musisz ograniczać szybkość mówienia i jakich słów używasz, gdy rozmawiasz z głupimi ludźmi.

Tak, jest w linku do Wikipedii (część dotycząca wersji 32-bitowej, nie moja nerdalogia ).

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

Znaczna część literatury na temat problemów związanych z interoperacyjnością dotyczy różnych platform Wintel, w tym MS-DOS, OS / 2, [8] Windows [9] [10] i .NET, oraz przejścia z 16-bitowego na 32-bitowe adresowanie pamięci . Ponieważ klienci przenosili się z jednej platformy na drugą, rozwiązania techniczne były niezbędne do obsługi starszego oprogramowania napisanego dla starszych platform.

(podkreślenie dodane przeze mnie)


1

Najwcześniejsze użycie „thunk”, jakie znam, pochodzi z późnych lat pięćdziesiątych w odniesieniu do oceny argumentów typu pass-by-name w Algol60 w wywołaniach funkcji. Algol był pierwotnie językiem specyfikacji, a nie językiem programowania, i pojawiło się pewne pytanie, w jaki sposób można zaimplementować przekazywanie nazwy na komputerze.

Rozwiązaniem było przekroczenie punktu wejścia tego, co zasadniczo było lambdą. Kiedy odbiorca ocenił parametr, kontrola wypadła - bzdury! - do kontekstu wywołującego, gdzie lambda została oszacowana, a jej wynik stał się wartością parametru w wywoływanym.

W oznaczonym sprzęcie, takim jak maszyny Burroughs, ocena była niejawna: argument mógł zostać przekazany jako wartość danych, jak w zwykłym przekazie wartości, lub przez myśl dla przekazania przez nazwę, z różnymi tagami w metadanych argumentu . Sprzęt do operacji ładowania sprawdził tag i albo zwrócił prostą wartość, albo automatycznie wywołał funkcję lambda.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.