Vi siete mai chiesti come facciano i computer a decifrare quello che digitiamo sulla tastiera, i movimenti del mouse o i tocchi delle nostre dita sullo schermo? Per me è sempre stata magia pura vedere che tutti i nostri device possano quasi percepire ciò che gli diciamo. Andiamo a vedere insieme come questo fenomeno sia possibile!
Salve Feelers e bentornati sul mio Blog! Io sono Lorenzo e questo è il primo articolo del mio nuovo format Feel Geek, dove andremo ad approfondire le varie sfaccettature dell'Informatica e della Tecnologia. Oggi parleremo della lingua dei dispositivi elettronici! Restate con me fino alla fine, perché ne vedremo delle belle, ma prima di cominciare, lasciate che vi inviti ad Iscrivervi al Canale, attivando la campanella degli avvisi e di lasciare un bel mi piace per supportarmi, ma non perdiamoci in chiacchiere e diamoci dentro!
Una delle cose che ho imparato dal mio percorso di studi, è che ogni materia è un viaggio attraverso una sfaccettatura dell'Informatica. Nel caso specifico, ho imparato che ogni implementazione, ogni mattoncino di sapere, veniva sapientemente creato e posizionato al punto giusto, dopo aver risposto alle domande giuste. Di fatti, i computer hanno una storia complessa, ricca di colpi di scena, che ha origine nel lontano XVI Secolo, con Pascal. Di fatti, Pascal, creò la prima calcolatrice meccanica, in grado di eseguire somme e sottrazioni. Poi venne il tempo di Leibniz, che creò una macchina in grado di eseguire moltiplicazioni e divisioni e via discorrendo fino ad arrivare al padre dell'Informatica moderna: Alan Turing. A questo proposito mi sento di consigliare un film stupendo ispirato a lui: The Imitation Game. Alan Turing infatti fu il primo essere umano a riuscire ad inventare una macchina a valvole, che riuscisse ad eseguire degli algoritmi di decifrazione: COLOSSUS. Creato per decifrare ENIGMA, la macchina di comunicazione tedesca durante la Seconda Guerra Mondiale. Dopo Turing però ci fu un altro uomo in grado di rivoluzionare il pensiero informatico: Von Neumann, che introdusse l'idea di Programma Memorizzato e di programmi come dati. Successivamente la storia prosegue, con l'invenzione dei transistor, dei circuiti integrati, ecc ecc. Tuttavia l'invenzione probabilmente più strabiliante, che ci inizia ad indirizzare verso la decodifica dei dati dei computer è stata quella dei Transistor. Tra poco vedremo perché. Ma la domanda è: Come si programma un insieme di Transistor?
Un Programma è un insieme di istruzioni in sequenza che descrivono come portare a termine un certo compito. Ma una moderna CPU capisce forse il linguaggio Java? E se non lo fa, come funziona? Perché noi esseri umani usiamo linguaggi come Java, Rust, Python e non quello dalle singole componenti?
La verità è che dobbiamo capire che, anche se un computer è una macchina programmabile, non è direttamente utilizzabile dagli utenti, in quanto richiederebbe una conoscenza profonda dell'organizzazione fisica dello specifico device e del suo linguaggio macchina. Ogni macchina avrebbe quindi differenti caratteristiche, e il linguaggio macchina è estremamente complicato e di difficile gestione. Cioè?
I programmi vengono caicati in memoria sotto forma di di bit, il cui valore è un numero in base 2, ovvero un numero binario. Il Sistema Binario, è analogo a quello Decimale che tutti conosciamo (sarebbe quello usato nella matematica classica semplice). La differenza è che i numeri binari sono tutti multipli di 2, e vengono espressi come 2 elevato ad un numero. Per poter decifrare un numero binario memorizzato, devi disporre di uno strumento che effettua una rappresentazione Simbolica dei codici numerici delle istruzioni macchina: l'Assembler.
Quindi abbiamo compreso che c'è una sorta di sistema di traduzione, dal linguaggio di alto livello, come Java ad esempio, al linguaggio macchina, fino alle istruzioni dei singoli circuiti. Immaginiamo quindi di avere un computer suddiviso in livelli, che vanno dall'Utente fino ai circuiti della macchina, e che un'interazione dell'utente, debba attraversare una serie di "traduzioni" dal livello software fino ai circuiti. Questo perché un input deve essere gestito dal software, dal sistema operativo che deve disporre delle risorse adeguate, fino ad essere interpretato nel linguaggio macchina che si traduce nelle connessioni elettriche dei vari circuiti.
Come si passa da un livello ad un altro? Attraverso: Compilazione ed Interpretazione. L'Interpretazione è una traduzione di quello che si legge, che avviene nel momento stesso della lettura, in contemporanea. Esattamente come quando un interprete traduce quasi in tempo reale, cosa ci sta dicendo un'altra persona in un'altra lingua che non sia la nostra. La Compilazione, è una traduzione che avviene dopo la lettura di tutte le istruzioni, un po' come quando si traduce una missiva. Si legge il contenuto, si capisce e si traduce. Capirete che con questi due potenti strumenti, non è complicato riuscire a passare da un livello all'altro, anche se il sistema resta ancora complesso.
Chi o cosa decide quando compilare e quando interpretare? Il linguaggio usato. Avrete sicuramente sentito dire che C è un linguaggio compilato o che Javascript sia interpretato. Bene, il significato è quello che vi ho appena esposto. Tuttavia, c'è da comprendere che i circuiti non capiscono i linguaggi, le interpretazioni, le compilazioni o i numeri stessi. Non sono esseri pensanti in grado di comprendere i vari simboli, allora quale lingua parlano? Non abbiamo ancora risposto, ma ci stiamo avvicinando alla soluzione dell'enigma.
Abbiamo introdotto un elemento importante prima, quello dei numeri binari, o in base 2. I numeri binari, sono fondamentali in quanto l'entità minima di informazione all'interno di un elaboratore elettronico, si chiama bit = Binary Digit, Cifra Binaria. Mediante un bit possiamo distinguere 2 tipi di informazioni: 0 e 1. Tutte le informazioni, anche le più complesse sono rappresentate mediante sequenze di soli 1 e 0, ovvero in forma binaria o digitale. Però bisogna associare biunivocamente ad ogni informazione "elementare", caratteri, numeri, immagini, sequenze audio, ecc. Una sequenza binaria che la rappresenti. Per fare ciò, saper distinguere 2 diverse informazioni non basta. Le diverse configurazioni di n bit ci permette di individuare 2 alla n informazioni distinte. Una sequenza di 8 bit è definita Byte. Ed esattamente come per ogni sistema di misura, 2 alla 10 byte creano un KiloByte, 2 alla 20 byte un MegaByte, ecc ecc.
Abbiamo quindi capito che gli scienziati, avevano un sistema di codifica delle informazioni in grado di rappresentare potenzialmente qualsiasi tipo di informazioni, ma come implementarlo a livello architetturale? Come si fa a far comprendere i numeri ad un computer? Per lui non sono che simboli strani e assurdi, totalmente incomprensibili! Inoltre i numeri sono infiniti, le memorie dei computer no. Come fare quindi? Si usa una codifica. Per i calclatori la quantità di memoria dedicata alla memorizzazione di un numero è fissata. Si possono rappresentare numeri con una quantità fissata di cifre, questo comporta una certa precisione, anche per le operazioni elementari.
Ricapitolando: siamo in grado di rappresentare un numero gigantesco di informazioni tramite la codifica binaria, con una certa precisione, che però è abbastanza grande da permetterci di immagazzinare qualunque dato ci serva. Senza entrare troppo nella matematica del caso, che sarebbe anche alquanto noiosa, riusciamo a rappresentare quantità esponenziali di dati. Ci servirebbe qualcosa per trasmettere 2 alla n informazioni ai circuiti. Qualcosa come una lampadina, acceso-spento. Avete mai pensato al fatto che una lampadina semplicissima potesse rappresentare egregiamente le due informazioni che noi stiamo accatastando in sequenza? Acceso vuol dire 1, spento vuol dire 0. Sembra incredibile che sia così semplice eppure è la verità, basterebbero delle lampadine minuscole... E noi le abbiamo queste lampadine? Si! Sono i transistor!
Un transistor è un semiconduttore usato nell'elettronica analogica. Il fisico e ingegnere Julius Edgar Lilienfeld progettò il primo transistor in Canada nel 1925, descrivendo un dispositivo simile all'attuale transistor ad effetto di campo, ma fu brevettato nel 1934 dall'inventore tedesco Oskar Heil. Abbiamo il nostro interruttore acceso-spento. Messi in sequenza 8 transistor possono rappresentare un byte di informazione, capite dove voglio arrivare? Sembra quasi una magia, bisogna solo insegnare all'elaboratore che spento è 0 e acceso è 1, a quel punto il gioco è fatto! Ma un momento... Non ci stiamo scordando qualcosa? E le lettere? Le immagini? Gli Audio? Anche loro vengono tradotti in numeri? Certo che sì! Tutte le informazioni digitali vengono tradotte ed infine rappresentate come sequenze binarie, in modo da essere date in pasto ai circuiti e permettere l'elaborazione dei dati! Ovviamente ogni informazione viene tradotta in modo diverso, tuttavia, non è questo il video in cui ne parleremo. Abbiamo finalmente ottenuto un ponte che colleghi l'alto livello, quello utente, quello del programmatore, con il basso livello, quello della macchina, quello dei circuiti. Abbiamo viaggiato parlando lingue diverse, compilando ed interpretando le nostre istruzioni, sino a diventare dei numeri binari. La matematica ha sciolto il nostro enigma iniziale in un modo sorprendente e magico, che ci ha trascinato nella complessità e nella storia degli elaboratori elettronici, lasciando, almeno me, senza fiato.
Spero che questo Viaggio nel mondo dell'Informatica sia stato di vostro gradimento! Fatemi sapere cosa ne pensate con un commento. Se il video vi è piaciuto, condividetelo con i vostri amici! Se volete rimanere in contatto con me, vi invito a seguirmi sui vari social, trovate i link in descrizione. Vi ricordo inoltre di iscrivervi al mio Canale Telegram per ricevere la mia "Ogni Tanto Letter" con le news più interessanti del settore informatico. Se avete dubbi o consigli o se volete suggerirmi il tema del mio prossimo video, scrivetelo sempre qui sotto nei commenti! Io vi ringrazio, e noi, ci vediamo alla prossima!