¿Qué es un 'thunk'?

130

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?

fbrereto
fuente
10
Al igual que un FYI, un thunk también se llama a veces 'trampolín' (en el caso general, tal vez no en el dominio C ++).
Michael Burr
@MichaelBurr, el único contexto que he visto usar el término "trampolín" es Desvíos y en ese contexto un trampolín no es un truco.
user34660
1
El término es el tipo de cosa que no tiene una definición específica, por lo que varía en definición.
user34660

Respuestas:

132

A thunkgeneralmente se refiere a un pequeño fragmento de código que se llama como una función, hace algo pequeño y luego se JUMPdesplaza 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, thunkse 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 thispuntero para que apunte al lugar correcto. A thunkpuede 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 thunkpuede 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.

Chris Dodd
fuente
13
Esta es la mejor explicación, porque explica lo que el procesador está en lugar de lo que normalmente lo hace en casos de uso típicos para poner en práctica las cosas diferentes. Otras respuestas se centran demasiado en esas implementaciones particulares en lugar de la idea general.
SasQ
No estoy seguro acerca de otros compiladores, pero Visual Studio en particular parece ser muy aficionado a los thunks. Que yo sepa, utiliza: thunks de ajuste (para ajustar 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), vcallthunks (para asegurarse de puntero a -miembro-funciones funcionan correctamente con funciones virtuales), vtordispthunks (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
Justin Time - Vuelva a instalar Mónica
funciones del código nativo ISO C ++), y algo llamado " 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 thunkno; Descartes estaría orgulloso.
Justin Time - Restablece a Monica el
80

La palabra thunk tiene al menos tres significados relacionados en informática. Un "golpe" puede ser:

  • un fragmento de código para realizar un cálculo retrasado (similar a un cierre)
  • Una característica de algunas implementaciones de tablas de funciones virtuales (similar a una función de contenedor)
  • un mapeo de datos de la máquina de un formulario específico del sistema a otro, generalmente por razones de compatibilidad

Usualmente lo he visto usado en el tercer contexto.

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

Robert Harvey
fuente
3
Interesante; Por lo general, escucho la segunda forma, pero creo que depende de qué tipo de trabajo hagas con más frecuencia
Michael Mrozek
Específicamente, relacionado con la generación automática de bloques muy cortos de código de máquina, incluso el primer caso normalmente solo está dando contexto a una función de implementación precompilada.
Simon Buchan
21

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".

Ivan Godard
fuente
2
Gracias por la etimología. Odio los términos de programación cuya definición parece ser una búsqueda arbitraria en una tabla.
Ross Rogers
7

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.

Jerry Coffin
fuente
2
Suena como lo opuesto al azúcar sintáctico para mí :)
Laserallan
2
¿Azúcar sintáctico para compiladores entonces? Casi, pero no del todo, completamente diferente del azúcar sintáctico.
Duncan
2
¿Quizás un sourener sintáctico?
Justin Time - Restablece a Monica el
7

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.

Jon Davis
fuente
5

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".

仁 人 卷
fuente
1
Consejo interesante También me preguntaba acerca de la etimología real de esta palabra, e imaginé a personas tocando "telégrafo de bush", donde una de las personas en la corriente en silencio (y en muchos casos sin saberlo) transforma el mensaje en el camino.
SasQ
5

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í)

MusiGenesis
fuente
1

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.

Ivan Godard
fuente
0

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.

l --''''''--------- '' '' '' '' '' ''
fuente