O documento discute os conceitos de nomes, variáveis e escopo em linguagens de programação. Aborda tópicos como formas de nomes, tipos de variáveis, vinculação de atributos, compatibilidade de tipos e escopo estático.
2. 1.
1 Introdução
As linguagens de programação imperativas são
abstrações da arquitetura do computador de
von Neuman;
Componentes principais:
◦ Memória -> armazena instruções e dados;
◦ Processador -> fornece operações para modificar o
conteúdo da memória;
úd d ói
Células de memória -> variáveis.
3. 2.
2 Nomes
Associado a variável, rótulo, subprograma,
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?
◦ Palavras especiais são palavras reservadas ou
palavras-chave?
palavras chave?
4. 2.
2 Nomes
2.1.
2 1 Formas de nomes
◦ Nome: cadeia de caracteres usada para identificar
alguma entidade de um programa
programa.
◦ Primeiras linguagens: nome de único caractere
incógnita na definição matemática;
◦ FORTRAN I rompe com a idéia: até seis caracteres
em um nome;
◦ FORTRAN 91 e C: permitem até 31 caracteres;
◦ Java e Ada: sem limite de tamanho
tamanho.
◦ Distinção CASE SENSITIVE! E a legibilidade? E a
capacidade de escrita?
5. 2.
2 Nomes
2.1.
2 1 Formas de nomes
Palavras-chave ou reservadas?
REAL APPLE
int apple; (!)
REAL = 3.4
int
i t = x + 2; (?)
2
ou
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)
6. 3.Variáveis
Abstração de célula ou conjunto de
células d memória;
él l de ói
◦ Ling. de máquina -> ling. de montagem
Endereços de memória numéricos -> nomes
Endereçamento absoluto
◦ Variável: sêxtuplo de atributos
Nome;
Endereço;
Valor;
Tipo;
Tempo de vida;
p
Escopo.
7. 3.
3 Variáveis
3.1.
3 1 Nomes
◦ ...identificadores...
3.2. Endereço
◦ Endereço de uma variável é o mesmo da
memória à qual ela está associada.
◦ Mas não é tão simples
simples...
... e vetores, matrizes?
int sub1{ (...) int soma; (...) } Mesmo nome,
diferentes
void sub2{ ( ) int soma; (...) }
{ (...) ( ) endereços
8. 3.
3 Variáveis
3.2.1.
3 2 1 Apelidos
◦ Mais de um nome de variável pode ser usado
para acessar uma única localização d memória
ú i l li ã de ói
Nomes -> Apelidos.
◦ U d ponteiros;
Uso de
◦ Passagem por referência;
Ponto ponto = new Ponto();
ponto.x = 10;
ponto.y
ponto y = 12;
(...)
void setPonto(Ponto p){
(...) p.x = p.x + 15; (...)
}
9. 3.
3 Variáveis
3.3. Tipo
p
◦ Faixa de valores que uma variável pode ter
◦ Conjunto de operações definidas para o tipo
◦ Em Java: int
-2.147.483.648 a 2 147 483 647
2 147 483 648 2.147.483.647
Operadores: +, -, *, /, %, etc.
3.4.Valor
◦ Conteúdo da(s) célula(s) de memória
() ()
associadas à variável.
valor-l valor-r
x = y + 10;
left side right side
(endereço) (valor)
10. 4.
4 Vinculação
Vinculaçã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 g
Compilação;
Ligação (link);
g ç ( )
Carregamento;
ç
Execução.
11. 4.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;
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;
Significado d í b l do
Si ifi d do símbolo d operador + nessa i
d instrução:
ã
◦ Vinculado no tempo de compilação;
Representação interna do literal 5:
◦ Vinculada no tempo de projeto do compilador.
12. 4.Vinculação
Vinculação de atributos a variáveis
V l ã d b á
estática,
ocorre em tempo de compilação;
d il ã
permanece inalterado ao longo da execução;
c.c.,
c c , dinâmica;
◦ Declaração de variáveis
Explícita
Lista nomes de variáveis e especifica seus tipos;
Implícita
p
Associação de variáveis por convenção padrão
Inexistente nas linguagens atuais
Em FORTRAN, uma variável sem tipo definida
inteiro, se começa com I, J, K, L, M ou N
c.c., Real
c c é Real.
Problema na legibilidade
13. 4.
4 Vinculação
Vinculaçã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 Java
J
◦ Pode gerar resultados errôneos;
◦ Alto custo de implementação;
14. 4.
4 Vinculação
Inferência de Tipo
◦ Exemplo em ML
fun circumf(r) = 3.14159 * r * r
fun vezes10(x) = 10 * x
fun quadrado(x) = x * x
fun quadrado(x) : int = x * x
fun quadrado(x : int) = x * x
fun quadrado(x) = (x : int) * x
fun quadrado(x) = x * (x : int)
◦ Também presente em Miranda e Haskell
p
15. 4.
4 Vinculação
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
está vinculada a uma localização de memória
específica.
16. 4.
4 Vinculação
Variá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 subprogramas
subprogramas.
Exemplo em C, C++ e Java: aplicação de static.
17. 4.
4 Vinculação
Variá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.
18. 4.
4 Vinculação
Variáveis dinâmicas no monte explícitas
p
◦ Células de memória abstratas (sem nome)
(des)alocadas por instruções explícitas em
tempo de execução;
Variáveis de ponteiro ou referências;
◦ Monte: conjunto de células de
armazenamento altamente desorganizado
devido à imprevisibilidade do uso;
◦ E C++ e J
Em Java:
new (mais um nome de tipo) – cria uma variável no
monte e um ponteiro retorna para ela
19. 4.
4 Vinculação
Variá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 */
(...) delete intnode; d l
( ) d l t i t d /* desaloca a célula para a qual
él l l
intnode aponta */
Em Java, os objetos são dinâmicos no monte
J j
explí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.
20. 4.
4 Vinculação
Variá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.
21. 5.
5 Verificação de Tipos
Atividade de assegurar que os operandos de um
operador sejam de tipos compatíveis
◦ Válid para o operador;
Válido d
◦ Pelas regras da linguagem, pode ser convertido pelo
compilador para um tipo válido (coerção);
Erro de tipo
◦ A li ã d um operador a um operando de tipo
Aplicação de d d d i
impróprio;
Pode
P d ser dinâmica ou estática.
di â i táti
22. 6.
6 Tipificação Forte
Definição mais simples:
◦ Cada nome de um programa escrito na linguagem
tem um único tipo associado a ela;
FORTRAN não é fortemente tipificado;
Pascal, Ada e Java são quase fortemente
P l Ad J ã f
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;
23. 7.
7 Compatibilidade de Tipos
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;
◦ Compatibilidade de estrutura:
Variáveis em que seus tipos possuem estruturas idênticas;
type indextype = 1..100; type celsius = real;
var fahrenheit = real;
cont: integer;
indice: indextype; tipos compatíveis
pela estrutura
cont e indice não
são compatíveis
24. 7.
7 Compatibilidade de Tipos
Em Pascal:
type tipo1 e tipo2
tipo1 = array [1..10] of integer; (incompatíveis)
tipo2 = array [1..10] of integer;
tipo3 = tipo2; tipo2 e tipo3
(compatíveis)
C : array (1..10) of INTEGER; Em Ada:
D : array (1..10) of INTEGER; CeD
(incompatíveis)
type LIST_10 is array (1..10) of INTEGER; CeD
C, D : LIST 10;
LIST_10; (compatíveis)
25. 8.
8 Escopo
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
são as visíveis dentro deste, mas não são
declaradas lá
lá.
26. 8.1 Escopo estático
81
Método para vincular nomes a variáveis não-locais
Para conectar uma referência a uma variável, o
compilador precisa encontrar a declaração
Processo de busca:
◦ Caso a declaração não for encontrada localmente, passa-se a
passa se
buscar em escopos mais amplos
O pai-estático (static parent) é o subprograma no qual
encontra-se a declaração
Os ancestrais estáticos são todos os subprogramas
até se chegar a d l
é h declaração
ã
27. 8.1 Escopo estático
81
p ocedu e b g;
procedure big;
var x: integer;
procedure sub1;
begin { sub1 } A variável x em sub1 é
...x... declarada
end; { sub1 } no procedimento big
p g
procedure sub2;
var x: integer;
begin { sub2 }
...
end;
begin { big }
...
end; { big }
28. 8.1 Escopo estático
81
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 }
begin
b i { main } i
...
end; { main }
C++ e Ada permitem acesso a essas variáveis escondidas
◦ Em Ada: unit.name
◦ E C++: class_name::name
Em C l
29. 8.2 Blocos
82
Um método para criar novos escopos estáticos no
meio do código executável – introduzido no ALGOL 60
Permite que uma seção de código tenha suas próprias
variáveis locais cujo escopo é minimizado
Essas variáveis são tipicamente dinâmicas na pilha
p p
◦ Alocada quando a seção é iniciada e desalocada quando ela é
finalizada
...
Exemplo em Ada declare TEMP: integer;
begin
TEMP := First
First := Second
Second := TEMP
end
...
31. 8.3 Avaliação do Escopo Estático
83
main
A B
C D
E
Assuma que MAIN chama A e B
Um grafo com chamadas potenciais A chama C e D
a procedimento no sistema
procedimento, sistema. B chama A e E
main
A B
Um grafo com as chamadas
g
desejáveis do programa exemplo. C D E
32. 8.3 Avaliação do Escopo Estático
83
Suponha que a especificação é alterada e E deve
acessar algum variável em D
Soluções:
S l õ
◦ Colocar E em D (porém, E não poderá acessar o
escopo de B)
d
◦ Mover as variáveis de D, que são necessárias em E,
para MAIN (isso permite o acesso por todos os
procedimentos)
De maneira geral: escopo estático encoraja o
uso de variáveis globais
33. 8.4 Escopo Dinâmico
84
Baseia-se
Baseia se na seqüência de chamada de
subprogramas, não em suas relações espaciais
(temporal versus espacial)
Desta forma o escopo pode ser determinado
apenas em tempo de execução
Quando a procura por declarações locais falha, as
declarações do pai-dinâmico (procedimento de
pai dinâmico
chamada) são pesquisadas, e assim sucessivamente
Caso nenhuma declaração seja encontrada em
qualquer ancestral dinâmico, haverá um erro em
tempo de execução
34. 8.4 Escopo Dinâmico
84
BIG chama SUB2
procedure big; SUB2 chama SUB1
var x: integer;
g SUB1 usa x
procedure sub1;
begin { sub1 }
...x...
end; { sub1 }
procedure sub2;
var x: integer;
begin { sub2 } Nesse caso, SUB1 usa o x
N
... declarado em SUB2
end;
begin big
b i { bi }
...
end; { big }
35. 8.5 Avaliação do Escopo Dinâmico
85
Vantagem
◦ Conveniência
Desvantagem
◦ Pouca 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
36. 8.6 Escopo e Tempo de Vida
86
Escopo e Tempo de Vida, algumas vezes, parecem estar
Vida vezes
relacionados, mas são conceitos diferentes
void printheader(){
...
} /* fim de printheader */
void compute() {
int sum;
...
printheader();
} /* fim de compute */
f d
O escopo da variável sum é completamente contido pela
função
f ã compute.
Porém, o tempo de vida de sum estende-se ao longo do
tempo durante o qual printheader é executado
37. 8.7 Ambientes de Referenciamento
87
O ambiente de referenciamento de uma
instrução é o conjunto de todos os nome visíveis
na instrução
Em uma linguagem com escopo
◦ O ambiente de referenciamento é formado pelas variáveis
locais mais todas as variáveis de seus escopos ancestrais
visíveis
Um b
U subprograma é ativo se sua execução tiver
i ã i
começado, mas ainda não tiver terminado
Em
E um li
linguagem com escopo di â i
dinâmico
◦ O ambiente de referenciamento é formado pelas variáveis
locais,
locais mais as variáveis de todos os subprogramas ativos
38. 8.8 Constantes Nomeadas
88
Uma constante nomeada é uma variável
vinculada a um valor somente no momento em
que ela é vinculada a um armazenamento
◦ Seu valor não pode ser mudado por uma instrução de
atribuição
Exemplo
◦ uso da constante pi ao i é d valor 3,14159
d i invés do l 3 14159
Vantagem
◦ Legibilidade
◦ Confiabilidade
39. 8.9 Inicialização de Variáveis
89
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
variáveis,
durante a execução através de instruções
de
d atribuição
b ã
40. 9.
9 Revisão
Nomes
◦ 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
programa
Tipificação forte é conceito de exigir que todos os
erros de tipo sejam detectado