Universidade Federal do Amazonas Departamento de Ciência da Computação IEC481 Projeto de Programas Linguagens e Paradigmas de Programação Professor: César Melo Slides baseados em materiais preparados pelo Prof. Horacio Fernades, Prof. João Marcos e pela Profa. Rosiane Freitas.
Fatos das nossas vidas... Cite algumas Linguagens de Programação C, C++, Java, Perl, Python, Bash, Prolog, Pascal, Basic, Fortran, COBOL, ASM, Lisp, Haskell, Modula-2, Oberon, C#, PL/1, Ada, Smalltalk, Símula, Algol, Eiffel, Scheme,CLOS, Maude, Glass, Holo,... Mas porque tantas linguagens? Propósitos diferentes Avanços tecnológicos Interesses comerciais Cultura e background científico
Linguagens de Programação E o que é uma Linguagem de Programação? Sintática: Uma linguagem de programação é uma notação utilizada pelo programador para especificar ações a serem executadas por um computador. Semântica: Uma linguagem de programação compreende um conjunto de conceitos que um programador usa para resolver problemas de programação.
Linguagens de Programação Critérios de Avaliação de uma LP Legibilidade Simplicidade Expressividade Ortogonalidade Confiabilidade Portabilidade
Critério: Legibilidade Facilidade de ler e escrever programas Legibilidade influi: desenvolvimento e depuração de programas manutenção de programas desempenho de equipes de programação Fatores que melhoram a legibilidade: abstração de dados comandos de controle modularização de programas documentação convenções léxicas, sintaxe e semântica exemplo em Java: nomes de classes iniciam por letra maiúscula, nomes de atributos usam letras minúsculas
Critério: Simplicidade Representação de cada conceito seja simples de aprender e dominar Simplicidade sintática exige que a representação seja feita de modo preciso, sem ambigüidades contra-exemplo: A++; A=A+1; A+=1; ++A. Simplicidade semântica exige que a representação possua um significado independente de contexto contra-exemplo: private: B b; class B: private A
Critério: Expressividade Representação clara e simples de dados e procedimentos a serem executados pelo programa Exemplo: tipos de dados em Pascal Expressividade x concisão Muito concisa: falta expressividade? Muito extensa: falta simplicidade? Linguagens mais modernas Incorporam apenas um conjunto básico de representações de tipos de dados e comandos Aumentam o poder de expressividade com bibliotecas de componentes Exemplos: Pascal, C++ e Java
Critério: Ortogonalidade Possibilidade de combinar entre si, sem restrições, os componentes básicos da LP Exemplo: permitir combinações de estruturas de dados, como arrays de registros Contra exemplo: não permitir que um array seja usado como parâmetro de um procedimento Componente de primeira ordem: pode ser livremente usado em expressões, atribuições, como argumento e retorno de procedimentos
Critério: Portabilidade Multiplataforma Capacidade de um software executar em diferentes plataformas sem a necessidade de maiores adaptações Sem exigências especiais de hardware/software Exemplo: aplicação compatível com sistemas Unix e Windows Longevidade ciclo de vida útil do software e o do hardware não precisam ser síncronos; ou seja, é possível usar o mesmo software após uma mudança de hardware
Critério: Confiabilidade Mecanismos que facilitem a produção de programas que atendam às sua especificações Tipagem forte: o processador da linguagem deve assegurar que a utilização dos diferentes tipos de dados seja compatível com a sua definição evitar que operações perigosas, tal como aritmética de ponteiros, seja permitida Tratamento de exceções: sistemas de tratamento de exceções permitem construir programas que possuam definições de como proceder em caso de comportamento não usual possibilitem tanto o diagnóstico quanto o tratamento de erros em tempo de execução
Evolução de Linguagens de Programação Década de 70: Programação Estruturada Abstração de dados: definição de tipos Abstração de controle: comandos, procedimentos Inicia preocupação com programação em larga escala: módulos e programação estruturada Exemplos de linguagens populares: Uso acadêmico: Algol (algoritmos), Pascal (tipos de dados) Uso comercial: Cobol (arquivos), PL/I (uso amplo)
Evolução de Linguagens de Programação Década de 80: modularização Ênfase em mecanismos de LP e abstrações Correção de programas: verificação de tipos, exceções Programação baseada em TADs; Exemplos de linguagens Uso acadêmico: Pascal / Modula-2 Programação de tempo real: Ada 83
Evolução de Linguagens de Programação Década de 90: base na estrutura Estruturação de dados: encapsulamento Estruturação da computação: classe Estruturação do programa: classes e objetos Programação para Internet: plataforma neutra Exemplos de linguagens Pascal / Delphi C / C++ Ada83 / Ada95 Java
Paradigmas de Programação O que é um Paradigma de Programação Modelo, padrão ou estilo de programação suportado por linguagens que agrupam certas características comuns. Diferem nos seguintes aspectos: Conceitos e abstrações usados para representar os elementos de um programa; A forma como a computação é realizada;
Paradigmas Paradigmas de Linguagens de Programação Imperativos; Declarativos; Orientada a Agentes; Baseada em Componentes; Programação paralela ; Orientada a funcionalidades(features); Funcional; Baseado em lógica; Baseado em aspectos; Outros...
Caracterizando Paradigmas Paradigmas imperativo (Como Fazer) Linguagens expressam sequências de comandos que realizam transformações sobre dados; Exemplos de linguagens: orientadas a procedimentos orientadas a objetos Baseado fortemente na arquitetura de Von Neuman (1947): memória; processador; dispositivos de entrada e saída. Primeiro paradigma a surgir e até hoje é o dominante.
O Paradigma Imperativo Um programa neste paradigma é uma seqüência finita de instruções (ou comandos) de três tipos: atribuição, controle de fluxo, ou entrada/saída de dados. Comandos de atribuição alteram o estado do programa.
O Paradigma Imperativo Exemplo: function fatorial (n: integer):integer; var fat: integer; begin fat := 1; while (n>1) do begin fat := fat * n; n := n 1; end; fatorial := fat; end;
O Paradigma Imperativo Exemplo:
O Paradigma Imperativo Vantagens Eficiência Paradigma dominante e bem estabelecido Método receita de bolo Desvantagens descrições demasiadamente operacionais focalizam o como e não o quê
Aperfeiçoando o Imperativo: TAD O que são Tipos Abstratos de Dados (TADs)? Conceito matemático que diz respeito a determinada entidade e às funções aplicadas sobre ela. Um TAD é definido pela sua funcionalidade: o que se pode fazer com ele, e não como ele está de fato implementado. Exemplo uma fila é um tipo abstrato de dados: pode-se inserir e retirar elementos de uma fila, verificar se a fila está cheia ou vazia, ou ainda contar quantos elementos estão nesta fila. A utilização da fila (por uma aplicação) através destas funções independe de como a fila está de fato implementado.
Aperfeiçoando o Imperativo: Programação Modular A programação modular implementa a noção de tipo abstrato de dados Implementação: encapsulamento de dados e funções na mesma unidade sintática o módulo A principal estrutura é um módulo, constituído de uma interface e de uma implementação A interface contém todos os elementos visíveis (importáveis) por outros módulos A implementação contém os elementos que devem ficar invisíveis e as implementações das funções e procedimentos do módulo Exemplos de linguagens: Ada (DoD-USA), Modula-2 (Nicklaus Wirth).
Aperfeiçoando o Imperativo: Programação Modular Exemplo: Fila
Aperfeiçoando o Imperativo: Programação Modular Exemplo: Fila
Programação Modular Principais características Encapsulamento de dados e de funções Restrições à visibilidade de constantes, variáveis e funções de um módulo Interface visível contém apenas a funcionalidade do módulo Separação do o que é feito do como é feito
Encapsulamento Encapsulamento é o agrupamento de idéias relacionadas em uma única unidade de programação Encapsulamento de código Funções e procedimentos (functions, procedures, routines) Encapsulamento de dados Vetores (arrays), registros (records, structs) Encapsulamento de dados + código Módulos (modules, packages), em programação modular Classes, em programação OO