Il linguaggio macchina: la lingua dei computer

Il linguaggio macchina è la lingua con cui i computer comprendono e eseguono i comandi. Si tratta di un codice binario, ovvero una serie di 0 e 1, che rappresentano i bit di informazione utilizzati dal computer per elaborare le istruzioni. Questo linguaggio è utilizzato direttamente dalla CPU (Central Processing Unit) del computer per eseguire i comandi.

Tuttavia, il linguaggio macchina è difficile da leggere e utilizzare per gli esseri umani, perciò sono stati sviluppati linguaggi di programmazione più facili da comprendere e utilizzare, come C, Python, Java, ecc. Questi linguaggi vengono compilati o interpretati in linguaggio macchina in modo che il computer possa eseguire i comandi.

Ad esempio, se vogliamo che un computer esegua l’operazione di somma di due numeri, potremmo utilizzare un linguaggio di programmazione come Python e scrivere:


b = 3
c = a + b
print(c)

Questo codice viene compilato in linguaggio macchina, che potrebbe apparire così:


100110 0011
100111 11000
100000 11000
101000

Il linguaggio macchina è fondamentale per il funzionamento dei computer e delle tecnologie digitali, in quanto è la lingua universale delle macchine. Senza di esso, le macchine non sarebbero in grado di eseguire i comandi e di eseguire le operazioni necessarie.

Trattando la storia di Internet si è accennato al BIT (binary digit). Questo elemento sta alla base di tutta la programmazione esistente e del funzionamento di qualsiasi computer e del linguaggio macchina. Del resto l’unico modo che si ha per “comunicare” con una macchina è quello binario. Uno strumento elettrico usa due stati, passaggio di corrente cioè 1, assenza di passaggio cioè 0. Pertanto tutti i sistemi partono da qui, il bit, l’ “atomo” di tutta la struttura informatica. Il bit, associato a questo transito di corrente, ha assunto per definizione i due stati, uno aperto o 0 (si legge zero) e uno chiuso o 1.

C’è da chiedersi come sia potuto capitare che da due semplici simboli 0 e 1 si sia potuta costruire tutta questa “piramide” enorme, quale è il mondo dell’informatizzazione.

Semplicemente un passo per volta. Come una semplice goccia d’acqua può essere insignificante, un’infinità di gocce possono creare un mare, diventare una forza della natura, travolgere qualsiasi cosa.

Questo semplice bit ha fatto proprio la stessa cosa, travolgendo l’umanità per sempre.

linguaggio macchina
Un esempio di linguaggio macchina

La struttura di base

Partendo dal bit si cominciò a studiare una possibile struttura dati che comprendesse i caratteri usati abitualmente, lettere, numeri, caratteri speciali e di punteggiatura. Si iniziò usando prima 4 bit per la rappresentazione dei numeri (24=16). Poi 6 bit (26=64) per coprire anche il set grafico dei caratteri stampabili, per arrivare infine a 8 bit (28=256) poiché permettevano di contenere convenientemente due cifre decimali di 4 bit ciascuna. Venne perciò adottato il codice EBCDIC a 8 bit, cioè l’attuale byte, come codice di rappresentazione standard nei computer. Successivamente si passo allo standard ASCII, tutt’ora in vigore.

In pratica il byte comprende tutti i numeri da 0 a 9, le lettere, i segni di punteggiatura, e tutti i caratteri speciali. E resta ancora spazio per altro.

Programmare usando solo i codici binari non rappresentava una condizione agevole. Indubbiamente le prime schede forate (un foro rappresentava 1, la sua assenza 0) facevano proprio questo. Un errore però costringeva a rivedere migliaia di bit creando un certa frustrazione.

Il linguaggio “umano” è invece molto più complesso e incomprensibile per un’utensile elettrico quale è il computer. Noi usiamo il sistema numerico decimale e non il binario e anche lettere , simboli, colori, ecc.

Il passaggio pertanto da un sistema all’altro comporta dei procedimenti di calcolo e di trasformazione per rendere i due sistemi “dialoganti”.

Per esempio, un numero binario scritto così 1001101011010101, per qualunque persona non significa nulla, ma se con gli opportuni calcoli si trasforma in decimale diventa 39637, comprensibile a tutti.

Il metodo di conversione è questo: bisogna moltiplicare per 2 elevato alla posizione di ogni cifra del numero partendo da destra, e poi sommare (si conta da destra partendo da 0 e non da 1, perché la numerazione decimale va da 0 a 9). Ad esempio

binario 110 = (1 x 22 ) + (1 x 21 ) + (0 x 20 ) = (1 x 4) + (1 x 2) + (1 x 0) = 4 + 2 + 0 = 6 decimale

Ora, considerando tale sequenza di bit, si è dovuto trovare il modo di organizzarli, di memorizzarli in una zona del computer (memoria), e di poterli utilizzare su richiesta. Essendo il metodo molto complesso si è studiato un sistema basato su codici mnemonici, che formano globalmente il linguaggio assembly di un determinato microprocessore.

Ripeto l’unico vero linguaggio macchina è il binario, ma per necessità di programmazione lo si è combinato in una serie di “parole” che miglioravano la leggibilità di un programma.

Un esempio di linguaggio assembly è questo:
MOV AX,BX
ADD DL,AL
CMP AX,DX

In questo caso si tratta di un indirizzamento con registro e gli operandi sono dei registri.

Senza approfondire ulteriormente, è chiaro che l’ assembly pur rimanendo un linguaggio complesso e laborioso, è sicuramente meglio gestibile e più comprensibile di tanti 0 e 1.

Spesso si parla dell’ assembly come un linguaggio di programmazione a basso livello, intendendolo come orientato alla macchina. Se invece usiamo linguaggi orientati alle persone (Basic, Pascal, Cobol, C, ecc.) si parlerà di linguaggi ad alto livello. Questi ultimi, pur essendo decisamente più comprensibili, si discostano di parecchio dalla macchina richiedendo l’uso di compilatori o di interpreti che traducano il loro significato adattandolo al computer. Così facendo, si rallentano le operazioni del processore ma si rende più facile la vita dei programmatori.