Luís Caires
Esta cadeira tem como objectivo fornecer aos alunos um conhecimento sólido na área de fundamentos das linguagens de programação, mais concretamente, será efectuado um estudo sistemático dos conceitos sintácticos, semânticos e pragmáticos fundamentais relevantes.
Esta temática é central na ciência informática, pois identifica, força e disciplina a reflexão sobre os conceitos fundamentais relevantes, assim como na engenharia informática, pois lança pontes entre as linguagens de programacao, a sua pragmática, e os princípios subjacentes aos modelos de computação que estas linguagens pretendem capturar.
A metodologia seguida baseia-se no estudo rigoroso e frequentemente formalizado dos aspectos sintácticos e semânticos de várias linguagens minimalistas baseadas no cálculo lambda, sendo os vários conceitos introduzidos relacionados com as suas realizações em linguagens de programação concretas. O estudo semântico será baseado essencialmente em técnicas operacionais, envolvendo o estudo de modelos de implementação de linguagens e apelando para as noções intuitivas já conhecidas.
Os alunos adquirirão capacidade de analisar de forma objectiva linguagens de programação existentes ou a existir, capacidade de aprender novas linguagens de forma mais madura, acrescida capacidade de concepção e desenvolvimento de software. A disciplina fornece também uma conjunto de bases teóricas e metodológicas importantes para a cadeira de Compilação.
Introdução e panorâmica da cadeira. Sintaxe, semântica e pragmática. Sintaxe abstracta e Sintaxe concreta.
Introdução à semântica operacional natural. Sistemas de Post. Especificação da semantica operacional natural de uma linguagem de programação elementar usando sistemas de Post: linguagem de expressões aritméticas.
Memória, L-value, R-value, aliasing. Descricão semântica de uma linguagem imperativa elementar usando a técnica da semântica operacional natural.
Motivação. Porquê estudar uma linguagem minimal? O papel central do cálculo lambda nos estudo das linguagens de programação. Sintaxe do cálculo lambda. Variáveis livres e ligadas. Substituição. Avaliação de expressões. Redução Beta. Regras de avaliação. Poder expressivo. Representação de tipos de dados básicos (booleanos, inteiros, listas) e definições recursivas de funções numéricas. O cálculo lambda é uma linguagem de programação universal.
Funções, procedimentos e parâmetros. Representação da sintaxe abstracta de linguagens de programação com procedimentos e funções usando o cálculo lambda como notação auxiliar. Especificação da semântica operacional natural de uma linguagem imperativa com definição local de procedimentos e variáveis. Ambiente e Memória. Métodos de passagem de parâmetros: call-by-name , call-by-value e call-by-reference. Métodos de resolução de nomes: escopo estático e escopo dinâmico.
Sempre que possivel, os conceitos serão discutidos e exemplificados usando linguagens em relação às quais já exista alguma familiaridade: Pascal, ML, Smalltalk, C e C++ e Java. Serão também abordados algumas caracteristicas de outras linguagens actuais e históricas.
Resolução de exercicios teorico-práticos e pequenos exercícios de programação de interpretadores.