Resumo vinculacao   aula lp1 10 a
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Resumo vinculacao aula lp1 10 a

on

  • 594 views

 

Statistics

Views

Total Views
594
Views on SlideShare
594
Embed Views
0

Actions

Likes
1
Downloads
15
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Resumo vinculacao aula lp1 10 a Document Transcript

  • 1. Vinculação As vinculações são as associações feitas para permitir que ocompilador tenha controle entre a abstração feita no código e aentidade manipulada pelo hardware, e são caracterizadas por 4atributos: nome (ligado a escopo), tipo, armazenamento (ligado aotempo de vida) e valor. Nem todos os atributos precisam existir –podemos ter, por exemplo, variáveis sem nome ou sem valor. Asvariáveis, que são exemplos de abstrações, e ajudam na legibilidadedo código. As vinculações podem ser estáticas(não mudam durante oprograma) ou dinâmicas(mudam durante o programa). Elas podemocorrer durante: - tempo de projeto da linguagem: aquele no qual decidecomo a linguagem vai ser. Algumas vinculações são definidas, porexemplo, o operador ‘ := ’ para vinculação de nome . - tempo de implementação da linguagem: trata-se dotempo de construção do compilador. Aqui se define por exemplo otamanho dos inteiros, mas não há exemplos de vinculação. - tempo de compilação: no qual se traduz o código fonteem código de máquina, e geralmente é feito em conjunto com otempo de ligação. - tempo de ligação: o código fonte é incrementado comcódigos da biblioteca, como para o writeln por exemplo. - tempo de carregamento: se tem a reserva de memória edefinição de endereços, isto é, Dados e instruções são copiados doarquivo (no disco rígido) para essa porção de memória (fica sobrandouma parte cujo uso é decidido durante a execução). Quando oprograma começar as ligações já estarão feitas - tempo de execução: instante em que o programacomeça a ser executado  Vinculação de nomes Como já tido, nem toda vinculação necessita de um nome,sendo comum que o programador ou o compilador façam isso. Asvariáveis podem ser criadas pelo programador, como os ponteiros(que não possuem nome), ou pelo próprio compilador, como quando
  • 2. ele cria uma variável temporária sem nome com o valor de umresultado para depois passa-lo a outra variável. Exemplo x = a + b -> temos uma variável sem nome com o tipo do resultado de (a+b),que receberá esse valor para que depois seja passado a x. Antigamente os nomes eram formados por apenas uma únicaletra. Agora as linguagens podem delimitar seu tamanho por 8, 16,255, etc. Esse tamanho pode ser definido tanto em tempo de projetoquanto em tempo de compilação. Quanto aos nomes também é importante lembrar que aslinguagens podem fazer distinção entre maiúsculas e minúsculas. Issoprejudica na hora de lembrar o nome da variável e também emquestão de legibilidade porque podemos ter nomes consideradosidênticos (como Rosa e rosa em C) e que representam coisasdiferentes. Mas quando a linguagem nos impõe este tipo de notação,nos proporciona colocarmos mais significado ao nome – somoslevados a isso. Por exemplo, junto com o nome, podemos colocar otipo da variável. Um exemplo de notação dessa forma é a notaçãocamelo. Alguns nomes são especiais numa linguagem de programação.Existem as palavras reservadas, cujo significado é o mesmo emqualquer contexto e as palavras-chave, cujo significado é especial emalgum contexto. As palavras reservadas limitam o programadorprincipalmente se ele programar na língua de origem linguagem,como o inglês. As palavras-chave variam seu sentido de acordo com osignificado. Exemplo: “real” em Fortran pode significar tanto um tipocomo uma variável qualquer dependendo de como é usado. Muitas vezes, palavras especiais são apenas “pré-definidas”,podendo ser redefinidas pelo programador. Neste caso, a linguagemprovavelmente exige uma biblioteca padrão que é incluídaautomaticamente no programa, na qual o nome é definido.(Exemplo:writeln). É também comum encontrarmos mesmo nome para entidadesdiferentes. Por exemplo, quando temos uma variável local em umsubprograma que representa um coisa, e , uma variável de mesmonome em outro subprograma que será usada para outracoisa(problema que será resolvido por questão de escopo – explicadoadiante). Assim também como é possível termos nomes diferentes parauma mesma entidades – conhecido como apelidos (aliases) - como
  • 3. no caso das uniões (exemplo da aula: valor e endereço são chamadosde valor). Nesse exemplo a criação é feita de forma implícita, mastambém podemos ter de forma explícita, como ocorre no caso dosponteiros. As aliases tem como desvantagem a legibilidade do código,porque é necessário que o programador se lembre a todo momentoque elas indicam o mesma célula de memória, e alterar uma, altera aoutra. Antigamente, as aliases eram justificadas porqueeconomizavam memória - pensando aqui em uniões – pois permitiamque uma mesma localização fosse usada para diferentes tipos dedados em diferentes tempos. Mas com a evolução dos computadores,e aumento de memória, tal justificativa se tornou infundada. - Escopo (notas de aula são claras) O escopo de uma variável é o trecho de código no qual seunome pode ser usado, ou melhor, existe um nome vinculado à ela. Para que um nome esteja vinculado à uma única entidade(variável ou subprograma), numa dada instrução, é comum que aslinguagens de programação determinem que uma vinculação de umnome à uma entidade, invalida as vinculações anteriores para umadeterminada parte do programa. Neste caso, dizemos que umavinculação oculta a outra, num sistema de controle que lembra umapilha. Isto leva ao conceito informal de que "o nome que vale é o dadeclaração mais interna". O problema com essa afirmação é que oconceito de "interno" é bastante flexível. Ainda assim, nem sempreuma 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 namespacessão uma forma de manter os vários nomes disponíveis. Esse sistema nos leva ao conceito de variável local (aquela cujonome foi declarado no próprio bloco de código em questão) e variávelexterna (aquela cujo nome foi declarado fora do bloco em questão). Oconceito de local/externo é sempre relativo à algo. Uma variável podeser local a um bloco ao mesmo tempo que é externa a outro. Oconceito de “variável global” deve ser evitado, visto que é umconceito absoluto e frequentemente mal usado. Por exemplo:variáveis cujo escopo se estende por um arquivo inteiro sãofrequentemente chamadas de globais, quando na verdade estão forade escopo em outros arquivos do mesmo programa.
  • 4. A alteração de uma variável externa é chamada de efeitocolateral. Efeitos colaterais são perigosos e devem ser evitadossempre que possível. O conjunto de nomes que podem ser usados numa determinadainstrução é chamado de ambiente de referenciamento da instrução. É desejável restringir tanto quanto possível o escopo dasvariáveis e procedimentos, para que não haja múltiplos nomesdisponíveis à um bloco de código sem necessidade. Esse conceito éfrequentemente chamado de diretriz do escopo mínimo. Conceito da localidade: o programa com mais variáveis locais émais legível que aquele em que as variáveis ficam todas espalhadas,e por isso e que algumas linguagens possuem recursos próprios paraauxiliar nesse quesito de diminuição do escopo. Escopo Estático A vinculação feita no inicio do programa permanece até o fim. 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. Escopo Dinâmico O escopo muda dependendo de onde se chama o subprograma. Ou seja, as variáveis disponíveis mudam de acordo com onde chamamos o subprograma. Isso permite programas mais fáceis de reusar, pois torna a passagem de informações 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
  • 5. 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 – decididaem tempo de execução. Assim como explícita – define o tipo – ouimplícita – não define o tipo. Geralmente explicita é estática edinâmica é implícita. Com a vinculação dinâmica de tipos, é comum que o tipo deuma variável possa ser alterado a qualquer hora, em tempo deexecução, o que torna inviável a detecção de erros de tipo em tempode compilação, fazendo que os erros sejam encontrados em tempo deexecução. Esse problema pode ser amenizado exigindo caracteresespeciais – marcadores – que indicam tipos, como em Perl, no qualtemos $a para escalar(tipo primitivo), @a aglomerado(vetor/lista), #avetor associativo(hash), &a função. Isso exige atenção doprogramador, pois se os marcadores forem diferentes e os nomesiguais, isto irá diminuir a capacidade de detecção de erros. Algumas linguagens tem vinculação estática de tipos, masfazem conversão automática (em muitos casos), gerando problemasparecidos 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 liberdadeao programador mas prejudicando a detecção. (?)A vinculação dinâmica facilita a criação do compilador, quenão precisa conhecer o tipo de uma variável durante o seu uso, ela émais comum nas linguagens interpretadas, nas linguagens antigas enas linguagens para web. Tais compiladores são eficientes paracelulares. Enquanto os compiladores com vinculação estática sãomais eficientes mais são mais pesados, úteis para programas web. (?)A vinculação estática proporciona maior velocidade deexecução por dois motivos: (a) não é preciso gerar código parasistema de tipos, pois o compilador já verificou a validade de todas asoperações e já determinou quais são as operações usadas (versobrecarga de operadores) e (b) as informações sobre os tipospermitem ao compilador fazer otimizações no código gerado. Há uma variação entre estática e implícita, no qual mesmotendo vinculação estática não é necessário dizer qual é o tipo pois o
  • 6. compilador o irá deduzir. Isto é conhecido com inferência de tipos,na onde a dedução acontece em tempo de compilação. O quepossibilita checagem do erro de tipo com a facilidade de não exigirdeclaração. Mas essa declaração, as vezes pode servir comodocumentação para melhorar a legibilidade do programa. Essainferência nem sempre funciona, o que faz com que as linguagenscom esse recurso ofereçam a possibilidade de declaração, para que oprogramador resolva esses casos especiais (Exe.: Python?). Obs : Quanto a parte de verificação de erros e compatibilidadede 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 elaestá vinculada à uma célula de armazenamento (um endereço). Em função do tempo de vida, uma variável pode ser classificadacomo: • estática: a vinculação existe durante toda a execução doprograma e não muda; tem endereçamento direto (mais rápido); nãoexiste overhead para alocar e desalocar; permitem criar variáveis“sensíveis à história”; podem ser um desperdício de espaço se nãoforem usadas ao longo de toda a execução; podem conflitar com arecursividade. • stack-dinâmica: a vinculação é criada quando a execuçãoatinge a declaração da variável e deixa de existir quando o bloco decó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áriossubprogramas. - pilha • heap-dinâmica explícita: são criadas (sem nome) poroperadores e funções de alocação de memória e são acessadas pormeio de referências; tem vinculação estática de tipo;apresentam ooverhead do acesso indireto. Ex.: objetos em Java. • heap-dinâmica implícita: são vinculadas ao armazenamento eao tipo durante uma atribuição; são muito flexíveis; reduzem acapacidade do compilador de encontrar erros. O gerenciamento do heap pode ser feito por algoritmos degarbage collection. O tempo de vida de uma variável geralmente é tempo deexecução de um bloco. Várias linguagens oferecem formas de
  • 7. vinculação estática ao armazenamento, o que permite a criação deum 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 queconflita com instruções tipo “goto”. (?) - Inicialização Inicialização é a vinculação ao valor no momento da vinculaçãoao armazenamento.Recurso que não é oferecido por toda linguagem.(ex.: Pascal)