GUIDE

Basi ed acidi dei linguaggi di programmazione

Eccoci arrivati alla terza puntata della machecazqoovelodicoafare rubrica Programmazione: parliamone. Attrezzatevi di fogli, penne e fazzoletti – quelli vi servono per pulire il macello creato dalla vostra parte più onanistica – poiché essendo il tre uno dei numeri ritenuti più sacri da quei fumati che credono in Dyo dall’umanità, quello che state per leggere vi cambierà la vita.
Oppure no. Stavo scherzando. Ve la siete presa? No?! Beh, prendetevela.

Nel bagaglio di un buon programmatore vi sono sempre alcuni concetti che fanno parte di ogni linguaggio di programmazione. Sono delle nozioni che devono essere possedute anche solo per pensare e scrivere il primo Hello World e sono indipendenti da qualsiasi linguaggio. Più o meno. Quelli che sto per mostrarvi sono molto semplici e non richiedono davvero alcuna conoscenza per essere capiti. Se ora non capite nulla di quello che c’è scritto nel codice che ho postato, alla fine di questa lettura potrete sicuramente analizzare il codice e rendervi conto di quanto sia pieno di minchiate sia semplice.
Il linguaggio scelto è il Python, poiché è un linguaggio grammaticalmente semplice e possiede una punteggiatura quasi inesistente (rispetto ad altri linguaggi). Insomma, it’s easy.
Premetto che il mio editor di testo, tipo di programma del quale parleremo in un’ altra occasione, ha una caratteristica veramente utile per un programmatore: evidenzia con colori differenti i tanti tipi di codice in base alla funzione che hanno all’interno del linguaggio.

Tutto quel rosso che vedete, per esempio, è codice commentato. I commenti sono delle righe o delle parti di testo che non vengono tradotti dal compilatore o dall’interprete, il quale semplicemente le ignora. Sono una fonte utilissima di informazioni ed ogni buon programmatore dovrebbe farne un uso corretto. Essi sono fondamentali per la fase di aggiustamento del codice o di aggiornamento, poiché il programmatore non deve cercare di capire cosa fa esattamente il programma o non deve tirare giù tutto il Pantheon per capire cosa succede in un algoritmo complesso che è stato implementato decenni prima. Ovviamente, bisogna evitare di esagerare se non si ha una buona ragione (Ed io ce l’avevo). In Python sono generalmente preceduti da un cancelletto (#), ma ogni linguaggio fa storia a se stante.
Le cosiddette keywords, parole chiave, testo che non può essere usato come nome per variabili, costanti o funzioni, sono in arancione; le definizioni di una funzione sono in blu; le stringhe alfanumeriche sono in verde.
In nero, invece, c’è tutto il testo “normale”, composto da variabili, costanti, numeri, punteggiatura, librerie ed operatori che non hanno bisogno di essere distinte tra di loro poiché non hanno caratteristiche simili e quindi non possono essere confuse.
Sì, non avete letto male: sto parlando anche di operatori.

I linguaggi di programmazione possono usare a tutti gli effetti un sacco di matematica. Anzi, se proprio vogliamo scendere in profondità, tutto ciò che riguarda la programmazione, e più in generale le scienze informatiche, fa parte della branca applicata della matematica. Gli operatori sono simbolicamente quelli matematici (+, -, *, %, ^, =, , ecc…) e generalmente hanno lo stesso significato dell’arte madre. Non è comunque sempre così.
Un esempio di questa differenza è il simbolo “=”, che in matematica significa “uguale a” mentre in informatica significa “sposta quello che c’è a destra dentro quello che c’è a sinistra”. Per riprodurre l’effetto matematico dell’uguale, un programmatore deve usare il simbolo “==”. Esiste ovviamente anche l’opposto, “!=”, che significa “diverso da”.
Probabilmente vi state chiedendo il perché di questa differenza esistente tra la matematica ed il codice. E’ quasi tutta colpa della gestione della memoria che riguarda le variabili e le costanti.

Una variabile è un pezzo di memoria che può essere riempito a piacere dal programma. Numeri, stringhe di testo, conti, altre variabili, tutto può essere inserito all’interno di queste parti di memoria, a patto che il contenuto non superi una determinata grandezza decisa dal programmatore o dal compilatore/interprete stesso. Questa grandezza dipende dal tipo della variabile e dal linguaggio che stai usando. Python, per esempio, utilizza un forte tipizzazione delle variabili, preferendo però di far gestire tutto il lavoro di scelta all’interprete; C ha una medio-forte tipizzazione ed il programmatore deve dichiarare la grandezza della variabile a mano, scegliendo tra numeri interi, numeri reali, numeri lunghi (contenuti da tanti bits), stringhe, caratteri e molti altri. Le combinazioni sono comunque molto numerose e sono in corso ancora molti dibattiti per stabilire quale sia la migliore.
Quando si da un valore ad una variabile per la prima volta, si dice che si inizializza la variabile ed una costante è generalmente una variabile inizializzata che o non può essere cambiata (C, C++) oppure non è mai stata cambiata all’interno del programma (Python).

Veniamo quindi alle maGGiche funzioni. Questo tipo di dati, dannazione e gioia di ogni programmatore degno di questo nome, è stato creato appositamente per diminuire la quantità di codice che deve essere scritto. Sono delle routine di codice che, una volta scritte, possono essere evocate tramite rituali satanici richiamate all’interno di altri pezzi di codice per svolgere un determinato compito. Nel programma di sopra, per esempio, la funzione “programma” racchiude tutte le operazioni che devono essere svolte in seguito alla scelta del nome. Essa è definita all’inizio del programma ed usata all’ultima riga dello stesso. Consistono in un bel vantaggio per il coder che non così deve sprecare memoria in nome della prolissità. Incredibilmente, sono funzioni “particolari” anche print (stampa a schermo), raw_input (la variabile assume la stringa od il valore che scrivi) ed tutte le strutture di controllo che state per incontrare.

Il loop (ciclo) è una struttura di controllo quasi sempre determinante per ogni programma, sia semplice che complesso. Generalmente rappresentato dal WHILE (o dal FOR), ha la funzione di ripetere un pezzo di codice fino a quando non viene raggiunta una determinata condizione o fino a quando la condizione specificata non risulta falsa. Il while normalmente è standard in quasi tutti i linguaggi di programmazione e permette leggere del codice fino a quando la condizione non diventa falsa. Esso, inoltre, ha la caratteristica di eseguire il codice solo dopo aver controllato la condizione, informazione che può diventare importantissima durante la scrittura di codice. Questa sua caratteristica permette di creare moltissimi effetti, quale il loop infinito, scritto sopra come “while 1:”, poiché 1 rappresenta il valore logico di TRUE (vero) e quindi non può essere mai falso. Il ciclo FOR, invece, è utilizzato soprattutto in forma di contatore, poiché permette di scegliere facilmente il numero di iterazioni e cioè quante volte il ciclo viene ripetuto. Tuttavia, il while può fare esattamente tutto ciò che fa il for.

L’altra fondamentale struttura di controllo è la struttura condizionale IF-THEN-ELSE. Questa particolare struttura è parafrasata da un punto di vista logico in se questa condizione è vera fai questo; altrimenti, fai quest’altro. A seconda dei linguaggi, può diventare sempre più complessa utilizzando le funzioni ELIF, CASE o SWITCH che permettono di controllare più condizioni contemporaneamente, permettendo di scegliere tra diversi casi. In questo tipo di struttura e nei cicli, è facile che vengano usati gli operatori di controllo come ==, che permettono di controllare facilmente le caratteristiche [matematiche] delle variabili e per tanto sono ideali per i controlli.

Questa sarebbe stata una degna conclusione dell’articolo, se solo non avessi avuto la pazza idea di continuare con le liste e gli array. Vi consiglio di mettervi comodi e di aprire questo video mentre leggete.
Questi due costrutti sono molto particolari e fanno parte di un livello di complessità superiore a tutto ciò di quello che abbiamo parlato precedentemente: il livello dei puntatori. Ovviamente, anche essi hanno tra di loro dei livelli di complessità ed il modo più facile per affrontarli è scappare iniziare a programmare tanto, tantissimo. Le liste fanno parte del livello di complessità più basso, poiché sono sostanzialmente delle variabili al quale sono state assegnate più celle di memoria che, per esempio nel caso del Python, l’interprete gestisce da solo. Diventa difficile gestirle quando devono essere manipolate dal programmatore, che può aggiungere, eliminare, spostare e rinominare a piacimento sia contenuto che lista stessa. Gli array sono fondamentalmente analoghi, ma sono molto più complessi quando si inizia di parlare di vettori. Sono solitamente l’ostacolo più grande da superare e molto spesso si acquisisce anche una buona conoscenza della gestione della memoria attraverso di essi. Ergo, questo non è il posto giusto per approfondirli. Non ora, per lo meno.

Rimane quindi solamente quell’ import this. Questo pezzo di codice permette al programma di dire all’interprete di tener conto dell’insieme di istruzioni contenute nella libreria standard “this”. Il programma, quindi, può utilizzare tutte le costanti e le funzioni contenute nella libreria. In questo caso, al mio programma non serve affatto ma, se provate a trascrivere il codice, avrete una bella sorpresa.

[Soliti] Link di approfondimento:
Operatori
Strutture di dati
Costanti
Gli altri articoli della rubrica

[more]Che dire, questo mi ha stremato. Non è stato affatto semplice scegliere gli argomenti rendendoli a prova di utente comune. In più, non avevo mai tempo per inventarmi un programmino stupido ma efficace :rofl: . Non ho nominato i costrutti utilizzati nell’ OOP e negli altri paradigmi, ma quelli fanno parte di altri articoli, ben più complessi.
Prossima settimana (Si spera: sono in periodo esami), l’argomento riguarderà gli strumenti del buon piccolo programmatore![/more]

Chrome Beta per Android: Risparmiare dati e traffico internet
Chrome Beta per Android: Risparmiare dati e traffico internet
Uber-paradigmi di programmazione
Debugging: la maledizione del programmatore
Alla ricerca del compilatore perduto
Storia dei Linguaggi di Programmazione
Linguaggi di programmazione: parliamone!
Python e Ruby