Ich habe gesehen, dass es in der Programmierung verwendet wird (speziell in der C ++ - Domäne) und habe keine Ahnung, was es ist. Vermutlich ist es ein Designmuster, aber ich könnte mich irren. Kann jemand ein gutes Beispiel für einen Thunk geben?
130
Antworten:
A
thunk
bezieht sich normalerweise auf einen kleinen Code, der als Funktion aufgerufen wird, eine kleine Aufgabe ausführt und dannJUMP
an einen anderen Ort (normalerweise eine Funktion) geht, anstatt zu seinem Aufrufer zurückzukehren. Angenommen, das JUMP-Ziel ist eine normale Funktion. Wenn es zurückkehrt, kehrt es zum Aufrufer des Thunks zurück.Thunks können verwendet werden, um viele nützliche Dinge effizient zu implementieren
Protokollübersetzung - Beim Aufrufen von Code, der eine Aufrufkonvention verwendet, zu Code, der eine andere Aufrufkonvention verwendet,
thunk
kann a verwendet werden, um die Argumente entsprechend zu übersetzen. Dies funktioniert nur, wenn die Rückgabekonventionen kompatibel sind. Dies ist jedoch häufig der FallBehandlung virtueller Funktionen - Wenn eine virtuelle Funktion einer mehrfach vererbten Basisklasse in C ++ aufgerufen wird, muss der
this
Zeiger korrigiert werden, damit er auf die richtige Stelle zeigt. Athunk
kann das.Dynamische Schließungen - Wenn Sie eine dynamische Schließung erstellen, muss die Schließungsfunktion in der Lage sein, den Kontext zu erreichen, in dem sie erstellt wurde. Es
thunk
kann ein kleiner Code erstellt werden (normalerweise auf dem Stapel), der die Kontextinformationen in einigen Registern einrichtet und dann zu einem statischen Code springt, der die Funktion des Abschlusses implementiert. Der Thunk hier liefert effektiv ein oder mehrere versteckte zusätzliche Argumente für die Funktion, die nicht von der Aufrufstelle bereitgestellt werden.quelle
this
), Standard- / Kopierkonstruktor-Abschlüsse (für eine bessere CRT-Integration von vom Benutzer bereitgestellten mit Standardparametern, hauptsächlich für den DLL-Export oder dasvcall
Erstellen von Arrays), Thunks (um sicherzustellen, dass der Zeiger darauf zeigt) -member-Funktionen funktionieren ordnungsgemäß mit virtuellen Funktionen),vtordisp
Thunks (für Klassen, die virtuelle Funktionen von virtuellen Basen erben und überschreiben und auch vom Benutzer bereitgestellte ctors und / oder dtors haben), native Wrapper (um verwaltete C ++ / CLIUDT returning
" (was ein Problem für das Anpassen von benutzerdefinierten Typen zu sein scheint, die von Operatoren zurückgegeben werden, aber ich bin nicht sicher, wie ich es generieren soll; ich denke, es ist veraltet). Es gibt wahrscheinlich auch andere. Ich denke, man kann Microsoft niemals nicht sagenthunk
; Descartes wäre stolz.Das Wort Thunk hat in der Informatik mindestens drei verwandte Bedeutungen. Ein "Thunk" kann sein:
Ich habe es normalerweise im dritten Kontext gesehen.
http://en.wikipedia.org/wiki/Thunk
quelle
Der Begriff Thunk bezog sich ursprünglich auf den Mechanismus, der von der Royal Radar Establishment- Implementierung von Pass-by-Name in ihrem Algol60- Compiler verwendet wurde. Im Allgemeinen bezieht es sich auf jede Möglichkeit, dynamisches Verhalten zu induzieren, wenn auf ein scheinbar statisches Objekt verwiesen wird. Der Begriff wurde von Brian Wichmann erfunden, der auf die Aufforderung hin, den Namen zu erklären, sagte: "Nun, Sie gehen raus, um den Wert aus dem Speicher zu laden, und dann bewerten Sie plötzlich - thunk - einen Ausdruck."
Thunks wurden in Hardware eingebaut (vgl. KDF9, Burroughs Mainframes). Es gibt verschiedene Möglichkeiten, sie in Software zu implementieren, die alle sehr maschinen-, sprach- und compilerspezifisch sind.
Der Begriff wurde inzwischen über den Namen hinaus verallgemeinert und umfasst jede Situation, in der eine scheinbar oder nominell statische Datenreferenz dynamisches Verhalten induziert. Verwandte Begriffe sind "Trampolin" und "Zukunft".
quelle
Entnommen aus: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
quelle
Es gibt erhebliche Unterschiede in der Verwendung. Fast universell ist ein Thunk eine Funktion, die (zumindest konzeptionell) ungewöhnlich klein und einfach ist. Es ist normalerweise eine Art Adapter, der Ihnen die richtige Schnittstelle zu irgendetwas (einigen Daten, einer anderen Funktion usw.) bietet, aber zumindest als wenig anderes angesehen wird.
Es ist fast wie eine Form von syntaktischem Zucker, nur dass (zumindest wie gewöhnlich verwendet) syntaktischer Zucker die Dinge so aussehen lassen soll, wie der menschliche Leser sie sehen möchte, und ein Thunk soll etwas so aussehen lassen, wie es der Compiler will sieh es dir an.
quelle
Diese Frage wurde bereits auf SO gestellt, siehe:
Was ist ein "Thunk", wie es im Schema oder allgemein verwendet wird?
Soweit ich das beurteilen kann, ähnelt es einer Lambda-Anweisung, bei der Sie den Wert möglicherweise erst zurückgeben möchten, wenn Sie ihn bewerten müssen. oder es kann auch mit einem Eigenschafts-Getter verglichen werden, der von Natur aus Code ausführt, um einen Wert zurückzugeben, während die Schnittstellenform eher einer Variablen ähnelt, aber auch ein polymorphes Verhalten aufweist, das entweder durch Vererbung oder durch Vererbung ausgetauscht werden kann durch Austauschen des Funktionszeigers, der zur Laufzeit einen Wert basierend auf der Kompilierungszeit oder den Umgebungsmerkmalen auswertet und zurückgibt.
quelle
Ich war verzweifelt, keine allgemeine "Informatik" -Definition dieses Begriffs zu finden, die mit seiner mir historisch bekannten De-facto-Verwendung übereinstimmt. Die erste reale Begegnung, an die ich mich erinnern kann, wo sie tatsächlich aufgerufen wurde, war in den OS / 2-Tagen und dem 16-32-Bit-Übergang. Es scheint, dass "Thunking" heute in seiner Anwendung wie Ironie ist.
Mein grobes allgemeines Verständnis ist, dass der Thunk eine Stub-Routine ist, die einfach nichts tut oder eine fundamentale Sachgrenze zwischen Systemen wie in den erwähnten historischen Fällen überschreitet.
Der Sinn ist also wie eine Synästhesie, von einer Umgebung in die andere fallen gelassen zu werden und (metaphorisch / als Gleichnis) einen "Thunk" -Sound zu erzeugen.
quelle
Ich werde das nachschlagen, aber ich dachte, ich denke nach sei der Prozess, der von einem 32-Bit-Prozessor verwendet wird, um 16-Bit-Code auszuführen.
Ich habe es als Analogie dafür verwendet, wie Sie einschränken müssen, wie schnell Sie sprechen und welche Wörter Sie verwenden, wenn Sie mit dummen Menschen sprechen.
Ja, es ist im Wikipedia-Link (der Teil über 32-Bit, nicht meine Nerdalogie ).
https://en.wikipedia.org/wiki/Thunk
(Hervorhebung von mir hinzugefügt)
quelle
Die früheste Verwendung von "thunk", die ich kenne, stammt aus den späten 50er Jahren in Bezug auf die Auswertung von Algol60-Pass-by-Name-Argumenten in Funktionsaufrufen. Algol war ursprünglich eine Spezifikationssprache, keine Programmiersprache, und es gab einige Fragen darüber, wie Pass-by-Name auf einem Computer implementiert werden könnte.
Die Lösung bestand darin, den Einstiegspunkt eines im Wesentlichen Lambda zu passieren. Als der Angerufene den Parameter auswertete, fiel die Kontrolle durch - thunk! - in den Kontext des Anrufers, in dem das Lambda ausgewertet wurde und dessen Ergebnis der Wert des Parameters im Angerufenen wurde.
Bei mit Tags versehener Hardware, wie z. B. den Burroughs-Maschinen, war die Auswertung implizit: Ein Argument konnte als Datenwert wie bei einem normalen Pass-by-Wert oder als Thunk für Pass-by-Name mit verschiedenen Tags in den Argumentmetadaten übergeben werden . Eine Hardware für Ladevorgänge überprüfte das Tag und gab entweder den einfachen Wert zurück oder rief automatisch den Lambda-Thunk auf.
quelle
Per Kyle Simpson Definition ist ein Thunk ist eine Art und Weise zu abstrahieren die Komponente der Zeit von asynchronem Code.
quelle