Linguagens e Ambientes de Programação
Objetivos
Saber
1. As origens e a estrutura das linguagens de programação (Cálculo Lambda, paradigmas, interpretadores e compiladores).
2. Conhecer os conceitos-chave de programação funcional, incluindo linguagens baseadas em expressões e tipos polimórficos.
3. Compreender e desenhar algoritmos recursivos, raciocínio indutivo e a sua correção.
4. O papel das funções de ordem superior e a sua importância na programação funcional.
5. Os princípios de modularidade, concorrência e gestão de estado na programação funcional.
6. Compreender as potencialidades de programação sem efeitos, a transparência referencial e estruturas de dados functionais.
Fazer
7. Implementar programas funcionais em OCaml, aplicando técnicas baseadas em computação sem efeitos e tipos polimórficos.
8. Escrever algoritmos recursivos e provar a sua correção utilizando raciocínio indutivo.
9. Usar funções de ordem superior, como a composição de funções e a avaliação parcial, em programação prática.
10. Trabalhar com dados estruturados (tuplos, listas, tipos algébricos) e iterar sobre estruturas de dados usando Map e Fold.
11. Decompor, Desenhar e implementar programas modulares e concorrentes, com estado, memoization e operações assíncronas.
Caracterização geral
Código
8147
Créditos
6.0
Professor responsável
João Ricardo Viegas da Costa Seco
Horas
Semanais - 5
Totais - 73
Idioma de ensino
Português
Pré-requisitos
A disponibilizar brevemente
Bibliografia
- "OCaml programming: Correct + Efficient + Beautiful" de Michael R. Clarkson et al.
Método de ensino
Nas aulas teóricas, os conceitos fundamentais da cadeira são transmitidos, exemplificados e discutidos. Cerca de metade dos conceitos são convenientemente introduzidos no momento do estudo de linguagens concretas (e.g. inferência de tipos em OCaml, programação baseada em protótipos). A outra metade dos conceitos é discutida de forma independente, recorrendo às linguagens anteriormente estudadas para efeitos de ilustração (e.g. ligações, sistemas de tipos, polimorfismo de acordo com a nomenclatura de Cardelli).
Nas aulas práticas, os alunos resolvem pequenos problemas onde aplicam os conceitos e técnicas estudados. Alguns desses problemas têm caráter teórico, mas a maioria são problemas de programação.
Os projetos da cadeira são realizados principalmente fora das aulas.
Método de avaliação
Componentes da Avaliação
A avaliação é constituída por duas componentes: a componente laboratorial e a componente teórico-prática.
Componente Laboratorial e Frequência
A componente laboratorial é composta por três trabalhos. Cada trabalho consiste no desenho, na implementação e validação de programas funcionais para resolver um conjunto de problemas dados, consiste ainda na elaboração de um relatório e na realização de uma discussão. Mesmo que as duas primeiras partes do trabalho (programas e relatórios) sejam realizadas em grupos de dois alunos; a discussão é individual. O processo de submissão e aceitação estará descrito em cada um dos enunciados.
As discussões (para aferir o conhecimento que cada aluno tem sobre os trabalhos que entregou) são obrigatórias, presenciais e individuais. A discussão de um trabalho consiste em fazer alterações ao código do trabalho entregue para que o novo programa resolva uma variante do problema original, definida no enunciado da discussão, que difere pouco do problema resolvido no trabalho. As notas das discussões e os respetivos critérios são os seguintes:
20: a alteração está globalmente certa;
16: a alteração está confusa ou muito incompleta, mas o caminho poderia ser aquele;
12: a alteração não está certa, havendo "algumas coisas bem e outras muito mal";
4: "não foi feita qualquer alteração" ou "as alterações feitas são ínfimas" ou "as alterações feitas não fazem sentido".
Regra geral, a nota de um aluno num trabalho é o mínimo entre a nota do trabalho que entregou (realizado em grupo) e a sua nota na discussão desse trabalho (que é zero, se o aluno faltou). A nota de um aluno num trabalho pode ser inferior à obtida pela regra anterior, caso o desempenho do seu colega de grupo na discussão de todos os trabalhos seja muito mau (avaliado com 4). Consequentemente, as notas dos dois elementos do grupo podem ser diferentes (e variam entre 0 e a nota do trabalho).
A nota da componente laboratorial (CompL) é a média das notas do aluno nos três trabalhos (P1, P2 e P3) com pesos 0.25, 0.25 e 0.5, respetivamente.
A fórmula é a seguinte:
CompL = 0.25 x P1 + 0.25 x P2 + 0.5 x P3.
Para obter frequência, é necessário que CompL >= 9.5 .
A discussão do primeiro trabalho é feita no dia do primeiro teste, e a discussão dos segundo e terceiro trabalho são efetuadas no dia do segundo teste.
Componente Teórico-Prática
A componente teórico-prática é composta por dois testes (no período de aulas) ou por um exame indivisível (na Época de Recurso). As três provas são individuais, presenciais, escritas e sem consulta. Não são permitidos dispositivos eletrónicos (e.g. calculadoras, telemóveis, smartwatches, tablets e portáteis).
Há pré-inscrição nos testes.
A nota da componente teórico-prática (CompTP) é a média ponderada das notas dos testes (T1 e T2) com os pesos 40% e 60% respetivamente, ou a nota do exame (Ex):
CompTP = 0.4*T1 + 0.6*T2 ou CompTP = Ex.
Para obter aprovação, é necessário que CompTP >= 9.5 .
Nota Final
A nota final (F) dos alunos com frequência é:
F = CompTP, se CompTP < 9.5 ;
F = 0.3 CompL + 0.7 CompTP, se CompTP >= 9.5 .
Todas as notas (P1, P2, P3, T1, T2, Ex, CompL e CompTP) são arredondadas às décimas, exceto a nota final (F) que é arredondada às unidades.
Frequência e Classificações Obtidas em Anos Anteriores
De acordo com o regulamento de avaliação em vigor, a frequência dos dois anos anteriores mantém-se tal como as suas classificações. Frequências mais antigas não são mantidas.
Consulta e Ferramentas de IA
A utilização de consulta na Internet e de ferramentas de IA (como, por exemplo, ChatGPT ou Copilot) é permitida nos projetos e exercícios da aula e proíbida nos testes escritos e discussões. O uso de ferramentas de IA têm de ser explicitamente referidas no código e relatório que for entregue. Considera-se que um aluno que use estas ferramentas durante a realização de um exercício de avaliação ou projeto e omita que as usou comete plágio.
Fraude e Plágio
As questões de fraude e plágio serão tratadas de acordo com o Regulamento de Avaliação de Conhecimentos da FCT NOVA.
Os alunos podem conversar com os colegas sobre os trabalhos e discutir soluções, mas não podem partilhar código (mesmo que sejam "poucas linhas") em nenhuma circunstância, oralmente ou por escrito. A escrita de código tem de ser uma tarefa individual ou interna a cada grupo, dependendo do elemento de avaliação a que se destina. Por exemplo, não é permitido mostrar código no ecrã, ditar código, enviar ficheiros com código nem colocá-los em sítios acessíveis a terceiros.
Parte-se do princípio do bom senso e que todos os intervenientes são pessoas razoáveis. Assume-se que quando os alunos trabalham em grupo, o fazem de forma justa e equilibrada, trabalho a trabalho. A contribuição de cada membro do grupo para o trabalho é da responsabilidade do grupo como um todo. Os vários trabalhos ao longo do semestre não têm que ser feitos sempre pelo mesmos grupos de alunos.
Resumidamente, considera-se que:
- um grupo que dá ou que recebe código comete fraude;
- um grupo em que só um dos membros trabalha comete fraude;
- os alunos que realizam o trabalho em grupos maiores, partilhando código, cometem fraude.
- A utilização de ferramentas de IA (como, por exemplo, ChatGPT ou Copilot) tem de ser explicitamente referida no código. Considera-se que um grupo que use estas ferramentas durante a realização de um trabalho e omita que as usou comete plágio.
Proibição de utilização de aparelhos electrónicos durante as provas de avaliação
Durante uma prova de avaliação, um estudante não pode ter junto a si dispositivos electrónicos com capacidade de acesso à internet ou ligação bluetooth (e.g. smartphones, smartwatches, smartglasses, tablets, laptops, etc), ainda que desligados. A violação desta regra implica a reprovação liminar na unidade curricular por exclusão e será comunicada à Comissão Científica do respectivo Curso.
Conteúdo
1. A história e a estrutura das linguagens de programação
1.1 As origens das linguagens de programação: O Cálculo Lambda
1.2 Os principais conceitos das linguagens de programação
1.3 Paradigmas de programação
1.4 Interpretadores e Compiladores (introdução)
2. Expressões, Valores, Funções e Tipos
2.1 A linguagem de programação OCaml
2.2 Linguagens de programação baseadas em expressões ou comandos
2.3 Valores e Tipos
2.4 Variáveis: (Matemáticas) variáveis (let) e funções (fun)
2.5 Tipos polimórficos e inferência de tipos
2.6 Funções de Biblioteca
2.7 Entrada/Saída
4. Recursão e Indução
4.1 Algoritmos recursivos sobre números naturais
4.2 Raciocínio indutivo
4.3 Correção do raciocínio indutivo
4.4 Tail recursion
4.5 Comparação com algoritmos imperativos
5. Funções de ordem superior e Composição
5.1 Funções como valores
5.2 Avaliação parcial
5.3 Composição de funções
3. Dados Estruturados
3.1 Tuplos e Listas
3.2 Tipos de Dados Algébricos
3.3 Tipos e Algoritmos indutivos
3.4 Utilizar Map e Fold para iterar sobre estruturas de dados
6. Módulos, Interfaces e Functores
6.1 O sistema de módulos OCaml
6.2 Mecanismos de modularidade em outras linguagens de programação
7. Estado, Assincronismo e Concorrência
7.1 O uso de estado na programação funcional
7.2 Memoization
7.3 Computação assíncrona e Entrada/Saída (Promises)
7.4 Programação concorrente em OCaml
8. Máquinas, Interpretadores e Compiladores
8.1 Máquinas baseadas em pilha e máquinas baseadas em registos
8.2 A estrutura das linguagens de programação
8.3 Composicionalidade de contruções semânticas
8.4 Interpretando e compilando funções