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

notas-de-aula- Schneider


DisciplinaProgramação I21.925 materiais250.469 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 \u201cvariáveis que não tem valor\u201d.
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 \u201cpai\u201d.
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:
\u2022 nome (relacionado ao conceito de escopo),
\u2022 tipo,
\u2022 armazenamento (ou endereço - relacionado ao conceito de tempo de vida) e
\u2022 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 \u201cpré-definidas\u201d, 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)