Compiladores e Computabilidade
Prof. Leandro C. Fernandes
UNIP –Universidade Paulista, 2018
INTRODUÇÃO
Motivação e
Conceitos fundamentais
Por que estudar Compiladores?
• É parte do conhecimento básico de um desenvolvedor
– Como os compiladores funcionam?
– Como os computadores trabalham?
• (conjuntos de instruções, registradores, modos de endereçamento, estrutura de dados de tempo de execução, ...)
– Quais códigos de máquina são gerados para certas construções da linguagem?
• (consideração a cerca da eficiência) – O que é um bom projeto de linguagem?
– É um projeto de programação não trivial!
• Também é útil para o desenvolvimento de softwares em geral
– Leitura de argumentos estruturados sintaticamente
• Linha de comando (shell S.O.) – Leitura de dados estruturados
• (ex. Arquivos XML, part lists, imagens, ...) – Buscas em espaços de nomes hierárquicos – Interpretação de códigos de comandos
O que são essas coisas?
• Visual Studio
• Netbeans
• gcc
• Browser
• Eclipse
• Java
• HTML
• Assembler
• PHP
• Assembly
• Babylon
• Python
• JVM
• .NET
• Pascal Objects
• Lua
Ferramenta de Apoio Compilador
Tradutor Interpretador
Linguagem
O que são essas coisas?
• gcc
• javac
• babylon
• masm
• JVM
• python
• dotNET
• Browser
• Visual Studio
• Codeblocks
• NetBeans
• Eclipse
• Assembly
• HTML
• Python
• Java
• PHP
• C#
O que está acontecendo !?
• Qual é todo o processo que ocorre desde a codificação de um algoritmo por um programador até a sua execução em um computador?
– Quais os elementos envolvidos neste processo?
– Quais tarefas cabem a cada um desses elementos?
– Quais fatores influenciam de um ou de outro modo esse processo?
– Quais elementos podem ser reutilizados?
– Quais elementos são específicos?
Compilador (comercial)
Da codificação ao executável ...
solução
#include..
#define T void mai..
int x;
for (i=T;.
Pré-processador
/lib/inclu void mai..
int x;
for (i=10
Compilador
01010001 100011 01011010 101011 10010101
Linker
01010001 10110011 01011011 01011100 10101001
- Remover macros;
- Incluir caminhos (paths) de arquivos; e - Realizar outras substituições ...
- Verificar e compreender o código fonte para, então, traduzi- lo e gerar um equivalente que seja codificado na linguagem de baixo nível da plataforma alvo.
01010001 100011 01011010 101011 10010101 10001101 01101010 10111001 01010100 00100011 01011011 01011100 10101010 10001100 01101010
- Reunir num arquivo único e executável todos os módulos que compõe o programa, resolvendo as referências cruzadas e ligações que há no código Código fonte
- Arquivo texto - Linguagem fonte
Código fonte sem macros - Ling. fonte
Código objeto - Arquivo binário - Instruções ISA - Depende arquit.
Código Executável - Módulo de carga - Cód. de máquina
realocável Códigos objeto
- Bibliotecas - Outros módulos
POR DENTRO DO COMPILADOR
Quais tarefas são realizadas para a transformação do código?
Estrutura Dinâmica de um Compilador
Fluxo de caracteres v a l = 10 * v a l + i
análise léxica (scanning)
Fluxo de tokens 1 (ident)
"val"
3 (atrib)
- 2 (número)
10 4 (mult)
- 1 (ident)
"val"
5 (soma)
- 1 (ident)
"i"
número do token valor do token
análise sintática (parsing)
Árvore sintática
ident= número* ident+ ident Termo
Expressão Comando
Faz a varredura do arquivo fonte reconhecen- do e identificado cada um dos elementos significativos da linguagem; e eliminando qualquer caracteres irrelevantes ao processo de compilação
Verifica a estrutura do código, analisa se todos os elementos encontrados estão na ordem esperada e determina qual a relação que existe entre eles (contexto).
Como resultado, constrói uma representação estruturada do código fonte que será utilizada no processo de tradução
Estrutura Dinâmica de um Compilador
análise semantica Árvore sintática
ident =number *ident + ident Termo
Expressão Comando
Representação
intermediária árvore sintática, tabela de símbolos, ...
otimização geração de código
ld.i4.s 10 Código de máquina
geração de código intermediário
Verifica a natureza dos identificadores, seus tipos e escopo, além da compatibilidade entre os elementos envolvidos nas instruções.
Sintetiza um código equivalente em linguagem de baixo nível, próximo da plataforma alvo.
Realiza melhorias no código gerado, buscando otimizar instruções e eliminar trechos sem efeito ou inalcançáveis.
Produz o código final em linguagem de máquina, de acordo com a plataforma alvo.
Compiladores vs Interpretadores
Compilador traduz para código de máquina
varredor analisador
gramatical ... gerador
de código loader
código fonte código de máquina
Variação: interpretação de um código intermediário ... compilador ...
código fonte código intermediário (ex. Common Intermediate
Language (CIL))
VM •código fonte é traduzido para o código de uma máquina virtual
•A máquina interpreta o código simulando a máquina real
Interpretador executa o código fonte "diretamente"
varredor analisador gramatical
código fonte interpretação
•comandos em um laço são lidos e analisados gramaticalmente a cada iteração
Compiladores de Uma Passagem
• As fases trabalham de maneira intercalada:
– Cada etapa é realizada para o trecho ou seção corrente da análise;
– Quando esta parte termina, o processo é retomado para o próximo trecho de código.
• O programa alvo está completo quando terminar a leitura do programa fonte
Código fonte
• varredura do símbolo (token)
• análise gramatical do símbolo
• verificação do símbolo
•geração de código para o símbolo
•fim de arquivo?
Compiladores de Multiplas Passagens
• As fases são "programas" separados, que são executados sequencialmente
• Cada fase lê de um arquivo e escreve em um novo arquivo.
• Por quê multiplas passagens?
• se a memória for escassa (irrelevante atualmente)
• se a linguagem for complexa
• se a portabilidade for importante
caracteres
análise lexical
símbolos (tokens)
análise gramatical
árvore
análise semântica
...
código
Compiladores de Duas Passagens
(Atual)Front End
+ análise léxica + análise gramatical
+ análise semântica respresentação intermediária
Back End
+ geração de código interm.
+ otimização
+ geração de código final
dependente da linguagem Java
C Pascal
dependente da máquina Pentium PowerPC SPARC qualquer combinação possível
Vantagens
• melhor portabilidade
• possibilidade de muitas combinações entre front-ends e back-ends
• otimizações são mais fáceis na representação
Desvantagens
• lenta
• necessita mais memória
Estrutura Estática de um Compilador
utiliza
analisador gram. & sem.
an. léxico
tabela de símbolos
gerador de código provê os símbolos a
partir do código fonte
mantém as informações sobre os nomes e tipos declarados
gera o código de máquina
"programa principal"
gerencia toda a compilação
fluxo de dados