Che cos'è un "thunk"?


131

L'ho visto usato in programmazione (in particolare nel dominio C ++) e non ho idea di cosa sia. Presumibilmente è un modello di progettazione, ma potrei sbagliarmi. Qualcuno può dare un buon esempio di thunk?


10
Proprio come una FYI, a volte un thunk è anche chiamato "trampolino" (nel caso generale, forse non nel dominio C ++).
Michael Burr,

@MichaelBurr, l'unico contesto che ho visto usare il termine "trampolino" è Detours e in quel contesto un trampolino non è un thunk.
user34660

1
Il termine è il tipo di cosa che non ha una definizione specifica, quindi varia nella definizione.
user34660

Risposte:


132

A di thunksolito si riferisce a un piccolo pezzo di codice che viene chiamato come una funzione, fa qualche piccola cosa, e poi JUMPs in un'altra posizione (di solito una funzione) invece di tornare al suo chiamante. Supponendo che il JUMP target sia una funzione normale, quando ritorna, tornerà al chiamante del thunk.

I thunk possono essere utilizzati per implementare molte cose utili in modo efficiente

  • traduzione del protocollo: quando si chiama dal codice che utilizza una convenzione di chiamata al codice che utilizza una convenzione di chiamata diversa, è thunkpossibile utilizzare a per tradurre gli argomenti in modo appropriato. Funziona solo se le convenzioni di ritorno sono compatibili, ma spesso è così

  • gestione delle funzioni virtuali: quando si chiama una funzione virtuale di una classe di base ereditata in modo multiplo in C ++, è necessario un aggiustamento del thispuntatore per farlo puntare al posto giusto. A thunkpuò farlo.

  • chiusure dinamiche: quando si crea una chiusura dinamica, la funzione di chiusura deve essere in grado di accedere al contesto in cui è stata creata. È thunkpossibile creare un piccolo (di solito nello stack) che imposta le informazioni di contesto in alcuni registri e quindi passa a un pezzo di codice statico che implementa la funzione di chiusura. Il thunk qui sta effettivamente fornendo uno o più argomenti extra nascosti alla funzione che non sono forniti dal sito di chiamata.


13
Questa è la migliore spiegazione, perché spiega quello che il thunk è invece di quello che di solito fa nei casi tipici di utilizzo di implementare cose diverse. Altre risposte si concentrano troppo su quelle implementazioni particolari anziché sull'idea generale.
SasQ

Non sono sicuro di altri compilatori, ma Visual Studio in particolare sembra amare molto i thunk. Per quanto ne so, utilizza: thunk di aggiustamento (per regolare this), chiusure predefinite / copia del costruttore (per una migliore integrazione CRT di quelli forniti dall'utente con parametri predefiniti, principalmente per l'esportazione di DLL o la costruzione di array), vcallthunk (per assicurarsi puntatore a -member-funzioni funzionano correttamente con le funzioni virtuali), vtordispthunk (per le classi che ereditano e sovrascrivono le funzioni virtuali da basi virtuali e dispongono anche di medici e / o dottori forniti dall'utente), involucri nativi (per chiamare C ++ / CLI gestiti
Justin Time - Ripristina Monica il

funzioni dal codice ISO C ++ nativo) e qualcosa chiamato " UDT returning" (che sembra essere un thunk per regolare i tipi definiti dall'utente restituiti dagli operatori, ma non sono sicuro di come generarlo; penso che sia deprecato). Probabilmente ce ne sono anche altri. Immagino che tu non possa mai dire di thunkno a Microsoft ; Cartesio sarebbe orgoglioso.
Justin Time - Ripristina Monica il

80

La parola thunk ha almeno tre significati correlati nell'informatica. Un "thunk" può essere:

  • un pezzo di codice per eseguire un calcolo ritardato (simile a una chiusura)
  • una caratteristica di alcune implementazioni della tabella delle funzioni virtuali (simile a una funzione wrapper)
  • una mappatura dei dati macchina da un modulo specifico del sistema a un altro, di solito per motivi di compatibilità

Di solito l'ho visto usato nel terzo contesto.

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


3
Interessante; Di solito ascolto la seconda forma, ma immagino che dipenda dal tipo di lavoro che fai più spesso
Michael Mrozek,

In particolare, correlato generando automaticamente blocchi molto brevi di codice macchina - anche il primo caso normalmente fornisce semplicemente contesto a una funzione di implementazione precompilata.
Simon Buchan,

21

Il termine thunk originariamente si riferiva al meccanismo utilizzato dall'implementazione del Royal Radar Establishment di pass-by-name nel loro compilatore Algol60 . In generale si riferisce a qualsiasi modo per indurre un comportamento dinamico quando si fa riferimento a un oggetto apparentemente statico. Il termine è stato inventato da Brian Wichmann, che quando gli è stato chiesto di spiegare il pass-by-name ha detto "Beh, esci per caricare il valore dalla memoria e poi all'improvviso - thunk - lì stai valutando un'espressione".

I thunk sono stati inseriti nell'hardware (cfr. KDF9, mainframe di Burroughs). Esistono diversi modi per implementarli nel software, tutti molto specifici per macchina, linguaggio e compilatore.

Il termine è diventato generalizzato oltre il pass-by-name, per includere qualsiasi situazione in cui un riferimento di dati apparentemente o nominalmente statico induca un comportamento dinamico. I termini correlati includono "trampolino" e "futuro".


2
Grazie per l'etimologia. Odio i termini di programmazione la cui definizione sembra essere una ricerca arbitraria in una tabella.
Ross Rogers,


7

C'è una notevole variazione nell'uso. Quasi universalmente, un thunk è una funzione (almeno concettualmente) insolitamente piccola e semplice. Di solito è una sorta di adattatore che ti dà l'interfaccia corretta per qualcosa o altro (alcuni dati, un'altra funzione, ecc.) Ma almeno è visto come fare poco altro.

È quasi come una forma di zucchero sintattico, tranne per il fatto che lo zucchero sintattico (almeno come normalmente usato) dovrebbe far sembrare le cose come il lettore umano vuole vederle, e un thunk è fare in modo che qualcosa sembri come vuole il compilatore Guardalo.


2
Mi sembra il contrario dello zucchero sintattico :)
Laserallan,

2
Zucchero sintattico per i compilatori allora? Quasi, ma non del tutto, completamente diverso dallo zucchero sintattico.
Duncan,

2
Forse un sourger sintattico?
Justin Time - Ripristina Monica il

7

Questa domanda è già stata posta su SO, vedere:

Che cos'è un "thunk", come utilizzato nello schema o in generale?

Da quello che posso dire, è simile a un'istruzione lambda, in cui potresti non voler restituire il valore fino a quando non è necessario valutarlo; oppure può anche essere paragonato a un getter di proprietà che di progettazione esegue del codice per restituire un valore pur avendo la forma dell'interfaccia che si presenta più come una variabile, ma ha anche un comportamento polimorfico che può essere scambiato per eredità o scambiando il puntatore a funzione che valuterebbe e restituire un valore in fase di esecuzione in base al tempo di compilazione o alle caratteristiche ambientali.


5

Ero angosciato nel non trovare una definizione generale di "informatica" di questo termine che corrispondesse al suo utilizzo di fatto come storicamente noto a me. Il primo incontro nella vita reale che posso ricordare dove è stato effettivamente chiamato che era nei giorni OS / 2 e la transizione a 16-32 bit. Sembra che il "thunking" sia come l'ironia nella sua applicazione oggi.

La mia comprensione generale approssimativa è che il thunk è una routine stub che non fa nulla o attraversa un confine fondamentale in natura tra i sistemi come nei casi storici citati.

Quindi il senso è come una sinestesia di essere lasciato cadere da un ambiente all'altro rendendo (metaforicamente / come una similitudine) un suono "thunk".


1
Suggerimento interessante. Mi stavo chiedendo della vera etimologia di questa parola, e immaginavo che le persone giocassero a "bush telegraph", dove una delle persone nel flusso silenziosamente (e in molti casi inconsapevolmente) trasforma il messaggio sulla strada.
SasQ,

5

Lo cercherò, ma ho pensato al tonfo fosse il processo impiegato da un processore a 32 bit per eseguire il codice legacy a 16 bit.

Lo usavo come un'analogia per come devi limitare la velocità con cui parli e quali parole usi quando parli con persone stupide.

Sì, è nel link di Wikipedia (la parte a 32 bit, non il mio nerdalogia ).

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

Gran parte della letteratura sui thunk di interoperabilità riguarda varie piattaforme Wintel, tra cui MS-DOS, OS / 2, [8] Windows [9] [10] e .NET, e il passaggio dall'indirizzamento della memoria da 16 bit a 32 bit . Poiché i clienti sono migrati da una piattaforma all'altra, i thunk sono stati essenziali per supportare il software legacy scritto per le piattaforme più vecchie.

(enfasi aggiunta da me)


1

Il primo uso di "thunk" che conosco risale alla fine degli anni '50 in riferimento alla valutazione dell'argomento pass-by-name Algol60 nelle chiamate di funzione. Algol era originariamente un linguaggio di specifica, non un linguaggio di programmazione, e c'erano alcune domande su come il pass-by-name potesse essere implementato su un computer.

La soluzione era passare il punto di ingresso di quello che era essenzialmente un lambda. Quando la chiamata ha valutato il parametro, il controllo è passato attraverso - thunk! - nel contesto del chiamante in cui è stata valutata la lambda e il suo risultato è diventato il valore del parametro nella chiamata.

Nell'hardware con tag, come le macchine Burroughs, la valutazione era implicita: un argomento poteva essere passato come valore di dati come nel valore pass-by ordinario, o thunk come pass-by-name, con tag diversi nei metadati dell'argomento . Un hardware per l'operazione di caricamento ha verificato il tag e ha restituito il valore semplice o richiamato automaticamente il thunk lambda.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.