Page 1 sur 1

Comment fonctionne le compilateur

Publié : ven. 16/avr./2004 15:03
par Le Soldat Inconnu
Salut

J'ai vu en réalisant mon code pour enregistrer des paramètres directement dans l'exe la chose suivante :

j'avais écrit

Code : Tout sélectionner

Txt.s = "Truc " + "Bidule"
et dans le code compilé, j'ai obtenu :
Truc Bidule
ce qui signifie que lorque qu'on fait une opération, elle est simplifié avant compilation

donc si j'écrits

Code : Tout sélectionner

Valeur = 5 + 2 * 4
c'est comme si j'écrivais :

Code : Tout sélectionner

Valeur = 13
Fred, peux-tu me confirmer ceci ?
Merci

Publié : ven. 16/avr./2004 16:02
par nico
ça n'a rien de surprenant !

Re: Comment fonctionne le compilateur

Publié : ven. 16/avr./2004 21:43
par KarLKoX
Le Soldat Inconnu a écrit : donc si j'écrits

Code : Tout sélectionner

Valeur = 5 + 2 * 4
c'est comme si j'écrivais :

Code : Tout sélectionner

Valeur = 13
Merci
On appel ca la précédence des opérateurs, je vois pas ce qui te choque ??

Publié : ven. 16/avr./2004 21:49
par Le Soldat Inconnu
ben, c'est juste que je simplifiait les opérations dans mes codes mais ça sert strictement à rien :)
moi, je savais pas que ça compilait comme ça :cry: vous êtes méchant avec moi :mrgreen:

Publié : lun. 19/avr./2004 11:14
par Fred
C'est exact, le compilateur se doit d'optimiser au maximum le code quand il le peut. C'est pas la précédence des opérateurs, mais plus généralement le regroupement des valeurs constantes, quand c'est possible. C'est y pas joli ? :wink:

Donc effectivement, ecrire: a = 1+1+2 est équivalent a écrire a = 4. C'est plutot pratique pour les constantes (vous l'utilisez implicitement pour OpenWindow par exemple: OpenWindow(0 , 0, 0, 100, 100, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Test"). Dans ce cas, les 2 constantes sont combinées en une seule valeur à la compilation.

Publié : lun. 19/avr./2004 17:04
par Le Soldat Inconnu
Merci :D

une autre question, si j'écrit RGB(122, 244, 23), est-ce que la fonction est simplifié ou pas ?
car dans ce cas, je ne peux pas écrire #Contante = RGB(122, 244, 23) ce qui est bien dommage
donc je suppose que le code n'est pas simplifié ici (ça doit être plus complexe à simplifié aussi, je pense, car on ne peux pas savoir à l'avance le comportement d'une fonction)

et encore une autre question :wink:
et si j'écrit A = 2 * B * 4 + 3 + 5
est-ce que c'est simplifié en A = 8 * B + 8 ?
car je me retrouve souvent dans ce cas de figure

Publié : lun. 19/avr./2004 22:41
par Fred
Pour l'instant, le code de RGB() n'est pas simplifié, mais il n'est pas du tout exclu de la remplacer par une macro du genre :

Code : Tout sélectionner

Macro RGB(a,b,c)
  a << 24 + b << 16 + c
EndMacro
quand elles seront dispo, ce qui voudra dire que ce sera remplacé par une valeur constante si tu utilises que des constantes.

Pour ta deuxieme question, je pensais que la reponse était oui, mais apparement le compilateur n'est pas si smart que ca, voila ce qu'il donne:

Code : Tout sélectionner

; A = 2 * B * 4 + 3 + 5
  MOV    ebx,dword [v_B]
  ADD    ebx,ebx
  SAL    ebx,2
  MOV    edi,ebx
  ADD    edi,8
  MOV    dword [v_A],edi
Bon, ca reste pas mal, mais il a pas su grouper les 2 constantes de multiplication. Je vais voir comment améliorer ca.

Par contre, si tu groupes les constantes:

Code : Tout sélectionner

; A = 2 * 4*B + 3 + 5
  MOV    ebx,dword [v_B]
  SAL    ebx,3
  MOV    edi,ebx
  ADD    edi,8
  MOV    dword [v_A],edi
La ca donne.

Publié : mer. 21/avr./2004 12:20
par Le Soldat Inconnu
OK, c'est pas mal quand même :D

donc pour le moment, regrouper les constantes et hop :wink: