Linguagens e paradigmas de programação

No passado escrevia-se programas utilizando apenas linguagens de baixo nível. A escrita é engessada, complexa e muito específica, sendo pouco acessível para os desenvolvedores no geral. Esse tipo de linguagem exige muito conhecimento de quem a programa (inclusive relacionado à forma com que o processador opera uma instrução-máquina).

Recentemente foi liberado o código-fonte utilizado no computador que guiou a missão Apollo que teve como principal objetivo levar o homem à lua (na tão famigerada corrida espacial entre a União Soviética e os EUA), o Apollo Guidance Computer.

https://github.com/chrislgarry/Apollo-11

Se você navegar no repositório acima encontrará diversos códigos-fonte com instruções como essas:

PROGLARM    CS  DSPTAB +11D
        MASK    OCT40400
        ADS DSPTAB +11D


MULTEXIT    XCH ITEMP1      # OBTAIN RETURN ADDRESS IN A
        RELINT
        INDEX   A
        TC  1

MULTFAIL    CA  L
        AD  BIT15
        TS  FAILREG +2

        TCF MULTEXIT

São instruções da linguagem AGC Assembly Language, uma variante da Assembly, que por sinal, é de baixo nível.

Um programa escrito em uma dessas linguagens, chamadas de baixo nível, é composto por uma série de instruções de máquina que determinam quais operações o processador deve executar. Essas instruções são convertidas para a linguagem que o processador entende, que é a linguagem binária (sequência de bits 0 e 1), que é categorizada como First-generation programming language (1GL), em livre tradução: linguagem de programação de primeira geração.

Linguagens de alto nível

Com a popularidade dos computadores criou-se um “problema”: alta demanda por software e, consequentemente, por programadores. Talvez você esteja pensando que isso não é exatamente um problema, e sim uma coisa boa, uma tendência, um novo mercado. Faz sentido, até certo ponto. O problema era encontrar mão de obra qualificada para codificar àquelas instruções tão complicadas.

Com isso, novas linguagens surgiram e, cada vez mais, aproximavam-se da linguagem humana. Isso abriu “fronteiras” para que uma enorme gama de novos desenvolvedores se especializassem. Tais linguagens são denominadas como sendo de alto nível. As linguagens modernas que hoje conhecemos e usamos são de alto nível: C, PHP, Java, Rust, C#, Python, Ruby etc.

Quanto mais próxima da linguagem da máquina, mais baixo nível é a linguagem. Quanto mais próxima da linguagem humana, mais alto nível ela é.

Paradigmas das linguagens de programação

Quando uma linguagem de programação é criada, a partir das suas características, ela é categorizada em um ou mais paradigmas.

A definição do dicionário Aurélio para “paradigma”:

  1. Algo que serve de exemplo geral ou de modelo.
  2. Conjunto das formas que servem de modelo de derivação ou de flexão.
  3. Conjunto dos termos ou elementos que podem ocorrer na mesma posição ou contexto de uma estrutura.

O paradigma de uma linguagem de programação é a sua identidade. Corresponde a um conjunto de características que, juntas, definem como ela opera e resolve os problemas. Algumas linguagens, inclusive, possuem mais de um paradigma, são as chamadas multi paradigmas.

Alguns dos principais paradigmas utilizados hoje no mercado:

  • Funcional
  • Lógico
  • Declarativo
  • Imperativo
  • Orientado a objetos
  • Orientado a eventos

Paradigma funcional

O foco desse paradigma está na avaliação de funções. Como na matemática quando temos, por exemplo, uma função f(x):

f(x) = x + 2

x é um parâmetro (o valor de entrada) e, após a expressão ser avaliada, obtêm-se o resultado.

Se o valor de entrada for 2, o resultado da avaliação da nossa função será 4.

Algumas das linguagens que atendem a esse paradigma: F# (da Microsoft), Lisp, Heskell, Erlang, Elixir, Mathematica.

É possível desenvolver de forma “funcional” mesmo em linguagens não estritamente funcionais. Por exemplo, no PHP, que é uma linguagem multi paradigma, teríamos:

<?php

$sum = function($value) {
    return $value + 2;
};

echo $sum(2); // 4

Paradigma lógico

Também é conhecido como “restritivo”. Muito utilizado em aplicações de inteligência artificial. Esse paradigma chega no resultado esperado a partir de avaliações lógico-matemáticas. Se você já estudou lógica de predicados, confortável se sentirá em entender como uma linguagem nesse paradigma opera.

Principais elementos desse paradigma:

  • Proposições: base de fatos concretos e conhecidos.
  • Regras de inferência: definem como deduzir proposições.
  • Busca: estratégias para controle das inferências.

Exemplo:

  • Proposição: Chico é um gato.
  • Regra de inferência: Todo gato é um felino.
  • Busca: Chico é um felino?

A resposta para a Busca acima precisa ser verdadeira. A conclusão lógica é:

Se Chico é um gato e todo gato é felino, então Chico é um felino.

A idéia básica da programação em lógica é:

“Oferecer um arcabouço que permita inferir conclusões desejadas, a partir de premissas, representando o conhecimento disponível, de uma forma que seja computacionalmente viável”. Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP.

A linguagem mais conhecida que utiliza esse paradigma é a Prolog. Esse paradigma é pouco utilizado em aplicações comerciais, seu uso se dá mais na área acadêmica.

Leitura recomendada: https://www.ime.usp.br/~slago/pl-1.pdf

Paradigma declarativo

O paradigma declarativo é baseado no lógico e funcional. Linguagens declarativas descrevem o que fazem e não exatamente como suas instruções funcionam.

Linguagens de marcação são o melhor exemplo: HTML, XML, XSLT, XAML etc. Não obstante, o próprio Prolog – reconhecido primariamente pelo paradigma lógico – também é uma linguagem declarativa. Abaixo alguns exemplos dessas linguagens.

HTML:

<article>
  <header>
    <h1>Linguagens e paradigmas de programação</h1>
  </header>
</article>

SQL:

SELECT nome FROM usuario WHERE id = 10

Paradigma imperativo

Você já ouviu falar em “programação procedural” ou em “programação modular“? De modo geral, são imperativas.

Linguagens clássicas como C, C++, PHP, Perl, C#, Ruby etc, “suportam” esse paradigma. Ele é focado na mudança de estados de variáveis (ao contrário dos anteriores).

Exemplo:

if(option == 'A') {
    print("Opção 'A' selecionada.");
}

A impressão só será realizada se o valor da variável option for igual a A.

Paradigma orientado a objetos

Esse é, entre todos, talvez o mais difundido. Nesse paradigma, ao invés de construirmos nossos sistemas com um conjunto estrito de procedimentos, assim como se faz em linguagens “fortemente imperativas” como o Cobol, Pascal etc, na orientação a objetos utilizamos uma lógica bem próxima do mundo real, lidando com objetos, estruturas que já conhecemos e sobre as quais possuímos uma grande compreensão.

OO é sigla para orientação a objetos

O paradigma orientado a objetos tem uma grande preocupação em esconder o que não é importante e em realçar o que é importante. Nele, implementa-se um conjunto de classes que definem objetos. Cada classe determina o comportamento (definido nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento entre eles.

Esse é o paradigma mais utilizado em aplicações comerciais e as principais linguagens o implementam: C#, Java, PHP, Ruby, C++, Python etc.

Paradigma orientado a eventos

Toda linguagem que faz uso de interface gráfica é baseada nesse paradigma. Nele, o fluxo de execução do software é baseado na ocorrência de eventos externos, normalmente disparados pelo usuário.

Por exemplo, imagine essa interface gráfica:

O usuário, ao interagir, decidirá em qual momento digitar, clicar no botão de “salvar” etc. Essas decisões dispararão eventos. O usuário é, então, o responsável por quando os eventos acontecerão, de tal forma que fluxo do programa fica sensivelmente atrelado à ocorrências desses eventos.

Linguagens de programação que fazem uso de paradigma: Delphi, Visual Basic, C#, Python, Java etc.

Concluindo

Os paradigmas não se restringem aos que aqui vimos ou ao o que conceituamos. Nenhum, por si só, deve ser considerado um “santo graal” da solução efetiva e definitiva para todos os problemas. Cada qual tem sua aplicação e pode ser utilizado dependendo da necessidade do software. É comum aplicações de linguagens multi paradigmas utilizarem mais de um, inclusive. Errado, certo … Você sabe, são só questões de perspectiva!

Até a próxima! 🙂

Deixe seu comentário

Head de desenvolvimento. Vasta experiência em desenvolvimento Web com foco em PHP. Graduado em Sistemas de Informação. Pós-graduando em Arquitetura de Software Distribuído pela PUC Minas. Zend Certified Engineer (ZCE) e Coffee Addicted Person (CAP). @KennedyTedesco

JUNTE-SE A MAIS DE 150.000 PROGRAMADORES