Prévia do material em texto
Compilador Na computação, um compilador é um tipo de tradutor que transforma um programa inteiro de uma linguagem de programação para outra. Normalmente, o idioma de destino é o código de máquina, embora também possa ser traduzido para um código intermediário ou texto. Ao contrário dos interpretadores, os compiladores reúnem vários elementos ou fragmentos na mesma unidade (um programa executável ou uma biblioteca), que podem ser armazenados e reutilizados. Este processo de tradução é conhecido como compilação. Construir um compilador envolve dividir o processo em uma série de fases que variam de acordo com sua complexidade. Essas fases são geralmente agrupadas em duas tarefas: a análise do programa de origem e a síntese do programa de destino. Análise: trata-se da verificação da correção do programa fonte, de acordo com a definição da linguagem nos termos da teoria formal da linguagem. Inclui as fases correspondentes à análise lexical (que consiste na decomposição do programa fonte em componentes lexicais), análise sintática (agrupamento dos componentes lexicais em frases gramaticais) e análise semântica (verificação da validade semântica das frases aceitas na fase de análise sintática). Síntese: seu objetivo é a geração da saída expressa na linguagem de objeto e geralmente é composta por uma ou mais combinações de fases de geração de código (geralmente código intermediário ou código de objeto ) e otimização de código (na Busca obter um programa objetivo o mais eficiente possível, de acordo com sua complexidade computacional ou complexidade de Kolmogórov: tempo de execução, espaço durante a execução, espaço a ser armazenado fora da execução, etc.). Alternativamente, as fases descritas para as tarefas de análise e síntese podem ser agrupadas em: • Parser ou front-end: é a parte que analisa o código fonte, verifica sua validade, gera a árvore de derivação e preenche os valores da tabela de símbolos. Esta parte é geralmente independentemente da plataforma ou sistema para o qual deve ser compilada e é composta pelas fases entre a análise lexical e a geração do código intermediário. • Gerador ou back-end: é a parte que gera o código de máquina, específico de uma plataforma, a partir dos resultados da fase de análise, realizada por este gerador. Essa divisão permite que o mesmo gerador seja usado para criar código de máquina para várias linguagens de programação diferentes e o mesmo analisador usado para examinar o código-fonte de uma linguagem de programação específica para produzir código de máquina em várias plataformas. Geralmente inclui geração e otimização de código dependente da máquina. Esta taxonomia de tipos de compilador não é exclusiva, portanto, pode haver compiladores que se enquadram em várias categorias: • Compiladores cruzados: geram código para um sistema diferente daquele em que estão trabalhando. • Otimizando compiladores: faça alterações no código para melhorar sua eficiência, enquanto mantém a funcionalidade do programa original. • Compiladores de passagem única: geram código de máquina a partir de uma única leitura de código-fonte. • Compiladores multipass: eles precisam ler o código-fonte várias vezes antes de produzir o código de máquina. • Compiladores JIT: eles são parte de um interpretador e compilam partes do código conforme necessário. Nos primeiros dias da computação, os compiladores eram considerados um dos softwares mais complexos que existiam. Os primeiros compiladores foram feitos programando-os diretamente em linguagem de máquina ou em assembler. Depois que um compilador estiver disponível, novas versões do compilador (ou outros compiladores diferentes) podem ser escritas na linguagem que o compilador compila. Existem ferramentas que tornam mais fácil escrever compiladores ou interpretadores de computador. Essas ferramentas permitem gerar o esqueleto do analisador a partir de uma definição formal da linguagem fonte, normalmente especificada por meio de uma gramática barata e formal, deixando apenas a tarefa de programar as ações semânticas associadas ao programador do compilador.