220 likes | 342 Views
Estudo dos Conceitos e Paradigmas de Programação. Abordagem e Escopo. Estudo de linguagens e paradigmas através de ambientes de execução (interpretação) Implementação ( incremental ) de uma única linguagem: funcional, imperativa e OO
E N D
Abordagem e Escopo • Estudo de linguagens e paradigmas através de ambientes de execução (interpretação) • Implementação (incremental) de uma única linguagem: funcional, imperativa e OO • A modelagem dos interpretadores será um bom exemplo de projeto OO e um vasto exercício de Java
Abordagem e Escopo • A modelagem dos interpretadores inclui os seguintes aspectos: • Um parser realiza análise léxica e sintática e efetua a redução (conversão da sintaxe concreta em uma sintaxe abstrata modelada por classes em Java) • Métodos para análise semântica (verificação de tipos) • Métodos para avaliação e execução de expressões e comandos
A linguagem objeto de estudo • A linguagem será apresentada de forma incremental: • Expressões • Funcional • Imperativa • Funcional Imperativa • Orientada a Objetos • Funcional Imperativa OO
A linguagem objeto de estudo Expressão 1 Expressão 2 Funcional 1 Imperativa 1 Funcional 2 Imperativa 2 OO 1 Funcional Imperativa OO 2 Funcional Imperativa OO
Linguagem de Expressões 1 - LE1 • Inclui apenas constantes (valores) e operações sobre valores • Valores e operações sobre inteiros, booleanos e string são admitidos • Um programa é uma expressão
Linguagem de Expressões 2 - LE2 • Estende LE1 com identificadores (variáveis) que possuem um valor (constante) • Durante a verificação de tipos e interpretação surge a necessidade de um contexto: • mapeamento entre identificadores e tipos • mapeamento entre identificadores e valores • Na avaliação de uma expressão, a ocorrência de um identificador é substituída pelo valor associado ao identificador • Um programa é uma expressão
Linguagem Funcional 1 - LF1 • Estende LE2 com funções parametrizadas e recursivas • O corpo de uma função é uma expressão e a aplicação da função a um argumento retorna um valor • O contexto de execução inclui dois componentes: • mapeamento de identificadores em valores • mapeamento de identificadores (nomes de função) em definições de função • Um programa é uma expressão
Linguagem Funcional 2 - LF2 • Estende LF1 com funções de alta ordem • Uma função passa a ser um valor • O contexto de execução inclui um único componente: • mapeamento de identificadores em valores • Portanto, o resultado da avaliação de uma expressão pode ser uma função, uma função pode ser argumento de outra função, ... • Um programa é uma expressão
Linguagem Imperativa 1 - LI1 • Estende LE1 com identificadores (variáveis) e comandos de atribuição, entrada/saída e controle de fluxo • O contexto de execução inclui três componentes: • um mapeamento (dinâmico) de identificadores em valores • uma lista de valores de entrada • uma lista de valores de saída • Um programa é um comando
Linguagem Imperativa 2 - LI2 • Estende LI1 com procedimentos parametrizados e recursivos • O corpo de um procedimento é um comando e a chamada de um procedimento idem • O contexto também é estendido com: • um mapeamento de identificadores (nomes de procedimentos) em definições de procedimentos • Procedimentos não possuem o status de valor • Um programa é um comando
Linguagem Funcional Imperativa - LFI • Integra as linguagens LF2 e LI2 • Um programa é uma expressão ou um comando
Linguagem OO 1 - LOO1 • Estende LI2 com classes e objetos • Procedimentos passam a ocorrer exclusivamente como métodos das classes • O contexto também é estendido com: • um mapeamento de identificadores (nomes de classes) em definições de classes • Um programa é um comando
Linguagem OO 2 • Estende LOO1 com herança e subtipos • Procedimentos (métodos) podem ser redefinidos • O contexto também é estendido com: • uma estrutura para registrar a hierarquia de classes • Um programa é um comando
Linguagem Funcional Imperativa OO (LFIOO) • Integra as linguagens LF2 e LOO2 • Um programa é uma expressão ou um comando
Interpretando as Linguagens • Para cada linguagem foi construída uma BNF que define sua gramática • O projeto (OO) de cada interpretador: • Cada item da BNF é uma classe, interface ou classe abstrata de Java • A hierarquia da BNF é modelada através de herança e subtipos (extends e implements) • Classes adicionais são introduzidas para modelar estruturas internas do interpretador, como contexto • As BNFs e os interpretadores estão disponibilizados na homepage do curso
Apresentação da Linguagem de Expressões 1 - LE1 • http://www.cin.ufpe.br/~in1007
Exercícios • Estender a LE1 com ValorChar (caracter) e uma operação que retorna a ordem (ascii) do caracter • Implementar ValorReal e as operações aritméticas usuais sobre os reais • Implementar operadores relacionais como menor que, maior que, ..., para valores inteiros
Explorando Conceitos na LE1 • O componente mais básico é valor • Um valor é algo que pode ser avaliado, armazenado, incorporado em estruturas de dados, passado como parâmetro, retornado como resultado, ... • Ou seja, um valor é uma entidade que existe durante uma computação • Decidir que construções da linguagem têm o status de valor pode impactar radicalmente o poder de expressão da linguagem (ex. Funções como valor)
Explorando Conceitos na LE1 • É conveniente agrupar valores em tipos • Tipos são conjuntos de valores e operações associadas • Valores de um tipo devem exibir comportamento uniforme em relação às operações sobre o tipo • O conceito de tipos permite a definição de restrições contextuais que eliminam vários erros já durante uma análise estática (compilação) • LE1 agrupa valores em tipos e a verificação de tipos foi implementada
Explorando Conceitos na LE1 • Os tipos podem ser caracterizados como • Primitivos (booleanos, inteiros, reais, strings, ...) • Compostos (registros, vetores, listas, conjuntos, ...) • Recursivos (listas, árvores, ...) • LE1 inclui apenas valores de tipos primitivos • Valores compostos e recursivos serão introduzidos como exercício
Leitura • Programming Language Concepts and Paradigms • Seções 2.1, 2.2, 2.3 e 2.4