Roberto Loscio 1
Nomes, Vinculações, Verificação de Tipos e Escopo
Disciplina: Linguagens de Programação
Professor: Roberto [email protected]
Roberto Loscio 2
Especificação de uma LP
Envolve dois aspectos:Sintaxe: regras que determinam quais construções são corretas;Semântica: descrição de como as construções sintaticamente corretas são interpretadas ou executadas (significado);Exemplo (em Pascal):
a := bComando de atribuição descrito corretamente (sintaxe);Substitua o valor de a com o valor atual de b
Roberto Loscio 3
Sintaxe e Semântica
É importante conhecer os limites entre estes dois conceitos e sua importância:
Sintaxe é a forma de suas expressões, de suas instruções, de suas unidades de programaSemântica é o significado de suas instruções, de suas unidades de programa
A sintaxe influencia a forma como os programassão escritos, enquanto que a semântica dita como os programas devem ser entendidos por outros programadores e devem ser executados em um computador
Roberto Loscio 4
Sintaxe e Semântica
A semântica é a parte que realmente caracteriza uma linguagem!
Uma dada construção pode ser apresentada da mesma forma em diferentes linguagens de programação, porém com semânticas diferentes, ou vice-versa
Roberto Loscio 5
Arquitetura x Linguagem
Linguagens de programação imperativas são abstrações da arquitetura de Von NeumannOs componentes principais da arquitetura de Von Neumann são memória e processadorNa linguagem, a memória é abstraída pelas variáveisO processador é abstraído pelas operaçõesO nível de abstração pode variar conforme a linguagem e as suas estruturas de dados
Roberto Loscio 6
Gargalo de von NeumannA separação entre a CPU e a memória leva para o gargalo de von Neumann, a produção limitada (taxa de transferência) entre a CPU e a memória em comparação com a quantidade de memória. Na maioria dos computadores modernos, o throughput é muito menor do que a taxa com que o processador pode trabalhar. Isso limita seriamente a velocidade de processamento eficaz quando o processador é exigido para realizar o processamento mínimo em grandes quantidades de dados. A CPU é continuamente forçada a esperar por dados que precisam ser transferidos para ou a partir da memória. Como a velocidade da CPU e tamanho da memória têm aumentado muito mais rapidamente que a taxa de transferência entre eles, o gargalo se tornou mais um problema, um problema cuja gravidade aumenta com cada geração de CPU.
Arquitetura x LinguagemPara lembrar!
Roberto Loscio 7
Throughput
Throughput (ou taxa de transferência) é a quantidade de dados transferidos de um lugar a outro, ou a quantidade de dados processados em um determinado espaço de tempo, pode-se usar o termo throughput para referir-se a quantidade de dados transferidos em discos rígidos ou em uma rede, por exemplo ...
Roberto Loscio 8
Variáveis
Uma variável é uma abstração de uma célula ou de um conjunto de células de memóriaUma variável pode ser caracterizada por um conjunto de atributos
NomeEndereçoValorTipo é o atributo mais importante de uma LPTempo de vidaEscopo
Para lembrar!
Roberto Loscio 9
Nomes
Possuem um uso mais amplo do que simplesmente para variáveisEstão associados a rótulos, subprogramas, parâmetros formais, constantes...Também conhecido como identificadorQuestões de Projeto:
Tamanho máximo?Caracteres de conexão são permitidos? (*)Nomes distinguem maiúsculas de minúsculas?As palavras especiais são palavras reservadas ou palavras chaves?(*) A maioria das linguagens contemporâneas aceita caractere de conexão (_).
Roberto Loscio 10
Nomes (cont.)
Um nome é uma string (cadeia) de caracteres usada para identificar alguma entidade de um programaTamanho (número de caracteres):
FORTRAN I: máximo 6COBOL: máximo 30FORTRAN 90 e ANSI C: máximo 31Ada: sem limiteC++: sem limite, mas as implementações normalmente impõe algum limite (32)
Roberto Loscio 11
Nomes Nomes (cont.)
ConectoresPascal, Modula-2, e FORTRAN 77 não permitemOutras permitem
Distinção entre maiúsculas e minúsculas (Case sensitivity)
Desvantagem: legibilidade (nomes semelhantes denotam entidades diferentes)Nomes em C, C++, Java, e Modula-2 são case sensitiveEm versões do FORTRAN anteriores ao FORTRAN 90 os nomes podiam ter espaços em branco que eram ignorados. Ex., os dois nomes a seguir eram equivalentes
Sum Of SalariesSumOfSalaries
Legibilidade?
Roberto Loscio 12
Nomes - Palavras especiais
Uma palavra-chave é uma palavra que é especial somente em determinados contextos
Desvantagem: pouca legibilidadeEx: Fortran - REAL Integer Apple (palavra-chave, sentença declarativa)Integer = 4 (nome de variável)
Uma palavra reservada é uma palavra especialque não pode ser usada como nome pelo usuárioEm FORTRAN as palavras-chave são também especiais e são distinguidas pelo contexto. Ex., Integer Apple (sentença declarativa) e Integer = 4 (nome de variável > atribuição)
Ate
nção
!
Roberto Loscio 13
Palavra reservada (cont.)Em Java, um programador não pode utilizar uma variável com o nome for pois esta palavra é reservada para construção de loops. Ela é, pois, uma "palavra chave", e por ser de uso restrito, é também uma "palavra reservada". (Em algumas linguagens, como C ou Java, os termos tem o mesmo significado).COBOL tem 300 palavras reservadas, dentre as quais, LENGHT, BOTTOM, DESTINATION e COUNT.Algumas vezes a especificação de uma linguagem de programação define palavras reservadas para uso futuro. Na linguagem Java, as palavras const e goto são reservadas; elas não tem nenhum significado para a linguagem mas não podem ser utilizadas como identificadores. Isto permite que estas palavras sejam definidas em versões futuras da linguagem sem que o código já escrito seja afetado.
Nomes - Palavras especiais (cont.)A
tenç
ão!
Roberto Loscio 14
Variáveis - Endereço
O endereço de uma variável é o endereço de memória de máquina com o qual ela está associadaO mesmo nome pode estar associado a diferentes endereçosem diferentes lugares.Ex: um programa que tem doissubprogramas sub1 e sub2, cada um dos quais define umavariável que usa o mesmo nome (soma)
Como as variáveis são independentes uma da outra, uma referência a soma em sub1 não se relaciona com uma referência a soma em sub2
Se dois nomes de variáveis podem ser usados para acessar a mesma posição de memória elas são chamadas aliases ou apelidos
Ex: duas variáveis de ponteiro são apelidos quando apontam para a mesma localização de memória
O endereço de uma variável é algumas vezes chamado de seu valor esquerdo (l value), porque o endereço é o que é necessário quando uma variável aparece no lado esquerdo de uma atribuição
Ate
nção
!
Roberto Loscio 15
Variáveis – Tipo e Valor O tipo de uma variável determina a faixa devalores que a variável pode ter e o conjunto de operações que são definidas para os valores do tipo (será discutido no cap. 6)O valor de uma variável é o conteúdo da(s) célula(s) de memória associada(s) a variávelO endereçamento é orientado a bytes mas o valor ocupa mais de uma célula; célula abstrata
O valor-l da variável é seu endereçoO valor-r da variável é seu valor
Tem o tamanho exigido pela variável a
qual está associada
Roberto Loscio 16
Vinculação
Uma vinculação é uma associação, como, por exemplo:
entre um atributo e uma entidade, ouentre uma operação e um símbolo
Tempo de vinculação é o momento em que uma vinculação ocorreA vinculação e os tempos de vinculação são conceitos fundamentais na semântica de uma LP
Roberto Loscio 17
Vinculação (cont.)Possíveis tempos de vinculação:
Vinculação em tempo de projeto da LP -- ligação dos símbolos às operações (definição dos operadores, como por ex., * )Vinculação em tempo de implementação - ligação do tipo ponto-flutuante a sua forma de representação. Um tipo de dados, como int em C, é vinculado a uma faixa de valores possíveis em tempo de implementação da LPVinculação em tempo de compilação– ligar uma variável a um tipo de dados em particular, como em JavaUma variável pode ser vinculada a uma célula de armazenamento quando o programa é carregado na memóriaVinculação em tempo de execução -- ligar uma variável local, como em Java, a uma célula de memória quando o programa é carregado na memória (diferente do anterior)Uma chamada a um subprograma de uma biblioteca é vinculada ao código do subprograma em tempo de ligação
Roberto Loscio 18
Vejamos a seguinte sentença em Java:count = count + 5
O tipo de count é vinculado em tempo de compilação.O conjunto dos valores possíveis de count é vinculado em tempo de projeto do compilador.O significado do símbolo do operador + é vinculado em tempo de compilação, quando os tipos dos operandos tiverem sido determinados.A representação interna do literal 5 é vinculada ao tempo de projeto do compilador.O valor de count é vinculado em tempo de execuçãocom essa sentença
Vinculação (cont.)
Roberto Loscio 19
Vinculação de atributos a Variáveis
Vinculação estáticase ocorrer antes do tempo de execução e permanecer inalterada ao longo da execução do programa
Vinculação dinâmicase ocorrer durante a execução ou se puder ser modificada durante a execução do programa
Roberto Loscio 20
Vinculação de Tipos - Vinculação Estática
Antes de uma variável poder ser referenciada em um programa, ela deve ser vinculada a um tipo de dados. Os dois aspectos importantes dessa vinculação são
Como o tipo é especificado ?Quando ocorre a vinculação ?
Roberto Loscio 21
Tipos podem ser especificados estaticamentepor meio de alguma forma de declaração implícita ou explícita
Uma declaração explícita é uma instrução ou sentença de um programa que lista nomes de variáveis e especifica que elas são de um tipo particularUma declaração implícita é um meio de associar variáveis a tipos por convenções padronizadas, em vez de instruções de declaração. Nesse caso, a primeira aparição de um nome de variável em um programa constitui sua declaração implícita
Atenção
Vinculação de Tipos - Vinculação Estática
Roberto Loscio 22
A maioria das LPs projetadas desde meados dos anos 60 requer a declaração explícita de todas as variáveisFORTRAN e BASIC, no entanto, tem declarações implícitas As declarações implícitas podem ser prejudiciais à confiabilidade porque previnem o processo de compilação de detectar alguns erros de programação e de digitação pode trazer problemas para a legibilidadedo programaEm FORTRAN, um identificador que aparece em um programa que não é explicitamente declarado é implicitamente declarado de acordo com a seguinteconvenção: se iniciar com uma das letras I, J, K, L, M ouN então será do tipo INTEGER, caso contrário será do tipo REAL
Vinculação de Tipos - Vinculação Estática A
tenç
ão!
Roberto Loscio 23
Vinculação de Tipos DinâmicaA variável é vinculada ao tipo quando lhe é atribuído um valor em uma instrução ou sentença de atribuiçãoQuando a instrução é executada, a variável que está sendoatribuída é vinculada ao tipo do valor, da variável ouexpressão no lado direito da atribuiçãoVantagem: flexibilidade (programa genérico capaz de tratar dados de quaisquer tipos numéricos)Desvantagens:
Custo para implementar a vinculação dinâmica (verificação dinâmica de tipos e interpretação)Capacidade de detecção de erros pelo compilador diminuída já que não pode fazer verificação de tipos
As linguagens que têm vinculação de tipos dinâmica são normalmente implementadas usando interpretadores puros ao invés de compiladores
Vinculação de Tipos - Vinculação DinâmicaA
tenç
ão!
Roberto Loscio 24
Inferência de Tipo Linguagens funcionais: ML (*), Miranda, e HaskelAo invés de instruções de atribuição, os tipos são determinados a partir do contexto de suas referênciasO tipo dos argumentos e do resultado das funções não se declaram. A implementação faz inferência de tipos, ou seja, ela infere para cada função o tipo mais geral que é possível atribuir a essa função (*) ML é uma LP que oferece suporte tanto para programação funcional quanto para programação imperativa
Vinculação de Tipos - Inferência de Tipo
Roberto Loscio 25
Sintaxe geral de uma função ML:fun nome_função(parâmetros formais)=expressãoO valor da expressão é retornada pela função (*)
fun square (x : real) = x * x;fun square (x) = (x : real) * x; fun square (x) = x * (x : real);
Em ML o fato do valor funcional ser tipado como real é suficiente para inferir que o parâmetro também é do tipo real(*) A expressão pode ser uma lista de expressões, separadas por ponto e vírgula e envolta em parêntesis. O valor de retorno é o da última expressão
Vinculação de Tipos - Inferência de Tipo
Roberto Loscio 26
Próximo Assunto:Seção 5.4.3 -Vinculações de Armazenamento e Tempo de Vida
Roberto Loscio 27
Vinculação de Armazenamento e Tempo de Vida
O caráter fundamental de uma LP Imperativa é em grande parte determinado pelo projeto das vinculações de armazenamento para suas variáveis
Alocação: vinculação da variável a uma célula de memória obtida a partir de um pool ou conjunto de células de memória disponívelDesalocação ou Liberação: coloca a célula de volta ao poolO tempo de vida de uma variável é o tempo durante o qual esta é vinculada a uma localização de memória específica
Roberto Loscio 28
Classificação das variáveis de acordo com o tempo de vida
EstáticasStack-DinâmicasHeap-dinâmicas explícitasHeap-dinamicas implícitas
Roberto Loscio 29
Variáveis Estáticas
São aquelas vinculadas a memória antes que a execução do programa se inicie e que assim permanecem até que a execução se encerreNão suportam recursão!Ex: todas variáveis FORTRAN 77
Variáveis static em C
Roberto Loscio 30
Variáveis Stack-Dinâmicas
São aquelas cujas vinculações de armazenamento criam-se a partir de suas instruções de declaraçãoSão criadas em uma pilha durante a invocação de um subprogramaSão criadas em tempo de execuçãoVariáveis locais declaradas em subprogramas geralmente são stack-dinâmicasPermite recursão: cada vez que um subprograma chama a si mesmo, um novo quadro com as mesmas variáveis é colocado na pilhaOverhead de alocação e desalocação
Roberto Loscio 31
Variáveis Heap-Dinâmicas Explícitas
São células de memória não nomeadas (abstratas) alocadas e desalocadas por instruções explícitas em tempo de execução pelo programador
Referenciadas somente através de ponteiros ou referênciasO heap é uma coleção de células de armazenamento cuja organização é altamente desorganizada, por causa da imprevisibilidade do seu uso
Roberto Loscio 32
Variáveis Heap-Dinâmicas Explícitas (cont.)
São usadas freqüentemente para estruturas dinâmicas que precisam crescer e/ou encolher durante a sua execução
Essas estruturas podem ser criadas usando-se ponteiros e variáveis heap-dinâmica explícitas
Em Pascal a alocação dinâmica da memória é feita pelo procedimento “new”
New(p): cria uma variável dinâmica que será apontada por “p”
Roberto Loscio 33
Variáveis Heap-Dinâmicas Implícitas
A alocação no heap é feita quando a variável recebe um valorTem como vantagem a flexibilidade
São nomes que podem ser usados para qualquer finalidade
Entretanto, ocorre perda da capacidade de detecção de erros pelo compiladorO heap é uma coleção de células de armazenamento cuja organização é altamente desorganizada, por causa da imprevisibilidade do seu uso
Roberto Loscio 34
Resumindo...
Variáveis estáticas: são vinculadas a células de memória antes da execução do programa e permanecem até o fim do programa Variáveis Stack-Dinâmicas: as vinculações são criadas a partir da instrução de declaração, em tempo de execução
Roberto Loscio 35
Resumindo...
Variáveis Heap-Dinâmicas Explícitas: as células de memória são alocadas e desalocadas em tempo de execução através declarações explícitasVariáveis Heap-Dinâmicas Implícitas: as células de memória são alocadas somente quando lhe são atribuídos valores e desalocadas por meio de instruções explícitas (delete)
Roberto Loscio 36
Verificação de Tipos
Verificação de tipos é a atividade de assegurar que os operandos de um operador possuem tipos compatíveis
Exemplo: Subprogramas podem ser vistos como operadores e os parâmetros são seus operandosO símbolo de atribuição pode ser visto como um operador, sendo sua variável alvo e sua expressão os operandos
Um tipo compatível é aquele válido para o operador ou com permissão, nas regras da linguagem, para ser convertido pelo compilador para um tipo válido
Esta conversão automática é chamada coerçãoUm erro de tipo é a aplicação de um operador a um operando de tipo impróprio
Roberto Loscio 37
CoerçãoA idéia é que a linguagem é quem faz uma coerção de tipos e não o programador, ou seja, que esta não é feita voluntariamente pelo programador e sim pela linguagem. Exemplo: Se o operador + é definido para somar dois números reais, e um número inteiro é passado como parâmetro então o inteiro é "coergido" para real.
Verificação de Tipos (cont.)
Roberto Loscio 38
Verificação de Tipos (cont.)
Se todas as vinculações de variáveis a tipos são estáticas a verificação de tipos quase sempre poderá ser feita estaticamenteSe todas as vinculações de variáveis a tipos são dinâmicas, a verificação de tipos deverá ser dinâmica
Roberto Loscio 39
Verificação de Tipos (cont.)
Uma linguagem de programação é fortemente tipada se erros de tipos são sempre detectados
Vantagem da tipificação forte: permite detectar todos os usos equivocados de variáveis que resultam em erros de tipo
As regras de coerção tem um grande efeito sobre a verificação de tipos - eles podem enfraquecer consideravelmente a verificação
Roberto Loscio 40
Compatibilidade de Tipos
Há dois métodos diferentes de compatibilidade de tipos:
Compatibilidade de tipo de nomeCompatibilidade de tipo de estrutura
Roberto Loscio 41
Compatibilidade de Tipos (cont.)
A compatibilidade de tipo de nomesignifica que duas variáveis têm tipos compatíveis somente se estiverem na mesma declaração ou em declarações que usam o mesmo nome de tipo
Fácil de implementar mas altamente restritivaSub-faixa de números inteiros não seria compatível com inteiros
Roberto Loscio 42
Compatibilidade de Tipos (cont.)
Compatibilidade de tipo de estruturasignifica que duas variáveis possuem tipos compatíveis se os seus tipos tiverem estruturas idênticas
Mais flexível, porém difícil de implementar (é preciso analisar a estrutura completa dos tipos)
A maioria das linguagens usa combinação dos métodos
Roberto Loscio 43
Compatibilidade de Tipos (cont.)
Questões:Dois tipos de registro são compatíveis se tiverem a mesma estrutura mas nome de campos diferentes?Dois tipos de array unidimensionais são compatíveis se possuem o mesmo tipo de elemento mas faixas de subscritos diferentes?(ex [1..10] and [2..11])Dois tipos de enumeração são compatíveis se seus componentes são grafados diferente?Tipos como estes não podem ser diferenciados Ex: Pascal
type Celsius = realFahrenheit = real
Roberto Loscio 44
Escopo
O escopo de uma variável é a faixa de instruções na qual a variável é visível
Uma variável é visível em uma instrução se pode ser referenciada nesta instrução
As variáveis não-locais de uma unidade ou de um bloco são visíveis dentro destes mas não são declaradas nelesAs regras de escopo de uma variável determinam como a ocorrência de um nome é associada a uma variável
Roberto Loscio 45
Escopo
Escopo estáticoO escopo pode ser determinado antes da execuçãoBaseado no texto do programaPara conectar um nome a uma variável deve-se encontrar uma declaração que o façaProcesso de busca:
procura declarações, primeiro localmente, depois num escopo superior e assim sucessivamente enquanto não encontra a declaração com o nome
Roberto Loscio 46
Escopo estáticoProcedure big;var x:integer;Procedure sub1;Begin {sub1}... X ...End;Procedure sub2;Var x: integer;Begin {sub2}...
End;Begin {big}...End;
No escopo estático, a referência a variável x em sub1 é ao x declarado no procedimento big.A procura se inicia em sub1, mas nenhuma declaração é encontrada.A procura prossegue no pai-estático de sub1 (big), onde uma declaração é encontrada.
Roberto Loscio 47
Escopo estático (cont.)
Subprogramas criam seus próprios escoposQuando programas são aninhados é criada uma hierarquia de escoposQuando uma referência a uma variável é encontrada os atributos da variável são determinados localizando-se as instruções nas quais ela está declarada
Ancestrais estáticos
Roberto Loscio 48
Escopo estático (cont.)
Variáveis podem ser escondidas em uma unidade de programa quando neste se declara uma variável com mesmo nomeEm geral, uma declaração para uma variável ocultará efetivamente qualquer declaração de variável com mesmo nome em um escopo envolvente maior
C++ e Ada permitem acessar estas variáveis ocultas. Operador de escopo no C++ (::)
Roberto Loscio 49
Escopo estático (cont.)
Program main;var x:integer;Procedure sub1;var x: integer;Begin {sub1}... X ...End;
Begin {big}...
End.
A referência a x em sub1 é ao x declarado de sub1O x do programa main está oculto no código de sub1
Roberto Loscio 50
Escopo estático - Blocos
Muitas linguagens permitem que novos escopos estáticos sejam definidos no meio de código executávelUma seção de código pode ter suas próprias variáveis locais cujo escopo é minimizadoEsta seção é chamada de bloco
C, C++, Java permitem que qualquer instrução composta tenha declarações e defina um novo escopoExemplo:If(list[i] < list[j]){Int temp;temp = list[i];list[i] = list[j];list[j] = temp;}
Roberto Loscio 51
Escopo estático - Avaliação
Este programa contém o escopo global para main, com dois procedimentos que definem os escopos dentro de main, A e BDentro de A há escopos para C e DDentro de B está o escopo para EO acesso a procedimentos exigido é o seguinte:
main chama A e BA chama C e DB chama A e E
A
B
C
D
E
main
Roberto Loscio 52
Escopo estático - Avaliação
Podemos visualizar a estrutura do programa como uma árvore:
A B
C D E
main
Roberto Loscio 53
MAIN MAIN
A B A B
C D E C D E
Escopo estático - Avaliação
Um grafo das chamadas a procedimentos potenciais mostra que é possível uma grande quantidade de oportunidades de chamada além do exigidoUm programador poderia erroneamente chamar um subprograma que não deveria ter sido chamado
PossíveisDesejado
Roberto Loscio 54
Escopo estático - Avaliação
Demasiado acesso a dados pode ser um problemaExemplo: todas as variáveis do programa principal são visíveis a todos os procedimentosCria a possibilidade de acessos incorretos
Um identificador grafado erroneamente em um procedimento pode ser tomado como uma referência a um identificador em algum escopo envolvente
Roberto Loscio 55
Escopo estático - Avaliação
Suponha que a especificação é mudada e agora E deve acessar algum dado de DSoluções:
1. Colocar E no escopo de D (mas E não poderá acessar o escopo de B)2. Mover os dados de D que E necessita para MAIN (entretanto todos os procedimentos terão acesso a eles)
Suponhamos que a variável movida seja X, e que seja necessária para D e ESuponhamos que haja uma variável X declarada em AIsso ocultaria o X correto de seu proprietário original, D
A
B
C
D
E
main
Roberto Loscio 56
Escopo estático - Avaliação
Problema: ter a declaração da variável distante do seu usoDe modo geral: O escopo estático encoraja o uso de globaisTodos os procedimentos podem acabar sendo aninhados no mesmo nível no programa principal
Roberto Loscio 57
Escopo
Escopo DinâmicoBaseados em seqüências de chamadas a subprogramas não em suas relações espaciais (temporal versus espacial)Referências a variáveis são conectadas a declarações procurando regressivamente através dos subprogramas chamados
Roberto Loscio 58
Escopo DinâmicoProcedure big;var x:integer;Procedure sub1;Begin {sub1}... X ...End;Procedure sub2;Var x: integer;Begin {sub2}...
End;Begin {big}...End;
O significado do identificador X referenciado em sub1 é dinâmico (não podeser determinadodurante a compilação)
Roberto Loscio 59
Escopo Dinâmico
Como determinar o significado correto de X ?
A procura é iniciada com as declarações locaisAs declarações do pai dinâmico (procedimento de chamada) são procuradasSe não encontrar, então deve-se procurar no pai dinâmico desse procedimento e assim por diante até que uma declaração seja encontradaSe não for encontrada uma declaração então haverá erro em tempo de execução
Roberto Loscio 60
Escopo Dinâmico
Considere a seguintesequência de chamada para sub1:
MAIN chama Sub2Sub2 chama Sub1
Escopo Dinâmico: referência a x emSub1 é ao x declarado em Sub2
Procedure big;var x:integer;Procedure sub1;Begin {sub1}... X ...End;Procedure sub2;Var x: integer;Begin {sub2}...
End;Begin {big}...End;
Roberto Loscio 61
Escopo Dinâmico
Considere a seguintesequência de chamada para Sub1:
MAIN chama Sub1
Escopo Dinâmico: referência a X emSub1 é ao X declarado em main
Procedure big;var x:integer;Procedure sub1;Begin {sub1}... X ...End;Procedure sub2;Var x: integer;Begin {sub2}...
End;Begin {big}...End;
Roberto Loscio 62
Escopo Dinâmico
Avaliação do escopo dinâmicoVantagem: conveniênciaDesvantagem: baixa legibilidade
Roberto Loscio 63
Ambiente de Referenciamento
O ambiente de referenciamento de uma instrução é o conjunto de todos os nomes visíveis na instruçãoEm uma linguagem de escopo estático o ambiente de referenciamento consiste das variáveis locais mais todas as variáveis dos programas em que o trecho atual está aninhado, somada as variáveis do programa principal
Roberto Loscio 64
Ambiente de Refenciamento
Um subprograma está ativo se sua execução tiver começado, mas ainda não terminouEm uma linguagem de escopo dinâmico, o ambiente de referenciamento consiste das variáveis locais mais as variáveis de todos os programas ativos atualmente
Roberto Loscio 65
Constantes NomeadasUma constante nomeada é uma variável vinculada a um valor somente no momento que ela é vinculada a um armazenamento.
Ex: usar o nome PI em vez da constante 3,141592 Vantagens: legibilidade e modificabilidadeA vinculação de valores a constantes nomeadas pode ser feito tanto estática quanto dinamicamenteLinguagens:
Pascal: somente literaisModula-2 e FORTRAN 90: permite expressões com contantes nomeadas definidas anteriormente e também valores constantes com operadoresAda, C++, e Java: Expressões de qualquer natureza
Roberto Loscio 66
Inicialização de Variáveis
A vinculação a uma variável de um valor no momento em que ela é vinculada ao armazenamento é chamada inicialização;Freqüentemente a Inicialização pode ser feita na instrução de declaração da variávelEx: Ada
SUM : FLOAT := 0.0