Você está na página 1de 8

UNIVERSIDADE FEDERAL RURAL DO SEMI-ARIDO

CENTRO MULTIDISCIPLINAR DE PAU DOS FERROS


ENGENHARIA DE COMPUTAÇÃO

COMPILADORES

DANIEL DOUGLAS
JOÃO VITOR RICARTE
JORGIANIA VANERICA
RAFAEL ABRANTES
PAU DOS FERROS
2018
Compilador

Um compilador traduz o código em um idioma para outro, sem alterar o significado do


programa. Também é esperado que um compilador torne o código de destino eficiente e
otimizado em termos de tempo e espaço.
Os princípios de designer do compilador fornecem uma visão detalhada do processo de
conversão e otimização. O design do compilador cobre o mecanismo básico de tradução e a
detecção e recuperação de erros. Inclui análise lexical, sintaxe e semântica como front-end e
geração e otimização de código como back-end.

Visão Geral
Os computadores são uma mistura equilibrada de software e hardware. O hardware
compreende instruções na forma de carga eletrônica, que é a contrapartida da linguagem
binária, que é simplesmente uma série de 1s e 0s. Seria uma tarefa difícil e complicada para os
programadores de computador escrever tais códigos, e é por isso que temos compiladores para
escrever tais códigos.

Sistemas de Processamento de Linguagem


O hardware entende uma linguagem que os humanos não consegue entender. Por isso,
escrevemos programas em linguagem de alto nível, o que é mais fácil de entender e lembrar.
Os programas são então alimentados com ferramentas e componentes do SO para obter o
código desejado que pode ser usado pela máquina. Conhecido como o sistema de
processamento de idiomas.

A linguagem de alto nível é convertido em binário em várias fases. Um compilador é


um programa que converte linguagem de alto nível em linguagem assembly. Da mesma forma,
um montador é um programa que converte a linguagem assembly em linguagem no nível da
máquina.
Como um compilador em C é executado em uma máquina host:
1. O usuário escreve um programa em linguagem C;
2. O compilador C, compila o programa e traduz para o programa em Assembly;
3. Um montador, em seguida, converte o programa de montagem em código de máquina;
4. Uma ferramenta de vinculação é usada para vincular todas as partes do programa para
a execução;
5. Um carregador carrega todos eles na memória e depois o programa é executado;

Ferramenta que auxiliam os compiladores:


Intérprete: Traduz uma linguagem de alto nível em linguagem de máquina de baixo nível. A
diferença está na maneira com eles lêem o código-fonte ou a entrada. Um compilador lê todo
o código-fonte de uma vez, cria tokens, verifica a semântica, gera código intermediário, executa
o programa inteiro e pode envolver muitos passos. Já um intérprete, lê uma instrução de
entrada, converte-a em um código intermediário, executa-a e, em seguida, pega a próxima
instrução em sequência. Se ocorrer um erro, o intérprete interrompe a execução e reporta-o
enquanto um compilador lê todo o programa mesmo que ele encontre vários erros.

Pré-processador: É uma ferramenta que produz entrada para compiladores, Ele lida com
microprocessamento, aumento, inclusão de arquivos, extensão de idioma.

Assembler: Um montador traduz os programas da linguagem de montagem em código de


máquina. A saída é chamada de arquivo de objeto, que contém uma combinação de instruções
de máquina, bem como os dados necessários para colocar essas instruções na memória.

Linker: É um programa de computador que vincula e mescla vários arquivos de objetos para
criar um arquivo executável. Todos esses arquivos podem ter sido compilados por montadores
separados. A principal tarefa de um vinculador é pesquisar e localizar o módulo/rotinas
referenciadas em um programa e determinar a localização da memória onde esses códigos serão
carregados, fazendo com que a instrução do programa tenha referências absolutas.
Carregador: O loader é uma parte do sistema operacional responsável por carregar arquivos
executáveis na memória e executá-los. Calcula o tamanho de um programa e cria espaço de
memória para ele. Inicializa vários registros para iniciar a execução.
Compilador Cruzado: Compilador que roda na plataforma A e é capaz de gerar código
executável para a B.
Compilador de Origem para Origem: Um compilador que pega o código-fonte de uma
linguagem e a converte em outro código-fonte.

Arquitetura
Fase de Análise: Conhecida como o front-end, lê o programa fonte, divide-o em partes
principais e então verifica erros lexicais, gramaticais e de sintaxe. A fase de análise gera uma
representação intermediária do programa fonte e do símbolo, tabela, que deve ser alimentado
para a fase de síntese como entrada.
Fase de Análise: Conhecido como o back-end do compilador, a fase de síntese gera o programa
de destino com a ajuda da representação do código-fonte.
Um compilador pode ter muitas fases e passas:
● Passa: refere-se a passagem de um compilador por todos o programa;
● Fase: Estado distinguível, que recebe entrada do estágio anterior e produz uma saída
usada no próximo estado.

Fases do Compilador
Várias fases constitui o processo de compilação, cada uma delas recebe uma entrada de
uma fase anterior e possui sua própria representação do programa de origem e alimenta sua
saída para a próxima fase.
Análise Lexical: A primeira fase funciona como um scanner de texto, percorrendo o código-
fonte como um fluxo de caracteres e os convertem em lexemes significativos.
Análise Sintática: Recebe os tokens (representação de lexemes) como entrada e gera uma
árvore de análise. Sendo os tokens verificados em relação à gramática do Código-fonte (CF),
ou seja o analisador verifica se a expressão feita pelos tokens está correta.
Análise Semântica: Verifica se a árvore criada pela análise sintática segue as regras da
linguagem, como a atribuição dos valores é entre tipos de dados compatíveis e a adição de
strings a um inteiro.
Geração de Código Intermediário: A análise Semântica gera um código intermediário do cf
para a máquina de destino. Esse código representa um programa para alguma máquina abstrata,
que está entre linguagem de alto nível e a linguagem de máquina. Esta código deve ser gerado
de maneira a facilitar a tradução para a máquina de estado.
Otimização de Código: Otimiza o código, removendo as linhas de códigos desnecessárias e
organiza a sequência de instruções para acelerar a execução do programa sem desperdiçar
recursos.
Geração de Código: A representação otimizada do código é mapeado para a linguagem de
máquina de destino. O gerador de código traduz o código em uma sequência de código de
máquina re-localizável.
Tabela de Símbolos: Estrutura de dados mantida em todas as fases. os nomes do identificador,
juntamente com seus tipos, são armazenados. Também utilizada para o gerenciamento de
escopo.

Análise Lexical
A análise lexical a primeira fase de um compilador. Ele usa o código-fonte modificado
de pré-processadores de linguagem que são escritos na forma de sentenças. As sintaxes são
quebradas em uma série de tokens pelo analisador, removendo qualquer espaço em branco ou
comentários no código-fonte.
Um erro é gerado, caso o analisador léxico encontrar um token inválido. O analisador
léxico trabalha em conjunto com o analisador sintático. O analisador léxico lê os fluxos de
caracteres do CF e verifica se há tokens legais e transmite os dados para o analisador quando
se faz necessário.
Fichas
Os lexemes, sequências de caracteres em um token, são identificado como um token
válido a partir de regras predefinidas. Essas regras são definidas por regras gramaticais por
meio de um padrão, padrões esses são definidos por meio das expressões regulares.
Na linguagem de programação, palavras-chave, constantes, identificadores, cadeias de
caracteres, números, operadores e símbolos de pontuações podem ser considerados tokens. Por
exemplo, na linguagem C, a linha de declaração da variável
int value = 100;
contém os tokens:
int (keyword), value (identifier), = (operator), 100 (constant) and ; (symbol).
Especificações de Tokens
Alfabetos: Qualquer conjunto finito de símbolos {0,1} é um conjunto de alfabetos
binários, {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} é um conjunto de alfabetos hexadecimais, {az,AZ}
é um conjunto de alfabetos da língua inglesa.
Cordas: é qualquer sequência finita de alfabeto é chamada de string. Uma string sem
alfabetos, isto é, uma string de tamanho zero é conhecida como string vazia e é denotada por
(epsilon).
Símbolos Especiais: Uma linguagem típica de alto nível contém os seguintes símbolos:

Símbolos aritméticos Adição (+), Subtração (-), Módulo (%), Multiplicação


(*), Divisão (/)

Pontuação Vírgula (,), ponto e vírgula (;), ponto (.), Seta (->)

Tarefa =

Segmento especial + =, / =, * =, - =

Comparação ==,! =, <, <=,>,> =

Pré-processador #
Especificador de localização E

Lógico &, &&, |, ||,!

Operador de turno >>, >>>, <<, <<<

Língua: Considerada como um conjunto finito de cadeias de caracteres sobre algum


conjunto finito de alfabetos. Os idiomas finitos podem ser descritos por meio de expressões
regulares.