« Initiation au Lua avec Scribunto/Gestion de l'environnement » : différence entre les versions

Contenu supprimé Contenu ajouté
m Robot : Remplacement de texte automatisé (-d'avoir +d’avoir)
m Robot : Remplacement de texte automatisé (-qu'il +qu’il)
Ligne 16 :
 
==== Exposé du problème ====
Lorsqu'on fait un programme pour notre usage personnel, on sait généralement ce qu'ilqu’il contient et on peut alors l'utiliser correctement. Si ce programme est destiné à être utilisé par quelqu'un d'autre, alors on n'est pas sûr que l'autre utilisateur aura bien compris comment marche le programme. L'utilisateur va, peut-être, faire des erreurs en l'utilisant. Le bon programmeur doit être capable d'anticiper toutes les erreurs qu'un utilisateur peut faire et doit prévoir, dans son programme, des instructions pour permettre au programme de réagir correctement en cas d'erreur d'utilisation.
 
Prenons un exemple :
Ligne 147 :
== Rapidité d'exécution d'un programme ==
 
En informatique, un programme, bien qu'ilqu’il s'exécute correctement, peut ne pas donner entièrement satisfaction si son exécution ne se fait pas assez rapidement. Nous n'avons pas évoqué le problème jusqu'à maintenant, mais le programmeur doit garder présent à l'esprit que son programme doit s'exécuter le plus rapidement possible pour éviter de trop monopoliser la machine qui exécute son programme. Bien souvent, pour exécuter une tache particulière, plusieurs solutions s'offrent à nous. Nous devons alors choisir, parmi toute les solutions possibles, celle dont le temps d’exécution sera le plus bref possible. Prenons un exemple :
 
Supposons que nous voulions écrire une fonction qui nous renvoie la valeur du polynôme p(x) = 7x<sup>4</sup>+5x<sup>3</sup>+3x<sup>2</sup>+x+2. Une première façon d'écrire cette fonction pourrait être :
Ligne 165 :
Cette façon d'écrire le programme, bien que fonctionnant parfaitement, n'est pas correcte. Pourquoi ?
 
En fait, lorsqu'on écrit '''frame.args[1]''', on fait appel à la valeur de x que nous a fourni l'utilisateur dans la commande #invoke et qui est donc quelque chose d'extérieur au programme. Allez chercher cette valeur met en œuvre des routines qui sont, à elles seules, des programmes qu'ilqu’il faut appeler et exécuter. tout cela demande du temps. On comprend donc aisément qu'écrire quatre fois '''frame.args[1]''' va demander un temps d'exécution plus long que si l'on ne l'écrivait qu'une seule fois. Il est donc bien préférable d'écrire la fonction en s'arrangeant pour n'avoir qu'une seule exécution de '''frame.args[1]'''. À la première façon d'écrire le programme, nous préférerons donc la deuxième façon suivante :
 
<syntaxhighlight lang="lua">
Ligne 180 :
</syntaxhighlight>
 
On pourrait, à ce niveau, être satisfait, de notre programme et penser que l'on a la meilleure façon possible de l'écrire. En fait, il n'en est rien ! Il est encore possible d'améliorer le temps d'exécution de la fonction '''p.poly'''. Cette façon d'écrire un polynôme, en informatique, n'est pas correcte. Si nous comptons les multiplications et les additions, nous voyons qu'ilqu’il y a 9 multiplications et 4 additions. Peut-on imaginer une façon d'écrire un polynôme de façon à réduire le nombre d'opérations. Cela est possible en remarquant, tout simplement, que :
 
<math>7x^4+5x^3+3x^2+x+2 = x(7x^3+5x^2+3x+1)+2 = x(x(7x^2+5x+3)+1)+2 = x(x(x(7x+5)+3)+1)+2</math>
 
Si nous comptons le nombre de multiplication et d'addition dans l'expression x(x(x(7x+5)+3)+1)+2, nous voyons qu'ilqu’il y a 4 multiplications et 4 additions. Nous avons 5 multiplications de moins à faire dans la calcul de x(x(x(7x+5)+3)+1)+2 que dans la calcul de 7x<sup>4</sup>+5x<sup>3</sup>+3x<sup>2</sup>+x+2, d'où le gain de temps. Nous pouvons donc améliorer encore le temps d'exécution de la fonction '''p.poly''' en l'écrivant :
 
<syntaxhighlight lang="lua">