I compilatori non ricoprono espressioni ricorrenti?

3

Un compilatore cerca espressioni ricorrenti per convertirlo in "funzione" per ridurre le dimensioni binarie e migliorare le prestazioni?

Ovviamente, la risposta ovvia potrebbe essere "alcuni lo fanno, altri no", quindi chiedo il compilatore del linguaggio mainstream, prendiamo ad esempio: compilatore Java SDK, compilatore GCC e Clang.

Se "sì, lo fanno", è frequente o nel caso specifico? (Un esempio di codice in cui accade in realtà potrebbe essere molto istruttivo)

    
posta anopse 22.09.2014 - 11:46
fonte

1 risposta

2

Non lo fanno.

Quello che stai cercando è il rilevamento dei cloni e la deduplicazione del codice automatica. Esistono molti strumenti per scoprire codice duplicato (alcuni abbastanza avanzati, vedi rilevatori di cloni basati su AST ) e un < a href="http://students.cis.uab.edu/tairasr/clones/literature/"> buona letteratura su questo argomento ma in genere solo due casi di duplicazione sono gestiti dal compilatore:

  • eliminazione della sottoespressione comune
  • vettorizzazione del codice

In ogni caso, considera che la duplicazione del codice è dannosa per la leggibilità / manutenibilità del codice sorgente non necessariamente per le prestazioni del codice compilato.

Alcune domande correlate sono:

Modifica

Alcuni linker possono eseguire la piegatura del codice identico ( ICF ): al link time, ICF rileva le funzioni con lo stesso codice oggetto e le unisce in una singola copia.

Ma

  • ICF può essere pericoloso in quanto può modificare il comportamento di runtime del codice che si basa su ciascuna funzione con un indirizzo univoco (C99 garantisce che gli indirizzi di due diverse funzioni non siano uguali; ++ 11 non è così chiaro ). ICF può essere utilizzato in una modalità sicura in cui identifica e ripiega funzioni i cui indirizzi sono garantiti che non sono stati utilizzati nelle operazioni di confronto. Inoltre, i binari di profiling e debugging con funzioni unite possono confondere, come i valori del PC delle funzioni unite non può essere sempre disambiguato per indicare la funzione corretta
  • questa è un'ottimizzazione un po '"passiva" con un ambito limitato: utile soprattutto per i modelli C ++.
risposta data 22.09.2014 - 23:58
fonte