Skip to content

Latest commit

 

History

History
159 lines (130 loc) · 3.44 KB

escopo.org

File metadata and controls

159 lines (130 loc) · 3.44 KB

Escopo Estático e Dinâmico

1 Escopo

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

2 Estático

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

3 Bloco Monolítico (escopo único)

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)

4 Blocos Não Aninhados

Nomes locais versus globais

Visibilidade é local ao bloco

Caso um vínculo não seja encontrado localmente

  • Vínculo se torna global

Exemplo: Fortran

5 Blocos Aninhados

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);
  }
}

6 Dinâmico

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

7 Exercício

Indique o valor impresso considerando

  • Escopo estático
  • Escopo dinâmico

./escopo-exercicio-codigo.c

8 Escopo versus Tempo de Vida

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;
}