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

Conteúdo apagado Conteúdo adicionado
m
Linha 41:
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.
 
O escopo estático é padrão em todas as linguagens baseadas na [[ALGOL]], tais como [[Pascal (linguagem de programação)|Pascal]], [[Ada (linguagem de programação)|ADA]] e [[C (linguagem de programação)|C]], bem como em linguagens funcionais modernas, tais como [[ML (linguagem de programação)|ML]] e [[Haskell (linguagem de programação)|Haskell]], pois permite que o programador possa elaborar raciocínios sobre valores, parâmetros e referências a objetos (ou seja, variáveis, constantes, funções etc), como substituições de nome simples. Isso torna muito mais fácil fazer o código modular e se raciocinar sobre ele, já que a estrutura local de nomeação pode ser entendida isoladamente. Em contraste, o escopo dinâmico força o programador a antecipar todos os possíveis contextos dinâmicos nos quais o código do módulo pode ser invocado.
<!--
 
Por exemplo, considere o seguinte fragmento de programa em Pascal:
...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:
 
<source lang="pascal">
Linha 59 ⟶ 57:
var M:real;
begin
(*scopeescopo A+B+C*)
end;
 
procedure D;
var K:integer;
begin
(*escopo A+B+D*)
end;
 
begin
(*scopeescopo A+B*)
end;
begin
(*scopeescopo A*)
end.
</source>
 
 
<!--
 
 
The variable I is visible at all points, because it is never hidden by another variable of the same name. The char variable K is visible only in the main program because it is hidden by the real variable K visible in procedure B and C only. Variable L is also visible only in procedure B and C but it does not hide any other variable. Variable M is only visible in procedure C and therefore not accessible either from procedure B or the main program. Also, procedure C is visible only in procedure B and can therefore not be called from the main program.