Ethaniel :
En Asm, comme il n'y a pas de variables locales, on est oblige pour faire du recursif de passer par la pile et le pointeur (E)BP, mais la pile est d'une lenteur affligeante...
Enfin du moins, ca c'est pour les programmes a flux direct (*.com) ; pour les autres (*.exe, ...), je n'en sais rien ...
@++
Lionel Debroux :
C'est con de vouloir faire de l'itératif à tout prix quand la solution récursive est efficace, facile à écrire et à comprendre.
Quesoft a écrit :Il me semble que c'est bien le cas, mais je n'en connais pas assez sur l'assemblage d'un programme C pour l'affirmer ...Ethaniel :Et c'est pas la même pile qu'utilise le compilateur C lorsqu'il stack les appels de fonction ? Les variables locales sont allouées sur la pile également si je ne me trompe pas.
En Asm, comme il n'y a pas de variables locales, on est oblige pour faire du recursif de passer par la pile et le pointeur (E)BP, mais la pile est d'une lenteur affligeante...
Enfin du moins, ca c'est pour les programmes a flux direct (*.com) ; pour les autres (*.exe, ...), je n'en sais rien ...
@++
Ethaniel
:Quesoft a écrit :Il me semble que c'est bien le cas, mais je n'en connais pas assez sur l'assemblage d'un programme C pour l'affirmer ...Ethaniel :Et c'est pas la même pile qu'utilise le compilateur C lorsqu'il stack les appels de fonction ? Les variables locales sont allouées sur la pile également si je ne me trompe pas.
En Asm, comme il n'y a pas de variables locales, on est oblige pour faire du recursif de passer par la pile et le pointeur (E)BP, mais la pile est d'une lenteur affligeante...
Enfin du moins, ca c'est pour les programmes a flux direct (*.com) ; pour les autres (*.exe, ...), je n'en sais rien ...
@++
Cependant, la difference, c'est que l'utilisation des variables locales est hyper-simple en C, alors qu'en Asm, il faut bien connaitre le remplissage de la pile pour que (E)BP ne pointe pas a cote de ce que l'on voulait (savoir si c'est IP ou EIP qui est pushe, savoir si (E)CS l'est egalement, ...).
De plus, en C, le fait que la pile est utilisee pour les variables locales n'est pas grave, puisque ce n'est pas la vitesse que l'on cherche, alors qu'en Asm, on utilise la pile en extreme recours, lorsqu'il n'y a absolument aucun moyen de faire autrement (et il y a toujours moyen de faire autrement ...).
@++
Ethaniel :
alors qu'en Asm, on utilise la pile en extreme recours, lorsqu'il n'y a absolument aucun moyen de faire autrement (et il y a toujours moyen de faire autrement ...).
@++
Godzil :
et tout le monde ne fais pas de l'asm x86 (qui vaux rien du tout)
Pollux
:et il y a toujours moyen de faire autrement ...
Meme pour une fonction recursive ?![]()
Pollux a écrit :Oui : en creant sa propre pile indexee par (E)SI ou (E)DI dans la zone des donnees non initialisees, ce qui est un chouia plus rapide puisqu'il n'y a pas besoin de desentrelacer les variables avec (E)IP et (E)CS ...et il y a toujours moyen de faire autrement ...
Meme pour une fonction recursive ?![]()
Ethaniel
:Pollux a écrit :Oui : en creant sa propre pile indexee par (E)SI ou (E)DI dans la zone des donnees non initialisees, ce qui est un chouia plus rapide puisqu'il n'y a pas besoin de desentrelacer les variables avec (E)IP et (E)CS ...et il y a toujours moyen de faire autrement ...
Meme pour une fonction recursive ?![]()
Fondamentalement, dans l'esprit, c'est un peu la meme chose, mais bon...
Et l'Asm x86, sp00tramort !!!
@++
Comme beaucoup de gens ont un PC, c'est normal qu'ils commencent par le x86 lorsqu'ils veullent apprendre l'ASM...
Godzil
:Comme beaucoup de gens ont un PC, c'est normal qu'ils commencent par le x86 lorsqu'ils veullent apprendre l'ASM...
Je déconseille a quiqu'on qui veux apprend un asm propre (et meme comment penser/code en asm de débuter par du 8086 et dérivé, cet asm est completement pourri jusqu'a la moelle par les ajouts dans tout les sens lié a l'évolution du coeur x86 (d'ailleur la facon dont a évolué l'asm prouve qu'il etait plus que mal concu a la base, l'asm 68k a tres bien supporté l'évolution jusqu'au 68060, il en est de meme avec les ARM et auters PowerPC, l'évolution de l'asm n'est pas du bidouillage)
Ethaniel :
Si si, c'est plus efficace, puisque si tu fais push - call - pop ou push - return - pop, bam, game over (a cause de l'entrelacement)il ne faut pas poper, mais jouer avec (E)BP et return N, ce qui demande beaucoup d'attention et des cycles supplementaires pour la manipulation de (E)BP.
En plus, pour une pile maison, toutes les variables sont accollees, donc la mise en cache L2 est plus efficace, puisqu'elle se fait moins souvent.
Mais comme je le disais, dans l'esprit, c'est en effet un peu la meme chose ...
@++
Quesoft
: Ça a toujours été mon point : j'aime le récursif parce que c'est efficace, facile à écrire et à comprendre, pas parce que c'est plus performant (puisque ce n'est pas le cas).
Lionel Debroux :
D'une manière générale, je n'aime pas bien le récursif quand l'itératif est simple (et plus efficace: Fibonacci, factorielle, etc. mais pas bubble sort par rapport à mergesort et quicksort), je n'aime pas bien l'itératif quand le récursif est beaucoup plus simple (parsing, tours de Hanoï, parcours en profondeur d'un graphe, 8 reines, etc.).
Il faut savoir connaître et reconnaître les forces et faiblesses de chaque type, et utiliser au mieux.
squale92 :
à la limite, une conversation constructive sur la récursivité, c'est intéressant...
mais une connerie de Troll genre java vs C vs caml et autres, ça gave...