Compilador é um programa que lê um programa escrito em um idioma (o idioma de origem) e o converte em outro programa equivalente em outro idioma (o idioma de destino), principalmente o idioma de máquina.
Existem diferentes fases do compilador através das quais o código do idioma de origem é verificado linha por linha. Existe uma tabela de símbolos que mantém o controle de todas as palavras-chave pesquisadas no código do idioma de origem.
Fase 1: Lexical Analyzer - lê todo o caractere no programa de origem e forma a separação lógica de tokens (int, char, float, if-else, por, while etc.)
Fase 2: Analisador de Sintaxe - analise a estrutura do fluxo de tokens. Análise hierárquica de expressões que inclui postfix / prefixo etc. (a = b + c * d)
Fase 3: Analisador Semântico - Verificação de tipo de tokens (inteiro para real, flutuante etc.) e muitas coisas como precedência do operador etc.
Fase 4: Gerador de código intermediário - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)
Fase 5: Otimização de Código - Análise Diversa (fluxo de controle, fluxo de dados, transformações)
que elimina: código de redundância, propagação de constantes, código morto parcial, subexpressão comum, código invariante de loop
Fase 6: Geração de código - geração de código de destino (principalmente Assembly Language) colocando valores nos registros
Todas essas fases nada mais são do que programas bem escritos e pode haver um número N de falhas nisso ..