La domanda è: quale compilatore è meglio e/o cosa è cambiato tra i compilatori in oggetto?
Questa domanda la pongo perchè recentemente mi è capitato di portare alcuni vecchi programmi di esempio da un sistema ad un altro e di ricompilarli. Premetto che il sistema su cui li avevo scritti (che per altro è quello che uso tutt'ora) è una SlackWare 10.2 con compilatore gcc 3.3.6.
I programmi (o meglio il programma visto che è solo uno che da il problema) l'ho portato sotto Mint 6 e ricompilato. Il programma molto semplificato è il seguente:
Codice: Seleziona tutto
/* Assurdo.c: */
#include <stdio.h>
#include <stdlib.h>
int main() {
int x;
srand(time());
printf("%i\n", (int)rand());
return 0;
}
1. Perchè in SlackWare 10.2 funziona senza passare nessun parametro?
2. Perchè in sia in Slack che in Mint il compilatore non mi dice che manca un parametro? e perchè se scrivo time(&x, &x, &x) non mi dice che di parametri ce ne sono troppi?
3. Cosa cambia nel codice effettivo?
Bene: mentre alle prime domande non ho risposta, alla terza ho disassemblato il codice del del programma con time(). Il risultato è stato questo:
Codice: Seleziona tutto
Mint 6:
0x0804eaa0 <time+0>: push %ebp
0x0804eaa1 <time+1>: mov %esp,%ebp
0x0804eaa3 <time+3>: mov 0x8(%ebp),%edx
0x0804eaa6 <time+6>: push %ebx
0x0804eaa7 <time+7>: xor %ebx,%ebx
0x0804eaa9 <time+9>: mov $0xd,%eax
0x0804eaae <time+14>: int $0x80
0x0804eab0 <time+16>: test %edx,%edx
0x0804eab2 <time+18>: je 0x804eab6 <time+22>
0x0804eab4 <time+20>: mov %eax,(%edx)
0x0804eab6 <time+22>: pop %ebx
0x0804eab7 <time+23>: pop %ebp
0x0804eab8 <time+24>: ret
Ma cosa succede allora in SlackWare 10.2? Bhè il codice è così:
Codice: Seleziona tutto
SlackWare:
0x0804e1a0 <time+0>: mov %ebx,%edx
0x0804e1a2 <time+2>: mov 0x4(%esp),%ebx
0x0804e1a6 <time+6>: mov $0xd,%eax
0x0804e1ab <time+11>: int $0x80
0x0804e1ad <time+13>: mov %edx,%ebx
0x0804e1af <time+15>: ret
Quindi ora riformulo la domanda iniziale: Perchè un compilatore + vecchio mi crea del codice più snello e (a mio dire) robusto, mentre il compilatore più nuovo mi genera codice meno ottimizzato? è cambiato qualche cosa a livello di librerie o di compilatore che non so?
Non so se sono stato chiaro, ma ad ogni modo grazie a tutti in anticipo x le eventuali spiegazioni
PS: Stavo per insultare Mint pesantemente insieme a ubuntu e a tutte le sue derivate, quando purtroppo tramite un conoscente ho provato a compilare il programma sotto SlackWare 12.2 e il problama c'è anche lì