Paradigmas de Programação

Segundo trimestre de 2009

Horário: 4ª 16-18, 6ª 14-16

Sala de aula: L 505 (4ª) / S 503 (6ª) (bloco B) NOTEM a diferença entre "S" e "L"! *** MUDOU!!!

Sala do professor: S 805 (bloco B)

Email do professor: jeronimo.pellegrini ufabc edu br

SOBRE A PROVA

Estudem os conceitos que vimos em aula: fechos, escopo de variáveis, mônadas, funções de alta ordem, macros, sincronização de processos! Releiam exemplos em Haskell e Scheme, e escrevam alguns programinhas em Scheme e haskell (se bem que em Haskell eu suponho que vocês já estejam fluentes, por causa do trabalho).

Novidades:

19/09 -- Conceitos finais
15/09 -- APRESENTAÇÕES DE TRABALHO ADIADAS (PARA SEXTA!)
14/09 -- Notas da prova
10/09 -- Comentários sobre a prova
04/09 -- Entrega de trabalho adiada; cronograma atualizado
03/09 -- Link para código do banco (Haskell e Common Lisp)
21/08 -- Link para tutorial de GLUT e OpenGL em Haskell (veja em ferramentas)
19/08 -- Sugestão de ferramenta (hlint)
18/08 -- Nova versão do labirinto.hs
02/08 -- Mais um tutorial de Haskell (Learn You a Haskell for Great Good)
02/08 -- Livro (How to Design Worlds) livre adicionado na bibliografia secundária
29/07 -- Lista 9 disponível
29/07 -- Código do gerador de labirintos disponível
28/07 -- Alguém produziu um cheatsheet para Haskell (um resumão; pode ser útil). Link adicionado.
08/07 -- Um livro de Scheme agora é livre (Simply Scheme)
01/07 -- Lista 8 disponível
19/06 -- Dois novos livros na biblioteca! (Dybvig e Hudak)
16/06 -- Lista 7 disponível
16/06 -- Lista 6 disponível
16/06 -- Indicação de tutorial curto sobre Scheme (SchemeFixnum)
11/06 -- Listas de exercícios 4 e 5 disponíveis
11/06 -- MUDANÇA: laboratório na quarta, teoria na sexta
02/06 -- Lista de exercícios 3 disponível

Ementa

Visão comparativa entre os paradigmas de programação. Paradigma funcional. Paradigma concorrente

Objetivo

Esta disciplina traz à atenção do aluno as diversas diferenças fundamentais entre grandes famílias de linguagens de programação, tanto em teoria como de forma prática. Esta visão tem efeitos importantes, nem sempre imediatamente perceptíveis: ao apreciar diversas técnicas de programação e mecanismos peculiares de linguagens de programação diferentes, o estudante expande seu leque de técnicas e rompe sua rigidez de concepção a respeito do que vem a ser programar. Além disso, há situações onde um paradigma se aplicará com mais sucesso do que outro. Pode-se sem dúvida afirmar que a programação em diferentes paradigmas auxilia na melhoria da qualidade da programação de forma geral.

Espera-se que o estudante se torne capaz de programar fluentemente em pelo menos uma linguagem dentre as escolhidas para exemplificar os diferentes paradigmas; que compreenda os fundamentos teóricos de cada paradigma de programação; que passe a conhecer diferentes mecanismos de funcionamento para as diferentes características de linguagens de programação (por exemplo passagem de parâmetros, vinculação de variáveis, tratamento de exceções e avaliação estrita ou preguiçosa); finalmente, que se torne capaz de utilizar seletivamente conceitos e técnicas de diferentes paradigmas e linguagens em outros, quando for conveniente.

Dinâmica do curso (IMPORTANTE!)

O curso aborda dois assuntos: um é "conceitos de linguagens de programação" e o outro é "programação em paradigmas diferentes".

Se tentássemos cobrir a parte teórica primeiro para depois iniciar o estudo dos paradigmas, acabaríamos tendo pouco tempo para que os novos conceitos e hábitos de programação se consolidassem. Por outro lado, precisaremos da teoria logo. Assim, intercalaremos aulas teóricas sobre linguagens de programação e aulas teóricas sobre programação funcional e concorrente. Usaremos principalmente Haskell, mas não apenas.

Passarei exercícios teóricos e de programação. Estes exercícios não "valem nota", mas recomendo muito fortemente que os façam, porque afetará muito o seu desempenho nas avaliações.

Avaliação

Há três notas:

Uma nota final será composta da seguinte forma:

N' = (P + 1.3 T1 + 0.7 T2)/3
N' = (P + 1.5 T)/2.5
Se P ≤ 4.0 OU T ≤ 4.0, então N = min(P,T). Caso contrário, N = N'. O conceito final na disciplina será dado por:

Possíveis trabalhos

Uma parte do jogo (um gerador de labirintos) foi feita em aula; a versão 0.4 está aqui.

O casador de padrões da última aula está aqui.

O banco está aqui, em Haskell, em Common Lisp e em Scheme.

Exercícios

  1. Problemas (NÃO exercícios) 13 e 16 do capítulo 1 e problemas 17 e 18 do capítulo 3 do livro do Sebesta
  2. Faça o exercício 2 do capítulo 2 e o exercício 6 do capítulo 3 do livro Sá/Silva
  3. Faça os exercícios 2, 4--6, 11--13, 15--18 do Sá/Silva
  4. Entenda como definir funções em Scheme (no livro do Dybvig, se bem que já vimos em sala), e construa alguns closures
  5. Entenda como definir funções em clojure (tem um tutorial lá). Monte alguns exemplos de chamada de função com escopo dinâmico.
  6. Uma lista para se acostumar um pouco com Scheme:
  7. Implemente em Haskell um jogo de vinte-e-um (também conhecido como Blackjack). O computador é a banca, e ai dando pares de cartas: um para o usuário, e um para si, até que alguém estoure ou o usuário diga que quer parar. Não precisa implementar todas as regras do jogo; é apenas um exercício de programação. :-)
    Dicas:
  8. Faça os exercícios do capítulo 3 do "Real World Haskell"
  9. Pegue o programa que monta labirintos e desenhe um grafo mostrando que funções chamam outras, e identifique no grafo as funções puras e impuras. Como comentei em aula, teria sido melhor se o gerador de números aleatóreos fosse inicializado na função main. O que mudaria se isso fosse feito? Tente implementar a mudança
  10. Altere o programa que simula o banco:

Notas

   
          prova   trabalho     N  conceito
-------------------------------------------
Claudio     4.0        0.0   0.0         F
Fernando    9.5        9.5   9.5         A
Pierre      1.5        0.0   0.0         F
-------------------------------------------

Programa aproximado

Este programa está sujeito a mudanças simples. Grandes mudanças não devem acontecer.

Candidatos a aulas reserva (se não forem usadas para repor aulas perdidas ou por algum outro motivo). Os itens marcados com (*) são os que eu acho mais interessantes:

Bibliografia e ferramentas

Ferramentas

IMPORTANTE: eu recomendo fortemente que vocês façam os trabalhos com as implementações abaixo, usando Linux. Se não fizerem, pelo menos testem periodicamente nestas implementações e em Linux, porque é o que eu usarei para avaliar os trabalhos.

Bibliografia Principal

Secundária

Outras coisas importantes