2009-02-26 16 views
14

Sto progettando un linguaggio di programmazione e uno dei problemi che stavo pensando è stato il motivo per cui i linguaggi di programmazione richiedono molto tempo per essere compilati. Il C++ presupposto richiede molto tempo perché deve analizzare e compilare un'intestazione ogni volta che compila un file. Ma le intestazioni preconfigurate mi hanno richiesto tanto tempo? sospetto che il C++ non sia l'unico linguaggio che ha questo problema.Perché le compilazioni richiedono così tanto tempo?

risposta

14

compilazione è un processo complesso che richiede alcuni passaggi piuttosto:

  • scansione/Lexing
  • Parsing
  • generazione del codice intermedio
  • ottimizzazione del codice Possibilmente Intermedio
  • destinazione generazione di codice macchina
  • Opzionalmente ottimizzazione del codice dipendente dalla macchina

(Lasciando da parte il collegamento.)

Naturalmente, questo ci vorrà del tempo per i programmi più lunghi.

2

Prendono tutto il tempo necessario e di solito dipende da quante cose estranee si iniettano nelle unità di compilazione. Mi piacerebbe vederti compilarli a mano più velocemente :-)

La prima volta che compili un file, non dovresti avere intestazioni. Quindi aggiungili quando ne hai bisogno (e verifica quando hai finito se ne hai ancora bisogno).

Altri modi per ridurre tale tempo è quello di mantenere le unità di compilazione piccole (anche fino a una funzione per file, in un caso estremo) e utilizzare uno strumento simile per assicurarsi di costruire solo ciò che è necessario.

Alcuni compilatori (in realtà IDE) eseguono la compilazione incrementale in background in modo che siano (quasi) sempre vicini alla compilazione completa.

+0

++ per unità di compilazione più piccole – Thilo

4

Il linguaggio design fa ha un effetto sulle prestazioni del compilatore. I compilatori C++ sono in genere più lenti dei compilatori C#, che ha molto a che fare con il design della lingua. (Ciò dipende anche dall'implementatore del compilatore, Anders Hejlsberg implementato C# ed è uno dei migliori in circolazione.)

La struttura semplicistica del "file di intestazione" di C++ contribuisce alle sue prestazioni più lente, sebbene spesso le intestazioni precompilate possano essere di aiuto. C++ è un linguaggio molto più complesso di C, e i compilatori C sono quindi in genere più veloci.

+0

Sei sicuro che Anders sia stato coinvolto nell'implementazione del compilatore? Pensavo che fosse più coinvolto da un punto di vista di alto livello, e non giù nel codice del compilatore, ma questa è solo una mia speculazione. – Travis

+0

Sarei sorpreso se non fosse coinvolto in almeno parte dell'attuale implementazione, ma non ne sono sicuro. È sicuramente coinvolto nel design della lingua. –

+0

Delphi e Python vengono in mente come compilatori eccezionalmente veloci ... – Arafangion

16

Un problema specifico di C++ che lo rende orribilmente lento è che, a differenza di quasi qualsiasi altro linguaggio, non è possibile analizzarlo indipendentemente dall'analisi semantica.

7

intestazioni precompilate sono modo più veloce, come è stato conosciuto almeno dal 1988.

Il motivo usuale per un compilatore C o compilatore C++ di prendere un lungo periodo di tempo è che ha a # include, pre-elaborazione, e poi lex gazillions di token.

Come esercizio, è possibile scoprire quanto tempo è necessario per eseguire cpp su una tipica raccolta di file di intestazione, quindi misurare il tempo necessario per simulare l'output.

gcc -O utilizza una tecnica di ottimizzazione molto efficace ma un po 'lenta sviluppata da Chris Fraser e Jack Davidson. La maggior parte degli altri ottimizzatori può essere lenta perché coinvolge ripetute iterazioni su strutture di dati abbastanza grandi.

+0

Sarebbe corretto dire che provare ad inserire molta intelligenza nell'ottimizzazione è un modo sicuro per creare lunghi tempi di compilazione? Questa è stata la mia comprensione casuale, ma sono riluttante a fare una dichiarazione generale ... – dmckee

+0

Perché le ottimizazioni non possono essere riutilizzate dalla compilazione precedente, quando solo una frazione del codice è cambiata? O se può essere fatto, come? – HopefullyHelpful

6

compilazione non necessità di prendere tempo: tcc compila ANSI C abbastanza veloce per essere utile come interprete .

Qualche cosa a cui pensare:

  1. Complessità nella scansione e passa parsing. Presumibilmente, è necessario ferire lungamente le previsioni, così come le lingue contestuali (al contrario del contesto).
  2. Rappresentazione interna. Costruire e lavorare su un AST ampio e pieno di funzionalità richiederà del tempo. Presumibilmente, dovresti utilizzare la rappresentazione interna più semplice che supporterà le funzionalità che desideri implementare.
  3. Ottimizzazione. L'ottimizzazione è pignola. È necessario verificare molte condizioni diverse. Probabilmente vuoi fare più pass. Tutto questo richiederà tempo.
0

penso che le altre risposte qui hanno perso alcune parti importanti della situazione che rallentano C++ compilazione:

    modello
  • Compilation che salva .obj/.o file su disco, li legge indietro, quindi collega li
  • collegamento in linkers lenti generali e cattivi, in particolare,
  • eccessivamente complesso macro di preprocessore
  • arbitrariamente complesso sistema modello di Turing-complete
  • inclusione nidificati e ripetuta di file di origine, anche con #pragma once
  • frammentazione User-inflitta, il codice dividendosi in troppi file (anche al punto di una funzione per file, in un caso estremo)
  • gonfio o bassa -effort strutture dati interne del compilatore
  • Overbloated libreria standard, modello di abuso

al contrario, questi non lento C++ compilazione:

  • Scanning/Lexing
  • di analisi
  • generazione del codice intermedio
  • target la generazione di codice macchina

Per inciso, l'ottimizzazione è uno dei più grandi rallentamenti, ma è l'unico rallentamento qui che è effettivamente necessario da una certa misura, ed inoltre è del tutto facoltativo.

Problemi correlati