c++ redux - Was ist ein 'Thunk'?




programming deutsch (9)

Ich habe es in der Programmierung verwendet (speziell in der C ++ - Domäne) und habe keine Ahnung, was es ist. Vermutlich ist es ein Designmuster, aber ich könnte falsch liegen. Kann jemand ein gutes Beispiel für einen Thunk geben?


Answers

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 Art, dynamisches Verhalten zu induzieren, wenn auf ein scheinbar statisches Objekt Bezug genommen wird. Der Begriff wurde von Brian Wichmann erfunden, der, als er gebeten wurde, Pass-by-Name zu erklären, sagte: "Nun, du gehst aus, um den Wert aus dem Speicher zu laden und dann plötzlich - thunk - da evaluierst du einen Ausdruck."

Thunks wurden in Hardware gesteckt (vgl. KDF9, Burroughs Mainframes). Es gibt mehrere Möglichkeiten, sie in Software zu implementieren, und zwar ganz spezifisch für Maschine, Sprache und Compiler.

Der Begriff wurde über den Vornamen hinaus verallgemeinert, um jede Situation einzubeziehen, in der eine scheinbar oder nominal statische Datenreferenz dynamisches Verhalten induziert. Verwandte Begriffe sind "Trampolin" und "Zukunft".


Ein thunk bezieht sich normalerweise auf ein kleines Stück Code, das als Funktion aufgerufen wird, kleine Dinge tut und dann an einen anderen Ort (normalerweise eine Funktion) JUMP , anstatt zu seinem Aufrufer zurückzukehren. Wenn das JUMP-Ziel eine normale Funktion ist, kehrt es bei Rückkehr zum Aufrufer des Thunks zurück.

Thunks können verwendet werden, um viele nützliche Dinge effizient zu implementieren

  • Protokollübersetzung - beim Aufruf von Code, der eine Aufrufkonvention verwendet, zu Code, der eine andere Aufrufkonvention verwendet, kann ein thunk verwendet werden, um die Argumente entsprechend zu übersetzen. Dies funktioniert nur, wenn die Rückgabekonventionen kompatibel sind, aber das ist oft der Fall

  • Behandlung virtueller Funktionen - Wenn eine virtuelle Funktion einer mehrfach geerbten Basisklasse in C ++ aufgerufen wird, muss der this Zeiger korrigiert werden, damit er auf die richtige Stelle zeigt. Ein thunk kann das tun.

  • Dynamische Closures - Wenn Sie eine dynamische Closure erstellen, muss die Closure-Funktion in dem Kontext sein, in dem sie erstellt wurde. Ein kleiner thunk kann erstellt werden (normalerweise auf dem Stapel), der die Kontextinformationen in einigen Registern aufbaut und dann zu einem statischen Codeabschnitt springt, der die Funktion des Abschlusses implementiert. Der Thunk hier liefert effektiv ein oder mehrere versteckte zusätzliche Argumente an die Funktion, die nicht von der Aufrufstelle bereitgestellt werden.


Diese Frage wurde bereits zu SO gestellt, siehe:

Was ist ein "Thunk", wie er in Schema oder allgemein verwendet wird?

Soweit ich das beurteilen kann, ähnelt es einer Lambda-Anweisung, bei der Sie den Wert erst dann zurückgeben möchten, wenn Sie ihn bewerten müssen. oder es kann auch mit einem Property-Getter verglichen werden, der im Design Code ausführt, um einen Wert zurückzugeben, während die Schnittstellenform mehr wie eine Variable aussieht, aber auch ein polymorphes Verhalten hat, das durch Vererbung oder ersetzt werden kann durch Auslagern des Funktionszeigers, der basierend auf Kompilierzeit- oder Umgebungseigenschaften einen Wert zur Laufzeit auswerten und zurückgeben würde.


Ich werde nachsehen, aber ich dachte Thunking war der Prozess, der von einem 32-Bit-Prozessor verwendet wurde, um älteren 16-Bit-Code auszuführen.

Ich benutzte es als eine Analogie dafür, wie man einschränken muss, wie schnell man spricht und welche Wörter man benutzt, wenn man mit dummen Leuten spricht.

Ja, es ist in der Wikipedia-Link (der Teil über 32-Bit, nicht meine Nerdalogie ).

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

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

(Hervorhebung von mir hinzugefügt)


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 einer Schließung)
  • ein Feature einiger virtueller Funktionstabellen-Implementierungen (ähnlich einer Wrapper-Funktion)
  • eine Zuordnung von Maschinendaten von einem systemspezifischen Formular zu einem anderen, normalerweise aus Kompatibilitätsgründen

Ich habe es normalerweise im dritten Kontext gesehen.

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


Ich war verzweifelt, keine allgemeine 'Computerwissenschaft'-Definition dieses Begriffs zu finden, die zu seiner De-facto-Verwendung paßt, wie sie mir historisch bekannt ist. Die erste reale Begegnung, an die ich mich erinnern kann, war die OS / 2-Tage und der 16-32-Bit-Übergang. Es scheint, dass "Thunking" in seiner heutigen Anwendung wie Ironie ist.

Mein grobes allgemeines Verständnis ist, dass das Thunk eine Stub-Routine ist, die einfach nichts tut oder über eine fundamentale natürliche Grenze zwischen Systemen wie in den erwähnten historischen Fällen hinausgeht.

Der Sinn ist also wie eine Synästhesie, bei der man von der einen Umgebung zur anderen fällt und (metaphorisch / als Simile) einen "Thunk" -Sound macht.


Es gibt erhebliche Unterschiede in der Verwendung. Fast überall ist ein Thunk eine Funktion, die (zumindest konzeptionell) ungewöhnlich klein und einfach ist. Es ist normalerweise eine Art von Adapter, der Ihnen die richtige Schnittstelle zu etwas oder anderem gibt (einige Daten, eine andere Funktion, etc.), aber wird zumindest so gesehen, als ob Sie sonst nichts tun.

Es ist fast wie eine Form von syntaktischem Zucker, außer dass (zumindest wie gewöhnlich) syntaktischer Zucker die Dinge so aussehen lässt, wie der menschliche Leser sie sehen will, und ein Thunk ist, etwas so aussehen zu lassen, wie der Compiler es möchte sieh es dir an.



Why can't operator<< function for streaming objects to std::cout or to a file be a member function?

Let's say you have:

struct Foo
{
   int a;
   double b;

   std::ostream& operator<<(std::ostream& out) const
   {
      return out << a << " " << b;
   }
};

Given that, you cannot use:

Foo f = {10, 20.0};
std::cout << f;

Since operator<< is overloaded as a member function of Foo , the LHS of the operator must be a Foo object. Which means, you will be required to use:

Foo f = {10, 20.0};
f << std::cout

which is very non-intuitive.

If you define it as a non-member function,

struct Foo
{
   int a;
   double b;
};

std::ostream& operator<<(std::ostream& out, Foo const& f)
{
   return out << f.a << " " << f.b;
}

You will be able to use:

Foo f = {10, 20.0};
std::cout << f;

which is very intuitive.





c++ thunk