Paradigmas de Programação
Aula 14
Os paradigmas podem ser divididos em dois grandes grupos, Imperativos e Declarativos.
Imperativos: Especifica os passos a serem seguidos. O programador instrui a máquina sobre como devem ser computados os processos.
Declarativos: Especifica a relação ou função entre os dados. É quando o programador apenas declara as propriedades do resultado desejado, mas não informa a máquina sobre como devem ser feitos os cálculos relacionados.
Os paradigmas se iniciaram com linguagens de dois tipos: Funcionais e Estruturadas. A partir de 1964, dois noruegueses inventaram a linguagem Simula, baseada em orientação a objetos. Assim, temos os três grandes grupos que definem um paradigma de programação. Paradigmas são conjunto de regras que estabelecem fronteiras e descrevem como resolver esses problemas.
Tipos de linguagem de programação quanto ao paradigma
Imperativo (específica os passos a serem seguidos) - O programador instrui a máquina sobre como devem ser computados os processos. Dentro dos paradigmas de programação do tipo imperativo temos:
procedural: define procedimentos que contém passos computacionais a serem executados. A programação procedural é excelente para programação de uso geral e consiste numa lista de instruções para informar ao computador o que fazer passo a passo.
A maioria das linguagens de programação ensinadas na faculdade são procedurais, exemplos:
- C
- C++
- Java
- Pascal
- Fortran
- BASIC
Quando é recomendado usar programação procedural:
- Quando existir uma operação complexa que inclui dependências entre operações e quando há necessidade de visibilidade clara dos diferentes estados do aplicativo.
- O programa é muito único e poucos elementos foram compartilhados.
- O programa é estático e não se espera que mude muito ao longo do tempo.
- Espera-se que nenhum ou apenas alguns recursos sejam adicionados ao projeto ao longo do tempo.
Estruturada: Este paradigma mostra que todos os programas possíveis podem ser reduzidos a apenas três estruturas: seqüência, decisão e iteração. Tendo, na prática, sido transformada na Programação modular, a Programação estruturada orienta os programadores para a criação de estruturas simples em seus programas, usando as subrotinas e as funções.
Orientação a objetos: define objetos e relações entre eles. A programação orientada ao objeto (OOP) é o paradigma de programação mais popular devido aos seus benefícios, como a modularidade do código e a capacidade de associar diretamente problemas reais em termos de código.
Neste caso, o programa é escrito como uma coleção de classes e objetos para uma boa comunicação. A entidade menor e básica é objeto e todo tipo de cálculo é realizado apenas nos objetos.
É o paradigma mais popular e requisitado pelas empresas e as principais linguagens que o implementam são:
- PHP
- Java
- Ruby
- C#
- Python
Vale a pena utilizá-la quando:
Vários programadores atuam juntos e não precisam entender tudo sobre cada componente. Existe muito código a ser compartilhado e reutilizado. São previstas muitas mudanças no projeto.
O paradigma de computação paralela (computação distribuida) consiste nas instruções sendo divididas entre vários processadores. Um sistema de computação paralela permite que muitos processadores executem um programa em menos tempo, dividindo-os.
que suportam a abordagem de processamento paralelo:
- C
- C++
A abordagem de computação paralela geralmente é recomendada quando:
Você tem um sistema que possui mais de uma CPU ou processadores multinúcleo. É preciso resolver problemas computacionais que podem levar até dias para serem resolvidos. Se trabalha com simulação computacional, inteligência artificial ou modelagem que exija muitos cálculos dinâmicos.
Declarativo (especifica a relação ou função entre os dados) - É quando o programador apenas declara as propriedades do resultado desejado, mas não informa a máquina sobre como devem ser feitos os cálculos relacionados. No grupo dos paradigmas de programação declarativos estão:
funcional: define funções matemáticas para realizar computações e evita dados ou estados mutáveis. O paradigma de programação funcional tem suas raízes na matemática e é independente da linguagem.
A base desse paradigma é a execução de uma série de funções matemáticas. Você compõe seu programa de funções curtas. Todo o código está dentro de uma função. Todas as variáveis têm escopo definido para a função.
No paradigma de programação funcional, as funções não modificam nenhum valor fora do escopo dessa função e as próprias funções não são afetadas por nenhum valor fora do escopo. Linguagens que usam este paradigma:
- Haskell
- Scala
- Racket
- Prolog
- JavaScript
Ideal para usar quando:
Tem matemática envolvida diretamente na programação.
Paradigma de Lógica de Programação
O paradigma da programação com apontamento lógico não é composto de instruções. Ele é baseado em fatos e usa tudo o que sabe para criar um cenário onde todos esses fatos e cláusulas são verdadeiros e apontam para algum final.
Por exemplo, JavaScript é uma linguagem de programação, todas as linguagens de programação são importantes e, por dedução lógica, JavaScript é importante.
Linguagens com propriedades de lógica:
- Absys
- Ciao
- Alice
É interessante usar o paradigma de programação lógica quando:
Você planeja trabalhar em projetos como prova de teoremas, sistemas de redução, sistemas de tipos entre outros.
Tipos de linguagem de programação quanto à estrutura de tipos
Fracamente tipada: tipo das variáveis não é definido, podendo modificar-se.
Ex: PHP
Fortemente tipada: tipo das variáveis é predefinido e imutável.
Ex: Java, Ruby
Dinamicamente tipada: tipo das variáveis é definido em tempo de execução.
Ex: Python, Ruby
Estaticamente tipada: tipo das variáveis é definido em tempo de compilação.
Ex: Java, C
Tipos de linguagem de programação quanto ao grau de abstração
O grau de abstração funciona como uma escala para linguagens: quanto mais baixo, mais próximo da linguagem de máquina, e quanto mais alto, mais próximo da linguagem dos seres humanos.
Baixo nível: possui símbolos que representam o código de máquina propriamente. Ex: Assembly
Médio nível: possui símbolos que podem ser diretamente traduzíveis para código de máquina, mas também possui símbolos que precisam ser processados por um compilador. Ex: C#
Alto nível: possui símbolos complexos que necessitam de interpretação de um compilador antes de serem transformados em linguagem de máquina. Ex: Java, Javascript, Python, Ruby
Classificação em gerações das liguagens de programação
A classificação das linguagens de programação em gerações é uma questão que apresenta divergências de autor para autor. Segundo Maclennan, as linguagens se dividem em cinco gerações com as seguintes características:
Primeira geração - São linguagens onde suas estruturas de controle são aparentemente orientadas a máquina. As instruções condicionais não são aninhadas e dependem fortemente de instruções de desvio incondicional como o GOTO (O comando goto é uma estrutura de controle para salto de instruções. Sua sintaxe é, em geral: goto destino, onde destino pode ser um label ou um número, que representa um determinado endereço. As instruções passam a ser executadas no endereço apontado por destino). Uma linguagem típica desta geração é a linguagem Fortran.
Segunda geração - São linguagens onde as estruturas de controle são estruturadas de forma a minimizar ou dispensar o uso de instruções GOTO. A segunda geração elaborou melhor e generalizou diversas estruturas de controle das linguagens de primeira geração. Uma das grandes contribuições desta geração foi suas estruturas de nomes, que eram hierarquicamente aninhadas. Isto permitiu melhor controle de espaços de nomes e uma eficiente alocação dinâmica de memória. Uma linguagem típica desta geração é o Algol 60.
Terceira geração - São linguagens que dão ênfase a simplicidade e eficiência. Uma linguagem típica desta geração é a linguagem Pascal. As estruturas de dados desta geração mostram um deslocamento da máquina para a aplicação. As estruturas de controle são mais simples e eficientes.
Quarta geração - Esta geração é essencialmente o sinônimo para linguagens com abstração de dados. A maioria das linguagens desta geração focam na modularização e no encapsulamento. Uma linguagem típica desta geração é a linguagem Ada.
Quinta geração - Nesta geração, Maclennan agrupa diversos paradigmas como a orientação a objeto e o paradigma funcional, paradigma lógico.
Henri Bal e Dick Grune, já apresentam uma classificação em gerações de forma diferente, enfatizando mais o aspecto da aplicação. São elencadas 6 gerações.
- linguagens de montagem (assembly).
- Linguagens procedurais.
- Linguagens aplicativas.
- Linguagens voltadas a Inteligência artificial como as linguagens lógicas (Prolog) e as linguagens funcionais (Lisp).
- Redes neurais.