Qual è la differenza tra programmazione imperativa, procedurale e strutturata?


85

Effettuando ricerche (libri, Wikipedia, domande simili su SE, ecc.) Ho capito che la programmazione imperativa è uno dei principali paradigmi di programmazione, in cui descrivi una serie di comandi (o dichiarazioni) che il computer deve eseguire (quindi lo ordina molto per intraprendere azioni specifiche, da cui il nome "imperativo"). Fin qui tutto bene.

La programmazione procedurale, d'altra parte, è un tipo specifico (o sottoinsieme) di programmazione Imperativa, in cui si utilizzano procedure (cioè funzioni) per descrivere i comandi che il computer dovrebbe eseguire.

Prima domanda : esiste un linguaggio di programmazione imperativo che non è procedurale? In altre parole, puoi avere una programmazione imperativa senza procedure?

Aggiornamento : questa prima domanda sembra avere una risposta. Una lingua PU be essere imperativa senza essere procedurale o strutturata. Un esempio è il linguaggio puro dell'Assemblea.

Quindi hai anche la programmazione strutturata, che sembra essere un altro tipo (o sottoinsieme) di programmazione imperativa, che è emersa per rimuovere la dipendenza dall'istruzione GOTO.

Seconda domanda : qual è la differenza tra programmazione procedurale e strutturata? Puoi averne uno senza l'altro e viceversa? Possiamo dire che la programmazione procedurale è un sottoinsieme della programmazione strutturata, come nell'immagine?

inserisci qui la descrizione dell'immagine

Risposte:


52

Molti dei termini possono essere riutilizzati (spesso utilizzati in modo improprio) sui linguaggi di programmazione, in particolare quelli diversi da quelli orientati agli oggetti.

Ecco alcune piccole descrizioni dei termini.

  1. Programmazione imperativa - Ai vecchi tempi, quando la programmazione era sostanzialmente in assemblea, il codice avrebbe avuto tonnellate di GOTO. Anche linguaggi di livello superiore come FORTRAN e BASIC hanno iniziato a usare gli stessi primitivi. In questo paradigma di programmazione, l'intero programma è un singolo algoritmo o funzionalità completa scritta in modo lineare, passo dopo passo. Questo è uno stile imperativo . Capire che si può davvero scrivere un lavoro imperativo del tutto negativo anche nel moderno linguaggio C, ma è abbastanza facile organizzare il codice in linguaggi di livello superiore.

  2. Programmazione strutturata e modulare - Molto spesso dovremmo essere in grado di usare il termine in modo intercambiabile ma con sottili differenze. Quando i linguaggi di livello superiore iniziarono a diventare più ricchi, ci si rese conto che tutte le unità di lavoro dovevano essere suddivise in parti più piccole trattabili, cioè quando le funzioni divennero realtà e la programmazione divenne una gerarchia di funzioni e molte di livello inferiore potevano essere riutilizzate.

    • La programmazione strutturata è qualsiasi programmazione quando la funzionalità è divisa in unità come la for loop, while loop, if... thenstruttura a blocchi ecc.
    • Inoltre, qui un pezzo di codice (funzione) può essere riutilizzato.
    • Nella programmazione modulare , si può creare una forma fisica di pacchetto - cioè un pezzo di codice che può essere spedito; che sono piuttosto generici e riutilizzabili. Questo si chiama moduli di elementi compilati insieme.
    • Quindi difficilmente si possono vedere programmi modulari che non sono strutturati e viceversa; la definizione tecnica è leggermente diversa ma il codice per lo più strutturato può essere reso modulare e in altro modo.
  3. Poi è arrivata la "programmazione orientata agli oggetti" che è ben definita in letteratura. Comprendere che la programmazione orientata agli oggetti è una forma di programmazione strutturata per definizione. Il nuovo nome per tutti quei codici basati su funzioni che è codice strutturato ma NON orientato agli oggetti è spesso chiamato programmazione procedurale.

    • Quindi il codice sostanzialmente strutturato in cui le funzioni (o le procedure) dominano sui dati è chiamato procedurale mentre la rappresentazione basata su classe e oggetto è chiamata orientata agli oggetti. Entrambi per definizione sono anche modulari.

Molte persone pensano - tutta la programmazione strutturata (forse saltando gli oggetti) come una programmazione imperativa; Immagino che ciò sia dovuto solo alla mancanza di una chiara definizione della programmazione imperativa, ma è sbagliato. Stai facendo una programmazione strutturata quando non stai facendo molti imperativi! Ma posso ancora scrivere molte funzioni e molte dichiarazioni goto all'interno del programma C o FORTRAN per il mixup.

Per essere specifici alle tue domande:

Prima domanda : il linguaggio assembly puro è un linguaggio imperativo che NON è strutturato o procedurale. (Avere un flusso di controllo interpretativo passo dopo passo non significa procedurale - ma la divisione della funzionalità in funzioni è ciò che rende un linguaggio procedurale).

  • correzione * Le forme più moderne di assemblaggio supportano l'uso di funzioni. In effetti, tutto ciò che è possibile nel codice di alto livello DEVE esistere a basso livello per funzionare. Sebbene sia una pratica molto migliore creare codice procedurale, è possibile scrivere sia codice procedurale che imperativo. A differenza di quest'ultimo, è più gestibile e più facile da capire (evitando orribili spaghetti code). Penso che ci siano script shell / bash che si adattano meglio al riconoscimento di essere puramente imperativo, ma anche in questo caso, la maggior parte ha funzioni, gli sviluppatori capiscono sicuramente quanto valore hanno.

Seconda domanda : la programmazione procedurale è una FORMA di programmazione strutturata.


BONUS

  • Secondo una certa tassonomia la classificazione primaria è dichiarativa (o linguaggio funzionale) vs. imperativo. I linguaggi dichiarativi consentono il calcolo senza descriverne il flusso di controllo, mentre l'imperativo è il punto in cui è definito il flusso di controllo esplicito (passo per passo). Sulla base di questa classificazione, la programmazione imperativa, per alcuni può essere un super set di programmazione strutturata, modulare e OO. Vedi questo: Programmazione funzionale vs. OOP

  • Dopo Object oriented, sono stati inventati altri paradigmi di programmazione: vedi qui per maggiori dettagli: quali sono le differenze tra programmazione orientata all'aspetto, orientata al soggetto e orientata al ruolo?


1
Quindi diresti che la programmazione procedurale è necessariamente anche una programmazione strutturata, mentre non è vero il contrario (anche se spesso il caso)?
Daniel Scocco,

2
Sì, lo direi.
Dipan Mehta,

1
Nella mia risposta ho definito imperativo vs. strutturato - in cui la programmazione imperativa è scritta con un'esecuzione passo-passo e non è strutturata. Tuttavia, secondo alcune definizioni, esiste un'altra classificazione; questa è una classificazione tra Dichiarativo (o linguaggio funzionale) vs. Imperativo. I linguaggi dichiarativi consentono il calcolo senza descriverne il flusso di controllo laddove come imperativo è definito il flusso di controllo esplicito (passo per passo). Sulla base di questa classificazione, la programmazione imperativa, per alcuni può essere un super set di strutturato. Alcuni non seguono esattamente questa definizione.
Dipan Mehta,

Ho un'opinione diversa, per quanto riguarda la definizione di programmazione strutturata. La programmazione strutturata e la programmazione modulare non sono la stessa cosa. Si prega di consultare la definizione alla fine di questa nota. Lo stesso link suggerisce che Assembler ** è un ** linguaggio di programmazione strutturato! Riferimento per la definizione di STP: en.wikipedia.org/wiki/Structured_programming - Emmad Kareem
NoChance

Una "forma fisica di pacchetto" ... un file o una directory / archivio di file? (O non lo è, ed è qualcos'altro.)
n611x007

4

Prima domanda: Sì, molti linguaggi puri orientati agli oggetti si qualificano. Sebbene dispongano di metodi molto vicini alle funzioni, visualizzano questi metodi in termini di messaggi e non danno loro abbastanza peso per chiamare il linguaggio procedurale.

Seconda domanda: la differenza è spesso in un ambito diverso. Puoi avere una funzione con dichiarazioni goto ovunque, che saranno in stile procedurale, ma non con una programmazione strutturata. D'altra parte, la maggior parte delle lingue OO supporta e incoraggia la programmazione strutturata, ma non la programmazione procedurale.

La programmazione procedurale descrive l'ordinamento globale del programma. I programmi procedurali sono quelli che sono compresi in modo più efficace guardando i loro grafici delle chiamate. La programmazione strutturale è una proprietà locale, si applica all'utilizzo di if e while anziché a goto.

Pertanto, queste due proprietà sono disgiunte, puoi avere l'una senza l'altra.


1
L'unica cartina di tornasole per essere procedurale è che il linguaggio contenga procedure (funzione o metodi ) ed essere imperativo, cioè. non dichiarativa. Ciò significa che la maggior parte dei linguaggi OO che non sono puramente funzionali sarebbe procedurale.
dietbuddha,

1
@dietbuddha: secondo questa definizione, Haskell si qualificherebbe come linguaggio procedurale attraverso l'uso delle monadi. Richiederei una certa dipendenza dalle procedure per rendere procedurale un linguaggio.
thiton,

Non conosco Haskell così bene, ma pensavo che Haskell fosse un linguaggio puramente funzionale perché racchiudeva gli effetti collaterali in Monads.
dietbuddha,

2
Bene, alcune persone affermano che Haskell non è puramente funzionale perché consente qualsiasi interazione con il mondo esterno (o perché un'estensione GHC , unsafePerformIOconsente di scatenare il caos). Altri scherzano dicendo che Haskell è il loro linguaggio di programmazione imperativo preferito. Ma il fatto è che un gran numero di codice Haskell vive nettamente separato IO, non usa scappatoie non standard per intrufolarsi negli effetti collaterali ed è puramente funzionale.

1
@thiton Non sono d'accordo. Anche le monadi sono costrutti funzionali; sembrano solo imperativi a causa dello zucchero sintattico di Haskell (la "notazione do"). Quando desugar monadi, la loro natura funzionale diventa evidente. Al contrario, i linguaggi OO sono davvero imperativi: alla base si basano sull'esecuzione sequenziale di dichiarazioni.
Andres F.

2

la maggior parte delle lingue popolari degli ultimi 50 anni sono state progettate attorno all'architettura informatica prevalente, chiamata architettura Von Neumann , dal nome di uno dei suoi autori, John von Neumann.

Queste lingue sono chiamate lingue imperative.

In un computer von Neumaan, sia i dati che i programmi sono memorizzati nella stessa memoria. La CPU che esegue le istruzioni è separata dalla memoria. Pertanto istruzioni e dati devono essere trasmessi dalla memoria alla CPU. I risultati delle operazioni nella CPU devono essere riportati nella memoria. Quasi tutti i computer digitali costruiti a partire dagli anni '40 si basano sull'architettura von Neumaan.


1
+1 non sono sicuro di cosa abbia a che fare con la domanda, ma è una risposta interessante.
Chuck Conway,

2
Che cosa? Dov'è la parte su Imperative vs Procedural, ecc?
bbqchickenrobot

Penso che il punto qui sia che le chiacchiere sulla struttura del programma (Imperativo, Dichiarativo, Procedurale, Orientato agli oggetti, Funzionale, ecc.) Siano costrutti di linguaggio e tutti i programmi alla fine vengono elaborati su macchine di architettura Von Neumann. Questo è simile al dire che tutte le lingue di Turing Complete sono equivalenti.
ChuckCottrill

2

Temo che nessuna delle risposte fornite finora catturi molto bene il nucleo dei concetti.

Imperativo, procedurale e strutturato non sono proprietà reciprocamente esclusive, si concentrano solo su un singolo aspetto della logica di modellazione.

Imperativo è la controparte di Imperativo dichiarativo, fondamentalmente significa che si dice al computer cosa fare facendolo eseguire una serie di istruzioni fornite. Un programma dichiarativo d'altra parte dice cosa raggiungere . In altre parole, definire i passaggi anziché definire un risultato.

La programmazione procedurale si riferisce alla capacità del processore (hardware o di un interprete) di avvolgere le istruzioni in composti, saltare a tale composto e tornare al punto dopo il salto una volta eseguito il composto. Questo può sembrare banale e per gli standard di oggi lo è, ma hai bisogno di un supporto di base nella macchina prima di poterlo fare: la possibilità di saltare, una sorta di stack per spingere un indirizzo su cui può essere saltato e saltato in un secondo momento e un puntatore dello stack. I microprocessori offrirono presto questa funzione, ma puoi immaginare un processore primitivo in grado di eseguire solo le istruzioni fornite in sequenza, come un nastro perforatore o un processore di schede perforate.

La programmazione strutturata è il passaggio successivo dalla possibilità di passare a un'altra istruzione. Alla fine tutto si riduce ai salti, ma se si possono avere salti condizionati, è possibile creare istruzioni di flusso di controllo di base come if-then, per, while, repeat-until e switch. L'applicazione di questi si chiama programmazione strutturata.

In qualsiasi ambiente di programmazione moderno avrai tutto quanto sopra a tua disposizione e lo darai per scontato, quindi non ne parliamo più come tale. Le proprietà differenzianti tra le lingue si sono da tempo spostate verso paradigmi di livello superiore come la programmazione orientata agli oggetti e funzionale.

La programmazione dichiarativa non è ancora all'ordine del giorno, soprattutto perché sarà sempre specifica del dominio, almeno in una certa misura. Non puoi avere un linguaggio dichiarativo generico. Questo è il motivo per cui siamo ancora bloccati con i cosiddetti linguaggi di terza generazione, in cui la programmazione dichiarativa o la "modellazione" verrebbero considerate di quarta generazione.

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.