Algoritmo e programma — due concetti distinti
Prima di scrivere qualsiasi codice è fondamentale distinguere due concetti che spesso vengono confusi.
Esempio — somma di due numeri
Lo stesso problema espresso prima come algoritmo in pseudocodice, poi come programma Assembly:
Leggi a
Leggi b
Somma = a + b
Stampa SommaMOV AX, a ; carica a in AX
ADD AX, b ; somma b ad AX
MOV somma, AX ; salva il risultatoClassificazione dei linguaggi di programmazione
I linguaggi di programmazione si classificano in base al livello di astrazione rispetto all’hardware. Più il linguaggio è ad alto livello, più si avvicina al linguaggio naturale e si allontana dalla macchina — e viceversa.
Linguaggi di alto livello
I linguaggi di alto livello sono indipendenti dall’hardware e più vicini al modo in cui gli esseri umani ragionano. Il programmatore si concentra sulla logica del problema senza preoccuparsi di registri, indirizzi o dimensioni dei dati.
# Python — alto livello
x = 5 + 3
print(x) # Output: 8Linguaggi di basso livello — Assembly
I linguaggi di basso livello sono strettamente dipendenti dall’architettura hardware. Il programmatore interagisce direttamente con registri, indirizzi di memoria e dimensioni dei dati — nulla è gestito automaticamente.
; Assembly 8086 — basso livello
MOV AL, 05h ; carica il valore 5 nel registro AL
ADD AL, 03h ; somma 3 ad AL → AL = 8Per scrivere questo codice il programmatore deve conoscere esplicitamente:
AX, BX, AL, AH…AL vs AX non è intercambiabileConfronto diretto — alto livello vs basso livello
La stessa operazione somma 5 + 3 a confronto sui tre livelli:
| Livello | Codice | Cosa gestisce il programmatore | Portabilità |
|---|---|---|---|
| Alto livello | x = 5 + 3 | Solo la logica | Qualsiasi architettura |
| Assembly | MOV AL, 05hADD AL, 03h | Registri, dimensioni, indirizzamento | Solo architettura specifica |
| Macchina | 10110000 00000101 | Tutto — bit per bit | Solo CPU specifica |
Linguaggio macchina e Assembly — il rapporto
Il linguaggio macchina è l’unico formato eseguibile direttamente dalla CPU — pura sequenza di bit. L’Assembly è la sua rappresentazione simbolica leggibile dall’uomo: ogni mnemonico (MOV, ADD, JMP) corrisponde a una specifica sequenza binaria definita dall’ISA.
; Assembly → codice macchina (corrispondenza diretta)
MOV AL, 05h → 10110000 00000101
│opcode│ │operando│
ADD AL, 03h → 00000100 00000011
│opcode│ │operando│Perché queste distinzioni contano
Comprendere la differenza tra livelli di astrazione è fondamentale per tre ragioni pratiche nel contesto di questo corso:
AX, CX, SP…)Riepilogo
- Un algoritmo è la sequenza logica per risolvere un problema — indipendente dal linguaggio
- Un programma è l’implementazione dell’algoritmo in un linguaggio eseguibile su un’architettura specifica
- I linguaggi di alto livello (Python, C, Java) sono indipendenti dall’hardware e portabili
- I linguaggi di basso livello (Assembly) richiedono conoscenza diretta di registri, dimensioni e indirizzamento
- Il linguaggio macchina è l’unico formato eseguibile direttamente dalla CPU — sequenze binarie pure
- L’Assembly è la rappresentazione simbolica del linguaggio macchina — corrispondenza quasi 1:1 con il binario
- Il codice Assembly è non portabile — dipende dall’ISA del processore specifico
- Studiare l’8086 in Assembly permette di vedere direttamente il rapporto tra istruzione, registro e bit