Paradigmi di programmazione e linguaggi
In questa pagina 6
Algoritmo e programma
- Algoritmo: sequenza finita di passi non ambigui che risolve un problema (trasforma un input in un output) e termina.
- Programma: algoritmo scritto in un linguaggio di programmazione, eseguibile da un calcolatore.
- Un linguaggio ha una sintassi (quali testi sono programmi validi) e una semantica (che cosa fa un programma valido).
Paradigmi
Un paradigma è un modo di strutturare il programma. Molti linguaggi ne supportano più di uno.
| Paradigma | Idea | Esempi |
|---|---|---|
| Imperativo | sequenza di istruzioni che modificano lo stato (variabili) | C, Python, assembly |
| Procedurale | imperativo organizzato in procedure/funzioni | C, Python |
| A oggetti | dati e operazioni raggruppati in oggetti; classi, incapsulamento, ereditarietà | Python, Java, C++ |
| Funzionale | il programma è composizione di funzioni senza effetti collaterali; niente assegnamenti | Haskell; in parte Python (lambda, map, comprensioni) |
| Dichiarativo / logico | si descrive che cosa si vuole, non come ottenerlo | SQL, Prolog |
Lo stesso calcolo (somma dei quadrati dei pari) in stile imperativo e funzionale:
nums = [3, 4, 7, 10]
# imperativo
tot = 0
for x in nums:
if x % 2 == 0:
tot += x * x
# funzionale (espressione, nessuna variabile modificata)
tot = sum(x * x for x in nums if x % 2 == 0) # 116Livello del linguaggio
- Basso livello: linguaggio macchina, assembly. Legati al processore, controllo totale.
- Alto livello: astrazioni (variabili con nome, strutture di controllo, funzioni, tipi), indipendenti dall'hardware. Il C è considerato di "medio" livello perché dà accesso diretto alla memoria (puntatori).
Compilazione e interpretazione
| Compilatore | Interprete | |
|---|---|---|
| Quando traduce | tutto il sorgente prima dell'esecuzione | istruzione per istruzione durante l'esecuzione |
| Prodotto | file eseguibile in linguaggio macchina | nessun eseguibile separato |
| Errori di tipo/sintassi | segnalati in compilazione | molti emergono solo quando la riga viene eseguita |
| Velocità | alta | più bassa |
| Esempio | gcc per il C |
python |
CPython (l'implementazione standard di Python) è ibrida: compila il sorgente in bytecode (file .pyc in __pycache__) che poi una macchina virtuale interpreta.
Python e C a confronto
| Aspetto | Python | C |
|---|---|---|
| Esecuzione | interpretato (bytecode) | compilato in codice macchina |
| Tipi | dinamici: il tipo è dell'oggetto, una variabile può riferirsi a oggetti di tipi diversi | statici: ogni variabile ha un tipo dichiarato e fisso |
| Memoria | gestita automaticamente (garbage collection) | gestita dal programmatore (malloc/free) |
| Blocchi | indentazione | parentesi graffe |
| Interi | precisione arbitraria | dimensione fissa, overflow possibile |
| Strutture dati incorporate | liste, dizionari, insiemi, stringhe Unicode | array di dimensione fissa, struct |
| Uso tipico | prototipazione, scripting, analisi dati | sistemi operativi, embedded, codice ad alte prestazioni |
Nel corso si parte da Python per i concetti di base (tipi, controllo del flusso, funzioni, sequenze, algoritmi) e si passa al C per vedere come gli stessi concetti si realizzano più vicino alla macchina: vedi Dal Python al CStruttura di un programma C, compilazione con gcc (preprocessore, compilatore, linker), main e valore di ritorno, dichiarazioni con tipo statico, printf di base; corrispondenze con Python.Dal Python al C →.
Errori tipici
- Credere che "interpretato" significhi "senza traduzione": anche Python traduce, in bytecode.
- Confondere tipizzazione dinamica (Python: il tipo si controlla a run-time) con tipizzazione debole: Python è dinamico ma forte (
"3" + 4dà errore, non converte da solo).