Programação Funcional Contemporânea
MAC0434/MAC5765 - Tópicos em Sistemas de Computação - Segundo Semestre de 2011
Prof. Francisco Reverbel
 |
Esta página estará em permanente construção até o final do
semestre... |
 |
Horário:
terças das 16:00 às 17:40, quintas das 14:00 às 15:40 |
 |
Local:
IME-USP, bloco B, sala 6 |
 |
Avaliação:
provas e trabalhos práticos |
|
 |
Primeira prova:
18 de outubro |
|
 |
Segunda prova:
01 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. Como já
aconteceu nos dois oferecimentos imediatamente
anteriores dessas disciplinas, o assunto geral do segundo semestre de 2011
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, a migração
do back end do Twitter de Ruby para Scala, e a migração do Foursquare de
PHP para Scala/Lift.
A relação de tópicos que cobriremos ao longo do semestre está sujeita a
alterações, 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, Second Edition: A Comprehensive Step-by-Step Guide. Artima Press,
2010.
|
 |
Steve Vinoski, Welcome to "The
Functional Web". In IEEE Internet Computing,
vol. 13, no. 2, pp. 104,102-103, March/April 2009.
|
 |
MAC0434/MAC5764 -
Programação Funcional Contemporânea (2010)
|
 |
MAC0434/MAC5764 -
Programação Funcional Contemporânea (2009)
|
 |
Erlang Programming Language,
Official Website
|
 |
Getting
Started with Erlang User's Guide
|
 |
Erlang
Reference Manual User's Guide
|
 |
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: Thu Nov 10 02:30:53 BRST 2011
Francisco Reverbel