Qual è la differenza tra paradigmi di programmazione dichiarativi e procedurali?


Risposte:


108

Imperativo

Esistono diversi sotto-paradigmi del paradigma di programmazione imperativa, come il paradigma di programmazione procedurale o orientato agli oggetti.

Nel paradigma della programmazione imperativa, descrivi l'algoritmo passo dopo passo, a vari gradi di astrazione.

Esempi di linguaggi di programmazione che supportano il paradigma procedurale:

  • C (e la maggior parte delle altre lingue legacy)
  • PHP, principalmente
  • In un certo senso, tutte le principali lingue

Orientato agli oggetti

Si riferisce in genere a linguaggi che presentano una gerarchia di tipi che ereditano sia i metodi che lo stato dai tipi di base ai tipi derivati, ma include anche l'insolito JavaScript basato su prototipi.

Esempi di linguaggi di programmazione che supportano il paradigma OO:

  • Giava

Dichiarativo

Esistono diversi sotto-paradigmi del paradigma di programmazione dichiarativa, come il paradigma di programmazione funzionale o logica.

Nel paradigma di programmazione dichiarativa, descrivi un risultato o un obiettivo e lo ottieni tramite una " scatola nera ". L'opposto dell'imperativo.

Esempi di linguaggi di programmazione che supportano il paradigma di programmazione dichiarativo:

  • yacc
  • Cima dell'albero
  • SQL
  • Espressioni regolari
  • lex
  • XSLT
  • markup, troff, CSS, VHDL

Funzionale

La programmazione funzionale enfatizza l'applicazione di funzioni senza effetti collaterali e senza stato mutabile. I sistemi dichiarativi di cui sopra mostrano alcuni aspetti della programmazione funzionale.

Esempi di linguaggi di programmazione che supportano il paradigma funzionale dichiarativo:

  • Haskell
  • OCaml
  • schema
  • Erlang
  • F #
  • Scala

61

La programmazione dichiarativa è dove dici quello che vuoi senza dover dire come farlo. Con la programmazione procedurale, è necessario specificare i passaggi esatti per ottenere il risultato.

Ad esempio, SQL è più dichiarativo che procedurale, poiché le query non specificano i passaggi per produrre il risultato.


2
+1 per un buon esempio su SQL. possiamo avere altri esempi per favore?
mauris

5
Mauris: Forse non è un linguaggio di programmazione, ma l'HTML è dichiarativo, perché descrivi quello che vuoi (un paragrafo con questo bit in grassetto), invece di scrivere "disegna stringa, misura stringa, avanza posizione, ecc." Un altro esempio è Prolog, dove un "programma" è un insieme dichiarativo di fatti e relazioni / deduzioni e una query. Il motore Prolog capisce come valutare la query: non è necessario dirgli come farlo. Infine, espressioni regolari: descrivi il modello piuttosto che precisare i passaggi per verificare una corrispondenza.
itowlson

MXML (parte del framework Flex) è dichiarativo: gli dici in quale ordine vuoi che vengano visualizzati i tuoi oggetti / contenitori, e gestisce il layout a seconda che tu gli abbia detto di disporsi orizzontalmente o verticalmente. ActionScript 3 è procedurale con supporto per i paradigmi OOP.
Urrà, sto aiutando il

makefiles è un altro linguaggio dichiarativo abbastanza famoso
Stefano Borini

25

Lascia che ti faccia un esempio del mondo reale: ho bisogno di una tazza di tè.

Procedurale:

  1. Vai in cucina
  2. Prendi zucchero, latte e tè,
  3. Mescolali e scaldali sul fuoco finché non bolle
  4. Mettilo in una tazza e portamelo

Dichiarativo:

  1. Portami una tazza di tè.

In un linguaggio procedurale, definisci l'intero processo e fornisci i passaggi su come farlo. Devi solo fornire ordini e definire come verrà servito il processo.

In un linguaggio dichiarativo, è sufficiente impostare il comando o l'ordine e lasciare che sia sul sistema come completare l'ordine. Hai solo bisogno del tuo risultato senza scavare in come dovrebbe essere fatto.


2
Questo esempio estremamente semplificato ha effettivamente portato a casa il punto per me (un po '). Ma una cosa mi infastidisce ancora, cercando di capire la differenza - e se non ci fosse il comando "Dammi una tazza di tè"? Dovresti quindi crearlo da solo? Se è così, non creeresti una funzione simile all'esempio procedurale? Immagino che ciò che mi confonde è che sembra che procedurale e dichiarativo non siano proprietà fisse di un linguaggio specifico , ma piuttosto come usi quel linguaggio? Potresti dire "Dammi una tazza di tè" in Java, se questo è un metodo disponibile ...
Magnus W

3
Mi chiedo se "1. Tea, Earl Grey, Hot" sarebbe un esempio migliore. Sta dichiarando ciò che deve essere consegnato, non quali azioni devono essere eseguite ('Portami ...')
JeffUK

Magnus, la tua domanda è assolutamente giusta. A mio parere, i linguaggi dichiarativi sono linguaggi di livello più alto e derivano dal procedurale. Ricordi la volta in cui gli sviluppatori devono utilizzare le righe di comando per aggiungere due numeri? Ora puoi ottenere la SOMMA di due o più numeri con una semplice funzione. Quindi, dal mio punto di vista, se non c'è il comando "Dammi una tazza di tè", devi crearlo. Quando la prossima persona proverà a usare, sarà lì. Secondo la mia scarsa conoscenza. Grazie
Muhammad Zeeshan Tahir

5

Programmazione procedurale:

Nella programmazione procedurale, all'avvio del programma, segue una serie di istruzioni. Le istruzioni possono cambiare in base ad alcuni file o contenuti di memoria, ma nel complesso non variano molto. l'input al programma in genere non proviene dall'input dell'utente in tempo reale, ma piuttosto da un insieme di dati pre-raccolti.

Programmazione dichiarativa:

Nella programmazione dichiarativa basata su eventi si centralizza attorno a un corpo di dati con azioni opzionali che il programma può intraprendere su di esso. Ad esempio, ogni "evento" in un word processor è qualsiasi modifica del mouse o della tastiera (o file) che influisce sui dati, sui documenti. Non è necessario eseguirli in alcun ordine. La programmazione guidata dagli eventi assume la forma di piccoli programmi (gestori di eventi) che lavorano tutti su un insieme comune di dati, in modo che ogni piccolo programma possa utilizzare gli stessi dati, il documento in questo esempio.


0

La principale differenza tra due linguaggi di programmazione sono: Nella programmazione procedurale, diciamo al computer come risolvere il problema e nella programmazione dichiarativa, diciamo al computer quale problema vogliamo risolvere.


0

Per affrontare il commento ansible e forse fornire un esempio tra le differenze dei due. Ansible è procedurale dove qualcosa come un burattino o una terraforma sono dichiarativi. Ad esempio, crei un file yaml ansible per distribuire 10 istanze ec2 come questa:
-ec2: count: 10 image: ami-058c6e5b73b074cd2 instance_type: t2.micro

Se dovessi eseguire quel file due volte, ti ritroveresti con 20 istanze di t2.micro ec2. Se hai scritto l'equivalente in un linguaggio dichiarativo come terraform e lo hai eseguito due volte, avresti solo 10 istanze t2.micro in esecuzione, indipendentemente da quante volte l'hai eseguito. I linguaggi dichiarativi specificano lo stato finale. I linguaggi procedurali fanno solo quello che gli dici senza riguardo allo stato attuale o passato.


-1

Quindi YAML è un linguaggio di programmazione dichiarativo? Perché definiamo ciò che vogliamo invece di scrivere la logica effettiva.

Lo chiedo perché se qualcuno conosce Ansible che è uno strumento di gestione della configurazione, utilizza YAML ma rientra comunque nella categoria del linguaggio procedurale.



Questo è più simile a un commento molto affermato senza risposta
zardilior

-2

Nell'approccio procedurale codifichi le tue istruzioni per ottenere il risultato. Nell'approccio dichiarativo definisci ciò che deve essere risolto come la conoscenza di risolvere il problema. Dai un'occhiata all'esempio di approccio procedurale o dichiarativo che ho implementato in entrambi gli approcci.

Come vedresti nell'esempio, nell'approccio dichiarativo, non è necessario istruire COME risolvere il problema.


Stai facendo riferimento ad esempi fuori sede come se fossero scritti qui. Porta i tuoi esempi come parte della tua risposta.
ChronoFish
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.