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?
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?
Risposte:
A di thunk
solito si riferisce a un piccolo pezzo di codice che viene chiamato come una funzione, fa qualche piccola cosa, e poi JUMP
s 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, è thunk
possibile 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 this
puntatore per farlo puntare al posto giusto. A thunk
può 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. È thunk
possibile 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.
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), vcall
thunk (per assicurarsi puntatore a -member-funzioni funzionano correttamente con le funzioni virtuali), vtordisp
thunk (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
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 thunk
no a Microsoft ; Cartesio sarebbe orgoglioso.
La parola thunk ha almeno tre significati correlati nell'informatica. Un "thunk" può essere:
Di solito l'ho visto usato nel terzo contesto.
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".
Alcuni compilatori per linguaggi orientati agli oggetti come C ++ generano funzioni chiamate "thunk" come ottimizzazione delle chiamate di funzioni virtuali in presenza di eredità multipla o virtuale.
Tratto da: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
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.
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.
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".
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)
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.
Secondo la definizione di Kyle Simpson , un thunk è un modo per sottrarre il componente del tempo al di fuori del codice asincrono.