Lo he visto usado en programación (específicamente en el dominio C ++) y no tengo idea de qué es. Presumiblemente es un patrón de diseño, pero podría estar equivocado. ¿Alguien puede dar un buen ejemplo de un thunk?
Lo he visto usado en programación (específicamente en el dominio C ++) y no tengo idea de qué es. Presumiblemente es un patrón de diseño, pero podría estar equivocado. ¿Alguien puede dar un buen ejemplo de un thunk?
Respuestas:
A thunk
generalmente se refiere a un pequeño fragmento de código que se llama como una función, hace algo pequeño y luego se JUMP
desplaza a otra ubicación (generalmente una función) en lugar de regresar a la persona que llama. Suponiendo que el objetivo JUMP es una función normal, cuando regrese, volverá a la persona que llama.
Thunks se puede usar para implementar muchas cosas útiles de manera eficiente
traducción de protocolo: cuando se llama desde un código que usa una convención de llamada a un código que usa una convención de llamada diferente, thunk
se puede usar a para traducir los argumentos adecuadamente. Esto solo funciona si las convenciones de retorno son compatibles, pero ese suele ser el caso
manejo de funciones virtuales: cuando se llama a una función virtual de una clase base heredada múltiplemente en C ++, debe haber una reparación del this
puntero para que apunte al lugar correcto. A thunk
puede hacer esto.
cierres dinámicos: cuando crea un cierre dinámico, la función de cierre debe poder llegar al contexto en el que se creó. Se thunk
puede construir un pequeño (generalmente en la pila) que configura la información de contexto en algunos registros y luego salta a un código estático que implementa la función de cierre. El thunk aquí proporciona efectivamente uno o más argumentos adicionales ocultos a la función que no proporciona el sitio de llamadas.
this
), cierres de constructor por defecto / copia (para una mejor integración CRT de los proporcionados por el usuario con parámetros predeterminados, principalmente para la exportación de DLL o la construcción de matrices), vcall
thunks (para asegurarse de puntero a -miembro-funciones funcionan correctamente con funciones virtuales), vtordisp
thunks (para clases que heredan y anulan funciones virtuales de bases virtuales, y también tienen ctors y / o dtors proporcionados por el usuario), envoltorios nativos (para llamar a C ++ / CLI administrado
UDT returning
" (que parece ser un truco para ajustar los tipos definidos por el usuario devueltos por los operadores, pero no estoy seguro de cómo generarlo; creo que está en desuso). Probablemente hay otros también. Supongo que nunca se puede decir que Microsoft thunk
no; Descartes estaría orgulloso.
La palabra thunk tiene al menos tres significados relacionados en informática. Un "golpe" puede ser:
Usualmente lo he visto usado en el tercer contexto.
El término thunk originalmente se refería al mecanismo utilizado por la implementación del Royal Radar Establishment de pass-by-name en su compilador Algol60 . En general, se refiere a cualquier forma de inducir un comportamiento dinámico cuando se hace referencia a un objeto aparentemente estático. El término fue inventado por Brian Wichmann, quien cuando se le pidió que explicara el paso por nombre dijo: "Bueno, sales a cargar el valor de la memoria y luego, de repente, estás evaluando una expresión".
Thunks se han puesto en hardware (cf. KDF9, mainframes de Burroughs). Hay varias formas de implementarlas en software, todas muy específicas de máquina, lenguaje y compilador.
El término ha llegado a generalizarse más allá de pasar por nombre, para incluir cualquier situación en la que una referencia de datos aparentemente o nominalmente estática induzca un comportamiento dinámico. Los términos relacionados incluyen "trampolín" y "futuro".
Algunos compiladores para lenguajes orientados a objetos como C ++ generan funciones llamadas "thunks" como una optimización de llamadas a funciones virtuales en presencia de herencia múltiple o virtual.
Tomado de: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
Hay una considerable variación en el uso. Casi universalmente, un thunk es una función que es (al menos conceptualmente) inusualmente pequeña y simple. Por lo general, es un tipo de adaptador que le brinda la interfaz correcta para algo u otro (algunos datos, otra función, etc.) pero al menos se ve que hace poco más.
Es casi como una forma de azúcar sintáctica, excepto que (al menos como se usa habitualmente) se supone que el azúcar sintáctico hace que las cosas se vean como el lector humano quiere verlas, y un truco es hacer que algo se vea como el compilador quiere Míralo.
Esta pregunta ya se ha hecho en SO, ver:
¿Qué es un 'thunk', como se usa en Scheme o en general?
Por lo que puedo decir, es similar a una declaración lambda, donde es posible que no desee devolver el valor hasta que necesite evaluarlo; o también se puede comparar con un captador de propiedades que, por diseño, ejecuta un código para devolver un valor y, al mismo tiempo, tiene la forma de interfaz que se parece más a una variable, pero también tiene un comportamiento polimórfico que puede intercambiarse ya sea por herencia o intercambiando el puntero de función que evaluaría y devolvería un valor en tiempo de ejecución basado en características de tiempo de compilación o ambientales.
Estaba angustiado por no encontrar una definición general de "informática" de este término que coincida con su uso de facto, tal como lo he conocido históricamente. El primer encuentro de la vida real que puedo recordar donde realmente se llamó fue en los días OS / 2 y la transición de 16-32 bits. Parece que "thunking" es como ironía en su aplicación hoy.
Mi comprensión general aproximada es que el thunk es una rutina de código auxiliar que simplemente no hace nada o enruta a través de algún límite fundamental en especie entre sistemas como en los casos históricos mencionados.
Entonces, el sentido es como una sinestesia de ser arrojado de un ambiente al otro haciendo (metafóricamente / como símil) un sonido "thunk".
Voy a buscar esto, pero pensé que thunking era el proceso empleado por un procesador de 32 bits para ejecutar código heredado de 16 bits.
Solía usarlo como una analogía de cómo tienes que restringir qué tan rápido hablas y qué palabras usas cuando hablas con personas tontas.
Sí, está en el enlace de Wikipedia (la parte sobre 32 bits, no mi nerdalogía ).
https://en.wikipedia.org/wiki/Thunk
Gran parte de la literatura sobre thunks de interoperabilidad se relaciona con varias plataformas Wintel, incluidas MS-DOS, OS / 2, [8] Windows [9] [10] y .NET, y con la transición del direccionamiento de memoria de 16 bits a 32 bits. . A medida que los clientes han migrado de una plataforma a otra, los thunks han sido esenciales para admitir el software heredado escrito para las plataformas más antiguas.
(énfasis agregado por mí)
El primer uso de "thunk" que conozco es de finales de los años 50 en referencia a la evaluación de argumento de paso por nombre Algol60 en llamadas a funciones. Algol era originalmente un lenguaje de especificación, no un lenguaje de programación, y había algunas dudas sobre cómo se podía implementar el paso por nombre en una computadora.
La solución fue pasar el punto de entrada de lo que era esencialmente una lambda. Cuando la persona que llama evaluó el parámetro, el control fracasó - ¡golpe! - en el contexto de la persona que llama donde se evaluó la lambda y su resultado se convirtió en el valor del parámetro en la persona que llama.
En el hardware etiquetado, como las máquinas Burroughs, la evaluación era implícita: un argumento se podía pasar como un valor de datos como en el paso por valor ordinario, o por thunk para pasar por nombre, con diferentes etiquetas en los metadatos del argumento . Un hardware de operación de carga verificó la etiqueta y devolvió el valor simple o invocó automáticamente el procesador lambda.
Según la definición de Kyle Simpson , un thunk es una forma de abstraer el componente del tiempo fuera del código asincrónico.