IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Récursivité d'une fonction à l'infini


Sujet :

JavaScript

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 483
    Points : 0
    Points
    0
    Par défaut Récursivité d'une fonction à l'infini
    Bonjour,

    j'ai lu sur le net que si on code un site avec une fonction récursive à l'infini (donc sans que les appels récursifs de la fonction ne s'arrêtent), l'ordinateur qui se connecte au site va au bout d'un moment ne plus avoir de mémoire et planter.

    Est ce vrai?
    Et lorsqu'il plante de cette façon comment le récupérer?

  2. #2
    Expert confirmé Avatar de AoCannaille
    Inscrit en
    Juin 2009
    Messages
    1 420
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 1 420
    Points : 4 765
    Points
    4 765
    Par défaut
    C'est possible, ça dépend de plein de trucs.

    Si tu parle de code coté serveur (php etc...), c'est le serveur qui va planter, pas l'ordi.
    Si tu parle coté client (javascript donc), c'est le navigateur qui va planter. dans le cas de firefox, dans son ensemble, dans le cas de chrome juste le site en question.

    Comment le récupérer? bah, il s'est rien passé de grave, sous windows tu aura une fenetre "firefox ne répond pas..." et puis voilà.


    Pour ta culture générale, il existe des langages (en général non utilisé dans le web) qui permettre la récursivité terminale et ne posent pas ce problème. Il s'agit en général de langage fonctionnels comme le F#, l'OCaml ou le haskell

  3. #3
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Tous les navigateurs modernes ont aussi des garde-fous qui limitent ce nombre de récursions et déclenchent une exception RangeError. Lorsque cette récursion est plus délicate à identifier, à cause d'asynchronisme ou de logique plus bas-niveau, ils affichent un message à l'utilisateur permettant de bloquer le script problématique.

    Démonstration: http://jsbin.com/detamuyaqo/edit?js,output

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 483
    Points : 0
    Points
    0
    Par défaut
    Je sais que chaque browser a une "stack" associé à son moteur de JS.
    Celle de safari a une capacité de 500, celle de chrome 21000.
    Le message d'erreur dont tu parles qui en fait à l'usage nous dit que cette stack est trop pleine, c'est, sauf erreur de ma part, car à chaque appel récursif une copie de chaque variable de la fonction est ajoutée dans cette "stack".
    il faut noter que le message d'erreur dont tu parles n'empêche pas le navigateur de planter comme on dit vulgairement.

  5. #5
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    C'est une call stack. Le chiffre max change si j'utilise une variable non locale, mais le principe est le même. Je ne connais pas le mode de fonctionnement interne qui détermine ce chiffre max.

    http://jsbin.com/ludoyunaku/1/edit?js,output

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 483
    Points : 0
    Points
    0
    Par défaut
    si je me connecte au lien que tu donnes sous firefox,max recursion est 174 245
    alors que sous chrome ça donne 17 843

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par abc.xyz Voir le message
    Celle de safari a une capacité de 500, celle de chrome 21000.
    Oui enfin je sais pas si la bataille des chiffres a un sens. Sous w8 en suivant le lien de SylvainPV j'obtiens firefox dernière version : 21000, chrome dernière version : 35000, et IE 10 : 49500. Vive les navigateurs obsolètes

    Sinon j'ai testé des scripts récursifs qui pouvaient arriver à occuper la presque totalité de la mémoire de l'ordinateur. A mon avis il doit également y avoir une protection faite par le système d'exploitation car le navigateur s'arrête toujours avant de faire planter l'ordinateur.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 483
    Points : 0
    Points
    0
    Par défaut
    Ce qui à mon avis vaut la peine d'être noté, peut être que vous jugerez ça stupide comme commentaire je sais pas..,c'est que au constat que l'on a fait dans ce post que le navigateur risquait planter dans le cas d'une fonction récursive infinie, et bien Sylvain est intervenu en disant que le navigateur affichait dans la console une erreur. Et donc je viens faire remarquer ici que le fait que le navigateur déclenche une erreur ne l'empêche pas pour autant de planter. Ce qui est remarquable pour moi car s'il déclenche une erreur cela devrait selon moi l'empêcher de planter, non? (oooops j'ai comme l'impression de dire une connerie)Ou alors c'est moi qui invente un lien qui n'existe pas entre ces deux choses (les erreurs et la possibilité de planter)?

  9. #9
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 664
    Points
    66 664
    Billets dans le blog
    1
    Par défaut
    Quoi qu'il en soit une boucle infinie en javascript n'est pas aussi dangereuse que la fusion du coeur d'une centrale nucléaire.
    Il suffit de rebooter le navigateur ou au pire de tuer la tâche.

  10. #10
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    @abc.xyz: mon navigateur n'a jamais planté avec les exemples que je t'ai passé. J'ai du mal à comprendre ton raisonnement. Les boucles infinies ne sont qu'une cause possible parmi des centaines pour entraîner un plantage.

  11. #11
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Il en faudrait vraiment beaucoup pour faire planter la machine, d'une part les navigateurs ouvre chaque onglet dans un processus séparé et thread safe, ce qui veux dire que même si la page de l'onglet plante ça n'impacte ni le navigateur, ni les autres onglets, d'autre part, le processeur lui même à plusieurs cœurs, si l'un se met à pomper 100% des ressources, les autres derrières sont toujours ok.

Discussions similaires

  1. Récursivité d'une fonction
    Par pongiste59 dans le forum Langage
    Réponses: 2
    Dernier message: 26/04/2010, 22h33
  2. Réponses: 18
    Dernier message: 21/10/2006, 19h10
  3. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo