È facile iniziare a programmare (se sai come farlo) #1

foto-del-07-04-20-alle-17-19

1. Cosa sono i linguaggi di programmazione?

Pensate al vostro cane. È sul divano. Voi entrate in sala, lo vedete sul divano, lui vede voi. Fa la faccia colpevole, sa che non deve stare sul divano. Sarebbe opportuno parlare in linguaggio canino per fargli capire il grosso errore che ha fatto, ma voi siete umani, non conoscete il linguaggio canino.

Vi serve un linguaggio di comodo, che sia abbastanza simile al linguaggio con cui parlate con i vostri colleghi o con i vostri figli, ma anche sufficientemente conciso e formalizzato per essere recepito dal vostro cane.

Quindi urlate “bastardo, scendi dal divano!”.

Bastardo è l’oggetto del vostro comando, scendi è l’azione che richiedete all’oggetto di fare e il divano è una variabile, in questo caso il cane è sul divano, ma solo perché avete chiuso a chiave la camera da letto. Altrimenti sarebbe sul letto.

Ora, il cane non capisce quello che avete detto, lui comunica solo in canino, ma – appunto – si è creata in anni di coesistenza una lingua di comodo nella quale alcune parole diventano significative per lui e per voi.

Questi sono i linguaggi di programmazione: dei modi per far comunicare gli umani con una macchina, l’elaboratore. Il computer. Nel corso degli anni ne sono stati creati tanti e tanti, sono tutti un po’ diversi e tutti un po’ uguali. A Enrico Colombini in una conversazione privata purtroppo secretata anni fa chiesi, ma senti, tu quanti linguaggi di programmazione conosci? E lui mi ha guardato e mi ha detto, beh, tutti. Nel senso che quelli che non li conosco me li guardo e capisco in cosa differiscono da quelli che conosco già.

Ci sono linguaggi di programmazione logici, imperativi o procedurali, funzionali, a oggetti e rosa. Noi parleremo di quelli rosa.

Ma prima di parlare di quelli rosa, vedremo a grandi linee gli altri.

In queste lezioncine farò riferimento a una IDE che vi consiglio di scaricare, di chiama Thonny. Le IDE sono – sostanzialmente – dei programmoni che aiutano a programmare, mettono insieme un editor per scrivere i comandi, segnalano se stai facendo degli errori, fanno apparire immediatamente i risultati della programmazione, ti consolano quando sbagli. Aiutano.

Ho scelto Thonny perché è proprio una IDE pensata per chi inizia a programmare e perché è stata fatta in Estonia. Ha anche una icona che mette tenerezza. È un po’ come quello spettacolo nel Lupo della Steppa di Hesse, il cartellone, non so se avete presente.

Il linguaggio con cui programmeremo le prime cose è Python. Ho scelto Python perché è un linguaggio di programmazione che non amo molto, quindi non ci saranno problemi affettivi.

Una volta aperto Thonny, scrivete nello spazio in alto:

print ("ciao mondo")

e poi premete l’icona del play bianco su fondo verde. Thonny vi chiederà di salvare il programma a cui state lavorando, fatelo.

Subito dopo, sotto, nella shell, apparirà la scritta:

ciao mondo

A questo punto il grosso è fatto, da ora in poi è tutta in discesa.

1.2 come pensano i computer?

Premetto subito: questo capitolo, come molti dei Promessi Sposi, potete tranquillamente saltarlo. Ma io mi sento in dovere di scriverlo.

Allora. A questo punto qualcuno potrebbe chiedermi: ma un attimo, se io scrivo un programma in un linguaggio di comodo, che io capisco abbastanza, come fa il computer a capire questo linguaggio di comodo? Chi glielo ha insegnato? Il cane il linguaggio di comodo l’ha imparato con anni e anni di sofferenza reciproca, lotta, carezze, pelo. Ma il computer? Come pensa il computer?

La risposta è molto semplice:

a) Il computer non pensa. Computa. Fa calcoli. Sposta cifre. Confronta cose.
b) Il linguaggio che parla il computer dentro di sé è volgarmente detto linguaggio macchina e noi non lo toccheremo nemmeno con un bastone.
c) Qualcuno, prima di voi e prima di me, ha scritto un programma che *traduce* il linguaggio di comodo in linguaggio macchina. Tu scrivi print ("ciao mondo") e Python, in questo caso Python, che è un programma, prende quel comando e lo traduce in qualcosa che il computer capisce.

Tutti i linguaggi di programmazione sono sostanzialmente dei programmi che traducono questo linguaggio di comodo in qualcosa che il computer capisce. Python, Prolog, C, Pascal… sono anche loro programmi. Se la tirano, ma anche loro non sono altro che programmi.

Qualcuno potrebbe chiedermi, ma se sono programmi, con cosa sono stati scritti? La risposta è – in genere con altri linguaggi, quindi con altri programmi. E allora la stessa persona, che da ora in poi chiameremo Antonio, in tutti i miei corsi c’è sempre uno che si chiama Antonio e che fa sempre domande di questo tipo finché non viene allontanato, dicevo, Antonio chiederebbe, ma questi altri linguaggi con cui sono stati scritti i linguaggi venuti dopo, quelli, con cosa sono stati scritti? E io risponderei beh, con altri linguaggi ancora oppure da se stessi, a pezzi, fai il pancreas e il pancreas si mette lì e genera parte dei polmoni, il colon e così via. Unix è nato così, anche molte stampanti 3D usano questa tecnica di autogenerazione parziale. A questo punto, giustamente Antonio alzerebbe ancora la mano e io gli direi basta. Basta. C’è un limite oltre al quale la conoscenza è concessa solo a chi ha fatto ingegneria. Tanto tu, Antonio, non scriverai mai un linguaggio di programmazione, almeno non durante questo corso. Fine.

Quello che davvero interessa a noi è distinguere tra due cose: gli interpreti e i compilatori. Ovvero i linguaggi che quando scriviamo un programma e premiamo play, come abbiamo fatto prima con Thonny, lui si mette lì e lo traduce al volo al computer, come farebbe un traduttore durante una conferenza che mentre io parlo in italiano, per dire, lui traduce in inglese alla platea quello che sto dicendo, e quello che lui traduce il computer lo fa subito, al volo: questi sono gli interpreti.
I compilatori invece prendono il codice che ho scritto, si mettono lì e dicono, ok, aspetta mi siedo e traduco proprio tutto tutto in linguaggio macchina, creo proprio un programma che poi dopo, se vuoi, lo puoi aprire, come apriresti Word o Chrome. Ti creo una applicazione.

Il compilatore compila e genera un binario, che fa molto ferrovia, ma si intende un programma, una applicazione. Binario nel senso che il computer pensa solo zero o uno, acceso o spento, numerazione binaria che sembra una cosa ridicola, due sole cifre, ma tipo con il binario puoi contare con le dita di una mano fino a trentuno invece che cinque, quindi i suoi vantaggi li ha. Ma non voglio perdere tempo con il binario perché intanto per un bel po’ non ci servirà più di tanto sapere che il computer usa il binario, quindi lasciamola lì.

Iniziamo invece a scrivere un programma.

1.3 Il nostro primo programma

Il nostro primo programma si chiamerà “cose da fare prima di dare un giudizio di merito su Franco Battiato” e – sostanzialmente – stamperà i numeri da uno a cento.
Siamo fortunati. Abbiamo già visto come si “stampa” con Python, usando il comando print. Non è che davvero andiamo a stampare su un foglio, cerchiamo di preservare la natura, stamperemo sullo schermo e – nel nostro caso – nello spazio in basso della finestra di Thonny, dove c’è scritto shell.

Una piccola premessa prima di cominciare: ho parlato di comando per stampare. Questo termine, comando, lo uso informalmente con te. Il nome corretto è diverso e lo vedremo poi nel corso delle lezioni. Alcune sono istruzioni, altre sono funzioni, altre ancora sono parole magiche, ma per ora, per non creare troppa confusione, li chiamerò tutti comandi.

A questo punto potrei dirti, beh, facile scriviamo:

print("1")

…e poi sotto scriviamo:

print("2")

…e poi ancora sotto:

print("3")

… e poi aggiungiamo:

print("4")

… e poi scoppierei in lacrime e confesserei, no. Non si fa così. Non è questo il metodo giusto. Perché questo metodo è noioso, è ripetitivo. È meccanico. È il modo con cui lo faremmo con un foglio di carta e una penna, non con un computer. Non è creativo, non è divertente. Se il metodo giusto fosse andare avanti scrivendo a mano fino a print("100") non ci sarebbero computer in giro, non ci sarei io e nessuno avrebbe mai fatto film in cui i computer prendono il posto dell’umanità.

Ora devo dirvi la grande regola dell’informatica: se siete al computer a lavorare e state facendo una cosa centinaia e centinaia di volte, in maniera ripetitiva e noiosa, ecco, c’è qualcosa che non va. Se c’è un compito noioso e ripetitivo non dobbiamo farlo noi, deve farlo il computer. Lui *nasce* per fare tante cose ripetitive. Si scalda a ripetere migliaia di operazioni che per noi sarebbero la morte.

La cosa bella della programmazione è mettersi lì a pensare come scaricare il proprio carico di lavoro sul computer. È creativo, divertente, appagante, infoiante, lo scoprirete a vostre spese.

Evitate di fare al computer un compito nella stessa maniera con cui lo avreste fatto nel mondo analogico o – peggio – con Word. Fate al computer una cosa come si fa al computer.

Ecco, dovevo dirlo.
Torniamo al nostro compito.

Dobbiamo scrivere i numeri da uno a cento. Ovvero, dobbiamo scrivere un numero che deve variare ogni volta che lo stampiamo.
La prima volta è uno, la seconda è due, la terza è tre e così via.

Se dobbiamo usare un valore che varia nel tempo, la cosa migliore è usare una variabile.

Andiamo su Thonny e scriviamo il nostro primo comando con una variabile:

numero=0

E poi premiamo il tasto play per eseguire il nostro programma.

Ecco: non succederà niente. Niente di niente.

Non è fantastico?

1.4 vediamo di incrementare

Allora, è normale che non succeda niente. Era un cliffhanger. Spesso, anche nella vita di tutti i giorni, ci capitano cose che non succede niente: ci giriamo e improvvisamente – tac – un tramonto ci trafigge l’anima, o gli occhi di una ragazza o una lettera dell’Agenzia delle Entrate. Apparentemente non è successo niente, ma dentro di noi è tutto un subbuglio.

Così Python. Gli abbiamo detto che numero è uguale a zero e lui, Python, zitto. Come se la cosa non gli importasse.
Ma dentro di sé Python sa che numero adesso è uguale a zero.

Verifichiamolo. Chiediamogli di stampare numero. Aggiungiamo una riga al nostro programma:

numero=0
print (numero)

Adesso premiamo il pulsante di play. Sotto, nella shell, apparirà lo zero.
Figata.

Questa è una variabile: associamo un nome a un valore. Da ora in poi numero per Python è uguale a zero. Ogni volta che faremo qualcosa a numero lo faremo al valore associato. È una cosa un po’ biblica, “Ogni volta che avete fatto queste cose a uno solo di questi miei fratelli più piccoli, l’avete fatto a me”. Ecco, stessa cosa per le variabili.

Facciamolo subito. Inseriamo una nuova linea in mezzo alle due che abbiamo scritto:

numero=0
numero = numero + 1
print (numero)

La riga che abbiamo aggiunto è: numero = numero + 1

È un modo per incrementare la nostra variabile. È come se dicessimo, oh Python, te lo ricordi numero? E Python ci rispondesse, beh certo, mi hai detto che è zero, no? Bravo, gli diremmo noi, adesso però gli voglio cambiare il valore. Ah, direbbe Python. E ora quanto deve valere? ci chiederebbe. E noi gli spiegheremmo, guarda Python, il valore che aveva prima, più uno. Python si metterebbe lì a pensare a voce alta e direbbe, beh, prima valeva zero, ora ci aggiungo uno… quindi ora vale uno.
E dentro di sé Python modificherebbe il valore di numero, toglierebbe lo zero e ci metterebbe un uno.

E infatti, se premete play e guardate in basso la shell, adesso viene stampato 1 e non 0.

È fatta. Sappiamo come incrementare una variabile. Ora possiamo fare il nostro programma per contare da uno a cento prima di scrivere qualcosa su Facebook. Basta scrivere:

numero=0
numero = numero + 1
print (numero)
numero = numero + 1
print (numero)
numero = numero + 1
print (numero)
numero = numero + 1
print (numero)

[...]

…un attimo. Ragazzi, un attimo. Facendo così per cento volte, è vero, avremmo una lista dei numeri da uno a cento. Però sarebbe di nuovo una cosa meccanica per noi umani, dovremmo scrivere cento volte gli stessi comandi.
Non c’è un modo per dire al computer, oh computer, questa cosa di incrementare numero e stamparlo, falla per cento volte?

Ecco, ci siamo. Siamo arrivati a un pezzo grosso della programmazione. Siamo arrivati ai cicli.

Non quelli della fertilità, gli altri.

1.5 L’importanza del ciclo

Tra le cose grosse che una persona impara quando diventa padre è l’importanza dei cicli.
In genere la scena è questa: tu padre rientri dal lavoro e ti accoglie la tua meravigliosa duenne, tu la prendi, la stritoli di abbracci, giochi con lei, la stritoli ancora e poi ti butti sul divano con il portatile per – finalmente – riposarti.

E qui emerge la prima incomprensione: la bambina torna da te, in genere reggendo a fatica qualche improbabile tomo cartonato con animali antropomorfi o qualche giocattolo chiaramente disegnato per un target molto molto diverso da un maschio adulto quarantenne. Stanco.

La figlia vuole continuare a giocare e non capisce (non è colpa sua) che il padre ha invece bisogno di un attimo di pace, di rilassamento, di stacco, come solo certi centometristi sanno fare.

Da qui nasce l’idea del ciclo. Il padre si guarda attorno e vede un mucchione di duplo ammonticchiati sul tappeto. Sorride, il padre, e dice “bimba, portami un lego”. La bimba si volta, vede i duplo, capisce, corre, prende un duplo e lo riporta al padre.

“Brava”, dice il padre. Appagamento. Prende il duplo che la pargoletta mano tende. “Ancora!” la invita il padre, “portane qua ancora uno”.

“E vai avanti finché non li hai portati tutti” aggiunge.

La bambina è raggiante, va, prende un lego, lo porta al padre, torna dai duplo, prende un altro pezzo lo riporta dal padre, torna dai lego, prende pezzo, porta dal padre e così via mentre lui – il padre – finalmente chiude gli occhi e sogna. Sogna, sogna, sogna, mentre sente la duenne che corre avanti e indietro e poi si sente toccare.

Riapre gli occhi e scopre che la bambina, dopo il settimo pezzetto di lego, ha preso il bordo del tappeto su cui erano riposti tutti gli altri duplo e lo ha trascinato fino al divano dicendo qualcosa tipo “iamo”, che significa “giochiamo?” e il padre – ora – manda profondissimi sospiri.

I cicli su computer funzionano uguale, con tre differenze:

- in genere il computer tiene conto di quanti mattoncini sta trasferendo;
- mentre va avanti e indietro a prendere e lasciare mattoncini, lungo la strada, il computer fa altre cose che magari gli abbiamo chiesto.
- a meno che non glielo chiediamo espressamente il computer la vigliaccata del tappeto non la fa.

Ritorniamo alla nostra stampa dei numeri da uno a cento. Le istruzioni che daremmo a nostra figlia, se fosse un computer, sarebbero:

  1. ciao amore
  2. vedi, amore, qua sul divano non ho mattoncini, me ne vai a prendere uno e me lo porti qua? Dovresti farlo ancora e ancora finché sul divano non ce ne saranno cento, grazie
  3. ogni volta che ne lasci uno qua sul divano mi scriveresti su questo foglio quanti mattoncini ci sono sul divano?

E la nostra duenne robot correrebbe avanti e indietro portando mattoncini e scrivendo intanto i numeri da uno fino a cento. L’incremento dei mattoncini non ci interessa per i mattoncini, ma perché permettono a nostra figlia di tenere conto dell’incremento e di scriverlo sul foglio.

In Python ci sono diversi modi per scrivere questa cosa, ad esempio:


numero=1
while (numero<101):
  print (numero)
  numero=numero+1

Scriviamolo con la nostra IDE Thonny e guardiamo il risultato sotto nella shell. Nello scrivere il codice prestate bene attenzione agli spazi che creano rientro prima di "print" e "numero". I rientri, come vedremo nella prossima lezione, sono molto importanti in Python e nei sorpassi in autostrada.

1.6 scrivere bene spiegato male

Avete presente quando avete dei figli e li chiamate e gli dite, ok oggi apparecchiate voi tavola, e quelli si mettono lì, sbuffano, protestano, ma poi, con infinita lentezza, mettono tovaglia e piatti e poi vi chiamano.

Voi arrivate e guardate la tovaglia rossa, con i tovaglioli verdi, ocra e blu di altre tre tovaglie diverse, i bicchieri un po' della nutella, un po' di cristallo, i fondi di almeno due servizi diversi e i piani presi in modo che siano incompatibili sia con il fondo sotto cui sono posati, sia fra di loro. Delle forchette preferisco non parlare.

Ok, è possibile andare avanti a mangiare con la tavola apparecchiata in quel modo, ma è un colpo basso all'estetica e alla bellezza.

Ecco la stessa cosa per il codice: quando si scrive codice si può scrivere che funziona e che non funziona, certo, ma si può anche scrivere che sia bello da vedere o che sia orribile, un guazzabuglio di segni che funzionano ma che sono un incubo da leggere.

Qui faccio una distinzione: ci può essere un codice che funziona ma che è logicamente scritto male (un po' come abbiamo visto nella lezione numero quattro dove andavamo a scrivere per 100 volte il print(numero) incrementandolo a mano di volta in volta), e ci può essere codice logicamente corretto ma formalmente scritto male.

Ecco, qua metto una premessa: io scrivo male.

Almeno, il codice, lo scrivo davvero male. La scorsa lezione avevo chiuso la presentazione del loop con questo codice python:


numero=1
while (numero<101):
  print (numero)
  numero=numero+1

In quel momento passa di lì mio figlio, primogenito, e gli dico, oh mi dai un'occhiata al pezzo se va bene e lui dice occhei, si ferma, guarda e poi mi dice tu non sai scrivere.

"Eh" dico io.
"Il codice, dico"
"Ah. È sbagliato? Funziona"
"Non è sbagliato, è solo orribile"
"Ecco"
"Non si mette mai uno spazio tra una funzione e una parentesi, dannazione"
"Ah"
"E while non vuole la parentesi. Non serve"
"Ok"
"E poi quando metti degli operatori, lì sì che ci vanno gli spazi"
"Beh, grazie, mi serviva parlare con un talebano del codice formale"

Quindi, il codice che ho scritto la scorsa volta è meglio se impariamo a scriverlo meglio, ad esempio:


numero = 1
while numero < 101:
  print(numero)
  numero = numero + 1
 

Ma cosa fa questo codice quando lo scriviamo su Thonny? Esaminiamolo insieme, ma prima un'altra premessa: la terza e quarta riga iniziano con uno spazio. Ora, quando scriverete queste righe su Thonny, mantenete questo spazio, anzi, meglio metterne quattro.

Ok, esaminiamo il listato.

Nella prima riga gli diciamo che la variabile numero ha come valore 1.
Nella seconda riga cominciamo un loop. Ricordate? Diciamo a nostra figlia di andare avanti e indietro da divano per fare qualcosa per noi.
CI sono diversi modi di fare un loop, in questo caso abbiamo il comando while. Finché.

È come se dicessimo: "ok computer, finché numero ha un valore minore di 101, allora fai le cose che ti dico dopo i due punti".
Quali sono le cose dopo i due punti? La riga tre e quattro, ovvero quelle con gli spazi prima.

Nella terza riga gli diciamo di stampare numero, nella quarta riga gli diciamo di incrementare numero di uno.

E qui sta la cosa importante: alla fine della riga quattro il programma non finisce. Continua.
Quando arriva alla riga quattro il computer vede che il nostro programma è finito. Ma si accorge anche che la riga tre e quattro avevano uno spazio prima.

Lo spazio prima della riga tre e quattro, in Python, significano che quelle istruzioni vanno ripetute e ripetute e ripetute ancora e ancora finché non si completa la cosa che abbiamo chiesto nella riga due con il while.

Quindi: finché numero è inferiore a 101, stampami sullo schermo quanto vale, incrementalo di uno e ricontrolla se è ancora inferiore a 101, se lo è stampami sullo schermo quanto vale, incrementalo di uno e ricontrolla se è ancora inferiore a 101, se lo è stampami sullo schermo quanto vale, incrementalo di uno e ricontrolla se è ancora inferiore a 101, se lo è stampami sullo schermo quanto vale, incrementalo di uno e ricontrolla se è ancora inferiore a 101, se lo è stampami sullo schermo quanto vale, incrementalo di uno e ricontrolla se è ancora inferiore a 101, e così via finché finalmente numero non sarà superiore a 100 allora il programma passerà alla riga successiva, la quinta, che nel nostro programma non c'è, quindi si fermerà.

Come nostra figlia che andava avanti e indietro dal divano ai lego.

In Python, che è linguaggio da questo punto vista formalmente curioso, quello che deve essere fatto in un ciclo viene rientrato, mettendo degli spazi a tutte le istruzioni che seguono e che fanno parte del ciclo.

In altri linguaggi, come javascript o C, invece si usano in genere delle parentesi, graffe.

Per questo le hanno messe sulle tastiere.

Il computer eseguirà il nostro ciclo finché quello che deve avverarsi nel while non si avvererà. Questo è un motore potentissimo per la programmazione, ciclare permette di fare cose che - senza l'informatica - semplicemente non faremmo in questo modo. Cicliamo dati, informazioni, a migliaia, milioni, miliardi. E il computer cicla e cicla senza fermarsi mai.

Se noi togliessimo l'ultima riga del nostro listato, quella che incrementa numero, il while non troverebbe mai la condizione per cui numero è superiore a cento. Il computer continuerebbe allora a ciclare per sempre, per l'infinito. Quando volete pensare all'infinito, non pensate solo alle stelle nel cielo nelle notti estive, pensate anche al potere di ciclare per sempre.

La prossima volta vedremo come potenziare questo piccolo programma e far scrivere al computer la tabellina del dieci.

06. aprile 2020 by fabrizio venerandi
Categories: Programmazione, venecoda | 10 comments

Comments (10)

  1. Mi sa che la numerazione 1.5 dei capitoli si ripete due volte in:
    1.5 L’importanza del ciclo
    1.5 scrivere bene spiegato male

    P.S. questo messaggio una volta corretto l’errore si autodisrtuggera

  2. tanto per non rimanere con l’acquolina in bocca, questo è un articolo una tantum o l’inizio di un lungo percorso?
    ps: come sempre, il tuo scrivere mi piace e mi diverte molto…

  3. e come fai a saperlo, indici un referendum?

  4. Fantastico, oggi inizio ad usarlo sui pargoli e poi ti dico il risultato.

  5. Ho trovato l’articolo molto interessante. Personalmente mi farebbe veramente piacere se divenisse il primo episodio di una serie regolare con la maggiore frequenza possibile. Compatibilmente con la necessità dell’autore di esprimersi anche su altri temi, ovviamente.

  6. Bellissimo e interessante. Per cortesia continua con le lezioni successive! Grazie.

  7. È assolutamente il modo giusto di spiegare la programmazione a tecnolesi come me. Grande Fabrizio. ( smile a caso )

Rispondi a Maurizio Firmani Annulla risposta

Required fields are marked *