Linguaggi  di programmazione di alto livello


La programmazione in linguaggio assembler permette una codifica uno-a-uno delle istruzioni macchina in comandi mnemonici e che utilizzano nomi simbolici per i dati. In tal modo si eliminano alcuni dei problemi della programmazione in linguaggio macchina.

Tuttavia, altri problemi permangono. Le istruzioni sono ancora troppo legate alle capacità elementari dell' hardware e lontane dalla descrizione dei problemi che si vuole risolvere o anche da quella degli algoritmi di soluzione.

Per far sì che il linguaggio di programmazione rifletta il più fedelmente possibile la logica dei problemi applicativi invece che quella dell' HW sono stati creati linguaggi di livello "più alto" in cui  generalmente ad una istruzione di alto livello corrispondono più istruzioni in linguaggio macchina.

Esempi di linguaggi di alto livello sono il Fortran, C, C++, Pascal, Java, etc.

Come illustrazione di quanto sopra, vediamo come viene tradotta la  parte rilevante di un programma che somma di due numeri interi in linguaggio macchina (per un particolare processore)), in assembler (per lo stesso processore) ed in linguaggi di alto livello (Fortran e C,C++,Java e Pascal):

Linguaggio macchina

1010 0000 0000 0000 0000 0000 0000 0000 --> richiesta di caricare la prima 
                                            variabile nel primo registro HW
1010 0000 0010 0001 1111 1111 1111 1100 --> corrisponde al caricamento della 
                                            seconda variabile nel secondo registro HW
0100 0000 0000 0001 0000 0000 0000 0000 --> corrisponde ad eseguire la somma 
                                            del contenuto dei due registri e a 
                                            scrivere il risultato sul primo registro


Assembler

ldl  r0,A$001  come sopra, notare l' uso di nomi simbolici per 
                             le variabili e per i registri
ldl  r1,B$001
addl r0,r1,r0

Fortran
a+b

C, C++, Java, Pascal
a+b;
 

  E' evidente la corrispondenza tra notazione matematica e formulazione dell' istruzione nei linguaggi di alto livello, da un lato, e le informazioni legate all'hardware, presenti nei linguaggi di basso livello.

I programmi scritti in linguaggi di alto livello sono tradotti in linguaggio macchina  mediante due meccanismi di base: interpretazione e compilazione, che richiedono l'uso di programmi interprete e di compilatori rispettivamente.

Un interprete traduce un' istruzione alla volta in linguaggio macchina e, generalmente, la esegue immediatamente. Le eccezioni sono costituite da gruppi di istruzioni che vanno considerate come un tutto unico (p.es.  gruppi di istruzioni da iterare più volte oppure corrispondenti ad esecuzioni condizionate).

Un compilatore invece procede prima ad una scansione dell' intero codice di alto livello, il che può permettere di ottimizzare  il codice macchina  risultante, che viene scritto su file ma non eseguito immdiatamente. L' esecuzione o anche il collegamento con altri pezzi di codice  diviene uno successivo stadio, separato dalla traduzione in linguaggio macchina.

Tipologie di linguaggi di programmazione

I linguaggi di programmazione possono essere catalogati sulla base di diverse proprietà e caratteristiche.

Una prima divisione è quella "grammaticale" tra linguaggi imperativi, funzionali e logici

I linguaggi imperativi sono basati sulla presenza parallela e formalmente separata di dati e di istruzioni. L' elaborazione procede per modifiche successive del contenuto dei dati, rappresentati simbolicamente attraverso costanti e variabili, fino ad ottenere il risultato finale.

Linguaggi imperativi sono estremamente diffusi sia in ambito generale, sia strettamente scientifico, ed esempi sono: Basic, C, C++, Fortran, Pascal, Ada, PHP, Java, e l' utilizzo più diffuso di Python. Tipiche istruzioni in questi linguaggi corrispondono a verbi: scrivi, leggi, assegna un valore ad una variabile, calcola un risultato,...

Nei linguaggi di tipo funzionale manca un' esplicito uso di variabili per gstire di dati. Tutta l' elaborazione procede per successive valutazioni di funzioni.

Linguaggi funzionali sono Lisp, Scheme, Erlang, Haskell, nonché il linguaggio di programmazione sottostante il software di laborazione simbolca Mathematica. Inoltre Python permette anche una modalità di programmazione funzionale. Infine Excel fornisce un ulteriore esempio di programmazione funzionale anche se un po' atipico: si specifica il valore di una cella come funzione del valore di altre celle.

I linguaggi di tipo logico specificano relazioni tra i dati e l' elaborazione consiste nel costruire richieste di verifica se ulteriori relazioni tra dati sono o meno valide. Un esempio di linguaggi di questa famiglia è Prolog.

In questo corso ci si limiterà ad un unico linguaggio di tipo imperativo (Fortran). Ulteriori informazioni su altri linguaggi sono reperibili facilmente in rete.