Codice C/C++ e istruzioni macchina


Questa pagina ha una gerarchia - Pagina madre:Programmazione

Home Forum Programmazione Codice C/C++ e istruzioni macchina

Questo argomento contiene 4 risposte, ha 2 partecipanti, ed è stato aggiornato da stegemma stegemma 7 mesi, 4 settimane fa.

Stai vedendo 5 articoli - dal 1 a 5 (di 5 totali)
  • Autore
    Articoli
  • #10978

    Ho scoperto oggi un sito interessante per verificare come il compilatore converta il codice C/C++ in istruzioni macchina. Sò che ci sono anche tool specifici per disassemblare gli eseguibili, ma mi ha stupito che fosse stato implementato un sito web per lo stesso scopo.
    È una bella scoperta che vale la pena condividere.
    Ecco l’indirizzo https://godbolt.org/

    Incredibile come i compilatori siano efficienti a riconoscere pezzi di codice che possono essere sostituiti con singole istruzioni macchina.

    #10980
    stegemma
    stegemma
    Moderatore

    Ma i compilatori sono stati scritti solo per sostituire pezzi di codice in singole istruzioni… per cui non c’è nulla di incredibile (sarebbe come stupirsi di come funzioni bene un cucchiaio, per bere il brodo!).

    #10981

    Chiedo scusa, mi sono spiegato probabilmente male io. Ti riporto un sesempio:

    
    #include <stdint.h>
    
    uint32_t bswap32(uint32_t x)
    {
       return x>>24 | x>>8 & 0xff00 | x<<8 & 0xff00 | x<<24;
    }
    
    uint64_t bswap64(uint64_t x)
    {
       return (uint64_t)bswap32(x)<<32 | bswap32(x>>32);
    }
    
    uint64_t ror(uint64_t x,uint64_t n)
    {
       return x>>n | x<<(64-n);
    }
    

    Sono tutte funzioni che scritte in C sono diverse istruzioni ma che il compilatore riesce a tradurre nelle rispettive istruzioni macchina.
    Io nel mio engine richiamavo l’istruzione assembly per le rotazioni, ora che so che il compilatore riesce a ricoscere quel tipo di istruzioni posso scrivere codice più portabile.
    Mi sembrava incredibile che il compilatore fosse così intelligente da comprendere quelle funzioni, tutto qua.

    #10982

    Scusa, bswap32 è così:

    
    uint32_t bswap32(uint32_t x)
    {
       return x>>24 | x>>8 & 0xff00 | x<<8 & 0xff0000 | x<<24;
    }
    
    #10999
    stegemma
    stegemma
    Moderatore

    Nel caso dello swap, si tratta di un’istruzione abbastanza comune, per cui potrebbero semplicemente aver aggiunto il riconoscimento del “template” di queste serie di istruzioni (credo più sul codice generato che direttamente dal C). Comunque sì, i compilatori di oggi sono anni luce avanti, rispetto a quelli del passato.

Stai vedendo 5 articoli - dal 1 a 5 (di 5 totali)

Devi essere loggato per rispondere a questa discussione.

© 2017 G 6 Tutti i diritti riservati - Buon divertimento!

By continuing to use the site, you agree to the use of cookies. more information

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi