Buscar

Paradigmas de Linguagens de Programação - Aula 1

Prévia do material em texto

Paradigmas de Linguagens de 
Programação
UNIFACS
Prof. Sergio Martins Fernandes
Sergio.fernandes@unifacs,br
71 99958-0897
SOBRE A DISCIPLINA
Apresentar plano de ensino
Aulas e paradigmas abordados
• Fundamentos de linguagens de programação
• Evolução das principais linguagens de programação
• Aspectos sintáticos e semânticos básicos de 
linguagens de programação
• Paradigma imperativo (estruturado e O. O.)
• Paradigma Funcional
• Paradigma Lógico
• Paradigma Concorrente x Paradigma Paralelo
Paradigma
• Termo de origem grega
• Significa Modelo
• Representação de um padrão a ser seguido
• Cada paradigma representa uma forma de propor 
uma solução para determinada classe de 
problemas
O que é um paradigma de 
programação?
• Modelo, padrão ou estilo de programação 
suportado por linguagens que possuem certas 
características comuns
• A classificação de linguagens em paradigmas é 
uma consequência de decisões de projeto que 
impactam radicalmente a forma na qual uma 
aplicação real é modelada do ponto de vista 
computacional
PPGCOMP - UNIFACS 5Rodrigo O. Spínola
Avaliações
• AV1
– Avaliação individual
– Listas de exercícios em dupla
• AV2
– Avaliação individual
– Trabalho em equipe
Bibliografia básica
Paradigmas de Linguagens de Programação – Sergio Fernandes
Roteiro da aula
• Razões para estudar conceitos de linguagens de programação
• Domínios de programação 
• Critérios de avaliação de linguagens
• Influências no projeto de linguagens
• Categorias de linguagens
• Trade-offs no projeto de linguagens
• Métodos de implementação
• Ambientes de programação
Razões para estudar conceitos 
de linguagens de programação
• Capacidade ampliada para expressar ideias
• Embasamento melhorado para escolher linguagens 
apropriadas
• Habilidade ampliada para aprender novas linguagens
• Melhor entendimento da importância da 
implementação
• Melhor uso de linguagens já conhecidas
• Avanço geral da computação
Razões para estudar conceitos 
de linguagens de programação
• Capacidade ampliada para expressar ideias
“Se você tem uma ideia incrível
É melhor fazer uma canção
Está provado que só é possível 
filosofar em alemão”
Língua, Caetano Veloso
Por que?
Razões para estudar conceitos 
de linguagens de programação
• Capacidade ampliada para expressar ideias
– Capacidade de pensar é influenciada pelo poder de 
expressividade da linguagem que se usa para expressar 
pensamentos
• Tanto em linguagens naturais quanto artificiais
– Qualquer linguagem de programação tem limitações quanto a
• Estruturas de controle
• Estruturas de dados
• Abstrações
que podem ser utilizadas,
Logo, conhecer uma variedade mais ampla de recursos de computação 
“expande os horizontes”
Razões para estudar conceitos 
de linguagens de programação
• Embasamento melhorado para escolher 
linguagens apropriadas
– Conhecimento mais aprofundado sobre linguagens de 
programação gera capacidade de escolher melhor 
linguagens para determinado domínio e objetivo
Razões para estudar conceitos 
de linguagens de programação
• Habilidade ampliada para aprender novas linguagens
– Linguagens de programação evoluem continuamente
– Surgem frequentemente novas linguagens de programação
– “Todo conhecimento é embasado em um conhecimento 
anterior”
– Aprendizado de linguagem de programação pode ser árduo
– Embasamento conceitual ajuda
– Popularidade das linguagens de programação evolui 
constantemente
(ver próximo slide)
Índice TIOBE
Indicador de popularidade de linguagens de programação
TIOBE Programming Community index, fevereiro 2019
Razões para estudar conceitos 
de linguagens de programação
• Melhor entendimento da importância da 
implementação das linguagens de programação
– Conhecer a implementação da linguagem possibilita
• Utilizá-la de forma mais adequada, inteligente
• Evitar erros
– Exemplo: uso de ponteiros na linguagem C
• Garantir um melhor desempenho
– Exemplo: compreensão do custo de chamar subprogramas em 
determinadas linguagens
Razões para estudar conceitos 
de linguagens de programação
• Melhor uso de linguagens já conhecidas
– Muitas linguagens (ou plataformas de 
desenvolvimento) são grandes e complexas
– Ao conhecer, de forma ampla, conceitos de linguagens 
de programação, fica mais fácil aprender recursos de 
linguagens específicas
Razões para estudar conceitos 
de linguagens de programação
• Avanço geral da computação
– Nem sempre as linguagens de programação mais 
populares são as melhores disponíveis
– Exemplo:
• Algol versus FORTRAN no começo dos anos 60
• Java versus Swift, ou Kotlin, ou Python, ou ...
Paradigmas de Linguagens de Programação – Sergio Fernandes
Domínios de programação
• Aplicações científicas
– Os primeiros computadores digitais, surgidos a partir dos anos 40, eram voltados para computação científica
– Normalmente, estruturas de dados relativamente simples
– Grande número de computações de aritmética de ponto flutuante; uso de vetores e matrizes
– Linguagem de máquina; Fortran
• Aplicações empresariais
– Uso de computadores para aplicações comerciais surgiu nos anos 50
– Produz relatórios, usa números decimais e caracteres
– COBOL
• Inteligência artificial
– Símbolos (ou seja, nomes) em vez de números manipulados; uso de listas ligadas
– LISP
• Programação de sistemas
– Precisa de eficiência por causa do uso contínuo
– C
• Software para a Web
– Eclética coleção de linguagens: de marcação (como XHTML), de scripting (como PHP), de propósito geral (como Java)
• Software para mobile
Paradigmas de Linguagens de Programação – Sergio Fernandes
Critérios de avaliação de linguagens
• Legibilidade: facilidade com a qual os programas podem ser lidos e 
entendidos
• Facilidade de escrita: facilidade com a qual uma linguagem pode ser 
usada para criar programas para um dado domínio
• Confiabilidade: conformidade de um programa às especificações em 
todas as situações
• Custo: o custo total definitivo de uma linguagem
Paradigmas de Linguagens de Programação – Sergio Fernandes
Fonte: Conceitos de Linguagens de Programação, 9ª. Edição, Sebesta
Paradigmas de Linguagens de Programação – Sergio Fernandes
Critério de avalição: legibilidade
• Simplicidade geral
– Um conjunto controlável de recursos e construções
– Mínima multiplicidade de recursos 
– Mínima sobrecarga de operadores
• Ortogonalidade
– Um conjunto relativamente pequeno de construções primitivas pode ser combinado a 
um número relativamente pequeno de formas de construção das estruturas de controle 
e de dados
– Cada possível combinação é legal
– Exemplo: linguagem possui quatro tipos primitivos de dados (inteiro, ponto flutuante, 
ponto flutuante em dupla precisão e caractere) e dois tipos de operadores (vetor e 
ponteiro)
• Se os dois tipos de operadores puderem ser aplicados a eles mesmos e aos quatro tipos de dados 
primitivos, há ortogonalidade, e grande número de estruturas de dados pode ser definido.
– Contra exemplo
• Em C, há dois tipos de estruturas de dados: vetores e registros (struct). Funções podem retornar registros 
mas não vetores.
• Parâmetros são passados por valor, exceto se forem vetores, que são passados por referência
Paradigmas de Linguagens de Programação – Sergio Fernandes
Critério de avalição: legibilidade (cont.)
• Tipos de dados
– Existência de mecanismos adequados para definir tipos e estruturas de dados
– Exemplo:
• Numa linguagem em que não há o tipo booleano (variável que assume valores true ou false), pode-se ter 
que usar variáveis inteiras suprir essa ausência
• TimeOut = 1 é menos claro que timeOut= true
• Projeto da sintaxe
– Formato dos identificadores
• Restringir os identificadores a tamanhos muito curtos piora a legibilidade
• Em Fortran 77 cada identificador pode ter no máximo 6 caracteres
• Em ANSI BASIC, um identificador é denominado por apenas uma letra, ou uma letra e um caracter
– Palavras especiais e métodos de formar sentenças compostas
– Forma e significado: construções autodescritivas, palavras-chave significativas
– Exemplo: C usa chaves para formar sentenças compostas, ou grupos de sentenças. 
Algumas linguagens, mais legíveis, usam pares casados de palavras especiais com 
esse objetivo (if – endif; loop – end loop). Esta última abordagem é mais legível.
Paradigmas de Linguagens de Programação – Sergio Fernandes
Critério de avalição: legibilidade (+ 1 exemplo)
• Linguagem APL
• A função apresentada a seguir calcula todos os números primos entre 1 
e R
(~R∊R∘.×R)/R←1↓ιR
• A seguir, uma função que extrai todas as tags HTML da expressão 
inicial, apresentando apenas o texto que a expressão formata
txt←'<html><body><p>This is ''emphasized'' 
text</p></body></html>'
⎕←{⍵/⍨~{⍵∨≠\⍵}⍵∊'<>'}txt
This is emphasized text.
Paradigmas de Linguagens de Programação – Sergio Fernandes
Critério de avaliação: facilidade de escrita
• Simplicidade e ortogonalidade
– Poucas construções, número pequeno de primitivas e um pequeno conjunto de regras 
para combiná-las
• Suporte à abstração
– A habilidade de definir e usar estruturas ou operações complexas de forma a permitir 
que muitos dos detalhes sejam ignorados
– Abstração
• De processo
– uso de um subprograma para implementar um algoritmo de ordenação que é acionado diversas vezes pelo 
programa
• De dados
– Possibilidade de criar estruturas de dados que correspondam aos objetivos desejados
• Expressividade
– Um conjunto de formas relativamente convenientes de especificar as operações
– Força e número de operadores e funções pré-definidas 
– Exemplo, em APL há operadores muito poderosos que permitem computações em um 
programa pequeno
– Sentença for em Java, mais conveniente que while, em laços de contagem
Paradigmas de Linguagens de Programação – Sergio Fernandes
Critério de avaliação: confiabilidade
• Verificação de tipos
– Testes para detectar erros de tipos
• Tratamento de exceções
– Interceptar erros em tempo de execução e tomar medidas corretivas
• Utilização de apelidos (aliases)
– Nomes distintos que podem ser usados para acessar a mesma célula de 
memória – reduz a confiabilidade
• Legibilidade e facilidade de escrita
– Uma linguagem que não oferece maneiras naturais para expressar os 
algoritmos requeridos irá necessariamente usar abordagens não naturais, 
reduzindo a confiabilidade
Critério de avaliação: custo
• Treinar programadores para usar a linguagem
– Depende de simplicidade, ortogonalidade da linguagem e experiência dos programadores
• Escrever programas
– Proximidade com o propósito da aplicação em particular
– Desenvolvimento de linguagens de alto nível teve como motivação a redução do custo de escrever os 
programas
• Compilar programas
– Em linguagens mais antigas, custo de compilação podia ser muito alto (Ada)
• Executar programas
– Custo influenciado pelo projeto da linguagem
• Exemplo: muitas verificações de tipo em tempo de execução implicam em perda de desempenho
• Sistema de implementação da linguagem
– Disponibilidade de compiladores/gratuitos e de fácil utilização
• Confiabilidade baixa leva a custos altos
– Exemplo: ponteiros em C++ versus Java
• Manter programas
– Custo de correções e acréscimo de novas funcionalidades
– Depende da legibilidade da linguagem, entre outros fatores
– Custo de manutenção, em muitos casos, pode ser muitas vezes maior que o desenvolvimento
Obs.: itens em vermelho são os mais importantes, segundo Sebesta
Paradigmas de Linguagens de Programação – Sergio Fernandes
Critério de avaliação: outros
• Portabilidade
– A facilidade com a qual os programas podem ser movidos de uma 
implementação para outra
• Generalidade
– A aplicabilidade a uma ampla faixa de aplicações
• Bem definida
– Em relação à completude e à precisão do documento oficial que define a 
linguagem
Paradigmas de Linguagens de Programação – Sergio Fernandes
Influências no projeto de linguagens
• Arquitetura de computadores
– Linguagens são projetadas considerando a principal arquitetura de 
computadores, chamada de arquitetura de von Neumann
• Metodologias de desenvolvimento de software
– Novas metodologias de desenvolvimento de software (por exemplo, 
desenvolvimento de software orientado a objeto) levaram a novos 
paradigmas de programação e, por extensão, a novas linguagens de 
programação
Paradigmas de Linguagens de Programação – Sergio Fernandes
Influências na arquitetura de computadores
• Principal arquitetura de computadores: von Neumann 
• Linguagens imperativas, mais populares, por causa dos computadores 
von Neumann
– Dados e programas armazenados na memória
– A memória é separada da CPU
– Instruções e dados são canalizadas a partir da memória para CPU
– Base para linguagens imperativas
• Variáveis modelam as células de memória
• Sentenças de atribuição são baseadas na operação de envio de dados 
e instruções
• Iteração é eficiente porque
– Instruções são armazenadas em células adjacentes de memória
– Repetir a execução de uma sessão de código requer apenas uma instrução de desvio
Paradigmas de Linguagens de Programação – Sergio Fernandes
Arquitetura Von Neumann
Paradigmas de Linguagens de Programação – Sergio Fernandes
Arquitetura Von Neumann
• Ciclo de obtenção e execução (em um computador com arquitetura 
von Neumann)
inicialize o contador de programa
repita para sempre
obtenha a instrução apontada pelo contador de programa
incremente o contador de programa
decodifique a instrução
execute a instrução
fim repita
Obs.: Ao final da execução de um programa, o controle volta ao sistema operacional.
No caso de processamento concorrente, a lógica é mais complexa
HD de 5 MB sendo despachado pela IBM, 1956
Paradigmas de Linguagens de Programação – Sergio Fernandes
Influências na metodologia de programa
• Anos 1950 e começo dos 1960: Aplicações simples; preocupação com 
a eficiência da máquina
• Final dos anos 60: Eficiência das pessoas se tornou importante; 
legibilidade, melhores estruturas de controle
– Programação estruturada
– Projeto descendente (top-down) e de refinamento passo a passo
• Final dos anos 70: Da orientação aos procedimentos para uma 
orientação aos dados 
– Abstração de dados
• Meio dos anos 80: Programação orientada a objetos
– Abstração de dados + herança + vinculação dinâmica de métodos
Paradigmas de Linguagens de Programação – Sergio Fernandes
Categorias de linguagens
• Imperativa
– Características centrais são variáveis, sentenças de atribuição e de iteração
– Inclui linguagens que suportam programação orientada a objeto
– Inclui linguagens de scripting
– Inclui as linguagens visuais
– Exemplos: C, Java, Perl, JavaScript, Visual BASIC, .NET, C++
• Funcional
– Principais meios de fazer os cálculos é pela aplicação de funções para determinados 
parâmetros
– Exemplos: LISP, Scheme
• Lógica
– Baseada em regras (regras são especificadas sem uma ordem em particular)
– Exemplos: Prolog
• De marcação/programação híbrida 
– Linguagens de marcação estendida para suportar alguma programação
– Exemplos: JSTL, XSLT
Paradigmas de Linguagens de Programação – Sergio Fernandes
Trade-Offs no projeto de linguagens
• Há tantos requisitos importantes, conflitantes, que encontrar o trade-off 
adequado é um dos principais desafios da engenharia de linguagens
• Confiabilidadex custo de execução
– Exemplo: Java exige que todas as referências aos elementos de um vetor 
sejam verificadas para garantir que os índices estão em suas faixas legais
• Legibilidade x facilidade de escrita
– Exemplo: APL inclui um poderoso conjunto de operadores (e um grande 
número de novos símbolos), permitindo que computações complexas sejam 
escritas em um programa compacto, com o custo de baixa legibilidade
• A função apresentada a seguir calcula todos os números primos entre 1 e R
(~R∊R∘.×R)/R←1↓ιR
• Facilidade de escrita (flexibilidade) x confiabilidade
– Exemplo: Ponteiros de C++ são poderosos e flexíveis, mas não são confiáveis
Paradigmas de Linguagens de Programação – Sergio Fernandes
Resumo
• O estudo de linguagens de programação é valioso por diversas razões:
– Aumenta nossa capacidade de usar diferentes construções ao escrever 
programas
– Permite que escolhamos linguagens para os projetos de forma mais 
inteligente
– Torna mais fácil o aprendizado de novas linguagens
• Critérios mais importantes para a avaliação de linguagens:
– Legibilidade, facilidade de escrita, confiabilidade e custo geral
• As principais influências no projeto de linguagens são a arquitetura de 
máquina e as metodologias de projeto de software
• Os principais métodos de implementar linguagens de programação são 
a compilação, a interpretação pura e a implementação híbrida

Continue navegando