Escopo (computação): diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
Linha 83:
Com escopo dinâmico, cada identificador tem uma [[Pilha (informática)|pilha]] global de [[vinculação (computação)|vinculações]]. Introduzindo uma variável local com o nome de ''x'' empilha uma vinculação na pilha global ''x'' (que pode estar vazia), que estará desempilhada quando o fluxo de controle deixar o escopo. Avaliar ''x'' em qualquer contexto sempre produz a vinculação mais ao topo. Em outras palavras, um identificador global refere-se ao identificador associado com o ambiente mais recente. Note-se que isso não pode ser feito em tempo de compilação, porque a pilha de vinculação só existe em tempo de execução, razão pela qual este tipo de delimitação é chamado de ''escopo dinâmico''.
 
Geralmente, alguns [[Bloco (computação)|blocos]] são definidos para criar vinculações cujo tempo de vida útil é o tempo de execução do bloco; isso adiciona algumas funcionalidades do escopo estático para o processo de escopo dinâmico. No entanto, como uma seção de código pode ser chamada de diferentes locais e situações, pode ser difícil determinar desde o início quais vinculações serão aplicadas quando uma variável for utilizada (ou se a sua existência naquele contexto). Isto pode ser benéfico. a aplicação do princípio do menor conhecimento sugere que o código evita, dependendo de razões para (ou circunstâncias) o valor de uma variável, simplesmente usando o valor de acordo com a sua definição. Esta interpretação restritiva de dados compartilhados pode fornecer um sistema muito flexível para adaptar o comportamento de uma função para o estado atual (ou política) do sistema. No entanto, este benefício depende da documentação cuidadosa de todas as variáveis usadas dessa maneira, bem como na prevenção cuidadosa das suposições sobre o comportamento de uma variável, e não prevê qualquer mecanismo para detectar interferências entre as diferentes partes de um programa. Como tal, o escopo dinâmico pode ser perigoso e poucas linguagens modernas o usam. Algumas linguagens, como o [[Perl]] e [[Common Lisp]], permitem que o programador escolha o escopo estático ou dinâmico, quando da definição ou redefinição de uma variável. [[John McCarthy]] projetou a linguagem [[Lisp]] com escopo dinâmico objetivando compartilhamento de código com variáveis livres.<ref name="appleby">{{Citar livro|autor=APPLEBY, Doris; VANDEKOPPLE, Julius J|título=Programming Languages|subtítulo=Paradigm and Practice|idioma=inglês|edição=2ª|local=New York|editora=McGraw-Hill|ano=1997|páginas=43|volumes=|volume=|idisbn=ISBN 0-07-005315-4}}</ref> [[APL]],<ref name="appleby" /> [[Logo]] e [[Emacs lisp]] são outros exemplos de linguagens que usam escopo dinâmico.
 
O escopo dinâmico é bastante fácil de implementar. Para encontrar o valor de um identificador, o programa poderia atravessar a pilha de execução, através da cadeia dinâmica, verificando cada [[Pilha de chamada#Estrutura|registro de ativação]] buscando um valor para o identificador. Na prática, isto torna-se mais eficiente através da utilização de uma [[lista de associação]], que é uma pilha de pares nome/valor. Pares são empilhados sempre que as declarações são feitas, e desempilhados no momento em que as variáveis deixam o escopo.<ref name="scott2">{{Citar livro|autor=SCOTT, Michael L|título=Programming Language Pragmatics|subtítulo=|idioma=inglês|edição=|local=San Francisco|editora=Morgam Kaufmann/Academic Press|ano=2000|páginas=132-137|volumes=|volume=|idisbn=ISBN 1-55860-442-1}}</ref> Uma estratégia alternativa, que é consideravelmente mais rápida, é fazer uso de uma ''tabela central de referência'', que associa cada nome com seu significado atual. Isso evita uma busca linear durante a execução para encontrar um nome específico, embora a manutenção desta tabela seja mais complexa.<ref name="scott2" /> Note-se que ambas as estratégias assumem um ordenamento de vinculações em estrutura de pilha (LIFO) para qualquer variável; na prática, todas as vinculações são ordenadas desta forma.
 
=== Exemplos ===