Paradigmas de Linguagens de Programação Augusto Sampaio [email protected] http://www.cin.ufpe.br/~acas Recife, primeiro semestre de 2015 Objetivos Análise crítica de paradigmas e linguagens de programação: • Visão geral dos paradigmas imperativo, orientado a objetos e funcional • Discutir alternativas de projeto de linguagens • Estudo de linguagens através de ambientes de execução (interpretação) Tópicos a serem apresentados • Visão geral de linguagens e paradigmas • Uma linguagem de expressões e sua implementação em Java • Introdução à programação funcional • Implementando funções • Uma linguagem de comandos Tópicos a serem presentados • Implementando estruturas de controle, I/O e atribuição • Procedimentos e passagem de parâmetros • Implementando procedimentos • Tipos abstratos de dados • Implementando tipos abstratos de dados e classes • Implementando subtipos e herança • Outros conceitos e paradigmas apresentados nos projetos Metodologia de Ensino • A ênfase do curso é em conceitos • Java será utilizada como uma ferramenta prática de apoio – para ilustrar o paradigma OO – como meta-linguagem para construir interpretadores • Os conceitos estudados serão sedimentados através da implementação incremental de construções de linguagens dos diversos paradigmas Avaliação • 2 projetos em equipe (de até 3 pessoas) a serem realizados durante o decorrer do curso, ou um único projeto de maior complexidade • Prova explorando aspectos conceituais e de implementação das construções • Os projetos valem 50% e a prova 50% da média final Bibliografia – Conceitos e Paradigmas de Programação via Projeto de Interpretadores. Augusto Sampaio e Antônio Maranhão – Programming Language Design Concepts, David Watt and W. Findlay, John Wiley & Sons • Programming Language Concepts and Paradigms, David Watt, Prentice Hall – Programming Language, An Interpreter-Based Approach, Samuel Kamin, Addison Wesley – http://www.mozart-oz.org/ – Concepts, techniques and models of computer programming, Peter Van Roy and Seif Haridi – Introduction to Functional Programming, R. Bird and P. Wadler, Prentice Hall – Seu livro favorito sobre Java (Java 1.5 ou posterior) Visão Geral de Linguagens e Paradigmas de Programação O que caracteriza uma Linguagem de Programação? • Gramática e significado bem definidos • Implementável (executável) com eficiência ‘‘aceitável’’ • Universal: deve ser possível expressar todo problema computável • Natural para expressar problemas (em um certo domínio de aplicação) Aspectos do estudo de linguagens • • • • Sintaxe: gramática (forma) Semântica: significado Pragmática (ex.: metodologias) Processadores: compiladores, interpretadores, editores, ambientes visuais ... Por que tantas linguagens? • • • • Propósitos diferentes Avanços tecnológicos Interesses comercias Cultura e background científico O que é um paradigma de programação? • Modelo, padrão ou estilo de programação suportado por linguagens que agrupam certas características comuns • A classificação de linguagens em paradigmas é uma conseqüência de decisões de projeto que impactam radicalmente a forma na qual uma aplicação real é modelada do ponto de vista computacional O Paradigma Imperativo • Programas centrados no conceito de um estado (modelado por variáveis) e ações (comandos) que manipulam o estado • Paradigma também denominado de procedural, por incluir subrotinas ou procedimentos como mecanismo de estruturação • Primeiro paradigma a surgir e ainda é o dominante Modelo Computacional do Paradigma Imperativo Entrada Programa Estado Saída Vantagens do modelo imperativo • Eficiência (embute modelo de Von Neumann) • Modelagem “natural” de aplicações do mundo real • Paradigma dominante e bem estabelecido Desvantagens do paradigma imperativo • Relacionamento indireto entre E/S resulta em: – difícil legibilidade – erros introduzidos durante manutenção – descrições demasiadamente operacionais focalizam o como e não o que O Paradigma Orientado a Objetos • Não é um paradigma no sentido estrito: é uma subclassificacão do imperativo • A diferença é mais de metodologia quanto à concepção e modelagem do sistema • A grosso modo, uma aplicação é estruturada em módulos (classes) que agrupam um estado (atributos) e operações (métodos) sobre este • Classes podem ser estendidas e/ou usadas como tipos (cujos elementos são objetos) Modelo Computacional do Paradigma Orientado a Objetos Entrada Entrada Programa Programa Saída Estado Estado Entrada Entrada Programa Programa Saída Estado Estado .. . .. . Saída ... Entrada Programa Estado .. . Saída Saída Vantagens do Paradigma Orientado a objetos • Todas as do estilo imperativo • Classes estimulam projeto centrado em dados: modularidade, reusabilidade e extensibilidade • Aceitação comercial crescente Problemas do Paradigma OO • Semelhantes aos do paradigma imperativo, mas amenizadas pelas facilidades de estruturação O Paradigma Orientado a Aspectos • Não é um paradigma no sentido estrito • A diferença é mais de metodologia quanto à concepção e modelagem do sistema • É uma nova forma de modularização: – Para “requisitos” que afetam várias partes de uma aplicação O Paradigma Orientado a Aspectos • A grosso modo, uma aplicação é estruturada em módulos (aspectos) que agrupam pontos de interceptação de código (pointcuts) que afetam outros módulos (classes) ou outros aspectos, definindo novo comportamento (advice) • Aspectos podem ser estendidos e/ou usados como tipos Modelo Computacional do Paradigma Orientado a Aspectos Entrada Entrada Aspecto Programa Programa Saída Estado Estado Entrada Entrada Programa Programa Saída Estado Estado .. . .. . Saída ... Entrada Programa Estado .. . Saída Aspecto Saída Vantagens do Paradigma Orientado a Aspectos • Todas as do paradigma OO • Útil para modularizar conceitos que a Orientação a Objetos não consegue (crosscutting concerns) – Em especial, aqueles ligados a requisitos não funcionais • Aumenta a extensibilidade e o reuso Problemas do Paradigma Orientado a Aspectos • Semelhantes aos do OO • Ainda é preciso diminuir a relação entre classes e aspectos • Problemas de conflito entre aspectos que afetam a mesma classe O Paradigma Funcional • Programas são funções que descrevem uma relação explícita e precisa entre E/S • Estilo declarativo: não há o conceito de estado nem comandos como atribuição • Conceitos sofisticados como polimorfismo, funções de alta ordem e avaliação sob demanda • Aplicação: prototipação em geral, IA, concorrência, core de várias soluções ... Modelo Computacional do Paradigma Funcional Entrada Programa Saída Visão Crítica do Paradigma Funcional • Vantagens Manipulação de programas mais simples: - Prova de propriedades - Transformação (exemplo: otimização) - Concorrência explorada de forma natural • Problemas “O mundo não é funcional!” Implementações ineficientes Mecanismos primitivos de E/S e formatação O Paradigma Lógico • Programas são relações entre E/S • Estilo declarativo, como no paradigma funcional • Abstração: não determinismo • Na prática, inclui características imperativas, por questão de eficiência • Aplicações: prototipação em geral, sistemas especialistas, banco de dados, ... Modelo Computacional do Paradigma Lógico Entrada Programa Saída Visão Crítica do Paradigma Lógico • Vantagens Em princípio, todas do paradigma funcional Permite concepção da aplicação em um alto nível de abstração (através de associações entre E/S) • Problemas Em princípio, todos do paradigma funcional Linguagens usualmente não possuem tipos, nem são de alta ordem Outros “Paradigmas” • • • • Agentes Linguagens de domínio específico ... Desenvolvimento baseado em componentes? Linhas de produtos de software? • Desenvolvimento de sistemas de sistemas? – Paradigmas de desenvolvimento, não de programação Tendência: integração de paradigmas • A principal vantagem é combinar facilidades de mais de um paradigma, aumentando o domínio de aplicação da linguagem • Exemplos: linguagens lógicas ou funcionais com o conceito de estado e comandos • A integração deve ser conduzida com muita cautela, para que não se viole os princípios básicos de cada paradigma. Outras Classificações • Linguagens de 1a., 2a., 3a. 4a. e 5a. gerações • Programação seqüencial versus concorrente • Programação linear versus programação visual (visual programming) • Metaprogramação e reflexão • Linguagens de script • ... Um breve histórico 1950........................................................................................................ FORTRAN 1960.......................ALGOL-60...........COBOL......LISP......................... SIMULA ALGOL-68 PL/I BASIC 1970..................Pascal............................................................................ Smalltalk C PROLOG Modula-2 ML 1980....................Ada...........DBASE-II.................................................. Miranda Eifell C++ 1990.....................................................................Haskell..........Godel... CommonLISP Erlang F# Delphi Java Python Ruby Lua 2000...C#.............................................................................................. Orientado a objetos Imperativo Funcional Lógico Um breve histórico • Para mais detalhes, inclusive de versões das linguagens: – http://www.levenez.com/lang/ Evolução centrada em níveis crescentes de abstração • Linguagens de máquina – Endereços físicos e operation code • Linguagens Assembly – Mnemônicos e labels simbólicos • Linguagens de “alto nível” – Variáveis e atribuição (versus acesso direto à memória) – Estruturas de dados (versus estruturas de armazenamento) Evolução centrada em níveis crescentes de abstração – Estruturas de controle (versus jumps e gotos) – Estrutura de blocos como forma de encapsulamento – Generalização e parametrização (abstração de tipos de valores) – Classes, processos, aspectos, ...