Gli strumenti disponibili ora per aiutarti a scrivere un compilatore sono molto buoni, quindi non è poi così difficile. Gli strumenti per aiutare con la scansione e l'analisi sono particolarmente evidenti. Ci sono alcuni strumenti per aiutare con la gestione AST (treecc, ad esempio, è un semplice strumento AST-nodi-con-dispaccia-operazioni multiple).
Forse ancora più importante, ci sono back-end come LLVM.
Se osservi il tutorial LLVM (http://llvm.org/docs/tutorial/), troverai che inizia con un semplice linguaggio funzionale puro, quindi aggiunge la mutabilità ecc. Le ragioni si riferiscono al modulo Static Single Assignment che, a mio avviso, è ampiamente utilizzato nei compilatori, non solo in LLVM. Anche se non sono esperto, potrei facilmente sbagliare.
Quindi probabilmente fa la differenza su quale tipo di linguaggio inizi per ragioni di gestione di codice intermedio, così come sui problemi di analisi che altre risposte hanno già menzionato. I primi passi più facili dipendono probabilmente dal tipo di codice intermedio generato e dal modello di macchina astratto su cui è basato. E iniziare con un linguaggio funzionale puro è probabilmente una buona idea in generale.
BTW - "puro funzionale" qui non implica necessariamente funzioni di prima classe, funzioni di ordine superiore ecc. La valutazione di espressioni aritmetiche / logiche può essere tutto ciò che serve prima di iniziare ad aggiungere elementi imperativi.