Anche se la terminologia è tutt'altro che standardizzata, un modo comune per classificare i principali paradigmi di programmazione
- Procedurale
- Funzionale
- Logico
- Orientato agli oggetti
- Generico
Sembra che tu sappia già com'è la programmazione procedurale.
In funzionali lingue funzioni vengono trattate come oggetti di prima classe. In altre parole, è possibile passare una funzione come argomento a un'altra funzione oppure una funzione può restituire un'altra funzione. Il paradigma funzionale si basa sul calcolo lambda e esempi di linguaggi funzionali sono LISP, Scheme e Haskel. È interessante notare che JavaScript supporta anche la programmazione funzionale.
Nella programmazione logica si definiscono predicati che descrivono le relazioni tra entità, come president(Obama, USA)
o president(Medvedev, Russia)
. Questi predicati possono diventare molto complicati e coinvolgere variabili, non solo valori letterali. Dopo aver specificato tutti i predicati, è possibile porre domande al proprio sistema e ottenere risposte logicamente coerenti.
La grande idea nella programmazione logica è che invece di dire al computer come calcolare le cose, gli dici quali sono le cose. Esempio: PROLOG.
Il paradigma orientato agli oggetti è in qualche modo un'estensione della programmazione procedurale. Nella programmazione procedurale hai i tuoi dati, che possono essere tipi primitivi, come numeri interi e float, tipi composti, come matrici o elenchi, e tipi definiti dall'utente, come strutture. Hai anche le tue procedure che operano sui dati. Al contrario, in OO hai oggetti, che includono sia dati che procedure. Questo ti consente di avere cose carine come l'incapsulamento, l'eredità e il polimorfismo. Esempi: Smalltalk, C ++, Java, C #.
La programmazione generica è stata introdotta per la prima volta in Ada nel 1983 e si è diffusa dopo l'introduzione dei modelli in C ++. Questa è l'idea che è possibile scrivere codice senza specificare i tipi di dati effettivi su cui opera e che il compilatore lo capisca. Ad esempio invece di scrivere
void swap(int, int);
void swap(float, float);
....
tu scriveresti
void swap(T, T);
una volta e fare in modo che il compilatore generi codice specifico per qualsiasi cosa T
possa essere, quando swap()
viene effettivamente utilizzato nel codice.
La programmazione generica è supportata a vari livelli da C ++, Java e C #.
È importante notare che molti linguaggi, come il C ++, supportano più paradigmi. È anche vero che anche quando si dice che una lingua supporta un particolare paradigma, potrebbe non supportare tutte le caratteristiche del paradigma. Per non parlare del fatto che vi è molto disaccordo su quali caratteristiche sono richieste per un particolare paradigma.