Linguagens e Paradigmas de Programa§£o

Preview:

Citation preview

Universidade Federal do AmazonasDepartamento de Ciência da ComputaçãoIEC481 – 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

Recommended