Programmare direttamente mediante istruzioni macchina è poco pratico:
Tuttavia, altri problemi permangono.
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 perFortran, Basic
le variabili e per i registri
ldl r1,B$001
addl r0,r1,r0
a+bC,C++,Java,Pascal
a+b;