linguaggio di programmazione
linguaggio di programmazione particolare linguaggio impiegato per esprimere dati e istruzioni che possano essere letti, interpretati ed eseguiti da un automa esecutore, in particolare da un computer. Come in ogni tipo di comunicazione che necessita di un linguaggio comune, in cui si utilizzano parole, frasi, concetti comprensibili e non ambigui per i soggetti comunicanti, anche la comunicazione tra uomo e automa necessita di un linguaggio condiviso da entrambi. Essendo più rigide e schematiche le capacità interpretative e operative di un automa rispetto alla duttilità di un soggetto pensante, il linguaggio di comunicazione con l'automa è necessariamente un linguaggio che segue regole applicabili indipendentemente dai contesti e che, pur essendo potenzialmente in grado di generare grandi quantità di frasi, come sequenze di simboli sintatticamente corrette, è comunque un sistema chiuso: in altri termini, nei linguaggi di programmazione, l'insieme di frasi generabili è infinito, ma caratterizzato da un alfabeto finito di simboli utilizzabili e da un insieme finito di costrutti applicabili per la costruzione delle frasi (→ grammatica).
Una volta progettato un algoritmo, questo deve essere espresso in un linguaggio di programmazione: per questa “traduzione” le regole sintattiche di costruzione delle frasi accettabili in quel linguaggio devono essere scrupolosamente seguite poiché tali regole, note anche all'automa esecutore, permetteranno all'automa stesso di interpretarle e tradurle in → linguaggio macchina per poi eseguirle. L’automa, infatti, conserva le informazioni, siano essi dati o procedure da eseguire, su un supporto fisico, che, per questo, è detto memoria dell'automa. La memoria è suddivisa in celle e queste a loro volta contengono più posti. Le informazioni sono memorizzate in codice binario, cioè come sequenze di bit. Il vantaggio di tale codifica risiede nel fatto che essa è di semplice realizzazione, perché molti componenti fisici elementari si presentano come sistemi bistabili, possono cioè trovarsi in due soli stati possibili del tipo: acceso/spento, chiuso/aperto ecc. L'insieme delle istruzioni scritte in sequenze di bit costituisce l’unico linguaggio che il computer riconosce, e costituisce il cosiddetto → linguaggio macchina. La scrittura degli algoritmi, anche semplici, in linguaggio macchina è tuttavia estremamente lunga e onerosa per il programmatore. Per superare parte delle difficoltà incontrate nell’uso del codice binario si sono storicamente ideati dei linguaggi assemblatori (linguaggio assembler o anche assembly) che introducono e utilizzano espressioni simboliche elementari per individuare interi gruppi di bit associati (per esempio, istruzioni, indirizzi ecc.). I linguaggi assemblatori consentono un’utilizzazione completa delle risorse dell’automa esecutore, essendo la loro struttura la più aderente a esso. La completa utilizzazione è però ottenuta a spese di una perdita di facilità di programmazione, perché la struttura di questi linguaggi è lontana dal problema da risolvere e la sintassi lontana dal linguaggio naturale. Per ovviare a questi inconvenienti si sono sviluppati linguaggi di programmazione il più possibili vicini ai linguaggi naturali.
Un linguaggio di programmazione cosiddetto ad alto livello consiste in un insieme di frasi per le quali esistono delle regole specifiche sulla forma (regole sintattiche) e sul significato (regole semantiche). Un programma scritto in un linguaggio ad alto livello è detto programma sorgente o codice sorgente: l’utente comunica con l’elaboratore attraverso il programma sorgente, che non è direttamente eseguibile dal computer perché necessita di essere tradotto in un linguaggio a esso accessibile. Ciò viene realizzato da un altro programma che controlla se l’istruzione è effettivamente costruita sulla base della grammatica e della sintassi del linguaggio che si sta utilizzando e, in caso affermativo, la traduce nella sequenza di istruzioni elementari del linguaggio macchina, cioè nel cosiddetto programma oggetto. La traduzione del programma sorgente in programma oggetto può avvenire secondo due diverse modalità:
• ciascuna istruzione del programma sorgente viene interpretata, tradotta in forma eseguibile dalla macchina ed eseguita, istruzione dopo istruzione. In questo caso il linguaggio di programmazione viene chiamato linguaggio interpretato, e il traduttore delle istruzioni prende il nome di programma interprete. Esempi di linguaggi di programmazione interpretati sono il → BASIC, il → LISP, I’APL;
• l’interpretazione e la traduzione vengono effettuate globalmente su tutte le istruzioni contenute nel programma sorgente prima che esso venga eseguito: il programma così tradotto (il programma oggetto) potrà essere poi eseguito un numero illimitato di volte. Poiché in questa seconda modalità l’operazione di lettura e il controllo della grammatica e della sintassi sono a carico di un programma detto → compilatore, il linguaggio prende il nome di linguaggio compilato. Esempi di linguaggi compilati sono il FORTRAN e il → C. Una volta eseguita la traduzione in linguaggio macchina, il compilatore produce un file eseguibile, che nei sistemi operativi più comuni, come Windows, Unix, Linux, ha l’estensione obbligatoria “.exe”. I file eseguibili risultano funzionanti anche in assenza del compilatore stesso e pertanto possono essere trasportati e attivati su altre macchine dotate dello stesso sistema operativo.
I linguaggi di programmazione comprendono diverse “famiglie” di linguaggi tenute assieme dal paradigma costruttivo dei linguaggi stessi. Per questo si parla, per esempio, di → linguaggi funzionali, di linguaggi logici o più correttamente linguaggi di → programmazione logica, di → linguaggi a oggetti, di → linguaggi di mark-up ecc. Una particolare attenzione va riservata ai linguaggi di programmazione logica, impiegati soprattutto nei contesti di problem solving. Un linguaggio logico, quale è il → PROLOG, fondamentale linguaggio di questo tipo, non utilizza istruzioni e procedure di calcolo per la risoluzione di problemi, ma forme logiche per esprimere le conoscenze che si hanno e le inferenze possibili per la loro manipolazione, in modo da giungere attraverso trasformazioni logicamente ammissibili ai risultati cercati. Il problema è così visto come un percorso da uno stato dei fatti iniziale a uno stato dei fatti finale e il linguaggio esprime le trasformazioni che possono essere fatte in questo percorso.
Accanto ai linguaggi di programmazione di tipo generale vi sono poi i linguaggi speciali, specificamente ideati per la definizione e la risoluzione di problemi in particolari aree di applicazione: per la loro struttura e per la presenza di procedure standard di risoluzione semplificano notevolmente all’utente il compito della scrittura dei programmi. Sono linguaggi utilizzati in vari settori: dal controllo automatico di macchine utensili alla simulazione di sistemi, alla progettazione grafica, e sono in continuo sviluppo perché non è possibile trovare metodi efficienti definitivi per problemi e applicazione in rapida espansione e continuo mutamento. Tra i linguaggi speciali vanno inclusi i linguaggi di simulazione, adatti a definire processi di simulazione di sistemi deterministici o probabilistici, che sono impiegati per ottenere informazioni sul comportamento di tali sistemi e sulle loro proprietà dinamiche.