Baixe o app para aproveitar ainda mais
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
Compartilhar