Programação Funcional Contemporânea

MAC0434/MAC5765 - Tópicos em Sistemas de Computação - Segundo Semestre de 2009

Prof. Francisco Reverbel

. Informações Gerais
. Descrição
. Assuntos tratados em aula
. Trabalhos propostos
. Bibliografia
        
. Recursos adicionais na Internet
. Área da disciplina no Moodle
. Notícias e avisos
. Fórum de discussão

At work icon Esta página estará em permanente construção até o final do semestre...

Informações Gerais

. 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

Descrição

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):

Os pré-requisitos essenciais para esta disciplina são:

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.

Trabalhos Propostos

. Primeiro exercício-programa. Prazo: 23 de outubro.
. Segundo exercício-programa. Prazo: 27 de novembro.

Bibliografia

. 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.

Recursos Adicionais na Internet

. 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


Valid CSS! Valid XHTML 1.0! Last modified: Fri Dec 4 19:52:52 BRST 2009
Francisco Reverbel