A região de código onde a variável é visível
Onde ela pode ser referenciada, utilizada
\pause Correlaciona-se com conjunto de vinculações ≡ Ambiente
- Várias variáveis com o mesmo nome, em ambientes diferentes
\pause Regras de escopo de uma linguagem
- Determinam qual vinculação de nome à variável utilizar
\pause Tipos
- Estático: vínculos pela organização do programa
tempo de compilação - \pause Dinâmico: vínculos pela sequência de ativação
tempo de execução
Determinado pelos blocos de um programa, podendo ser
- Um subprograma
int funcao (void){ int events; }
- Um trecho de código delimitado por marcadores
{ int events; }
- Uma classe (em linguagens orientadas a objetos)
@interface PajeSimulator { int events; } @end
Três tipos de blocos
- Monolíticos, Não Aninhados, Aninhados
Existe somente um bloco
Visibilidade compreende todo o programa
Vantagem
- Fácil de implementar
Desvantagens
- Não aplicável em programas grandes
- Dificulta o trabalho colaborativo
Exemplos: Basic e Cobol (primeiras versões)
Nomes locais versus globais
Visibilidade é local ao bloco
Caso um vínculo não seja encontrado localmente
- Vínculo se torna global
Exemplo: Fortran
Blocos podem ser aninhados dentro de outros
Localização de vínculos recursiva, do mais local para o mais global
Exemplo: Algol e Algol-likes (C, …)
\pause Característica: variáveis podem se tornar inacessíveis
int main (int argc, char **argv){
int i, x = 10;
for (i = 0; i < 100; i++){
float x = 3.1415;
printf ("x = %f\n", x*x);
}
}
Vinculações determinadas pela sequência de chamadas
\pause Depende do fluxo de controle
- Procura localmente, então procura recursivamente nos subprogramas chamadores, até encontrar
- Se não encontrar, erro de execução
\pause Exemplo \small
void Big(){
int x;
void Sub1 (){
float x;
}
void Sub2 (){
x = 3;
}
}
\pause Linguagens: Logo, Emacs LISP – Perl e Common Lisp
Indique o valor impresso considerando
- Escopo estático
- Escopo dinâmico
Tempo de Vida de uma variável
- Período de vínculo com uma posição de memória
Escopo de uma variável
- A região de código onde a variável é visível
\pause Muitas vezes é a mesma coisa
\pause Mas existe uma série de casos onde diferem
int conta ()
{
static int meu_contador = 0;
meu_contador += 1;
return meu_contador;
}