Um front-end do GCC transforma o código em um formulário interno intermediário usado pelo GCC. Um back end do GCC transforma essa forma interna intermediária na forma final que o compilador gera.
Portanto, por exemplo, se você tiver um front end C ++ e um front end Java, poderá aceitar a entrada em C ++ e Java. Se você tiver um backend x86 e um back end MIPS, poderá produzir executáveis para CPUs x86 e MIPS.
Se você quisesse adicionar suporte do Go ao GCC, escreveria um front end Go para o GCC. Então você poderia compilar o código Go para cada plataforma suportada pelo GCC.
Se você quisesse adicionar suporte ao GCC para uma nova CPU, você escreveria um novo back-end para essa CPU. Então você poderia produzir código para essa CPU usando todos os idiomas suportados pelo GCC.