> For the complete documentation index, see [llms.txt](https://checksound.gitbook.io/tecnologie1/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://checksound.gitbook.io/tecnologie1/master.md).

# Tecnologie

Teoria di tecnologie 1° - docente Massimo Cappellano presso ISIS "Andrea Ponti" di Gallarate - massimocappellano72 \[at] gmail \[dot] com

## Introduzione: Cosa fanno i computer

Ciò che fanno i computer, naturalmente, è calcolare. Questo però non è che l'inizio della storia. La vera domanda è: come possono i computer fare tutte le cose straordinarie che fanno, semplicemente calcolando?

L'essenza del calcolo è la manipolazione meccanica di simboli. Quando le persone calcolano, nel senso comune del termine, i simboli sono numeri, che vengono manipolati meccanicamente secondo le regole dell'aritmetica. Per esempio, una persona che memorizza un insieme piuttosto ridotto di regole e le applica correttamente può moltiplicare numeri di qualsiasi dimensione. Le regole includono fatti basilari sulla somma e sul prodotto di due cifre qualsiasi, insieme a una procedura che determina i passaggi da eseguire per effettuare la moltiplicazione: *"Scrivi i numeri, uno sotto l'altro, con le cifre più a destra allineate, e traccia una linea sotto di essi. Moltiplica il numero in alto per la cifra più a destra del numero in basso, scrivendo il risultato sotto la linea..."*

Questo esempio rivela diversi aspetti importanti del calcolo:

* È meccanico e ripetitivo: Ci sono regole da seguire che dicono esattamente cosa fare, senza creatività né svago. Un solo piccolo errore e il risultato sarà sbagliato. Non sorprende che gli esseri umani trovino difficile completare una grande moltiplicazione senza commettere errori, mentre i computer eseguono le regole senza fallire e senza lamentarsi.
* È privo di significato intrinseco: Le persone di solito calcolano per un motivo (es. calcolare il costo di 16 lampadine a $$1.27$$ l'una o le calorie in 127 patatine). Ma l'esecuzione della moltiplicazione richiede solo di seguire regole, mettendo da parte ogni pensiero su lampadine o calorie. Un simbolo è qualcosa che rappresenta un significato esterno, ma per il calcolo in sé tale significato è del tutto irrilevante.
* Si applica a qualsiasi simbolo: Sebbene il termine si riferisca spesso ai numeri, il calcolo riguarda la manipolazione di qualsiasi simbolo secondo regole definite. Un revisore che conta le parole in un libro o le cerca su un dizionario sta calcolando: manipola parole tramite regole semplici che non richiedono di comprenderne il significato.

### 1.1. Bits, Bytes, ecc.

I simboli di base dell'aritmetica umana sono le cifre da $$0$$ a $$9$$. Per un computer, i simboli di base sono soltanto due cifre: $$0$$ e $$1$$. Poiché sono due, vengono chiamate cifre binarie (*binary digits*), quasi sempre abbreviate in bit. Essendo due soli valori, tendono a essere rappresentati da coppie naturali come vero/falso, acceso/spento (*on/off*) o nero/bianco.

Concatenando i bit in stringhe (come $$10011\_2$$), possiamo rappresentare qualsiasi simbolo composto e qualsiasi dato di cui il computer debba occuparsi.

#### 1.1.1. Numeri binari

I numeri interi non negativi si rappresentano nel sistema in base due (binario). Per evitare confusioni con la base dieci, si usa il pedice 2 (es. $$10110\_2$$).

Contare in binario equivale a far scorrere un contachilometri con sole cifre $$0$$ e $$1$$:

$$0\_2, 1\_2, 10\_2, 11\_2, 100\_2, 101\_2, 110\_2, 111\_2, 1000\_2, 1001\_2, 1010\_2, 1011\_2$$

| **Base dieci (Decimale)** | **Base due (Binario)** |
| ------------------------- | ---------------------- |
| 0                         | $$0\_2$$               |
| 1                         | $$1\_2$$               |
| 2                         | $$10\_2$$              |
| 3                         | $$11\_2$$              |
| 4                         | $$100\_2$$             |
| 5                         | $$101\_2$$             |
| 8                         | $$1000\_2$$            |
| 16                        | $$10000\_2$$           |

Per un numero di $$k$$ bit esistono $$2^k$$ possibili combinazioni. La conversione da binario a decimale si ottiene sommando le potenze di 2 corrispondenti a ciascun 1 presente nel numero (contando le posizioni da destra a partire da 0):

$$1001110101\_2 = 2^9 + 2^6 + 2^5 + 2^4 + 2^2 + 2^0 = 512 + 64 + 32 + 16 + 4 + 1 = 629$$

I computer usano il sistema binario perché realizzati con componenti elettronici, dove lo stato di un filo è naturalmente acceso o spento (presenza o assenza di tensione), riducendo drasticamente la probabilità di errore rispetto all'uso di dieci livelli di tensione distinti.

#### 1.1.2. Testo

I caratteri di testo vengono rappresentati assegnando a ciascuno un codice binario univoco. Il sistema più comune è lo standard ASCII (*American Standard Code for Information Interchange*), che assegna a ogni carattere un numero binario di 8 bit.

Un gruppo di 8 bit è chiamato byte. Con 8 bit si possono ottenere $$2^8 = 256$$ combinazioni distinte. Ad esempio, la lettera minuscola 'a' corrisponde a $$01100001\_2$$ (97 in decimale), mentre la virgola ',' è $$00101100\_2$$ (44 in decimale). Un documento di 10.000 caratteri richiede quindi 10.000 byte (80.000 bit).

#### 1.1.3. Tutto il resto

Qualsiasi altro dato (immagini, suoni, numeri negativi, programmi) viene convertito in un pattern di bit attraverso tre metodi principali:

* **Combinazione:** dividere i dati in componenti elementari e combinare i rispettivi codici (es. formare una data unendo giorno, mese e anno).
* **Enumerazione:** elencare tutti i valori possibili e assegnare a ciascuno un numero identificativo (es. i 12 mesi dell'anno o lo stato delle caselle di una scacchiera).
* **Digitalizzazione:** approssimare dati continui o infiniti mediante campionamento discreto. Per le immagini, lo schermo viene suddiviso in una griglia di punti (*pixel*), e lo stato o colore di ogni pixel viene codificato in bit. Per l'audio digitale (come nei CD), l'ampiezza dell'onda sonora viene misurata 44.000 volte al secondo e codificata con numeri a 16 bit.

#### 1.1.4. Complessità strutturata

I dati all'interno di un computer non sono un'accozzaglia disordinata di bit, ma sono organizzati in strutture complesse fatte di blocchi (*chunks*) via via più semplici. Il tema dei livelli di complessità strutturata è il concetto centrale dell'informatica.

### 1.2. Transistor, porte logiche, ecc.

Un computer fa una sola cosa fondamentale: esegue programmi. Un programma è una lista di istruzioni memorizzate nella memoria principale. La CPU (*Central Processing Unit*) è l'unità attiva che legge ed esegue continuamente tali istruzioni mediante il ciclo di recupero ed esecuzione (*fetch-and-execute cycle*):

1. Legge l'istruzione dalla memoria indicata dal registro contatore di programma (*program counter*).
2. Esegue l'istruzione e aggiorna il contatore per passare alla successiva.

Le istruzioni lette dalla CPU sono numeri binari scritti nel linguaggio macchina specifico dell'architettura.

#### 1.2.1. Interruttori

A livello fisico, i bit sono rappresentati dalla presenza o assenza di corrente nei circuiti. I componenti usati come interruttori fondamentali sono i transistor. Un transistor funziona come una porta con tre fili: ingresso (*input*), uscita (*output*) e controllo. Quando il filo di controllo è attivo, blocca il passaggio del segnale; quando è disattivato, lascia passare l'informazione.

#### 1.2.2. Costruzione di circuiti

Collegando opportunamente i transistor si ottengono i circuiti logici di base (porte logiche / *logic gates*):

* Porta **NOT**: inverte il bit di ingresso ($$0 \to 1$$, $$1 \to 0$$).
* Porta **AND**: l'uscita è $$1$$ solo se entrambi gli ingressi sono $$1$$.
* Porta **OR**: l'uscita è $$1$$ se almeno uno degli ingressi è $$1$$.

Tutti i calcoli e le operazioni di un computer possono essere eseguiti combinando queste tre porte logiche.

### 1.3. Istruzioni, subroutine, ecc.

#### 1.3.1. Istruzioni, decisioni e cicli

Le istruzioni in linguaggio macchina svolgono compiti elementari:

* Operazioni aritmetiche (somma, sottrazione) mediante registri interni come l'accumulatore.
* Trasferimento dati tra la memoria e la CPU.
* Modifica del contatore di programma tramite istruzioni di salto (**jump**).

Un'istruzione di salto permette di creare un ciclo (*loop*), ripetendo una sequenza di istruzioni. I salti condizionali (*conditional jumps*) consentono invece al programma di prendere decisioni, eseguendo il salto solo se una determinata condizione è verificata (es. se il valore nell'accumulatore è maggiore di zero), permettendo di uscire dai cicli o deviare il flusso d'esecuzione.

#### 1.3.2. Costruire programmi

I programmi complessi vengono strutturati organizzando le istruzioni in blocchi di livello superiore. L'astrazione principale è la subroutine: una sequenza riutilizzabile di istruzioni richiamabile da diversi punti del programma tramite un'istruzione di salto a subroutine (*jump-to-subroutine*).

La maggior parte dei programmatori non scrive in linguaggio macchina, ma usa linguaggi ad alto livello (come Pascal o BASIC), che vengono tradotti automaticamente in linguaggio macchina da programmi chiamati compilatori.
