Paradigmas de Programação

Segundo quadrimestre de 2010
Horário: 3a (14:00-16:00) e 5a (16:00-18:00)
Sala de aula: L502 (3a) S502 (5a) (não confunda L com S!)
Professor: Jerônimo C. Pellegrini
Sala do professor: S 805 (bloco B)
Email do professor: jeronimo.pellegrini ufabc edu br

Prova II

Para ver a prova II, apareça na segunda que antes das 16:00.

Novidades:

24/08 -- Conceitos finais disponíveis
22/08 -- Link para pool.scm
20/08 -- Conceitos após T2 disponíveis (agora falta o trabalho II)
18/08 -- Notas de aula atualizadas (v.27)
15/08 -- Notas de aula atualizadas (v.26)
14/08 -- Notas de aula atualizadas (v.25)
13/08 -- Notas de aula atualizadas (v.24)
08/08 -- Conceitos após T1 disponíveis
08/08 -- Notas de aula atualizadas (v.23)
03/08 -- Interpretador metacircular disponível (COM suporte a fechos)
30/07 -- Notas de aula atualizadas (v.22)
30/07 -- Especificação do trabalho II/web server
29/07 -- Notas de aula atualizadas (v.21)
29/07 -- Notas de aula atualizadas (v.20)
29/07 -- Notas de aula atualizadas (v.19)
29/07 -- Web com pool de threads consertado (estava errado);
         agora também usa fechos, e o pool está separado do resto
27/07 -- Instrucoes de instalacao do Gambit e Termite atualizadas
         (faltava dizer que precisa configurar o PATH)
27/07 -- Conceitos da P1
27/07 -- Notas de aula atualizadas (v.18, somente mudanças estéticas)
26/07 -- Outro programa exemplo: servidor web com pool de threads (de brinquedo); 
         (144 linhas de Scheme, sem contar queue.scm e semaforo.scm)
25/07 -- Um programinha de exemplo para a próxima aula (http-termite)
24/07 -- Instruções de instalação para Gambit e Termite
24/07 -- Notas de aula atualizadas (v.17)
24/07 -- Descrição PRÉVIA do T2 disponível
23/07 -- T1 adiado para próxima terça 27/07
23/07 -- OpenAL funciona sim! (Mudei instruções no wiki do Chicken)
           (Faltava (require-extension al alc) antes de usar.)
22/07 -- Notas de aula atualizadas (v.16)
21/07 -- Mais programas da próxima aula disponíveis (o servidor web)
19/07 -- Notas de aula atualizadas (v.15)
16/07 -- Exemplo de prova
15/07 -- Notas de aula atualizadas (v.14)
14/07 -- Notas de aula atualizadas (v.13)
14/07 -- Tutorial sobre FFI no Chicken atualizado
14/07 -- Google Android rodando código Scheme -- feito pelo Google!
11/07 -- Notas de aula atualizadas (v.12)
10/07 -- Notas de aula atualizadas (v.11)
10/07 -- Notas de aula atualizadas (v.10)
09/07 -- Notas de aula atualizadas (v.9)
08/07 -- Versão 16 do tutorial de Emacs Lisp (não diretamente relacionado ao curso)
08/07 -- Programas da aula 10 (teórica) sobre semáforos disponíveis
04/07 -- Notas de aula atualizadas (v.8)
02/07 -- Parte dos programas da aula 09 (antes da aula!)
02/07 -- Notas de aula atualizadas (v.7)
02/07 -- Notícia: Google decide comprar ITA
29/07 -- Programas da aula 08 disponíveis
27/07 -- Quinta lista de exercícios
27/07 -- Arquivo de subsídios para T1 agora fala um pouco mais de TCP
27/07 -- Notas de aula atualizadas (v.6)
26/07 -- Quarta lista de exercícios
25/07 -- Instruções para fazer interface Scheme/C
24/07 -- Programas da aula 07 disponíveis
23/07 -- Notas de aula atualizadas (v.5)
21/07 -- Notas de aula atualizadas (v.4)
18/06 -- Programas da aula 06 (a *próxima* aula) disponíveis
18/06 -- Notas de aula atualizadas (v.3)
17/06 -- Programas da aula 05 disponíveis
17/06 -- Link para quadrinhos (XKCD), sobre Lisp
14/06 -- Notas de aula atualizadas (v.2)
14/06 -- Terceira lista revisada
12/06 -- Notas de aula (macros v.1) disponíveis
12/06 -- Notas de aula (primeira parte v.1) disponíveis!
11/06 -- Terceira lista de exercícios
11/06 -- aula04.scm revisado
10/06 -- Especificação do T1 pronta
10/06 -- Arquivo .scm com explicações e exemplos de TCP/threads/arquivos em Scheme para o trabalho
10/06 -- Programas da aula 04 disponíveis
10/06 -- aula03.scm tinha um erro em "faz-contador". Corrigido.
10/06 -- Data da P1 estava errada no site; corrigida
08/06 -- Programas da aula 02 (parte apenas) disponíveis (link notas de aula)
08/06 -- Programas da aula 03 disponíveis (no link para notas de aula)
08/06 -- Datas de provas e trabalhos definidas
02/06 -- Instruções de instalação do Chicken simplificadas. Me avisem se não funcionar!
02/06 -- Link para o unit tester do Chibi Scheme
02/06 -- Segunda lista de exercícios
28/05 -- Primeira lista de exercícios
25/05 -- Início do curso

Curiosidades e coisas relacionadas

Estes quadrinhos dão uma idéia de como programadores Lisp vêem sua linguagem:

A empresa americana ITA, especialista em informação sobre vôos, pode ser adquirida pelo Google. A ITA mantém um sistema grande e complexo escrito em Common Lisp; é um exemplo de história de sucesso de uma empresa que se manteve fora da "monocultura Java".

O App Inventor para o Android tem código Scheme! (Kawa):

"The compiler that translates the visual blocks language for implementation on Android uses the Kawa Language Framework and Kawa's dialect of the Scheme programming language, developed by Per Bothner and distributed as part of the Gnu Operating System by the Free Software Foundation."

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 Scheme, 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

O conceito final da disciplina poderá ser:

A avaliação ser composta de:

A avaliação final de cada aluno não será o resultado de alguma "conta" feita a partir dos valores das três avaliações. O resultado de cada avaliação reflete o desempenho do aluno em todo o curso até aquele instante, e não é apenas uma "nota isolada". Isso significa que cada avaliação leva em conta também o resultado das avaliações anteriores. De maneira simples, cada avaliação mostra qual seria o conceito final do aluno se o curso terminasse naquele instante.

Não há "prova substitutiva", porque tal conceito não faz sentido no sistema de avaliação descrito acima.

Veja alguns exemplo de questões de prova.

Trabalho I

Você pode escolher usar outro Scheme (recomendo Bigloo, Chibi, Guile, Gambit e Gauche -- ou SISC para quem faz questão de rodar sobre JVM) no primeiro trabalho, mas talvez eu não consiga ajudar tanto quando posso ajudar com o Chicken. (update: Chibi não, porque não tem ainda suporte a threads!)

O trabalho I é a implementação de um mundo virtual. Veja algumas coisas necessárias para fazer o trabalho.

Os programas não devem apenas "funcionar"; devem ser desenvolvidos no espírito de Programação Funcional. Algumas das coisas que vocês devem se lembrar:

Trabalho II

O trabalho II deve ser feito usando o Gambit Scheme.

Esta ainda NÃO é a descrição "oficial" do Trabalho II. Ainda preciso deixar arquivos com pedaços de programas para vocês usarem -- mas aí já dá para ter uma idéia de como será. Estes trabalhos não são difíceis.

O trabalho deve ser um dentre:

Exercícios

  1. Lista de exercícios 01. Para aplicar uma função fun com uma lista de argumentos args, use "(apply fun args)". Por exemplo,
          > (apply + '(1 1 2))
          4
        
    Se quiser conhecer um outro sistema de testes unitários em Scheme, veja o do Chibi Scheme naquele arquivo, da linha 5 até a 35). Ele usa macros, por isso pode ser um pouco estranho de entender por enquanto, mas a idéia é parecida com o que foi pedido no exercício.
  2. Lista de exercícios 02. Para aprender rapidamente sobre o case, mencionado em um dos exercícios, este blog post pode ajudar. O site com 99 exercícios mencionado na lista é este: 99 problemas para quem está aprendendo Lisp. Alguns problemas tem um link para resposta em Common Lisp (mas faça sua versão em Scheme); não formate seu código como aquele, fechando parênteses como se fossem chaves em C/Java! Faça como temos feito em sala de aula.
  3. Lista de exercícios 03. Não precisa usar make-circular no exercício 4.
  4. Lista de exercícios 04.
  5. Lista de exercícios 05. Na verdade implementar quote como macro não é tão fácil...

Conceitos

LEMBREM-SE: estes conceitos só mostram como vocês estão no curso até agora; o conceito final levará em conta todas as atividades e avaliações, e a evolução de cada um no curso!

   
RA        P1   após T1  após P2  após T2
11023206   C         C        C        B
11002206   B         C        C        C
11005607   B         B        B        B
11119208   B         A        B        A
11070307   C         C        F        F
11035906   B         B        B        B
11051208   A         A        A        A
11109708   F         C        C        C
11140208   C         B        C        C
11050008   F         C        B        B

Programa aproximado

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

 I - PROGRAMAÇÃO FUNCIONAL EM SCHEME
     Elementos básicos de Scheme
     Procedimentos
     Variáveis: ambientes, extensão e escopo
     Sistemas de tipos (estático/dinâmico; seguro/inseguro)
     Listas e vetores
     Fechos
     (POO com fechos)
     Metaprogramação
     Avaliação preguiçosa
     Streams (aplicação de av. preguiçosa)
     Continuações
     Aplicações de continuações: escape, multitarefa, backtracking, exceções
     (FFI)
     Modelos de gerenciamento de memória; coleta de lixo
II - PROGRAMAÇÃO CONCORRENTE
     Processos, threads e formas de concorrência
     Problemas inerentes à programação concorrente
     Memória compartilhada:
         Semáforos
         Monitores
         Memória Transacional
     Memória Distribuída:
         Passagem de mensagens síncrona: CSP
         Passagem de mensagens assíncrona: Actor model

Datas das avaliações:

Bibliografia e ferramentas

Links

Ferramentas

Usaremos no curso

Interessante, mas não essencial para o curso

Bibliografia Principal

Secundária

A bibliografia secundária contém obras que, embora relacionadas ao curso, não são diretamente usadas (ou são de difícil obtenção).

Outras coisas importantes

Aqui há outras coisas para quem se interessar (incluem-se aqui outros paradigmas, e não apenas o funcional).