In generale, non "testerai" (in realtà, in questo senso, una parola migliore è controllo e probabilmente controllo statico , relativo a analisi del programma statico ) analizzando staticamente l'assemblatore senza eseguire il programma compilato, perché è troppo difficile. Tuttavia, potresti avere degli script di test che analizzano l'assemblatore generato per un determinato programma di input e ne controllano la struttura (non penso che sia saggio farlo ...).
In pratica, la maggior parte dei compilatori ha una vasta suite di test. Se stai codificando un compilatore per alcuni linguaggi esistenti (ad esempio se stai codificando un compilatore C), potresti provare a riutilizzarli (ad esempio, GCC ha una suite di test ben consolidata che è possibile adattare al compilatore, alcuni test infatti" analizzano "l'assembly generato o la diagnostica emessa).
Tuttavia, guarda anche al progetto CompCert che tratta di un compilatore C formalmente verificato (una parte importante di questo lavoro è la formalizzazione della semantica di C e del comportamento del compilatore).
How can I test the generated assembly before the compiler is complete enough to do anything useful?
Probabilmente non puoi farlo, se non tramite l'ispezione manuale di quel codice assembly. Probabilmente vorresti lavorare per ottenere, il più rapidamente possibile, una piccola parte del tuo linguaggio compilabile (per alcuni programmi che potresti testare). Ad esempio, potresti decidere di lavorare sodo per rendere compilabile il programma vuoto, quindi di compilare un programma di assegnazione singola su 1 riga, quindi di compilare alcuni piccoli programmi di 5 righe, ecc ... Quindi il tuo compilatore avrebbe una sequenza crescente di test suite.
Potresti voler compilare il tuo compilatore con se stesso. Questa è una lunga tradizione (e quindi la possibilità di compilare il compilatore è un test valido). Leggi compilatori bootstrap (e guarda nel blog di J.Pitrat a proposito di bootstrapping artificial intelligence ; ha molte pagine interessanti).
Potresti anche basare il tuo lavoro di compilatore sopra una libreria di "compilazione" come libgccjit o LLVM , o scegli compila a C (o a qualche altra lingua, livello più alto dell'assemblaggio). Ciò potrebbe farti risparmiare molti sforzi.
Si noti che, in pratica, i compilatori C dovrebbero essere ottimizzati, ed è per questo che è difficile competere con i compilatori esistenti. Vedi anche questo .