Una specifica è un documento in linguaggio umano che descrive come dovrebbe funzionare un sistema. Nel caso di un linguaggio di programmazione, descrive come il compilatore o l'interprete deve reagire ai vari input, che sono validi / non validi e cosa succede quando vengono eseguiti.
Un'implementazione di riferimento come "questo specifico compilatore" non è una specifica. Definisce anche una funzione dagli input agli output, ma non può essere letta dagli umani, puoi solo sperimentarli. Ovviamente puoi scrivere un documento banale dicendo "tutto quello che l'implementazione XY è per definizione prevista", ma che va completamente contro il punto di avere una specifica in primo luogo - l'implementazione contiene quasi certamente errori, cose non definite su determinati input che non puoi distinguere da cose definite ma complesse, al contrario si comporta in modo coerente in qualche modo dove non c'è davvero alcun motivo per prescrivere un modo piuttosto che l'altro, ecc.
Quando hai bisogno di essere rassicurato su cosa dovrebbe fare un programma, quando hai bisogno di essere corretto anche attraverso gli aggiornamenti di un sistema runtime, quando devi dimostrare formalmente che una soluzione è corretta, quando vuoi scrivere codice che deve essere eseguito su implementazioni alternative - in altre parole, ogni volta che un test di base "Funziona per me" non è abbastanza buono - allora hai bisogno di una specifica, non solo di un programma in esecuzione.