In una lingua diversa, sì, potresti forse riutilizzare un AST. Tuttavia, il modello di compilazione di C lo rende impossibile. Innanzitutto, una fase del preprocessore esegue il codice. Ogni compilatore ha il suo #define
s in modo che possiamo tranquillamente includere opzioni specifiche del compilatore. Inoltre, varie definizioni ci permettono di verificare quale sistema stiamo compilando. Nella base di codice su cui sto lavorando, utilizziamo la compilazione condizionale per selezionare le chiamate di sistema migliori sui sistemi operativi che li supportano. Solo dopo che tutte queste definizioni sono state risolte, si ottiene una sorgente C che viene analizzata e convertita in un AST. Poiché questo AST ora contiene presupposti specifici della piattaforma, non è possibile utilizzarlo come base per la compilazione multipiattaforma.
Un problema correlato è che diversi sistemi e compilatori possono utilizzare diverse implementazioni per la libreria standard C. Esiste una notevole libertà sul modo in cui alcune parti possono essere implementate, ad es. come funzioni o come macro. Il punto è che non puoi semplicemente usare le intestazioni per una libc sbagliata e aspettarti che tutto funzioni.
Una nota su IR LLVM: mentre l'IR è multipiattaforma, nel senso che può essere compilato su un codice macchina su qualsiasi architettura supportata, contiene già presupposti specifici della piattaforma come larghezze intere, layout dei dati, convenzioni di chiamata, .... L'IR è utile solo quando si esegue il depot, o quando si lavora sul compilatore toolchain poiché funziona come un formato di scambio di dati tra varie fasi del compilatore (in particolare, tra passaggi di ottimizzazione).
Anche se questo è un esercizio teorico, devo anche sottolineare che ti stai aspettando troppi benefici dall'evitare l'analisi. I compilatori moderni dedicano un po 'di tempo all'analisi e ottimizzano molto il tempo. Nel modello di compilazione C, il tempo di I / O può anche essere rilevante poiché si leggono spesso gli stessi file di intestazione per ciascun file oggetto che si sta generando. Molti compilatori offrono un meccanismo di intestazione precompilato in cui è possibile creare un AST per la prima intestazione inclusa da un file di origine. Questo può essere utile se includi lo stesso set di intestazioni in ogni file, ma non aiuta con la compilazione incrociata.
Un approccio più praticabile per ridurre i tempi di compilazione è quello di ridurre le intestazioni: includere il minor numero possibile di altre intestazioni. Preferisci le predeclarazioni oltre a includere un'altra intestazione. Dividi il tuo codice in strati chiari: ogni livello può includere solo le intestazioni degli strati inferiori - questo evita accidentalmente di includere quasi tutte le altre intestazioni. Preferisci intestazioni piccole che dichiarano solo un paio di simboli correlati invece di utilizzare intestazioni di grandi dimensioni in cui la maggior parte delle dichiarazioni non verrà utilizzata dalla maggior parte dei file inclusi. Valutare se alcuni suggerimenti forniscono anche una differenza misurabile piuttosto che copiare ciecamente ciò che alcuni n00b hanno scritto su Internet.