• [^] # Re: C'est pourtant évident.

    Posté par (site web personnel) . En réponse à la dépêche Coder efficacement, bonnes pratiques et erreurs à éviter. Évalué à 2.

    Non ce n’est pas valide ! Un code valide c’est un code qui marche pour tout les compilateurs qui satisfont la norme ; pas seulement quelqu’un ! Et ce code à clairement un fuite mémoire sans l’implémentation de l’optimisation de la récursion terminale (ce qui est un bug).

    La transformation d’appel récursif vers une boucle est une optimisation dans le cas des langages impératifs (ce n’est pas dans la norme) mais une fonctionnalité dans les langages fonctionnelles (garantie par la norme). En théorie ça pourrait être différent, mais en pratique c’est ce que l’on observe.

    Cette différence de statut (fonctionnalité/optimisation) n’est pas un simple détail ! Elle change la façon dont on programme. En pratique personne ne programme en récursif en dehors des langages fonctionnels (en tout cas c’est minoritaire), ce n’est pas du tout l’esprit. Oui, tu peux faire du C avec des variables immutable, de la récursion et des pointeurs de fonction, mais ce n’est pas du tout l’esprit du langage.

    L’optimisation de la récursion terminale fait partie de l’esprit de la programmation fonctionnel, mais pas de celui de la programmation impérative. C’est la différence de statut, fondamentale dans un cas et accessoire chez l’autre qui à mon sens justifie de dire que l’optimisation de la récursion terminale est plus une optimisation de langage fonctionnel que de langage impératif. Certes c’est une opinion discutable (et cela ne sert à rien d’en discuter infiniment), mais c’est ce que l’on observe en pratique.