análise semântica · conceitos introdução o papel da análise semântica é produzir umalista...
TRANSCRIPT
Análise Semântica
Eduardo Ferreira dos Santos
Ciência da Computação
Centro Universitário de Brasília � UniCEUB
Outubro, 2016
1 / 40
Conceitos
Introdução
O papel da análise semântica é produzir uma lista de tarefas;
Para produzir a lista de tarefas o compilador vai precisar da lista desímbolos;
Nesse momento também se faz a veri�cação de tipos;
Objetivo: facilitar a tradução da lista de tarefas em linguagem demáquina.
6 / 40
Conceitos
Etapas da compilação
Análise léxica Detecta entradas com caracteres inválidos;
Análise sintática Produz a árvore de parsing e veri�ca erros de formação daárvore;
Análise semântica Última fase do �front end�, detecta os erros que aindapodem existir.
7 / 40
Conceitos
Justi�cativa
Alguns erros não são detectados pelo parsing;A análise semântica pode realizar várias veri�cações[Schwarz et al., 2016]:
1 Todos os identi�cadores estão declarados;2 Os tipos são consistentes;3 Relações de herança;4 As classes são unicamente identi�cadas;5 Os métodos em uma classe são de�nidos apenas uma vez;6 As palavras reservadas não estão sendo utilizadas de maneira
equivocada;7 ...
Os requisitos semânticos dependem da linguagem.
8 / 40
A linguagem Cool
Visão geral de Cool
Para estudar os próximos exemplos, vamos introduzir uma linguagemchamada Cool: Classroom Object Oriented Language
[Schwarz et al., 2016];Princípios de design:
Implementação rápida;Utilização de:
Abstração;Tipagem estática;Reuso (herança);Gerência de memória;...
Pela simplicidade, alguns outros conceitos são deixados de fora.
10 / 40
A linguagem Cool
Exemplo simples
Os programas em Cool são simples de�nições de classe;Uma classe especial chamada Main com um método especial chamadomain;Nenhum conceito de subrotina;
classe = coleção de atributos e métodos;
As instâncias de uma classe são objetos.
Listing 1: Exemplo de atribuição simples em Cool
c l a s s Po in t {x : I n t <− 0 ;y : I n t <− 0 ;
} ;
11 / 40
A linguagem Cool
Objetos em Cool
A expressão new Point cria um novo objeto da classe Point;
Um objeto pode ser visto como um registro com um slot para cadaatributo.
Listing 2: Objetos em Cool [Schwarz et al., 2016]
c l a s s Po in t {x : I n t <− 0 ;y : I n t ; (∗ use d e f a u l t v a l u e ∗)
} ;
12 / 40
A linguagem Cool
Métodos
A classe pode de�nir métodos para manipular os atributos;
Os métodos se referem ao objeto atual utilizando a chamada self.
Listing 3: Métodos em Cool [Schwarz et al., 2016]
c l a s s Po in t {x : I n t <− 0 ;y : I n t <− 0 ;movePoint ( newx : I n t , newy : I n t ) : Po in t {
5 { x <− newx ;y <− newy ;s e l f ;
} −− c l o s e b l o ck e x p r e s s i o n} ; −− c l o s e method
10 } ; −− c l o s e c l a s s
13 / 40
A linguagem Cool
Herança
Extensão de Point para ColorPoint utilizando herança.
Listing 4: Herança em Cool [Schwarz et al., 2016]
c l a s s Co l o rPo i n t i n h e r i t s Po in t {c o l o r : I n t <− 0 ;movePoint ( newx : I n t , newy : I n t ) : Po in t {
{ c o l o r <− 0 ;5 x <− newx ; y <− newy ;
s e l f ;}
} ;} ;
14 / 40
Análise semântica
Escopo
De�nição: veri�ca a compatibilidade entre a declaração e a utilizaçãodos identi�cadores;
Importante etapa de análise estática na maior parte das linguagens;
O escopo do identi�cador é a parte do programa onde o identi�cadorestá acessível;
O mesmo identi�cador pode mudar de signi�cado a depender da partedo programa;
O identi�cador pode ter escopo restrito.
16 / 40
Análise semântica
Estático versus dinâmico
A maior parte das linguagens possui escopo estático:O escopo depende apenas do texto do programa e não da execução;C, C++ e Javascript possuem escopo estático;
Outras linguagens possuem escopo dinâmico [Schwarz et al., 2016]:Lisp, SNOBOL;Lisp agora possui escopo dinâmico;O escopo depende da execução do programa.
17 / 40
Análise semântica
Escopo estático
Listing 5: O valor de x se refere à de�nição mais próxima[Schwarz et al., 2016]
l e t x : I n t <− 0 i n{
x ;l e t x : I n t <− 1 i n
5 x ;x ;
}
18 / 40
Análise semântica
Escopo dinâmico
Uma variável de escopo dinâmico tem seu valor calculado no momentoda execução.
Listing 6: O valor de a se refere ao valor no momento da execução
#def ine a ( x+1)i n t x = 2 ;void b ( ) { i n t x = 1 ; p r i n t f ("%d\n" , a ) ; }void c ( ) { p r i n t f ("%d\n" , a ) ; }
5 void main ( ) { b ( ) ; c ( ) ; }
19 / 40
Análise semântica
Exemplo comparativo
Figura 3.1: Exemplo de escopo estático versus dinâmico 1
1Fonte:https://msujaws.wordpress.com/2011/05/03/static-vs-dynamic-scoping/
20 / 40
Análise semântica
Escopo em Cool
Os identi�cadores em Cool são introduzidos por:Declarações de classe (introduz o nome da classe);De�nições de método (introduz o nome do método);Parâmetros formais (introduz o id do objeto);De�nições de atributo (introduz o id do objeto);Outros.
21 / 40
Análise semântica
Exceções ao escopo em Cool
Nem todas as de�nições em Cool seguem a regra da de�nição maispróxima;De�nições de classe:
Não podem ser aninhadas;São visíveis no escopo global do programa.
É possível utilizar o nome da classe antes de de�ni-la.
22 / 40
Análise semântica
Exemplo de uso
Listing 7: Exemplo de uso antes de de�nir a classe [Schwarz et al., 2016]
C l a s s Foo {. . . l e t y : Bar i n . . .
} ;
5 C l a s s Bar {. . .
} ;
23 / 40
Análise semântica
Mais escopo
Os atributos da classe são globais dentro dela mesma.
Listing 8: Exemplo de utilização de atributo de classe global[Schwarz et al., 2016]
C l a s s Foo {f ( ) : I n t { a } ;a : I n t <− 0 ;
}
24 / 40
Análise semântica Símbolos
Tabela de símbolos
Considere a seguinte expressão em Cool: let x: Int <- 0 in e
Ideia [Schwarz et al., 2016]:Antes de processar e adicione a de�nição de x ao conjunto dede�nições atual, sobrescrevendo qualquer atribuição anterior de x;Navegue na árvore de parsing recursivamente;Depois de processar e, remova a de�nição de x e restaure o valoranterior.
A tabela de símbolos é uma estrutura de dados que armazena asatribuições de valor mais atuais para os identi�cadores.
26 / 40
Análise semântica Símbolos
Implementação simples
Estrutura de dados utilizada: pilha;
Operações:
add_symbol(x) Executa uma operação de push na pilha para x, comtodas as informações associadas;
�nd_symbol(x) Busca na pilha, de cima para baixo, o valor de x.Retorna NULL se não for encontrado;
remove_symbol() Executa uma operação de pop na pilha.
27 / 40
Análise semântica Símbolos
Limitações
A tabela de símbolos funciona bem para o operador let:Os símbolos são adicionados individualmente de maneira sequencial;As declarações estão perfeitamente aninhadas.
E se a ordem das atribuições for diferente?
28 / 40
Análise semântica Símbolos
Tabela de símbolos mais completa
enter_scope() Inicia um novo escopo aninhado;
�nd_symbol(x) Encontra o valor atual de x (ou NULL);
add_symbol(x) Adiciona o símbolo x na tabela;
check_scope(x) Verdadeira se x estiver de�nido no escopo atual;
exit_scope() Executa uma operação de pop na pilha.
29 / 40
Análise semântica Símbolos
De�nições de classe
Os nomes de classe podem ser utilizados antes de ser de�nidos;Não é possível veri�car os nomes das classes:
Utilizando uma tabela de símbolos;Em uma única passagem pela árvore.
Solução:
Passo 1 Reúna todos os nomes de classe;Passo 2 Faça a checagem.
A análise semântica requer múltiplas passagens pela árvore.
30 / 40
Análise semântica Tipos
Tipos
O que é um tipo?
A noção varia de acordo com a linguagem;Consenso:
Um conjunto de valores;Um conjunto de operações com esses valores.
As classes são uma instância da de�nição moderna de tipo[Schwarz et al., 2016].
32 / 40
Análise semântica Tipos
Por que tipos?
Listing 9: Quais os tipos de dado para $r1 $r2 e $r3? [Schwarz et al., 2016]
add $r1 , $r2 , $r3
33 / 40
Análise semântica Tipos
Tipos e operações
Cada tipo de dado possui um conjunto válido de operações;Não faz sentido executar uma operação de adição entre um ponteiro eum inteiro na linguagem C;Faz sentido a adição de dois inteiros;Contudo, ambos executam a mesma operação em assembly.
O sistema de tipos da linguagem especi�ca os tipos e suas operaçõespermitidas;O objetivo da veri�cação de tipos é garantir que as operações sejamrealizadas com os tipos de dado corretos.
É a única etapa que realiza interpretação de valores.;Para o computador, tudo se resume a 0 e 1.
34 / 40
Análise semântica Tipos
Veri�cação de tipos
Existem três tipos de linguagens:
Statically typed Veri�cação estática de tipos. Quase toda a validaçãode tipos é feita no momento da compilação (C, Java,Cobol);
Dynamically typed Veri�cação dinâmica de tipos. Quase toda avalidação de tipos é feita no momento da execução doprograma (Scheme, Python);
Untyped Não faz veri�cação de tipos (código de máquina).
35 / 40
Análise semântica Tipos
Necessidade de veri�cação
Existem visões concorrentes em relação às veri�cações estática edinâmica;Os defensores da veri�cação estática dizem:
A veri�cação estática encontra muitos problemas no momento dacompilação;Evita o overhead da veri�cação de tipo em tempo de execução.
Os defensores da veri�cação dinâmica dizem:Os sistemas de veri�cação estática são muito restritivos;Não é possível realizar a prototipagem rápida em sistemas deveri�cação estática.
36 / 40
Análise semântica Tipos
Conclusões sobre tipos
Na prática, a maior parte do código é escrita em linguagens comveri�cação estática de tipo com algum tipo de mecanismo de �escape�;
Ex.: Unsafe casts in C, Java
É discutível saber se essa decisão representa o melhor dos dois mundos.
37 / 40
Análise semântica Tipos
Veri�cação e inferência
A veri�cação de tipos é o processo de veri�car programas onde atipagem é forte;
A inferência de tipos é o processo de descobrir a informação de tipoque está faltando;
Os processos são diferentes mas os termos são intercambiáveis.
Utilização de regras de inferência.
38 / 40
Análise semântica Tipos
Aho, A., Lam, M., Sethi, R., and Ullman, J. (2007).Compiladores�Princ�pios Técnicas e Ferramentas.Pearson, 2a. edition.
Schwarz, K., Papadakis, H., and Mittal, R. (2016).Compilers.Disponível em http://web.stanford.edu/class/cs143/ Acessadoem 30/09/2016.
40 / 40