Paradigma Imperativo
Tags: braziliandevs, paradigma, imperativo, programming
Published: 2022-03-21 03:30:59

Recentemente escrevi um artigo sobre linguagens multi-paradigma ([link para o artigo](https://dev.to/dnovais/o-que-significa-ser-multi-paradigma-8ad)) e para complementar o conteúdo, dando continuidade no tema sobre **paradigmas**, agora escrevo sobre o paradigma imperativo.

Para fins didáticos, segundo o dicionário, a palavra **imperativo** tem como significado, algo que acentua o caráter de mando, de autoridade, ou que exprime uma ordem, ou comando; autoritário. O termo “Imperare” em Latim significa “comandar”.

Se olharmos para nossa vida, tudo o que vamos fazer, desde quando acordamos até o final do dia, perceberemos que tudo é feito seguindo um passo a passo para serem executados com sucesso. Ao escovar os dentes, por exemplo, serão necessários uma sequência de ações que devem ser executadas.

Agora, se fossemos escrever um algoritmo, as instruções seriam escritas e passadas na sequência que devem ser executadas, tudo dependendo de variáveis, condicionais e estruturas de repetição para que possamos escovar os dentes com sucesso.

Ao nível computacional, estaríamos escrevendo um algoritmo de forma **procedural**, e de forma **imperativa**, diríamos exatamente um passo a passo detalhado de como o computador deve executar. Ou seja, o paradigma imperativo tem como o foco principal o **como fazer** e não **o que fazer**.

## Vamos aprofundar um pouco mais no assunto...
Boa parte das linguagens de programação nos últimos anos foram projetadas em torno da arquitetura do computador Von Neumann. O fundamento da programação imperativa é o conceito de Máquina de Turing, que nada mais é que uma abstração matemática que corresponde ao conjunto de funções computáveis.

> A Máquina de Turing foi aprimorada por John Von Neumann a uma arquitetura de computadores que fundamenta os computadores construídos até hoje. Isso explica, em parte, o sucesso das linguagens que seguem esse paradigma em relação às demais. Nesta arquitetura( usada hoje nos microcomputadores comercializados), tanto os dados como os programas são armazenados na mesma memória, e a CPU que processa as instruções, é separada da memória. Dessa forma, os dados e instruções devem ser transportados da memória para a CPU e os resultados das operações realizadas na CPU devem ser devolvidos para a memória.

As características principais das linguagens imperativas são:
-   As variáveis acabam modelando as células de memória; 
-   Os comandos de atribuição são baseados em operações de transferência dos dados e instruções; 
-   Execução sequencial de instruções;
-   Os operandos das expressões são passados da memória para a CPU, e o resultado da expressão é passado de volta para a memória, representada pelo lado esquerdo do comando de atribuição;
-   A iteração é rápida em computadores com este tipo de arquitetura porque as instruções são armazenadas em células adjacentes da memória. Essa eficiência desencoraja o uso da recursão para repetição;

Ao nível computacional, o paradigma imperativo está baseado na ideia de um estado que sofre modificações durante a computação. O estado é representado por um conjunto de associações de identificadores (variáveis globais e locais ativas do programa) em valores.

Um estado representa uma configuração/definição na memória do computador.

As linguagens imperativas, ao serem executadas eventualmente modificam o estado do programa. Nesse mesmo sentido, a programação imperativa se resume a três conceitos:
-   Estados de uma máquina abstrata, descritos por valores de um conjunto de variáveis;
-   Reconhecedores de estados — expressões compostas por relações entre esses valores ou os resultados de operações utilizando valores;
-   Comandos de atribuição e controle que manipulam o estado;

### Linguagens de programação
Vários tipos de linguagem de programação baseiam-se no modelo imperativo, dentre elas: Ada, ALGOL, Basic, C, PHP, Java, Cobol, Fortran, Pascal, Python, Ruby, Lua e Mathematica;

Linguagens imperativas são caracterizadas por três conceitos: **variáveis**, **atribuições** e **sequência**.

**Variáveis:** As variáveis mantêm o estado de um programa imperativo e são associadas com localizações de memória que correspondem a um endereço e um valor de armazenamento. O valor da variável pode ser acessado e alterado direta ou indiretamente, através de um comando de atribuição ou de um comando de leitura.

**Atribuições:** O comando de atribuição introduz uma dependência de ordem no programa: o valor de uma variável é diferente antes e depois de um comando de atribuição. 

**Sequência:** O resultado do processamento de um programa depende da ordem na qual os comandos são escritos e executados, ou seja, da sequência na qual os comandos estão escritos.

## Concluindo...
O paradigma imperativo é recomendado para projetos mais estáticos, ou seja, projetos com escopos mais fechados e que não haja grandes mudanças ao longo do tempo.

Ao contrário do paradigma declarativo, o paradigma imperativo possui a característica de alterar o estado do programa e valores, e como consequência, eventualmente ocorre os efeitos colaterais no projeto.

De forma resumida vejamos as vantagens e desvantagens do paradigma:

**Vantagens**
- Eficiência (baseado no modelo Von Neumann);
- Paradigma dominante;
- Paradigma bem estabelecido;
- Modelagem natural de aplicações baseadas no mundo real;
- Possui tipagem fraca e também muito flexível (alguns especialistas consideram isso uma desvantagem);

**Desvantagens**
- O código pode ficar de difícil legibilidade;
- Relacionamento indireto com a E/S (indução a erros/estados);
- Side Effects (Efeitos Colaterais) nos projetos;

---
## Referências
https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa
https://guia.dev/pt/pillars/languages-and-tools/programming-paradigms.html
https://leandromoh.gitbooks.io/tcc-paradigmas-de-programacao/content/2_paradigmas_imperativo_e_declarativo/21_paradigma_imperativo.html
https://blog.nubank.com.br/programacao-funcional-o-que-e-relacao-nubank/
http://sheilacaceres.com/courses/tapfe/pl/PL-7-ParadigmaImperativo.pdf
https://medium.com/@alexandre.malavasi/descomplicando-programa%C3%A7%C3%A3o-imperativa-declarativa-e-reativa-a481baa87742
https://www.inf.pucrs.br/~gustavo/disciplinas/pli/material/paradigmas-aula09.pdf