Glossario Paradigmi di programmazione
Glossario verificato
I modi di pensare il codice: programmazione a oggetti, funzionale e procedurale. I paradigmi spiegati in modo accessibile.
-
P
-
Programmazione a attori
Modello di concorrenza in cui unità indipendenti dette attori comunicano solo scambiandosi messaggi asincroni, senza memoria condivisa. Semplifica la costruzione di sistemi concorrenti e distribuiti riducendo i problemi di sincronizzazione. -
Programmazione a componenti
Paradigma che costruisce il software assemblando componenti riutilizzabili e sostituibili, con interfacce ben definite. Favorisce modularità e riuso, permettendo di comporre sistemi da parti indipendenti. -
Programmazione a eventi
Paradigma in cui il flusso del programma è guidato da eventi, come input dell'utente o messaggi, a cui rispondono apposite funzioni. È tipico delle interfacce grafiche e delle applicazioni interattive. -
Programmazione a flusso di dati
Paradigma in cui il programma è modellato come una rete attraverso cui scorrono i dati, e le operazioni si attivano quando i loro ingressi sono disponibili. Rende naturale esprimere elaborazioni parallele e pipeline. -
Programmazione a livello di funzioni
Paradigma introdotto da John Backus nella Turing Lecture del 1977 in cui i programmi si costruiscono componendo funzioni tramite operatori (forme funzionali), senza nominare esplicitamente gli argomenti; contrapposto alla programmazione a livello di valori. -
Programmazione a passaggio di messaggi
Paradigma in cui i processi o gli oggetti non condividono memoria ma comunicano e si coordinano esclusivamente inviandosi messaggi espliciti tramite operazioni di invio e ricezione; è alla base di modelli concorrenti come il modello ad attori e dei sistemi distribuiti. -
Programmazione a spazio di tuple
Paradigma di coordinazione in cui processi concorrenti comunicano in modo disaccoppiato scrivendo e leggendo tuple in una memoria associativa condivisa (lo spazio di tuple), senza indirizzarsi a vicenda. Reso celebre dal modello Linda di David Gelernter. -
Programmazione a vincoli
Paradigma in cui si dichiarano le relazioni e i vincoli che la soluzione deve soddisfare, lasciando a un risolutore il compito di trovarla. È usato per problemi di pianificazione, scheduling e ottimizzazione. -
Programmazione ad insiemi di risposte
Paradigma di programmazione logica dichiarativa basato sulla semantica dei modelli stabili: il programma esprime regole e vincoli e le soluzioni sono gli insiemi di risposte (answer set) calcolati da un solver, orientato a problemi combinatori di ricerca. -
Programmazione array-oriented
Approccio che tratta interi array come unità di calcolo, applicando operazioni all'intera struttura invece che elemento per elemento. È tipico di linguaggi per il calcolo numerico e l'analisi dei dati. -
Programmazione asincrona
Modello in cui le operazioni lunghe non bloccano il flusso, che prosegue e riceve il risultato quando è pronto. Migliora reattività ed efficienza, al prezzo di una gestione più complessa del controllo. -
Programmazione basata su automi
Paradigma, introdotto da Anatoly Shalyto, che descrive il comportamento del programma tramite macchine a stati finiti: gli stati di controllo sono resi espliciti e i grafi di transizione guidano specifica, implementazione e documentazione del software. -
Programmazione basata su classi
Modello della programmazione a oggetti in cui gli oggetti sono istanze di classi che ne definiscono struttura e comportamento. È l'approccio più diffuso, adottato da linguaggi come Java, C++ e Python. -
Programmazione basata su prototipi
Variante della programmazione a oggetti in cui gli oggetti ereditano direttamente da altri oggetti, senza classi. È il modello alla base di JavaScript, dove il comportamento si condivide clonando ed estendendo prototipi. -
Programmazione basata su regole
Paradigma dichiarativo in cui la logica è espressa come insieme di regole condizione-azione: un motore di inferenza valuta i fatti disponibili e attiva le regole applicabili, senza un flusso di controllo esplicito; è tipico dei sistemi esperti e dei sistemi a produzione. -
Programmazione basata sul flusso
Variante del paradigma dataflow in cui l'applicazione è una rete di processi "scatola nera" che si scambiano pacchetti di informazione lungo connessioni definite esternamente ai processi. Formalizzata da J. Paul Morrison negli anni Settanta. -
Programmazione concatenativa
Paradigma in cui ogni espressione denota una funzione e la giustapposizione di espressioni ne denota la composizione: i programmi si costruiscono componendo funzioni anziché applicandole ad argomenti espliciti, spesso operando su una pila; esempi sono Forth e Factor. -
Programmazione dichiarativa
Paradigma in cui si specifica cosa si vuole ottenere piuttosto che come calcolarlo, lasciando al sistema il compito di determinare la procedura. Linguaggi di query e descrizioni di interfacce ne sono esempi, favorendo concisione e riduzione degli errori procedurali. -
Programmazione difensiva
Stile di programmazione che anticipa input non validi, errori e condizioni impreviste scrivendo codice capace di rilevarli e di mantenere il sistema in uno stato corretto; è usato dove servono alta affidabilità, sicurezza o continuità di servizio. -
Programmazione differenziabile
Paradigma in cui i programmi sono composti da funzioni differenziabili, così che l'intero codice possa essere derivato end-to-end tramite differenziazione automatica e ottimizzato con metodi basati sul gradiente; è centrale nell'apprendimento profondo. -
Programmazione distribuita
Paradigma in cui il programma è strutturato come componenti che eseguono su nodi distinti collegati in rete, coordinandosi tramite scambio di messaggi o chiamate remote per raggiungere un obiettivo comune, gestendo latenza, guasti parziali e assenza di memoria condivisa. -
Programmazione esplorativa
Stile di sviluppo in cui il programma viene fatto crescere in modo incrementale e sperimentale, provando interattivamente varianti e configurazioni prima di convergere sulla soluzione; è favorito da ambienti interattivi come i REPL di Lisp e Smalltalk. -
Programmazione funzionale reattiva (FRP)
Paradigma che combina lo stile funzionale con la gestione di flussi di valori che cambiano nel tempo. Permette di descrivere in modo dichiarativo come l'interfaccia o il sistema reagiscono ai cambiamenti dei dati. -
Programmazione funzionale-logica
Paradigma dichiarativo che integra in un unico linguaggio i tratti della programmazione funzionale, come funzioni e valutazione pigra, e di quella logica, come variabili libere, unificazione e ricerca con backtracking; ne è esempio il linguaggio Curry. -
Programmazione generativa
Paradigma in cui il software non viene scritto direttamente ma prodotto automaticamente da specifiche di più alto livello tramite generatori, template o metaprogrammi, con l'obiettivo di ricavare su richiesta i componenti di una famiglia di sistemi a partire da modelli di dominio. -
Programmazione generica
Tecnica che scrive algoritmi e strutture dati indipendenti dal tipo specifico dei dati trattati, parametrizzandoli. Permette di riutilizzare lo stesso codice con tipi diversi mantenendo la sicurezza dei tipi. -
Programmazione guidata dai dati
Paradigma in cui la struttura e il flusso del programma sono determinati dai dati che esso elabora anziché da una sequenza di passi codificata: le istruzioni descrivono i dati da riconoscere e la relativa elaborazione, come nei linguaggi tabellari e in AWK. -
Programmazione imperativa
Paradigma in cui il programma è una sequenza di istruzioni che modificano esplicitamente lo stato tramite assegnamenti, cicli e condizioni. Descrive passo per passo come raggiungere il risultato, rispecchiando da vicino il modello di esecuzione della macchina. -
Programmazione intenzionale
Paradigma sviluppato da Charles Simonyi che registra nel sorgente l'intenzione precisa del programmatore o dell'utente al livello di astrazione a cui pensa, separando le intenzioni di dominio dalla loro implementazione per rendere il codice più modulare e riusabile. -
Programmazione letteraria
Paradigma introdotto da Donald Knuth nel 1984 in cui il programma è redatto come un testo esplicativo in linguaggio naturale intervallato da frammenti di codice, dai quali si estraggono automaticamente sia la documentazione sia il sorgente compilabile, seguendo l'ordine del ragionamento umano. -
Programmazione logica
Paradigma dichiarativo in cui il programma è un insieme di fatti e regole e il calcolo consiste nel derivare conclusioni tramite inferenza logica. L'esecuzione avviene interrogando la base di conoscenza, come nel linguaggio Prolog, che cerca soluzioni compatibili con i vincoli. -
Programmazione logica con vincoli
Paradigma che estende la programmazione logica sostituendo l'unificazione con la risoluzione di vincoli su domini specifici (reali, interi, insiemi finiti). Introdotto da Jaffar e Lassez nel 1987 come schema generico CLP(X) parametrico sul dominio. -
Programmazione modulare
Approccio che suddivide un programma in moduli distinti e indipendenti, ciascuno con una responsabilità precisa. Favorisce riuso, manutenzione e lavoro in parallelo, riducendo la complessità complessiva del sistema. -
Programmazione multiparadigma
Approccio che combina in un unico linguaggio o programma più paradigmi, per esempio imperativo, funzionale e orientato agli oggetti, lasciando allo sviluppatore la scelta dello stile più adatto a ciascun problema; ne sono esempi linguaggi come Scala, Python e C++. -
Programmazione orientata agli agenti
Paradigma introdotto da Yoav Shoham che programma entità software (agenti) descrivendone lo stato con nozioni mentalistiche come credenze, capacità e impegni; il calcolo procede tramite agenti che si informano, richiedono e cooperano scambiandosi messaggi. -
Programmazione orientata agli aspetti
Tecnica che isola le funzionalità trasversali, come logging o sicurezza, in moduli separati detti aspetti. Evita di disperdere lo stesso codice in tutto il programma, migliorando ordine e manutenibilità. -
Programmazione orientata ai dati
Approccio che progetta il software attorno all'organizzazione e alla trasformazione efficiente dei dati in memoria. È usato dove le prestazioni contano, come nei motori di gioco, sfruttando meglio la cache del processore. -
Programmazione orientata ai ruoli
Paradigma che modella il comportamento tramite ruoli, insiemi di proprietà che un oggetto assume nel contesto delle sue collaborazioni; un oggetto può giocare più ruoli e cambiarli a runtime, separando l'identità stabile dal comportamento contestuale. -
Programmazione orientata al contesto
Paradigma (COP) che consente di modificare dinamicamente il comportamento del programma in base al contesto d'esecuzione, tramite costrutti come i livelli (layer) attivabili e disattivabili a runtime; supporta software adattivo e sensibile al contesto. -
Programmazione orientata al dominio
Approccio che modella il software attorno ai concetti e al linguaggio del dominio applicativo. Avvicina il codice al modo di ragionare degli esperti del settore, riducendo la distanza tra requisiti e implementazione. -
Programmazione orientata al linguaggio
Paradigma descritto da Martin Ward nel 1994 in cui, invece di risolvere il problema con un linguaggio generico, si creano prima uno o più linguaggi specifici di dominio (DSL) e in essi si risolve il problema, trattando il linguaggio come componente software di primo livello. -
Programmazione orientata al soggetto
Paradigma orientato agli oggetti in cui stato e comportamento non sono intrinseci all'oggetto ma forniti da diverse prospettive soggettive (soggetti) componibili tra loro; nato in IBM, è considerato un precursore degli approcci orientati agli aspetti. -
Programmazione orientata alle caratteristiche
Paradigma (FOP) che struttura il software attorno alle caratteristiche (feature) come unità di composizione, permettendo di generare i singoli prodotti di una linea di prodotti software combinando e sovrapponendo incrementi di funzionalità. -
Programmazione parallela
Approccio che scompone un calcolo in parti eseguite simultaneamente su più unità di elaborazione. Punta a ridurre i tempi sfruttando processori multicore o sistemi distribuiti, richiedendo attenzione alla sincronizzazione. -
Programmazione probabilistica
Paradigma dichiarativo per specificare modelli probabilistici direttamente come programmi, in cui è possibile campionare da distribuzioni e condizionare le variabili su osservazioni; l'inferenza sulle grandezze incerte viene poi eseguita automaticamente dal sistema. -
Programmazione procedurale
Sottoinsieme del paradigma imperativo che struttura il codice in procedure o funzioni richiamabili, favorendo riuso e modularità. Organizza il flusso attorno a chiamate a subroutine che operano su dati passati come parametri, migliorando la leggibilità rispetto al codice monolitico. -
Programmazione quantistica
Paradigma per progettare programmi eseguibili su computer quantistici, che manipolano qubit tramite porte e circuiti sfruttando sovrapposizione ed entanglement; comprende linguaggi e framework dedicati come Qiskit, Q# e Cirq per implementare algoritmi quantistici. -
Programmazione reattiva
Paradigma incentrato sui flussi di dati e sulla propagazione automatica dei cambiamenti: quando una sorgente cambia, i valori che ne dipendono si aggiornano di conseguenza. È adatto a interfacce e sistemi orientati agli eventi, dove lo stato evolve nel tempo in modo asincrono. -
Programmazione reversibile
Paradigma in cui i programmi eseguono in modo deterministico sia in avanti sia all'indietro: le operazioni devono essere iniettive, così da poter ricostruire lo stato precedente senza perdita di informazione; il linguaggio Janus ne è il capostipite. -
Programmazione simbolica
Approccio che manipola simboli ed espressioni anziché soli valori numerici, trattando il codice stesso come dato. È tipico dei linguaggi della famiglia Lisp e di applicazioni di calcolo formale e intelligenza artificiale. -
Programmazione sincrona
Modello in cui le operazioni vengono eseguite in sequenza e ciascuna attende il completamento della precedente. È semplice da seguire, ma un'operazione lenta blocca tutte quelle successive. -
Programmazione stack-oriented
Paradigma in cui le operazioni agiscono su una pila implicita di valori, senza nominare variabili intermedie. È il modello di linguaggi come Forth e del bytecode di molte macchine virtuali. -
Programmazione strutturata
Paradigma che organizza il codice con costrutti chiari come sequenze, selezioni e cicli, evitando i salti incondizionati. Rende i programmi più leggibili e manutenibili ed è alla base della programmazione moderna. -
Programmazione tacita
Stile, detto anche point-free, in cui le definizioni di funzione non nominano gli argomenti su cui operano ma si limitano a comporre altre funzioni e combinatori; è tipico di linguaggi come APL e J e dei linguaggi concatenativi. -
Programmazione visuale
Paradigma in cui i programmi si costruiscono manipolando graficamente elementi come blocchi, nodi e connessioni invece di scrivere testo, usando disposizioni spaziali e simboli come sintassi; ne sono esempi Scratch, LabVIEW e gli editor a nodi.