notas-de-aula- Schneider
29 pág.

notas-de-aula- Schneider

Disciplina:Linguagens de Programação I260 materiais733 seguidores
Pré-visualização11 páginas
ou
explícita, como ocorre por exemplo, pelo uso de ponteiros.

Para reduzir os problemas da sobreposição de nomes, algumas linguagens usam “espaços de
nomes” (namespaces em C++, PHP e Python; packages em Perl).

Para uma instrução em particular, um nome deve estar vinculado à uma única entidade. Para lidar
com isso, as linguagens de programação definem regras que levam ao conceito de escopo.

2.2.2 Escopo
O escopo de uma variável é o trecho de código no qual seu nome pode ser usado, ou melhor, existe
um nome vinculado à ela.

Nos idos de 1960 era muito comum que qualquer instrução de um programa pudesse fazer uso de
qualquer variável do programa. Essa é uma visão bem próxima ao conceito de variável do ponto de

prof. Bruno Schneider 6

Notas de Aula de GCC105 - BCC e BSI - UFLA

vista do hardware: os registradores disponíveis a qualquer hora. Entretanto, isso mostrou-se um
problema, já que as variáveis mudavam de valor e ficava difícil entender o motivo.

As linguagens passaram então a fornecer formas de declarar variáveis ao longo do programa, de
maneira que seu nomes seriam válidos somente em algumas instruções. Surge então o problema da
declaração de variáveis diferentes com o mesmo nome.

Para que um nome esteja vinculado à uma única entidade (variável ou subprograma), numa dada
instrução, é comum que as linguagens de programação determinem que uma vinculação de um
nome à uma entidade, invalida as vinculações anteriores para uma determinada parte do programa.
Neste caso, dizemos que uma vinculação oculta a outra, num sistema de controle que lembra uma
pilha. Isto leva ao conceito informal de que "o nome que vale é o da declaração mais interna". O
problema com essa afirmação é que o conceito de "interno" é bastante flexível. Ainda assim, nem
sempre uma vinculação de nome oculta as vinculações anteriores. Dependendo do conceito de
"interno" na linguagem de programação, a nova vinculação pode simplesmente ser um erro. Os
namespaces são uma forma de manter os vários nomes disponíveis.

Esse sistema nos leva ao conceito de variável local (aquela cujo nome foi declarado no próprio
bloco de código em questão) e variável externa (aquela cujo nome foi declarado fora do bloco em
questão). O conceito de local/externo é sempre relativo à algo. Uma variável pode ser local a um
bloco ao mesmo tempo que é externa a outro. O conceito de “variável global” deve ser evitado,
visto que é um conceito absoluto e frequentemente mal usado. Por exemplo: variáveis cujo escopo
se estende por um arquivo inteiro são frequentemente chamadas de globais, quando na verdade
estão fora de escopo em outros arquivos do mesmo programa.

A alteração de uma variável externa é chamada de efeito colateral. Efeitos colaterais são perigosos e
devem ser evitados sempre que possível.

O conjunto de nomes que podem ser usados numa determinada instrução é chamado de ambiente de
referenciamento da instrução.

É desejável restringir tanto quanto possível o escopo das variáveis e procedimentos, para que não
haja múltiplos nomes disponíveis à um bloco de código sem necessidade. Esse conceito é
frequentemente chamado de diretriz do escopo mínimo.

Para minimizar o escopo das variáveis, o mínimo que um programador deve fazer é evitar o uso de
variáveis externas. Algumas linguagens (como C++) se destacam ao oferecer recursos próprios para
ajudar nessa minimização:

• a possibilidade de declarar variáveis em qualquer posição do código, atrasando o início de
seu escopo e

• a possibilidade de usar instruções compostas (ver 2.4.1) em qualquer lugar do código,
adiantando o final do escopo para algumas variáveis.

Muito da filosofia por trás de uma linguagem de programação se reflete na forma como ela gerencia
os nomes das variáveis, operadores e subprogramas. As linguagens variam muito nesse aspecto,
passando de casos extremamente simples como C++ a casos extremamente complicados como Perl.

2.2.2.1 Escopo Estático
No escopo estático, é a estrutura textual do programa que determina o escopo (determina o conceito
de "interno"). As variáveis declaradas num bloco podem ser usadas em seus sub-blocos desde que
não haja uma nova vinculação daquele mesmo nome.

prof. Bruno Schneider 7

Notas de Aula de GCC105 - BCC e BSI - UFLA

2.2.2.2 Escopo Dinâmico
No escopo dinâmico, é a ativação dos subprogramas que determina a escopo. As variáveis do
subprograma chamador são visíveis na execução do subprograma chamado, desde que não haja uma
nova vinculação daquele mesmo nome.

O escopo dinâmico torna programas menos legíveis pois o ambiente de referenciamento muda em
tempo de execução, mais lentos pois exige que a resolução dos nomes seja feita em tempo de
execução e impossibilita a verificação de tipo, em tempo de compilação, para variáveis não locais.

Por outro lado, pode ser usado como forma de passagem flexível de informações para
subprogramas. O custo dessa flexibilidade é alto em função das desvantagens já mencionadas e
também porque funciona como um incentivo ao uso de variáveis externas em oposição aos
parâmetros.

A implementação de um compilador para uma linguagem com escopo dinâmico costuma ser mais
simples do que a implementação para escopo estático. As primeiras linguagens usavam escopo
dinâmico, até que surgiu ALGOL que usava escopo estático. Desde então, quase todas as linguagens
desenvolvidas usam escopo estático, e as que já existiam (como LISP) foram modificadas ou
substituídas por dialetos em que se usava escopo estático. Das linguagens modernas e populares,
podemos citar LOGO como um exemplo de linguagem com escopo dinâmico e Perl, que começou
usando escopo dinâmico, mas a partir da versão 5 permite que o programador escolha o tipo de
escopo para cada variável, efetivamente misturando as duas formas numa mesma linguagem.

2.2.3 Vinculação de tipos
Pode ser explícita ou implícita. Pode ser estática ou dinâmica. A vinculação dinâmica de tipos
implica em vinculação implícita, já que não faz sentido declarar tipos que serão vinculados somente
durante uma operação de atribuição.

Com a vinculação dinâmica de tipos, é comum que o tipo de uma variável possa ser alterado a
qualquer hora, em tempo de execução, o que torna inviável a detecção de erros de tipo em tempo de
compilação. Esse problema pode ser amenizado exigindo caracteres especiais que indicam tipos
(como em Perl). Algumas linguagens tem vinculação estática de tipos, mas fazem coerção
automática (em muitos casos), gerando problemas parecidos de detecção de erros (ex.: C).

A vinculação dinâmica facilita a criação do compilador, que não precisa conhecer o tipo de uma
variável durante o seu uso, ela é mais comum nas linguagens interpretadas, nas linguagens antigas e
nas linguagens para web. Ela tem a vantagem de proporcionar um tipo de polimorfismo.

Compiladores simples ainda são importantes em situações como programas para web.

A vinculação estática proporciona maior velocidade de execução por dois motivos: (a) não é preciso
gerar código para sistema de tipos, pois o compilador já verificou a validade de todas as operações e
já determinou quais são as operações usadas (ver sobrecarga de operadores) e (b) as informações
sobre os tipos permitem ao compilador fazer otimizações no código gerado.

2.2.3.1 Inferência de Tipo
A partir de tipos de parâmetros e/ou operadores, é possível inferir tipos automaticamente,
permitindo a vinculação estática sem a necessidade de declarações.

Linguagens com inferência de tipos combinam a vinculação estática de tipos com a implícita,
proporcionando a checagem de erros de tipo em tempo de compilação com a facilidade de não

prof. Bruno Schneider 8

Notas de Aula de GCC105 - BCC e BSI - UFLA

exigir a declaração de tipos.

Por outro lado, declarações de tipo são uma forma de documentação, usá-las mesmo quando não
são necessárias pode melhorar a legibilidade de um programa.