Interpretação e Compilação de Linguagens

Objetivos

 

Saber

1.Conhecer a arquitetura e técnicas usadas no desenho e implementação de interpretadores, compiladores e sistemas de tipos

2.Conhecer os elementos base das linguagens de programação e a sua semântica

3.Definir linguagens de programação por composição de elementos fundamentais

Saber Fazer

4.Representar e manipular a sintaxe abstracta de uma linguagem como dados de um programa transformador

5.Descrever a semântica de linguagens através de interpretadores, compiladores e verificadores de tipos

6.Conceber e implementar compiladores para uma máquina virtual industrial

Competências complementares

7.Raciocinar sobre sistemas complexos a vários níveis de abstração

8.Propor e concretizar soluções gerais com base em princípios

 

Caracterização geral

Código

8152

Créditos

6.0

Professor responsável

Bernardo Parente Coutinho Fernandes Toninho, Carla Maria Gonçalves Ferreira

Horas

Semanais - 4

Totais - 52

Idioma de ensino

Inglês

Pré-requisitos

Conhecimentos de programação avançada. estruturas de dados e algoritmos

Bibliografia

- “Concepts in Programming Languages”, John C. Mitchell, Cambridge University Press. ISBN 0 521 78098 5 - “Essentials of Programming Languages”, Daniel Friedman, Mitchell Wand, Christopher Haynes, MIT Press. -- “Modern Compiler Implementation in Java” Andrew W. Appel, Cambridge University Press - “The Study of Programming Languages”, Ryan Stansifer, Prentice Hall International Edition.

Método de ensino

As aulas teóricas introduzem os vários tópicos centrais na unidade curricular como interpretação, técnicas de compilação de linguagens, representações intermédias, geração de parsers e lexers, análises semânticas.

As aulas de laboratório consistem na implementação de interpretadores e compiladores para pequenas linguagens, de forma incremental, culminando num projeto de maior dimensão.

Método de avaliação

A avaliação consiste de duas componentes: componente teórico-prática e componente prática.

A componente teórico-prática tem um peso de 70% na nota final e uma nota mínima de 9,5 valores, e consiste em dois testes com igual peso, ou um exame. Os testes e o exame são presenciais. Os testes e o exame é são sem consulta.

A componente prática tem um peso de 30% na nota final e uma nota mínima de 9,5 valores (frequência), correspondendo a um projeto de média dimensão de implementação de um interpretador e compilador para uma linguagem a apresentar durante o semestre. O projeto deve ser realizado em grupos de 2 alunos e as notas estão sujeitas a eventual discussão oral ou escrita. As discussões (para aferir o conhecimento que cada aluno tem sobre os trabalhos que entregou) são obrigatórias, presenciais e individuais. Regra geral, a nota de um aluno no trabalho é o mínimo entre a nota do trabalho (realizado em grupo) e a sua nota na discussão do trabalho (que é zero, se o aluno faltou).

Todas as notas são arredondadas às décimas, excepto a nota final que é arredondada às unidades.


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 interna a cada grupo. 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. 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.


Conteúdo

A.Princípios 1.Sintaxe das Linguagens de Programação 2.Semântica das Linguagens de Programação 3.Níveis de Interpretação (Interpretação, compilação e sistemas de tipos) B.Interpretação de Programas 1.Valores e Expressões: Definições e Ambiente 2.Estado e Referências: Modelo ambiente-memória 3.Abstração funcional: funções de primeira classe e ordem superior 4.Definições recursivas e ambientes circulares 5.Valores estruturados: registos e valores recursivos 6.Objetos e classes: representação de objetos usando registos e fechos C.Sistemas de Tipos 1.Princípios, objectivos e limitações da análise estática 2.Sistemas de tipos simples 3.Algoritmos de verificação e inferência de tipos D.Compilação de Programas 1.Arquitetura de um compilador 2.Ambientes de suporte à execução (máquinas de registos, pilha de avaliação, pilha de chamada) 3.Tradução de código dirigida pela sintaxe 4.Geração de código para uma máquina virtual industrial (CLR,Java Virtual Machine)

Cursos

Cursos onde a unidade curricular é leccionada: