8
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 ? ($ ? # @ ~ ; : / \ | ...)

Nomes_variaveis_vinculacoes

Embed Size (px)

DESCRIPTION

ok

Citation preview

Page 1: Nomes_variaveis_vinculacoes

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 ?($ ? # @ ~ ; : / \ | ...)

Page 2: Nomes_variaveis_vinculacoes

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

Page 3: Nomes_variaveis_vinculacoes

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

Page 4: Nomes_variaveis_vinculacoes

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.

Page 5: Nomes_variaveis_vinculacoes

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.

Page 6: Nomes_variaveis_vinculacoes

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.

Page 7: Nomes_variaveis_vinculacoes

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

Page 8: Nomes_variaveis_vinculacoes

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