Escolar Documentos
Profissional Documentos
Cultura Documentos
Roberto Loscio 1
Especificação de uma LP
Roberto Loscio 4
Arquitetura x Linguagem
z Linguagens de programação imperativas são
abstrações da arquitetura de Von Neumann
z Os componentes principais da arquitetura de
Von Neumann são memória e processador
z Na linguagem, a memória é abstraída pelas
variáveis
z O processador é abstraído pelas operações
z O nível de abstração pode variar conforme a
linguagem e as suas estruturas de dados
Roberto Loscio 5
Arquitetura x Linguagem
Para lembrar!
Roberto Loscio 7
Variáveis
z Uma variável é uma abstração de uma célula ou
de um conjunto de células de memória
z Uma variável pode ser caracterizada por um
conjunto de atributos
{Nome
{Endereço Para lembrar!
{Valor
{Tipo é o atributo mais importante de uma LP
{Tempo de vida
{Escopo
Roberto Loscio 8
Nomes
z Possuem um uso mais amplo do que simplesmente para
variáveis
z Estão associados a rótulos, subprogramas, parâmetros
formais, constantes...
z Também conhecido como identificador
z Questõ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 9
Nomes (cont.)
z Conectores
{Pascal, Modula-2, e FORTRAN 77 não permitem
{Outras permitem
z 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 sensitive
{ Em 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
z Sum Of Salaries
z SumOfSalaries
Legibilidade?
Roberto Loscio 11
Nomes - Palavras especiais
Roberto Loscio 12
Nomes - Palavras especiais (cont.)
zPalavra reservada (cont.)
z 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, é
Atenção!
Roberto Loscio 13
Variáveis - Endereço
z O endereço de uma variável é o endereço de memória de
máquina com o qual ela está associada
z O mesmo nome pode estar associado a diferentes endereços
em diferentes lugares.Ex: um programa que tem dois
subprogramas sub1 e sub2, cada um dos quais define uma
variá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
Atenção!
zVinculação estática
{se ocorrer antes do tempo de execução e
permanecer inalterada ao longo da execução
do programa
zVinculação dinâmica
{se ocorrer durante a execução ou se puder ser
modificada durante a execução do programa
Roberto Loscio 19
Vinculação de Tipos - Vinculação
Estática
zAntes 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 20
Vinculação de Tipos - Vinculação Estática
Atenção
z Tipos podem ser especificados estaticamente
por 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 particular
{Uma 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
Roberto Loscio 21
Vinculação de Tipos - Vinculação Estática
z A maioria das LPs projetadas desde meados dos anos
Atenção!
z Inferência de Tipo
{Linguagens funcionais: ML (*), Miranda, e Haskel
{Ao invés de instruções de atribuição, os tipos são
determinados a partir do contexto de suas referências
{O 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
Roberto Loscio 24
Vinculação de Tipos - Inferência de Tipo
Roberto Loscio 25
Próximo Assunto:
Seção 5.4.3 -
Vinculações de
Armazenamento e
Tempo de Vida
Roberto Loscio 26
Vinculação de Armazenamento e Tempo de
Vida
z 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ível
{Desalocação ou Liberação: coloca a célula de volta ao
pool
{O 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 27
Classificação das variáveis de
acordo com o tempo de vida
{Estáticas
{Stack-Dinâmicas
{Heap-dinâmicas explícitas
{Heap-dinamicas implícitas
Roberto Loscio 28
Variáveis Estáticas
Roberto Loscio 29
Variáveis Stack-Dinâmicas
z São aquelas cujas vinculações de armazenamento
criam-se a partir de suas instruções de declaração
z São criadas em uma pilha durante a invocação de um
subprograma
z São criadas em tempo de execução
z Variáveis locais declaradas em subprogramas
geralmente são stack-dinâmicas
z Permite recursão: cada vez que um subprograma chama
a si mesmo, um novo quadro com as mesmas variáveis
é colocado na pilha
z Overhead de alocação e desalocação
Roberto Loscio 30
Variáveis Heap-Dinâmicas Explícitas
Roberto Loscio 31
Variáveis Heap-Dinâmicas Explícitas
(cont.)
z 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
z 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 32
Variáveis Heap-Dinâmicas Implícitas
z A alocação no heap é feita quando a variável
recebe um valor
z Tem como vantagem a flexibilidade
{São nomes que podem ser usados para qualquer
finalidade
z Entretanto, ocorre perda da capacidade de
detecção de erros pelo compilador
z O heap é uma coleção de células de
armazenamento cuja organização é altamente
desorganizada, por causa da imprevisibilidade
do seu uso
Roberto Loscio 33
Resumindo...
Roberto Loscio 34
Resumindo...
Roberto Loscio 35
Verificação de Tipos
z Coerção
z A 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.
Roberto Loscio 37
Verificação de Tipos (cont.)
Roberto Loscio 38
Verificação de Tipos (cont.)
Roberto Loscio 40
Compatibilidade de Tipos (cont.)
Roberto Loscio 41
Compatibilidade de Tipos (cont.)
Roberto Loscio 42
Compatibilidade de Tipos (cont.)
z 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
z type Celsius = real
z Fahrenheit = real
Roberto Loscio 43
Escopo
zEscopo estático
{O escopo pode ser determinado antes da
execução
{Baseado no texto do programa
{Para conectar um nome a uma variável deve-
se encontrar uma declaração que o faça
{Processo de busca:
zprocura declarações, primeiro localmente, depois
num escopo superior e assim sucessivamente
enquanto não encontra a declaração com o nome
Roberto Loscio 45
Escopo estático
Procedure big;
z No escopo estático, a
var x:integer;
Procedure sub1;
referência a variável x em
Begin {sub1} sub1 é ao x declarado no
... X ... procedimento big.
End;
z A procura se inicia em
Procedure sub2;
Var x: integer; sub1, mas nenhuma
Begin {sub2} declaração é encontrada.
... z A procura prossegue no
End;
pai-estático de sub1 (big),
Begin {big}
... onde uma declaração é
End; encontrada.
Roberto Loscio 46
Escopo estático (cont.)
A B
C D E
Roberto Loscio 52
Escopo estático - Avaliação
z Um grafo das chamadas a procedimentos potenciais
mostra que é possível uma grande quantidade de
oportunidades de chamada além do exigido
z Um programador poderia erroneamente chamar um
subprograma que não deveria ter sido chamado
MAIN MAIN
A B A B
C D E C D E
Desejado Possíveis
Roberto Loscio 53
Escopo estático - Avaliação
Roberto Loscio 55
Escopo estático - Avaliação
Roberto Loscio 56
Escopo
zEscopo Dinâmico
{Baseados 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 57
Escopo Dinâmico
Procedure big;
var x:integer; z O significado do
Procedure sub1;
Begin {sub1} identificador X
... X ... referenciado em sub1
End;
Procedure sub2;
é dinâmico (não pode
Var x: integer; ser determinado
Begin {sub2} durante a
...
End; compilação)
Begin {big}
...
End;
Roberto Loscio 58
Escopo Dinâmico
Roberto Loscio 60
Escopo Dinâmico
Roberto Loscio 61
Escopo Dinâmico
Roberto Loscio 62
Ambiente de Referenciamento
Roberto Loscio 64
Constantes Nomeadas
z Uma 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
z Vantagens: legibilidade e modificabilidade
z A vinculação de valores a constantes nomeadas pode
ser feito tanto estática quanto dinamicamente
z Linguagens:
{ Pascal: somente literais
{ Modula-2 e FORTRAN 90: permite expressões com
contantes nomeadas definidas anteriormente e também
valores constantes com operadores
{ Ada, C++, e Java: Expressões de qualquer natureza
Roberto Loscio 65
Inicialização de Variáveis
Roberto Loscio 66