Qu'est-ce qu'un «thunk»?


131

Je l'ai vu utilisé en programmation (en particulier dans le domaine C ++) et je n'ai aucune idée de ce que c'est. C'est probablement un modèle de conception, mais je peux me tromper. Quelqu'un peut-il donner un bon exemple de thunk?


10
Tout comme un FYI, un thunk est aussi parfois appelé un «trampoline» (dans le cas général, peut-être pas dans le domaine C ++).
Michael Burr

@MichaelBurr, le seul contexte dans lequel j'ai vu le terme "trampoline" utilisé est Detours et dans ce contexte un trampoline n'est pas un bruit sourd.
user34660

1
Le terme est le type de chose qui n'a pas de définition spécifique, donc sa définition varie.
user34660

Réponses:


132

A thunkse réfère généralement à un petit morceau de code qui est appelé en tant que fonction, fait une petite chose, puis JUMPs à un autre emplacement (généralement une fonction) au lieu de retourner à son appelant. En supposant que la cible JUMP est une fonction normale, lorsqu'elle revient, elle retournera à l'appelant du thunk.

Thunks peut être utilisé pour mettre en œuvre efficacement de nombreuses choses utiles

  • traduction de protocole - lors d'un appel à partir d'un code utilisant une convention d'appel vers un code utilisant une convention d'appel différente, a thunkpeut être utilisé pour traduire les arguments de manière appropriée. Cela ne fonctionne que si les conventions de retour sont compatibles, mais c'est souvent le cas

  • gestion des fonctions virtuelles - lors de l'appel d'une fonction virtuelle d'une classe de base à héritage multiple en C ++, il doit y avoir une correction du thispointeur pour qu'il pointe vers le bon endroit. A thunkpeut le faire.

  • fermetures dynamiques - lorsque vous créez une fermeture dynamique, la fonction de fermeture doit pouvoir accéder au contexte dans lequel elle a été créée. Un petit thunkpeut être construit (généralement sur la pile) qui configure les informations de contexte dans certains registres, puis saute vers un morceau de code statique qui implémente la fonction de fermeture. Le thunk ici fournit effectivement un ou plusieurs arguments supplémentaires cachés à la fonction qui ne sont pas fournis par le site d'appel.


13
Ceci est la meilleure explication, car il explique ce que le thunk est au lieu de ce qu'il habituellement fait dans les cas typiques d'utilisation pour mettre en œuvre des choses différentes. D'autres réponses se concentrent trop sur ces implémentations particulières plutôt que sur l'idée générale.
SasQ

Je ne suis pas sûr des autres compilateurs, mais Visual Studio en particulier semble être très friand de thunks. À ma connaissance, il utilise: ajusteurs thunks (pour ajuster this), fermetures de constructeur par défaut / copie (pour une meilleure intégration CRT de ceux fournis par l'utilisateur avec des paramètres par défaut, principalement pour l'exportation de DLL ou la construction de tableaux), vcallthunks (pour s'assurer que le pointeur vers -member-functions fonctionnent correctement avec les fonctions virtuelles), vtordispthunks (pour les classes qui héritent et remplacent les fonctions virtuelles des bases virtuelles, et ont également des ctors et / ou des dtors fournis par l'utilisateur), des wrappers natifs (pour appeler le C ++ / CLI managé
Justin Time - Réintégrer Monica le

fonctions du code ISO C ++ natif), et quelque chose appelé " UDT returning" (qui semble être un thunk pour ajuster les types définis par l'utilisateur renvoyés par les opérateurs, mais je ne sais pas comment le générer; je pense que c'est obsolète). Il y en a probablement d'autres aussi. Je suppose que vous ne pouvez jamais dire à Microsoft thunknon; Descartes serait fier.
Justin Time - Réintègre Monica le

80

Le mot thunk a au moins trois significations liées en informatique. Un "thunk" peut être:

  • un morceau de code pour effectuer un calcul retardé (similaire à une fermeture)
  • une fonctionnalité de certaines implémentations de table de fonctions virtuelles (similaire à une fonction wrapper)
  • un mappage des données machine d'un formulaire spécifique au système à un autre, généralement pour des raisons de compatibilité

Je l'ai généralement vu utilisé dans le troisième contexte.

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


3
Intéressant; J'entends généralement la deuxième forme, mais je suppose que cela dépend du type de travail que vous faites le plus souvent
Michael Mrozek

Plus précisément, lié au fait que des blocs de code machine très courts sont automatiquement générés - même le premier cas est normalement juste de donner un contexte à une fonction d'implémentation précompilée.
Simon Buchan

21

Le terme thunk faisait à l'origine référence au mécanisme utilisé par l' implémentation du mot -par-nom par le Royal Radar Establishment dans leur compilateur Algol60 . En général, il fait référence à tout moyen d'induire un comportement dynamique lors du référencement d'un objet apparemment statique. Le terme a été inventé par Brian Wichmann, qui, lorsqu'on lui a demandé d'expliquer en passant par le nom, a dit: "Eh bien, vous sortez pour charger la valeur de mémoire et puis soudainement - thunk - vous évaluez une expression."

Des Thunks ont été mis en hardware (cf. KDF9, mainframes de Burroughs). Il existe plusieurs façons de les implémenter dans un logiciel, toutes très spécifiques à la machine, au langage et au compilateur.

Le terme a fini par être généralisé au-delà du mot de passe, pour inclure toute situation dans laquelle une référence de données apparemment ou nominalement statique induit un comportement dynamique. Les termes associés incluent "trampoline" et "futur".


2
Merci pour l'étymologie. Je déteste les termes de programmation dont la définition semble être une recherche arbitraire dans une table.
Ross Rogers


7

Il y a une variation considérable dans l'utilisation. Presque universellement, un thunk est une fonction (au moins conceptuellement) inhabituellement petite et simple. C'est généralement une sorte d'adaptateur qui vous donne l'interface correcte vers quelque chose ou autre (certaines données, une autre fonction, etc.) mais qui est au moins considéré comme ne faisant pas grand-chose d'autre.

C'est presque comme une forme de sucre syntaxique, sauf que (du moins comme d'habitude) le sucre syntaxique est censé donner aux choses l'apparence que le lecteur humain veut les voir, et un thunk est de donner à quelque chose l'apparence que le compilateur veut. le voir.


2
Cela ressemble à l'opposé du sucre syntaxique pour moi :)
Laserallan

2
Du sucre syntaxique pour les compilateurs alors? Presque, mais pas tout à fait, totalement différent du sucre syntaxique.
Duncan

2
Peut-être un sourener syntaxique?
Justin Time - Réintègre Monica le

7

Cette question a déjà été posée sur SO, voir:

Qu'est-ce qu'un «thunk», tel qu'utilisé dans Scheme ou en général?

D'après ce que je peux dire, cela s'apparente à une instruction lambda, où vous ne voudrez peut-être pas renvoyer la valeur tant que vous n'avez pas besoin de l'évaluer; ou il peut également être comparé à un getter de propriété qui, par conception, exécute du code afin de renvoyer une valeur tout en ayant la forme d'interface qui ressemble plus à une variable, mais a également un comportement polymorphe qui peut être échangé par héritage ou en remplaçant le pointeur de fonction qui évaluerait et retournerait une valeur au moment de l'exécution en fonction des caractéristiques au moment de la compilation ou de l'environnement.


5

J'ai été affligé de ne trouver aucune définition générale «informatique» de ce terme correspondant à son utilisation de facto telle que je la connais historiquement. La première rencontre dans la vraie vie dont je me souviens où elle a été appelée était dans les jours OS / 2 et la transition 16-32 bits. Il semble que "thunking" soit comme l'ironie dans son application aujourd'hui.

Ma compréhension générale approximative est que le thunk est une routine stub qui ne fait rien ou qui traverse une frontière fondamentale en nature entre les systèmes, comme dans les cas historiques mentionnés.

Donc, le sens est comme une synesthésie d'être passé d'un environnement à l'autre faisant (métaphoriquement / comme une comparaison) un son "thunk".


1
Conseil intéressant. Je m'interrogeais aussi sur l'étymologie réelle de ce mot, et j'imaginais des gens jouant au «télégraphe de brousse», où l'une des personnes dans le ruisseau en silence (et dans de nombreux cas sans le savoir) transforme le message en chemin.
SasQ

5

Je vais chercher cela, mais je pensais que Thunking était le processus utilisé par un processeur 32 bits pour exécuter du code 16 bits hérité.

J'avais l'habitude de l'utiliser comme une analogie pour savoir comment vous devez limiter la vitesse à laquelle vous parlez et les mots que vous utilisez lorsque vous parlez à des gens stupides.

Oui, c'est dans le lien Wikipédia (la partie sur 32 bits, pas ma nerdalogie ).

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

Une grande partie de la littérature sur les thunks d'interopérabilité concerne diverses plates-formes Wintel, notamment MS-DOS, OS / 2, [8] Windows [9] [10] et .NET, et la transition de l'adressage mémoire 16 bits à 32 bits . Les clients ayant migré d'une plate-forme à une autre, les thunks ont été essentiels pour prendre en charge les logiciels hérités écrits pour les plates-formes plus anciennes.

(italiques ajoutés par moi)


1

La plus ancienne utilisation de "thunk" que je connaisse remonte à la fin des années 50 en référence à l'évaluation d'argument passe-par-nom Algol60 dans les appels de fonction. Algol était à l'origine un langage de spécification, pas un langage de programmation, et il y avait une question sur la façon dont le mot de passe pouvait être implémenté sur un ordinateur.

La solution était de passer le point d'entrée de ce qui était essentiellement un lambda. Lorsque l'appelé a évalué le paramètre, le contrôle est tombé à travers - thunk! - dans le contexte de l'appelant où le lambda a été évalué et son résultat est devenu la valeur du paramètre dans l'appelé.

Dans le matériel étiqueté, comme les machines Burroughs, l'évaluation était implicite: un argument pouvait être passé en tant que valeur de données comme dans un passage par valeur ordinaire, ou par thunk pour un passage par nom, avec différentes balises dans les métadonnées d'argument . Un matériel d'opération de chargement a vérifié la balise et a renvoyé la valeur simple ou a automatiquement appelé le thunk lambda.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.