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?
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?
Réponses:
A thunk
se réfère généralement à un petit morceau de code qui est appelé en tant que fonction, fait une petite chose, puis JUMP
s à 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 thunk
peut ê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 this
pointeur pour qu'il pointe vers le bon endroit. A thunk
peut 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 thunk
peut ê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.
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), vcall
thunks (pour s'assurer que le pointeur vers -member-functions fonctionnent correctement avec les fonctions virtuelles), vtordisp
thunks (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é
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 thunk
non; Descartes serait fier.
Le mot thunk a au moins trois significations liées en informatique. Un "thunk" peut être:
Je l'ai généralement vu utilisé dans le troisième contexte.
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".
Certains compilateurs pour les langages orientés objet tels que C ++ génèrent des fonctions appelées "thunks" pour optimiser les appels de fonctions virtuelles en présence d'héritage multiple ou virtuel.
Tiré de: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
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.
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.
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".
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)
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.
Selon la définition de Kyle Simpson , un thunk est un moyen d'abstraire la composante du temps à partir d'un code asynchrone.