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?
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?
Odpowiedzi:
A thunk
zwykle odnosi się do małego fragmentu kodu, który jest wywoływany jako funkcja, robi małą rzecz, a następnie JUMP
s 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, thunk
moż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 this
wskaźnika, aby wskazywał we właściwym miejscu. thunk
Moż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. thunk
Moż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.
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), vcall
thunks (aby upewnić się, że wskaźnik -member-functions działają poprawnie z funkcjami wirtualnymi), vtordisp
thunks (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
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 thunk
nie; Kartezjusz byłby dumny.
Słowo thunk ma co najmniej trzy powiązane znaczenia w informatyce. „Przypadek” może być:
Zwykle widziałem to używane w trzecim kontekście.
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ść”.
Niektóre kompilatory języków zorientowanych obiektowo, takie jak C ++, generują funkcje zwane „thunks” jako optymalizację wywołań funkcji wirtualnych w obecności wielokrotnego lub wirtualnego dziedziczenia.
Zaczerpnięte z: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
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.
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.
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”.
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)
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.
Zgodnie z definicją Kyle'a Simpsona , thunk to sposób na wyodrębnienie składnika czasu poza kodem asynchronicznym.