INFORMATICA - I LINGUAGGI DI PROGRAMMAZIONE

LINGUE E LINGUAGGI

Come le lingue servono agli esseri umani per comunicare tra loro, i linguaggi di programmazione servono per comunicare con il computer.
Perché i messaggi inviati possano essere compresi da chi li riceve sono necessarie delle regole che stabiliscano come comunicare con i propri interlocutori.
Ogni linguaggio deve perciò possedere delle regole note e rispettate sia da chi trasmette i messaggi che da chi li riceve, in modo da escludere ogni incomprensione e ambiguità.
Questo è vero in particolare per quanto riguarda la comunicazione con il computer; infatti se una persona può completare il significato di una frase ambigua in base al contesto in cui la riceve, il computer non ha assolutamente questa capacità: capisce soltanto ciò che gli viene detto in modo esplicito ed esatto.
Le regole del linguaggio sono descritte dalla grammatica.
La grammatica viene di solito suddivisa in due parti essenziali: la sintassi e la semantica. La sintassi fornisce le regole necessarie per comporre le frasi mentre la semantica si occupa del significato delle frasi che abbiamo composto.
Le frasi possono essere formate usando le parole di un vocabolario, che a loro volta sono formate utilizzando i simboli di un alfabeto a disposizione (che può essere fatto di lettere, numeri e simboli vari).
Una lingua e un linguaggio di programmazione possiedono quindi una struttura simile: entrambi non sono altro che associazioni logiche di simboli che assumono differenti significati secondo come vengono disposti.
Una lingua permette di esprimere ad altri esseri dotati di intelligenza un grandissimo numero di cose molto diverse tra loro (compresi sentimenti, esperienze, idee ecc.) mentre un linguaggio di programmazione ha scopi molto più precisi e limitati (eseguire calcoli, analizzare e conservare dati, guidare delle macchine automatiche, produrre suoni o grafici ecc.) e si rivolge a delle macchine che non sono dotate di intelligenza.
Una lingua sarà quindi composta da un grandissimo numero di vocaboli che assumono significati anche molto diversi secondo il contesto in cui vengono usati, mentre tutti i linguaggi di programmazione sono caratterizzati da un limitato numero di parole riservate (il vocabolario del linguaggio) che possono essere utilizzate per comporre le istruzioni secondo una sintassi molto rigida.

TIPI DI LINGUAGGI DI PROGRAMMAZIONE

I linguaggi di programmazione possono essere raggruppati in molti modi diversi, secondo quali delle loro caratteristiche vengono prese in considerazione.
Un modo è quello di suddividerli secondo l'impiego principale per cui sono stati creati e vengono utilizzati.
Ci sono quelli a carattere tecnico-scientifico (come il FORTRAN), quelli per le elaborazioni di tipo commerciale e gestionale (il COBOL è il più conosciuto e utilizzato) quelli a carattere generale, utilizzati spesso per l'apprendimento delle tecniche di programmazione (come il PASCAL), quelli didattici a livello elementare (il LOGO viene usato in alcune scuole come modello educativo per avvicinare i bambini al computer), quelli per lo sviluppo di applicazioni nel campo dell'intelligenza artificiale (LISP e PROLOG) e molti altri ancora.
Un altro modo di raggruppare i linguaggi è quello di suddividerli in due grandi categorie: linguaggi a basso livello (linguaggi macchina e Assembler), detti anche linguaggi orientati alla macchina perché sono specifici per ogni computer, o meglio, per ciascun processore, e linguaggi ad alto livello o linguaggi evoluti.
Il computer può eseguire direttamente solo le istruzioni del linguaggio macchina; tutti gli altri linguaggi devono essere tradotti per poter essere compresi ed eseguiti.
La traduzione viene fatta da programmi di utilità chiamati assemblatori, per la traduzione del linguaggio Assembler, e compilatori o interpreti, secondo il modo di operare, per la traduzione dei linguaggi ad alto livello.

IL LINGUAGGIO MACCHINA

Il linguaggio macchina è stato il primo definito per comunicare al computer le istruzioni da eseguire.
E' un linguaggio molto complicato perché le istruzioni sono rappresentate soltanto da serie di cifre del sistema di numerazione binario (quindi stringhe di 0 e 1 difficilmente comprensibili per un essere umano); anche l'uso dei dati non si presenta più semplice: un dato viene specificato tramite l'indirizzo dell'area di memoria in cui è o deve essere memorizzato, e anche l'indirizzo viene espresso attraverso un numero binario.
Poiché il numero di cifre necessarie per rappresentare un numero nel sistema binario aumenta rapidamente, con grande difficoltà di percezione del numero stesso, i programmatori, in genere, invece del sistema di numerazione binario utilizzano il sistema di numerazione esadecimale, a base sedici (esadecimale e non decimale, poiché convertire un numero dal sistema di numerazione binario a quello esadecimale e viceversa è un'operazione molto semplice, si può dire immediata, mentre le conversioni tra sistemi binario e decimale possono risultare piuttosto complesse e poco utili).
Anche lavorando con numeri in esadecimale comunque le cose non si semplificano di molto.
I primi programmatori, che avevano a disposizione soltanto il linguaggio macchina, dovevano quindi essere molto esperti, e molto attenti dato che una semplice svista (come dimenticare uno 0 o scambiare uno 0 con un 1) poteva rendere il programma inutilizzabile.
Inoltre il programma era difficile da provare e da correggere; ogni modifica al programma poteva comportare dei cambiamenti di indirizzo dei dati o delle istruzioni che dovevano essere corretti con attenzione e potevano causare un'infinità di altri problemi.
Il tipo di istruzioni a disposizione era inoltre molto elementare (del tipo sposta un byte dalla memoria a un registro, o somma un registro al contenuto dell'accumulatore ecc.) quindi la stesura del programma era un'operazione a dir poco complessa.
Sebbene oggi i programmatori non creino più i programmi direttamente in linguaggio macchina ma utilizzino dei linguaggi di programmazione più semplici, il linguaggio macchina rimane comunque fondamentale perché il computer possa funzionare.
Il computer infatti è in grado di eseguire soltanto le istruzioni del linguaggio macchina. I programmi scritti in qualsiasi altro linguaggio devono essere tradotti in linguaggio macchina prima di poter essere eseguiti sul computer; naturalmente la traduzione non viene fatta dal programmatore ma, come abbiamo già avuto modo di vedere, da appositi programmi traduttori chiamati compilatori e interpreti, secondo il modo in cui operano.
Ogni computer, o meglio, ogni processore utilizza un proprio linguaggio macchina, diverso da quello degli altri processori.
L'insieme delle istruzioni che possono essere eseguite da un processore si dice repertorio e costituisce il set (insieme) delle istruzioni riconosciute.
Poiché ogni processore riconosce un set diverso di istruzioni, un programma in linguaggio macchina deve essere completamente riscritto, a volte con notevoli differenze, per poter girare su un altro computer.

LE ISTRUZIONI DEL LINGUAGGIO MACCHINA

Un'istruzione in linguaggio macchina è formata da un codice operativo che identifica il tipo di operazione e da una parte che permette di indicare i dati (operandi) su cui deve agire l'operazione.
Tutta l'istruzione è scritta con cifre del sistema di numerazione binario: il codice operativo è una sequenza particolare di 0 e 1 ricavabile dal set di istruzioni utilizzate e i dati vengono definiti con varie modalità ma comunque sempre attraverso cifre del sistema di numerazione binario che possono rappresentare l'indirizzo di una locazione di memoria o il numero di un registro del processore.
Di solito gli operandi sono uno, due o tre. Il numero e il tipo di operandi variano da istruzione a istruzione. Per esempio, un'istruzione aritmetica può avere due o tre operandi (dati e risultato), mentre un'istruzione di salto ne ha un solo, costituito dall'indirizzo dell'istruzione a cui si deve saltare.
La lunghezza delle istruzioni può variare (di solito è un multiplo di byte, per esempio 2, 4, 6) e dipende dal numero degli operandi e dal modo in cui sono specificati.
Ogni diverso linguaggio macchina può permettere una o più modalità di indirizzamento (cioè uno o più modi per specificare dove sono collocati i dati), per esempio:
- modalità di indirizzamento assoluto: nel campo operando è specificato l'indirizzo effettivo del dato; il numero contenuto nell'operando rappresenta cioè l'indirizzo della locazione di memoria in cui è contenuto il dato;
- modalità di indirizzamento diretto tra registri: nel campo operando è indicato un registro; il dato è contenuto, o deve essere inserito nel registro specificato;
- modalità di indirizzamento base/scostamento: l'indirizzo dell'operando si ottiene sommando al contenuto del registro base, che specifica l'indirizzo di inizio di una informazione (programma o dati), il valore di uno scostamento (displacement) che è un numero che esprime la distanza tra una posizione di memoria e quella considerata come iniziale.

IL LINGUAGGIO ASSEMBLER

Il linguaggio Assembler è stato il primo linguaggio simbolico definito per semplificare la programmazione in linguaggio macchina.
Si chiama linguaggio simbolico poiché permette di indicare i codici operativi e i dati attraverso dei nomi (appunto nomi simbolici), invece che con il corrispondente valore in binario.
La semplificazione si nota soprattutto per quanto riguarda l'uso dei dati: per specificare un dato non serve più indicare l'indirizzo di memoria, ma basta usare un nome (come per le variabili nei linguaggi di programmazione usati comunemente).
Il nome di una variabile, comunque, deve sempre fare riferimento ad una locazione di memoria, ma il compito di calcolare e assegnare gli indirizzi ai nomi simbolici viene lasciato all'assemblatore (il programma che ha il compito di tradurre il programma scritto in linguaggio assembler in un programma scritto in linguaggio macchina).
I vantaggi del linguaggio assembler però finiscono qui. Le istruzioni infatti sono dello stesso tipo di quelle del linguaggio macchina: molto elementari e legate al tipo di processore; ogni istruzione del linguaggio assembler corrisponde infatti ad una istruzione del linguaggio macchina. Questo è il motivo per cui il liguaggio Assembler è chiamato linguaggio a basso livello.
Molte delle difficoltà di programmazione rimangono quindi anche utilizzando il linguaggio Assembler e rimane la necessità di riscrivere il programma se si deve far girare su un computer diverso.
Nonostante questi problemi, e indipendentemente dal fatto che oggi siano a disposizione moltissimi linguaggi di programmazione ad alto livello, il linguaggio Assemler viene ancora utilizzato; i programmi realizzati direttamente in Assembler infatti sfruttano al meglio le caratterstiche del computer e sono velocissimi da eseguire.
I programmi Assembler risultano quindi utili per risolvere problemi che richiedono una grande velocità di esecuzione come l'interfacciamento con le memorie di massa, il collegamento con le stampanti, la gestione delle memorie video, l'utilizzo delle risorse grafiche, la realizzazione di interpreti e compilatori ecc.

IL FORMATO DELLE ISTRUZIONI DEL LINGUAGGIO ASSEMBLER

Un'istruzione del linguaggio Assembler è formata da:
- un campo chiamato etichetta in cui si può scrivere un nome che viene assegnato all'istruzione. In qualsiasi punto del programma si può fare riferimento ad un'istruzione attraverso la sua etichetta; per esempio, se l'etichetta di un'istruzione contiene la parola "FINE", può esisterne un'altra in cui viene detto "vai all'istruzione FINE".
- un codice operativo simbolico, cioè un insieme di alcuni caratteri che permette di indicare il tipo di istruzione da eseguire;
- uno o più operandi; questi possono essere indicati con un nome simbolico, in modo che non sia necessario conoscere l'indirizzo di memoria in cui sono contenuti.

LE ISTRUZIONI DEL LINGUAGGIO ASSEMBLER

Le istruzioni di un linguaggio Assembler si dividono in istruzioni dichiarative, esecutive e direttive.
Le istruzioni dichiarative permettono di definire i nomi degli operandi che verranno usati nel programma (si tratta in pratica delle istruzioni di definizione delle variabili).
Ogni istruzione permette di descrivere nome, tipo e dimensione di un dato utilizzato.
I tipi di dati utilizzabili sono i caratteri e i numeri con diversi tipi di rappresentazione (per esempio, numeri interi di 2 byte o numeri in virgola mobile ecc.).
Le istruzioni direttive sono istruzioni che non devono essere eseguite nel corso del programma, ma che richiedono particolari comportamenti all'assemblatore (il programma che traduce dal linguaggio Assembler al linguaggio macchina); vengono dette anche pseudoistruzioni.
Le istruzioni esecutive sono le vere e proprie istruzioni che compongono il programma; ognuna è identificata da un codice operativo e può avere un certo numero di operandi. Le istruzioni esecutive in genere comprendono istruzioni aritmetiche e logiche, istruzioni di trasferimento di dati (per spostare dati da un'area all'altra della memoria o tra memoria e registri) e istruzioni di confronto e diramazione.
Le operazioni aritmetiche e logiche, in base al loro esito impostano un valore nei bit di condizione (Condition Code) del registro di stato di programma; le istruzioni di confronto e diramazione agiscono in base al valore dei bit di condizione.
Durante l'esecuzione di ogni istruzione viene anche calcolato l'indirizzo da porre nel registro contatore di programma per individuare l'istruzione successiva.
Le istruzioni di input/output non sono così semplici; una istruzione di input/output comprende una serie di operazioni per gestire la periferica utilizzata e varia in base al tipo di periferica; le istruzioni di input/output non sono quindi istruzioni di base del linguaggio Assembler ma vengono descritte in sottoprogrammi appositi.

LE ISTRUZIONI LOGICHE

Le istruzioni logiche permettono di eseguire le operazioni logiche AND, OR ecc.
Le operazioni logiche sono l'unico mezzo a disposizione per lavorare sui singoli bit.
Per esempio, volendo conoscere il valore del quinto bit di un byte si può fare un'operazione "and" con un byte in cui tutti i bit sono a 0 tranne il quinto.
L'operazione "and" confronta a due a due i bit dei due byte; lo zero rappresenta il valore falso quindi il byte risultante dall'operazione avrà tutti i bit a 0 tranne eventualmente il quinto; il quinto bit avrà valore 1 soltanto se il corrispondente bit del byte da testare era 1.

LE ISTRUZIONI DI CONFRONTO E DIRAMAZIONE

Le istruzioni di confronto e diramazione sono istruzioni di salto (del tipo vai alla istruzione "xxx") che si basano sull'esame del valore dei bit di condizione impostato nel registro di stato di programma dalle operazioni aritmetiche e logiche.
In base al valore trovato nei bit di condizione viene deciso se effettuare un salto ad un'altra istruzione del programma (a cui si può fare riferimento tramite l'etichetta), o se continuare l'esecuzione dall'istruzione seguente nel programma.
Queste istruzioni consentono di realizzare scelte o cicli, o di richiamare sottoprogrammi.
Per gestire le chiamate ai sottoprogrammi, al momento del richiamo (specificato con un'istruzione di salto all'inizio del sottoprogramma), viene memorizzato in un registro l'indirizzo dell'istruzione da cui riprendere l'esecuzione una volta terminato il sottoprogramma; l'ultima istruzione è di salto proprio a questo indirizzo salvato nel registro.

MACROASSEMBLER

Viene detto macroassembler un linguaggio Assembler che permette di utilizzare le macroistruzioni.
Una macroistruzione (o macro) è un'istruzione corrispondente ad una sequenza di istruzioni Assembler.
Alcune macroistruzioni possono essere incluse a priori come parte integrante dell'assemblatore (macroistruzioni di sistema), mentre altre possono essere definite dal programmatore.
Vengono normalmente definite come macroistruzioni le sequenze di operazioni per la gestione dell'input/output.

I LINGUAGGI DI PROGRAMMAZIONE AD ALTO LIVELLO

Si dice ad alto livello un linguaggio in cui le istruzioni non corrispondono strettamente alle istruzioni del linguaggio macchina (come per l'Assembler), ma ogni istruzione ha un significato logico e corrisponde a più istruzioni in linguaggio macchina.
Le istruzioni del linguaggio ad alto livello vengono tradotte nelle istruzioni in linguaggio macchina corrispondenti da un programma traduttore, chiamato compilatore o interprete secondo il modo in cui opera.
I linguaggi ad alto livello risultano più semplici da imparare e da utilizzare rispetto ai linguaggi a basso livello, e permettono di realizzare dei programmi indipendenti dall'hardware su cui devono girare, dato che uno stesso programma può venire compilato ed eseguito su macchine diverse con poche modifiche.
Solo con i linguaggi a basso livello però si riescono a sfruttare al meglio le caratteristiche della macchina, raggiungendo la massima efficienza.
Esistono vari tipi di linguaggi ad alto livello e vari metodi di programmazione.
I linguaggi più tradizionali e più noti (come Basic o Pascal) sono di uso generale: permettono di realizzare i programmi più vari; altri, pur essendo di uso generale sono orientati verso un tipo particolare di applicazione (come il Fortran per il calcolo scientifico o il Cobol per le applicazioni gestionali); altri ancora sono specializzati per un tipo particolare di applicazione (come il Simscript per i problemi di simulazione o i linguaggi per il controllo delle macchine utensili).
Riguardo alla modalità di programmazione esistono linguaggi imperativi, in cui bisogna descrivere in modo dettagliato l'algoritmo da seguire (come si fa tradizionalmente), linguaggi logici, in cui il problema viene descritto soltanto da un punto di vista logico, linguaggi funzionali, in cui il programma viene realizzato soltanto mediante il richiamo di funzioni predefinite o definite dal programmatori, linguaggi ad oggetti, in cui ogni entità che compare nel programma è un oggetto con proprie caratteristiche.

I LINGUAGGI IMPERATIVI

I linguaggi imperativi (chiamati anche algoritmici) sono quelli tradizionali ben noti.
Il vocabolario usato da ciascun linguaggio comprende delle parole riservate e delle parole che possono essere definite dal programmatore seguendo alcune semplici regole.
Le parole riservate sono quelle da usare secondo regole particolari per definire i dati o per scrivere le istruzioni; le parole definibili dal programmatore sono in genere i nomi delle variabili e i nomi delle procedure da richiamare.
Le istruzioni sono in genere semplici da ricordare e si avvicinano al linguaggio naturale (di solito la lingua inglese).

LE ISTRUZIONI DEI LINGUAGGI TRADIZIONALI

Le istruzioni si possono suddividere in:
- dichiarative,
- esecutive,
- di controllo.
Le istruzioni dichiarative permettono di definire i dati che si utilizzano; per definire una variabile bisogna stabilire il nome e il tipo di dati; in base al tipo di dati della variabile viene determinato l'insieme dei valori ammessi e le operazioni eseguibili.
Le istruzioni esecutive comprendono quelle che si riferiscono ad operazioni effettive come operazioni di input/output che gestiscono lo scambio di dati tra utente e programma, operazioni di assegnazione che consentono di associare un valore ad una variabile (eseguendo eventualmente operazioni sui dati in relazione al loro tipo, per esempio operazioni aritmetiche sui dati numerici) ecc.
Le istruzioni di controllo governano il funzionamento del programma. Permettono di solito la codifica delle strutture fondamentali di programmazione (sequenziale, alternativa e di controllo) o almeno il trasferimento, in base al verificarsi di una condizione, ad un'istruzione del programma che non sia quella successiva.
In genere è possibile anche definire procedure da richiamare nei punti desiderati, a volte anche in modo ricorsivo.

I LINGUAGGI PER LA SIMULAZIONE DI SISTEMI

I linguaggi per la simulazione di sistemi permettono di rappresentare attraverso un programma l'andamento di una situazione reale, in modo veloce e senza che la situazione si debba verificare realmente.
Per esempio si può studiare il problema del traffico ad un incrocio, senza che l'incrocio sia realizzato o che si debba andare effettivamente sul posto e registrare il passaggio dei veicoli.
Un programma di simulazione non calcola dei risultati ma fornisce delle notizie sull'evoluzione dei sistema studiato.
I principali linguaggi per la simulazione sono Simula, Simscript e GPSS.
Di particolare importanza è il modo in cui questi linguaggi permettono di rappresentare il trascorrere del tempo.
Il tempo può essere gestito con la tecnica della "scansione degli eventi" o con quella della "programmazione degli eventi".
Con il metodo della scansione degli eventi la variabile che rappresenta l'orologio viene fatta aumentare di valori costanti (per esempio di un minuto alla volta) e ogni volta si verifica se ci sono cose da fare.
Con il metodo della programmazione degli eventi si considerano solo gli istanti in cui si verifica qualcosa; dopo aver gestito un evento si individua l'istante in cui avverrà il prossimo; si fa avanzare l'orologio fino a quell'istante, senza considerare gli istanti intermedi.

I LINGUAGGI DEDICATI

I linguaggi dedicati (specializzati per un certo tipo di problema) sono in genere piuttosto semplici e offrono un numero limitato di istruzioni legate in modo specifico al problema da risolvere.
Tra i linguagi specializzati ci sono quelli per la simulazione di sistemi o per il controllo numerico delle macchine utensili, oltre ai linguaggi detti di IV generazione.
I linguaggi di IV generazione (chiamati anche 4GL) consentono di sviluppare in modo rapido e semplice applicazioni di gestione aziendale. In genere offrono anche la possibilità di realizzare semplici applicazioni (per interrogare e aggiornare file e data base, produrre tabulati con una impostazione predefinita ecc.) anche senza conoscere la programmazione, seguendo menu o completando schermate video.

UNA NOTAZIONE MOLTO USATA PER LA DESCRIZIONE DI UN LINGUAGGIO

Una notazione molto usata per descrivere un linguaggio (usata anche in questo volume per la descrizione del linguaggio Basic) si basa sull'uso di caratteri maiuscoli e minuscoli per distinguere tra parole riservate e parole definite dal programmatore e sull'uso di parentesi quadre e graffe per indicare parti opzionali o in alternativa.
Si possono avere allora:
- parole scritte in maiuscolo che rappresentano parole riservate del linguaggio da riportare così come sono scritte; nei linguaggi in cui alcune parole sono facoltative (come il Cobol) una parte delle parole riservate sono sottolineate; la sottolineatura indica le parti assolutamente necessarie; le parole non sottolineate possono essere indicate o tralasciate liberamente.
- parole scritte in minuscolo che rappresentano parole da definire da parte del programmatore: nomi di variabili, di file, di procedure ecc.
- parti di istruzioni racchiuse tra parentesi quadre; sono parti che vanno indicate soltanto in particolari condizioni.
- parti di istruzioni racchiuse tra parentesi graffe; sono parti che vanno usate in alternativa; va utilizzata ogni volta una sola delle possibilità indicate.
Chiudi

Outlet Offerte Sconti Promozioni Risparmiare sugli Acquisti di prodotti e Servizi in Internet

Gigacenter Store-Vente privee-Show room prive-La ruota della fortuna-Outlet Pił Style-Offerte Outlet Store-Sconti Outlet Offerte-Spartoo Shoes-Private Outlet-Saldi Privati-Sold Outlet-Offerte del GiornoBuoni sconto-Saldi Sconti-Offerte Viaggio-Acquisti + Guadagni

 

eXTReMe Tracker

Shiny Stat

free counters