Come funziona un computer, come lo spiegherebbe una casalinga.

Un computer, per quanto complesso possa essere, è composto da alcune parti fondamentali che sono sempre presenti.

Abbiamo un'unità che si occupa di eseguire delle istruzioni, una memoria temporanea su cui salvare i dati, e delle periferiche di input/output (tastiera, schermo, hard-disk, sono le più importanti).

Come probabilmente già saprete, il linguaggio utilizzato dai vari componenti del computer per comunicare tra di loro è il linguaggio binario, dove ogni sequenza specifica di bit, rappresentati dai numeri zero (assenza di corrente) e uno (presenza di corrente), identifica un comando univoco della CPU o un dato univoco in memoria.

La CPU, attraverso un sistema di Bus riesce a gestire le varie comunicazioni, per comunicare con la memoria RAM in cui risiede temporaneamente il programma da eseguire, composto da una sequenza di codici binari, ognuno dei quali rappresenta un particolare comando da eseguire, e in cui risiedono i dati da manipolare durante l'esecuzione del programma; e naturalmente per comunicare con le varie periferiche.

Attraverso dei particolari registri interni che "puntano" all'area di memoria in cui si trova temporaneamente il programma, la CPU tiene traccia del comando attuale da eseguire, e man mano che esegue i comandi va avanti all'istruzione successiva, sino alla conclusione del programma stesso.

Per rendere la vita più facile al programmatore, evitandogli di dover scrivere ogni codice in binario, è stato creato un linguaggio mnemonico chiamato Assembler, dove ogni istruzione corrisponde ad un comando specifico in binario.

Ad esempio, mettiamo che la CPU, durante l'esecuzione di un programma, arrivi al punto in memoria in cui è memorizzato il seguente codice binario:

10110000 01100001

Tradotto significa:

10110 //"sposta nel..."; 10110 identifica l'operazione di spostamento di un dato

//la CPU prosegue per vedere la destinazione

000 //"...registro AL..."; 000 identifica quindi il registo AL, un piccolo spazio di memoria presente all'interno della CPU

//la CPU prosegue per vedere che dato deve spostare

01100001 //01100001 in binario rappresenta il numero 97

In altre parole quella sequenza di 0 e 1 (di segnali elettrici da un punto di vista fisico) non fa altro che dire alla CPU di prendere il numero 97 e salvarlo nel registro AL.

Il programma potrebbe proseguire con un'ipotetica istruzione successiva che dice alla CPU di prendere un secondo numero da una data locazione di memoria e spostarlo nel ragistro BL, e da una terza istruzione che dice alla CPU di sommare il contenuto dei due registri e di mettere il risultato in un terzo registro, e infine di stampare il contenuto del suddetto registro a video.

Per semplificare la vita ai programmatori è stato creato, come dicevo prima, il linguaggio Assembler (o Assembly, o ancora ASM). I programmatori scrivono il programma in Assembly e lo danno in pasto ad un compilatore, il cui compito è quello di tradurre il codice mnemonico in codice binario, così che la CPU lo possa eseguire.

Ad esempio l'istruzione precedente in ASM si scrive così:

MOV AL, 61h (61h è 97 in esadecimale)

Come vedete è molto più semplice da leggere: MUOVI in AL il numero 97

Tuttavia, a meno che non vogliate programmare un sistema operativo tutto vostro, o dei componenti che comunicano direttamente con l'hardware (come ad esempio dei drivers), non è necessario conoscere il linguaggio Assembler, ed è possibile sfruttare dei linguaggi che utilizzano un livello di astrazione più elevato, in modo da poter ignorare i dettagli dell'hardware e potersi concentrare sulla logica del programma.
Infatti nei linguaggi ad alto livello si usano istruzioni semplificate, e sarà poi compito del compilatore tradurle in codice macchina.
Ad esempio se volessimo scrivere un programma che somma due numeri utilizzando il linguaggio C, non avremmo bisogno di conoscere i nomi dei registri della CPU, ne di spostare i numeri nei registri per poi sommarli.
Ci basterà invece scrivere qualcosa di simile:

int risultato = 1 + 2; //ora la variabile risultato conterrà l'intero 3

printf("il risultato è %d", &risultato); //quest'istruzione stamperà a video "il risultato è 3"

Dando in pasto questo pseudo-programma al compilatore, quest'ultimo si occuperà di tradurre il codice ad alto livello in codice macchina, del tutto simile a quello scritto prima.
Non dobbiamo preoccuparci di dire alla CPU dove andare a pescare i numeri in memoria, dove metterli, dove spostarli ecc.. lo farà il compilatore per noi.

Se invece avete intenzione di scrivere ad esempio un sistema operativo, oppure un bios o un driver, o ancora un compilatore, dovete conoscere bene il linguaggio ASM nonché l'architettura che avete in mente di programmare.

Spero di non essere stato troppo sconfusionato, ho cercato di semplificare al massimo, al costo di rendere la spiegazione un po' imprecisa e generica, se volete approfondire il linguaggio Assembly troverete tante ottime risorse in rete.

Nessun commento:

Posta un commento