Qu'est-ce qu'un appel de queue?
En programmation informatique, un appel final est une situation spécifique du code source du programme dans laquelle une fonction, un sous-programme ou une procédure renvoie une valeur attendue en appelant une autre fonction au lieu de simplement transmettre une variable contenant la valeur de retour. Le nom lui-même indique que la fonction appelée pour calculer la valeur à renvoyer se trouve à la fin ou à la fin de la fonction qui l'appelle pour fournir une valeur de retour. Un appel final intéresse certains programmeurs car, avec certaines optimisations ou certains comportements du compilateur, aucun espace de pile supplémentaire n’est utilisé pour stocker les emplacements de code de la fonction principale; à la place, la fonction tail est utilisée pour générer les valeurs de retour renvoyées directement au point d'appel où la fonction d'origine a été appelée. L'utilisation d'un appel final est particulièrement utile dans les situations où la récursivité est utilisée, car la quantité d'espace de pile utilisée pour stocker les adresses des appelants dans les cas où les appels récursifs imbriquent très profondément pourrait s'épuiser rapidement et arrêter l'exécution du programme. Bien que les appels d'appels puissent contribuer à augmenter la vitesse, l'utilisation de la mémoire et l'efficacité du programme, ils peuvent également conduire à des restructurations du code source afin d'utiliser les appels de manière à rendre le débogage et le suivi difficiles, en particulier dans les cas de récursion.
L'existence d'un appel final est due en grande partie au fonctionnement de la pile d'appels dans la plupart des programmes informatiques et des architectures système. La pile, qui ressemble à une pile de plaques, est une structure de données premier entré, dernier sorti. Lorsqu'une fonction, un sous-programme ou une procédure est appelé, l'adresse à partir de laquelle l'appel est effectué, appelée trame de pile, est stockée dans la pile. Cela signifie qu'un programme qui appelle la fonction A, qui appelle ensuite la fonction B, aura deux cadres de pile, un pour la fonction B et un autre en dessous pour la fonction A. Une fois l'exécution de la fonction B terminée, son cadre de pile est extrait du haut de l'écran. pile et exécution retournent à la fonction A, dont le cadre est sorti de la pile à la fin, renvoyant enfin le contrôle de programme au point à partir duquel la première fonction a été appelée.
Lorsqu'un appel de fin est utilisé, l'instruction de retour dans une fonction utilise directement la valeur de retour d'une autre fonction en tant que données à envoyer au code appelant. Dans l'exemple ci-dessus, si la fonction A appelle la fonction B directement avec l'instruction return, un appel final a été formé. Au sein de la pile d'appels, au lieu de disposer d'un cadre de pile pour les fonctions A et B, la fonction B recevra l'adresse de retour de la fonction A et le cadre de pile de la fonction A sera affiché et éliminé, ce qui signifie que la fonction B renverra directement sa valeur de retour. à l'emplacement qui a appelé la fonction A sans avoir à passer d'abord le contrôle à la fonction a. Cela augmente la vitesse des appels de fonction et permet également de réduire la quantité d'informations dans la pile.
Les propriétés d'un appel de queue peuvent en faire une option très intéressante pour les fonctions récursives. Une fonction récursive est une fonction qui s’appelle de manière répétée pour calculer une valeur, comme cela peut être le cas lorsqu’on parcourt une structure de données de liste. Aucune trame de pile supplémentaire n'étant créée pour les appels de fonction imbriqués, des niveaux très élevés de récursivité peuvent être effectués en toute sécurité, sans risque immédiat de débordement de pile et de possibilité de terminer le programme.