Unidade04

40
Nomes ligações checagem de Nomes ligações checagem de Nomes, ligações, checagem de Nomes, ligações, checagem de tipos e escopos tipos e escopos Prof. Iális Cavalcante Engenharia da Computação – UFC/Sobral

Transcript of Unidade04

Page 1: Unidade04

Nomes ligações checagem de Nomes ligações checagem de Nomes, ligações, checagem de Nomes, ligações, checagem de tipos e escopostipos e escoposp pp pProf. Iális Cavalcante

Engenharia da Computação – UFC/Sobral

Page 2: Unidade04

1 Introdução1 Introdução1. Introdução1. IntroduçãoAs linguagens de programação imperativas são As linguagens de programação imperativas são abstrações da arquitetura do computador de von Neuman;von Neuman;Componentes principais:◦ Memória -> armazena instruções e dados;◦ Processador -> fornece operações para modificar o

úd d ó iconteúdo da memória;

Células de memória -> variáveis.

Page 3: Unidade04

2 Nomes2 Nomes2. Nomes2. Nomes

Associado a variável rótulo subprograma Associado a variável, rótulo, subprograma, parâmetros formais e demais construções

identificador...

◦ Qual o tamanho máximo de um nome?◦ Caracteres de conexão podem ser usados em

nomes?◦ Os nomes fazem distinção entre maiúsculas e

minúsculas?minúsculas?◦ Palavras especiais são palavras reservadas ou

palavras chave?palavras-chave?

Page 4: Unidade04

2 Nomes2 Nomes2. Nomes2. Nomes2 1 Formas de nomes2.1. Formas de nomes◦ Nome: cadeia de caracteres usada para identificar

alguma entidade de um programaalguma entidade de um programa.◦ Primeiras linguagens: nome de único caractere

incógnita na definição matemática;incógnita na definição matemática;◦ FORTRAN I rompe com a idéia: até seis caracteres

em um nome;em um nome;◦ FORTRAN 91 e C: permitem até 31 caracteres;◦ Java e Ada: sem limite de tamanho◦ Java e Ada: sem limite de tamanho.◦ Distinção CASE SENSITIVE! E a legibilidade? E a

capacidade de escrita?capacidade de escrita?

Page 5: Unidade04

2 Nomes2 Nomes2. Nomes2. Nomes

2 1 Formas de nomes2.1. Formas de nomesPalavras-chave ou reservadas?

REAL APPLEREAL = 3.4 int apple; (!)

i t + 2 (?)

ou

int = x + 2; (?)

public class interface{( )INTEGER REAL

REAL INTEGER

(...)}

Exemplo em FORTRAN Exemplo em Java

Palavras-chave: Palavras reservadas:REAL e INTEGER int, public, class e interface

(especial pelo contexto) (não usadas para nomes)

Page 6: Unidade04

3. Variáveis3. VariáveisAbstração de célula ou conjunto de él l d ó icélulas de memória;◦ Ling. de máquina -> ling. de montagem

Endereços de memória numéricos -> nomesEndereçamento absoluto

◦ Variável: sêxtuplo de atributosNome;Endereço;Valor;Tipo;Tempo de vida;pEscopo.

Page 7: Unidade04

3 Variáveis3 Variáveis3. Variáveis3. Variáveis

3 1 Nomes3.1. Nomes◦ ...identificadores...

3.2. Endereço◦ Endereço de uma variável é o mesmo da Endereço de uma variável é o mesmo da

memória à qual ela está associada.◦ Mas não é tão simples◦ Mas não é tão simples...

... e vetores, matrizes?

int sub1{ (...) int soma; (...) }

void sub2{ (...) int soma; (...) }

Mesmo nome,diferentesendereços{ ( ) ( ) }

Page 8: Unidade04

3 Variáveis3 Variáveis3. Variáveis3. Variáveis

3 2 1 Apelidos3.2.1. Apelidos◦ Mais de um nome de variável pode ser usado

ú i l li ã d ó ipara acessar uma única localização de memóriaNomes -> Apelidos.

U d ◦ Uso de ponteiros;◦ Passagem por referência;

Ponto ponto = new Ponto();ponto.x = 10;ponto y = 12;ponto.y = 12;(...)void setPonto(Ponto p){

(...) p.x = p.x + 15; (...)(...) p.x p.x 15; (...)}

Page 9: Unidade04

3 Variáveis3 Variáveis3. Variáveis3. Variáveis3.3. Tipop◦ Faixa de valores que uma variável pode ter◦ Conjunto de operações definidas para o tipo◦ Conjunto de operações definidas para o tipo◦ Em Java: int

2 147 483 648 2 147 483 647-2.147.483.648 a 2.147.483.647Operadores: +, -, *, /, %, etc.

3.4. Valor◦ Conteúdo da(s) célula(s) de memória ( ) ( )

associadas à variável.x = y + 10;valor-l

left sidevalor-r

right sideleft side(endereço)

right side(valor)

Page 10: Unidade04

4 Vinculação4 Vinculação4. Vinculação4. Vinculação

Vinculação: associaçãoVinculação: associação◦ Atributo e entidade | operação e símbolo◦ Tempo de vinculação: momento de seu

desenvolvimento;Projeto de linguagem;Implementação de linguagem;p g gCompilação;Ligação (link);g ç ( )Carregamento;Execução.ç

Page 11: Unidade04

4. Vinculação4. Vinculaçãoççint cont; (...) cont = cont + 5;

Conjunto dos tipos possíveis para cont:◦ Vinculado no tempo de projeto da linguagem;

Tipo de cont: ◦ Vinculado no tempo de compilação;

Conjunto dos valores possíveis de cont:◦ Vinculado no tempo de projeto do compilador;Vinculado no tempo de projeto do compilador;

Valor de cont:◦ Vinculado no tempo de execução com essa instrução;

Conjunto dos significados possíveis para o símbolo do operador +:◦ Vinculado no tempo de definição da linguagem;

Si ifi d d í b l d d i ãSignificado do símbolo do operador + nessa instrução:◦ Vinculado no tempo de compilação;

Representação interna do literal 5:Representação interna do literal 5:◦ Vinculada no tempo de projeto do compilador.

Page 12: Unidade04

4. Vinculação4. VinculaçãoV l ã d b áVinculação de atributos a variáveis

estática, d il ãocorre em tempo de compilação;

permanece inalterado ao longo da execução;c c , dinâmica;c.c., dinâmica;

◦ Declaração de variáveisExplícitaExplícita

Lista nomes de variáveis e especifica seus tipos;

ImplícitapAssociação de variáveis por convenção padrãoInexistente nas linguagens atuaisEm FORTRAN, uma variável sem tipo definidainteiro, se começa com I, J, K, L, M ou Nc c é Realc.c., é Real.Problema na legibilidade

Page 13: Unidade04

4 Vinculação4 Vinculação4. Vinculação4. Vinculação

Vinculação dinâmica de tiposVinculação dinâmica de tipos◦ A variável atribuída e vinculada ao tipo da

expressão do lado direito apenas no momento da instrução

List = [10.2 5.1 0.0]List = 47

◦ Diminui a detecção de erros;◦ cast em C e JavaJ◦ Pode gerar resultados errôneos;◦ Alto custo de implementação;◦ Alto custo de implementação;

Page 14: Unidade04

4 Vinculação4 Vinculação4. Vinculação4. Vinculação

Inferência de TipoInferência de Tipo◦ Exemplo em ML

fun circumf(r) = 3.14159 * r * rfun vezes10(x) = 10 * xfun quadrado(x) = x * xfun quadrado(x) : int = x * xfun quadrado(x : int) = x * xfun quadrado(x) = (x : int) * xfun quadrado(x) = x * (x : int)

◦ Também presente em Miranda e Haskellp

Page 15: Unidade04

4 Vinculação4 Vinculação4. Vinculação4. Vinculação

Vinculações de armazenamento e tempo Vinculações de armazenamento e tempo de vida◦ Alocação: célula de memória vinculada a

uma variável é tomada da memória disponível;◦ Desalocação: devolve a célula de memória

desvinculada de uma variável à memória disponível.◦ Tempo de vida: tempo durante a variável Tempo de vida: tempo durante a variável

está vinculada a uma localização de memória específica.específica.

Page 16: Unidade04

4 Vinculação4 Vinculação4. Vinculação4. Vinculação

Variáveis estáticasVariáveis estáticas◦ Vinculadas a células de memória antes da

execução e permanece até o fim da execução do programa;

Vantagens: uso como globais, endereçamento direto;Desvantagens: não suporta recursividade, sem compartilhamento de armazenamento;

variáveis em diferentes subprogramasvariáveis em diferentes subprogramas.

Exemplo em C, C++ e Java: aplicação de static.

Page 17: Unidade04

4 Vinculação4 Vinculação4. Vinculação4. Vinculação

Variáveis dinâmicas na pilhaVariáveis dinâmicas na pilha◦ Vinculações de armazenamento criadas a

partir da elaboração das instruções de declaração

Mas com tipo estaticamente vinculados;

◦ Permite recursividade, com armazenamento local dinâmico;

Desvantagem: sobretaxa de alocação e desalocação em tempo de execução.

Page 18: Unidade04

4 Vinculação4 Vinculação4. Vinculação4. VinculaçãoVariáveis dinâmicas no monte explícitasp◦ Células de memória abstratas (sem nome)

(des)alocadas por instruções explícitas em (des)alocadas por instruções explícitas em tempo de execução;

Variáveis de ponteiro ou referências;Variáveis de ponteiro ou referências;

◦ Monte: conjunto de células de armazenamento altamente desorganizado armazenamento altamente desorganizado devido à imprevisibilidade do uso;E C++ J◦ Em C++ e Java:

new (mais um nome de tipo) – cria uma variável no monte e um ponteiro retorna para elamonte e um ponteiro retorna para ela

Page 19: Unidade04

4 Vinculação4 Vinculação4. Vinculação4. VinculaçãoVariáveis dinâmicas no monte explícitas◦ Variáveis vinculadas ao monte em compilação

Mas armazenadas em tempo de execução;p ç ;int *intnode; (...)intnode = new int; /* aloca uma célula int */( ) d l t i t d /* d l él l l (...) delete intnode; /* desaloca a célula para a qual

intnode aponta */

Em Java, os objetos são dinâmicos no monte J jexplícitos;Esse tipo de variável é utilizado para estruturas dinâmicas (listas encadeadas, árvores, ...).Desvantagens: dificuldade de usar variáveis de ponteiro corretamente e custo de referência.

Page 20: Unidade04

4 Vinculação4 Vinculação4. Vinculação4. Vinculação

Variáveis dinâmicas no monte implícitasVariáveis dinâmicas no monte implícitas◦ Vinculadas ao armazenamento somente

quando lhe são atribuídos valores.◦ Elevado grau de flexibilidade

Código genérico;

◦ Sobretaxa para manter atributos dinâmicos;p ;Perda de capacidade de detecção de erros.

Page 21: Unidade04

5 Verificação de Tipos5 Verificação de Tipos5. Verificação de Tipos5. Verificação de TiposAtividade de assegurar que os operandos de um Atividade de assegurar que os operandos de um operador sejam de tipos compatíveis

Válid d◦ Válido para o operador;◦ Pelas regras da linguagem, pode ser convertido pelo

compilador para um tipo válido (coerção);compilador para um tipo válido (coerção);

Erro de tipoA li ã d d d d i ◦ Aplicação de um operador a um operando de tipo impróprio;

P d di â i tátiPode ser dinâmica ou estática.

Page 22: Unidade04

6 Tipificação Forte6 Tipificação Forte6. Tipificação Forte6. Tipificação ForteDefinição mais simples:Definição mais simples:◦ Cada nome de um programa escrito na linguagem

tem um único tipo associado a ela;tem um único tipo associado a ela;

FORTRAN não é fortemente tipificado;P l Ad J ã f Pascal, Ada e Java são quase fortemente tipificadas◦ Ada exige a função UNCHECKED_CONVERSION◦ Regras de coerção para Java:

int x = 10; float y, y2 = 4.59;y = y2 + x;

Page 23: Unidade04

7 Compatibilidade de Tipos7 Compatibilidade de Tipos7. Compatibilidade de Tipos7. Compatibilidade de TiposDuas variáveis são de tipos compatíveis quando Duas variáveis são de tipos compatíveis quando qualquer uma delas pode ter seu valor atribuído à outra;◦ Compatibilidade de nome:

Variáveis na mesma declaração ou em declarações de mesmo nome de tipo;de tipo;

◦ Compatibilidade de estrutura:Variáveis em que seus tipos possuem estruturas idênticas;

type indextype = 1..100;var

type celsius = real;fahrenheit = real;

cont: integer;indice: indextype; tipos compatíveis

pela estruturacont e indice nãosão compatíveis

Page 24: Unidade04

7 Compatibilidade de Tipos7 Compatibilidade de Tipos7. Compatibilidade de Tipos7. Compatibilidade de TiposEm Pascal:

typetipo1 = array [1..10] of integer;tipo2 = array [1..10] of integer;

Em Pascal:tipo1 e tipo2(incompatíveis)

tipo2 array [1..10] of integer;tipo3 = tipo2; tipo2 e tipo3

(compatíveis)

C : array (1..10) of INTEGER;D : array (1..10) of INTEGER;

Em Ada:C e D(incompatíveis)

type LIST_10 is array (1..10) of INTEGER;C, D : LIST 10;

(incompatíveis)

C e D(compatíveis)C, D : LIST_10; (compatíveis)

Page 25: Unidade04

8 Escopo8 Escopo8. Escopo8. Escopo

O escopo de uma variável é a faixa de O escopo de uma variável é a faixa de instruções na qual a variável é visível.◦ Visível em uma instrução: se puder ser

referenciada nesta mesma.

As variáveis não-locais de uma unidade ou de um bloco de programa unidade ou de um bloco de programa são as visíveis dentro deste, mas não são declaradas ládeclaradas lá.

Page 26: Unidade04

8 1 Escopo estático8 1 Escopo estático8.1 Escopo estático8.1 Escopo estáticoMétodo para vincular nomes a variáveis não-locaisMétodo para vincular nomes a variáveis não-locaisPara conectar uma referência a uma variável, o compilador precisa encontrar a declaraçãocompilador precisa encontrar a declaraçãoProcesso de busca:◦ Caso a declaração não for encontrada localmente, passa-se a Caso a declaração não for encontrada localmente, passa se a

buscar em escopos mais amplos

O pai-estático (static parent) é o subprograma no qual encontra-se a declaraçãoOs ancestrais estáticos são todos os subprogramas

é h d l ãaté se chegar a declaração

Page 27: Unidade04

8 1 Escopo estático8 1 Escopo estático8.1 Escopo estático8.1 Escopo estáticoprocedure big;p ocedu e b g;

var x: integer;

procedure sub1;

begin { sub1 }

...x...

end; { sub1 }

A variável x em sub1 é declarada

no procedimento bigend; { sub1 }

procedure sub2;

var x: integer;

p g

begin { sub2 }

...

end;end;begin { big }

...

end; { big }

Page 28: Unidade04

8 1 Escopo estático8 1 Escopo estático8.1 Escopo estático8.1 Escopo estáticoVariáveis podem ser escondidas de uma unidade quando a Variáveis podem ser escondidas de uma unidade quando a mesma possui uma variável com o mesmo nome

program main;var x: integer;procedure sub1;

var x: integer;{ }begin { sub1 }

...x...end; { sub1 }

b i { i }begin { main }...

end; { main }

C++ e Ada permitem acesso a essas variáveis escondidas◦ Em Ada: unit.name

E C l◦ Em C++: class_name::name

Page 29: Unidade04

8 2 Blocos8 2 Blocos8.2 Blocos8.2 BlocosUm método para criar novos escopos estáticos no Um método para criar novos escopos estáticos no meio do código executável – introduzido no ALGOL 60Permite que uma seção de código tenha suas próprias Permite que uma seção de código tenha suas próprias variáveis locais cujo escopo é minimizadoEssas variáveis são tipicamente dinâmicas na pilhap p◦ Alocada quando a seção é iniciada e desalocada quando ela é

finalizada...

Exemplo em Ada...declare TEMP: integer;

beginTEMP := FirstFirst := SecondSecond := TEMP

end...

Page 30: Unidade04

8 3 Avaliação do Escopo Estático8 3 Avaliação do Escopo Estático8.3 Avaliação do Escopo Estático8.3 Avaliação do Escopo Estático

Page 31: Unidade04

8 3 Avaliação do Escopo Estático8 3 Avaliação do Escopo Estático8.3 Avaliação do Escopo Estático8.3 Avaliação do Escopo Estático

A

main

B

C DE

Um grafo com chamadas potenciaisa procedimento no sistema

Assuma que MAIN chama A e BA chama C e DB chama A e E

E

a procedimento, no sistema. B chama A e Emain

Um grafo com as chamadas

A B

gdesejáveis do programa exemplo. C D E

Page 32: Unidade04

8 3 Avaliação do Escopo Estático8 3 Avaliação do Escopo Estático8.3 Avaliação do Escopo Estático8.3 Avaliação do Escopo EstáticoSuponha que a especificação é alterada e E deve Suponha que a especificação é alterada e E deve acessar algum variável em DS l õSoluções:◦ Colocar E em D (porém, E não poderá acessar o

d B)escopo de B)◦ Mover as variáveis de D, que são necessárias em E,

para MAIN (isso permite o acesso por todos os para MAIN (isso permite o acesso por todos os procedimentos)

De maneira geral: escopo estático encoraja o De maneira geral: escopo estático encoraja o uso de variáveis globais

Page 33: Unidade04

8 4 Escopo Dinâmico8 4 Escopo Dinâmico8.4 Escopo Dinâmico8.4 Escopo DinâmicoBaseia se na seqüência de chamada de Baseia-se na seqüência de chamada de subprogramas, não em suas relações espaciais (temporal versus espacial)(temporal versus espacial)Desta forma o escopo pode ser determinado apenas em tempo de execuçãoapenas em tempo de execuçãoQuando a procura por declarações locais falha, as declarações do pai-dinâmico (procedimento de declarações do pai dinâmico (procedimento de chamada) são pesquisadas, e assim sucessivamenteCaso nenhuma declaração seja encontrada em Caso nenhuma declaração seja encontrada em qualquer ancestral dinâmico, haverá um erro em tempo de execuçãotempo de execução

Page 34: Unidade04

8 4 Escopo Dinâmico8 4 Escopo Dinâmico8.4 Escopo Dinâmico8.4 Escopo Dinâmico

BIG chama SUB2SUB2 chama SUB1SUB1 usa x

procedure big;var x: integer; SUB1 usa xgprocedure sub1;

begin { sub1 }...x...

N SUB1

end; { sub1 }procedure sub2;

var x: integer;Nesse caso, SUB1 usa o x

declarado em SUB2begin { sub2 }

...end;

b i { bi }begin { big }...

end; { big }

Page 35: Unidade04

8 5 Avaliação do Escopo Dinâmico8 5 Avaliação do Escopo Dinâmico8.5 Avaliação do Escopo Dinâmico8.5 Avaliação do Escopo Dinâmico

VantagemVantagem◦ Conveniência

Desvantagem◦ Pouca legibilidadePouca legibilidade

Linguagens que usam escopo dinâmico◦ APL, SNOBOL4 e nas primeiras versões do

LISP◦ Perl também permite que as variáveis sejam

declaradas com escopo dinâmico

Page 36: Unidade04

8 6 Escopo e Tempo de Vida8 6 Escopo e Tempo de Vida8.6 Escopo e Tempo de Vida8.6 Escopo e Tempo de VidaEscopo e Tempo de Vida algumas vezes parecem estar Escopo e Tempo de Vida, algumas vezes, parecem estar relacionados, mas são conceitos diferentes

void printheader(){...

} /* fim de printheader */void compute() {

int sum;...

printheader();} /* f d */

O escopo da variável sum é completamente contido pela f ã

} /* fim de compute */

função compute.Porém, o tempo de vida de sum estende-se ao longo do tempo durante o qual printheader é executadotempo durante o qual printheader é executado

Page 37: Unidade04

8 7 Ambientes de 8 7 Ambientes de ReferenciamentoReferenciamento8.7 Ambientes de 8.7 Ambientes de ReferenciamentoReferenciamentoO ambiente de referenciamento de uma instrução é o conjunto de todos os nome visíveis na instruçãoEm uma linguagem com escopo◦ O ambiente de referenciamento é formado pelas variáveis

locais mais todas as variáveis de seus escopos ancestrais visíveis

U b é i ã i Um subprograma é ativo se sua execução tiver começado, mas ainda não tiver terminadoE li di â iEm um linguagem com escopo dinâmico◦ O ambiente de referenciamento é formado pelas variáveis

locais mais as variáveis de todos os subprogramas ativoslocais, mais as variáveis de todos os subprogramas ativos

Page 38: Unidade04

8 8 Constantes Nomeadas8 8 Constantes Nomeadas8.8 Constantes Nomeadas8.8 Constantes NomeadasUma constante nomeada é uma variável Uma constante nomeada é uma variável vinculada a um valor somente no momento em que ela é vinculada a um armazenamentoque ela é vinculada a um armazenamento◦ Seu valor não pode ser mudado por uma instrução de

atribuiçãoatribuição

Exemplo d i i é d l 3 14159◦ uso da constante pi ao invés do valor 3,14159

Vantagem◦ Legibilidade◦ Confiabilidade

Page 39: Unidade04

8 9 Inicialização de Variáveis8 9 Inicialização de Variáveis8.9 Inicialização de Variáveis8.9 Inicialização de Variáveis

Inicializações são geralmente feitas através Inicializações são geralmente feitas através de instruções de declaração◦ Exemplo: em Java◦ int sum = 0;;

Nem Pascal, nem Modula-2 oferecem uma maneira de inicializar variáveis exceto maneira de inicializar variáveis, exceto durante a execução através de instruções d b ãde atribuição

Page 40: Unidade04

9 Revisão9 Revisão9. Revisão9. RevisãoNomesNomes◦ Tamanho; caracteres de conexão; distinção entre maiúsculas e

minúsculas; palavras especiais

Variáveis◦ nome, endereço, valor, tipo, tempo de vida, escopo

Vinculação é a associação de atributos a entidades do programaTipificação forte é conceito de exigir que todos os erros de tipo sejam detectado