|
|
![]() |
Esta página estará em permanente construção até o final do semestre... |
Informações Gerais |
![]() |
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 |
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. 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):
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: 11 de setembro. |
![]() |
Segundo exercício-programa. Prazo: 16 de outubro. |
![]() |
Terceiro exercício-programa. Prazo: 13 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, 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. |
Recursos Adicionais na Internet |
![]() |
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 |