Si potrebbe immaginare un compilatore parallelo. Ad esempio, si potrebbe immaginare un compilatore che compilerebbe parecchie funzioni (nello stesso file sorgente) in parallelo.
Ricorda che un compilatore non è per lo più un parser. In pratica, un compilatore che ottimizza la forza industriale sta spendendo la maggior parte del suo tempo trasformando alcune rappresentazioni interne del codice sorgente compilato perché le ottimizzazioni vengono eseguite trasformando le rappresentazioni interne. Quindi ogni funzione che si verifica nel codice sorgente potrebbe in teoria essere compilata in qualche modo separatamente (per compiti semplici come il piegamento costante, l'eliminazione di sottoespressione comune, ecc.) E solo in un secondo momento si unirebbero le loro rappresentazioni.
Il motivo per cui nessuno sta codificando un compilatore multi-threaded parallelo è che non esiste una teoria sostanziale che supporti tale progetto, quindi è necessario avviare da zero l'intera progettazione e implementazione del compilatore. È possibile, ma è davvero troppo costoso.
Ricorda che i compilatori di forza industriale sono grandi software , in genere diversi milioni di righe di codice sorgente. È difficile permettersi di riscriverli tutti, dato che la progettazione di un simile compilatore parallelo non è nota e non è possibile prevedere quanto si otterrebbe.
The C/C++ language family apparently has multithreaded compiler implementations
(Credo che tu abbia torto, o confondendo il programma builder -eg make
su Linux- con il compilatore proprio -eg cc1plus
avviato dal comando g++
-oftato da make
. ..- su Linux con GCC )
A proposito, non ho mai sentito parlare di un compilatore C ++ o C multithread. Tutti quelli che conosco (in particolare Clang & GCC) sono programmi puramente sequenziali, mono-thread (e sono animali molto grandi, GCC ha più di decine di milioni di righe di codice sorgente). Ciò che è in qualche modo in grado di funzionare in parallelo - in diversi processi, non in thread - sono alcuni passaggi dell'intero programma di ottimizzazione (spesso chiamato ottimizzazione link-time cioè LTO che è g++ -flto -O2
per GCC, ma che LTO è ancora fatto dal compilatore). Ma il tuo costruttore (es. GNU make avviato come make -j
) sarebbe in grado di eseguire diversi processi di compilazione (lavorando su diversi unità di traduzione) in parallelo. Inoltre, il GNU gold
linker è multi-threaded. E l'ottimizzazione link-time è usata raramente (e non sempre vale il costo, ad esempio g++ -O2 -flto
spesso guadagnerebbe solo meno del 5% delle prestazioni wrt g++ -O2
) perché rallenta significativamente il tempo di compilazione (es. Lo raddoppia).