Paradigmi di programmazione e linguaggi
In questa pagina 6
In questa pagina 5
Algoritmo e programma
Definizione (algoritmo, programma, sintassi e semantica)
- 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).
Esempio. La ricetta «somma i numeri da 1 a 3» è un algoritmo; sum(range(1, 4)) è un programma Python che lo realizza e restituisce 6.
Paradigmi
Un paradigma è un modo di strutturare il programma. Molti linguaggi ne supportano più di uno.
Definizione (paradigmi di programmazione)
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
Esempio. Nello stile funzionale sum(x * x for x in [3, 4, 7, 10] if x % 2 == 0) restituisce 116, come il ciclo imperativo con accumulatore.
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
Definizione (compilatore e interprete)
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 gccper il Cpython
Esempio. gcc prog.c -o prog produce un eseguibile in linguaggio macchina; python prog.py compila in bytecode .pyc e lo interpreta.
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).
Versione ripasso
Algoritmo e programma
- Algoritmo: sequenza finita di passi non ambigui che trasforma input in output e termina.
- Programma: algoritmo scritto in un linguaggio di programmazione, con la sua sintassi (quali testi sono programmi validi) e semantica (che cosa fa un programma valido).
Paradigmi
| Paradigma | Idea | Esempi |
|---|---|---|
| Imperativo | sequenza di istruzioni che modificano lo stato (variabili) | C, Python |
| Procedurale | imperativo organizzato in procedure/funzioni | C, Python |
| A oggetti | dati e operazioni raggruppati in oggetti | Python, Java, C++ |
| Funzionale | composizione di funzioni senza effetti collaterali; niente assegnamenti | Haskell, Python |
| Dichiarativo / logico | si descrive che cosa si vuole, non come ottenerlo | SQL, Prolog |
Livello, compilazione e interpretazione
- Basso livello: linguaggio macchina, assembly.
- Alto livello: astrazioni, indipendenti dall'hardware (il C è di "medio" livello perché dà accesso diretto alla memoria con i puntatoriUn puntatore contiene un indirizzo di memoria; operatori & e *, NULL, puntatori come parametri per modificare variabili del chiamante, aritmetica dei puntatori, legame tra array e puntatori, const, puntatori a puntatori.Puntatori in C →).
- Compilatore: traduce tutto il sorgente prima dell'esecuzione (
gcc). - Interprete: traduce istruzione per istruzione durante l'esecuzione (
python). - CPython: approccio ibrido, compila in bytecode e poi lo interpreta.
Python e C a confronto
| Aspetto | Python | C |
|---|---|---|
| Esecuzione | interpretato (bytecode) | compilato in codice macchina |
| Tipi | dinamici (dell'oggetto) | statici (dichiarati e fissi) |
| Memoria | automatica (garbage collection) | manuale (malloc/free) |
| Blocchi | indentazione | parentesi graffe |
| Interi | precisione arbitraria | dimensione fissa, overflow possibile |
Passaggio al C nel corso: 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
- Confondere tipizzazione dinamica (Python) con tipizzazione debole: Python è dinamico ma forte (es.
"3" + 4dà errore).