Upload
marcoalves
View
4
Download
0
Embed Size (px)
DESCRIPTION
ok
Citation preview
1
Nomes, Variáveis e Vinculações
Fluxo de Informação entre CPU e a Memória
CPU
C := A+B
5
6
11
Read
Read
Read
Write
A
B
C
Instrução
Memória
Nomes
Toda linguagem de programação possui “nomes” com significados pré-definido.
O nome identifica ações que deve ser executada.
As linguagens usam os nomes assim como os humanos:
Identificar variáveis, rotinas, ou construções de programa
Linguagem Imperativa são abstrações da arquitetura do computador de Von Neumann
Processador e Memória
Nomes
Variáveis são locais onde armazenamos valores na memória.
Toda variável é caracterizada por um nome, que a identifica em um programa, e por um tipo, que determina o que pode ser armazenado naquela variável.
Von Neumann Nomes
Considerações acerca de um nome:
Qual o comprimento máximo de um nome ?
As palavras especiais são palavras reservadas
ou palavras-chave?
Existe distinção entre maiúsculas e minúsculas ?
Podem ser utilização de Caracteres de Conexão ?($ ? # @ ~ ; : / \ | ...)
2
Nome - Comprimento
As primeiras Linguagens utilizavam nomes com apenas 1 caractere, pois eram basicamente matemáticas.
Exemplos de linguagens: FORTRAN I: máximo de 6
FORTRAN 90 e C: máximo de 31
COBOL : máximo de 30
Ada e Java: sem limite
VBA: 255 caracteres
C: ilimitado, mas os 31 primeiros devem ser únicos
C++: sem limite, mas implementadores geralmente impõem limites
Nomeação de Variáveis
Perguntas:
O desempenho de um programa é afetado pelo comprimento do nome atribuído às variáveis?
Todas as varáveis obrigatoriamente devem ter um nome?
Nome – Caracteres de Conexão
Caracteres de conexão:
Exemplo
( _ )
Pascal, Modula-2 e FORTRAN 77 não os permitem
Linguagens mais recentes permitem:
Java, dot NET
Caracteres especiais
PHP: nomes de variáveis precisam iniciar com $;
Perl: o nome se inicia com um caractere especial que indica o tipo: $ escalar, @ array e % hash;
Ruby: variáveis de instância se iniciam com @ e variáveis de classe com @@
Nome - Distinção entre maiúsculas e Minúsculas
Desvantagem: Problema de Legibilidade
nomes semelhantes são diferentes
critério de legibilidade: nomes que são lidos da mesma forma denotam entidades diferentes. Ex: rest, Rest,ResT, REST
Vantagem: usado para diferenciar tipos de entidades, ex. variáveis e constantes.
Nomes predefinidos (bibliotecas) em Java e C# incluem maiúsculas e minúsculas (bom ou ruim?)
Nome - Distinção entre maiúsculas e Minúsculas
Nomes em C, C++, Modula-2, C# e em Java fazem distinção entre maiúscula e minúscula;
Em Java: Método para converter string em inteiro. São diferentes?
parseInt (é o correto!)
ParseInt e parseint (não são reconhecidas)
Versões de FORTAN anteriores ao FORTRAN90 Somente letras maiúsculas podiam ser usadas em nomes
3
Palavras Especiais
São utilizadas para tornar programas mais legíveis ao denominar ações.
nomeiam ações (ex. DO, REPEAT, etc.)
separadores de unidades sintáticas (ex. BEGIN, END, etc.)
Classificadas como : Reservadas,
e em algumas, são somente Palavras-Chave.
Palavras Especiais
Palavra Reservada:
é independente do contexto e não pode ser utilizada como um nome.
Exemplo:
na linguagem C
int
char.
Palavras Especiais
Uma Palavra-Chave é uma palavra que é especial em certos contextos, por exemplo em FORTRAN
Real a (palavra-chave – seguida de um nome)
Real = 3.4 (variável – seguida de operador de instrução)
Problemas de legibilidade FORTRAN
INTEGER REAL (neste caso Real é nome de uma variável)
REAL INTEGER ( aqui REAL é utilizado como palavra chave)
Variáveis
Variáveis são abstrações de uma célula de memória de um computador.
Caracterizada por 6 atributos:
Nome
Endereço
Valor
Tipo
Tempo de Vida
Escopo
Variáveis - Nome
Nome
Identifica uma entidade (Identificadores).
Int var1;
Nem todas as variáveis têm nome.
Exemplo
variáveis temporárias show( x+y ) não apresentam nome!
Variáveis - Endereço
Endereço: Endereço da posição de memória à qual ela está
associada. Uma variável pode ocupar mais de uma célula de memória
O endereço de uma variável é o endereço de sua primeira célula de memória.
Uma variável pode ter diferentes endereços em diferentes lugares no programa Programa com dois subprogramas
Sub1
Sub2
Definem uma variável com mesmo nome soma, Independentes uma da outra.
Células Memória
4
Variáveis - Endereço
Apelidos (Aliases)
Os Apelidos existem quando duas ou mais variáveis apontam para o mesmo endereço de memória. (C, C++).
Ou seja, várias variáveis terão o mesmo endereço!
Dificulta a legibilidade
Possibilita que uma variável tenha seu valor modificado por uma atribuição a um outro nome de variável
Células Memória
Variáveis - Tipo
Tipo Determina a faixa de valores das variáveis e
o conjunto de operações definidas para os valores do tipo
FORTRAN INTEGER
Faixa de Valores
-32.768 a 32.767
Operações
Adição, subtração, multiplicação, divisão , etc.
Variáveis - Valor
O valor de uma variável Conteúdo da(s) célula(s) de memória associado a uma
variável.
O valor de uma variável às vezes é conhecido como r-value (valor à direita) porque é o atributo necessário para avaliar a expressão que se encontra do lado direito de uma atribuição.
valor-r (right-value, valor da direita): seu valor
valor-l (left-value, valor da esquerda): seu endereço
Para acessar o r-value, é necessário antes determinar o l-value (endereço da variável).
contador := contador + 1;(l-value) (r-value)
Variáveis – Tempo de Vida
O tempo de vida de uma variável é o intervalo de tempo durante o qual um conjunto de células de memória está vinculado à uma variável.
ALOCAÇÃO DESALOCAÇÃO
tempo de vida
Variável vinculado àcélulas de memória
tempo
Células Memória
Conjunto de células alocadas para o armazenamento dos
dados de uma variável
Células novamente livres, após a Desalocação
Células Memória
O Conceito de Vinculação
Associação de uma entidade de uma LP a elementos de seu significado (semântica).
Ex:
símbolos de operadores à operações:
um tipo a um intervalo de valores;
uma variável a um tipo;
uma variável a um célula de memória; etc.
O Conceito de Vinculação ou Binding
Uma vinculação (binding) é uma associação, como:
Entre um atributo e uma entidade de execução;
Entre uma operação e um símbolo.
O momento em que uma vinculação se desenvolve é chamado de tempo de vinculação.
5
Possíveis tempos de Vinculação
Tempo de projeto da linguagem:
Vinculação de símbolos de operadores a operações, tipos possíveis de variáveis;
ex. * (multiplicação).
Tempo de implementação da linguagem:
Vinculação de um tipo (float) a um conjunto de valores possíveis;
ex. tipos numéricos a intervalo representável.
Possíveis tempos de Vinculação
Tempo de Compilação Vinculação de uma variável a um tipo de dado em
particular;
ex.: variáveis a tipos (C, Pascal, Java, etc.).
Tempo de Carregamento Vinculação de uma variável à célula de memória;
ex.:variáveis estáticas a células de memória.
Tempo de Execução Vinculação de uma variável local não-estática a uma
célula de memória;
ex. variáveis não-estáticas a células de memória, valores de variáveis.
Vinculação Estática e Dinâmica
Vinculação Estática Ocorre antes do tempo de execução e
Permanece inalterada ao longo da execução de um programa.
Vinculação Dinâmica Ocorre durante a execução (ex. valores a variáveis)
ou
pode ser modificada no decorrer da execução de um programa (ex. célula de memória de variável num programa recursivo).
Declaração de Variáveis- Explícita e Implícita -
Vinculações de Tipos
1. Como um tipo é especificado?
2. Quando a vinculação acontece?
Declaração Explícita
Quando uma instrução de um programa lista nomes de variáveis e especifica (declara) que elas são de um tipo particular.
Declaração de Variáveis- Explícita e Implícita -
Declaração Implícita:
Os tipos de variáveis são especificados através de convenções que se aplicam na 1ª ocorrência do nome da variável no programa. Ex.: Perl: variáveis de tipos string e numérico começam com $,
de tipo array com @, etc.
Ex.: FORTRAN: variáveis sem declaração explicita
As que começam comas letras de L a N têm declaração implícita como sendo INTEGER, e as demais como REAL.
Vantagem: conveniência na programação
Desvantagem: Legibilidade, erros difíceis de detectar quando tipos não são
intencionais
Vinculação Dinâmica de Tipos
O tipo da variável é determinado pelo tipo do valor, variável ou expressão a ela atribuído quando o comando de atribuição é executado;
Vinculação dinâmica de tipos: (JavaScript e PHP)
A variável é vinculada ao tipo quando lhe é atribuído algum valor, por exemplo JavaScript
LIST = [10.2 5.1 0.0] -> (LIST é um array de reais com três posições);
LIST = 47; -> (LIST é um inteiro).
Mais comum em linguagens interpretadas.
6
Vinculação Dinâmica de Tipos
Vantagem: flexibilidade na programação – leva a programas mais genéricos
Desvantagens: capacidade de detecção de erros pelo compilador é
diminuída;
ex. : i e x – inteiros , y - array
i = y
custo: maior espaço para armazenamento de variáveis e gerenciamento de memória dificultado
Inferência de Tipos
Inferência de tipos (ML, Miranda e Haskell) Ao invés de uma instrução de atribuição, tipos são
determinados pelo contexto.
Em ML, fun circumf(r) = 3.14159 * r * r; // r é inferido real fun vezes10(x) = 10*x; // r é inferido inteiro fun quadrado(x) = x * x; // erro: tipo não pode ser inferido fun quadrado(x): int = x * x; // declaração explícita
Opções fun quadrado(x:int) = x * x; fun quadrado(x) = (x:int) * x; fun quadrado(x) = x * (x:int);
Vinculação de Armazenamento
Alocação Marcar\tomar uma célula de memória de um
conjunto de memória disponível
Desalocação Devolver a célula ao conjunto de memória
disponível
Tempo de Vida de uma Variável
inicia
quando ela é vinculada a uma célula de memória específica
encerra
quando ela é desvinculada
Variáveis – Tempo de Vida
Categorias de variáveis de acordo com vinculação de armazenamento:
Variáveis Dinâmicas em Heap Implícitas.
Variáveis Dinâmicas em Heap Explícitas.
Variáveis Dinâmicas em Pilha (stack).
Variáveis Estáticas.
Variáveis Estáticas As variáveis estáticas:
são vinculadas a células de memória antes que se inicie a execução do programa;
e permanecem vinculadas até que a execução termine;
Exemplo
FORTRAN I, II e VI, variáveis static do C, C++ e JAVA.
Vantagem:
Eficiência (endereçamento direto, aloca uma só vez).
Desvantagens: flexibilidade de programação reduzida – não suporta recursão,
já que cada cópia ativa do subprograma precisa de sua própria versão das variáveis locais;
Custo computacional – as células de memória não podem ser compartilhadas.
7
Variáveis Dinâmicas em Pilha (stack)
São aquelas cuja a vinculações criam-se a partir da elaboração de suas instruções de declaração, mas seus tipos são vinculados estaticamente;
A elaboração ocorre em tempo de execução;
Exemplo:
Variáveis locais em subprogramas C e métodos em Java.
Variáveis Dinâmicas em Pilha (stack)
Vantagem:
permite recursão;
compartilhamento de espaço de memória
Desvantagens:
Sobrecarga para alocação e de desalocação em tempo de execução.
Variáveis Dinâmicas em Pilha
Exemplo:
Procedimento A chama Procedimento B.
A variável Y do procedimento B é vinculada na Pilha.
ProcedimentoA
ProcedimentoB
int X
int Y
Variáveis Dinâmicas em Pilha
Exemplo:
Procedimento B encerra a sua execução, liberando a memória destinada ao procedimento B com a variável Y.
ProcedimentoA
int X
Variáveis Dinâmicas no Heap Explícitas
Variáveis Dinâmicas em Heap Explícitas
células de memória sem nome alocadas (abstratas) e desalocadas por instruções explícitas em tempo de execução, especificadas pelo programador;
Essas variáveis alocadas no Heap e desalocadas para o Heap só podem ser referenciadas por meio de variáveis de ponteiro ou de referência.
Heap conjunto de células de armazenamento desorganizado,
devido ao fato de seu uso ser imprevisível.
Variáveis Dinâmicas no Heap Explícitas
Exemplo: Objetos dinâmicos em C++ (new e delete);
Todos os objetos em Java.
Vantagem: Convenientes para estruturas dinâmicas:
listas encadeadas;
Árvores.
Desvantagens: Dificuldade em usar ponteiros e referência.
Custo das referências para as alocações e desalocações.
FF
BF
7F
3F
C0
80
40
00
Stack
DLLs
TextData
Heap
Heap
08
8
Variáveis Dinâmicas em Heap Explícitas
As variáveis dinâmicas em heap implícitas são vinculadas ao armazenamento do heap somente quando lhe são atribuídos valores.
Alocação e desalocação causadas por instruções de atribuição: Todas as variáveis em APL Todas as strings e vetores em Perl e em JavaScript
Vantagem: Flexibilidade
Desvantagens: Ineficiente, pois todos os atributos são dinâmicos Perda de grande parte da capacidade de detectar erros
Variáveis Dinâmicas em Heap Implícitas
flex [1:0] int lista
...Lista := (4, 2, 3, 7)
Neste momento amemória foi alocada
Exemplo
pode ser encontrado nos array flex da linguagem ALGOL-68.
arrays dinâmicos permitem que não sejam especificados limites de subscrito em sua declaração. Por exemplo, no array lista definido abaixo, o espaço do heap só
será alocado após a atribuição:
Layout de Memória(Visão do Processo)
Processo: programa em execução
Código: código binário do programa
Dados: dados estáticos
Heap: dados dinâmicos
Stack: chamada de subrotinas e variáveis locais
Kernel
Heap
Stack
Código
Dados
Memória