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
Para ver a prova II, apareça na segunda que antes das 16:00.
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
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."
Visão comparativa entre os paradigmas de programação. Paradigma funcional. Paradigma concorrente
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.
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.
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.
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:
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:
> (apply + '(1 1 2)) 4Se 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.
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
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:
$ echo "(+ 1 2 3)" > /dev/schemix $ cat /dev/schemix 6Infelizmente, o desenvolvimento foi descontinuado.
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).
Aqui há outras coisas para quem se interessar (incluem-se aqui outros paradigmas, e não apenas o funcional).