Disciplina:
Paradigmas de
Linguagens de
Programação
Parte 3
2
Nomes
• Têm um uso mais amplo do que simplesmente para variáveis.
• Também estão associados a rótulos, subprogramas, constantes e outras construções de programas.
Nomes
• Principais questões de projeto de LP para nomes:
• Qual é o tamanho máximo de um nome?
• Os LPs fazem distinção de nomes compostos por letras maiúsculas e minúsculas?
• Podem ser usados caracteres especiais como “/”, “\”, “%”, “$”, “#”, “@” na definição de nomes?
4
Nomes
• Definição do livro-texto:
“Um nome é uma cadeia de caracteres usada para identificar alguma entidade de um programa.”
Alguns exemplos:
• Fortran I até 6 caracteres.
• Fortran IV e C até 31 caracteres.
Nomes
• As formas de nomes comumente aceitáveis para as LPs
modernas é composta de uma cadeia com limite de tamanho razoavelmente longo.
• Se for o caso, com algum caractere de conexão como o “_”.
• Em algumas LPs, letras maiúsculas e minúsculas em nomes são distintas.
Exemplos: C, C++, Java
6
Nomes
• A distinção entre maiúsculas e minúsculas viola o princípio de projeto segundo o qual construções de linguagem de
aparência semelhante devem ter o mesmo significado.
Exemplo: Em C++, os nomes rosa, Rosa e ROSA
denotam entidades diferentes.
• No C, este problema pode ser evitado por meio do uso exclusivo de minúsculas, já que todas as construções pré-definidas são em letras minúsculas.
Nomes
• Exemplo 1: No JAVA o método para converter uma cadeia
em um valor inteiro é o parseInt.
• Grafias como parseint e Parseint não são
reconhecidas.
• Este é um problema que afeta mais a capacidade de escrita do que a legibilidade, porque a necessidade de lembrar
grafias estranhas dificulta a escrita correta de programas.
• Exemplo 2: Nas primeiras versões do FORTRAN (I a IV), os
8
Palavras Especiais
• São usados para tornar os programas mais legíveis ao dar nome às ações que devem ser executadas.
• Na maioria das LPs, tais palavras são classificadas como
palavras reservadas ou como palavras-chave.
• Uma palavra-chave de uma LP é especial somente em
certos contextos, ou seja, uma palavra-chave possui uma
Palavras Especiais
• Exemplo 3: As palavras especiais no FORTRAN são
palavras-chave apenas.
REAL APPLE
REAL = 3.4
• Na primeira construção, REAL aparece seguida de um
nome, sendo uma palavra-chave que indica a declaração de da variável APPLE do tipo REAL.
• Na segunda construção, temos uma variável cujo nome é
10
Palavras Especiais
• Uma palavra reservada é especial e não pode ser usada
como um nome.
• Exemplo 4: No FORTRAN é perfeitamente possível ter as
instruções:
INTEGER REAL
REAL INTEGER
• Exemplo 5: No PASCAL as palavras begin e end são
Palavras Especiais
• Exemplo 6: A palavra int no C é uma palavra reservada.
• Porém podemos definir uma variável inteira com nome Int.
int Int;
• Em alguns projetos de LP, algumas palavras são
consideradas como reservadas, mas não tem nenhum significado para as LPs.
• Exemplo 7: No JAVA, as palavras const e goto são
12
Variáveis
• É uma abstração que representa uma célula ou conjunto de células de memória do computador.
• Os programadores freqüentemente pensam nas variáveis como nomes para localizações da memória.
• Há muito mais coisas nelas do que apenas um nome !
Variáveis – Nome
14
Variáveis – Endereço
• O endereço de uma variável é o mesmo da memória à qual ela está associada.
• Essa associação não é tão simples como parece !
• Em muitas LPs, é possível que o mesmo nome esteja
Variáveis – Endereço
• Exemplo 8: Um programa pode ter dois subprogramas
sub1 e sub2, cada um dos quais define uma variável que
usa o mesmo nome soma.
• Uma referência a soma em sub1 não se relaciona com
16
Variáveis – Endereço – Apelidos
• Estratégia possível para fazer com que múltiplos
identificadores façam referência ao mesmo endereço.
• Quando mais de um nome de variável pode ser usado para acessar uma única localização de memória, temos os
conhecidos apelidos.
Variáveis – Endereço – Apelidos
• Exemplo 9: Uso da instrução EQUIVALENCE em
FORTRAN.
DIMENSION A(5), B(10,20), C(15,15)
EQUIVALENCE (A,B), (C)
• Isso permite que durante uma fase de um programa o vetor A e a matriz B sejam utilizados, e, quando A e B não forem
mais necessários, seu espaço pode ser utilizado pela matriz C.
18
Variáveis – Endereço – Apelidos
Variáveis – Tipos
• Determina a faixa de valores que uma variável pode ter e um conjunto de operações definidas para os valores do tipo.
• Exemplo 10: Tipos de Dados mais comuns na linguagem
C/C++
-128 a 127 char
- 2.147.483.648 a 2.147.483.647 long
- 32.768 a 32.767 int
1.7 x 10-308 a 3.4 x 10308
double
3.4 x 10-38 a 3.4 x 1038
float
20
Variáveis – Tipos
• Exemplo 11: Tipos de Dados mais comuns na linguagem
PASCAL
true ou false boolean
0 a 65.535 word
- 32.768 a 32.767 int
- 2.147.483.648 a 2.147.483.647 longint
-128 a 127 shortint
1 caractere qualquer char
0 a 255 byte
- 32.768 a 32.767 short
5 x 10-324 a 1.7 x 10308
double
2.9 x 10-39 a 2.9 x 1039
real
Variáveis – Tipos
• Exemplo 12: Tipos de Dados mais comuns na linguagem
JAVA
-128 a 127 byte
0 a 65.536 char
- 2.147.483.648 a 2.147.483.647 int
- 32.768 a 32.767 short
1.7 x 10-308 a 3.4 x 10308
double
3.4 x 10-38 a 3.4 x 1038
float
22
Variáveis – Valor
• O valor de uma variável é o conteúdo da célula ou das células de memória associadas à variável.
Variáveis – Tempo de Vida
• O tempo de vida de uma variável é o tempo durante o qual esta é vinculada a uma localização de memória específica.
24
Variáveis – Vinculação de Tipo
• Antes que uma variável possa ser referenciada, ela deve ser vinculada a um tipo de dados.
• Os aspectos importantes da vinculação são a maneira como o tipo é especificado e quando a vinculação ocorre.
• A vinculação pode ser:
• Estática
Variáveis – Vinculação Estática de Tipo
• Uma vinculação de tipo é estática se ocorrer antes do tempo
de execução e permanecer inalterada ao longo da execução do programa.
• Tipos podem ser especificados estaticamente por alguma forma de declaração explícita ou implícita.
• A declaração explícita é uma instrução em um programa
que lista nomes de variáveis e especifica que elas são de um tipo particular.
• A declaração implícita é um meio de associar variáveis a
26
Variáveis – Vinculação Estática de Tipo
• Exemplo 13: Declaração Explícita no Ada
A, B : INTEGER;
• Exemplo 14: Declaração Implícita no FORTRAN I, conforme
vimos, as variáveis iniciadas por I, J, K, L, M ou N são
Variáveis – Vinculação Estática de Tipo
• Exemplo 15: Declaração de variáveis implicitamente em
BASIC
• A declaração de variáveis é feita com sufixos:
28
Variáveis – Vinculação Estática de Tipo
Exemplo 15, continuação...
• vBoolean = True
• vInteger% = 333
• vLong& = 98007
• vSingle! = 3.141592
• vDouble# = 3.1492574567
• vCurrency@ = 426.78
Variáveis – Vinculação Dinâmica de Tipo
• Uma vinculação de tipo é dinâmica se ocorrer durante o
tempo de execução e puder ser alterada ao longo da execução do programa.
• Principal vantagem da vinculação dinâmica é a flexibilidade de programação.
• Exemplificando, um programa para processar uma lista de dados em uma linguagem com vinculação dinâmica de tipos pode ser escrito como um programa genérico capaz de lidar com dados de qualquer tipo.
30
Variáveis – Vinculação Dinâmica de Tipo
• Desvantagens da vinculação dinâmica:
• Desvantagem 1: A capacidade de detecção de erros do
compilador é diminuída em relação ao compilador de uma linguagem com vinculação estática.
• Exemplo 16: Sejam i e x duas variáveis inteiras e y
uma matriz de números reais em uma LP com vinculação dinâmica de tipos.
• Se o programa precisa-se atribuir em i o valor de x.
Variáveis – Vinculação Dinâmica de Tipo
• Se devido a um erro de digitação, a instrução de atribuição.
i = y
• Em uma linguagem com vinculação dinâmica de tipos, nenhum erro será detectado pelo compilador.
• Uma vez que foi usado y em vez da variável x correta,
os resultados serão errôneos.
• Em uma LP com vinculação estática de tipos, o
32
Variáveis – Vinculação Dinâmica de Tipo
• Desvantagens da vinculação dinâmica:
• Desvantagem 2: Alto custo de implementação, já que a
Verificação de Tipos
• A verificação de tipos é a atividade de assegurar que os
operandos de um operador sejam compatíveis.
• Um tipo compatível é aquele válido para o operador ou com
permissão, nas regras da linguagem, para ser convertido pelo código gerado pelo compilador para um tipo válido.
• Essa conversão automática é a chama coerção.
34
Verificação de Tipos
• Se todas as vinculações de variáveis a tipos forem estáticas em uma linguagem, a verificação de tipos poderá ser feita estaticamente.
• A vinculação dinâmica de tipos requer a verificação de tipo em tempo de execução.
• É muito melhor detectar erros durante a compilação do que na execução.
Compatibilidade de Tipos
• Há dois métodos diferentes de compatibilidade de tipos:
• Compatibilidade de nome: significa 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.
• Compatibilidade de estrutura: significa que duas variáveis
36
Compatibilidade de Tipos
• Exemplo 17: Declaração de variáveis em Pascal.
A: INTEGER;
B: INTEGER;
C: INTEGER;
ou
A, B, C: INTEGER;
Compatibilidade de Tipos
• Exemplo 18: Declaração de variáveis em Pascal.
A, B: REAL;
C: INTEGER;
• As variáveis A e B possuem compatibilidade de estrutura
com a variável C.
• A variável C não possui compatibilidade de estrutura com
38
Escopo
• O escopo de uma variável de programa é a faixa de
instruções na qual a variável é visível.
• Uma variável é visível em uma instrução se puder ser
Escopo Estático
• O conceito de bloco é fundamental para o entendimento do escopo estático.
• Um bloco delimita o escopo de qualquer variável que ele
possa conter.
• Normalmente, um bloco é um subprograma ou um trecho de código delimitado através de marcadores, tais como, as
chaves ({ e }) de C, C++ e JAVA ou os vocábulos begin e end introduzidos por ALGOL-60 e adotados por PASCAL e
40
Escopo Estático
Escopo Estático – Bloco Monolítico
• Na estrutura monolítica todo o programa é composto por um único bloco.
• Todas as variáveis têm como escopo de visibilidade o programa inteiro.
• Essa estrutura de blocos não é apropriada para programas grandes.
• Essa estrutura dificulta o trabalho simultâneo de vários programadores em um mesmo programa visto que as variáveis criadas por um deles
devem ser necessariamente distintas dos identificadores criados pelos outros.
42
Escopo Estático – Blocos Não Aninhados
• A estrutura de blocos não aninhada é
considerada um avanço em relação à estrutura de blocos monolítica, uma vez que o programa é dividido em vários blocos.
• Nessa estrutura, o escopo de visibilidade das variáveis é o bloco onde foram criadas.
• Essas variáveis são chamadas variáveis locais e as variáveis criadas fora do bloco são
Escopo Estático – Blocos Não Aninhados
• Uma desvantagem associada à estrutura de blocos não aninhada é que qualquer variável que não pode ser local é forçada a ser global e ter todo o programa como escopo, mesmo que seja acessada por poucos blocos.
• Outra desvantagem é a exigência de que todas as variáveis globais tenham identificadores
distintos.
• FORTRAN adota esse tipo de estrutura.
44
Escopo Estático – Blocos Aninhados
• A estrutura aninhada é considerada um avanço ainda maior.
• LPs como PASCAL e ADA adotam essa
estrutura. São, por isso, chamadas LPs ALGOL-like uma vez que foi o ALGOL a primeira
linguagem a utilizá-la.
Blocos Aninhados – Entidades Ocultas
• Entidades podem se tornar inacessíveis quando se usa o mesmo identificador para denotar diferentes entidades em blocos aninhados.
46
Blocos Aninhados – Entidades Ocultas
• No Exemplo 19, a variável x inteira criada no bloco mais externo
não é visível dentro do bloco mais interno porque neste bloco foi criada uma outra variável de tipo ponto flutuante com o mesmo nome x.
Escopo Dinâmico
• O escopo dinâmico baseia-se na seqüência de chamada de subprogramas fazendo com que o escopo seja definido em tempo de execução.
• Exemplo 20: Considere o
48
Escopo Dinâmico
• Quando sub chama sub2 e
este chama sub1, o valor
escrito de x por sub1 é 3,
isto é, x é uma referência à
variável criada em sub2.
• Quando sub chama sub1
diretamente, o valor escrito de
x por sub1 é 1, isto é, x é
Escopo Dinâmico – Conclusão
• LPs que adotam o escopo dinâmico apresentam os seguintes problemas:
1. perda de eficiência pois a checagem de tipos tem de ser feita durante a execução;
2. legibilidade do programa é reduzida pois a sequência de chamadas de subprogramas deve ser conhecida
para determinar o significado das referências a variáveis não locais;
• Como conseqüência desses problemas, a maioria das LPs
50
Inicialização de Variáveis
• A vinculação de uma variável a um valor no momento em que ela é vinculada ao armazenamento é chamada de
inicialização.
• Exemplo 21: FORTRAN
REAL PI
INTEGER SOMA
DATA SOMA /0/, PI /3.14159/
• Neste exemplo a variável SOMA é inicializada com o valor 0
Inicialização de Variáveis
• Exemplo 22: Exemplo 21 em C
float pi = 3.14159;
int soma = 0;
52
Inicialização de Variáveis
• Exemplo 23: Exemplo 21 em PASCAL
var
pi:real;
soma:integer;
<outras instruções>
pi := 3.14159;
Declarações de Constantes
• Uma declaração de constante amarra um identificador a um valor pré-existente que não pode ser alterado ao longo da execução do programa.
• Isso pode ser feito em C++ tal como na seguinte linha de código:
const float pi = 3.14159;
54
Declarações de Constantes
const float pi = 3.14159;
• Essa mesma declaração é válida em C. Contudo, a definição de C só requer que os compiladores avisem ao programador de tentativas de alterações de constantes, permitindo assim que eles ignorem a definição e aceitem alterações de valores das constantes!!!
• Por essa razão, muitos programadores C continuam
utilizando o mecanismo tradicional (#define) quando
querem criar constantes em C:
Declarações de Constantes
• Com esse mecanismo todas as referências a pi no código
serão substituídas por 3.14159, antes do início da
compilação, tendo efeito equivalente a definição de pi como
constante.
• No entanto, pode ser vantajoso usar const ao invés de #define em C porque esse último mecanismo não
reconhece regras de escopo (a constante será reconhecida do ponto de declaração até o final do programa).
• Em caso de uso de const, a constante só será
56
Declarações de Constantes
• Algumas linguagens, como PASCAL, requerem que
constantes tenham seus valores definidos estaticamente (em tempo de compilação).
• Já ADA, C++ e JAVA permitem que sejam usados valores calculados dinamicamente (em tempo de execução do
programa). Essa é uma outra vantagem do uso de const
em relação a #define.
• O mecanismo de macros somente permite a declaração de constantes estáticas.
• JAVA utiliza a palavra final para declarar constantes, tal
Declarações de Constantes
• Exemplo 24:
• A primeira linha ilustra a criação de uma constante estática, a última ilustra a criação de uma constante dinâmica.
• Math.random é uma função calculada em tempo de