web-dev-qa-db-fra.com

Qu'est-ce qu'un "thunk"?

Je l'ai vu utilisé en programmation (en particulier dans le domaine C++) et je ne sais pas ce que c'est. Vraisemblablement, c'est un motif, mais je peux me tromper. Quelqu'un peut-il donner un bon exemple d'un thunk?

112
fbrereto

thunk fait généralement référence à un petit morceau de code appelé en tant que fonction, effectue une petite chose, puis JUMPs à un autre emplacement (généralement une fonction) au lieu de retourner à l'appelant. En supposant que la cible JUMP soit une fonction normale, à son retour, elle reviendra à l'appelant du thunk.

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

  • traduction de protocole - lors de l'appel d'un code utilisant une convention d'appel à un code utilisant une convention d'appel différente, une variable thunk peut être utilisée 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 multi-héritée en C++, il est nécessaire de corriger le pointeur this pour le faire pointer au bon endroit. Un 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. Une petite thunk peut être construite (généralement sur la pile) qui configure les informations de contexte dans un ou plusieurs registres, puis passe à un morceau de code statique qui implémente la fonction de la 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.

110
Chris Dodd

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é (semblable à une fermeture)
  • une fonctionnalité de certaines implémentations de fonctions virtuelles (similaire à une fonction wrapper)
  • un mappage des données de machine d'un formulaire spécifique à 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

77
Robert Harvey

Certains compilateurs pour les langages orientés objet tels que C++ génèrent des fonctions appelées "thunks" en tant qu'optimisation des appels de fonctions virtuelles en présence d'un héritage multiple ou virtuel.

Extrait de: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming

17
OscarRyz

Le terme thunk désignait à l'origine le mécanisme utilisé par l'implémentation Royal Radar Establishment du passage par nom dans leur compilateur ALGOL60 . En général, il fait référence à n'importe quel 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 le nom d'utilisateur, a déclaré: "Eh bien, vous allez charger la valeur de mémoire, puis, tout à coup, vous évaluez une expression."

Les thunks ont été intégrés au matériel (cf. KDF9, ordinateurs centraux Burroughs). Il existe plusieurs façons de les implémenter dans des logiciels, tous très spécifiques à la machine, au langage et au compilateur. 

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

15
Ivan Godard

L'utilisation varie considérablement. Presque universellement, un thunk est une fonction inhabituellement petite et simple (du moins sur le plan conceptuel). C'est généralement une sorte d'adaptateur qui vous donne l'interface correcte pour quelque chose (certaines données, une autre fonction, etc.) mais qui est au moins considéré comme ne faisant rien d'autre.

C'est presque comme une forme de sucre syntaxique, sauf que (du moins tel qu'il est habituellement utilisé), le sucre syntaxique est censé donner l'apparence que le lecteur humain veut voir, et le ton du mal est de donner l'impression que le compilateur veut le voir.

7
Jerry Coffin

Je vais regarder 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 analogie pour déterminer comment vous devez limiter votre vitesse de parole et les mots que vous utilisez lorsque vous parlez à des idiots.

Oui, c'est dans le lien Wikipedia (la partie sur 32 bits, pas mon 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 16 bits à 32 bits. adressage mémoire. Les clients ayant migré d'une plate-forme à une autre, les thunks ont joué un rôle essentiel dans la prise en charge des logiciels existants conçus pour les anciennes plates-formes.

(italique ajouté par moi)

5
MusiGenesis

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

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

D'après ce que je peux dire, cela s'apparente à une déclaration lambda, dans laquelle vous ne souhaitez peut-être pas renvoyer la valeur tant que vous n'avez pas besoin de l'évaluer. ou il peut aussi être comparé à un getter de propriété qui, de par sa conception, exécute du code afin de renvoyer une valeur tout en ayant la forme d'interface qui ressemble davantage à une variable, mais possède également un comportement polymorphe en permutant le pointeur de fonction qui évaluerait et renverrait une valeur au moment de l'exécution en fonction des caractéristiques de compilation ou de l'environnement. 

4
Jon Davis

J'étais bouleversé de ne trouver aucune définition «informatique» générale de ce terme qui corresponde à son utilisation de facto telle que je la connaissais historiquement. Je me souviens de la première rencontre réelle dans laquelle il s’appelait réellement dans les jours OS/2 et la transition de 16 à 32 bits. Il semble que "thunking" ressemble à de l'ironie dans son application aujourd'hui.

Ma compréhension générale est que le thunk est une routine de bouts qui ne fait rien ou ne traverse aucune 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 abandonné d'un environnement à un autre en faisant (métaphoriquement/comme une comparaison) un son "thunk".

4
仁 人 卷

Selon la définition de { Kyle Simpson }, un thunk est un moyen d'extraire le composant de time à partir de code asynchrone.