Upload
gustavo-coutinho
View
54
Download
3
Embed Size (px)
Citation preview
Programa da disciplina
1. Análise Sintática e Léxica ✓2. Semântica Formal ✓3. Verificação e inferência de tipos ✓4. Teoria dos tipos ✓5. Paradigmas de Linguagens de
Programação
Conteúdo Programático
▪ Recapitulando...▪ Paradigma Imperativo▪ Paradigma Orientado a Objetos▪ Paradigma Funcional▪ Conclusão e Revisão▪ Exercícios!
Avisos
▪ Página da disciplina atualizada (notas de aula e descrição do trabalho final)!▫ http://ali.ifce.br/~gustavolgcr/lip
▪ Enviar membros dos grupos para o e-mail do professor▫ [email protected]▫ Grupos com 3 integrantes
Paradigmas de Linguagens de Programação
▪ Um paradigma é um padrão de raciocínio para resolução de problemas!
▪ A maioria das linguagens podem suportar mais de um paradigma.
▪ Cabe ao programador escolher o paradigma mais adequado ao seu problema.
Aula de hoje
Iremos abordar 3 dos paradigmas mais populares:▪ Paradigma Imperativo;▪ Paradigma Orientado a Objetos;▪ Paradigma Funcional.
▪ Na Segunda Guerra Mundial, a máquina ENIAC foi desenvolvida.
▪ Custos de manutenção e implementação eram muito altos!
Motivação
Paradigma Imperativo
John von Neumann reconheceu que um programa e suas variáveis podem residir na memória principal de um computador.▪ Nasce a arquitetura de von Neumann!
O Paradigma Imperativo é criado para dar suporte a essa nova arquitetura.
ProgramaVariáveis
Entrada Saída
Controle AritméticaLógica
Figura 1. O modelo computacional de John von Neumann.
Caracteristicas Principais: Paradigma Imperativo
Com a evolução do paradigma, uma linguagem imperativa suporta, dentre outras, as seguintes características comuns.
1. Atribuições, Declarações e Expressões;2. Estruturas de Controle;3. Abstração Procedural
Atribuições, Declarações e Expressões
No coração desse paradigma, temos a idéia de atribuição.▪ Alterar o valor de um local da memória e
destruir o valor anterior.
Declaração de variável▪ Nome a um local de memória▪ Tipo a valores armazenados
Interpretar expressões▪ Recuperar valores em um determinado
endereço de memória
Atribuições, Declarações e Expressões
● Nome: x● Tipo: Integer● Valor: 5● Posição: 89142
● Nome: z● Tipo: Integer● Valor: 1● Posição: 569111
● Nome: y● Tipo: Double● Valor: 7.56● Posição: 254896
Atribuição● x = 5● x = 17
Atribuições, Declarações e Expressões
Memória
Estruturas de controle
Comandos são executados na sequência em que aparecem na memória!- Condicionais podem selecionar caminhos alternativos durante a execução;- Laços repetem blocos de códigos utilizando testes ou iteradores como controle.
Abstração Procedural
No início do desenvolvimento de linguagens imperativas, o valor de funções reusáveis foi reconhecido.▪ A abstração procedural permite o
programador preocupar-se somente com a interface da função desejada.
Recapitulando...
1Baseado na arquitetura de John von Neumann.
2No coração desse paradigma, temos a idéia de atribuição.
3Comandos executados na ordem que aparecem na memória.
4Suporte a declaração de variáveis, condicionais, laços.
5Suporte a abstração procedural.
6Linguagens PopularesC, Ada e Java
Motivação
Vamos considerar um sistema implementado em uma linguagem imperativa que utilize a validação de um C.P.F. .
Motivação
▪ C.P.F. será sempre validado?
▪ Qual programador vai ficar responsável pela verificação?
▪ E se um novo desenvolvedor entrar?
▪ Precisamos conhecer o código inteiro internamente?
O problema do paradigma imperativo é que não existe uma forma simples para criar uma conexão forte entre dados e funcionalidades.
Paradigma Orientado a Objetos
A P.O.O. trata os programas como uma coleção de objetos que se comunicam passando mensagens, dados.▪ Concentra as responsabilidades nos
lugares certos;▪ Flexibiliza a aplicação;▪ Encapsula a lógica de negócios.
Classes e objetos
Vamos imaginar um sistema bancário.▪ A entidade principal desse sistema será a
CONTA bancária!Como generalizar as informações e funcionalidades de uma conta?
Classes e objetos
Informações▪ Número da conta▪ Nome do titular▪ Saldo▪ Limite
Atributos
Funcionalidades▪ Sacar valor▪ Depositar valor▪ Transferir valor▪ Imprimir saldo
Métodos
Conta
Número : 852369Cliente: LudmilaSaldo : R$1500,00Limite : R$100,00
Número : 741582Cliente: FernandaSaldo : R$2500,00Limite : R$200,00
Número : 564897Cliente: GilbertoSaldo : R$1000,00Limite : R$150,00
Figura 5. Projeto de uma conta bancária.
Conta
Número : 852369Cliente: LudmilaSaldo : R$1500,00Limite : R$100,00
Número : 741582Cliente: FernandaSaldo : R$2500,00Limite : R$200,00
Número : 564897Cliente: GilbertoSaldo : R$1000,00Limite : R$150,00
CLASSE OBJETO
Figura 6. Classe conta e alguns objetos.
Visibilidade e Ocultamento de Informação
Problema inicial▪ O que aconteceria se nosso sistema
tentasse fazer um saque de um valor que ultrapasse o valor do saldo?▫ Inconsistência no sistema!
▪ Como resolver?
Visibilidade e Ocultamento de Informação
A validação não deve ser controlada por quem utiliza a classe, mas sim por ela mesma.Para controlar a visibilidade de métodos e atributos, utilizamos modificadores de acesso.
Concentrar responsabilidades!
Visibilidade e Ocultamento de Informação
Existem 3 níveis principais de visibilidade (modificadores de acesso) entre classes e subclasses:▪ public: visível a todos,▪ protected: visível a subclasses,▪ private: visível a própria classe.
Encapsula a Lógica de Negócios!
Visibilidade e Ocultamento de Informação
Existem 3 níveis principais de visibilidade (modificadores de acesso) entre classes e subclasses:
private
protected
public
Herança
Outra entidade muito importante do nosso sistema bancário são os Funcionários.
E se quisermos modelar, em seguida, um Gerente? E um Diretor? Um Secretário?
Figura 8. Modelagem da Classe Funcionario e da Classe Gerente.
Poderíamos incluir as informações de Gerente em Funcionario?
Poderíamos...
Para solucionar esse problema, a Orientação a Objetos nos provê o conceito de Herança!
A classe filha vai herdar todos os atributos e métodos da classe mãe.
Herança
Funcionário
Gerente
Superclasse
Subclasse
Diretor Secretário
Subclasse Subclasse
Flexibilizar Aplicação!
Polimorfismo
O que guarda uma variável do tipo Funcionário?▪ Referência para um Funcionário.
Podemos nos referir a um Gerente como um Funcionário. ▪ Gerente É-UM Funcionário
Polimorfismo
double getBonificação()
Polimorfismo é a capacidade de um objeto poder ser referenciado de várias formas!
Funcionario
Secretário Gerente
É-UM É-UM
double getBonificação()
Interfaces
Imagine um Sistema Interno que autentica Gerente e Diretor.
Funcionario
Secretário Gerente
É-UM É-UM
Diretor
É-UM
Sistema Interno
Autentica
Autentica
Sistema Interno tem o seguinte método:
Interfaces
Funcionario
Secretário Gerente
É-UM É-UM
Diretor
É-UM
Sistema Interno
Autentica
Autentica
Interfaces
Sistema Interno tem o seguinte método:Funcionario
Secretário
GerenteDiretor
Sistema Interno
Funcionario Autenticável
É-UMÉ-UM
É-UM É-UM
Interfaces
Sistema Interno tem o seguinte método:Funcionario
Secretário
GerenteDiretor
Sistema Interno
Funcionario Autenticável
É-UMÉ-UM
É-UM
Cliente
É-UM
Interfaces
Qual o fator comum entre Diretor, Cliente e Gerente? O método Autentica!Precisamos de um contrato:contrato Autenticavel:
quem quiser ser Autenticavel, precisa saber fazer:▪ autenticar dada uma senha, devolvendo um
booleano
Interfaces
Funcionario
Secretário
É-UM É-UM
Diretor
É-UM
Sistema Interno
Autentica
Autentica
Autenticável
Cliente
Gerente
Recapitulando...
1P.O.O. trata os programas como uma coleção de objetos que se comunicam passando mensagens.
2No coração desse paradigma, temos o conceito de classes e suas instâncias, os objetos.
3Classes são compostas por informações, chamadas de atributos, e funcionalidades, chamadas de métodos.
4Atributos e métodos podem ter diferentes visibilidades com relação a outras classes.
5P.O.O. oferece conceitos de herança, polimorfismo e interfaces.
6Linguagens PopularesC++, Java e Python
Paradigma Funcional
Motivada pela necessidade de pesquisadores no desenvolvimento de I.A.▪ John McCarthy criou a linguagem Lisp
Computação é vista como uma função matemática mapeando entradas a saídas.▪ Não existe a noção de estado!
Em Programação Funcional, variáveis não variam! Veja os seguintes códigos:
Primeiros passos com Programação Funcional
Figura 11. Exemplo de variáveis no Paradigma Imperativo (esq.) e Funcional (dir).
Paradigma Funcional
Veremos algumas aspectos importantes do Paradigma Funcional.
1. Expressões Lambda;2. Funções e Listas;3. Recursões;4. Funções Preguiçosas.
Expressões Lambda (λ)
Expressão Lambda é a base do Paradigma Funcional.▪ Especifica os parâmetros e a definição de
uma função, mas não seu nome.Exemplo:
(λx⋅x*x) → ((λx⋅x*x)2) → 4
Funções e Listas
No coração desse paradigma, temos as funções. Mas como utilizá-las?Usaremos a linguagem Clojure como exemplo.▪ Dialeto da linguagem LISP,▪ Executada na Máquina Virtual Java (JVM).
Uma função de ordem superior é uma função que recebe funções como parâmetros ou que leva a função como resultado, ou ambos.
Exemplo: Função map
Funções e Listas
Funções recursivas e recursão de cauda
O uso de recursões para especificar repetições pode deixar programas muito lentos!Podemos sofrer com o empilhamento das funções.
Funções recursivas e recursão de cauda
fib(5)
fib(4)
fib(3)
fib(2)
fib(1)
Ramo da árvore de execução
Figura 13. Exemplo de função recursiva.
Funções recursivas e recursão de cauda
Recursão em cauda pode solucionar o problema.Se uma chamada recursiva em uma função é a última expressão na função, um compilador pode facilmente converter tal recursão em uma iteração.
Funções recursivas e recursão de cauda
Figura 14. Utilizando recursão em cauda na função de Fibonacci.
+=loop 1 2 3
loop 2 3 4
loop 3 5 5
fib(3) fib(2) fib(2) fib(1)
fib(2) fib(1)
fib(5) fib(4) fib(3)
COM cauda SEM cauda
Figura 14. Comparação entre a recursão COM cauda e SEM cauda.
fib(5)
Funções preguiçosas
Em linguagens funcionais, existe o conceito de função preguiçosa, a qual não é executada até ser pedido seu resultado.Permite a definição de estruturas de dados infinitas.
Recapitulando...
1Computação é vista como uma função matemática. A noção de estado não existe!
2Expressões Lambda é a base do Paradigma Funcional!
3Funções são o coração do paradigma, permitindo inclusive iterações através de recursão.
4Funções de ordem superior podem receber e retornar outras funções.
5Recursão em cauda tenta resolver o problema do empilhamento excessivo.
6Linguagens PopularesClojure, Scala e Java
Revisão
Paradigmas de Program.▪ Padrão de raciocínio
para resolver problemas;▪ Linguagens geralmente
suportam mais de um paradigma.
Paradigma Imperativo▪ Baseado na arquitetura
de John von Neumann;▪ No coração desse
paradigma, temos as atribuições.
Revisão
Paradigma Orien. a Obj.▪ Trata programas como
uma coleção de objetos;▪ Conceitos fundamentais:
classes e objetos.
Paradigma Funcional▪ Variáveis não variam;▪ Computações são vistas
como uma função;▪ Não existe a noção de
estado!
Conclusão
▪ Na aula de hoje, continuamos o estudo de Paradigmas de Programação.
▪ Os alunos devem entender bem os conceitos básicos dos principais paradigmas.
▪ Dessa forma, a migração para uma nova linguagem será mais suave.
Próxima aula
1. Paradigma Lógico;
2. Paradigma Concorrente;
3. Paradigma Orientado a Eventos;
4. Orientações sobre o trabalho final.
Exercícios
▪ Iniciaremos a lista de exercícios em sala de aula, agora.
▪ As questões que não forem resolvidas deverão ser entregues na próxima aula.
▪ Iniciaremos o próximo encontro com dúvidas sobre os exercícios.
Bibliografia
[BÁSICA]● TUCKER, A.; NOONAN, R. Linguagens de Programação: Princípios e Paradigmas. [S.I.]: AMGH
Editora, 2009.● SEBESTA, R. W. Conceitos de linguagens de programação. [S.I.]: Bookman Editora, 2009.
[COMPLEMENTAR] ● WATT, D. A. Programming language design concepts. [S.I.]: John Wiley e Sons, 2004.● VAN-ROY, P.; HARIDI, S. Concepts, techniques, and models of computer programming. [S.I.]: MIT
press, 2004.