Baixe o app para aproveitar ainda mais
Prévia do material em texto
Paradigmas de Linguagens de Programação Prof. Rodrigo Porfírio da Silva Sacchi Bacharelado em Sistemas de Informação – UFGD 1º. Semestre de 2013 Horário: Sábado das 8:00h as 11:30h Autora: Profª Valguima Odakura Objetivos Reconhecer as características essenciais dos principais paradigmas de programação e das linguagens que implementam tais paradigmas. Ser capaz de selecionar o paradigma mais adequado para a resolução de um determinado problema computacional. Plano de aula Introdução as linguagens de programação: Revisão. Princípios. Paradigmas. Implementações. Revisão Computador O que queremos dizer com a palavra “computador”? O computador é uma máquina que armazena dados (números, palavras, figuras), interage com dispositivos (a tela do monitor, o sistema de som, a impressora) e executa programas. Organização de um computador Memória CPU Instruções e dados Resultado das operações Dispositivos de E/S Arquitetura de von Neumann Programação Programação de computadores é o ato de projetar e implementar programas de computador. O programa determina a sequência de etapas necessárias para realizar uma tarefa – orienta o computador a executar tarefas. Por baixo do seu programa Aplicações típicas, como processador de texto, podem consistir de milhões de linhas de código. No entanto, o hardware só pode executar instruções de baixo nível, extremamente simples. Ir de uma aplicação complexa até as instruções simples envolve várias camadas de software que interpretam ou traduzem operações de alto nível nas instruções simples do computador. Por baixo do seu programa Essas camadas de software são organizadas de maneira hierárquica. Aplicações Software de Sistemas Hardware Por baixo do seu programa Software de sistemas: software que fornece serviços que normalmente são úteis, inclusive: Sistemas operacionais e Compiladores. Por baixo do seu programa Software de sistemas: Sistema operacional: programa de supervisão que gerencia os recursos de um computador para o benefício dos programas executados nessa máquina. Fornece interface entre o programa do usuário e o hardware e disponibiliza diversos serviços: • Manipular operações básicas de E/S. • Alocar memória. • Possibilitar e controlar o compartilhamento do computador entre as diversas aplicações que o utilizam simultaneamente. • Exemplos: Windows, Linux e MacOS. Por baixo do seu programa Software de sistemas: Compilador: um programa que traduz as instruções de linguagem de alto nível para instruções de linguagem que o hardware possa executar. De linguagem de alto nível para a linguagem do hardware Uma máquina eletrônica recebe instruções através de sinais elétricos. Os sinais mais fáceis de serem entendidos são ligado e desligado. O alfabeto do computador é formado por números na base 2 (0 e 1). Dígito binário (bit): um dos dois números na base 2 que são componentes da informação. De linguagem de alto nível para a linguagem do hardware Os primeiros programadores se comunicavam com os computadores em números binários. Depois inventaram novas notações mais parecidas com a maneira como os humanos pensam. Inventou-se programas para traduzir da notação simbólica para binário (no princípio, a tradução era feita manualmente). De linguagem de alto nível para a linguagem do hardware Linguagem assembly – uma representação simbólica das instruções de máquina. O programador deve escrever uma linha para cada instrução que a máquina seguirá, obrigando o programador a pensar como a máquina. De linguagem de alto nível para a linguagem do hardware Um programa que traduz uma versão simbólica de instruções para a versão binária é chamado montador (assembler): add A, B 1000110010100000 De linguagem de alto nível para a linguagem do hardware “A descoberta de que um programa poderia ser escrito para traduzir uma linguagem mais poderosa em instruções de computador foi um dos mais importantes avanços nos primeiros dias da computação.” Abstração De linguagem de alto nível para a linguagem do hardware Linguagem de programação de alto nível: Uma linguagem como C, Fortran ou Java, composta de palavras e notação algébrica, que pode ser traduzida por um compilador para a linguagem assembly. De linguagem de alto nível para a linguagem do hardware Vantagens das linguagens de alto nível: Permite que o programador pense em uma linguagem mais natural. Maior produtividade do programador. Os programas são independentes do computador no qual elas são desenvolvidas, já que os compiladores e montadores podem traduzir programas de linguagem de alto nível para instruções binárias de qualquer máquina. • Linguagens assembly e de máquina dependem da arquitetura específica do computador. Perspectiva histórica O ENIAC, construído na Segunda Guerra Mundial, foi o primeiro computador de finalidade geral: Usado para calcular tabelas de disparo de artilharia. 24 metros de comprimento por 2,5 metros de altura e dezenas de centímetros de profundidade. Cada um dos 20 registradores de 10 dígitos tinha 60 centímetros de comprimento. Usava 18.000 válvulas. Efetuava 1.900 adições por segundo. ENIAC – Eletronic Numeral Integrator and Computer Projetado por J. Presper Eckert e John Mauchly na University of Pennsylvania e concluído em 1946. Perspectiva histórica Atualmente os computadores de bolso: Iphone, ipad, ipod, tablets... Paradigmas Paradigmas Um paradigma de programação é um padrão de resolução de problemas que se relaciona a um determinado gênero de programas e linguagens. Principais paradigmas: Programação imperativa. Programação orientada a objetos. Programação funcional. Programação lógica. Programação Imperativa A programação imperativa é o paradigma mais antigo, fundamentado no modelo computacional clássico de von Neumman. Comandos e variáveis são armazenados juntos. O programa contém uma série de comandos para executar cálculos, atribuir valores a variáveis, obter entradas, produzir saídas ou redirecionar o controle para outro ponto nesse série de comandos. Programação Imperativa São componentes da programação imperativa: Abstração procedural, as atribuições, os laços, as sequências, os comandos condicionais e a manipulação de exceções. Exemplos de linguagens de programação imperativas: Cobol, fortran, C, Ada e Perl. Programação Orientada a objeto A programação Orientada a Objeto (POO) fornece um modelo no qual um programa é um coleção de objetos que interagem entre si, passando mensagens que transformam seu estado. A classificação de objetos, herança e a passagem de mensagens são componentes fundamentais da POO. Exemplos de linguagens de POO: Smalltalk, C++, Java e C#. Programação funcional A programação funcional modela um problema como uma coleção de funções matemáticas, cada uma com um espaço de entrada (domínio) e resultado (faixa). Isso separa a programação funcional das linguagens que possuem o comando de atribuição: x = x + 1 (a atribuição não faz sentido na programação funcional ou na matemática). Programação funcional As funções interagem e combinam entre si usando composição funcional, condições e recursão. Exemplos de linguagens de programaçãofuncional são: Lisp, Scheme, Haskell e ML. Programação lógica A programação lógica (declarativa) permite a um programa modelar um problema declarando qual resultado o programa deve obter, em vez de como ele deve ser obtido. Interpretar as declarações de um programa lógico cria um conjunto de todas as soluções possíveis para o problema que ele especifica. A principal linguagem de programação lógica é o Prolog. Métodos de Implementação Métodos de implementação Qualquer implementação de uma linguagem de programação requer que os programas nessa linguagem sejam analisados e então traduzidos e um formato que possa ser: Executado por um computador (uma máquina real). Executado por um interpretador (um software que simule uma máquina virtual e seja executado em uma máquina real). Métodos de implementação Compilação: Traduz programas de linguagens de alto nível para linguagem de máquina. Tradução lenta. Execução rápida. Interpretação: Programas são interpretados pelo interpretador sem a tradução. Execução lenta. Sistemas de implementação híbrida: Traduzem linguagem de alto nível para uma linguagem intermediária projetada para se de fácil interpretação. Custo de translação baixo. Velocidade de execução média. O processo da compilação Resultados Unidades léxicas Árvores de análise Código intermediário Analisador sintático Gerador de código intermediário Computador Tabela de símbolos Analisador léxico Gerador de código Otimização Programa Fonte Linguagem de máquina Dados de entrada Ex: Cobol, fortran, C e C+ + Interpretação pura Dados de entrada Resultados Programa fonte Interpretador Ex: LISP, JavaScript Sistemas de implementação híbridos Resultados Unidades léxicas Árvores de análise Código intermediário Analisador sintático Gerador de código intermediário Analisador léxico Programa Fonte Dados de entrada Interpretador Ex: Perl, Java Critérios para avaliação da linguagem Critérios de avaliação de linguagem Objetivo: examinar cuidadosamente os conceitos fundamentais das várias construções e da capacidade das linguagens de programação. Critérios de avaliação de linguagem Legibilidade: facilidade com que os programas podem ser lidos e entendidos. Antes de 70 foco na escrita do código. Na década de 70 foi desenvolvido o conceito de ciclo de vida do software → manutenção do software foi considerada importante. Critérios de avaliação de linguagem Legibilidade: Simplicidade global: uma linguagem com um grande número de componentes básicos é mais difícil de aprender do que com poucos desses componentes → programadores tendem a aprender subconjunto dela. Multiplicidade de recursos complica a legibilidade: cont = cont + 1 cont += 1 cont++ ++cont Operadores em C: • Equivalentes: cont = cont + 1 cont += 1 • Operador pós-fixo, incrementa cont depois de ser utilizado: cont++ • Operador pré-fixo, incrementa cont antes de utilizar o seu valor : ++cont Critérios de avaliação de linguagem Legibilidade: Ortogonalidade: um conjunto relativamente pequeno de construções primitivas pode ser combinado em um número relativamente pequeno de maneiras para construir as estruturas de controle e de dados da linguagem. Toda combinação possível de primitivas é legal e significativa. • Ex: tipos primitivos (inteiro, real, caractere) e operador de tipo ponteiro. O ponteiro deve ser capaz de apontar para qualquer tipo de variável ou estrutura de dados. • Falta de ortogonalidade acarreta exceções. Critérios de avaliação de linguagem Legibilidade: Instruções de controle: • Revolução da programação estruturada da década de 70: uso indiscriminado de instruções goto. • Programa lido de cima para baixo é mais fácil de entender do que o que exige do leitor pular de uma instrução a outra não adjacente. • Ex: Basic e Fortran não tinham controle de goto. • Restrições para instruções goto: • Elas devem preceder seus alvos, exceto quando usadas para formar laços. • Seus alvos nunca devem estar muito distantes. • Seu número deve ser limitado. Critérios de avaliação de linguagem Legibilidade: Tipos de dados e estruturas: • Ex: soma_e_muito_grande = 1 soma_e_muito_grande = true (tipo booleano facilita legibilidade) Considerações sobre a sintaxe: forma dos elementos. • Palavras especiais (while, class, for): • Como formar grupo de instruções em construções de controle? • Pascal: begin – end • C: { } • Fortran 90 e Ada: end if, end loop • Simplicidade x legibilidade Critérios de avaliação de linguagem Legibilidade: Considerações sobre a sintaxe: • Forma e significado: projetar instruções, a fim de que sua aparência indique, pelo menos, parcialmente sua finalidade. • A semântica deve seguir diretamente da sintaxe. • Ex: static em C • Na definição de uma variável dentro de uma função significa que a variável é criada no momento da compilação. • Na definição de uma variável fora de todas as funções, significa que esta é visível somente no arquivo em que sua definição aparece. Critérios de avaliação de linguagem Capacidade de escrita: medida de quão facilmente uma linguagem pode ser usada para criar programas para um domínio de problema escolhido. Não é razoável comparar duas linguagens de programação no domínio de uma aplicação particular quando uma foi projetada para essa aplicação e a outra não. Critérios de avaliação de linguagem Capacidade de escrita: Simplicidade e ortogonalidade: número menor de construções primitivas e um conjunto consistente de regras para combiná-las é melhor do que um número grande de regras. Expressividade: linguagem ter formas convenientes de especificar computações: • Ex: C cont++ é mais breve que cont = cont + 1 Critérios de avaliação de linguagem Capacidade de escrita: Suporte para abstração: capacidade de definir e, depois, usar estruturas ou operações complicadas de uma maneira que permita ignorar muitos dos detalhes. Abstração de dados: árvore binária que armazena dados inteiros em seus vértices: • Fortran 77 → 3 vetores de números inteiros, sendo dois para referenciar os vértices descendentes. • C++ e Java → abstração de um vértice na forma de uma classe simples com 2 ponteiros e um número inteiro. Critérios de avaliação de linguagem Capacidade de escrita: Suporte para abstração: Abstração de processo: uso de um subprograma para implementar algoritmo de classificação exigido diversas vezes em um programa. Sem o subprograma, o código de classificação teria que ser replicado em todos os lugares necessários. Critérios de avaliação de linguagem Confiabilidade: um programa é confiável se ele se comportar seguindo suas especificações sob todas as condições. Verificação de tipos: testar se existem erros de tipo, pelo compilador ou durante a execução. Manipulação de exceções: capacidade de um programa de interceptar erros em tempo de execução, por em prática medidas corretivas e prosseguir. • Ex: C++ e Java incluem essas facilidades. C e Fortran não. Critérios de avaliação de linguagem Custo: o custo final de uma linguagem de programação é uma função de muitas de suas características: Custo de treinamento de programadores para usar a linguagem: • Simplicidade, ortogonalidade e experiência do programador.Custo de escrever programas na linguagem. Custo para compilar programas na linguagem. Critérios de avaliação de linguagem Custo: Custo para executar programas: • Se linguagem exige muitas verificações de tipo durante a execução torna o tempo de execução mais lento. • Compiladores otimizam o código para aumentar velocidade de execução. Custo de manutenção dos programas: • Para grandes sistemas estima-se que o custo de manutenção pode atingir de duas a quatro vezes o custo de desenvolvimento. Critérios de avaliação de linguagem Os critérios de legibilidade, capacidade de escrita e confiabilidade não são precisamente definidos, nem exatamente mensuráveis. No entanto, são conceitos úteis e fornecem valiosas avaliações sobre o projeto e sobre as linguagens de programação. Referências Bibliográficas SEBESTA, Robert W. Conceitos de Linguagens de Programação. 5ª Edição. Bookman, 2003. Capítulo 1. MELO, Ana; Silva, Flávio. Princípios de Linguagem de Programação. Editora Edgard Blücher, 2003. TUCKER, A. NOONAN, R. Linguagens de Programação – Princípios e Paradigmas. Editora McGrawHill, 2009.
Compartilhar