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,r0Fortran
a+bC, 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.
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.