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?
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?
Respostas:
A thunk
geralmente 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 this
ponteiro para que ele aponte para o lugar certo. A thunk
pode 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 thunk
pode 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.
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), vcall
thunks (para garantir que o ponteiro para -member-functions funcionam corretamente com funções virtuais), vtordisp
thunks (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
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 thunk
não; Descartes ficaria orgulhoso.
A palavra thunk tem pelo menos três significados relacionados em ciência da computação. Um "thunk" pode ser:
Eu geralmente o vi usado no terceiro contexto.
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".
Alguns compiladores para linguagens orientadas a objetos, como C ++, geram funções chamadas "thunks" como uma otimização de chamadas de funções virtuais na presença de herança múltipla ou virtual.
Retirado de: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
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.
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.
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".
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)
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.
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.