Um compilador é um programa que converte o código fonte de outro programa de uma linguagem de programação em código executável.
O código fonte normalmente está em uma linguagem de programação de alto nível (por exemplo, Pascal, C, C ++, Java, Perl, C # etc.). O código executável pode ser uma sequência de instruções da máquina que podem ser executadas diretamente pela CPU ou pode ser uma representação intermediária que é interpretada por uma máquina virtual (por exemplo, código de bytes Java).
Em resumo, um compilador converte um programa de um formato legível por humanos em um formato legível por máquina.
Quanto ao funcionamento de um compilador, isso é realmente complicado. Existem livros e cursos universitários sobre o assunto. Tentarei descrever brevemente as principais etapas do processo, mas essa será uma visão geral muito superficial.
- Lexing - divida o texto do programa em "tokens". Os tokens são as "palavras" da linguagem de programação, como identificadores (palavras-chave, nomes de variáveis, nomes de funções, etc.) ou operadores (=, *, &, etc.).
- Análise - converta a sequência de tokens em uma árvore de análise, que é uma estrutura de dados que representa várias construções de linguagem: declarações de tipo, declarações de variáveis, definições de funções, loops, condicionais, expressões etc.
- Otimização - avalie expressões constantes, otimize variáveis não utilizadas ou códigos inacessíveis, desenrole loops, se possível, etc.
- Traduza a árvore de análise em instruções da máquina (ou código de byte da JVM).
Mais uma vez, enfatizo que esta é uma descrição muito breve. Os compiladores modernos são muito inteligentes e, consequentemente, muito complicados.