Nell’ambito della filosofia della scienza, il termine paradigma indica “un insieme di teorie, standard e metodi che rappresentano un modo di organizzare la conoscenza, cioè un modo di guardare il mondo”.
Analogamente, un paradigma di programmazione fornisce un metodo per concettualizzare il processo di computazione e per organizzare e strutturare i compiti che il calcolatore deve svolgere. I principali paradigmi di programmazione sono:
L’object-orientend programming (OOP) è spesso considerato un paradigma, ma è più corretto definirlo come un concetto ortogonale ai principali paradigmi, in quanto più essere combinato con ciascuno di essi: nel caso dei linguaggi ad oggetti più usati (Java, C++, ecc.) si tratta di un’estensione della programmazione imperativa, mentre ad esempio il linguaggio Scala combina l’OOP con la programmazione funzionale.
Il paradigma imperativo è quello finora più usato in ambito industriale, quindi è utile presentarne le caratteristiche, al fine di confrontarlo con il paradigma funzionale (che sarà oggetto di questo corso).
Il paradigma imperativo si basa su elementi derivati dalla struttura dei calcolatori. La struttura concettuale dei calcolatori moderni è la macchina di von Neumann (che viene arricchita in vari modi, ma rimane sostanzialmente equivalente). Essa fu introdotta da von Neumann nel 1946, come proposta di un dispositivo realizzabile fisicamente che fose equivalente alla macchina di Turing universale, un modello matematico in grado di calcolare tutto ciò che è calcolabile.
La macchina di von Neumann ha quattro principali componenti.
Ogni processore ha un proprio linguaggio macchina, che comprende un’istruzione per ciascun’operazione implementata nell’hardware. Poichè la tecnologia usata per implementare i calcolatori si presta naturalmente alla rappresentazione di valori binari, le istruzioni sono sequenze di bit che codificano l’operazione da eseguire e gli operandi su cui eseguirla (che possono essere costanti, registri, locazioni di memoria, ecc..). Il formato esatto delle istruzioni dipende dal processore.
Il linguaggio assembler di un processore è la versione simbolica del linguaggio macchina, nella quale le istruzoni sono rappresentate da nomi (simboli) significativi anzichè da sequenze di bit.