Come funzionano i linguaggi del computer?

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 computer. Ma gli esseri umani non si destreggiano 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 stesso, viene oggi scritto in un linguaggio ad 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 è utile tener presente che il codice sorgente di un programma (la versione creata dall'uomo, modificabile) deve passare attraverso un qualche tipo di traduzione in codice macchina che il computer può effettivamente eseguire.

Linguaggi compilati

Il tipo di linguaggio più convenzionale è il linguaggio compilato. I linguaggi compilati vengono tradotti in file eseguibili di codice macchina binario da uno speciale programma chiamato (ovviamente) un compilatore. Una volta che il codice binario è stato generato lo si può eseguire direttamente senza più guardare al codice sorgente. (La maggior parte del software viene distribuito come binari compilati a partire da codice che non si vede.)

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 più vecchio di diversi anni 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.

Un tempo c'erano molti altri linguaggi compilati, ma la maggior parte di essi si sono estinti oppure sono strumenti strettamente di ricerca. Se si è un nuovo sviluppatore di Unix e si usa un linguaggio compilato è estremamente probabile che questo sia il C o il C++.

Linguaggi interpretati

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. Per contro, essi tendono a essere più facili da programmare e più indulgenti verso 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 in gran parte dei suoi successori). Oggi le shell Unix e il Lisp che vivono all'interno dell'editor Emacs sono probabilmente i linguaggi interprepati puri più importanti.

Linguaggi a codice P

Dal 1990 è andato assumendo importanza crescente un tipo di linguaggio ibridio 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 si esegue il programma, si interpreta 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.