14: ALTRI IDE - IL DEBUGGING

ALTRI IDE

Ora che abbiamo una certa esperienza nella programmazione possiamo tornare un attimo indietro e riflettere sui passi necessari a sviluppare un programma. Possiamo riassumerli così:

Molti anni fa questi tre passi venivano compiuti da tre applicazioni diverse: prima si scriveva il testo usando un editor e lo si salvava, poi si processava il file di testo con un compilatore che lo traduceva in linguaggio macchina e produceva un file eseguibile, ed infine si lanciava l'eseguibile direttamente dal sistema operativo della macchina in uso. Nel processo di sviluppo un programmatore doveva continuamente aprire e chiudere applicazioni diverse (tenete presente che i vecchi sistemi operativi non permettevano di avere più programmi aperti contemporaneamene), ed anche un banale errore di sintassi costringeva a ripartire da capo.

Un notevole passo in avanti è stato fatto con gli IDE (Inglese: Integrated Development Environment). Un IDE è una singola applicazione che permette di fare tutte queste cose all'interno di essa: questo rende la programmazione un'attività molto più intuitiva e veloce, in quanto possiamo facilmente scrivere, lanciare, correggere gli errori e riprovare senza nessuna pausa tra un'attività e l'altra. E' proprio il caso di IDLE, che è l'ambiente di sviluppo standard di Python. IDLE è completamente Open Source come vuole tutta la filosofia di Python, è programmato in Python, ed è sviluppato da volontari (se un giorno diventaste esperti programmatori Python potreste contribuire anche voi).

Esistono anche degli IDE commerciali, sviluppati da Software House indipendenti, che sono molto più potenti di IDLE ed hanno moltissime funzioni (che per il momento non sapete come usare!). In questa lezione descriverò un IDE gratuito (ma non Open Source) abbastanza semplice, che potrà velocizzare il vostro lavoro. Cercando su Internet potete trovarne altri, ma quasi tutti sono rivolti a programmatori abbastanza esperti ed hanno molte funzioni che potrebbero all'inizio disorientarvi.

WING 101

Wing 101, scaricabile qui, è la versione base gratuita di un programma commerciale ed è espressamente dedicata ai "beginner programmers". Una volta installato e lanciato ci accorgeremo che finalmente tutta l'applicazione è composta da un'unica finestra, nella quale abbiamo:

Vediamo i principali miglioramenti di Wing rispetto ad IDLE:

Inoltre, ed è il motivo per il quale lo consiglio, Wing 101 rende molto più facile il processo di debugging, che serve a rilevare gli errori nei programmi, e che trattiamo nei prossimi paragrafi.

GLI ERRORI NEI PROGRAMMI

Man mano che i nostri programmi diventano sempre più lunghi e complicati aumenta sempre più la possibilità di commettere errori, la cui correzione richiede di solito parecchio tempo. Una vecchia battuta nel campo dell'informatica è la seguente regola del 90 - 10: "Per fare il 90% del lavoro basta il 10% del tempo, il restante 10% del lavoro richiede il 90% del tempo".

In genere gli errori in informatica vengono divisi in tre categorie:

Mentre gli errori del primo tipo sono facili da correggere, ed oltretutto Python non ci fa lanciare il programma finchè non li abbiamo corretti tutti, gli altri due tipi possono essere molto difficili da trovare, anche perchè possono presentarsi solo in determinate situazioni, che magari non avevamo previsto. Ecco alcuni esempi:


# Questo programma stampa 10 numeri float a caso
from random import *
seed()
for i in range(10):
    a = randrange(10)
    print (10 / a)

Cosa succede in questo programma? randrange(10) restituisce un numero casuale tra 0 e 9: quindi questo codice esegue 10 divisioni tra cui, casualmente, potrebbe esserci una divisione per 0. Se noi proviamo a lanciare il programma più volte, vedremo che alcune volte andrà in crash ed altre no. Se poi sostituissimo la terza riga con a = randrange(1000) la variabile a avrebbe solo una probabilità su 1000 di essere 0, quindi il programma girerà quasi sempre tranquillamente ma avrà una piccola probabilità di andare in crash con un errore.

Vediamo un altro errore:


# Questo programma stampa la tabellina del 3
for i in range(10):
    print ("3 x", i, "=", 3*i)

Questo è un errore semantico: ci siamo dimenticati che se scriviamo for i in range(10): i varierà da 0 a 9, quindi non stamperemo 3 x 1 = 3 ... 3 x 10 = 30 ma 3 x 0 = 0 ... 3 x 9 = 27.

IL DEBUGGING

Un grande aiuto per trovare gli errori nei programmi viene dal debugger:

Il debugger è un'applicazione che permette di eseguire il nostro programma in una modalità "protetta". In particolare è possibile:

Il debugging è proprio il processo di rimozione degli errori mediante questa modalità protetta (ricordiamo che bug in Inglese significa "insetto" o "pulce"): una volta verificato che un programma ci da degli errori di cui non riusciamo a capire l'origine, inizieremo ad eseguirlo una riga per volta controllando con calma quello che succede nel codice.

Anche il debugger era una volta un'applicazione separata, ma ormai è integrato in tutti gli IDE. In Wing 101 si può accedere ad esso tramite le icone più a destra nella toolbar superiore: vediamo le possibilità che ci offre:

Tasto Significato Esempio
Debug Fa partire la modalità debug. Il programma partirà e verrà eseguito fino al primo breakpoint (vedi sotto), dove si fermerà: nell'editor la linea corrente verrà evidenziata in rosso.
Stop Termina immediatamente la modalità debug. Il programma si fermerà e sarà possibile farlo ripartire (da capo) in modaltà debug o di esecuzione normale. Se durante il debugging troviamo un errore e lo correggiamo dobbiamo sempre ricordarci di fermare la modalità debug con questo tasto e ripartire da capo.
Step into Esegue una singola linea di codice. Se la linea contiene una chiamata ad una funzione "salta dentro" il codice della funzione facendoci vedere la sua esecuzione: se ad esempio premessimo questo tasto su una linea che contiene una print(), entreremmo nel codice Python della funzione (del quale probabilmente capiremmo molto poco ...). Anche questo tasto può essere usato per far partire il programma in modalità debug: l'esecuzione si fermerà alla prima linea di codice.
Step over Simile al precedente, esegue una singola linea di codice, ma non "entra dentro" le funzioni. Per il momento useremo sempre questo tasto per eseguire il programma passo passo: vedremo la linea rossa evidenziata spostarsi seguendo l'esecuzione del programma, e dopo ogni passo potremo controllare molte informazioni nei pannelli sulla destra (vedi sotto).
Step out Esce da una funzione.

Durante l'esecuzione passo passo possiamo ispezionare il valore di tutte le nostre variabili: basta spostare il puntatore del mouse sopra il nome di una variabile ed attendere un attimo: apparirà un tooltip con il valore della nostra variabile.

Per attivare e disattivare un breakpoint basta fare click a sinistra di una riga. Quando lanceremo il programma con il tasto debug esso si fermerà alla riga indicata.

Per il momento vi consiglio di procedere così: fate partire il programma con lo step into, ed il debugger si fermerà sulla prima linea di codice che viene eseguita. Continuate poi con lo step over per non "entrare" dentro le funzioni di Python, che hanno un codice troppo complicato. Se per sbaglio vi dovesse succedere, potete ritornare al vostro programma premendo lo step out (a volte è necessario premerlo più volte.

IL DEBUGGING CON IDLE

Questo paragrafo è dedicato ai "puri e duri" che non vogliono assolutamente usare programmi commerciali, anche se gratuiti. In effetti anche IDLE ha un debugger incorporato, ma questo è piuttosto scomodo perchè apre una terza finestra sullo schermo. Cliccate sulla voce di menu Debug=>Debugger e si aprirà questa finestra:

I cinque bottoni in alto a sinistra sono gli equivalenti di quelli di Wing 101. Assicuratevi di spuntare la casella source (altrimenti non vedrete l'avanzamento del vostro programma nell'editor).

Ora fate partire normalmente il programma (sempre nell'editor) e vedrete che l'esecuzione si bloccherà sulla prima linea. Potete continuare usando il tasto over ad eseguire le istruzioni passo passo: nell'area della finestra di debug vedrete il valore delle vostre variabili (incluse alcune variabili interne di Python di cui per il momento non conoscete il significato). Dovrete comunque "gestire" tutte e tre le finestre: l'editor per vedere il vostro programma, la shell per l'I/O ed il debugger per eseguire le linee.

UN'ALTERNATIVA ONLINE

Ci sono anche siti che permettono di eseguire codice Python online. Uno di questi è Pythontutor. L'interfaccia presenta una finestra nella quale potete copiare ed incollare il vostro codice, ed un tasto "Visualize execution" per cominciare il programma. A questo punto si aprirà un'altra finestra con vari tasti: potrete eseguire una riga per volta e vedere i valori delle variabili in un'altro riquadro. Tenete presente che non tutte le funzioni di Python sono supportate (alcuni moduli non verranno importati).

ESERCIZIO 14.1 Provate ora ad eseguire qualcuno dei vecchi programmi con il debugger (di Wing o di IDLE o online). In particolare provate con eq_2_grado.py per vedere come funzionano gli if, con divisibilita.py per vedere i cicli con il break, con gioco_banco.py per una panoramica generale delle varie tecniche.

Fine della lezione