resumovinculacao-aulalp110a-120404204243-phpapp02
7 pág.

resumovinculacao-aulalp110a-120404204243-phpapp02

Disciplina:Linguagens de Programação I252 materiais732 seguidores
Pré-visualização2 páginas
flexível para subprogramas,
incentivando portanto o uso de variáveis externas. É um custo
alto, pois o escopo dinâmico prejudica a legibilidade do código,
já que o ambiente de referenciamento muda - o que faz o
escopo estático mais interessante - , torna os programas mais
lentos, pois a resolução dos nomes ocorre em tempo de
execução, e além disso impossibilita verificação de tipos das
variáveis externas.

A implementação do escopo dinâmico é mais fácil que do
escopo estático, e por isso, era comum nas linguagens mais
antigas. Mas a partir do ALGOL, as linguagens aderiram ao

escopo estático. Perl a partir de sua vs. 5 permite que o
programador escolha com qual dos 2 deseja trabalhar.

 Vinculação de tipo

Pode ser estática – sempre desde tipo – ou dinâmica – decidida
em tempo de execução. Assim como explícita – define o tipo – ou
implícita – não define o tipo. Geralmente explicita é estática e
dinâmica é implícita.

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, fazendo que os erros sejam encontrados em tempo de
execução. Esse problema pode ser amenizado exigindo caracteres
especiais – marcadores – que indicam tipos, como em Perl, no qual
temos $a para escalar(tipo primitivo), @a aglomerado(vetor/lista), #a
vetor associativo(hash), &a função. Isso exige atenção do
programador, pois se os marcadores forem diferentes e os nomes
iguais, isto irá diminuir a capacidade de detecção de erros.

Algumas linguagens tem vinculação estática de tipos, mas
fazem conversão automática (em muitos casos), gerando problemas
parecidos de detecção de erros (ex.: C). Nesse caso, se é esperado b,
e passa tipo a, ele converte a no formato de b, dando mais liberdade
ao programador mas prejudicando a detecção.

 (?)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. Tais compiladores são eficientes para
celulares. Enquanto os compiladores com vinculação estática são
mais eficientes mais são mais pesados, úteis para programas 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.

Há uma variação entre estática e implícita, no qual mesmo
tendo vinculação estática não é necessário dizer qual é o tipo pois o

compilador o irá deduzir. Isto é conhecido com inferência de tipos,
na onde a dedução acontece em tempo de compilação. O que
possibilita checagem do erro de tipo com a facilidade de não exigir
declaração. Mas essa declaração, as vezes pode servir como
documentação para melhorar a legibilidade do programa. Essa
inferência nem sempre funciona, o que faz com que as linguagens
com esse recurso ofereçam a possibilidade de declaração, para que o
programador resolva esses casos especiais (Exe.: Python?).

Obs : Quanto a parte de verificação de erros e compatibilidade
de tipos as notas de aula são claras.

 Vinculação de armazenamento

O tempo de vida de uma variável é o tempo durante o qual ela
está vinculada à uma célula de armazenamento (um endereço).

Em função do tempo de vida, uma variável pode ser classificada
como:

 estática: a vinculação existe durante toda a execução do•
programa e não muda; tem endereçamento direto (mais rápido); não
existe overhead para alocar e desalocar; permitem criar variáveis
“sensíveis à história”; podem ser um desperdício de espaço se não
forem usadas ao longo de toda a execução; podem conflitar com a
recursividade.

 stack-dinâmica: a vinculação é criada quando a execução•
atinge a declaração da variável e deixa de existir quando o bloco de
código termina sua execução; as vinculação de tipo são estáticas;
funciona como uma forma de compartilhar memória entre os vários
subprogramas. - pilha

 heap-dinâmica explícita: são criadas (sem nome) por•
operadores e funções de alocação de memória e são acessadas por
meio de referências; tem vinculação estática de tipo;apresentam o
overhead do acesso indireto. Ex.: objetos em Java.

 heap-dinâmica implícita: são vinculadas ao armazenamento e•
ao tipo durante uma atribuição; são muito flexíveis; reduzem a
capacidade do compilador de encontrar erros.

O gerenciamento do heap pode ser feito por algoritmos de
garbage collection.

O tempo de vida de uma variável geralmente é tempo de
execução de um bloco. Várias linguagens oferecem formas de

vinculação estática ao armazenamento, o que permite a criação de
um tipo de memória em subprogramas.

Nem sempre uma variável vinculada a um armazenamento é
acessível, o que é desejável, seguindo o princípio do escopo mínimo.

Vinculação dinâmica ao armazenamento é uma propriedade que
conflita com instruções tipo “goto”. (?)

 - Inicialização

Inicialização é a vinculação ao valor no momento da vinculação
ao armazenamento.Recurso que não é oferecido por toda linguagem.
(ex.: Pascal)