Comment fonctionne le compilateur

Sujets variés concernant le développement en PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Comment fonctionne le compilateur

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

ça n'a rien de surprenant !
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Re: Comment fonctionne le compilateur

Message 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 ??
"Qui baise trop bouffe un poil." P. Desproges
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message 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.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message 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.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

OK, c'est pas mal quand même :D

donc pour le moment, regrouper les constantes et hop :wink:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre