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

Conteúdo apagado Conteúdo adicionado
Linha 13:
== História ==
 
O escopo léxico foi utilizado pela [[linguagem de programação Algol|ALGOL]] e foi seguida pela maioria das outras linguagens de programação, desde então. O escopo estático (ou léxico) também foi introduzida em LISP 1.5 (Através do dispositivo de [[Funarg]] (Functional argument) desenvolvido por [[Steve Russell]], trabalhando com [[John McCarthy]]). O interpretador Lisp original (1960) e os primeiros [[Lisp (linguagem de programação)|Lisps]] usavam escopo dinâmico, mas os descendentes das linguagens de escopo dinâmico muitas vezes adotaram o escopo estático; A linguagem [[Common Lisp]] tem tanto escopo estático quanto dinâmico, enquanto [[Scheme]] usa exclusivamente escopo estático. [[Perl]] é uma outra linguagem com escopo dinâmico, que acrescentou escopo estático mais tarde. Linguagens como o [[Pascal (linguagem de programação)|Pascal]] e [[C (linguagem de programação)|C]] sempre tiveram escopo léxico, uma vez que ambas são influenciadas pelas idéias surgudassurgidas com a [[ALGOL 60]]<ref name="sebesta">{{Citar livro|nome=Robert W.|sobrenome=Sebesta|título=Concepts of Programming Languages|subtítulo=|idioma=inglês|edição=7ª|local=Boston|editora=Addison Wesley|ano=2006|páginas=228-239|volumes=|volume=|id=ISBN 0-321-33025-0}}</ref> (embora C não não inclua funcões aninhadas lexicamente).
 
== Exemplo ==
Linha 39:
 
== 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" /> 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.
Com escopo léxico, um nome sempre se refere ao seu (mais ou menos) local ambiente léxico.
 
<!--
 
With lexical scope, a name always refers to its (more or less) local lexical environment. This is a property of the program text and is made independent of the runtime [[call stack]] by the language implementation. Because this matching only requires analysis of the static program text, this type of scoping is also called static scoping. Lexical scoping is standard in all [[ALGOL]]-based languages such as [[Pascal (programming language)|Pascal]], [[Ada]] and [[C (programming language)|C]], as well as in modern functional languages such as [[ML programming language|ML]] and [[Haskell (programming language)|Haskell]], because it allows the programmer to reason about values, parameters, and object references (i.e. variables, constants, functions, etc.) as simple name substitutions. This makes it much easier to make modular code and reason about it, since the local naming structure can be understood in isolation. In contrast, dynamic scope forces the programmer to anticipate all possible dynamic contexts in which the module's code may be invoked.
=== Lexical scoping ===
With lexical scope, a name always refers to its (more or less) local lexical environment. This is a property of the program text and is made independent of the runtime [[call stack]] by the language implementation. Because this matching only requires analysis of the static program text, this type of scoping is also called static scoping. Lexical scoping is standard in all [[ALGOL]]-based languages such as [[Pascal (programming language)|Pascal]], [[Ada]] and [[C (programming language)|C]], as well as in modern functional languages such as [[ML programming language|ML]] and [[Haskell (programming language)|Haskell]], because it allows the programmer to reason about values, parameters, and object references (i.e. variables, constants, functions, etc.) as simple name substitutions. This makes it much easier to make modular code and reason about it, since the local naming structure can be understood in isolation. In contrast, dynamic scope forces the programmer to anticipate all possible dynamic contexts in which the module's code may be invoked.
 
For example, consider the following program fragment in Pascal: