Universidade Federal do Amazonas Instituto de Computação
IEC481 – Projeto de Programas
Modelos e Paradigmas de
Programação
Professor: Horácio Fernandes
Slides baseados em materiais preparados pelo Prof. João Bastos e pela Profa. Rosiane Freitas.
Linguagens de Programação
Cite algumas Linguagens de Programação
C, C++, Java, Perl, Python, Bash, Prolog, Pascal, Basic, Fortran, PHP,
go, Erlang, Lua, Clipper, COBOL, ASM, Lisp, Haskell, Modula-2, Oberon, Java, 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
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.
A classificação de linguagens em paradigmas é uma consequência de
decisões de projeto que tem impacto na forma segundo a qual uma aplicação real é modelada do ponto de vista computacional.
Paradigmas de Programação
Modelos de Linguagens de Programação
Linguagens Imperativas
programação orientada a procedimentos (C, Pascal) programação orientadas a objetos (C++, Java)
Linguagens concorrentes
programação paralela (VHDL, SystemC) programação distribuída (C)
Linguagens funcionais
programação funcional (Haskell) Linguagens baseadas em lógicas
programação em lógica (Prolog) Linguagens baseadas em aspectos
Linguagens de Programação
E o que é uma “Linguagem de Programação”?
Do ponto de vista Sintático, uma linguagem de programação é uma
notação utilizada pelo programador para especificar ações a serem
executadas por um computador.
Do ponto de vista Semântico, uma linguagem de programação
compreende um conjunto de conceitos que um programador usa para resolver problemas de programação.
Variáveis, funções, estruturas, etc
Linguagens de Programação
Critérios de Avaliação de uma Linguagem de Programação:
Legibilidade Simplicidade Expressividade Ortogonalidade Confiabilidade Portabilidade
Critério: Legibilidade
Facilidade de ler e escrever programas
Legibilidade facilita:
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
Critério: Legibilidade
Exemplo:
O que faz o seguinte código válido em C?
Fonte: Ofuscated Code - http://en.wikipedia.org/wiki/Obfuscated_code
#include <stdio.h> main(t,_,a)
char *a;
{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a
)&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_, t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\ ,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\ +k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\ l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\ n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\ +1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc \ i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
Critério: Simplicidade
A representação de cada conceito deve ser 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
Capacidade de representação da linguagem
Exemplo: tipos de dados em Pascal
Expressividade x Simplicidade
Linguagem muito expressiva: falta simplicidade? Muito simples: falta expressividade?
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
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 e ações sobre
eles, como arrays de registros.
Contra exemplos:
C: não permitir que um array seja usado como parâmetro de
um procedimento (deve-se usar ponteiro)
PHP: Não permite acessar um vetor que retornou como
resultado de uma função:
echo array('a','b','c')[$key]; // Erro!
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