Upload
luis-eduardo
View
218
Download
0
Embed Size (px)
Citation preview
8/18/2019 1.Introducao a compilação
1/22
Profa. Valéria D. Feltrim
DIN – UEM
Parte deste material foi gentilmente cedido pelo Prof. T. A. S. Pardo (ICMC-USP/São Carlos)
8/18/2019 1.Introducao a compilação
2/22
Programa que lê um programa em uma linguagem-fonte e otraduz em um programa em uma linguagem-alvo (objeto)
Linguagem-fonte: Pascal, C Linguagem-alvo: linguagem de montagem (assembly ), código de
máquina, bytecode ...
Durante o processo de tradução, relatam-se errosencontrados
compiladorprograma
fonte
programa
alvo
mensagens de erro
8/18/2019 1.Introducao a compilação
3/22
Primeiros compiladores começaram a surgir noinício dos anos 50 Diversos experimentos e implementações realizados
independentemente Trabalhos iniciais: tradução de fórmulas aritméticas em
código de máquina Compiladores eram considerados programas muito difíceis
de construir Primeiro compilador Fortran levou 18 homens-ano para ser
construído
8/18/2019 1.Introducao a compilação
4/22
Desde então, técnicas sistemáticas para construção decompiladores foram identificadas
Reconhecimento de cadeias, gramáticas, geração de linguagem
Desenvolvimento de boas linguagens e ambientes de programação C, C++, bibliotecas, linguagens visuais
Desenvolvimento de programas para produção automática decompiladores lex, yacc
Atualmente, um aluno de graduação pode construir um compiladorrapidamente
8/18/2019 1.Introducao a compilação
5/22
8/18/2019 1.Introducao a compilação
6/22
programa-fonte
analisador léxico
analisador sintático
analisador semântico
gerador de código intermediário
otimizador de código
gerador de código
programa-alvo
Tabela de símbolos
Tabela de palavras esímbolos reservados
Manipulaçãode erros
dados deentrada
saída
8/18/2019 1.Introducao a compilação
7/22
programa-fonte
analisador léxico
analisador sintático
analisador semântico
gerador de código intermediário
otimizador de código
gerador de código
programa-alvo
Tabela de símbolos
Tabela de palavras esímbolos reservados
Manipulaçãode erros
dados deentrada
saída
8/18/2019 1.Introducao a compilação
8/22
Léxica: palavras (tokens ) do programa i, while, =, [, (,
8/18/2019 1.Introducao a compilação
9/22
Como diferenciar palavras e símbolos reservados
(while, int, :=) de identificadores definidos pelousuário? Tabela de palavras e símbolos reservados
...
:=
while
int
8/18/2019 1.Introducao a compilação
10/22
Como saber durante a compilação de um programa: tipo e valor dos identificadores, escopo das variáveis,
número e tipo dos parâmetros de um procedimento, etc.? Tabela de símbolos
...
...--procfat
...1integervari
...ValorTipoClasseIdentificador
8/18/2019 1.Introducao a compilação
11/22
!
Reconhecimento e classificação dos tokens Expressões regulares, autômatos
x:=x+y*2
8/18/2019 1.Introducao a compilação
12/22
"
Verificação da formação do programa
Com base em uma gramática livre de contexto Representação explícita ou não da árvore de derivação
comando_atribuição id1 := id1 op id2 op num
8/18/2019 1.Introducao a compilação
13/22
"
Verificação da formação do programa
Com base em uma gramática livre de contexto Representação explícita ou não da árvore de derivação
:=
id1
id1
+
*
id2 num
8/18/2019 1.Introducao a compilação
14/22
#
Verificação do uso adequado
id1 := id1 op id2 op num
(id1)int := (id1 op id2 op num)intbusca_tabela_símbolos(id1)=TRUE
busca_tabela_símbolos(id2)=TRUE
8/18/2019 1.Introducao a compilação
15/22
$ "
Geração de código intermediário/preliminar
id1 := id1 op id2 op num
temp1 := id2 * 2temp2 := id1 + temp1id1 := temp2
Variáveistemporárias geradas
pelo compilador
Código de trêsendereços
8/18/2019 1.Introducao a compilação
16/22
%&
Otimização do código intermediário
temp1 := id2 * 2temp2 := id1 + temp1
id1 := temp2
temp1 := id2 * 2id1 := id1 + temp1
temp2 é usada apenasuma vez atribuição
de valor a id 1
8/18/2019 1.Introducao a compilação
17/22
$
Geração do código para a máquina-alvo
temp1 := id2 * 2id1 := id1 + temp1
MOV id2 R1MULT 2 R1
MOV id1 R2ADD R1 R2MOV R2 id1
8/18/2019 1.Introducao a compilação
18/22
Tokens e seus lexemas
Árvore sintática(implícita ou explícita)
Tabela de
símbolos única
Na prática, fases podem ser agrupadas e asrepresentações intermediárias entre elas nãoprecisam ser construídas explicitamente
8/18/2019 1.Introducao a compilação
19/22
'
Passagem: uma verificação ou transformação de umarepresentação de entrada em uma representação desaída
Compiladores podem ter várias passagens Esquema anterior de compilação
código-fonte
código intermediário
código-alvo Maior tempo de leitura e escrita
Compilador de uma única passagem código-fonte código-alvo Todo processo de compilação em memória: dados de
fases diferentes podem ser necessários para a compilação
8/18/2019 1.Introducao a compilação
20/22
'
Interpretadores: executam instrução por instrução docódigo-fonte
Pré-processadores: agrupam módulos separados de código-fonte
Processadores de macros (por exemplo, defines em C)
Montadores (assemblers): traduzem linguagem demontagem em linguagem de máquina
Carregadores: alocação de instruções de programação e
dados na memória Editores de ligação: criação de um único programa a partir
de diversos programas compilados
8/18/2019 1.Introducao a compilação
21/22
( programa-fonte
Pré-processador
programa-fonte modificado
Compilador
programa-objeto em assembly
Montador
código de máquina relocável
código de máquina alvo
Editor de Ligação/Carregadorarquivos de bibliotecaarquivos-objeto relocáveis
8/18/2019 1.Introducao a compilação
22/22
)
Interpretadores Menores que os compiladores Mais adaptáveis a ambientes computacionais diversos Tempo de execução maior Javascript, Perl
Compiladores Compila-se uma única vez, executando-se quantas vezes se
queira Tempo de execução menor C, Pascal
Compiladores híbridos Compila-se para um código intermediário/virtual, que, por sua
vez, é interpretado por uma máquina virtual
Java