Você está na página 1de 66

Nomes, Vinculações,

Verificação de Tipos e Escopo


Disciplina: Linguagens de
Programação
Professor: Roberto Loscio
roberto.loscio@terra.com.br

Roberto Loscio 1
Especificação de uma LP

zEnvolve 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):
za := b
zComando de atribuição descrito corretamente
(sintaxe);
zSubstitua o valor de a com o valor atual de b
Roberto Loscio 2
Sintaxe e Semântica
z É 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 programa
{Semântica é o significado de suas instruções, de suas
unidades de programa
z A sintaxe influencia a forma como os programas
são escritos, enquanto que a semântica dita
como os programas devem ser entendidos por
outros programadores e devem ser executados
em um computador
Roberto Loscio 3
Sintaxe e Semântica

zA 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

Roberto Loscio 4
Arquitetura x Linguagem
z Linguagens de programação imperativas são
abstrações da arquitetura de Von Neumann
z Os componentes principais da arquitetura de
Von Neumann são memória e processador
z Na linguagem, a memória é abstraída pelas
variáveis
z O processador é abstraído pelas operações
z O nível de abstração pode variar conforme a
linguagem e as suas estruturas de dados

Roberto Loscio 5
Arquitetura x Linguagem
Para lembrar!

Gargalo de von Neumann


A 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 gravidadeRobertoaumenta
Loscio com cada geração de CPU. 6
Throughput

zThroughput (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 ...

Roberto Loscio 7
Variáveis
z Uma variável é uma abstração de uma célula ou
de um conjunto de células de memória
z Uma variável pode ser caracterizada por um
conjunto de atributos
{Nome
{Endereço Para lembrar!
{Valor
{Tipo é o atributo mais importante de uma LP
{Tempo de vida
{Escopo
Roberto Loscio 8
Nomes
z Possuem um uso mais amplo do que simplesmente para
variáveis
z Estão associados a rótulos, subprogramas, parâmetros
formais, constantes...
z Também conhecido como identificador
z Questõ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 (_).

Roberto Loscio 9
Nomes (cont.)

zUm nome é uma string (cadeia) de


caracteres usada para identificar alguma
entidade de um programa
zTamanho (número de caracteres):
{FORTRAN I: máximo 6
{COBOL: máximo 30
{FORTRAN 90 e ANSI C: máximo 31
{Ada: sem limite
{C++: sem limite, mas as implementações
normalmente impõe algum limite (32)
Roberto Loscio 10
Nomes (cont.)

z Conectores
{Pascal, Modula-2, e FORTRAN 77 não permitem
{Outras permitem
z 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 sensitive
{ Em 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
z Sum Of Salaries
z SumOfSalaries
Legibilidade?
Roberto Loscio 11
Nomes - Palavras especiais

{Uma palavra-chave é uma palavra que é


especial somente em determinados contextos
zDesvantagem: pouca legibilidade
zEx: Fortran - REAL
zInteger Apple (palavra-chave, sentença declarativa)
Atenção!

zInteger = 4 (nome de variável)


{Uma palavra reservada é uma palavra especial
que não pode ser usada como nome pelo
usuário
{ Em 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)

Roberto Loscio 12
Nomes - Palavras especiais (cont.)
zPalavra reservada (cont.)
z 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, é
Atenção!

também uma "palavra reservada". (Em algumas linguagens,


como C ou Java, os termos tem o mesmo significado).
z COBOL tem 300 palavras reservadas, dentre as quais, LENGHT,
BOTTOM, DESTINATION e COUNT.
z 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.

Roberto Loscio 13
Variáveis - Endereço
z O endereço de uma variável é o endereço de memória de
máquina com o qual ela está associada
z O mesmo nome pode estar associado a diferentes endereços
em diferentes lugares.Ex: um programa que tem dois
subprogramas sub1 e sub2, cada um dos quais define uma
variá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
Atenção!

z 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
Roberto Loscio 14
Variáveis – Tipo e Valor
z O tipo de uma variável determina a faixa de
valores 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)
z O valor de uma variável é o conteúdo da(s)
célula(s) de memória associada(s) a variável
z O 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ço
{O valor-r da variável é seu valor
Tem o tamanho
exigido pela variável a
qual está associada
Roberto Loscio 15
Vinculação

zUma vinculação é uma associação, como,


por exemplo:
{entre um atributo e uma entidade, ou
{entre uma operação e um símbolo
zTempo de vinculação é o momento em
que uma vinculação ocorre
zA vinculação e os tempos de vinculação
são conceitos fundamentais na semântica
de uma LP
Roberto Loscio 16
Vinculação (cont.)
z 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 LP
{ Vinculação em tempo de compilação– ligar uma variável a
um tipo de dados em particular, como em Java
z Uma variável pode ser vinculada a uma célula de
armazenamento quando o programa é carregado na
memória
{ Vinculaçã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 Roberto
subprograma
Loscio
em tempo de ligação 17
Vinculação (cont.)
z Vejamos a seguinte sentença em Java:
z 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ção
com essa sentença
Roberto Loscio 18
Vinculação de atributos a Variáveis

zVinculação estática
{se ocorrer antes do tempo de execução e
permanecer inalterada ao longo da execução
do programa
zVinculação dinâmica
{se ocorrer durante a execução ou se puder ser
modificada durante a execução do programa

Roberto Loscio 19
Vinculação de Tipos - Vinculação
Estática
zAntes 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 ?

Roberto Loscio 20
Vinculação de Tipos - Vinculação Estática
Atenção
z Tipos podem ser especificados estaticamente
por 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 particular
{Uma 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

Roberto Loscio 21
Vinculação de Tipos - Vinculação Estática
z A maioria das LPs projetadas desde meados dos anos
Atenção!

60 requer a declaração explícita de todas as variáveis


z FORTRAN e BASIC, no entanto, tem declarações
implícitas
z 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 legibilidade
do programa
z Em FORTRAN, um identificador que aparece em um
programa que não é explicitamente declarado é
implicitamente declarado de acordo com a seguinte
convenção: se iniciar com uma das letras I, J, K, L, M ou
N então será do tipo INTEGER, caso contrário será do
tipo REAL Roberto Loscio 22
Vinculação de Tipos - Vinculação Dinâmica
z Vinculação de Tipos Dinâmica
{ A variável é vinculada ao tipo quando lhe é atribuído um valor
em uma instrução ou sentença de atribuição
{ Quando a instrução é executada, a variável que está sendo
atribuída é vinculada ao tipo do valor, da variável ou
expressão no lado direito da atribuição
{ Vantagem: flexibilidade (programa genérico capaz de tratar
dados de quaisquer tipos numéricos)
{ Desvantagens:
Atenção!

z Custo para implementar a vinculação dinâmica (verificação


dinâmica de tipos e interpretação)
z 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
Roberto Loscio 23
Vinculação de Tipos - Inferência de Tipo

z Inferência de Tipo
{Linguagens funcionais: ML (*), Miranda, e Haskel
{Ao invés de instruções de atribuição, os tipos são
determinados a partir do contexto de suas referências
{O 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

Roberto Loscio 24
Vinculação de Tipos - Inferência de Tipo

z Sintaxe geral de uma função ML:


z fun nome_função(parâmetros formais)=expressão
z O 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);
z Em ML o fato do valor funcional ser tipado como
real é suficiente para inferir que o parâmetro
também é do tipo real
z (*) 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

Roberto Loscio 25
Próximo Assunto:
Seção 5.4.3 -
Vinculações de
Armazenamento e
Tempo de Vida
Roberto Loscio 26
Vinculação de Armazenamento e Tempo de
Vida
z 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ível
{Desalocação ou Liberação: coloca a célula de volta ao
pool
{O tempo de vida de uma variável é o tempo durante o
qual esta é vinculada a uma localização de memória
específica
Roberto Loscio 27
Classificação das variáveis de
acordo com o tempo de vida
{Estáticas
{Stack-Dinâmicas
{Heap-dinâmicas explícitas
{Heap-dinamicas implícitas

Roberto Loscio 28
Variáveis Estáticas

zSã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 encerre
zNão suportam recursão!
zEx: todas variáveis FORTRAN 77
Variáveis static em C

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

Roberto Loscio 30
Variáveis Heap-Dinâmicas Explícitas

zSã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ências
{O heap é uma coleção de células de
armazenamento cuja organização é altamente
desorganizada, por causa da imprevisibilidade
do seu uso

Roberto Loscio 31
Variáveis Heap-Dinâmicas Explícitas
(cont.)
z 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
z 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”

Roberto Loscio 32
Variáveis Heap-Dinâmicas Implícitas
z A alocação no heap é feita quando a variável
recebe um valor
z Tem como vantagem a flexibilidade
{São nomes que podem ser usados para qualquer
finalidade
z Entretanto, ocorre perda da capacidade de
detecção de erros pelo compilador
z O heap é uma coleção de células de
armazenamento cuja organização é altamente
desorganizada, por causa da imprevisibilidade
do seu uso
Roberto Loscio 33
Resumindo...

zVariá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
zVariáveis Stack-Dinâmicas: as
vinculações são criadas a partir da
instrução de declaração, em tempo de
execução

Roberto Loscio 34
Resumindo...

z 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ícitas
z Variá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)

Roberto Loscio 35
Verificação de Tipos

z Verificação de tipos é a atividade de assegurar que os


operandos de um operador possuem tipos compatíveis
{ Exemplo:
zSubprogramas podem ser vistos como operadores e
os parâmetros são seus operandos
zO 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
zEsta conversão automática é chamada coerção
{ Um erro de tipo é a aplicação de um operador a um operando de
tipo impróprio
Roberto Loscio 36
Verificação de Tipos (cont.)

z Coerção
z A 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.

Roberto Loscio 37
Verificação de Tipos (cont.)

zSe todas as vinculações de variáveis a


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

Roberto Loscio 38
Verificação de Tipos (cont.)

zUma 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
zAs regras de coerção tem um grande
efeito sobre a verificação de tipos - eles
podem enfraquecer consideravelmente a
verificação Roberto Loscio 39
Compatibilidade de Tipos

zHá dois métodos diferentes de


compatibilidade de tipos:
{Compatibilidade de tipo de nome
{Compatibilidade de tipo de estrutura

Roberto Loscio 40
Compatibilidade de Tipos (cont.)

zA compatibilidade de tipo de nome


significa 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 restritiva
{Sub-faixa de números inteiros não seria
compatível com inteiros

Roberto Loscio 41
Compatibilidade de Tipos (cont.)

zCompatibilidade de tipo de estrutura


significa 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)
zA maioria das linguagens usa combinação
dos métodos

Roberto Loscio 42
Compatibilidade de Tipos (cont.)
z 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
z type Celsius = real
z Fahrenheit = real
Roberto Loscio 43
Escopo

zO 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
zAs variáveis não-locais de uma unidade
ou de um bloco são visíveis dentro destes
mas não são declaradas neles
zAs regras de escopo de uma variável
determinam como a ocorrência de um
nome é associada a uma variável
Roberto Loscio 44
Escopo

zEscopo estático
{O escopo pode ser determinado antes da
execução
{Baseado no texto do programa
{Para conectar um nome a uma variável deve-
se encontrar uma declaração que o faça
{Processo de busca:
zprocura declarações, primeiro localmente, depois
num escopo superior e assim sucessivamente
enquanto não encontra a declaração com o nome
Roberto Loscio 45
Escopo estático
Procedure big;
z No escopo estático, a
var x:integer;
Procedure sub1;
referência a variável x em
Begin {sub1} sub1 é ao x declarado no
... X ... procedimento big.
End;
z A procura se inicia em
Procedure sub2;
Var x: integer; sub1, mas nenhuma
Begin {sub2} declaração é encontrada.
... z A procura prossegue no
End;
pai-estático de sub1 (big),
Begin {big}
... onde uma declaração é
End; encontrada.

Roberto Loscio 46
Escopo estático (cont.)

zSubprogramas criam seus próprios


escopos
zQuando programas são aninhados é
criada uma hierarquia de escopos
zQuando 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
Roberto Loscio 47
Escopo estático (cont.)

zVariáveis podem ser escondidas em uma


unidade de programa quando neste se
declara uma variável com mesmo nome
zEm 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++ (::)
Roberto Loscio 48
Escopo estático (cont.)
Program main;
var x:integer; z A referência a x em sub1 é
Procedure sub1; ao x declarado de sub1
var x: integer; z O x do programa main está
oculto no código de sub1
Begin {sub1}
... X ...
End;
Begin {big}
...
End.
Roberto Loscio 49
Escopo estático - Blocos
{ Muitas linguagens permitem que novos escopos estáticos
sejam definidos no meio de código executável
{ Uma seção de código pode ter suas próprias variáveis locais
cujo escopo é minimizado
{ Esta seção é chamada de bloco
zC, C++, Java permitem que qualquer instrução
composta tenha declarações e defina um novo
escopo
zExemplo:
If(list[i] < list[j]){
Int temp;
temp = list[i];
list[i] = list[j];
list[j] = temp;
}
Roberto Loscio 50
Escopo estático - Avaliação

z Este programa contém o


main
C escopo global para main, com
A dois procedimentos que
definem os escopos dentro de
main, A e B
D
z Dentro de A há escopos para
CeD
z Dentro de B está o escopo
B E para E
z O acesso a procedimentos
exigido é o seguinte:
{main chama A e B
{A chama C e D
{B chama A e E
Roberto Loscio 51
Escopo estático - Avaliação

zPodemos visualizar a estrutura do


programa como uma árvore:
main

A B

C D E

Roberto Loscio 52
Escopo estático - Avaliação
z Um grafo das chamadas a procedimentos potenciais
mostra que é possível uma grande quantidade de
oportunidades de chamada além do exigido
z Um programador poderia erroneamente chamar um
subprograma que não deveria ter sido chamado

MAIN MAIN

A B A B

C D E C D E

Desejado Possíveis
Roberto Loscio 53
Escopo estático - Avaliação

zDemasiado acesso a dados pode ser um


problema
zExemplo: todas as variáveis do programa
principal são visíveis a todos os
procedimentos
zCria 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
Roberto Loscio 54
Escopo estático - Avaliação
z Suponha que a especificação é mudada e
agora E deve acessar algum dado de D
z Soluções: main
z 1. Colocar E no escopo de D (mas E não poderá C
acessar o escopo de B) A
z 2. Mover os dados de D que E necessita para
MAIN (entretanto todos os procedimentos terão D
acesso a eles)
y Suponhamos que a variável movida seja X,
e que seja necessária para D e E
y Suponhamos que haja uma variável X B E
declarada em A
y Isso ocultaria o X correto de seu
proprietário original, D

Roberto Loscio 55
Escopo estático - Avaliação

zProblema: ter a declaração da variável


distante do seu uso
zDe modo geral: O escopo estático
encoraja o uso de globais
zTodos os procedimentos podem acabar
sendo aninhados no mesmo nível no
programa principal

Roberto Loscio 56
Escopo

zEscopo Dinâmico
{Baseados 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

Roberto Loscio 57
Escopo Dinâmico
Procedure big;
var x:integer; z O significado do
Procedure sub1;
Begin {sub1} identificador X
... X ... referenciado em sub1
End;
Procedure sub2;
é dinâmico (não pode
Var x: integer; ser determinado
Begin {sub2} durante a
...
End; compilação)
Begin {big}
...
End;

Roberto Loscio 58
Escopo Dinâmico

zComo determinar o significado correto de


X?
{A procura é iniciada com as declarações locais
{As declarações do pai dinâmico (procedimento
de chamada) são procuradas
{Se não encontrar, então deve-se procurar no
pai dinâmico desse procedimento e assim por
diante até que uma declaração seja encontrada
{Se não for encontrada uma declaração então
haverá erro em tempo de execução
Roberto Loscio 59
Escopo Dinâmico

z Considere a seguinte Procedure big;


var x:integer;
sequência de Procedure sub1;
chamada para sub1: Begin {sub1}
... X ...
{MAIN chama Sub2 End;
{Sub2 chama Sub1 Procedure sub2;
Var x: integer;
z Escopo Dinâmico: Begin {sub2}
referência a x em ...
End;
Sub1 é ao x Begin {big}
declarado em Sub2 ...
End;

Roberto Loscio 60
Escopo Dinâmico

z Considere a seguinte Procedure big;


var x:integer;
sequência de Procedure sub1;
chamada para Sub1: Begin {sub1}
... X ...
{MAIN chama Sub1 End;
z Escopo Dinâmico: Procedure sub2;
Var x: integer;
referência a X em Begin {sub2}
Sub1 é ao X ...
End;
declarado em main Begin {big}
...
End;

Roberto Loscio 61
Escopo Dinâmico

zAvaliação do escopo dinâmico


{Vantagem: conveniência
{Desvantagem: baixa legibilidade

Roberto Loscio 62
Ambiente de Referenciamento

zO ambiente de referenciamento de uma


instrução é o conjunto de todos os nomes
visíveis na instrução
zEm 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
Roberto Loscio 63
Ambiente de Refenciamento

zUm subprograma está ativo se sua


execução tiver começado, mas ainda não
terminou
zEm 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

Roberto Loscio 64
Constantes Nomeadas
z Uma 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
z Vantagens: legibilidade e modificabilidade
z A vinculação de valores a constantes nomeadas pode
ser feito tanto estática quanto dinamicamente
z Linguagens:
{ Pascal: somente literais
{ Modula-2 e FORTRAN 90: permite expressões com
contantes nomeadas definidas anteriormente e também
valores constantes com operadores
{ Ada, C++, e Java: Expressões de qualquer natureza
Roberto Loscio 65
Inicialização de Variáveis

zA vinculação a uma variável de um valor


no momento em que ela é vinculada ao
armazenamento é chamada inicialização;
zFreqüentemente a Inicialização pode ser
feita na instrução de declaração da
variável
z Ex: Ada
SUM : FLOAT := 0.0

Roberto Loscio 66

Você também pode gostar