Le lunghe compilazioni sono una cosa del passato?

37

Esistono innumerevoli storie di guerra su quanto può richiedere una compilazione. Anche xkcd ne ha fatto menzione.

Ora, non ho programmato per molto tempo e sono stato esposto principalmente a Java e Python (e Python è un linguaggio interpretato, non compilato). Mi rendo conto che è possibile che non abbia incontrato progetti che richiedono molto tempo per essere compilati, ma anche per le app di dimensioni decenti, è stato per me istantaneo (di solito gestito in background da un IDE) o non ne ho presi più di 30 secondi o così per un progetto estremamente grande. Anche in un ambiente aziendale (dove si svolge il fumetto), non ho mai avuto il codice impiegare così tanto tempo per la compilazione.

Non sono stato esposto a progetti con lunghi tempi di compilazione? È una reliquia del passato che non è più qualcosa che accade nel giorno moderno? Perché una compilazione richiede così tanto tempo?

    
posta Thunderforge 27.09.2014 - 00:11
fonte

6 risposte

46

La compilazione può richiedere del tempo, specialmente per progetti di grandi dimensioni scritti in linguaggi come C, C ++ o Scala. La compilazione di parti in background può ridurre il tempo di compilazione, ma occasionalmente è necessario eseguire una compilazione nuova. I fattori che possono portare a tempi di compilazione lunghi includono:

  • Grandezza del codice, ovviamente. I progetti di grandi dimensioni avranno centinaia di migliaia di linee di codice.

  • Direttiva del preprocessore #include di C, che causa effettivamente la compilazione dello stesso codice centinaia di volte. Il sistema macro ha problemi simili, poiché funziona a livello di testo. Il preprocessore abbassa davvero le dimensioni del codice che è effettivamente passato al compilatore. Guardare un file dopo la pre-elaborazione (ad es. Tramite gcc -E ) dovrebbe aprire gli occhi.

  • I modelli di C ++ sono completi di Turing, il che significa che in teoria è possibile eseguire calcoli arbitrari in fase di compilazione. Nessuno vuole davvero farlo, ma anche molti casi semplici si aggiungono a un po 'di tempo dedicato alla specializzazione dei modelli.

  • Scala è un linguaggio abbastanza giovane, e il compilatore è terribilmente sottovalutato. Attualmente, il compilatore utilizza un numero molto elevato di passaggi di compilazione (C è progettato per richiedere solo due passaggi di compilazione). Typechecking è uno di questi passaggi e può richiedere del tempo a causa del complicato sistema di tipi descritto dalla lingua.

La compilazione non è l'unica cosa che richiede tempo. Dopo che il progetto è stato compilato, dovrebbe essere eseguita una suite di test. Il tempo trascorso su questo può variare da pochi secondi a un paio d'ore (se i test sono scritti male).

    
risposta data 27.09.2014 - 00:38
fonte
16

Non è affatto una reliquia del passato. Uno dei progetti su cui lavoro richiede 45 minuti per una ricostruzione pulita da zero. A parte il nostro codice, dobbiamo anche estrarre e compilare la sorgente da diverse grandi librerie C e C ++ da repository esterni. Compilare e collegare il codice C e C ++ è costoso dal punto di vista computazionale. Come si fa notare, Python viene tipicamente implementato come linguaggio interpretato, e in genere Java utilizza un compilatore JIT (Just in Time), quindi i progetti ignorano del tutto la compilazione iniziale e i costi di collegamento. Il prezzo che paghi è in tempi di avvio più lunghi e (per Python almeno) più lenta velocità di esecuzione.

Quando i tempi di costruzione diventano così lunghi diventa più importante sfruttare i sistemi di integrazione continua come Jenkins o TeamCity . Ciò consente ai singoli sviluppatori di (per lo più) di evitare la fatica di costruire da zero, pur continuando a verificare che le modifiche non interrompano la compilazione.

    
risposta data 27.09.2014 - 02:20
fonte
9

I progetti di grandi dimensioni possono richiedere molto tempo. Può essere un'ora o più per un progetto abbastanza grande. Ci sono un paio di librerie che devo compilare dal sorgente sul mio computer che impiegano molto tempo - ad es. opencascade. Anche il kernel di Linux richiede parecchio tempo se devi crearlo da zero.

Tuttavia, esistono altri processi simili a una compilazione che possono richiedere molto più tempo. La progettazione del circuito digitale (per ASIC o FPGA) richiede una fase di posizionamento e percorso. La fase del luogo e del percorso è quella in cui viene determinata la posizione di porte logiche individuali, flip-flop, registri, RAM e altri componenti insieme al routing per il cablaggio di interconnessione. Il software utilizza modelli di temporizzazione per determinare i ritardi di gate e routing per possibili posizionamenti, li confronta con i limiti forniti dai vincoli di temporizzazione e quindi regola le posizioni di posizionamento e i percorsi dei fili per cercare di soddisfare i requisiti di temporizzazione. A volte il software deve anche ridimensionare i gate e aggiungere buffer per soddisfare i tempi. Questo passaggio è estremamente intenso dal punto di vista computazionale e può richiedere molte ore o addirittura giorni per essere completato. Inoltre, non si allinea molto bene. C'era un design FPGA su cui stavo lavorando circa un anno fa che consumava circa la metà di un Virtex 6 HXT 565 FPGA (~ 300k su 565k LUT) e impiegava circa 7 ore per completare il luogo e il percorso. Non riesco a immaginare quanto tempo ci vorrà per eseguire il luogo e il percorso su qualcosa come un design CPU Core i7 - probabilmente almeno diverse settimane.

    
risposta data 27.09.2014 - 07:36
fonte
3

Altre risposte hanno già detto che sì, il codice su progetti di grandi dimensioni, in cui grandi significa 500k linee e fino, può richiedere tempi significativi, specialmente quando si costruisce da zero.

Il punto aggiuntivo è che alcuni progetti devono essere costruiti per più ambienti di destinazione. Quando le macchine che ospitano quegli ambienti non sono disponibili, la compilazione deve essere eseguita mediante compilazione incrociata, in serie sulle macchine che si hanno. Questo può portare a tempi di costruzione significativi . Per un progetto su cui ho lavorato, la costruzione notturna avrebbe richiesto 10 ore. Guai a te che sei stato tu a colpirlo!

Aggiungo che non faresti scappare una scusa del genere per perdere tempo. Una persona professionale dovrebbe pianificare i propri compiti in modo che faccia abbia qualcosa di utile da fare in questi periodi.

    
risposta data 27.09.2014 - 05:23
fonte
2

Un po 'di entrambi. C ++ (e C in misura minore) erano noti per i loro tempi di compilazione lenta, specialmente sull'hardware del periodo. Verso la fine del millennio, ho lavorato a un progetto che impiegava circa 4 ore per costruire a causa di macro shenanigans.

In questi giorni le cose vanno meglio, ma 30 secondi sono abbastanza bassi nella mia esperienza, specialmente nelle build formali dove le cose devono essere verificate dal controllo del codice sorgente, i test unitari, gli installatori costruiti e tutto ciò che viene inviato a qualche SAN.

    
risposta data 27.09.2014 - 00:38
fonte
1

Dipende dal progetto e dall'ambiente in cui è compilato. Ho lavorato su progetti C ++ che hanno richiesto diversi minuti per la compilazione (configurati come più progetti in MSVS), che è probabilmente il tempo sufficiente per un combattimento con la spada.

Se lavori per una grande azienda con un enorme codice e database (Proctor and Gamble, Google, ecc.) o per una piccola azienda o startup focalizzata su uno o due prodotti primari che sono molto complessi (ad es. simulazione scientifica e rendering), quindi aspettare che un grande progetto venga compilato è una cosa realistica da aspettarsi anche su macchine potenti. Ciò può influire sul modo in cui sviluppi e esegui il debug del codice (oltre alla frequenza con cui scegli di aggiornare e unire le modifiche tramite il controllo delle versioni).

    
risposta data 27.09.2014 - 01:51
fonte

Leggi altre domande sui tag