programmazione
programmazione insieme delle operazioni (→ programma) necessarie a istruire un automa esecutore; per questo scopo l’uomo interagisce con la macchina attraverso un opportuno linguaggio mediante il quale comunica alla macchina le azioni da eseguire. Poiché i vantaggi dell’automa rispetto all’uomo risiedono nella quantità di memoria in cui immagazzinare le informazioni e nella velocità dell’elaborazione, l’uomo affida alla macchina tutte le azioni onerose in termini di tempo e di quantità di informazione: lo scopo della programmazione è proprio quello di impartire le giuste istruzioni e i comandi appropriati affinché l’automa possa eseguire correttamente il suo compito. La programmazione non è propriamente una scienza, ma una tecnica fondata su elementi teorici acquisiti da altri ambiti disciplinari, prevalentemente in contesto logico-matematico, ma non esclusivamente; per questo è più corretto parlare di tecnica di programmazione. Essa si basa sull’utilizzo di un → linguaggio di programmazione, che attraverso le proprie → grammatica e → sintassi definisce le regole che il programmatore deve rispettare per ottenere una comunicazione non ambigua con la macchina. Per realizzare una buona programmazione occorre innanzitutto saper costruire l’algoritmo adeguato alla risoluzione del problema; inoltre, occorre conoscere le regole del linguaggio specifico che si intende utilizzare e le caratteristiche specifiche della macchina, per poter adattare al meglio il programma alle capacità dell’hardware a disposizione. La programmazione ha come risultato finale un prodotto (il programma eseguibile, anche chiamato applicazione) dotato di caratteristiche che rendano facile il suo utilizzo anche da parte di utenti esterni non esperti; per questa ragione si prevede anche la progettazione di un’interfaccia tra il programma e l’utilizzatore finale.
Non esiste una vera e propria teoria matematica della programmazione, ma la pratica e l’affinamento delle svariate tecniche di programmazione hanno consolidato negli anni un modalità costruttiva condivisa che prevede diverse fasi: la progettazione delle modalità di risoluzione, la scrittura degli algoritmi necessari, il controllo del flusso delle istruzioni nel programma e dell’esecuzione dei comandi, con particolare attenzione alla gestione degli eventuali errori, la strutturazione delle parti del programma in livelli di priorità, l’eventuale creazione di sezioni di programma indipendenti che risolvano problemi particolari. L’insieme di tutti questi aspetti si realizza in termini organizzativi attraverso la → programmazione strutturata, che utilizza al suo interno le diverse strutture quali il blocco, il controllo, il modulo, l’oggetto, la funzione, la proposizione logica.
L’esistenza di linguaggi di programmazione differenti risponde principalmente all’esigenza di risolvere differenti classi di problemi; a tal scopo si utilizzano peculiarmente alcune strutture particolari che rispondono meglio a questo requisito; in questi casi la modalità di programmazione prende il nome dalle strutture interne tipiche del linguaggio:
• la programmazione a blocchi usa strutture sequenziali costituite da blocchi di istruzioni legati tra loro da condizioni esterne dipendenti dal programma principale;
• la programmazione modulare prevede l’organizzazione del programma principale in varie parti denominati moduli, ciascuno dei quali è sviluppato in maniera autonoma prima di essere inserito nel programma finale; da questo tipo di programmazione discende la → programmazione a oggetti;
• la programmazione funzionale usa come struttura principale la funzione (→ funzione, in un linguaggio di programmazione);
• la programmazione procedurale utilizza la → procedura come struttura principale: si raggruppano porzioni di programma indipendenti e si utilizzano quando occorre tramite un loro richiamo dal programma;
• la programmazione logica usa proposizioni e connettivi logici, da cui deriva conclusioni attraverso regole di inferenza logica. Il linguaggio più diffuso in quest’ambito è il → prolog.
Se si cerca di risolvere un particolare problema attraverso lo sviluppo di un unico programma, l’ambiente in cui lo si realizza prende il nome di monoprogrammazione. Tale modalità è stata l’unica attuabile fino a che non sono comparse le prime macchine funzionanti con più processori e, quindi, capaci di eseguire più operazioni contemporaneamente; la possibilità di connettere più computer tra di loro in rete ha inoltre dato sviluppo alla tecnica della multiprogrammazione. In tale contesto sono possibili le due seguenti opzioni:
• la programmazione parallela, in cui alcuni blocchi di istruzioni di uno stesso programma sono elaborati simultaneamente o da più processori dello stesso computer o da più computer in rete;
• il multiprocessing, in cui più programmi possono essere eseguiti contemporaneamente da più processori o da più computer in rete.
I processori sono programmati per poter eseguire alcune operazioni in automatico, come accade per esempio durante l’accensione del computer; i comandi eseguibili sono scritti su una memoria non volatile del tipo rom (Read Only Memory) oppure eprom (Electronic Programmable Only Memory) o altre simili, in modo tale che i dati rimangano in essa anche dopo lo spegnimento della macchina. Tale programmazione è molto particolare e si discosta da quella usuale, in quanto il linguaggio di programmazione elabora direttamente il codice binario riconosciuto dal computer; per questi motivi, quando le esigenze della programmazione si spostano sui flussi delle informazioni e delle operazioni che avvengono al livello più basso, ossia attraverso i circuiti integrati del microprocessore e delle sue periferiche, l’ambiente di sviluppo prende il nome di microprogrammazione. Si definisce programmazione a basso livello questa tipologia di programmazione, in cui i linguaggi specifici contengono comandi e istruzioni diretti ai registri di memoria e ai circuiti della macchina, per differenziarla dalla programmazione vera e propria, detta ad alto livello, che utilizza invece i linguaggi algoritmici e che, sfruttando le potenzialità di calcolo e di elaborazione, non entra nel dettaglio di come tali operazioni siano effettuate dalla macchina stessa. La programmazione ad alto livello distingue infine le varie tipologie di programmi in generazioni: più è alto il grado di generazione (quarto, quinto ecc.), maggiore è l’astrazione del linguaggio che, all’aumentare del livello, utilizza sempre più numerosi macrocodici, funzioni e procedure preesistenti, librerie esterne di programmi, entrando così sempre meno nel dettaglio delle singole operazioni ed elaborazioni effettuate dalla macchina.