notas-de-aula- Schneider
29 pág.

notas-de-aula- Schneider

Disciplina:Linguagens de Programação I260 materiais733 seguidores
Pré-visualização11 páginas
zero. Outro elemento importante é a capacidade de
representar informações de uma forma segmentada (partes da informação ficam num lugar da
memória e partes ficam em outro).

Uma linguagem em que os tipos são na verdade ponteiros para os respectivos tipos, permite a
representação de “variáveis que não tem valor”.

2.1.7 Strings
Quando são tipos primitivos, strings costumam vir acompanhas de diversos operadores para
comparar, extrair substring, concatenar, etc.

Para manter o tamanho variável num espaço estático de memória, é preciso algum tipo de controle.
FORTRAN usa strings sempre cheias. C usa o terminador zero. Pascal usa o tamanho no primeiro
elemento do vetor (problemas de limite para o tamanho). Strings podem ser dinâmicas.

Por serem elementos compostos, as operações podem ser complicadas (atribuir, comparar, etc.).

As linguagens que fornecem formas de descrever padrões de strings se destacam na criação de
programas que precisam manipular texto. Destas, SNOBOL (em especial a versão 4) tem
importância especial por entender os padrões como tipos de primeira classe (que podem ser
manipulados como qualquer outro tipo primitivo). Das linguagens mais modernas, Perl, é uma das

prof. Bruno Schneider 3

Notas de Aula de GCC105 - BCC e BSI - UFLA

mais lembradas por seus recursos de casamento de padrões. Os padrões são geralmente descritos
por expressões chamadas de expressões regulares. Com frequência, diz-se que SNOBOL e Perl tem
ênfase em processamento de strings por causa dessa poderosa forma de processar texto.

Exemplo: teste em Perl para ver se uma string contém uma data:
if $linha =~ (0[1-9]|[12][0-9]|3[01]) / (0[1-9]|1[012]) / ([12][0-9]{3})

A representação interna pode usar listas ou vetores (dentre outras possibilidades menos populares),
trazendo para a string as vantagens e desvantagens desses tipos.

Algumas linguagens permitem interpolação de strings, o que facilita a construção de strings a partir
de diversos valores de tipos diferentes.

Strings tem um papel importante na segurança de computadores (buffer overflow).

2.1.8 Enumerados
Amentam a legibilidade do programa.

Usa constantes simbólicas para os valores possíveis. Temos problemas se uma mesma constante
aparece em mais de um tipo.

2.1.9 Subfaixas
Facilitam a detecção de erros de faixa/limite.

Aumentam a legibilidade ao tornar explícitos limites de um tipo numérico. Erros podem ser
detectados em tempo de compilação. Costumam herdar as operações do tipo “pai”.

2.1.10 Vetores
Agregado homogêneo de valores. Os valores ficam em posições consecutivas na memória.

Algumas linguagens usam parênteses para os índices, outras usam colchetes. Uso de parênteses
deixa a sintaxe semelhante à uma chamada de função.

Algumas linguagens permitem o uso de enumerados ou subfaixas como índices.

Algumas linguagens determinam o valor mínimo do índice.

Algumas linguagens não verificam os limites dos índices.

Alocação estática ou dinâmica.

2.1.11 Vetores associativos (hashes)
São estruturas chave-valor. Aumento da capacidade pode ser muito custoso. Podem ser
implementados por árvores.

2.1.12 Registros
Agregado heterogêneo. Elementos referenciados por nomes. A declaração de classes supre a
necessidade dos registros.

prof. Bruno Schneider 4

Notas de Aula de GCC105 - BCC e BSI - UFLA

2.1.13 Uniões (Registros variantes)
Podem ser um dentre vários tipos diferentes. Trazem problemas para a verificação de tipos.
Problemas podem ser mitigados usando marcas (tags) que identificam o tipo usado (ex.: Haskell).

2.1.14 Listas
É uma estrutura de dados homogênea e recursiva. Requer que a estrutura seja percorrida para
acessar um valor. Por ser segmentada, aumenta e diminui com facilidade.

2.1.15 Conjuntos
Linguagens mais antigas podem ter limitações severas com relação à quantidade de elementos do
conjunto.

Fornecem apenas facilidade na implementação (ex.: verificar se uma letra é uma vogal).

2.1.16 Tipo Unidade
Alguns tipos mais exóticos podem aparecer no sistema de tipos de uma linguagem. O Tipo Unidade
(unit type), por exemplo, é um tipo que só pode representar um valor, necessitando de zero bytes de
armazenamento. O tipo void em C, C++ e Java, pode funcionar como um Tipo Unidade.

2.1.17 Tipos numa linguagem
Responder quais são os tipos disponíveis em uma linguagem de programação pode não ser uma
tarefa tão simples quanto parece. As linguagens frequentemente fornecem um conjunto básico de
tipos e a descrição desses tipos é por vezes incompleta para uma implementação. Assim, os
compiladores frequentemente proporcionam outros tipos além do conjunto básico.

Tipos também podem ser definidos em bibliotecas de programação. Essas bibliotecas podem ser
bibliotecas-padrão ou bibliotecas de terceiros. Sistemas Operacionais costumam ser distribuídos
com bibliotecas para a linguagem C (com definição de tipos).

As linguagens de alto nível costumam se referir a tipos de um ponto de vista com alto nível de
abstração, deixando detalhes de implementação (e consequentemente características relacionadas ao
uso desses tipos) a critério do compilador ou interpretador.

Todos esses fatores influenciam a portabilidade de uma linguagem de programação.

2.2 Vinculações
Programas lidam com informações abstraídas em variáveis. O compilador/interpretador precisa ter
controle da relação entre a abstração que aparece no código fonte e a entidade manipulada pelo
hardware. Para isso, os vários elementos de um programa (em especial as variáveis), são associados
aos seguintes atributos:

• nome (relacionado ao conceito de escopo),

• tipo,

• armazenamento (ou endereço - relacionado ao conceito de tempo de vida) e

• valor.

prof. Bruno Schneider 5

Notas de Aula de GCC105 - BCC e BSI - UFLA

Nem todos os atributos são definidos no mesmo momento. Nem todos precisam existir num
momento qualquer. A associação de um atributo ao seu valor é uma vinculação.

As variáveis aumentam a legibilidade dos programas (em relação à endereços) e resolvem o
problema dos endereços absolutos.

Uma vinculação é estática se for se a mesma durante todo o tempo de execução. Vinculação
dinâmica é aquela que pode ser alterada durante a execução.

Vinculações podem acontecer no tempo de: projeto da linguagem, implementação da linguagem,
compilação, ligação, carregamento ou execução.

2.2.1 Vinculação de Nomes
Além das variáveis, subprogramas, parâmetros, instruções (pontos na sequência de instruções de um
programa), comandos e outros elementos podem receber nomes. Portanto, a vinculação de nomes
não é uma questão limitada às variáveis.

Nem toda variável é vinculada a um nome. É comum que o compilador/interpretador crie variáveis
temporárias sem nome. É comum que um programador crie variáveis sem nome.

Algumas linguagens limitam o tamanho permitido para os nomes. Compiladores também costumam
impor limites.

Algumas linguagens fazem distinção entre maiúsculas e minúsculas, o que é geralmente
considerado uma desvantagem, porém, pode incentivar o programador à agregar informações (como
o tipo) ao nome da variável.

Alguns nomes são especiais numa linguagem de programação. Existem as palavras reservadas,
cujo significado é o mesmo em qualquer contexto e as palavras-chave, cujo significado é especial
em algum contexto.

Muitas vezes, palavras especiais são apenas “pré-definidas”, podendo ser redefinidas pelo
programador. Neste caso, a linguagem provavelmente exige uma biblioteca padrão que é incluída
automaticamente no programa, na qual o nome é definido.

Um mesmo nome pode estar associado a diferentes entidades (ex.: variáveis locais com mesmo
nome em dois subprogramas).

Nomes diferentes podem estar associados à mesma entidade. Neste caso, chamamos esses nomes de
apelidos (aliases). Apelidos podem ser criados de forma implícita (ex.: registros variantes)