Abbiamo già visto come vengono eseguiti i programmi ([*]). Ogni programma in definitiva deve eseguire un flusso di
byte che sono istruzioni nel linguaggio macchina
del vostro computer. Ma gli esseri umani non se la cavano molto bene
con il linguaggio macchina; riuscirci è divenuta un'arte rara, una
magia nera persino tra gli hacker.
Quasi tutto il codice Unix, ad eccezione di una piccola porzione
relativa all'interfaccia diretta con l'hardware nel kernel, viene
oggi scritto in un linguaggio di alto
livello. (`Alto livello' in questa espressione è un residuo
storico volto a distinguerlo dai linguaggi
assembler di `basso livello', che sono fondamentalmente
sottili involucri attorno al codice macchina.)
Ci sono diversi tipi di linguaggi di alto livello. Per affrontare
l'argomento troverete utile tenere a mente che il codice
sorgente di un programma (la versione creata dall'uomo,
editabile) deve passare attraverso un qualche tipo di traduzione in
codice macchina che il computer può effettivamente eseguire.
Il tipo più convenzionale di linguaggio è il linguaggio
compilato. I linguaggi compilati vengono tradotti in file
eseguibili di codice macchina binario da uno speciale programma
chiamato (ovviamente) compilatore. Una volta che
il codice binario è stato generato potete eseguirlo direttamente senza
più guardare al codice sorgente. (La maggior parte del software è
fornita come binari compilati a partire da codice che non vedete.)
I linguaggi compilati tendono a dare prestazioni eccellenti e hanno il
più completo accesso al SO, ma tendono anche a essere difficili da
programmare.
C, il linguaggio in cui Unix stesso è scritto, è di gran lunga il più
importante tra questi (con la sua variante C++). FORTRAN è un altro
linguaggio ancora usato tra gli ingegneri e gli scienziati ma di anni
più vecchio e molto più primitivo. Nel mondo Unix nessun altro
linguaggio compilato è nell'uso dominante. Al di fuori di esso, il
COBOL è molto usato per il software finanziario e commerciale.
C'erano molti altri linguaggi compilati, ma la maggior parte di essi
si sono estinti oppure sono strumenti strettamente di ricerca. Se
siete nuovi sviluppatori Unix e usate un linguaggio compilato è
estremamente probabile che questo sia il C o il C++.
Un linguaggio interpretato dipende da un programma
interprete che legge il codice sorgente e lo traduce al volo in
calcoli e chiamate di sistema. Il sorgente deve essere reinterpretato
(e l'interprete deve essere presente) ogni volta che il codice viene
eseguito.
I linguaggi interpretati tendono a essere più lenti dei linguaggi
compilati e spesso hanno accesso limitato al sistema operativo e
all'hardware sottostanti. D'altra parte, essi tendono a essere più
facili da programmare e più propensi a perdonare gli errori di
codifica rispetto ai linguaggi compilati.
Molti programmi di utilità di Unix, inclusa la shell, bc(1), sed(1) e
awk(1), sono in effetti piccoli linguaggi interpretati. I BASIC sono
di solito interpretati. Così pure il Tcl. Storicamente, il più
importante linguaggio interpretato è stato il LISP (un grande
miglioramento rispetto ai suoi predecessori). Oggi il Perl è molto
usato ed in costante crescita di popolarità.
Dal 1990 è andato assumendo importanza crescente un tipo di linguaggi
ibridi che usa sia la compilazione che l'interpretazione. I linguaggi
a codice P sono come i linguaggi compilati nel senso che il sorgente
viene tradotto in una forma binaria compatta che è ciò che viene
realmente eseguito, ma che non è esattamente codice macchina. Si
tratta invece di pseudocodice (o codice
P) che è solitamente molto più semplice ma più potente di
un vero linguaggio macchina. Quando eseguite il programma,
interpretate il codice P.
Il codice P può girare velocemente quasi quanto un binario compilato
(gli interpreti di codice P possono essere abbastanza semplici,
leggeri e rapidi). Ma i linguaggi a codice P riescono a mantenere la
flessibilità e la potenza di un buon interprete.
Importanti linguaggi a codice P includono Python e Java.