Paradigmas de Linguagens de Programação Introdução Professor: Armando Hage Belém-2008.
Transcript of Paradigmas de Linguagens de Programação Introdução Professor: Armando Hage Belém-2008.
Paradigmas de Linguagens de Programação
IntroduçãoProfessor: Armando Hage
Belém-2008Belém-2008
Resumo Objetivos Motivação Sintaxe e Semântica Processadores de
Linguagem Critérios para avaliação de
uma ling. de programação Conceitos de uma ling. de
programação Paradigmas Geração das Linguagens
de Programação
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)
Motivação
Linguagens de Programação são usadas continuamente por um analista de sistemas Projetos disciplinares Estágio Empresas (Novos ou antigos projetos) Pós-graduação
Existem dezenas de linguagens de programação Características diferentes
Motivação
Quais características de uma linguagem de programação são importantes para a aplicação?
Como comparar estas características? Qual linguagem usar? Como comparar diversas linguagens? Como estudar novas linguagens? Como projetar novas linguagens? Por que a linguagem X é usada na aplicação Y?
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)
Sintaxe e Semântica
A sintaxe de uma LP diz respeito à forma dos programas Como seus elementos (expressões, comandos, etc)
são organizados para formar um programa. A semântica de uma LP diz respeito ao significado dos
programas Como seus elementos se comportam quando são
executados nos computadores. Elementos aparentemente similares podem ter
semânticas diferentes! Elementos aparentemente distintos, podem te
semânticas equivalentes!
Sintaxe e Semântica
A sintaxe da LP influencia como os programas são escritos pelos programadores, lidos por outros e analisada pelo computador
Compiladores corrigem a sintaxe A semântica da LP determina como os programas
são compostos pelos programadores, entendidos por outros e interpretados pelo computador
Desentendimentos semânticos podem nos levar a produzir o programa errado ou com comportamentos indesejados e imprevisíveis.
Sintaxe e Semântica
A sintaxe pode ser descrita: Gramáticas: Extended Backus-Naur Form
(EBNF) Metamodelos
A semântica pode ser descrita: Denotacional Operacional Axiomática
Requisitos de uma LPRequisitos de uma LP
Uma LP para ser digna do nome tem que satisfazer alguns requisitos: Tem que ser universal – todo problema que pode ser
resolvido pelo computador tem que ter uma solução programável na LP
Tem que ser implementável num computador Tem que ser capaz de ter uma implementação
aceitavelmente eficiente
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
Processadores de Linguagens
Uma LP deve ser implementada através: Compilador – programa traduzido para linguagem de
máquina (C,Pascal,COBOL, Ada, etc.); Interpretador – programa fonte interpretado por outro
programa (interpretado) que entende o programa fonte (sh, awk, LISP, ML, PROLOG, Smalltalk, etc.);
Misto de ambos (Perl, Java, etc.) Compilação -> execução de programa rápida e não
requer máquina virtual acompanhando o código executável
Interpretação -> facilita depuração Ideal: ter uma implementação compilada e uma outra
interpretada.
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 Saída
Estado
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 Programa Saída
Estado
......
......
Estado
Entrada Programa Saída
Estado
Entrada Programa Saída
Estado
Entrada Programa Saída
Estado
Entrada Programa 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 Programa Saída
Estado
......
......
Estado
Entrada Programa Saída
Estado
Entrada Programa Saída
Estado
Entrada Programa Saída
Estado
Entrada Programa Saída
AspectoAspecto
AspectoAspecto
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 e IA
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 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
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.
Critérios para Avaliação de uma LP
Legibilidade Simplicidade Ortogonalidade Instruções de Controle Tipos de Dados e Estruturas Sintaxe
Capacidade de Escrita Simplicidade e Ortogonalidade Suporte para abstração Expressividade
Critérios para Avaliação de uma LP
Confiabilidade Verificação de tipos Manipulação de exceções Aliasing Legibilidade e capacidade de escrita
Custo Treinamento Escrita de programas Compilação Execução Sistemas de implementação Confiabilidade Manutenção
Conceitos de uma LP
Conceitos de uma LP
Quais características de uma linguagem de programação são importantes para a aplicação?
Como comparar estas características? Qual linguagem usar? Como comparar diversas linguagens? Como estudar novas linguagens? Como projetar novas linguagens? Por que a linguagem X é usada na aplicação Y?
Paradigma de programação
Paradigmas de Linguagens de Programação
Imperativo Procedural – Pascal, FORTRAN, COBOL, C, ADA Orientado a Objetos (Smalltalk, objectPascal, C++, Java)
Declarativo Funcional – LISP, ML Lógico – Prolog
Concorrente Paralelo – n processadores+1 memória (ADA, concurrent
Pascal); Distribuido - n processadores+m memórias (Java);
Paradigmas Hibridos OOLP, etc.
Gerações das LPs
Linguagens de Baixo Nível
X
Linguagens de Alto Nível
Linguagens de Programação
Linguagem de baixo nível– É a mais primitiva, podendo ser
executadas diretamente no Hardware.– O processo de conversão é chamado de montagem e é realizada por um programa Montador(Assembler)
– Ex:Assembly Language
Linguagens de Programação
Linguagem de alto nível– Foi um avanço significativo na comunicação com
os computadores, com menos instruções que as de linguagens de montagem.
– Idealizada para a resolução de problemas sem preocupações com o tipo de CPU, memória ou onde será executado.
– Comando- instruções específicas dadas pelo programador
– Ex.:FORTRAN,Pascal, Basic, C, C++, Java
Gerações das LPs
1ª GERAÇÃO - programação física, linguagens de máquina0010 0010 0001 0011 1000 0100 0010 0001 0001 0010 0101 0100 1000
2ª GERAÇÃO - Linguagens de baixo nível(Assembly, Autocoder) CLA C ADD D STO Y CLA A ADD B DIV Y STO X
Gerações das LPs
3ª GERAÇÃO - Linguagens de alto nível Científicas - FORTRAN, Algol Comerciais – COBOL Universais - PL/I, ADA Sistemas - Pascal, Modula 2, C, C++, Java Especiais - SIMULA, LISP, SNOBOL, PROLOG, APL,
RPG
Gerações das LPs
Montagem
Tradruz um programa em linguagem de montagem para um equivalente em linguagem binária
Código fonteCódigo ObjetoFunções
Substiuir os código de operações simbólicas e nomes simbólicos por valores numéricos
Reservar espaço na memória Examinar cada instrução
Fluxo do processo de montagem
Código Fonte
Código Objeto
Montagem Montador
Programa original
Programa Resultante
Compilação
É quando se converte para linguagem de máquina um programa escrito em uma linguagem de alto nível.
É o processo de análise de um programa fonte(código fonte) e sua conversão em um programa equivalente descrito em linguagem d máquina, o programa objeto(código objeto).
Diferente da Montagem por ser mais complexa e demorada.
Fluxo do processo de compilação
Código Fonte
Código Objeto
Compilação Compilador
Programa original
Programa Resultante
*Mais complexa e demorada, pode gerar várias instruções de *Mais complexa e demorada, pode gerar várias instruções de máquina em um único comandomáquina em um único comando
Ligação ou Linkedição
É util quando o programdor necessita codificar determinadas operações que já existem dentro do sistema operacional.Ex.:Operaçãoes de entrada e saída
O código é buscado onde estiver e incorporado ao programa.
Bibliotes (librarys)-Coleção de códigos objeto.Resulta em um conjunto de código de máquina,
interligados e prontos para funcionar chamados de módulos de carga ou código executável
Fluxo do processo de compilação e linkedição
Programa Fonte
Código Objeto
Compilação Compilador
Programainicial
Ligação
Código Executável
Ligador
Biblioteca C
Biblioteca B
Biblioteca A
Próxima Aula
Valores e Tipos
Valores e Tipos
Memória do computador É um espaço formado por bits, agrupados
em bytes dividido em unidades endereçáveis
2 UNIDADES: aritméticológica:contém instruções dados: contém valores
Valores
Um valor é um espaço de memória que pode ser: Avaliado Armazenado Incorporado Parâmetro de uma função ou procedimento Retornado por uma função ou procedimento
Valores
Em pascal, são exemplos de valores: Caracteres, inteiros, etc ... Registros, arrays, etc ... ponteiros Referências para variáveis Abstração de procedimento Abstração de função
Valores
Em Pascal, referências à variáveis, abstração de função e de procedimento, não podem ser armazenados ou incorporados em estruturas de dados,mas podem ser passadas como parâmetros.
Em ML, não existe abstração de procedimento. No entanto, referências à variáveis e abstração de função podem ser usadas da mesma forma que qualquer outro valor.
Tipos
Um tipo é um conjunto de valores que exibem um comportamento uniforme sob operações que podem ser realizadas sobre estes valores. Exemplo:
{true, false} Operações: and, or, not, etc ...
Tipos
Classificação de tipos: Primitivos Compostos Recursivos
Tipos Primitivos São aqueles cujos valores são atômicos
Não podem ser decompostos em valores mais simples.
Os tipos primitivos já são definidos na própria LP. Exemplos:
boolean = {true, false} integer = { ..., -2, -1, 0, 1, 2, ... } real = { ..., -1.0, ..., 0.0, ... –1 .0, ... } char = { ..., ´a´, ´b´, ..., ´*´, ... } (enumeração) = (seg, ter, qua, qui, sex, sab,
dom) (intervalo) = 0..10 ou ‘ A’ ..’ Z’
Tipos Compostos
Tipos compostos ou estruturados são tipos cujos valores são compostos a partir de valores mais simples Classificação: Produto cartesiano (tuplas e registros) Uniões disjuntas (registros variantes e uniões) Mapeamentos (arrays e funções) Conjuntos potência (conjuntos) Tipos recursivos (estruturas de dados dinâmicas)
Produtos Cartesianos
Por meio do produto cartesiano, valores de dois tipos (possivelmente diferentes) são emparelhados.
Sejam S e T dois tipos quaisquer. O produto cartesiano S x T é definido como: S x T = { (x,y) | x in S; y in T }
Cardinalidade: #(SxT) = #S x #T
N-tuplas S1 x S2 x S3 x ... x Sn
Produtos Cartesianos
Produtos Cartesianos
Produtos Cartesianos em Pascal
type Dia : 1..31;type Mês = (jan, fev, mar, abr, mai, jun, jul,ago, set,out, nov, dez);type Data = recordd : Dia;m : Mes;endvar niver : Data;niver.d = 18;niver.m := jul;
Uniões Disjuntas
Na união disjunta os valores são escolhidos de dois tipos (normalmente diferentes)
Sejam S e T dois tipos quaisquer. A união disjunta S+T é definida como: S + T = {esquerda x | x in S} È {direita y | y in T}
Cardinalidade: #(S + T) = #S + #T
S1 + S2 + S3 + ... + Sn
Uniões Disjuntas
Uniões Disjuntas em Pascal