View
30
Download
1
Category
Preview:
DESCRIPTION
CES-41 COMPILADORES. Capítulo I Introdução. Capítulo I - Introdução. 1.1 – Compiladores 1.2 – Estrutura de um compilador 1.3 – Interpretadores 1.4 – Automação da construção de compiladores. 1.1 – Compiladores. 1.1.1 – Definição Genericamente falando, compilador é um software que - PowerPoint PPT Presentation
Citation preview
CES-41 CES-41 COMPILADORESCOMPILADORES
Capítulo I Capítulo I
IntroduçãoIntrodução
Capítulo I - IntroduçãoCapítulo I - Introdução
1.1 – Compiladores1.1 – Compiladores
1.2 – Estrutura de um compilador1.2 – Estrutura de um compilador
1.3 – Interpretadores 1.3 – Interpretadores
1.4 – Automação da construção de 1.4 – Automação da construção de compiladorescompiladores
1.1 – Compiladores1.1 – Compiladores
1.1.1 –1.1.1 – DefiniçãoDefinição
Genericamente falando,Genericamente falando, compilador compilador é um é um software quesoftware que
Lê um programa escrito numa linguagem: a Lê um programa escrito numa linguagem: a linguagem-fontelinguagem-fonte (é o (é o programa-fonteprograma-fonte))
Traduz em um programa equivalente, escrito Traduz em um programa equivalente, escrito noutra linguagem : a noutra linguagem : a linguagem-objeto linguagem-objeto (é o (é o programa-objetoprograma-objeto))
Reporta a presença de Reporta a presença de erroserros no programa-fonte no programa-fonte
Esquematicamente:Esquematicamente:
CompiladorPrograma fonte
Programa objeto
Mensagens
de erro
Possíveis linguagens-fontes:Possíveis linguagens-fontes:
Mais comuns: Mais comuns: linguagens tradicionaislinguagens tradicionais de de programação: Fortran, Pascal, C, Modula-2, C+programação: Fortran, Pascal, C, Modula-2, C++, Java, etc.+, Java, etc.
Linguagens especializadasLinguagens especializadas: simulação, : simulação, computação gráfica, banco de dados, computação gráfica, banco de dados, experimentosexperimentos
Possíveis linguagens-objetos:Possíveis linguagens-objetos:
Mais comuns: Mais comuns: linguagem assemblylinguagem assembly ou ou linguagem de máquinalinguagem de máquina de vários de vários computadorescomputadores
Outras Outras linguagens de programaçãolinguagens de programação
Exemplos de linguagens de programação Exemplos de linguagens de programação como linguagens-objetos:como linguagens-objetos:
Transformação de Transformação de programas sequenciaisprogramas sequenciais escritos em escritos em CC ou ou FortranFortran, em programas , em programas paralelos escritos em paralelos escritos em HPF (High HPF (High Performance Fortran)Performance Fortran)
for (i = 1; i <= n; i++)
C[i] = A[i] + B[i]
do parallel i = 1, n
C[i] = A[i] + B[i]
for (i = 1; i <= n; i++)
C[i] = A[i] + C[i-1]
do parallel i = 1, n
C[i] = A[i] + C[i-1]
Tradução de Tradução de programas realizadoresprogramas realizadores de certos de certos experimentosexperimentos::
Escritos numa Escritos numa linguagem especializadalinguagem especializada
Traduzidos Traduzidos (compilados)(compilados) para uma para uma linguagem de programaçãolinguagem de programação como como CC
Compilados depois por um Compilados depois por um compiladorcompilador similar ao de similar ao de CC
Programas em Programas em LexLex e e YaccYacc são traduzidos para são traduzidos para CC
Lex Lex e e Yacc Yacc são linguagens são linguagens especializadas especializadas para construir componentes de um para construir componentes de um compiladorcompilador
Há ainda o “Há ainda o “compiladorcompilador”” Assembler Assembler::
Linguagem-fonte: Linguagem-fonte: AssemblyAssembly
Linguagem-objeto: Linguagem-objeto: linguagem de máquinalinguagem de máquina
Enfoque desta disciplina:Enfoque desta disciplina:
A linguagem-fonte é uma A linguagem-fonte é uma linguagem tradicionallinguagem tradicional e e a linguagem-objeto é o a linguagem-objeto é o AssemblyAssembly de uma máquinade uma máquina
Para a Para a implementaçãoimplementação, a linguagem-fonte é, a linguagem-fonte é Lex Lex ee YaccYacc e a linguagem-objeto ée a linguagem-objeto é C C
1.1.2 –1.1.2 – O contexto de um compiladorO contexto de um compilador
Além do compilador, Além do compilador, outros programasoutros programas são são exigidos para criar um exigidos para criar um programa executávelprograma executável nalguma máquinanalguma máquina
Pré-processador
Programa fonte puro
Compilador
Programa objeto em Assembly
Montador
Código de máquina com endereçamento deslocado
Editor de Ligações
Bibliotecas e outros arquivos com
endereçamento deslocadoCódigo de máquina executável com
endereçamento deslocado
CarregadorCódigo de máquina
executável com endereçamento
correto
Programa fonte com
diretivas de pré-
processamento
a) Pré-processador – a) Pré-processador – realiza várias tarefas realiza várias tarefas antes da compilação:antes da compilação:
Inclusão de arquivos ao programa-fonte –Inclusão de arquivos ao programa-fonte – Por exemplo, na Linguagem C:Por exemplo, na Linguagem C:
#include <math.h>:#include <math.h>: inclui protótipos de inclui protótipos de funções matemáticas pertencentes à funções matemáticas pertencentes à biblioteca da linguagem; essas funções já biblioteca da linguagem; essas funções já estão em linguagem de máquinaestão em linguagem de máquina
#include “sistemas.c”:#include “sistemas.c”: inclui arquivo inclui arquivo pertencente ao acervo do programador; pertencente ao acervo do programador; contém código fontecontém código fonte
Processamento de macros –Processamento de macros – para abreviar para abreviar construções longas construções longas
Exemplo, em C, com as macros:Exemplo, em C, com as macros:
#define EHPAR(x) (((x)%2)?0:1)#define EHPAR(x) (((x)%2)?0:1)#define ERRO(msg) printf (“ERRO: % s/n”, #define ERRO(msg) printf (“ERRO: % s/n”,
msg)msg)
pode-se escrever comandos dos tipos:pode-se escrever comandos dos tipos:
if (EHPAR(a+b)) --------------;if (EHPAR(a+b)) --------------;if (valor if (valor max) ERRO(“valor muito grande”); max) ERRO(“valor muito grande”);
O resultado do pré-processamento é:O resultado do pré-processamento é:
if ((((a+b)%2)?0:1)) ....... ;if ((((a+b)%2)?0:1)) ....... ;if (valor > max) printf(“ERRO:%s\n”,“valor muito if (valor > max) printf(“ERRO:%s\n”,“valor muito
grande”);grande”);
O pré-processador substitui a primeira parte do #define pela segunda, realizando inclusive passagem de argumentos
Processamento de extensões de linguagens:Processamento de extensões de linguagens:
Algumas linguagens são Algumas linguagens são acrescidasacrescidas de certos de certos artifíciosartifícios para propósitos específicos de certas para propósitos específicos de certas aplicaçõesaplicações
Exemplos:Exemplos: comandos para manipular banco de comandos para manipular banco de dados, para computação gráfica, processamento dados, para computação gráfica, processamento paralelo, etc.paralelo, etc.
Muitas linguagens são, na realidade, Muitas linguagens são, na realidade, extensões extensões da Linguagem Cda Linguagem C
DiretivasDiretivas iniciadas pelos caracteres iniciadas pelos caracteres “##” “##” são são substituídas pelo pré-processador por chamadas substituídas pelo pré-processador por chamadas de de funçõesfunções, comandos do , comandos do sistema operacionalsistema operacional, , etc.etc.
b) Montador (Assembler):b) Montador (Assembler):
Transforma o código Transforma o código AssemblyAssembly, produzido pelo , produzido pelo compilador, em código de máquina relocávelcompilador, em código de máquina relocável
Exemplo:Exemplo: programa em C para o cálculo do programa em C para o cálculo do fatorial de um número digitado e seus fatorial de um número digitado e seus correspondentes em correspondentes em AssemblyAssembly e em e em linguagem de máquinalinguagem de máquina
Supõe-se uma Supõe-se uma CPU bem simplesCPU bem simples, com apenas , com apenas um registrador de propósitos gerais (um registrador de propósitos gerais (AC - AC - acumuladoracumulador))Para fazer
C = A + BSendo A, B e C endereços de memória
Instrução Significado
LD A AC Mem(A)
ADD B AC AC + Mem(B)
ST C Mem(C) AC
#include <stdio.h>void main ( ){
int n, fat, i;scanf (“%d”, &n);fat = 1;i = 2;while (i <= n) {
fat = fat * i;i = i + 1;
}printf (“%d”, fat);
}
Primeiramente, reserva de espaço para as constantes 1 e 2
C1: CONST 1C2: CONST 2
#include <stdio.h>void main ( ){
int n, fat, i;scanf (“%d”, &n);fat = 1;i = 2;while (i <= n) {
fat = fat * i;i = i + 1;
}printf (“%d”, fat);
}
Em seguida, reserva de espaço para as variáveis n, i, fat
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0
#include <stdio.h>void main ( ){
int n, fat, i;scanf (“%d”, &n);fat = 1;i = 2;while (i <= n) {
fat = fat * i;i = i + 1;
}printf (“%d”, fat);
}
Agora a tradução dos comandos
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0
#include <stdio.h>void main ( ){
int n, fat, i;scanf (“%d”, &n);fat = 1;i = 2;while (i <= n) {
fat = fat * i;i = i + 1;
}printf (“%d”, fat);
}
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
Na realidade, a tradução de scanf é algo mais complexo:
É uma chamada de subprograma
Rótulo da 1ª instrução executável:
inic
#include <stdio.h>void main ( ){
int n, fat, i;scanf (“%d”, &n);fat = 1;i = 2;while (i <= n) {
fat = fat * i;i = i + 1;
}printf (“%d”, fat);
}
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
Rótulo da 1ª instrução executável:
inic
#include <stdio.h>void main ( ){
int n, fat, i;scanf (“%d”, &n);fat = 1;i = 2;while (i <= n) {
fat = fat * i;i = i + 1;
}printf (“%d”, fat);
}
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP escrever
JUMP loop
Rótulo da 1ª instrução executável:
inic
“escrever” é o rótulo da instrução logo após JUMP
#include <stdio.h>void main ( ){
int n, fat, i;scanf (“%d”, &n);fat = 1;i = 2;while (i <= n) {
fat = fat * i;i = i + 1;
}printf (“%d”, fat);
}
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
Rótulo da 1ª instrução executável:
inic
#include <stdio.h>void main ( ){
int n, fat, i;scanf (“%d”, &n);fat = 1;i = 2;while (i <= n) {
fat = fat * i;i = i + 1;
}printf (“%d”, fat);
}
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITEfat
Rótulo da 1ª instrução executável:
inic
Na realidade, a tradução de printf é algo mais complexo:
É uma chamada de subprograma
#include <stdio.h>void main ( ){
int n, fat, i;scanf (“%d”, &n);fat = 1;i = 2;while (i <= n) {
fat = fat * i;i = i + 1;
}printf (“%d”, fat);
}
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITEfat
STOPEND inic
Rótulo da 1ª instrução executável:
inic
#include <stdio.h>void main ( ){
int n, fat, i;scanf (“%d”, &n);fat = 1;i = 2;while (i <= n) {
fat = fat * i;i = i + 1;
}printf (“%d”, fat);
}
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITEfat
STOPEND inic
Final da compilação
Agora vem a montagem
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP
escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITE fat
STOPEND inic
endereço
codop ender
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rótulo endereço
O Assembler monta uma tabela de rótulos para ajudar a preencher o programa em linguagem de máquina
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP
escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITE fat
STOPEND inic
endereço
codop ender
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rótulo endereço
Mnemônico
Cod Op
LD 1
ST 2
ADD 4
SUB 5
MULT 6
JUMP 11
JP 14
READ 15
WRITE 16
STOP 17
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP
escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITE fat
STOPEND inic
endereço
codop ender
0 1
1 2
2 0
3 0
4 0
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rótulo endereço
C1 0
C2 1
n 2
fat 3
i 4
Mnemônico
Cod Op
LD 1
ST 2
ADD 4
SUB 5
MULT 6
JUMP 11
JP 14
READ 15
WRITE 16
STOP 17
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP
escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITE fat
STOPEND inic
endereço
codop ender
0 1
1 2
2 0
3 0
4 0
5 15 2
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rótulo endereço
C1 0
C2 1
n 2
fat 3
i 4
inic 5
Mnemônico
Cod Op
LD 1
ST 2
ADD 4
SUB 5
MULT 6
JUMP 11
JP 14
READ 15
WRITE 16
STOP 17
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP
escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITE fat
STOPEND inic
endereço
codop ender
0 1
1 2
2 0
3 0
4 0
5 15 2
6 1 0
7 2 3
8 1 1
9 2 4
10
11
12
13
14
15
16
17
18
19
20
rótulo endereço
C1 0
C2 1
n 2
fat 3
i 4
inic 5
Mnemônico
Cod Op
LD 1
ST 2
ADD 4
SUB 5
MULT 6
JUMP 11
JP 14
READ 15
WRITE 16
STOP 17
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP
escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITE fat
STOPEND inic
endereço
codop ender
0 1
1 2
2 0
3 0
4 0
5 15 2
6 1 0
7 2 3
8 1 1
9 2 4
10 5 2
11
12
13
14
15
16
17
18
19
20
rótulo endereço
C1 0
C2 1
n 2
fat 3
i 4
inic 5
loop 10
Mnemônico
Cod Op
LD 1
ST 2
ADD 4
SUB 5
MULT 6
JUMP 11
JP 14
READ 15
WRITE 16
STOP 17
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP
escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITE fat
STOPEND inic
endereço
codop ender
0 1
1 2
2 0
3 0
4 0
5 15 2
6 1 0
7 2 3
8 1 1
9 2 4
10 5 2
11 14 ???
12
13
14
15
16
17
18
19
20
rótulo endereço
C1 0
C2 1
n 2
fat 3
i 4
inic 5
loop 10
escrever ???
Mnemônico
Cod Op
LD 1
ST 2
ADD 4
SUB 5
MULT 6
JUMP 11
JP 14
READ 15
WRITE 16
STOP 17
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP
escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITE fat
STOPEND inic
endereço
codop ender
0 1
1 2
2 0
3 0
4 0
5 15 2
6 1 0
7 2 3
8 1 1
9 2 4
10 5 2
11 14 ???
12 1 3
13 6 4
14 2 3
15 1 4
16 4 0
17 2 4
18 11 10
19
20
rótulo endereço
C1 0
C2 1
n 2
fat 3
i 4
inic 5
loop 10
escrever ???
Mnemônico
Cod Op
LD 1
ST 2
ADD 4
SUB 5
MULT 6
JUMP 11
JP 14
READ 15
WRITE 16
STOP 17
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP
escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITE fat
STOPEND inic
endereço
codop ender
0 1
1 2
2 0
3 0
4 0
5 15 2
6 1 0
7 2 3
8 1 1
9 2 4
10 5 2
11 14 19
12 1 3
13 6 4
14 2 3
15 1 4
16 4 0
17 2 4
18 11 10
19 16 3
20
rótulo endereço
C1 0
C2 1
n 2
fat 3
i 4
inic 5
loop 10
escrever 19
Mnemônico
Cod Op
LD 1
ST 2
ADD 4
SUB 5
MULT 6
JUMP 11
JP 14
READ 15
WRITE 16
STOP 17
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP
escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITE fat
STOPEND inic
endereço
codop ender
0 1
1 2
2 0
3 0
4 0
5 15 2
6 1 0
7 2 3
8 1 1
9 2 4
10 5 2
11 14 19
12 1 3
13 6 4
14 2 3
15 1 4
16 4 0
17 2 4
18 11 10
19 16 3
20 17 0
rótulo endereço
C1 0
C2 1
n 2
fat 3
i 4
inic 5
loop 10
escrever 19
Mnemônico
Cod Op
LD 1
ST 2
ADD 4
SUB 5
MULT 6
JUMP 11
JP 14
READ 15
WRITE 16
STOP 17
C1: CONST 1C2: CONST 2n: CONST 0fat: CONST 0i: CONST 0inic: READ n
LD C1ST fatLD C2ST i
loop: SUB nJP
escreverLD fatMULT iST fatLD iADD C1ST iJUMP loop
escrever:WRITE fat
STOPEND inic
endereço
codop ender
0 1
1 2
2 0
3 0
4 0
5 15 2
6 1 0
7 2 3
8 1 1
9 2 4
10 5 2
11 14 19
12 1 3
13 6 4
14 2 3
15 1 4
16 4 0
17 2 4
18 11 10
19 16 3
20 17 0
rótulo endereço
C1 0
C2 1
n 2
fat 3
i 4
inic 5
loop 10
escrever 19
Endereço inicial da execução: 5
Essa informação deve acompanhar o programa em linguagem de máquina
O programa em linguagem O programa em linguagem C é o C é o programa-fonteprograma-fonte
O programa gerado pelo O programa gerado pelo Assembler é o Assembler é o programa-programa-objetoobjeto
O programa-objeto foi O programa-objeto foi montado a partir do montado a partir do endereço zeroendereço zero da RAM da RAM
Esse programa é guardado Esse programa é guardado num num arquivo arquivo (extensão (extensão objobj))
endereço
codop ender
0 1
1 2
2 0
3 0
4 0
5 15 2
6 1 0
7 2 3
8 1 1
9 2 4
10 5 2
11 14 19
12 1 3
13 6 4
14 2 3
15 1 4
16 4 0
17 2 4
18 11 10
19 16 3
20 17 0
Endereço inicial da execução: 5
O local para execução é O local para execução é estabelecido pelo estabelecido pelo sistema sistema operacionaloperacional do do computadorcomputador
Esse local depende da Esse local depende da disponibilidadedisponibilidade da RAM da RAM
E se o local E se o local não for o não for o endereço zeroendereço zero (por (por exemplo, endereço 3000)?exemplo, endereço 3000)?
endereço
codop ender
0 1
1 2
2 0
3 0
4 0
5 15 2
6 1 0
7 2 3
8 1 1
9 2 4
10 5 2
11 14 19
12 1 3
13 6 4
14 2 3
15 1 4
16 4 0
17 2 4
18 11 10
19 16 3
20 17 0
Endereço inicial da execução: 5
Os locais para C1, C2, n, fat e i Os locais para C1, C2, n, fat e i não são mais não são mais 00, , 11, , 22, , 33 e e 44, , mas sim mas sim 30003000, , 30013001, , 30023002, , 30033003 e e 30043004
Os rótulos Os rótulos inicinic, , looploop e e escreverescrever mudarão para os mudarão para os endereços endereços 30053005, , 30103010 e e 30193019
Então todos os Então todos os endereçosendereços das das instruções estarão com um instruções estarão com um erro erro (deslocamento de(deslocamento de 3000 3000 posições)posições)
Isso tem de ser Isso tem de ser corrigidocorrigido antes da execuçãoantes da execução
endereço
codop ender
3000 1
3001 2
3002 0
3003 0
3004 0
3005 15 2
3006 1 0
3007 2 3
3008 1 1
3009 2 4
3010 5 2
3011 14 19
3012 1 3
3013 6 4
3014 2 3
3015 1 4
3016 4 0
3017 2 4
3018 11 10
3019 16 3
3020 17 0
Endereço inicial da execução: 3005
c) Editor de ligaçõesc) Editor de ligações
Antes de corrigir os endereços do programa-Antes de corrigir os endereços do programa-objeto, é necessário juntar a ele todos os objeto, é necessário juntar a ele todos os subprogramas auxiliaressubprogramas auxiliares pertencentes à pertencentes à bibliotecabiblioteca da linguagem da linguagem
Exemplos: Exemplos: funções para funções para entrada e saídaentrada e saída (scanf, (scanf, printf, etc.), funções printf, etc.), funções matemáticasmatemáticas (sqr, pow, sqrt, (sqr, pow, sqrt, log, sin, cos, etc.)log, sin, cos, etc.)
Esse trabalho de juntar o programa-objeto com Esse trabalho de juntar o programa-objeto com tais subprogramas é feito por um software tais subprogramas é feito por um software denominado denominado editor de ligações (linkage-editor)editor de ligações (linkage-editor)
O produto do editor de ligações é um arquivo O produto do editor de ligações é um arquivo denominado denominado programa-executável programa-executável (extensão (extensão exeexe))
d) Carregadord) Carregador
A A região de memóriaregião de memória onde um programa será onde um programa será alocado para execuçãoalocado para execução só será conhecida só será conhecida quando ele for chamado para issoquando ele for chamado para isso
Então o Então o endereçamentoendereçamento do arquivo do arquivo executável precisa ser executável precisa ser corrigidocorrigido, quando sua , quando sua execução for solicitadaexecução for solicitada
Esse trabalho é feito pelo Esse trabalho é feito pelo carregador carregador (loader)(loader), que produz a , que produz a versão finalversão final do do programa, pronto para rodarprograma, pronto para rodar
1.2 – Estrutura de um 1.2 – Estrutura de um Compilador Compilador
1.2.1 – Componentes de um 1.2.1 – Componentes de um compiladorcompilador
O trabalho de compilação é dividido em 2 O trabalho de compilação é dividido em 2 fases:fases:
Fase de Fase de análiseanálise e fase de e fase de síntesesíntese
Além disso, existem Além disso, existem atividadesatividades que fazem que fazem parte das parte das duas fasesduas fases
O processo não precisa ser sequencial
load iR1: sub n JZ R2 JP R2 load i add j st i J R1R2: - - - - -
Exemplo
Analisador léxico
Analisador sintático
Analisador
semânticoGerador de
código intermediári
o
Otimizador de código
intermediário
Gerador de código objeto
while (i < n) i = i + j;Programa-fonte (caracteres)
Sequência de átomos
Árvore sintática
while
i
<
n i
=
i
+
j
i
n
j
int
int
int
- - -- - -- - -Tabela
de símbolos
while ( i < n )
i = i + j ;
R1: T1 = i < n JF T1 R2 T2 = i + j i = T2 JUMP R1R2: - - - - -
Código intermediário
R1: T1 = i < n JF T1 R2 i = i + j JUMP R1R2: - - - - -
Código objeto
1.2.2 –1.2.2 – A fase de análiseA fase de análise
São realizados três tipos de análise:São realizados três tipos de análise:
Análise linear ou léxicaAnálise linear ou léxica Análise hierárquica ou sintáticaAnálise hierárquica ou sintática Análise semânticaAnálise semântica
a) Análise léxicaa) Análise léxica
Os caracteres do texto são agrupados em Os caracteres do texto são agrupados em átomosátomos ( (tokenstokens))
A A validadevalidade dos átomos é verificada dos átomos é verificada
Os átomos recebem uma Os átomos recebem uma classificaçãoclassificação
Exemplo:Exemplo: frase da Língua Portuguesa: frase da Língua Portuguesa:
ajbxswn o homem alto apanhou a laranja ajbxswn o homem alto apanhou a laranja madura na laranjeira tdhfmadura na laranjeira tdhf
Exemplo:Exemplo: um comando um comando whilewhile em Pascal: em Pascal:
while num while num 50 do num := num * 2 50 do num := num * 2
b) Análise sintáticab) Análise sintática
Os átomos são agrupados em frases, em Os átomos são agrupados em frases, em estrutura de árvoreestrutura de árvore (árvore sintática) (árvore sintática)
A validade da A validade da posição dos átomosposição dos átomos é é verificadaverificada
Exemplo: Exemplo: frase:frase:
o homem alto apanhou a laranja madura o homem alto apanhou a laranja madura na laranjeirana laranjeira
Exemplo: Exemplo: comando comando whilewhile de Pascal: de Pascal:
while num while num 50 do num := num * 2 50 do num := num * 2
c) Análise semânticac) Análise semântica
Verifica se a Verifica se a árvore sintáticaárvore sintática tem tem sentidosentido
Coleta informações de Coleta informações de tipostipos para a fase de para a fase de síntesesíntese
Exemplo: Exemplo: frase sem sentido: frase sem sentido:
a laranja apanhou o homema laranja apanhou o homem
Erro:Erro: o verbo o verbo apanharapanhar não admite sujeito não admite sujeito do tipo do tipo vegetalvegetal
Exemplo: Exemplo: comando comando whilewhile de Pascal: de Pascal:
while n+3 do n*5 while n+3 do n*5 (com integer n) (com integer n)
Erro:
O operador de uma atribuição deve ser “:=”
Erro:
A expressão de um comando while deve ser do tipo lógico
1.2.3 –1.2.3 – A fase de sínteseA fase de síntese
Depois da análise, a fase de Depois da análise, a fase de síntesesíntese constrói o constrói o programa objetoprograma objeto
São realizadas três tarefas:São realizadas três tarefas:
Geração do código intermediárioGeração do código intermediário
Otimização do código intermediárioOtimização do código intermediário
Geração do código objetoGeração do código objeto
a) Geração do código intermediário:a) Geração do código intermediário:
A estrutura do A estrutura do programa-fonteprograma-fonte costuma ser costuma ser bem bem diferentediferente da estrutura do da estrutura do programa-objetoprograma-objeto
A A transformaçãotransformação da primeira estrutura para a da primeira estrutura para a segunda deve ser segunda deve ser aliviadaaliviada passando por uma passando por uma fase fase intermediáriaintermediária
Fazendo analogia comFazendo analogia com metamorfose na vida metamorfose na vida animal:animal:
Ovo Ovo Lagarta Lagarta Borboleta Borboleta
Ovo Ovo Girino Girino Sapo Sapo
Exemplo:Exemplo:
while n while n 50 do n := n * 2 50 do n := n * 2
Quádruplas:
1º elemento: operador 2º e 3º elementos: operandos4º elemento: resultado
Código de três endereços:
2 endereços p/operandos 1 endereço p/resultado
O código intermediário deve ser O código intermediário deve ser fácilfácil de: de:
Ser Ser produzidoproduzido
Ser Ser transformadotransformado em código objeto em código objeto ((AssemblyAssembly da máquina) da máquina)
b) Otimização do código intermediário:b) Otimização do código intermediário:
Elimina operações desnecessárias e repetidasElimina operações desnecessárias e repetidas
Visa simplificar o código intermediárioVisa simplificar o código intermediário
Visa tornar o programa executável mais rápidoVisa tornar o programa executável mais rápido
Visa economia de memóriaVisa economia de memória
Exemplo: Exemplo: sejam os comandossejam os comandos
x := a + b + c;x := a + b + c;
y := a + b + c + d;y := a + b + c + d;
Outros casos para otimização:Outros casos para otimização:
Detecção de atribuições e operações cujos Detecção de atribuições e operações cujos valores valores não são usadosnão são usados no programa no programa
Detecção de Detecção de código mortocódigo morto, ou seja, de , ou seja, de código que código que não é executadonão é executado, qualquer que , qualquer que seja a entrada de dadosseja a entrada de dados
OtimizaçãoOtimização faz análise de faz análise de fluxo de dados e fluxo de dados e de controlede controle
c) Geração do código objeto:c) Geração do código objeto:
Transformação do código intermediário Transformação do código intermediário otimizado no otimizado no código objetocódigo objeto (normalmente o (normalmente o AssemblyAssembly da máquina alvo) da máquina alvo)
O código objeto pode também receber O código objeto pode também receber otimizaçõesotimizações
Exemplo: Exemplo: seja o comandoseja o comando
while n < 50 do n := n * 2while n < 50 do n := n * 2
1.2.4 –1.2.4 – Atividades em ambas as fasesAtividades em ambas as fases
Manipulação da tabela de símbolosManipulação da tabela de símbolos Tratamento de errosTratamento de erros
a) Tabela de símbolosa) Tabela de símbolos
Guarda Guarda informaçõesinformações sobre todos os sobre todos os identificadoresidentificadores usados em um programa usados em um programa
Informações sobre os identificadores:Informações sobre os identificadores:
Tipo Tipo do identificador:do identificador:
VariávelVariável ConstanteConstante Definição de tipoDefinição de tipo Nome de subprogramaNome de subprograma RótuloRótulo
Escopo:Escopo: em que trecho ele é válido em que trecho ele é válido
Se for nome de Se for nome de variável:variável:
Tipo
Se é ou não indexada
Se é ou não estrutura
Se é ou não ponteiro
Endereço de memória
Espaço a ser alocado
Se for variável indexada
Número de dimensões
Número de elementos em cada dimensão
Se for estrutura:
Nome e tipo de cada campo
Se for ponteiro:
Tipo dos locais apontados por ela
Exemplos em C:Exemplos em C:
intint a; a;
float float X[7][5][4];X[7][5][4];
anom
e
vartipo
inttipov
ar
nãoeharr
ay
Xnom
e
vartipo
realtipov
ar
simeharr
ay
3ndim
7 5 4
dims
0 1 2
Se for nome de Se for nome de subprograma:subprograma:
Tipo Tipo de subprogramade subprograma (função ou (função ou procedimento)procedimento)
Número de Número de parâmetrosparâmetros
Lista de parâmetros por Lista de parâmetros por valorvalor
Lista de parâmetros por Lista de parâmetros por referênciareferência
Tipo a ser Tipo a ser retornadoretornado
Lista de Lista de variáveis locaisvariáveis locais
Exemplo em C:Exemplo em C:
int fff (int m, int n) {float a, b; - - - - - }int fff (int m, int n) {float a, b; - - - - - }
fff func int 2nome tipo tipofun nparam List
paramList Var Loc
nnome
vartipo
inttipovar
bnome
vartipo
realtipovar
mnome
vartipo
inttipovar
anome
vartipo
realtipovar
A A tabela de símbolostabela de símbolos é manipulada pelos vários é manipulada pelos vários componentescomponentes das fases de das fases de análiseanálise e e síntesesíntese: :
Análise léxicaAnálise léxica detecta e pode armazenar o detecta e pode armazenar o identificadoridentificador
Análise sintáticaAnálise sintática pode armazenar seu tipo e pode armazenar seu tipo e outras informações outras informações
Análise semânticaAnálise semântica faz consultas à tabela faz consultas à tabela
Geração de códigoGeração de código introduz e usa introduz e usa informações sobre espaço alocado informações sobre espaço alocado
b) Detecção e tratamento de errosb) Detecção e tratamento de erros
Cada componenteCada componente do compilador pode do compilador pode encontrar encontrar erroserros
EncontradoEncontrado um erro, um componente deve um erro, um componente deve tratá-lotratá-lo de forma a permitir que de forma a permitir que outros errosoutros erros sejam detectadossejam detectados
Um compilador que Um compilador que parapara, quando encontra o , quando encontra o primeiro erroprimeiro erro, não pode ajudar muito, não pode ajudar muito
Existem erros léxicos, sintáticos e Existem erros léxicos, sintáticos e semânticossemânticos
Exemplos:Exemplos:
Erro léxico:Erro léxico: Conjunto de caracteres que não Conjunto de caracteres que não corresponde a nenhum átomocorresponde a nenhum átomo
Erro sintático:Erro sintático: Sequência de átomos que Sequência de átomos que viola construções sintáticasviola construções sintáticas
Erro semântico:Erro semântico: Construções sintáticas Construções sintáticas corretas porém sem sentidocorretas porém sem sentido
Cada Cada componentecomponente da estrutura do compilador da estrutura do compilador será estudado detalhadamente em será estudado detalhadamente em capítulo capítulo específicoespecífico
1.2.5 – Outra decomposição de um 1.2.5 – Outra decomposição de um compiladorcompilador
Compilador é uma Compilador é uma interfaceinterface entre: entre:
linguagem-fonte linguagem-fonte ee máquina-alvo máquina-alvo
Frente ou front-end : Frente ou front-end : parte do compilador parte do compilador dependente da linguagem-fontedependente da linguagem-fonte
Retaguarda ou back-end:Retaguarda ou back-end: parte do parte do compilador dependente da máquina-alvocompilador dependente da máquina-alvo
Frente (front-end) Frente (front-end) compreende:compreende:
Análises léxica, sintática e semânticaAnálises léxica, sintática e semântica
Criação e consultas à tabela de símbolosCriação e consultas à tabela de símbolos
Geração do código intermediárioGeração do código intermediário
Muita otimização do código intermediárioMuita otimização do código intermediário
Tratamento de erros léxicos, sintáticos e Tratamento de erros léxicos, sintáticos e semânticossemânticos
Retaguarda (back-end) Retaguarda (back-end) compreende:compreende:
Alguma otimização do código Alguma otimização do código intermediáriointermediário
Geração de código objetoGeração de código objeto
Otimização do código objetoOtimização do código objeto
Operações na tabela de símbolos Operações na tabela de símbolos
Tratamento de alguns errosTratamento de alguns erros
Essa decomposição Essa decomposição facilitafacilita a criação de a criação de compiladores de: compiladores de:
Mesma linguagem-fonteMesma linguagem-fonte para para várias várias máquinas-alvosmáquinas-alvos
Várias linguagens-fontesVárias linguagens-fontes para para mesma mesma máquina-alvomáquina-alvo
L
M1
M2
Mi M
L1 L2 Lj
Uma única linguagem para código intermediário
No primeiro caso: No primeiro caso: sucesso absolutosucesso absoluto
Pode-se projetar um Pode-se projetar um código intermediáriocódigo intermediário que se aproxime bem da linguagem de que se aproxime bem da linguagem de máquina de uma máquina de uma variedade de arquiteturasvariedade de arquiteturas
L
M1
M2
Mi M
L1 L2 Lj
No segundo caso: No segundo caso: sucesso limitadosucesso limitado
DiferençasDiferenças sutis entre algumas linguagens sutis entre algumas linguagens dificultamdificultam a obtenção de um a obtenção de um código código intermediáriointermediário comum entre elas comum entre elas
L
M1
M2
Mi M
L1 L2 Lj
Recommended