Professional Documents
Culture Documents
Anlise Semntica
http://www.dcc.ufrj.br/~fabiom/comp
Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) {
int a, b, c, d; } bar() {
int f[3],g[0], h, i, j, k; char *p;
foo(h,i,ab,j, k);
k = f * i + j;
h = g[17];
printf(<%s,%s>.\n,p,q);
p = 10; }
Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) {
int a, b, c, d; } bar() {
int f[3],g[0], h, i, j, k; char *p;
foo(h,i,ab,j, k);
k = f * i + j;
h = g[17];
printf(<%s,%s>.\n,p,q);
p = 10; }
O que h de errado?
Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) {
int a, b, c, d; } bar() {
int f[3],g[0], h, i, j, k; char *p;
foo(h,i,ab,j, k);
k = f * i + j;
h = g[17];
printf(<%s,%s>.\n,p,q);
p = 10; }
O que h de errado?
(vamos contar)
Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) {
int a, b, c, d; } bar() {
int f[3],g[0], h, i, j, k; char *p;
foo(h,i,ab,j, k);
k = f * i + j;
h = g[17];
printf(<%s,%s>.\n,p,q);
p = 10; }
O que h de errado?
(vamos contar)
Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) {
int a, b, c, d; } bar() {
int f[3],g[0], h, i, j, k; char *p;
foo(h,i,ab,j, k);
k = f * i + j;
h = g[17];
printf(<%s,%s>.\n,p,q);
p = 10; }
O que h de errado?
(vamos contar)
Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) {
int a, b, c, d; } bar() {
int f[3],g[0], h, i, j, k; char *p;
foo(h,i,ab,j, k);
k = f * i + j;
h = g[17];
printf(<%s,%s>.\n,p,q);
p = 10; }
O que h de errado?
(vamos contar)
Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) {
int a, b, c, d; } bar() {
int f[3],g[0], h, i, j, k; char *p;
foo(h,i,ab,j, k);
k = f * i + j;
h = g[17];
printf(<%s,%s>.\n,p,q);
p = 10; }
O que h de errado?
(vamos contar)
nmero de argumentos de foo() declarou g[0], usou g[17] ab no int dimenso errada no uso de f
Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) {
int a, b, c, d; } bar() {
int f[3],g[0], h, i, j, k; char *p;
foo(h,i,ab,j, k);
k = f * i + j;
h = g[17];
printf(<%s,%s>.\n,p,q);
p = 10; }
O que h de errado?
(vamos contar)
nmero de argumentos de foo() declarou g[0], usou g[17] ab no int dimenso errada no uso de f varivel no declarada q
Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) {
int a, b, c, d; } bar() {
int f[3],g[0], h, i, j, k; char *p;
foo(h,i,ab,j, k);
k = f * i + j;
h = g[17];
printf(<%s,%s>.\n,p,q);
p = 10; }
O que h de errado?
(vamos contar)
nmero de argumentos de foo() declarou g[0], usou g[17] ab no int dimenso errada no uso de f varivel no declarada q 10 no uma string
Tudo isso est alm da sintaxe
Alm da Sintaxe
Para gerar cdigo, o compilador deve responder as questes:
x escalar, array, ou funo? x foi declarado? H nomes no declarados? Declarados mas no usados? Qual declarao de x usada por uma ref. a x? A expresso x * y + z corretamente tipada? Em a[i,j,k], a tem trs dimenses? Onde z pode ficar?
(registrador, local, global, heap, esttica)
Em f 15, como representar 15? Quantos argumentos foo() recebe? E printf() ? *p referencia o resultado de um malloc() ? p & q se referem ao mesmo local na memria?
do poder expressivo de uma CFG x definido antes deAlm ser usado?
3
Alm da Sintaxe
Essas questes so parte da anlise semntica
Respostas dependem de valores, no de categorias sintticas Questes e respostas usam informao no-local Respostas podem precisar de computao
Como responder essas questes?
Alm da Sintaxe
Essas questes so parte da anlise semntica
Respostas dependem de valores, no de categorias sintticas Questes e respostas usam informao no-local Respostas podem precisar de computao
Como responder essas questes?
Alm da Sintaxe
Essas questes so parte da anlise semntica
Respostas dependem de valores, no de categorias sintticas Questes e respostas usam informao no-local Respostas podem precisar de computao
Como responder essas questes?
Anlise Ad-hoc
Traduo dirigida por sintaxe
Usa parser shift-reduce bottom-up Associa trecho de cdigo a cada produo Executa o trecho a cada reduo Cdigo arbitrrio d muita flexibilidade
Inclusive a habilidade de dar um tiro no prprio p
Exemplo Construo de AST Assume construtores para cada n Assume que a pilha guarda ponteiros pros ns
Example Emisso de IR linear Assume que NextRegister() retorna nome de reg. virtual Assume que Emit() formata cdigo assembly
Example Emisso de IR linear Assume que NextRegister() retorna nome de reg. virtual Assume que Emit() formata cdigo assembly Assume que EmitLoad() lida com endereamento e carrega
um valor em um registrador
Implicaes
Declaraes antes de usos Informao de contexto no pode ser passada para baixo
Como saber de dentro de qual regra voc foi chamado?
11
else if ( ACTION[s,token] == shift si ) then { stack.push(token); stack.push(si); token scanner.next_token(); } else if ( ACTION[s,token] == accept & token == EOF ) then break; else erro de sintaxe; }
12
Parser LR(1)
stack.push(INVLIDO); stack.push(NULL); stack.push(s0); loop {
token = scanner.next_token(); s = stack.top(); if ( ACTION[s,token] == reduce A ) then { /* insira aes aqui (switch) */ stack.popnum(3*||); // desempilha 3*|| smbolos
else if ( ACTION[s,token] == shift si ) then { stack.push(token); stack.push(si); token scanner.next_token(); } else if ( ACTION[s,token] == accept & token == EOF ) then break; else erro de sintaxe; }
Anlise em ASTs
E se preciso fazer aes que no se encaixam bem no framework da traduo dirigida por sintaxe?
Construir a AST usando traduo dirigida por sintaxe Fazer as aes em uma ou mais passagens pela rvore
Vrias maneiras de se estruturar em uma linguagem OO Faz computao arbitrria e controla a ordem Mltiplas passadas se necessrio
14
Representaes Intermedirias
Cdigo Fonte
Front End
IR
Middle End
IR
Back End
Cdigo Nativo
Front end - produz uma representao intermediria (IR) Middle end - transforma a IR do front end em uma IR
equivalente que mais eficiente (otimizao)
Back end - transforma a IR final em cdigo nativo IR codifica conhecimento do compilador sobre o programa
15
Propriedades importantes
Facilidade de gerao Facilidade de manipulao Tamanho dos programas Expressividade Nvel de Abstrao
Estrutural
Grficas Muito usada em traduo fonte para fonte Tende a ser grande
Exemplo: ASTs
Linear
Pseudo-cdigo para mquina abstrata Nvel de abstrao varia Simples e compacta Mais fcil de rearrumar o cdigo
Hbrida
Combinao de grafos e cdigo linear Grafos de fluxo de controle
Exemplo: CFGs
17
subscript
r1 r3 r1 r5 r6
Cdigo linear de baixo nvel: Bom para clculo de endereo mais eficiente
18
Nvel de Abstrao IRs estruturais normalmente so alto nvel IRs lineares normalmente so baixo nvel No necessariamente verdade:
load
loadArray A,i,j
Cdigo lin. alto nvel
10 j 1
j 1
19
x 2
*
y
x-2*y
x 2 y * - * 2 y x
Exemplo:
x-2*y vira
Vantagens
Compacta (muitas operaes precisam s de 1 byte - bytecode) Nomes dos temporrios so implcitos Simples de gerar cdigo e executar
til para transmisso de cdigo
21
Lembra uma mquina RISC simples Introduz nomes para temporrios Forma compacta
22
Lembra uma mquina RISC simples Introduz nomes para temporrios * Forma compacta
22
Tabela de k * 4 inteiros ou vetor de registros Fcil de reordenar Nomes explcitos load loadI mult load sub r1, r2, r3, r4, r5, y 2 r2, r1 x r4, r3
O compilador FORTRAN original usava quads load loadi mult load sub 1 2 3 4 5
Qudruplas
y 2 2 x 4 3 1
Cdigo de 3 endereos
23
24
a2
a3
b5
ca*b
b4
25
Forma SSA Ideia principal: definir cada nome apenas uma vez Introduzir funes (seleo) para fazer funcionar
Original x y while (x < k) x x + 1 y y + x Forma SSA ! ! x0 ! ! y0 ! ! if (x0 >= k) goto next loop:! ! x1 (x0,x2) ! ! ! y1 (y0,y2) ! x 2 x1 + 1 ! y 2 y1 + x2 ! ! ! if (x2 < k) goto loop next:
Cdigo Fonte
Front End
IR 1
Back End
Cdigo Nativo
Exemplo: GCC
AST, GIMPLE, RTL
Exemplo: V8
AST, Hydrogen, Lithium
27
O Resto
Representar cdigo apenas parte de uma IR Outros componentes necessrios
Mapa de armazenamento
Layout geral Registradores virtuais
28
Anlise Semntica
Cdigo Fonte
Front End
IR
Middle End
IR
Back End
Cdigo Nativo
29
Checagem de Tipos
Anlise esttica dos tipos usados em todas as expresses e comandos do programa Informao sobre o tipo dos elementos do programa fica na tabela de smbolos
30
Regras de Tipagem
Tipos existentes Tipos permitidos em expresses e comandos Tipos definidos pelo usurio Equivalncia de tipos, nominal ou estrutural
31
Metodologia Percorrer e anotar a AST em mltiplas passadas Cada passada fica responsvel por uma verificao
semntica, e pode fornecer informao para passadas subsequentes da AST para cada passada, ou podemos fazer um esquema mais elaborado com o padro Visitor
32
A interface
insert(nome, nvel): cria registro para nome em nvel lookup(nome): retorna registro para nome
Muitas implementaes foram propostas Vamos usar uma simples e que funciona bem para um
Tabelas de smbolos so estruturas em tempo de compilao para resolver referncias para nomes. Veremos as estruturas em tempo de execuo correspondentes na gerao de cdigo.
33
Exemplo
procedure p { ! ! ! ! ! ! ! ! ! ! ! ! ! ! } ! ! ! ! ! ! ! ! ! ! ! ! ! ! int a, b, c procedure q { ! ! ! ! ! ! ! ! ! ! } q int v, b, x, w procedure r { ! int x, y, z ! } procedure s { ! ! } int x, a, v .
B0: { ! ! ! ! ! ! ! ! ! ! ! }
34
! ! ! ! ! ! ! ! ! ! !
B1: ! ! B2: ! !
B3: ! !
rs
variveis e nomes de classes? E mtodos? E tipos definidos pelo usurio? E quanto a espaos de nomes definidos pelo usurio (pacotes Java, namespaces C++)?
Em geral cada espao de nomes deve ter sua prpria tabela de smbolos ou pilha de tabelas de smbolo
36
Todo termo da linguagem envolve tipos de alguma forma Vrias linguagens adiam essa verificao para a execuo do
programa: tipagem dinmica
Requer gerao de cdigo e uma ambiente de execuo mais elaborados
37
Tipos Simples
Tipos primitivos da linguagem
Pr-definidos pela especificao inteiros, caracteres, nmeros de ponto flutuante, booleanos, o tipo void Detalhes como tamanho podem ser parte da especificao (Java), ou ficar em aberto para o implementador (C)
39
Vetores e Matrizes Tipos de vetor formados a partir de um tipo base O tamanho do vetor pode fazer parte do tipo ou no Equivalncia entre tipos de vetores
Pode-se usar variveis de tipo vetor em uma atribuio? O vetor copiado ou criado um alias? Vetores com tamanhos diferentes so compatveis? E quanto a tipos base diferentes (vetores em Java)
40
Equivalncia de estruturas
Nominal (como nas classes Java) ou estrutural, como em ML? Na equivalncia estrutural dois tipos struct so o mesmo tipo se tm campos equivalentes na mesma ordem Algoritmo recursivo
41
Tipos Recursivos Uma estrutura ou classe pode ter um campo com o mesmo
tipo dela?
Em C e C++ no, mas pode ter um ponteiro para ela Em Java sim
42
Na prtica tipos de funo so equivalentes a tipos de Outros aspecto importante so a amarrao de funces e
qual o espao de nomes das funes
43
44