quinta-feira, 26 de março de 2009

==================================

ESCOPO E TEMPO DE VIDA

(Postado por: José Mário Ramos e Jussara Pereira dos Santos)

VARIÁVEL

Uma Variável é uma abstração de uma ou mais células de memória de um computador. Uma variável pode ser caracterizada através dos seguintes seis atributos:
Nome;
Endereço;
Valor;
Tipo;
Tempo de vida;
Escopo.

VINCULAÇÃO DE ARMAZENAMENTO E TEMPO DE VIDA
Alocação: marcar\tomar uma célula de memória de um conjunto de memória disponível.
Desalocação: devolver a célula ao conjunto de memória disponível.
O tempo de vida de uma variável se inicia quando ela é vinculada a uma célula específica e encerra-se quando ela é desvinculada

Categorias de variáveis baseado no tempo de vida

Variáveis Estáticas
Variáveis Dinâmicas na Pilha
Variáveis Dinâmicas no Monte Explícitas
Variáveis Dinâmicas no Monte Implícitas
Pilha (Stack) e Monte (Heap)

VARIÁVEIS ESTÁTICAS

Vinculadas a células de memória antes que a execução do programa se inicie. Exemplo: todas as variáveis do FORTRAN 77 e as variáveis static do C
Vantagens: eficiência (endereçamento direto), suporta subprogramas sensíveis à história
Desvantagem: pouca flexibilidade (não permitem recursão)

VARIÁVEIS DINÂMICAS NA PILHA

São aquelas cujas vinculações de armazenamento criam-se a partir da elaboração de suas instruções de declaração, mas cujos tipos são estaticamente vinculados (Elaboração: processo de alocação e de vinculação de armazenamento). Ocorre em tempo de execução
Exemplo: Variáveis locais em subprogramas C e métodos em Java
Vantagem: permite recursão, compartilhamento de espaço de memória
Desvantagens: sobretaxa de alocação e de desalocação em tempo de execução, subprogramas não podem ser sensíveis à história

VARIÁVEIS DINÂMICAS NO MONTE EXPLÍCITAS

As variáveis dinâmicas no monte explícitas são células de memória sem nome (abstratas) alocadas e desalocadas por instruções explícitas em tempo de
execução, especificadas pelo programador

Essas variáveis alocadas no monte e desalocadas para o monte só podem ser referenciadas por meio de variáveis de ponteiro ou de referência

O monte é um conjunto de células de armazenamento desorganizado, devido à imprevisibilidade de seu uso
Exemplo: Objetos dinâmicos em C++ (via new e delete). Todos os objetos em Java
Vantagem: convenientes para estruturas dinâmicas: listas encadeadas e árvores.
Desvantagens: dificuldade de usar ponteiros e referência corretamente, custo das referências para as alocações e para as desalocações

VARIÁVEIS DINÂMICAS NO MONTE IMPLICITAS

Alocação e desalocação causadas por instruções de atribuição
– Todas as variáveis em APL
– Todas as strings e vetores em Perl e em JavaScript
Vantagem: flexibilidade
Desvantagens: ineficiente, pois todos os atributos são dinâmicos, perda de grande parte da capacidade de detectar erros

ESCOPO

O escopo (scope) de uma variável representa a área do programa onde esta é visível. Uma variável é visível em uma instrução se puder ser referenciada nessa instrução. Ex. em C e C++(escopo definido por bloco):

void foo (int x) { // início do escopo de x
int y; // início do escopo de y
x = y = 0;
} // fim do escopo of x and y

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á.
As regras de escopo de uma L.P. determinam a forma como as referências e nomes estão associadas a variáveis.

Algumas regras de escopo:

1. Procurar variáveis localmente
2. Procurar em ordem crescente do escopo até encontrar uma declaração para o nome da variável.
Escopos aninhados: definição de escopos dentro de outros, formando uma seqüência de escopos com sucessores e intercessores.
A redefinição de uma variável com o mesmo nome (num escopo interior) de uma já existente num escopo exterior, permite "esconder" a definição exterior.
C++, Pascal, ADA, etc. permitem o acesso a estas variáveis escondidas em escopos exteriores.

O escopo de uma variável pode ser: Estático e Dinâmico.

ESCOPO ESTÁTICO

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 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 à declaração
Variáveis podem ser escondidas de uma unidade quando a mesma possui uma variável com o mesmo nome.


C++ e Ada permitem acesso a essas variáveis escondidas
Em Ada: unit.name
Em C++: class_name:name

BLOCOS
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– 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
...


AVALIAÇÃO DO ESCOPO ESTÁTICO


Suponha que a especificação é alterada e E deve acessar alguma variável em “D”.
Soluções:
– Colocar E em D (porém, E não poderá acessar o escopo de B).
– 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.

ESCOPO DINÂMICO

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 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.
Escopo dinâmico:


Exemplo :


BIG chama SUB2
SUB2 chama SUB1
SUB1 usa x
Nesse caso, SUB1 usa o x declarado em SUB2 procedure big;


var x: integer;
procedure sub1;
begin { sub1 }
...x...
end; { sub1 }
procedure sub2;
var x: integer;
begin { sub2 }
...
end;
begin { big }
...
end; { big }

AVALIAÇÃO DO ESCOPO DINÂMICO

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

ESCOPO E TEMPO DE VIDA

Escopo e Tempo de Vida, algumas vezes, parecem estar relacionados, mas são conceitos diferentes
void printheader(){
...
} /* fim de printheader */
void compute() {
int sum;
...
printheader();
} /* fim de compute */

O escopo da variável sum é completamente contido pela função compute Porém, o tempo de vida de sum estende-se ao longo do tempo durante o qual printheader é executado

AMBIENTES DE REFERENCIAMENTO

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 subprograma é ativo se sua execução tiver começado, mas ainda não tiver terminado.
Em um linguagem com escopo dinâmico – O ambiente de referenciamento é formado pelas variáveis locais, mais as variáveis de todos os subprogramas ativos.





REFERÊNCIAS BIBLIOGRÁFICAS

http://www-di.inf.puc-rio.br/~rangel/ - Instituto de Informática da pontifícia universidade católica do rio de janeiro
Centro de Informática da Universidade Federal de Pernambuco - http://www.cin.ufpe.br/
Estig - Escola Superior de Tecnologia e Gestão de Informática.
www.dca.fee.unicamp.br/~leandro/paradigmaslp/aulas/aula7plp1sem2008.pdf
http://www.netbeans.org/kb/docs/web/scopes_pt_br.html

6 comentários:

  1. Valeu!!!Estudei escopo aqui no blog e consegui fazer a questão com mais facilidade.

    ResponderExcluir
  2. Foi com o conteudo do blog (mais a explicação aos 5 min antes da prova para os amigos) que acertei a questão da prova. Parabens! O tema ficou muito bem esclarecido!

    ResponderExcluir
  3. cara esse trem é muito loco..q troço difícil velho..ms ficou bakana a postagem..s eu tivesse lido antes d fzer a 1ª prova tinha tirado total.rsrs...vlw..só q tem um trem q num entra na minha kbeça é esse negócio do escopo dinâmico..té agora num intendi...
    ^^

    ResponderExcluir
  4. Poxa, se eu tivesse lido essa postagens antes, tinha acertado completamente a questão que estava na prova !!!!!!!
    Conteúdo bacana demais....

    ResponderExcluir
  5. Gostaria de um exemplo das variáveis dinâmicas no monte explícitas.

    ResponderExcluir
  6. bacana tudo a ver com
    o que o fessô passou
    se naum deixasse tudo
    pra ultima hora.

    ResponderExcluir