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.
Preferenze cookie

Gestisci i cookie usati su Glossario Italiano. Puoi modificare le preferenze in qualsiasi momento dal link "Gestisci preferenze" in fondo a ogni pagina.

  • Necessari
    Login, sicurezza (CSRF), preferenze cookie. Sempre attivi.
    Sempre on
  • Statistici
    Misurano in forma aggregata come viene usato il sito. Nessun profilo personale.
  • Marketing
    Cookie di reti pubblicitarie esterne, se attivati in futuro. Oggi GLS non usa script di terze parti e i nostri sponsor sono editoriali, non profilano.