O que é um 'thunk'?

130

Já o vi usado em programação (especificamente no domínio C ++) e não tenho ideia do que é. Presumivelmente, é um padrão de design, mas eu posso estar errado. Alguém pode dar um bom exemplo de um thunk?

fbrereto
fonte
10
Assim como um FYI, um thunk também é chamado de 'trampolim' (no caso geral, talvez não no domínio C ++).
Michael Burr
@ MichaelBurr, o único contexto que vi o termo "trampolim" usado é o desvio e, nesse contexto, um trampolim não é uma brincadeira.
usar o seguinte comando
1
O termo é o tipo de coisa que não possui uma definição específica, portanto varia de definição.
usar o seguinte comando

Respostas:

132

A thunkgeralmente se refere a um pequeno pedaço de código chamado de função, faz alguma coisa pequena e depois JUMPé para outro local (geralmente uma função) em vez de retornar ao chamador. Supondo que o destino JUMP seja uma função normal, quando retornar, ele retornará ao chamador da conversão.

Os thunks podem ser usados ​​para implementar muitas coisas úteis com eficiência

  • tradução de protocolo - ao chamar de código que usa uma convenção de chamada para código que usa uma convenção de chamada diferente, um thunk pode ser usado para converter os argumentos adequadamente. Isso funciona apenas se as convenções de retorno forem compatíveis, mas esse geralmente é o caso

  • manipulação de função virtual - ao chamar uma função virtual de uma classe base herdada de multiplicação em C ++, é necessário haver uma correção do thisponteiro para que ele aponte para o lugar certo. A thunkpode fazer isso.

  • fechamentos dinâmicos - quando você cria um fechamento dinâmico, a função de fechamento precisa estar no contexto em que foi criada. Um pequeno thunkpode ser construído (geralmente na pilha) que configura as informações de contexto em alguns registradores e depois pula para um pedaço de código estático que implementa a função do fechamento. A conversão aqui está efetivamente fornecendo um ou mais argumentos extras ocultos para a função que não são fornecidos pelo site de chamada.

Chris Dodd
fonte
13
Esta é a melhor explicação, porque ele explica o que a conversão é em vez do que normalmente faz em casos de uso típicos para implementar coisas diferentes. Outras respostas se concentram demais nessas implementações específicas, em vez da ideia geral.
SasQ
Não tenho certeza sobre outros compiladores, mas o Visual Studio em particular parece gostar muito de thunks. Que eu saiba, ele usa: thunks do ajustador (para ajustar this), fechamentos de construtor padrão / cópia (para uma melhor integração CRT dos fornecidos pelo usuário com parâmetros padrão, principalmente para exportação DLL ou construção de matrizes), vcallthunks (para garantir que o ponteiro para -member-functions funcionam corretamente com funções virtuais), vtordispthunks (para classes que herdam e substituem funções virtuais de bases virtuais e também possuem ctors e / ou dtors fornecidos pelo usuário), wrappers nativos (para chamar C ++ / CLI gerenciado
Justin Time Reintegrar Monica
funções do código ISO C ++ nativo) e algo chamado " UDT returning" (que parece ser uma opção para ajustar os tipos definidos pelo usuário retornados pelos operadores, mas não tenho certeza de como gerá-lo; acho que está obsoleto). Provavelmente existem outros também. Eu acho que você nunca pode dizer que a Microsoft thunknão; Descartes ficaria orgulhoso.
Justin Time - Restabelece Monica
80

A palavra thunk tem pelo menos três significados relacionados em ciência da computação. Um "thunk" pode ser:

  • um pedaço de código para executar um cálculo atrasado (semelhante a um fechamento)
  • um recurso de algumas implementações da tabela de funções virtuais (semelhante a uma função de wrapper)
  • um mapeamento de dados da máquina de um formulário específico do sistema para outro, geralmente por motivos de compatibilidade

Eu geralmente o vi usado no terceiro contexto.

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

Robert Harvey
fonte
3
Interessante; Eu costumo ouvir a segunda forma, mas eu acho que depende que tipo de trabalho que você faz com mais frequência
Michael Mrozek
Especificamente, relacionado ao ser gerado automaticamente blocos muito curtos de código de máquina - mesmo o primeiro caso normalmente está apenas dando contexto a uma função de implementação pré-compilada.
Simon Buchan
21

O termo thunk se referia originalmente ao mecanismo usado pela implementação do Royal Radar Establishment de passagem por nome em seu Algol60 compilador . Em geral, refere-se a qualquer maneira de induzir comportamento dinâmico ao fazer referência a um objeto aparentemente estático. O termo foi inventado por Brian Wichmann, que, quando solicitado a explicar o pass-by-name, disse: "Bem, você sai para carregar o valor da memória e, de repente - pensa - aí está avaliando uma expressão".

Thunks foram colocados no hardware (cf. KDF9, mainframes da Burroughs). Existem várias maneiras de implementá-los em software, todos muito específicos para máquinas, idiomas e compiladores.

O termo passou a ser generalizado além da senha, para incluir qualquer situação na qual uma referência de dados aparentemente ou nominalmente estática induza um comportamento dinâmico. Termos relacionados incluem "trampolim" e "futuro".

Ivan Godard
fonte
2
Obrigado pela etimologia. Odeio termos de programação cuja definição parece ser uma pesquisa arbitrária em uma tabela.
Ross Rogers
7

Há uma variação considerável no uso. Quase universalmente, um thunk é uma função (pelo menos conceitualmente) extraordinariamente pequena e simples. Geralmente, é algum tipo de adaptador que fornece a interface correta para algo (outros dados, outra função etc.), mas é pelo menos visto como fazendo pouco mais.

É quase como uma forma de açúcar sintático, exceto que (pelo menos como costuma ser usado), o açúcar sintático deve fazer as coisas parecerem da maneira que o leitor humano deseja vê-las, e um problema é fazer algo parecer da maneira que o compilador deseja. Veja.

Jerry Coffin
fonte
2
Soa como o oposto do açúcar sintático para me :)
Laserallan
2
Açúcar sintático para compiladores, então? Quase, mas não exatamente, totalmente diferente do açúcar sintático.
Duncan
2
Talvez um agente sintático?
Justin Time - Restabelece Monica
7

Esta pergunta já foi feita no SO, consulte:

O que é um 'thunk', usado no esquema ou em geral?

Pelo que sei, é semelhante a uma instrução lambda, na qual você pode não querer retornar o valor até precisar avaliá-lo; ou também pode ser comparado a um getter de propriedade que, por padrão, executa algum código para retornar um valor e ainda possui o formulário de interface que se parece mais com uma variável, mas também possui um comportamento polimórfico que pode ser trocado por herança ou trocando o ponteiro de função que avaliaria e retornaria um valor em tempo de execução com base no tempo de compilação ou nas características ambientais.

Jon Davis
fonte
5

Fiquei angustiado por não encontrar uma definição geral de "ciência da computação" desse termo que correspondesse ao seu uso de fato, conhecido historicamente por mim. O primeiro encontro na vida real que me lembro de onde foi realmente chamado nos dias do OS / 2 e na transição de 16 a 32 bits. Parece que "thunking" é como ironia em sua aplicação hoje.

Meu entendimento geral aproximado é que o thunk é uma rotina de stub que simplesmente não faz nada ou direciona alguma fronteira fundamental em espécie entre sistemas, como nos casos históricos mencionados.

Portanto, o sentido é como uma sinestesia de ser abandonado de um ambiente para outro, fazendo (metaforicamente / como um símile) um som "thunk".

仁 人 卷
fonte
1
Dica interessante. Também estava pensando na etimologia atual dessa palavra e imaginei pessoas tocando "telégrafo de mato", onde uma das pessoas no fluxo silenciosamente (e em muitos casos sem saber) transforma a mensagem no caminho.
SasQ
5

Vou procurar isso, mas pensei em bater era o processo empregado por um processador de 32 bits para executar código herdado de 16 bits.

Eu costumava usá-lo como uma analogia de como você deve restringir a rapidez com que fala e quais palavras usa quando fala com pessoas burras.

Sim, está no link da Wikipedia (a parte sobre 32 bits, não minha nerdalogia ).

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

Grande parte da literatura sobre thunks de interoperabilidade refere-se a várias plataformas Wintel, incluindo MS-DOS, OS / 2, [8] Windows [9] [10] e .NET, e à transição do endereçamento de memória de 16 bits para 32 bits . Como os clientes migraram de uma plataforma para outra, os thunks foram essenciais para dar suporte ao software legado criado para as plataformas mais antigas.

(ênfase adicionada por mim)

MusiGenesis
fonte
1

O uso mais antigo de "thunk" que conheço é do final dos anos 50, em referência à avaliação de argumento de passagem por nome do Algol60 em chamadas de função. Algol era originalmente uma linguagem de especificação, não uma linguagem de programação, e havia alguma dúvida sobre como a passagem por nome poderia ser implementada em um computador.

A solução foi passar pelo ponto de entrada do que era essencialmente um lambda. Quando o receptor avaliou o parâmetro, o controle caiu - thunk! - no contexto do chamador em que o lambda foi avaliado e seu resultado se tornou o valor do parâmetro no chamado.

Em hardware marcado, como as máquinas Burroughs, a avaliação estava implícita: um argumento poderia ser passado como um valor de dados como no valor por valor ordinário, ou por thunk para valor por nome, com diferentes tags nos metadados do argumento . Um hardware de operação de carregamento verificou a tag e retornou o valor simples ou invocou automaticamente o thunk lambda.

Ivan Godard
fonte
0

De acordo com a definição de Kyle Simpson , um thunk é uma maneira de abstrair o componente do tempo limite do código assíncrono.

eu--''''''---------''''''''''''
fonte