Linguaggi  di programmazione


Programmare direttamente mediante istruzioni macchina è poco pratico:

Una prima soluzione è costituita dall' utilizzo di un linguaggio di programmazione assembler. Questo 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.

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  ad una istruzione del linguaggio corrispondono più istruzioni in linguaggio macchina.

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

I programmi scritti in linguaggi di alto livello sono tradotti in linguaggio macchina  mediante due meccanismi di base: gli interpreti ed i compilatori.

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 piu' volte oppure corrispondenti ad esecuzioni condizionate).

Un compilatore invece procede prima ad una scansione dell' intero codice di alto livello per poter introdurre ottimizzazioni  nel codice macchina  risultante che viene quindi scritto su file ma non eseguito. L' esecuzione o anche il collegamento con altri pezzi di codice  diviene uno stadio separato dalla traduzione in linguaggio macchina.

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 processore alpha Compaq ), in assembler (per lo stesso processore con sistema operativo  Compaq Tru64 Unix v. 4.0D) ed in linguaggi di alto livello (Fortran e C):

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, Basic 
a+b

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