Anche se la terminologia è lontana dalla standardizzazione, un modo comune per classificare i principali paradigmi di programmazione in
- procedurale
- Funzionale
- Logical
- Object Oriented
- Generico
Sembri già sapere com'è la programmazione procedurale.
Nelle funzioni funzionali 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 gli esempi di linguaggi funzionali sono LISP, Scheme e Haskel. È interessante notare che JavaScript supporta anche la programmazione funzionale.
Nella programmazione logica vengono definiti i predicati che descrivono le relazioni tra entità, ad esempio president(Obama, USA)
o president(Medvedev, Russia)
. Questi predicati possono diventare molto complicati e coinvolgere variabili, non solo valori letterali. Una volta specificati tutti i predicati, è possibile porre domande sul proprio sistema e ottenere risposte coerenti dal punto di vista logico.
La grande idea nella programmazione logica è che invece di dire al computer come per 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 si hanno i dati, che possono essere tipi primitivi, come interi e float, tipi composti, come matrici o liste e tipi definiti dall'utente, come le strutture. Hai anche le tue procedure, che operano sui dati. Al contrario, in OO ci sono oggetti, che includono sia dati che procedure. Questo ti permette di avere cose belle come l'incapsulamento, l'ereditarietà e il polimorfismo. Esempi: Smalltalk, C ++, Java, C #.
La programmazione
Generic è stata introdotta per la prima volta in Ada nel 1983 e si è diffusa dopo l'introduzione di modelli in C ++. Questa è l'idea che è possibile scrivere codice senza specificare i tipi di dati effettivi su cui opera e fare in modo che il compilatore lo comprenda. Ad esempio invece di scrivere
void swap(int, int);
void swap(float, float);
....
scriverai
void swap(T, T);
una volta e il compilatore genera un codice specifico per qualunque cosa possa essere T
, quando swap()
viene effettivamente utilizzato nel codice.
La programmazione generica è supportata a vari livelli da C ++, Java e C #.
È importante notare che molte lingue, come C ++, supportano più paradigmi. È anche vero che anche quando una lingua è detta per supportare un particolare paradigma, potrebbe non supportare tutte le caratteristiche del paradigma. Senza contare che c'è molto disaccordo su quali caratteristiche siano richieste per un particolare paradigma.