Programação Funcional Contemporânea
MAC0434/MAC5765 - Tópicos em Sistemas de Computação - Segundo Semestre de 2009
Prof. Francisco Reverbel
 |
Esta página estará em permanente construção até o final do
semestre... |
 |
Horário:
quartas das 10:00 às 11:40, sextas das 8:00 às 9:40 |
 |
Local:
IME-USP, bloco B, sala 6 |
 |
Avaliação:
provas e trabalhos práticos
|
|
 |
Primeira prova:
21 de outubro |
|
 |
Segunda prova:
9 de dezembro |
MAC0434
(Tópicos em Sistemas de Computação) e MAC5765
(Tópicos em Sistemas de Computação I) são disciplinas que servem de
"guarda-chuva" para o estudo de tópicos avançados relacionados ao
desenvolvimento de sistemas de software numa variedade de áreas. No segundo
semestre de 2009, o assunto geral vai ser "Programação Funcional
Contemporânea". Estudaremos a programação funcional sob uma ótica
atual, trabalhando com linguagens recentes e tendo em vista dois campos de
aplicação que estão na ordem do dia:
(1) a utilização efetiva de máquinas multicore por programas
concorrentes, e
(2) a criação de aplicações distribuídas voltadas para a Web ou para
a Internet.
Embora a programação funcional exista há mais de cinco décadas (Lisp apareceu
em 1958), até pouco tempo atrás o uso desse paradigma de programação vinha se
mantendo relativamente baixo e restrito a ambientes acadêmicos. Hoje,
entretanto, o interesse por linguagens funcionais é crescente. Novas
linguagens funcionais têm atingido níveis surpreendentes de difusão e de
utilização fora da academia. O ressurgimento da programação funcional tem
várias razões. Uma delas é a popularização das máquinas multicore,
aliada à expectativa de que num futuro próximo nossos computadores pessoais
tenham um número ainda maior de núcleos: 8, 16, 32, ... Muitos pesquisadores
acreditam que o paradigma funcional (no qual as funções não tem efeitos
colaterais) é o mais adequado para a criação de programas que façam bom uso de
todos os núcleos de uma máquina multicore. Outra razão é o contraste
entre as construcões sucintas (porém extremamente poderosas!) das linguagens
funcionais e a verbosidade de linguagens como Java.
Nesta disciplina trabalharemos com as linguagens Erlang e Scala. A
primeira é uma linguagem funcional pura, dinâmica e com excelente
escalabilidade em situações de alta concorrência. A segunda
é uma linguagem híbrida, que dá suporte tanto ao paradigma funcional como ao
orientado a objetos e que favorece a sinergia entre esses dois paradigmas.
Scala tem um sistema de tipos estático, mas permite que boa parte das
declarações de tipos sejam omitidas em benefício da concisão (inferência de
tipos). O compilador Scala gera código que roda na JVM e interopera com
Java.
Tanto Erlang como Scala são empregadas por sistemas reais em ambientes de
produção. Erlang existe há mais tempo e possui uma extensa coleção de
bibliotecas e ferramentas para a construção de aplicações com qualidade e
escala industriais. Entre os projetos de software livre baseados em Erlang,
destacam-se o Yaws, que hoje é
possivelmente o servidor Web com melhor escalabilidade na presença de
alta concorrência, e o CouchDB, um
banco de dados distribuído, tolerante a falhas, orientado a documentos e
acessível por meio de uma API RESTful. Já a linguagem Scala, por ser
interoperável com Java, se beneficia do vasto conjunto de bibliotecas e
arcabouços disponíveis para o ambiente Java. Entre os casos de uso de Scala,
destacam-se o Lift, um arcabouço expressivo
e elegante para o desenvolvimento produtivo de aplicações Web, e a migração
do back end do Twitter de Ruby para Scala.
Ao longo do semestre cobriremos uma relação de tópicos que não está
completamente decidida, mas deve incluir os seguintes ítens (não
necessariamente nessa ordem):
- A linguagem Erlang:
- "Variáveis" com atribuição única (single assignment)
- Números, átomos, tuplas, listas, strings
- Casamento de padrões
- Módulos
- Funções
- Funções anônimas (funs)
- Processamento de listas
- Guardas (guards)
- Expressões case e if
- Exceções
- Built-in functions (BIFs)
- Programação concorrente em Erlang:
- O modelo de atores
- Primitivas de concorrência
- Tratamento de erros em programas concorrentes
- Programação distribuída em Erlang
- Primitivas de distribuição
- Bibliotecas para programação distribuída
- Exemplos de aplicações distribuídas
- A plataforma Erlang/OTP
- Programação de máquinas multicore em Erlang
- A linguagem Scala:
- Constantes, variáveis e funções
- Inferência de tipos
- Classes e objetos
- Tipos e operações básicas
- Objetos funcionais
- Funções e fechamentos (closures)
- Higher-order functions e abstrações de controle
- A hierarquia de classes Scala
- Traits
- Case classes e casamento de padrões
- Coleções
- Parametrização de tipos: variância, tipos covariantes e
contravariantes
- Membros abstratos
- Conversões implícitas e parâmetros implícitos
- Extratores
- Atores e concorrência em Scala
- O arcabouço Lift
Os pré-requisitos essenciais para esta disciplina são:
- maturidade em programação (o nível mínimo é o que se atinge em
MAC0122),
- conhecimentos de orientação a objetos (o nível mínimo é o que se atinge
em MAC0242)
e
- disposição para estudar e trabalhar bastante.
Note que não são necessários conhecimentos prévios de programação funcional e
sim de orientação a objetos. (A parte básica de orientação a objetos em Scala
será vista rapidamente, pressupondo-se que os conceitos subjacentes já foram
aprendidos.) Experiência com programação em Java é um pré-requisito desejável
(já que Scala é compatível com Java), porém não essencial.
Se você tem os pré-requisitos acima e não sabe ao certo se quer ou não quer
cursar esta disciplina, leia o artigo Welcome
to "The Functional Web", escrito por Steve Vinoski e recentemente
publicado na IEEE Internet
Computing. Esse artigo, curto (apenas 3 páginas) e fácil de ler,
contém uma excelente motivação para o estudo da programação funcional
contemporânea.
 |
Joe Armstrong, Programming
Erlang: Sofware for a Concurrent World.
Pragmatic Bookshelf, 2007.
|
 |
Martin Odersky, Lex Spoon e Bill Venners, Programming in
Scala: A Comprehensive Step-by-Step Guide. Artima Press,
2008.
|
 |
Steve Vinoski, Welcome to "The
Functional Web". In IEEE Internet Computing,
vol. 13, no. 2, pp. 104,102-103, March/April 2009.
|
 |
Erlang Programming Language, Official Website
|
 |
Getting
Started with Erlang
|
 |
Erlang
Reference Manual
|
 |
Joe Armstrong, Robert Virding, Claes Wikström e Mike Williams,
Concurrent Programming in Erlang, Second Edition.
Prentice-Hall, 1993.
|
|
Esse livro tem duas partes: a primeira é sobre a linguagem e a
segunda sobre aplicações. Toda a primeira parte está disponível
na Internet.
|
 |
Joe Armstrong,
Making
Reliable Distributed Systems in the Presence of Software
Errors.
Ph.D. Dissertation, Royal Institute of Technology, Stockholm, Sweden,
2003.
|
|
O capítulo 3 dessa dissertação descreve a linguagem Erlang de
um modo um pouco mais formal e preciso que os outros textos do
Armstrong.
|
 |
The Scala Programming Language
|
 |
The Lift Webframework
|
 |
Yaws - Yet Another Web Server
|
 |
The CouchDB Project
|
Last modified: Fri Dec 4 19:52:52 BRST 2009
Francisco Reverbel