LINGUAGENS DE PROGRAMAÇÃO
Curso de Graduação no DCC-UFMG
Prof:
Carlos Camarão de Figueiredo
Programa
Este semestre vamos ministrar um curso em um modelo radicalmente fora
do usual.
O curso será baseado em um projeto, a ser desenvolvido pelos
alunos, com orientação do professor, que
ministrará aulas, incentivará discussões e
indicará a bibliografia necessária para desenvolvimento
do projeto e entendimento dos conceitos fundamentais de linguagens de
programação modernas.
O projeto é descrito a seguir.
O objetivo não é, de forma alguma, finalizar o trabalho
ao término do curso, mas realizar estudos e contribuir com algo
de qualidade, que possa ser usado depois (no próprio curso ou em
cursos posteriores) por outros alunos. Qualidade. Não
necessariamente quantidade.
O Projeto
Vão existir na verdade dois projetos, cada um dos quais
consistindo em projetar, definir, usar e implementar uma
mini-linguagem de programação.
A primeira linguagem
A primeira linguagem deverá ser uma linguagem funcional, com as
seguintes características:
- A linguagem é estaticamente tipada;
- A linguagem é fortemente tipada (um erro de tipo nunca
pode ocorrer em tempo de execução);
- A linguagem possui um mecanismo de inferência de tipos:
não exige (de nenhuma forma, em nenhum lugar)
anotação de tipo;
- A linguagem não permite conversão
explícita de tipos ("type casting");
- O sistema de tipos da linguagem provê suporte a
polimorfismo paramétrico;
- A linguagem provê suporte a uma única
construção de declaração, além
da declaração de funções e constantes,
que permite:
- declaração de tipo de dados algébrico
("datatype");
- declaração de tipo sinônimo;
- declaração de tipo abstrato;
- declaração de módulo (lista de
declarações).
- O sistema de módulos da linguagem usa o conceito de
"módulos autônomos", baseado no uso de uma
cláusula na forma "assume ", ou "assume ", onde "interface" é um
"módulo de interface", que contém apenas
anotaçãoes de tipos, e é mais comumente
chamada na literatura de "módulo de
especificação". Não existem
cláusulas de importação de nomes (de outro
módulo).
A segunda linguagem
A seguna linguagem deverá ser uma linguagem orientada a
objetos, com as seguintes características:
- A linguagem é estaticamente tipada;
- A linguagem é fortemente tipada (um erro de tipo nunca
pode ocorrer em tempo de execução);
- A linguagem não permite conversão
explícita de tipos ("type casting");
- O sistema de tipos da linguagem provê suporte a
polimorfismo de inclusão (subtipagem), em que subtipos
são sempre subclasses;
- A linguagem prové suporte a classes e
funções parametrizadas por tipos ("templates");
- A instanciação de classes e
funções parametrizadas só é aceita se
todas as operações requeridas existirem (forem
definidas) para o tipo especificado na instanciação.
O trabalho será dividido em grupos, sendo que esses grupos
deverão ser subdivididos em subgrupos, a serem definidos pelos
alunos, em acordo com o professor.
Para cada uma das duas mini-linguagens, serão formados grupos
para tratar dos seguintes temas:
- Projeto e definição;
- Uso da linguagem;
- Implementação de um interpretador para essa
linguagem.
O segundo grupo (de implementação do interpretador)
poderá também decidir criar um subgrupo para implementar
um pequeno ambiente (com interface mais amigável) para uso da
linguagem.
Cada grupo e cada subgrupo terá um coordenador, que
coordenará o trabalho e fará relatórios
detalhando contribuições dos membros do seu grupo. Ele
atribuirá conceitos de participação aos membros
do grupo. Por sua vez, os membros atribuirão conceitos de
participação ao coordenador.
Avaliação
A avaliação será baseada no seguinte:
- 50 pontos de participação.
Serão consideradas positivamente as
contribuições de cada um no desenvolvimento do
trabalho (incluindo os estudos que realizou para poder fazer
essas contribuições), presença, cumprimento
de horários, interesse, esforço e
dedicação.
A nota de participação será atribuída
pelo professor, tendo como base os relatórios feitos e as
notas de participação atribuídas pelos
coordenadores.
Serão consideradas negativamente perguntas particulares
relativas a notas ao professor.
- 50 pontos de uma prova final, que basicamente
perguntará o que o aluno aprendeu com o seu trabalho
específico e o que aprendeu com os trabalhos de seus
colegas. Para isso, a prova pode e deve sugerir tópicos a
serem abordados. O aluno deverá demonstrar que participou
ativamente do trabalho, e está apto portanto a expor as
idéias que usou ou ajudou a usar para o desenvolvimento do
trabalho, assim como demonstrar que participou ativamente no
projeto e, portanto, conhece os conceitos principais dos
trabalhos desenvolvidos pelos demais alunos.
Bibliografia
Sobre Projeto e Definição de LPs
Sobre Haskell e Linguagens Funcionais
- Introduction to Functional Programming using Haskell, Richard Bird, Prentice Hall,
2 ed.
Vou usar esse livro para introduzir Haskell. Mas o livro do Simon Thompson também
é recomendado, e pode ser usado.
- Haskell: The Craft of Functional Programming , Simon
Thompson, Addison-Wesley, 1999, 2 ed.
A biblioteca e eu temos
apenas a primeira edição...
- The Haskell School of Expression: Learning Functional Programming through Multimedia,
Paul Hudak, Cambridge University Press, 2000.
- A página htpp://www.haskell.org tem bastante
informação sobre Haskell.
- Existem outras linguagens funcionais que "competem" (de alguma
forma, hoje em dia) com Haskell, como ML (SML) e Clean, sob as quais
existem livros e bastante material na Internet.
Sobre Java, C++ e Linguagens Orientadas por Objetos
- Programação de Computadores em Java , Carlos
Camarão e Lucília Figueiredo, LTC, 2002 (nas livrarias
e, claro, na biblioteca, a partir de alguma data em Novembro...).
- The Java Language Specification , James Gosling, Bill Joy, Guy
Steele Jr., disponível em http://www.java.sun.com/docs/books/jls/.
- The C++ Programming Language , Bjarne Stroustrup, Addison-Wesley, 2000.
Sobre Conceitos e Paradigmas de Programação
- Essentials of Programming Languages, Daniel Friedman,
Mitchell Wand, Christopher Haynes, MIT Press, 2001, 2 ed.
- Programming Language Pragmatics, Michael Scott, Morgan Kauffman, 1999.
- Programming Language Concepts and Paradigms, David Watt,
Prentice Hall, 1990.
Ementa
(ou: conceitos que os alunos devem aprender --- não
apenas superficialmente --- e exercitar)
- Estratégias de avaliação: preguiçosa
(lazy) e gulosa (aplicativa). Funções estritas e
não-estritas.
- Mecanismos de passagem de parâametros.
- Casamento de padrões, fun\ções de ordem
superior, currificação. Exemplos de
funções sobre listas e árvores.
- Tipos de dados: produto, soma (tipos algébricos), tipos
abstratos, tipos recursivos.
- Sistemas de tipos: polimorfismo paramétrico, polimorfismo
restrito (ad-hoc), polimorfismo de inclusão (subtipagem).
- Tratamento de exceções.
- Classes, objetos, subclasses, variáveis estáticas
(de classe) e de instâncias (objetos), métodos
estáticos (de classe) e de instâncias (objetos),
herança, subclasses, pacotes, interfaces, classes abstratas.
- Associação dinâmica de nomes a métodos
("dynamic binding").
Carlos Camarao de Figueiredo