Salta al contenuto
Note per Studenti Paradigmi di programmazione e linguaggi

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:

python
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)   # 116

Livello 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 gcc per il C python

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" + 4 dà 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

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" + 4 dà errore).

Teoria collegata