Principais questões no projeto de uma linguagem
Tipos de dados
- Sistemas de tipo
- Checagem de tipo
- Equivalência, Compatibilidade, Inferência de tipos
Controle de Fluxo
- Avaliação de expressões (aritméticas, atribuição)
- Fluxo estruturado e não-estruturado
Abstração de controle – subprogramas
- Registros de ativação
- Modos de passagem de parâmetros
Abstração de dados – orientação a objeto
- Encapsulamento e herança
- Composição e polimorfismo
Concorrência
Uma visão ou representação de uma entidade que
inclui somente os atributos mais significativos
É uma Ferramenta contra a complexidade
- Simplifica a programação
- Permite focar-se nos atributos essenciais
\pause Abstração de Processo
- Manifesta-se através de subprogramas
- Presente em praticamente todas as linguagens
- Exemplo do
sortInt(list, listlen)
\pause Abstração de Dados
- Presente em todos os projetos de linguagens desde 1980
- Tipos Abstratos de Dados (TAD)
Variáveis
- Globais, Locais, Escopo aninhado, Estáticas
Módulo
- Conjunto de funções que compartilham variáveis estáticas
- Exportam um tipo abstrato
\hrule
\pause Módulo-tipo é o tipo abstrato
- Permite instanciar múltiplas instâncias de uma abstração
\pause Classe é o tipo abstrato
- Definem famílias de abstrações relacionadas
- \pause Encapsulamento → esconder detalhes
- \pause Herança → novas abstrações são refinamentos
- \pause Vínculo dinâmico → nova abstração com comport. refinado
\pause Mas historicamente, como surgiu o paradigma OO?
Simula, 1960s → Centro de Computação Noruêgues
- Encapsulamento, herança, vínculo dinâmico de métodos
- Encapsulamento era fácil de ser quebrado
- \pause Autores: Ole-Johan Dahl, Kristen Nygaard
- ACM Turing Award, IEEE von Neumann Medal
\pause Smalltalk, 1970s
- Adota herança, dinamismo métodos e encapsulamento
- \pause Modelo de programação baseado em mensagens
- Ao invés de chamada de métodos a objetos
- Lento, embora flexível
\pause Soluções recentes
- C++, Ada95, Fortran2003, Python, Ruby, Java, C#
- Herança e vínculo dinâmico de métodos com
- Sintaxe e semântica imperativa “clássica” (C)
\pause Objective-C
- Como Smalltalk, mas com sintaxe alternativa
\pause OO em linguagens funcionais: CLOS (baseada em LISP), R
Tipo de dados de uma linguagem
- Definição de um tipo de dado pelo usuário
- Conjunto de operações sobre o tipo
Requisitos de linguagem
- Unidade sintática para encapsular a definição de tipo e operações
- Representação do tipo é escondida
- Separação entre declaração e definição?
- Como tornar visível a declaração do tipo abstrato
- Definição de mecanismos de controle de acesso?
(Nível de encapsulamento)
- Operações embutidas de atribuição e comparação
Questões de projeto
- Tipos abstratos de dados podem ser parametrizados?
- Qual a forma do container do tipo?
- Classe (OO), Módulo-tipo, Módulo
Uma Pilha
Operações
criar(pilha)
destruir(pilha)
vazio(pilha)
empilhar(pilha, elemento)
desempilhar(pilha)
topo(pilha)
Representação dos objetos do tipo é escondida
- Confiabilidade, legibilidade e redigibilidade
- Escopo reduzido → menos conflitos de nome
- Trocar a implementação sem trocar o código usuário
Mesma e única unidade sintática
- Método de organização do programa
- Facilita a modificação
- Compilação pode ser separada