• [^] # 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é à 4.

    Non, ce n'est pas imprécis. tu dis que les langages impératifs ne permettent pas l'optimisation des fonctions récursives terminales.

    Le problème c’est que ce n’ai pas une question d’optimisation mais de validité.

    En Erlang le code

    loop() ->
     receive 
     Msg -> affiche(Msg) ; loop()
     end

    est valable ; c’est garantie par le langage que la pile n’explosera pas. En C ce n’est pas garantie. Ça change absolument tout ! Le code ne sera pas plus rapide ou non en fonction de cette optimisation (à peine), il sera par contre correct ou buggé ! Un boucle infinie implémentée avec une fonction récursive terminale est un bug en C car certains compilateurs respectant la norme ou certaine optimisation planteront systématiquement sur ce bout de programme. Ce n’est plus une simple question d’optimisation, mais une question de validité.

    C’est imprécis parce que je n’ai jamais dit que c’était impossible de le faire en impératif, j’ai juste dit que c’était quelque-chose que, en pratique, on trouve dans les langages fonctionnels et pas impératifs. Et devine quoi, cette optimisation n’est quasiment jamais garantie par la norme des langage objet/impératif et quasiment systématiquement garantie par les celle des langages fonctionnel. Et pourquoi, parce que ce n’est pas vraiment important dans les premiers et fondamentale dans les seconds.