66
Roberto Loscio 1 Nomes, Vinculações, Verificação de Tipos e Escopo Disciplina: Linguagens de Programação Professor: Roberto Loscio [email protected]

4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Embed Size (px)

Citation preview

Page 1: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 1

Nomes, Vinculações, Verificação de Tipos e Escopo

Disciplina: Linguagens de Programação

Professor: Roberto [email protected]

Page 2: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 2

Especificação de uma LP

Envolve dois aspectos:Sintaxe: regras que determinam quais construções são corretas;Semântica: descrição de como as construções sintaticamente corretas são interpretadas ou executadas (significado);Exemplo (em Pascal):

a := bComando de atribuição descrito corretamente (sintaxe);Substitua o valor de a com o valor atual de b

Page 3: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 3

Sintaxe e Semântica

É importante conhecer os limites entre estes dois conceitos e sua importância:

Sintaxe é a forma de suas expressões, de suas instruções, de suas unidades de programaSemântica é o significado de suas instruções, de suas unidades de programa

A sintaxe influencia a forma como os programassão escritos, enquanto que a semântica dita como os programas devem ser entendidos por outros programadores e devem ser executados em um computador

Page 4: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 4

Sintaxe e Semântica

A semântica é a parte que realmente caracteriza uma linguagem!

Uma dada construção pode ser apresentada da mesma forma em diferentes linguagens de programação, porém com semânticas diferentes, ou vice-versa

Page 5: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 5

Arquitetura x Linguagem

Linguagens de programação imperativas são abstrações da arquitetura de Von NeumannOs componentes principais da arquitetura de Von Neumann são memória e processadorNa linguagem, a memória é abstraída pelas variáveisO processador é abstraído pelas operaçõesO nível de abstração pode variar conforme a linguagem e as suas estruturas de dados

Page 6: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 6

Gargalo de von NeumannA separação entre a CPU e a memória leva para o gargalo de von Neumann, a produção limitada (taxa de transferência) entre a CPU e a memória em comparação com a quantidade de memória. Na maioria dos computadores modernos, o throughput é muito menor do que a taxa com que o processador pode trabalhar. Isso limita seriamente a velocidade de processamento eficaz quando o processador é exigido para realizar o processamento mínimo em grandes quantidades de dados. A CPU é continuamente forçada a esperar por dados que precisam ser transferidos para ou a partir da memória. Como a velocidade da CPU e tamanho da memória têm aumentado muito mais rapidamente que a taxa de transferência entre eles, o gargalo se tornou mais um problema, um problema cuja gravidade aumenta com cada geração de CPU.

Arquitetura x LinguagemPara lembrar!

Page 7: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 7

Throughput

Throughput (ou taxa de transferência) é a quantidade de dados transferidos de um lugar a outro, ou a quantidade de dados processados em um determinado espaço de tempo, pode-se usar o termo throughput para referir-se a quantidade de dados transferidos em discos rígidos ou em uma rede, por exemplo ...

Page 8: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 8

Variáveis

Uma variável é uma abstração de uma célula ou de um conjunto de células de memóriaUma variável pode ser caracterizada por um conjunto de atributos

NomeEndereçoValorTipo é o atributo mais importante de uma LPTempo de vidaEscopo

Para lembrar!

Page 9: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 9

Nomes

Possuem um uso mais amplo do que simplesmente para variáveisEstão associados a rótulos, subprogramas, parâmetros formais, constantes...Também conhecido como identificadorQuestões de Projeto:

Tamanho máximo?Caracteres de conexão são permitidos? (*)Nomes distinguem maiúsculas de minúsculas?As palavras especiais são palavras reservadas ou palavras chaves?(*) A maioria das linguagens contemporâneas aceita caractere de conexão (_).

Page 10: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 10

Nomes (cont.)

Um nome é uma string (cadeia) de caracteres usada para identificar alguma entidade de um programaTamanho (número de caracteres):

FORTRAN I: máximo 6COBOL: máximo 30FORTRAN 90 e ANSI C: máximo 31Ada: sem limiteC++: sem limite, mas as implementações normalmente impõe algum limite (32)

Page 11: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 11

Nomes Nomes (cont.)

ConectoresPascal, Modula-2, e FORTRAN 77 não permitemOutras permitem

Distinção entre maiúsculas e minúsculas (Case sensitivity)

Desvantagem: legibilidade (nomes semelhantes denotam entidades diferentes)Nomes em C, C++, Java, e Modula-2 são case sensitiveEm versões do FORTRAN anteriores ao FORTRAN 90 os nomes podiam ter espaços em branco que eram ignorados. Ex., os dois nomes a seguir eram equivalentes

Sum Of SalariesSumOfSalaries

Legibilidade?

Page 12: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 12

Nomes - Palavras especiais

Uma palavra-chave é uma palavra que é especial somente em determinados contextos

Desvantagem: pouca legibilidadeEx: Fortran - REAL Integer Apple (palavra-chave, sentença declarativa)Integer = 4 (nome de variável)

Uma palavra reservada é uma palavra especialque não pode ser usada como nome pelo usuárioEm FORTRAN as palavras-chave são também especiais e são distinguidas pelo contexto. Ex., Integer Apple (sentença declarativa) e Integer = 4 (nome de variável > atribuição)

Ate

nção

!

Page 13: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 13

Palavra reservada (cont.)Em Java, um programador não pode utilizar uma variável com o nome for pois esta palavra é reservada para construção de loops. Ela é, pois, uma "palavra chave", e por ser de uso restrito, é também uma "palavra reservada". (Em algumas linguagens, como C ou Java, os termos tem o mesmo significado).COBOL tem 300 palavras reservadas, dentre as quais, LENGHT, BOTTOM, DESTINATION e COUNT.Algumas vezes a especificação de uma linguagem de programação define palavras reservadas para uso futuro. Na linguagem Java, as palavras const e goto são reservadas; elas não tem nenhum significado para a linguagem mas não podem ser utilizadas como identificadores. Isto permite que estas palavras sejam definidas em versões futuras da linguagem sem que o código já escrito seja afetado.

Nomes - Palavras especiais (cont.)A

tenç

ão!

Page 14: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 14

Variáveis - Endereço

O endereço de uma variável é o endereço de memória de máquina com o qual ela está associadaO mesmo nome pode estar associado a diferentes endereçosem diferentes lugares.Ex: um programa que tem doissubprogramas sub1 e sub2, cada um dos quais define umavariável que usa o mesmo nome (soma)

Como as variáveis são independentes uma da outra, uma referência a soma em sub1 não se relaciona com uma referência a soma em sub2

Se dois nomes de variáveis podem ser usados para acessar a mesma posição de memória elas são chamadas aliases ou apelidos

Ex: duas variáveis de ponteiro são apelidos quando apontam para a mesma localização de memória

O endereço de uma variável é algumas vezes chamado de seu valor esquerdo (l value), porque o endereço é o que é necessário quando uma variável aparece no lado esquerdo de uma atribuição

Ate

nção

!

Page 15: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 15

Variáveis – Tipo e Valor O tipo de uma variável determina a faixa devalores que a variável pode ter e o conjunto de operações que são definidas para os valores do tipo (será discutido no cap. 6)O valor de uma variável é o conteúdo da(s) célula(s) de memória associada(s) a variávelO endereçamento é orientado a bytes mas o valor ocupa mais de uma célula; célula abstrata

O valor-l da variável é seu endereçoO valor-r da variável é seu valor

Tem o tamanho exigido pela variável a

qual está associada

Page 16: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 16

Vinculação

Uma vinculação é uma associação, como, por exemplo:

entre um atributo e uma entidade, ouentre uma operação e um símbolo

Tempo de vinculação é o momento em que uma vinculação ocorreA vinculação e os tempos de vinculação são conceitos fundamentais na semântica de uma LP

Page 17: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 17

Vinculação (cont.)Possíveis tempos de vinculação:

Vinculação em tempo de projeto da LP -- ligação dos símbolos às operações (definição dos operadores, como por ex., * )Vinculação em tempo de implementação - ligação do tipo ponto-flutuante a sua forma de representação. Um tipo de dados, como int em C, é vinculado a uma faixa de valores possíveis em tempo de implementação da LPVinculação em tempo de compilação– ligar uma variável a um tipo de dados em particular, como em JavaUma variável pode ser vinculada a uma célula de armazenamento quando o programa é carregado na memóriaVinculação em tempo de execução -- ligar uma variável local, como em Java, a uma célula de memória quando o programa é carregado na memória (diferente do anterior)Uma chamada a um subprograma de uma biblioteca é vinculada ao código do subprograma em tempo de ligação

Page 18: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 18

Vejamos a seguinte sentença em Java:count = count + 5

O tipo de count é vinculado em tempo de compilação.O conjunto dos valores possíveis de count é vinculado em tempo de projeto do compilador.O significado do símbolo do operador + é vinculado em tempo de compilação, quando os tipos dos operandos tiverem sido determinados.A representação interna do literal 5 é vinculada ao tempo de projeto do compilador.O valor de count é vinculado em tempo de execuçãocom essa sentença

Vinculação (cont.)

Page 19: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 19

Vinculação de atributos a Variáveis

Vinculação estáticase ocorrer antes do tempo de execução e permanecer inalterada ao longo da execução do programa

Vinculação dinâmicase ocorrer durante a execução ou se puder ser modificada durante a execução do programa

Page 20: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 20

Vinculação de Tipos - Vinculação Estática

Antes de uma variável poder ser referenciada em um programa, ela deve ser vinculada a um tipo de dados. Os dois aspectos importantes dessa vinculação são

Como o tipo é especificado ?Quando ocorre a vinculação ?

Page 21: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 21

Tipos podem ser especificados estaticamentepor meio de alguma forma de declaração implícita ou explícita

Uma declaração explícita é uma instrução ou sentença de um programa que lista nomes de variáveis e especifica que elas são de um tipo particularUma declaração implícita é um meio de associar variáveis a tipos por convenções padronizadas, em vez de instruções de declaração. Nesse caso, a primeira aparição de um nome de variável em um programa constitui sua declaração implícita

Atenção

Vinculação de Tipos - Vinculação Estática

Page 22: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 22

A maioria das LPs projetadas desde meados dos anos 60 requer a declaração explícita de todas as variáveisFORTRAN e BASIC, no entanto, tem declarações implícitas As declarações implícitas podem ser prejudiciais à confiabilidade porque previnem o processo de compilação de detectar alguns erros de programação e de digitação pode trazer problemas para a legibilidadedo programaEm FORTRAN, um identificador que aparece em um programa que não é explicitamente declarado é implicitamente declarado de acordo com a seguinteconvenção: se iniciar com uma das letras I, J, K, L, M ouN então será do tipo INTEGER, caso contrário será do tipo REAL

Vinculação de Tipos - Vinculação Estática A

tenç

ão!

Page 23: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 23

Vinculação de Tipos DinâmicaA variável é vinculada ao tipo quando lhe é atribuído um valor em uma instrução ou sentença de atribuiçãoQuando a instrução é executada, a variável que está sendoatribuída é vinculada ao tipo do valor, da variável ouexpressão no lado direito da atribuiçãoVantagem: flexibilidade (programa genérico capaz de tratar dados de quaisquer tipos numéricos)Desvantagens:

Custo para implementar a vinculação dinâmica (verificação dinâmica de tipos e interpretação)Capacidade de detecção de erros pelo compilador diminuída já que não pode fazer verificação de tipos

As linguagens que têm vinculação de tipos dinâmica são normalmente implementadas usando interpretadores puros ao invés de compiladores

Vinculação de Tipos - Vinculação DinâmicaA

tenç

ão!

Page 24: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 24

Inferência de Tipo Linguagens funcionais: ML (*), Miranda, e HaskelAo invés de instruções de atribuição, os tipos são determinados a partir do contexto de suas referênciasO tipo dos argumentos e do resultado das funções não se declaram. A implementação faz inferência de tipos, ou seja, ela infere para cada função o tipo mais geral que é possível atribuir a essa função (*) ML é uma LP que oferece suporte tanto para programação funcional quanto para programação imperativa

Vinculação de Tipos - Inferência de Tipo

Page 25: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 25

Sintaxe geral de uma função ML:fun nome_função(parâmetros formais)=expressãoO valor da expressão é retornada pela função (*)

fun square (x : real) = x * x;fun square (x) = (x : real) * x; fun square (x) = x * (x : real);

Em ML o fato do valor funcional ser tipado como real é suficiente para inferir que o parâmetro também é do tipo real(*) A expressão pode ser uma lista de expressões, separadas por ponto e vírgula e envolta em parêntesis. O valor de retorno é o da última expressão

Vinculação de Tipos - Inferência de Tipo

Page 26: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 26

Próximo Assunto:Seção 5.4.3 -Vinculações de Armazenamento e Tempo de Vida

Page 27: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 27

Vinculação de Armazenamento e Tempo de Vida

O caráter fundamental de uma LP Imperativa é em grande parte determinado pelo projeto das vinculações de armazenamento para suas variáveis

Alocação: vinculação da variável a uma célula de memória obtida a partir de um pool ou conjunto de células de memória disponívelDesalocação ou Liberação: coloca a célula de volta ao poolO tempo de vida de uma variável é o tempo durante o qual esta é vinculada a uma localização de memória específica

Page 28: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 28

Classificação das variáveis de acordo com o tempo de vida

EstáticasStack-DinâmicasHeap-dinâmicas explícitasHeap-dinamicas implícitas

Page 29: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 29

Variáveis Estáticas

São aquelas vinculadas a memória antes que a execução do programa se inicie e que assim permanecem até que a execução se encerreNão suportam recursão!Ex: todas variáveis FORTRAN 77

Variáveis static em C

Page 30: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 30

Variáveis Stack-Dinâmicas

São aquelas cujas vinculações de armazenamento criam-se a partir de suas instruções de declaraçãoSão criadas em uma pilha durante a invocação de um subprogramaSão criadas em tempo de execuçãoVariáveis locais declaradas em subprogramas geralmente são stack-dinâmicasPermite recursão: cada vez que um subprograma chama a si mesmo, um novo quadro com as mesmas variáveis é colocado na pilhaOverhead de alocação e desalocação

Page 31: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 31

Variáveis Heap-Dinâmicas Explícitas

São células de memória não nomeadas (abstratas) alocadas e desalocadas por instruções explícitas em tempo de execução pelo programador

Referenciadas somente através de ponteiros ou referênciasO heap é uma coleção de células de armazenamento cuja organização é altamente desorganizada, por causa da imprevisibilidade do seu uso

Page 32: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 32

Variáveis Heap-Dinâmicas Explícitas (cont.)

São usadas freqüentemente para estruturas dinâmicas que precisam crescer e/ou encolher durante a sua execução

Essas estruturas podem ser criadas usando-se ponteiros e variáveis heap-dinâmica explícitas

Em Pascal a alocação dinâmica da memória é feita pelo procedimento “new”

New(p): cria uma variável dinâmica que será apontada por “p”

Page 33: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 33

Variáveis Heap-Dinâmicas Implícitas

A alocação no heap é feita quando a variável recebe um valorTem como vantagem a flexibilidade

São nomes que podem ser usados para qualquer finalidade

Entretanto, ocorre perda da capacidade de detecção de erros pelo compiladorO heap é uma coleção de células de armazenamento cuja organização é altamente desorganizada, por causa da imprevisibilidade do seu uso

Page 34: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 34

Resumindo...

Variáveis estáticas: são vinculadas a células de memória antes da execução do programa e permanecem até o fim do programa Variáveis Stack-Dinâmicas: as vinculações são criadas a partir da instrução de declaração, em tempo de execução

Page 35: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 35

Resumindo...

Variáveis Heap-Dinâmicas Explícitas: as células de memória são alocadas e desalocadas em tempo de execução através declarações explícitasVariáveis Heap-Dinâmicas Implícitas: as células de memória são alocadas somente quando lhe são atribuídos valores e desalocadas por meio de instruções explícitas (delete)

Page 36: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 36

Verificação de Tipos

Verificação de tipos é a atividade de assegurar que os operandos de um operador possuem tipos compatíveis

Exemplo: Subprogramas podem ser vistos como operadores e os parâmetros são seus operandosO símbolo de atribuição pode ser visto como um operador, sendo sua variável alvo e sua expressão os operandos

Um tipo compatível é aquele válido para o operador ou com permissão, nas regras da linguagem, para ser convertido pelo compilador para um tipo válido

Esta conversão automática é chamada coerçãoUm erro de tipo é a aplicação de um operador a um operando de tipo impróprio

Page 37: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 37

CoerçãoA idéia é que a linguagem é quem faz uma coerção de tipos e não o programador, ou seja, que esta não é feita voluntariamente pelo programador e sim pela linguagem. Exemplo: Se o operador + é definido para somar dois números reais, e um número inteiro é passado como parâmetro então o inteiro é "coergido" para real.

Verificação de Tipos (cont.)

Page 38: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 38

Verificação de Tipos (cont.)

Se todas as vinculações de variáveis a tipos são estáticas a verificação de tipos quase sempre poderá ser feita estaticamenteSe todas as vinculações de variáveis a tipos são dinâmicas, a verificação de tipos deverá ser dinâmica

Page 39: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 39

Verificação de Tipos (cont.)

Uma linguagem de programação é fortemente tipada se erros de tipos são sempre detectados

Vantagem da tipificação forte: permite detectar todos os usos equivocados de variáveis que resultam em erros de tipo

As regras de coerção tem um grande efeito sobre a verificação de tipos - eles podem enfraquecer consideravelmente a verificação

Page 40: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 40

Compatibilidade de Tipos

Há dois métodos diferentes de compatibilidade de tipos:

Compatibilidade de tipo de nomeCompatibilidade de tipo de estrutura

Page 41: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 41

Compatibilidade de Tipos (cont.)

A compatibilidade de tipo de nomesignifica que duas variáveis têm tipos compatíveis somente se estiverem na mesma declaração ou em declarações que usam o mesmo nome de tipo

Fácil de implementar mas altamente restritivaSub-faixa de números inteiros não seria compatível com inteiros

Page 42: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 42

Compatibilidade de Tipos (cont.)

Compatibilidade de tipo de estruturasignifica que duas variáveis possuem tipos compatíveis se os seus tipos tiverem estruturas idênticas

Mais flexível, porém difícil de implementar (é preciso analisar a estrutura completa dos tipos)

A maioria das linguagens usa combinação dos métodos

Page 43: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 43

Compatibilidade de Tipos (cont.)

Questões:Dois tipos de registro são compatíveis se tiverem a mesma estrutura mas nome de campos diferentes?Dois tipos de array unidimensionais são compatíveis se possuem o mesmo tipo de elemento mas faixas de subscritos diferentes?(ex [1..10] and [2..11])Dois tipos de enumeração são compatíveis se seus componentes são grafados diferente?Tipos como estes não podem ser diferenciados Ex: Pascal

type Celsius = realFahrenheit = real

Page 44: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 44

Escopo

O escopo de uma variável é a faixa de instruções na qual a variável é visível

Uma variável é visível em uma instrução se pode ser referenciada nesta instrução

As variáveis não-locais de uma unidade ou de um bloco são visíveis dentro destes mas não são declaradas nelesAs regras de escopo de uma variável determinam como a ocorrência de um nome é associada a uma variável

Page 45: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 45

Escopo

Escopo estáticoO escopo pode ser determinado antes da execuçãoBaseado no texto do programaPara conectar um nome a uma variável deve-se encontrar uma declaração que o façaProcesso de busca:

procura declarações, primeiro localmente, depois num escopo superior e assim sucessivamente enquanto não encontra a declaração com o nome

Page 46: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 46

Escopo estáticoProcedure big;var x:integer;Procedure sub1;Begin {sub1}... X ...End;Procedure sub2;Var x: integer;Begin {sub2}...

End;Begin {big}...End;

No escopo estático, a referência a variável x em sub1 é ao x declarado no procedimento big.A procura se inicia em sub1, mas nenhuma declaração é encontrada.A procura prossegue no pai-estático de sub1 (big), onde uma declaração é encontrada.

Page 47: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 47

Escopo estático (cont.)

Subprogramas criam seus próprios escoposQuando programas são aninhados é criada uma hierarquia de escoposQuando uma referência a uma variável é encontrada os atributos da variável são determinados localizando-se as instruções nas quais ela está declarada

Ancestrais estáticos

Page 48: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 48

Escopo estático (cont.)

Variáveis podem ser escondidas em uma unidade de programa quando neste se declara uma variável com mesmo nomeEm geral, uma declaração para uma variável ocultará efetivamente qualquer declaração de variável com mesmo nome em um escopo envolvente maior

C++ e Ada permitem acessar estas variáveis ocultas. Operador de escopo no C++ (::)

Page 49: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 49

Escopo estático (cont.)

Program main;var x:integer;Procedure sub1;var x: integer;Begin {sub1}... X ...End;

Begin {big}...

End.

A referência a x em sub1 é ao x declarado de sub1O x do programa main está oculto no código de sub1

Page 50: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 50

Escopo estático - Blocos

Muitas linguagens permitem que novos escopos estáticos sejam definidos no meio de código executávelUma seção de código pode ter suas próprias variáveis locais cujo escopo é minimizadoEsta seção é chamada de bloco

C, C++, Java permitem que qualquer instrução composta tenha declarações e defina um novo escopoExemplo:If(list[i] < list[j]){Int temp;temp = list[i];list[i] = list[j];list[j] = temp;}

Page 51: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 51

Escopo estático - Avaliação

Este programa contém o escopo global para main, com dois procedimentos que definem os escopos dentro de main, A e BDentro de A há escopos para C e DDentro de B está o escopo para EO acesso a procedimentos exigido é o seguinte:

main chama A e BA chama C e DB chama A e E

A

B

C

D

E

main

Page 52: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 52

Escopo estático - Avaliação

Podemos visualizar a estrutura do programa como uma árvore:

A B

C D E

main

Page 53: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 53

MAIN MAIN

A B A B

C D E C D E

Escopo estático - Avaliação

Um grafo das chamadas a procedimentos potenciais mostra que é possível uma grande quantidade de oportunidades de chamada além do exigidoUm programador poderia erroneamente chamar um subprograma que não deveria ter sido chamado

PossíveisDesejado

Page 54: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 54

Escopo estático - Avaliação

Demasiado acesso a dados pode ser um problemaExemplo: todas as variáveis do programa principal são visíveis a todos os procedimentosCria a possibilidade de acessos incorretos

Um identificador grafado erroneamente em um procedimento pode ser tomado como uma referência a um identificador em algum escopo envolvente

Page 55: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 55

Escopo estático - Avaliação

Suponha que a especificação é mudada e agora E deve acessar algum dado de DSoluções:

1. Colocar E no escopo de D (mas E não poderá acessar o escopo de B)2. Mover os dados de D que E necessita para MAIN (entretanto todos os procedimentos terão acesso a eles)

Suponhamos que a variável movida seja X, e que seja necessária para D e ESuponhamos que haja uma variável X declarada em AIsso ocultaria o X correto de seu proprietário original, D

A

B

C

D

E

main

Page 56: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 56

Escopo estático - Avaliação

Problema: ter a declaração da variável distante do seu usoDe modo geral: O escopo estático encoraja o uso de globaisTodos os procedimentos podem acabar sendo aninhados no mesmo nível no programa principal

Page 57: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 57

Escopo

Escopo DinâmicoBaseados em seqüências de chamadas a subprogramas não em suas relações espaciais (temporal versus espacial)Referências a variáveis são conectadas a declarações procurando regressivamente através dos subprogramas chamados

Page 58: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 58

Escopo DinâmicoProcedure big;var x:integer;Procedure sub1;Begin {sub1}... X ...End;Procedure sub2;Var x: integer;Begin {sub2}...

End;Begin {big}...End;

O significado do identificador X referenciado em sub1 é dinâmico (não podeser determinadodurante a compilação)

Page 59: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 59

Escopo Dinâmico

Como determinar o significado correto de X ?

A procura é iniciada com as declarações locaisAs declarações do pai dinâmico (procedimento de chamada) são procuradasSe não encontrar, então deve-se procurar no pai dinâmico desse procedimento e assim por diante até que uma declaração seja encontradaSe não for encontrada uma declaração então haverá erro em tempo de execução

Page 60: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 60

Escopo Dinâmico

Considere a seguintesequência de chamada para sub1:

MAIN chama Sub2Sub2 chama Sub1

Escopo Dinâmico: referência a x emSub1 é ao x declarado em Sub2

Procedure big;var x:integer;Procedure sub1;Begin {sub1}... X ...End;Procedure sub2;Var x: integer;Begin {sub2}...

End;Begin {big}...End;

Page 61: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 61

Escopo Dinâmico

Considere a seguintesequência de chamada para Sub1:

MAIN chama Sub1

Escopo Dinâmico: referência a X emSub1 é ao X declarado em main

Procedure big;var x:integer;Procedure sub1;Begin {sub1}... X ...End;Procedure sub2;Var x: integer;Begin {sub2}...

End;Begin {big}...End;

Page 62: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 62

Escopo Dinâmico

Avaliação do escopo dinâmicoVantagem: conveniênciaDesvantagem: baixa legibilidade

Page 63: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 63

Ambiente de Referenciamento

O ambiente de referenciamento de uma instrução é o conjunto de todos os nomes visíveis na instruçãoEm uma linguagem de escopo estático o ambiente de referenciamento consiste das variáveis locais mais todas as variáveis dos programas em que o trecho atual está aninhado, somada as variáveis do programa principal

Page 64: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 64

Ambiente de Refenciamento

Um subprograma está ativo se sua execução tiver começado, mas ainda não terminouEm uma linguagem de escopo dinâmico, o ambiente de referenciamento consiste das variáveis locais mais as variáveis de todos os programas ativos atualmente

Page 65: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 65

Constantes NomeadasUma constante nomeada é uma variável vinculada a um valor somente no momento que ela é vinculada a um armazenamento.

Ex: usar o nome PI em vez da constante 3,141592 Vantagens: legibilidade e modificabilidadeA vinculação de valores a constantes nomeadas pode ser feito tanto estática quanto dinamicamenteLinguagens:

Pascal: somente literaisModula-2 e FORTRAN 90: permite expressões com contantes nomeadas definidas anteriormente e também valores constantes com operadoresAda, C++, e Java: Expressões de qualquer natureza

Page 66: 4ª Parte_Cap.5 - Nomes, Vinculações e Escopos

Roberto Loscio 66

Inicialização de Variáveis

A vinculação a uma variável de um valor no momento em que ela é vinculada ao armazenamento é chamada inicialização;Freqüentemente a Inicialização pode ser feita na instrução de declaração da variávelEx: Ada

SUM : FLOAT := 0.0