ces-41 compiladores capítulo i introdução. capítulo i - introdução 1.1 – compiladores 1.2...

76
CES-41 CES-41 COMPILADORES COMPILADORES Capítulo I Capítulo I Introdução Introdução

Upload: internet

Post on 17-Apr-2015

113 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 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

CES-41 CES-41 COMPILADORESCOMPILADORES

Capítulo I Capítulo I

IntroduçãoIntrodução

Page 2: 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

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

Page 3: 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

1.1 – Compiladores1.1 – Compiladores

1.1.1 –1.1.1 – DefiniçãoDefinição

CompiladorCompilador é um software que é um software 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- no programa-fontefonte

Page 4: 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

Esquematicamente:Esquematicamente:

CompiladorPrograma fonte

Programa objeto

Mensagens

de erro

Page 5: 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

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

Page 6: 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

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]

Page 7: 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

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

Page 8: 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

Enfoque desta disciplina:Enfoque desta disciplina:

A linguagem-fonte é uma A linguagem-fonte é uma linguagem linguagem tradicionaltradicional e a linguagem-objeto é o e 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 Yacc Yacc e a linguagem-objeto ée a linguagem-objeto é C C

Page 9: 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

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

Page 10: 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

Pré-processador

Programa fonte

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

Page 11: 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

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 –Inclusão de arquivos ao programa – Por Por exemplo, na Linguagem C: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

Page 12: 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

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

Page 13: 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

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.

Page 14: 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

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

Page 15: 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

#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

Page 16: 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

#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

Page 17: 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

#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

Page 18: 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

#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

Page 19: 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

#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

Page 20: 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

#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

Page 21: 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

#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

Page 22: 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

#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

Page 23: 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

#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

Page 24: 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

#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

Page 25: 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

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

Page 26: 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

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

Page 27: 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

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

Page 28: 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

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

Page 29: 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

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

Page 30: 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

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

Page 31: 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

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

Page 32: 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

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

Page 33: 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

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

Page 34: 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

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

Page 35: 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

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

Page 36: 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

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

Page 37: 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

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

Page 38: 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

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 campos Então todos os campos enderender das instruções estarão com um das 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

Page 39: 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

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))

Page 40: 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

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

Page 41: 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

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

Page 42: 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

O processo não precisa ser sequencial

Page 43: 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

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

Page 44: 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

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

Page 45: 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

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

Page 46: 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

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

Page 47: 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

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

Page 48: 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

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

Page 49: 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

Exemplo: Exemplo: frase:frase:

o homem alto apanhou a laranja madura o homem alto apanhou a laranja madura na laranjeirana laranjeira

Page 50: 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

Exemplo: Exemplo: comando comando whilewhile de Pascal: de Pascal:

while num while num 50 do num := num * 2 50 do num := num * 2

Page 51: 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

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

Page 52: 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

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

Page 53: 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

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

Page 54: 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

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

Page 55: 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

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

Page 56: 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

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

Page 57: 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

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)

Page 58: 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

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

Page 59: 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

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;

Page 60: 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

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

Page 61: 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

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

Page 62: 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

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

Page 63: 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

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

Page 64: 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

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

Page 65: 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

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

Page 66: 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

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

Page 67: 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

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

Page 68: 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

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

Page 69: 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

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

Page 70: 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

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

Page 71: 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

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

Page 72: 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

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

Page 73: 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

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

Page 74: 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

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

Page 75: 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

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

Page 76: 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

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