Le compilazioni lunghe appartengono al passato?


38

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

Ora, non sto programmando da molto tempo e per lo più sono stato esposto a Java e Python (e Python è un linguaggio interpretato, non compilato). Mi rendo conto che è possibile che non mi sia mai imbattuto in progetti che richiedono molto tempo per essere compilati, ma anche per app di dimensioni decenti, o è stato istantaneo per me (di solito gestito in background da un IDE) o prendendo non più di 30 circa un secondo per un progetto estremamente ampio. Anche in un ambiente aziendale (in cui si svolge il fumetto), non ho mai avuto il codice di compilare così tanto tempo.

Non sono stato esposto a progetti con tempi di compilazione lunghi? È una reliquia del passato che non è più qualcosa che accade ai giorni nostri? Perché una compilazione richiederebbe così tanto tempo?


31
Prova a compilare il cromo.
UldisK,

2
Prendi una copia del kernel Linux. Fai una build completa. Guarda tu stesso. Oppure provieni dalla fonte se sei un programmatore Java. Così com'è, questa domanda ha diverse risposte che stanno rispondendo alla domanda come se fosse un sondaggio (risposte di tipo "Ho fatto compilazioni in 30 minuti ...") che indica che la domanda in sé non è adatta .

Un recente grande progetto mi ha impiegato 40 minuti per essere compilato (40.000 file di codice sorgente compilati con Maven). La soluzione è di paralliizzare la compilazione su molti core della CPU.
Niklas Rosencrantz,

2
Prendi una distribuzione Linux di origine (gentoo, LFS, ...) quindi passa giorni a compilare tutti i software che stai installando.
Basile Starynkevitch,

6
definire long ... Per un bambino appena uscito dalla scuola 1 minuto può sembrare lungo, per un vecchio che è stato in trincea per decenni alcune ore non inarcano le sopracciglia.
jwenting

Risposte:


48

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

  • Grande dimensione del codice, ovviamente. I grandi progetti avranno centinaia di migliaia di righe di codice.

  • #includeDirettiva preprocessore di C , che fa sì che lo stesso codice venga compilato centinaia di volte. Il sistema macro ha problemi simili, poiché funziona a livello di testo. Il preprocessore gonfia davvero la dimensione del codice che viene effettivamente passata al compilatore. Guardare un file dopo la preelaborazione (ad es. Via gcc -E) dovrebbe aprire gli occhi.

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

  • Scala è un linguaggio abbastanza giovane, e il compilatore è orribilmente sottoottimizzato. Attualmente, il compilatore utilizza un numero molto elevato di passaggi di compilazione (C è progettato per richiedere solo due passaggi di compilazione). Il controllo del tipo è 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, è necessario eseguire 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).


14
In realtà, il sistema di tipi di Scala è Turing completo, quindi il controllo del tipo può richiedere un tempo infinito, ed è impossibile per il compilatore determinarlo.
Jörg W Mittag,

7
Non dimenticare le ottimizzazioni. Molte ottimizzazioni che un compilatore (ad esempio) C / C ++ farà sono molto costose (ad esempio così costose che JIT non può permettersi di farle affatto). Nel caso peggiore, la maggior parte delle catene di strumenti ora supporta l'ottimizzazione dell'intero programma, che è noto per aumentare significativamente i tempi di costruzione.
Brendan,

Ho accettato questa risposta perché hai indicato una serie di cose che non stavo prendendo in considerazione, in particolare compilando il tutto rispetto alla compilazione in pezzi e il fatto che le suite di test potrebbero essere incluse in questo periodo di "compilazione".
Thunderforge,

1
non solo test suite: analisi della copertura del codice, packaging automatizzato, implementazioni automatizzate nel sistema di test; oggigiorno ci sono molte cose racchiuse in un sistema di build integrato. E se sei in attesa fino a quando non arriva all'ambiente dev o qa, avrai sicuramente il tempo di sederti su una piccola sedia.
corsiKa

1
Ottima risposta, vorrei solo notare che la diffusione dei possibili tempi di compilazione può essere molto più grande. Ho lavorato a progetti in cui una compilazione completa potrebbe richiedere da due a tre giorni (sì, è stato orrendo!) E immagino che ci siano criminali peggiori là fuori.
Roy T.

17

Non è affatto una reliquia del passato. Uno dei progetti su cui lavoro richiede 45 minuti per una creazione pulita da zero. Oltre al nostro codice, dobbiamo anche estrarre e costruire il sorgente da diverse grandi librerie C e C ++ da repository esterni. Compilare e collegare codice C e C ++ è costoso dal punto di vista computazionale. Come hai sottolineato, Python è in genere implementato come linguaggio interpretato e Java di solito utilizza un compilatore JIT (Just in Time), quindi i tuoi progetti stanno saltando la compilazione iniziale e collegando i costi del tutto. Il prezzo da pagare è in tempi di avvio più lunghi e (almeno per Python) una velocità di esecuzione più lenta.

Quando i tempi di costruzione durano così a lungo diventa più importante sfruttare i sistemi di integrazione continua come Jenkins o TeamCity . Ciò consente ai singoli sviluppatori di evitare (principalmente) la sofferenza della costruzione da zero, pur verificando che le modifiche non stiano interrompendo la creazione.


1
javac non è " saltare la compilazione in anticipo e che collega i costi del tutto ". Salta molti costi di ottimizzazione, ma sta ancora trasformando l'origine in bytecode e facendo molti controlli statici nel processo. Funziona tanto quanto il collegamento di un compilatore C. La vera differenza di prestazioni è che il processo di compilazione di Java è stato progettato in un'epoca in cui si riteneva possibile caricare l'intero programma e le sue dipendenze in memoria in una sola volta piuttosto che doverlo suddividere in piccoli blocchi e rielaborare gli stessi file migliaia di volte.
Peter Taylor,

10

I grandi progetti 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 esempio opencascade. Lo stesso kernel Linux richiede anche molto tempo se lo si deve costruire da zero.

Tuttavia, ci sono altri processi simili a compilazioni che possono richiedere molto più tempo. La progettazione di circuiti digitali (per ASIC o FPGA) richiede un passaggio di posizione e percorso. La fase del percorso e del percorso è quella in cui viene determinato il posizionamento di singole porte logiche, infradito, registri, RAM e altri componenti insieme al percorso per il cablaggio di interconnessione. Il software utilizza modelli di temporizzazione per determinare i ritardi di gate e di instradamento per possibili posizionamenti, li confronta con i limiti previsti dai vincoli di temporizzazione, quindi regola le posizioni di posizionamento e i percorsi dei cavi per cercare di soddisfare i requisiti di temporizzazione. A volte il software dovrà anche ridimensionare le porte 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 parallelizza molto bene. C'era un progetto FPGA su cui stavo lavorando circa un anno fa che ha consumato circa la metà di un FPGA Virtex 6 HXT 565 FPGA (~ 300k su 565k LUT) e ha impiegato circa 7 ore per completare il percorso e il percorso. Non riesco a immaginare quanto tempo ci vorrebbe per eseguire il percorso e il percorso su qualcosa come un design della CPU Core i7 - probabilmente almeno diverse settimane.


4

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

Il punto aggiuntivo è che alcuni progetti devono essere creati per più ambienti target. Quando le macchine che ospitano tali ambienti non sono disponibili, la compilazione deve essere eseguita tramite compilazione incrociata, in serie sulle macchine che possiedi. Questo può portare a tempi di costruzione significativi . Per un progetto a cui ho lavorato, la costruzione notturna richiederebbe 10 ore. Guai che eri tu quello che l'ha rotto!

Vorrei aggiungere che non ti scapperesti con una simile scusa per perdere tempo. Una persona professionale dovrebbe essere progettando i loro compiti in modo che essi non hanno qualcosa di utile da fare in tali periodi.


3

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

In questi giorni le cose vanno meglio, ma 30 secondi sono abbastanza bassi nella mia esperienza - specialmente nelle build formali in cui è necessario estrarre le cose dal controllo del codice sorgente, eseguire i test delle unità, costruire gli installatori e tutto ciò che viene inviato a qualche SAN da qualche parte.


2

Dipende dal progetto e dall'ambiente in cui è compilato. Ho lavorato a progetti C ++ che hanno richiesto diversi minuti per essere compilati (impostati come progetti multipli in MSVS), che probabilmente è abbastanza tempo per uno scontro a spada.

Se lavori per una grande azienda con un enorme codice e base di dati (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 aspettarsi anche su macchine potenti. Ciò può influire sulla modalità di sviluppo e debug del codice (nonché sulla frequenza con cui si sceglie di aggiornare e unire le modifiche tramite il controllo delle versioni).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.