Was ist ein "Thunk"?


130

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?


10
Genau wie zu Ihrer Information wird ein Thunk manchmal auch als "Trampolin" bezeichnet (im allgemeinen Fall möglicherweise nicht in der C ++ - Domäne).
Michael Burr

@ MichaelBurr, der einzige Kontext, in dem ich den Begriff "Trampolin" gesehen habe, ist Umwege, und in diesem Zusammenhang ist ein Trampolin kein Thunk.
user34660

1
Der Begriff ist die Art von Dingen, die keine spezifische Definition haben, so dass sie in der Definition variieren.
user34660

Antworten:


131

A thunkbezieht sich normalerweise auf einen kleinen Code, der als Funktion aufgerufen wird, eine kleine Aufgabe ausführt und dann JUMPan 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, thunkkann a verwendet werden, um die Argumente entsprechend zu übersetzen. Dies funktioniert nur, wenn die Rückgabekonventionen kompatibel sind. Dies ist jedoch häufig der Fall

  • Behandlung virtueller Funktionen - Wenn eine virtuelle Funktion einer mehrfach vererbten Basisklasse in C ++ aufgerufen wird, muss der thisZeiger korrigiert werden, damit er auf die richtige Stelle zeigt. A thunkkann 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 thunkkann 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.


13
Dies ist die beste Erklärung, da sie erklärt, was der Thunk ist, anstatt was er normalerweise in typischen Anwendungsfällen tut , um verschiedene Dinge zu implementieren. Andere Antworten konzentrieren sich zu sehr auf diese speziellen Implementierungen anstelle der allgemeinen Idee.
SasQ

Ich bin mir bei anderen Compilern nicht sicher, aber insbesondere Visual Studio scheint Thunks sehr zu mögen. Meines Wissens verwendet es: Anpassungs-Thunks (zum Anpassen 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 das vcallErstellen von Arrays), Thunks (um sicherzustellen, dass der Zeiger darauf zeigt) -member-Funktionen funktionieren ordnungsgemäß mit virtuellen Funktionen), vtordispThunks (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 ++ / CLI
Justin Time

Funktionen aus nativem ISO C ++ - Code) und etwas namens " UDT 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 sagen thunk; Descartes wäre stolz.
Justin Time - Stellen Sie Monica am

80

Das Wort Thunk hat in der Informatik mindestens drei verwandte Bedeutungen. Ein "Thunk" kann sein:

  • ein Stück Code, um eine verzögerte Berechnung durchzuführen (ähnlich einem Abschluss)
  • eine Funktion einiger Implementierungen virtueller Funktionstabellen (ähnlich einer Wrapper-Funktion)
  • eine Zuordnung von Maschinendaten von einer systemspezifischen Form zu einer anderen, normalerweise aus Kompatibilitätsgründen

Ich habe es normalerweise im dritten Kontext gesehen.

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


3
Interessant; Normalerweise höre ich die zweite Form, aber ich denke, es hängt davon ab, welche Art von Arbeit Sie häufiger machen
Michael Mrozek

Insbesondere durch die automatische Generierung sehr kurzer Blöcke von Maschinencode - selbst der erste Fall gibt normalerweise nur Kontext für eine vorkompilierte Implementierungsfunktion.
Simon Buchan

20

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


2
Danke für die Etymologie. Ich hasse Programmierbegriffe, deren Definition eine willkürliche Suche in einer Tabelle zu sein scheint.
Ross Rogers


7

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.


2
Klingt für mich wie das Gegenteil von syntaktischem Zucker :)
Laserallan

2
Syntaktischer Zucker für Compiler dann? Fast, aber nicht ganz, ganz anders als syntaktischer Zucker.
Duncan

2
Vielleicht ein syntaktischer Sourener?
Justin Time - Stellen Sie Monica am

7

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.


5

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.


1
Interessanter Tipp. Ich wunderte mich auch über die tatsächliche Etymologie dieses Wortes und stellte mir Leute vor, die "Buschtelegraphen" spielten, bei denen eine der Personen im Strom die Botschaft auf dem Weg still (und in vielen Fällen unwissentlich) transformierte.
SasQ

5

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

Ein Großteil der Literatur zu Interoperabilitäts-Thunks bezieht sich auf verschiedene Wintel-Plattformen, einschließlich MS-DOS, OS / 2, [8] Windows [9] [10] und .NET, sowie auf den Übergang von 16-Bit- zu 32-Bit-Speicheradressierung . Da Kunden von einer Plattform auf eine andere migriert sind, waren Thunks unerlässlich, um Legacy-Software zu unterstützen, die für ältere Plattformen geschrieben wurde.

(Hervorhebung von mir hinzugefügt)


1

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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.