L'ottimizzazione di tutto il programma include (praticamente, almeno per C o C ++ e lingue simili) inlining across translation units , quindi a volte è (impropriamente) chiamato ottimizzazione del link-time (LTO), ma viene comunque eseguita dal compilatore anch'esso in esecuzione durante la fase di collegamento. BTW, LTO esisteva almeno dagli anni '90 (e probabilmente anche nel periodo mainframe, negli anni '70).
In pratica, compilatori recenti come GCC o Clang sono in grado di farlo, ad es con il -flto
flag di ottimizzazione (da passare, con qualche altro flag come -O2
, entrambi alla compilazione e al momento del collegamento a gcc
, clang
, g++
, clang++
ecc ...). Ciò funziona essenzialmente quasi duplicando lo sforzo di ottimizzazione: per ogni unità di traduzione, la rappresentazione interna del codice sorgente (ad esempio una sorta di GIMPLE per GCC ) viene generato anche in oggetto file s. Al momento del "link" tutte queste rappresentazioni sono ottimizzate di nuovo insieme. Quindi il tempo di compilazione complessivo (inclusa "ottimizzazione del link-time" che avviene nel compilatore ...) è quasi raddoppiato nella pratica.
Tuttavia, l'ottimizzazione link-time di solito non vale lo sforzo, dal momento che in pratica raddoppia il tempo di costruzione per ottenere solo poche percentuali di prestazioni in fase di esecuzione del programma compilato (ovviamente, ci sono eccezioni a questa regola di -thumb osservazione).
Compilatori per le lingue che hanno una nozione esplicita di moduli (e reificano la loro rappresentazione in una sorta di dati), o per omoiconico lingue, può anche ottimizzare l'intero programma in un modo diverso (avendo ancora una rappresentazione del codice dell'intero programma) . Esamina Stalin o PolyML (o anche Ocaml o Go o SBCL a volte) o CAIA o SELF per esempi.
(Non capisco perché i ricercatori abbiano chiamato il loro software prototipo "Stalin" .Questo nome è così disgustoso per me che non sono psicologicamente in grado di provare quel compilatore. Per i futuri accademici: per favore dai un nome al software!)