Skip to main content

O que é uma chamada de cauda?

Na programação de computadores, uma chamada final é uma situação específica no código-fonte do programa, na qual uma função, sub-rotina ou procedimento retorna um valor esperado chamando outra função em vez de simplesmente passar uma variável que mantém o valor de retorno. O próprio nome indica que a função chamada para calcular o valor a ser retornado está no final, ou final, da função que a chama para fornecer um valor de retorno. Uma chamada final é de interesse de alguns programadores porque, com certas otimizações ou comportamentos do compilador, nenhum espaço de pilha adicional é usado para armazenar locais de código da função principal; a função de cauda é usada para gerar os relatórios de valor de retorno diretamente de volta ao ponto de chamada em que a função original foi chamada. O uso de uma chamada final é particularmente útil em situações nas quais a recursão é empregada, porque a quantidade de espaço de pilha usada para armazenar os endereços dos chamadores nos casos em que as chamadas recursivas se aninham profundamente podem rapidamente esgotar e interromper a execução do programa. Embora o uso de chamadas de cauda possa ajudar a aumentar a velocidade, o uso da memória e a eficiência de um programa, também pode levar a situações nas quais o código-fonte é reestruturado para usar as chamadas de uma maneira que dificulta a depuração e o rastreamento, especialmente em casos de recursão.

A existência de uma chamada final é devida em grande parte à maneira como a pilha de chamadas funciona na maioria dos programas de computador e arquiteturas de sistema. A pilha, que é como uma pilha de placas, é uma estrutura de dados que entra e sai primeiro. Quando uma função, sub-rotina ou procedimento é chamada, o endereço a partir do qual a chamada é feita, chamada de quadro de pilha, é armazenado na pilha. Isso significa que um programa que chama a Função A, que depois chama a Função B, terá dois quadros de pilha, um para a Função B e outro abaixo para a Função A. Após a execução da Função B, seu quadro de pilha é exibido na parte superior do A pilha e a execução retornam à Função A, cujo quadro foi removido da pilha quando é concluído, retornando finalmente o controle do programa ao ponto em que a primeira função foi originalmente chamada.

Quando uma chamada final é usada, a instrução de retorno em uma função usa diretamente o valor de retorno de outra função como os dados a serem enviados para o código de chamada. No exemplo acima, se a Função A chamar a Função B diretamente com a instrução de retorno, uma chamada final será formada. Na pilha de chamadas, em vez de ter um quadro de pilha para as funções A e B, a Função B receberá o endereço de retorno da Função A e o quadro de pilha da Função A será acionado e descartado, o que significa que a Função B passará seu valor de retorno diretamente de volta para o local que chamou a Função A sem primeiro ter que passar o controle de volta para a Função A. Isso aumenta a velocidade das chamadas de função e ajuda a reduzir a quantidade de informações na pilha.

As propriedades de uma chamada de cauda podem torná-las uma opção muito atraente para funções recursivas. Uma função recursiva é aquela que se chama repetidamente para calcular um valor, como pode ser o caso ao percorrer uma estrutura de dados da lista. Nenhum quadro de pilha adicional é criado para as chamadas de função aninhadas; portanto, níveis muito profundos de recursão podem ser executados com segurança, sem a ameaça imediata de um estouro de pilha e possível encerramento do programa.