Qual é a diferença entre os paradigmas de programação declarativa e procedural?

Respostas:

108

Imperativo

Existem vários subparadigmas do paradigma de programação imperativa, como os paradigmas de programação procedural ou orientada a objetos.

No paradigma de programação imperativo, você descreve o algoritmo passo a passo, em vários graus de abstração.

Exemplos de linguagens de programação que suportam o paradigma procedural:

  • C (e a maioria das outras linguagens legadas)
  • PHP, principalmente
  • Em certo sentido, todas as principais línguas

Orientado a Objeto

Normalmente se refere a linguagens que exibem uma hierarquia de tipos que herdam os métodos e o estado dos tipos de base para os tipos derivados, mas também inclui o incomum JavaScript baseado em protótipo.

Exemplos de linguagens de programação que suportam o paradigma OO:

  • Java

Declarativo

Existem vários subparadigmas do paradigma de programação declarativa, como os paradigmas de programação funcional ou lógico.

No paradigma de programação declarativa, você descreve um resultado ou objetivo e o obtém por meio de uma " caixa preta ". O oposto de imperativo.

Exemplos de linguagens de programação que suportam o paradigma de programação declarativa:

  • yacc
  • Copa da árvore
  • SQL
  • Expressões regulares
  • Lex
  • XSLT
  • marcação, troff, CSS, VHDL

Funcional

A programação funcional enfatiza a aplicação de funções sem efeitos colaterais e sem estado mutável. Os sistemas declarativos acima exibem certos aspectos da programação funcional.

Exemplos de linguagens de programação que suportam o paradigma funcional declarativo:

  • Haskell
  • OCaml
  • Esquema
  • Erlang
  • F #
  • Scala
DigitalRoss
fonte
61

Programação declarativa é onde você diz o que quer sem ter que dizer como fazer. Com a programação procedural, você deve especificar as etapas exatas para obter o resultado.

Por exemplo, SQL é mais declarativo do que procedural, porque as consultas não especificam etapas para produzir o resultado.

Ned Batchelder
fonte
2
1 para um bom exemplo em SQL. podemos ter mais exemplos, por favor?
mauris,
5
Mauris: Talvez não seja uma linguagem de programação, mas o HTML é declarativo, porque você descreve o que deseja (um parágrafo com este bit em negrito), em vez de escrever "string de desenho, string de medida, posição de avanço, etc." Outro exemplo é o Prolog, onde um "programa" é um conjunto declarativo de fatos e relações / deduções e uma consulta. O mecanismo do Prolog descobre como avaliar a consulta: você não precisa dizer a ele como fazer isso. Finalmente, expressões regulares: você descreve o padrão em vez de explicar as etapas para testar uma correspondência.
itowlson
MXML (parte da estrutura do Flex) é declarativo: você diz a ele em que ordem deseja que seus objetos / contêineres sejam exibidos e ele lida com o layout, dependendo se você disse para ele se dispor horizontalmente ou verticalmente. ActionScript 3 é procedural com suporte para paradigmas OOP.
Hooray Im Helping
makefiles é outra linguagem declarativa bastante famosa
Stefano Borini,
25

Deixe-me dar um exemplo do mundo real: eu preciso de uma xícara de chá.

Processual:

  1. Ir para a cozinha
  2. Obtenha açúcar, leite e chá,
  3. Misture-os e aqueça no fogo até ferver
  4. Coloque isso em um copo e traga para mim

Declarativo:

  1. Pegue uma xícara de chá para mim.

Em uma linguagem procedural, você define todo o processo e fornece as etapas de como fazê-lo. Você apenas fornece pedidos e define como o processo será atendido.

Em uma linguagem declarativa, basta definir o comando ou pedido e deixar que fique no sistema como concluir esse pedido. Você só precisa do resultado, sem se aprofundar em como deve ser feito.

Muhammad Zeeshan Tahir
fonte
2
Este exemplo extremamente simplificado realmente me deixou claro (um pouco). Mas uma coisa ainda me incomoda, tentando entender a diferença - e se não houver um comando "Pegue uma xícara de chá"? Você então teria que criá-lo sozinho? Se sim, você não criaria uma função semelhante ao exemplo procedural? Acho que o que me deixa confuso é que parece que procedural e declarativo não são propriedades fixas de qualquer linguagem específica , mas sim como você usa essa linguagem? Você poderia dizer "Pegue uma xícara de chá" em Java, se esse for um método disponível ...
Magnus W
3
Eu me pergunto se, "1. Chá, Earl Grey, Quente" seria um exemplo melhor. Ele está declarando o que precisa ser entregue, não quais ações precisam ser realizadas ('Pegue-me ...')
JeffUK
Magnus, sua pergunta está absolutamente certa. Na minha opinião, as linguagens declarativas são linguagens de alto nível e derivadas de procedurais. Lembra-se da época em que os desenvolvedores precisam usar linhas de comando para adicionar dois números? Agora você pode obter a soma de dois ou mais números com apenas uma função simples. Portanto, na minha perspectiva, se não houver um comando "Pegue uma xícara de chá", você precisará criá-lo. Quando a próxima pessoa tentar usar, ela estará lá. Isso está de acordo com meu pouco conhecimento. Obrigado
Muhammad Zeeshan Tahir
5

Programação processual:

Na programação procedural, quando o programa é iniciado, ele segue um conjunto de instruções. As instruções podem mudar com base em algum arquivo ou conteúdo da memória, mas, no geral, não variam muito. a entrada para o programa normalmente não vem da entrada do usuário em tempo real, mas sim de um conjunto de dados pré-reunido.

Programação Declarativa:

Em eventos declarativos, a programação orientada centraliza-se em torno de um corpo de dados com ações opcionais que o programa pode realizar. Por exemplo, cada "evento" em um processador de texto é qualquer alteração no mouse ou teclado (ou arquivo) que afeta os dados, o (s) documento (s). Eles não precisam ser executados em qualquer ordem. A programação orientada a eventos assume a forma de pequenos programas (manipuladores de eventos) que trabalham todos em um conjunto comum de dados, de modo que cada pequeno programa pode usar os mesmos dados, o documento neste exemplo.

SattiS
fonte
1

A principal diferença entre duas linguagens de programação são: na programação procedural, dizemos ao computador como resolver o problema e na programação declarativa, informamos ao computador qual problema queremos resolver.

Manodhya Opallage
fonte
0

Para abordar o comentário ansible e talvez fornecer um exemplo entre as diferenças dos dois. Ansible é procedural onde algo como fantoche ou terraforma são declarativos. Por exemplo, você cria um arquivo yaml ansible para implantar 10 instâncias ec2 como este:
-ec2: count: 10 image: ami-058c6e5b73b074cd2 instance_type: t2.micro

Se você executasse esse arquivo duas vezes, acabaria com 20 instâncias t2.micro ec2. Se você escrever o equivalente em uma linguagem declarativa como o terraform e executá-lo duas vezes, você terá apenas 10 instâncias t2.micro em execução, não importa quantas vezes você execute. As linguagens declarativas especificam o estado final. As linguagens procedurais apenas fazem o que você diz, sem levar em conta o estado atual ou passado.

user13709426
fonte
-1

Então YAML é uma linguagem de programação declarativa? Porque definimos o que queremos em vez de escrever a lógica real.

Estou perguntando isso porque se alguém conhece o Ansible, que é uma ferramenta de gerenciamento de configuração, ele usa YAML, mas ainda se enquadra na categoria de linguagem procedural.

Sr. Kashyap
fonte
Este é mais como um comentário muito afirmado, não respondido
zardilior
-2

Na abordagem procedural, você codifica sua instrução para obter o resultado. Na abordagem declarativa, você define o que precisa ser resolvido como o conhecimento de como resolver o problema. Dê uma olhada no exemplo de abordagem processual ou declarativa que implementei em ambas as abordagens.

Como você veria no exemplo, na abordagem declarativa, você não precisa instruir COMO resolver o problema.

Arash Aghlara
fonte
Você está fazendo referência a exemplos externos como se estivessem escritos aqui. Traga seus exemplos como parte de sua resposta.
ChronoFish