Programming Languages and Environments

Objectives

Knowledge:
 1 - Understand the characteristics and usage scenarios of a set of programming languages: Caml, C, JavaScript, Java.
 2 - Understand the functionality and the architecture of the environments for programming development and execution.
 3 - General understanding of all the issues involved from the specification to the execution of programs.

Skills:
 4 - Solve small, but characteristic, problems in the programming languages addressed in the course.
 5 - Identify common abstractions and the fundamental differences on how those abstractions are supported in different programming languages.
 6 - Express or approximate mechanisms available in a given programming language using another language that does not have them as primitive.

General characterization

Code

8147

Credits

6.0

Responsible teacher

João Ricardo Viegas da Costa Seco

Hours

Weekly - 5

Total - 73

Teaching language

Português

Prerequisites

Students should have completed the Introduction to Programming (Introdução à Programação) and the Object-Oriented Programming (Programação Orientada pelos Objectos) courses.

Bibliography

  • "OCaml programming: Correct + Efficient + Beautiful" de Michael R. Clarkson et al.

Teaching method

In the lectures, the concepts are presented, discussed and exemplified. Many of the concepts that appear in the syllabus are conveniently presented and discussed at the time of the study of specific languages (e.g. type inference in OCaml, prototype based programming). Other concepts are better discussed in an independent manner, making use of the previously studied languages for illustrative purposes (e.g. bindings, type systems, the polymorphism nomenclature of Cardelli).

In the lab classes, the students solve small problems, applying the concepts and techniques learned. Some of these problems are theoretical, but most are programming problems.

The projects are mainly developed outside the classes.

Evaluation method

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. As duas primeiras partes do trabalho (programas e relatórios) são realizadas em grupo de dois alunos; a discussão é individual.

Um grupo entrega um trabalho se o seu programa for aceite pelo sistema de avaliação automática adotado e o respetivo relatório for entregue dentro do prazo da forma prescrita no respectivo enunciado. As notas dos trabalhos aceites variam entre 10 e 20 valores. O sistema de avaliação automática será indicado no enunciado de cada trabalho.

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 das notas dos testes (T1 e T2) ou a nota do exame (Ex):

CompTP = (T1 + T2) / 2 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 anos anteriores mantém-se tal como as suas classificações.

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.

Subject matter

A – Programming and execution environments
Interpretation. Virtual Machines. Levels of interpretation. Compilation. Linking. Loading. Execution model. Portability. Security. Interoperability. Tools.

B – Procedural and functional languages
OCaml and C. Types: their role; type checking and inference; polymorphism; overloading; static and dynamic typing. Block structuring: bindings; environments; name resolution. Procedures and Functions: local and global names; parameterization; closures.

C – Object-oriented languages
JavaScript and Java. Classes and prototypes. Information hiding. Subtyping. Inheritance.

D – Scripting languages and domain-specific languages
JavaScript and Bash.

E – Programming techniques
Programming paradigms. Inductive method in OCaml. Handling pointers in C. Modeling in JavaScript. Introduction to client-side Web programming.

F - Introduction to web programming.
The HTTP protocol, forms, scripting, AJAX. The event model on the client-side and on the server-side.

G – Selecting a programming language
Factors to consider. Scenarios.

Programs

Programs where the course is taught: