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

Conteúdo apagado Conteúdo adicionado
Linha 38:
Uma das razões fundamentais para o uso de escopos é manter as variáveis em diferentes partes do programa distintas umas das outras. Dado que há somente um pequeno número de nomes curtos de variáveis e que os programadores compartilham hábitos de nomeação de variáveis (por exemplo <code>i</code> para um índice de vetor), em qualquer programa de tamanho moderado o mesmo nome de variável será utilizado em vários escopos diferentes. A questão de como combinar as várias ocorrências de variáveis aos [[Vinculação de nomes (computação)|nomes]] adequados é geralmente respondida de duas maneiras: ''escopo léxico'' e ''escopo dinâmico''.
 
=== Escopo léxico ===
O escopo léxico ou estático foi introduzido pela linguagem [[ALGOL 60]]. O escopo é assim denominado, porque pode ser determinado estaticamente, ou seja, antes da execução.<ref name="sebesta" /> O escopo léxico define o escopo em termos da estrutura léxica do programa.<ref name="guezzi">{{Citar livro|autor=GUEZZI, Carlo; JAZAYERI, Mehdi|título=Programming Languages Concepts|subtítulo=|idioma=inglês|edição=3ª|local=New York|editora=John Wiley & Sons|ano=1998|páginas=52|volumes=|volume=|id=ISBN 0-471-10426-4}}</ref> Com escopo léxico, um nome sempre se refere ao seu ambiente léxico (mais ou menos) local. Esta é uma propriedade do texto do programa e é feita independente da pilha de chamadas em tempo de execução pela implementação da linguagem. Ou seja, O escopo léxico de uma declaração é a parte do texto do programa, onde a utilização do identificador é uma referência a essa declaração particular do identificador.<ref name="pratt">{{Citar livro|autor=PRATT, Terrence W.; ZELKOWITZ, Marvin V|título=Programming Languages|subtítulo=Design and Implementation|idioma=inglês|edição=4ª|local=Upper Saddle River, New Jersey|editora=Prentice hall|ano=2001|páginas=364|volumes=|volume=|id=ISBN 0-13-027678-2}}</ref> Pelo fato de esta correspondência só exigir a análise do texto do programa estático, este tipo de delimitação de escopo é também chamado de escopo estático.
 
Linha 88:
 
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=|id=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.
 
 
== Escopo fechado versus escopo aberto ==
Módulos cujos nomes devam ser explicitamente importados são ditos serem escopos fechados ao passo que escopos que não requerem declarações expícitas de importação são ditos escopos abertos.<ref name="scott">{{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=125|volumes=|volume=|id=ISBN 1-55860-442-1}}</ref> Módulos são fechados nas linguagens [[Modula 1]], [[Modula 2]], [[Modula 3]] e [[Euclid]] e abertos em [[Ada (linguagem de programação)|ADA]].<ref name="scott" />
 
<!--