Python per tutti

Quando Guido van Rossum, all’inizio degli anni novanta del secolo scorso, ha battezzato il linguaggio di programmazione da lui ideato con il nome di Python intendeva semplicemente rendere omaggio ai Monty Python, un gruppo di comici inglesi che gli piacevano molto.
Dopo un ventennio di dilagante successo di questo linguaggio, si potrebbe pensare che il nome che richiama il pitone sia invece dovuto alla grande flessibilità di cui esso è dotato.
Si tratta, infatti, del linguaggio più facile da imparare e che, nella sua semplicità, manifesta una potenza di prima grandezza per fare di tutto. Al punto da essere diventato il linguaggio ideale per il machine learning.
In questo blog ho già parlato di Python, presentando un mio programmino esemplificativo con cui si gioca a Master Mind. Ho anche proposto una piccola guida per evidenziare le differenze tra la vecchia versione Python 2 e la nuova versione Python 3. Soprattutto ho indicato come e con quali strumenti si possa utilizzare il linguaggio Python su Android. Il tutto avveniva nel giugno 2015 e si trova archiviato nelle categorie Programmazione, Programmi e Suggerimenti.
Mi è venuta voglia di riparlare di Python dopo che, negli ultimi mesi dello scorso anno, è stata finalmente pubblicata la traduzione italiana di un interessante libro del 2015 di Sebastian Raschka, Python Machine Learning, con il titolo Machine learning con Python, Costruire algoritmi per generare conoscenza.
Alan Turing, precursore dell’intelligenza artificiale, diceva che le macchine non possono pensare, però possono fare quello che facciamo noi quando pensiamo. Purtroppo Turing è stato eliminato – mi pare l’espressione giusta per la tragedia che lo ha colpito – prima di poter costatare quanto vere fossero le sue intuizioni.
Infatti non solo la macchina può fare ciò che facciamo noi quando pensiamo ma, in certe situazioni, riesce a farlo meglio.
Consideriamo quanto prima e meglio di un cervello umano una macchina possa analizzare grandi quantità di dati al fine di dedurre modelli di comportamento, tendenze utili a fini previsivi, addirittura ponendo in atto procedimenti e algoritmi per la presa di decisioni basate su come quei dati si presentano e si evolvono: la macchina che impara dall’esperienza.
In epoca di Big Data servono strumenti per fare queste cose e Python si rivela essere uno dei migliori.
Probabilmente il segreto sta nella sua semplicità e nell’essere il linguaggio informatico che più si avvicina alla logica e al linguaggio umano.
Uno scienziato che voglia direttamente lavorare su una ricerca sperimentando algoritmi propri, se usasse un linguaggio di più basso livello come il C dovrebbe perdere gran parte del proprio impegno e del proprio tempo ad occuparsi di informatica: gestione della memoria, uso di puntatori, sintassi ed espressioni strane, ecc. Chi usa un linguaggio come Python è sollevato da tutti questi impicci e si può meglio concentrare sul problema vero.
Peraltro, con le macchine che abbiamo oggi, nessuno riesce veramente ad avvertire i vantaggi, in termini di efficienza e velocità di elaborazione, che ci offre un programma compilato in C rispetto al più lento, si fa per dire, script Python interpretato.
Anzi, il fatto che Python sia interpretato e l’interprete sia dotato di una shell propria con la quale si possono eseguire comandi singoli, offre una preziosa opportunità di apprendimento e di sperimentazione.
Esistono numerosi manuali, anche scaricabili gratuitamente da Internet, sul linguaggio Python ed abbiamo mille modi di impararlo in quanto tale.
Una zona che ritengo presenti qualche situazione di non semplice comprensione è quella di cosa esista attorno a Python e di come Python e i suoi script possano ottimamente interagire con il nostro computer e con il computer di altri.
Ho ritenuto pertanto di dedicare a questi argomenti un manualetto, qui allegato in formato PDF, liberamente scaricabile, stampabile e distribuibile.

mondo_python

Importante riconoscimento per OpenJDK

Sta per uscire la nuova versione di Android, che sarà la 7, il cui nomignolo avrà l’iniziale N. Pare che non ci siano molti nomi di dolciumi che iniziano per N nella lingua inglese e c’è chi scommette che, per tener fede al nomignolo che richiami un dolciume, Google dovrà ricorrere a “Nutella”, rendendo così omaggio all’inventiva dolciaria italiana. Da buon cremonese mi accontenterei anche di “Nougat”, che è il termine con cui è universalmente conosciuto il torrone.
A parte questa piccola incertezza, è ormai certo, invece, che Android 7 sarà una cannonata e che la piattaforma ufficiale per lo sviluppo delle applicazioni sarà OpenJDK, cioè la versione libera e open source di Java Standard Edition.
La storia della libertà di Java è alquanto intricata.
Creato nei pensatoi della Stanford University ad opera di una equipe guidata da James Gosling, il linguaggio Java venne prodotto dalla Sun Mycrosystem (dove Sun non è il sole ma sta per Stanford University Network). Questa azienda, già nel 2006, prima di essere assorbita dalla Oracle (per la modica cifra di 7 miliardi di dollari), aveva avviato una implementazione libera e open source della piattaforma Java, che assunse presto il nome di IcedTea e che costituisce il germe su cui si è sviluppata l’attuale piattaforma open che, da Java 7 in poi, si chiama OpenJDK ed è distribuita sotto licenza GNU GPL, cioè come software libero.
Parallelamente anche la fondazione Apache aveva avviato la realizzazione di una piattaforma Java open source con il progetto Harmony.
E’ proprio da quando l’IBM, nel 2010, ha abbandonato il sostegno al progetto Harmony unendosi alla Oracle nel sostegno a OpenJDK che quest’ultimo è diventato il riferimento unico del mondo del software libero e lo troviamo di default inserito in tutte le distribuzioni Linux.
OpenJDK sta per Open Java Development Kit ed è il pacchetto necessario per sviluppare applicazioni per computer usando il linguaggio Java. Il pacchetto contiene il sottopacchetto OpenJRE, cioè Open Java Runtime Environment, necessario per far girare sul computer le applicazioni sviluppate con il linguaggio Java. Per chi non è interessato a sviluppare applicazioni Java basta il JRE, che, nella versione Open o nella classica originale della Oracle, comunque gratuita, è bene avere sul computer per poter utilizzare le numerose applicazioni sviluppate in Java che esistono.
La Oracle, pur appoggiando la diffusione della versione open del kit di sviluppo standard, continua a distribuire i pacchetti binari del JDK e del JRE da lei prodotti e protetti da una licenza proprietaria.
Per cui non tutta Java è libera: alcune API (Application Programming Interface) possono essere presenti nel pacchetto originario della Oracle e non essere presenti nel pacchetto open e tutto questo genera pericolose trappole.
La stessa Google, che per sviluppare il primo motore Java a corredo del sistema Android ha fatto affidamento su API Java derivate dal progetto Harmony in itinere, è caduta in una di queste trappole e, pare inavvertitamente, ha utilizzato qualche cosa che non era o non era ancora sotto licenza libera: da qui l’annosa diatriba tra Google e Oracle, arrivata fino alla Corte Suprema degli Stati Uniti, con alla base la richiesta della Oracle di un indennizzo da un miliardo di dollari.
D’altra parte su OpenJDK, qualche anno fa, erano diffuse voci di inaffidabilità: pare che non funzionasse bene per la costruzione di applicazioni un po’ impegnative. Ma pare anche che col tempo abbia raggiunto un ottimo livello di affidabilità. Ne è una dimostrazione il fatto che Google lo abbia finalmente adottato in pieno; nè possiamo credere che ciò sia avvenuto, come qualche maligno insinua, per fare un dispetto alla Oracle: Android è ormai una cosa molto seria e non se ne può certo giocare la fama per un dispetto infantile.
Allora usiamo anche noi con fiducia OpenJDK.
Se siamo studenti che vogliono imparare o, come nel mio caso, dilettanti hobbisti ne avremo sicuramente a sufficienza, anche nel caso abbia ancora qualche difetto, per i nostri esperimenti.
Per i professionisti valga il fatto che lo ha scelto anche Google e, soprattutto, che il suo utilizzo anche per programmi da mettere in commercio con profitto eviterà all’autore di essere inseguito dalla Oracle.
Nel documento PDF allegato, scaricabile e stampabile, a vantaggio di studenti e hobbisti ho raccolto alcuni suggerimenti sugli strumenti di software libero esistenti per programmare in linguaggio Java, anche per applicazioni Android.

java_android

Basic su Android

Si chiama BASIC! (con un meritato punto esclamativo) e si trova su Google Play.
Sviluppato dal vecchio mago dell’informatica Paul Laughton nell’ambito del settore Dr. Richard Feynman Observatory del suo strano Workshop, il nome completo è RFO-BASIC!, dove RFO richiama il Richard Feynman Observatory: il riferimento spiega, tra l’altro, perché l’icona della app sia costituita da un telescopio.
Se qualcuno vuole visitare il workshop di Laughton, per rendersi conto del personaggio e per leggere qualche aneddoto sulla sua vita, compresa la collaborazione pionieristica con Steve Jobs, può visitare il sito laughton.com/paul/paul.html.
Con questa app possiamo scrivere ed eseguire programmi utilizzando un moderno dialetto del Dartmouth BASIC del 1964 sul nostro tablet o sul nostro telefonino equipaggiati da sistema operativo Android.
Il dialetto, per chi abbia qualche reminiscenza del BASIC che usavamo appena sono comparsi i primi computer domestici, dal glorioso Commodore in poi, è subito utilizzabile: ci ritroveremo il simbolo $ con cui terminare il nome delle variabili stringa, ci ritroveremo il deprecato gosub, ecc.
Poi c’è tutto il resto, tipico del RFO-BASIC!: da quanto serve per programmare applicazioni grafiche, a quanto serve per lavorare con database sqlite, a quanto serve per utilizzare file multimediali, ecc.
All’indirizzo laughton.com/basic/help/De_Re_BASIC!.pdf possiamo trovare e scaricare il manuale del BASIC! in formato pdf, che si chiama De_Re_BASIC!.pdf e contiene tutti i segreti del linguaggio (de re è proprio latino e “de re Basic!” significa praticamente “tutto su BASIC!”).
Le applicazioni Android che costruiamo hanno un aspetto assolutamente professionale e sono contenute in un file con estensione .bas che, grazie alla app BASIC!, possono essere programmate e utilizzate sul nostro apparecchio (la app funge anche da interprete).
Ovviamente siamo in pieno mondo open source e software libero.

Ma non finisce qui.
Se andiamo all’indirizzo rfobasic.com, troviamo un prezioso tutorial scritto da Nick Antonaccio che ci porta per mano ad utilizzare il nostro BASIC!. Il documento si chiama “Learn RFO Basic – The Easiest Way To Create Android Apps”.
Da questo tutorial apprendiamo, con tutti i riferimenti del caso, che con il linguaggio RFO BASIC!, avendo installato Eclipse e le API Android sul PC, possiamo produrre le nostre app su file .apk: apk sta per Android Package e il file .apk è quello che serve per installare una app sul sistema Android, app che, così installata, funziona su Android anche senza che vi sia installato BASIC!. Come dire che, con l’ausilio di un PC attrezzato, possiamo “compilare” le nostre applicazioni programmate in BASIC!.

Sorpresa finale: scopriamo che un certo Nicolas Mougin ha sviluppato alcune utilità per BASIC!, che troviamo all’indirizzo mougino.free.fr/rfo-basic/, tra cui spicca RFO-BASIC! Quick APK (PC), attraverso la quale, partendo da un programma scritto in BASIC!, senza conoscere nulla di Java, di Android e di Eclipse, possiamo sfornare il file .apk: basta che sul PC sia installato, oltre a questo quick-apk.exe, il Java Runtime Environment (JRE).
Purtroppo il Mougin, pur appartenendo al mondo del software libero, deve essere amico di Bill Gates e ci propone solo una versione per Windows dei suoi software.
I linusiani stiano comunque sereni: quick-apk.exe funziona benissimo su Wine. Sullo stesso Wine deve però essere installato anche il Java Runtime Environment per Windows.

Esiste, infine, una versione di Quick APK, BASIC! Quick APK (WiFi), che possiamo scaricare da Google Play, grazie alla quale possiamo installare via WiFi dal PC dove abbiamo prodotto il file APK la nostra nuova applicazione. La quale è comunque installabile dove vogliamo con un collegamento USB (previa abilitazione del nostro sistema Android alle applicazioni di origini sconosciute).

E con questo esempio di produzione di software libero, da Laughton a Antonacci a Mougin e chissà a quanti altri ignoti, buon divertimento con BASIC!

Sarebbe anche bellissimo se ci fosse un volontario che traducesse tutta la documentazione su questa cosa, ora reperibile solo in inglese.

Una libreria Java per calcoli geometrici

Per certi calcoli geometrici è facile ricordare le formule e li possiamo eseguire facilmente a mano o con una semplice calcolatrice.
L’area del rettangolo la calcoliamo tutti, anche mentalmente.
La superficie totale di una piramide a base pentagonale noti gli apotemi della base e della piramide non la possiamo calcolare così facilmente.
Purtroppo se cerchiamo software per fare questi calcoli non è che ne troviamo molto.
Ho pensato allora di passare un po’ di tempo per costruire una libreria java in cui ho inserito quante più funzioni geometriche mi sono venute in mente.
La libreria è scaricabile da qui.
Una volta scaricato il file .zip lo si estrae e, cliccando sul file index.html nella directory javadoc, si vede tutta la descrizione della libreria.
Ovviamente, oltre alla libreria vera e propria, denominata Geometria.jar, è presente il source con cui è stata costruita.

Utilizzando questa libreria mi sono poi divertito a fare un programma java per calcoli geometrici.
Il source di questo programma si trova qui e l’eseguibile java si trova qui.

Da Python 2 a Python 3

Se qualcuno ha scaricato l’applicazione Python for Android che ho proposto nel mio precedente articolo “Python su Android” si sarà accorto che si tratta della versione 3 di Python. Questa versione è stata rilasciata fin dal 2008 e costituisce ormai il presente e il futuro del linguaggio Python. Ma il mondo è ancora pieno di versioni 2, in particolare dell’ultima rilasciata 2.7.9, che resiste alla messa in quiescenza in quanto i programmi scritti con la sintassi della versione 2 non sono compatibili con la versione 3 e questi programmi:
. o si continuano ad utilizzare con l’interprete di una delle versioni 2,
. o si buttano insieme al vecchio interprete di una delle versioni 2,
. o si adattano alla versione 3 e si butta il vecchio interprete di una delle versioni 2.
La cosa più saggia da fare è sicuramente l’ultima, in quanto le differenze tra le versioni 2 e 3 non sono poi così tante.
Per i volonterosi che vogliano provvedere ad aggiornare i propri programmi Python 2 a Python 3 le elenco nel file PDF allegato, scaricabile e stampabile.
Chi già conosce Python 2 e non conosce ancora Python 3 ha così anche la chiave per programmare, da qui in poi, in Python 3.

da_python2_a_python3

Python su Android

Su un tablet o su uno smartphone equipaggiati con Android è possibile lavorare con il linguaggio di programmazione Python; lavorare nel senso di avere a disposizione la shell di Python e di poter eseguire script Python archiviati sul dispositivo.
Mi si chiederà: per farci che cosa?
Nel mio caso, oltre che per eseguire programmi di calcolo di varia natura da me prodotti (calcoli finanziari, calcoli statistici, calendario perpetuo, ecc.), anche per poter accedere con facilità a database Sqlite (ricordo che Sqlite è integrato nel sistema Android) dove ho catalogato tutte le mie raccolte musicali e di biblioteca, con il vantaggio, tra i tanti, che, potendo controllare istantaneamente sullo smartphone le opere di un certo autore che già posseggo non corro il rischio di acquistare doppioni quando sono in giro per negozi.
Al di là di tutto ciò sta comunque la soddisfazione di poter creare qualche cosa che funzioni persino su un telefonino, divertendosi con quello splendido linguaggio di programmazione che è Python.

Per fare queste cose dobbiamo innanzi tutto procurarci l’applicazione sl4a (scripting layer for android) che è la piattaforma sulla quale possiamo far girare i nostri script. Si dice in giro che questa applicazione sia diventata incompatibile con Android a partire dalla versione 5.0 (Lollipop): non mi pare, visto che su un mio emulatore con Android 5.0.1 (API 21) funziona benissimo. L’ultima versione dell’applicazione, la sl4a_r6 si trova qui.
Dobbiamo poi procurarci l’applicazione Python for Android, che ci consente di installare l’interprete Python. L’ultima versione, Python3ForAndroid_r6 si trova qui.
Entriamo così in possesso dei file sl4a_r6.apk e Python3ForAndroid_r6.apk che dobbiamo installare, nell’ordine, sul nostro dispositivo. Per l’installazione di sl4a è necessario che il dispositivo sia corredato di una SDCard sulla quale verrà automaticamente creata una directory per ospitare gli script.
Con collegamento internet attivo lanciamo l’applicazione Python for Android e, dal menu che compare, scegliamo Installa: dopo qualche minuto di scaricamento, scompattamento e installazione avremo il nostro Python sul dispositivo e lanciando l’applicazione sl4a troveremo elencati gli script Python che si sono installati per dimostrazione ed ai quali potremo aggiungere tutti quelli che produrremo noi.
L’allegato file PDF, scaricabile e stampabile, costituisce un utile prontuario sul funzionamento dell’applicazione sl4a.

sl4a

La resurrezione del Pascal

Il 22 aprile 2015 è stata rilasciata la versione 1.4 di Lazarus.
Il progetto Lazarus è nato nel 1999 dalle ceneri di un precedente progetto di clonazione del compilatore Delphi che la Borland aveva messo sul mercato per l’utilizzo del linguaggio Pascal. E’ stato chiamato Lazarus appunto perché proviene dalla resurrezione di un progetto che era defunto.
Conosco precedenti versioni di Lazarus, che già considero perfette: chissà quest’ultima!
Ma il pregio maggiore del progetto sta nel mantenere di attualità e alla portata di tutti (siamo nel software libero) un ottimo linguaggio di programmazione come il Pascal, che Niklaus Wirth e Kathleen Jénsen crearono nel 1970 (due anni prima che Dennis Ritchie creasse il linguaggio C) a scopo didattico.
Wirth era infatti un insegnante di informatica e creò il Pascal per insegnare le basi della programmazione strutturata, forse senza accorgersi che così aveva creato anche qualche cosa che andava ben oltre gli scopi didattici: gran parte dei primi sistemi operativi per il Macintosh e per Microsoft Windows sono stati scritti in Pascal.
Per sapere tutto sul Pascal e su Lazarus basta andare su http://www.lazaruspascal.it/, dove si trova anche una serie di tutorial in italiano per imparare il Pascal.

Lazarus è attrezzato per produrre programmi a riga di comando e programmi dotati di ricca interfaccia grafica.
Essendo basato su Free Pascal, che deriva dal Turbo Pascal della Borland, Lazarus può anche utilizzare la unit Crt, che consente di creare programmi a riga di comando con qualche ingentilimento da formattazione e colori. Per certi programmi di utilità può andare benissimo, anzi, per quanto mi riguarda, può andare meglio di programmi con interfaccia grafica dispersiva e laboriosa da creare.
Per usare la unit Crt occorre aggiungerla in questo modo nella sezione uses della traccia di programma che Lazarus ci propone nel suo editor per un Progetto di Programma

uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, Crt
{ you can add units after this };

Funzioni e sintassi per utilizzare la unit Crt si trovano in http://www.freepascal.org/docs-html/rtl/crt/index-5.html.

Un esempio di programma di questo tipo è quello che si trova nei link qui sotto. Si tratta di un mio divertimento di calendario perpetuo in gran parte basato sulle Formule astronomiche per calcolatori di Jean Meeus.
Programma calendario:
source_pascal
eseguibile_linux (da rendere eseguibile dopo scaricamento con chmod 555)
eseguibile_windows

Buon divertimento con Pascal e Lazarus.

Lisp sempreverde

Il linguaggio Lisp è stato creato nel lontano 1959 da John McCarthy presso il Massachusetts Institute of Technology per i computer della serie IBM 700/7000 e per applicazioni di intelligenza artificiale.
E’ nato come linguaggio funzionale ed è il più antico linguaggio di questo tipo. Ma dal 1959 ad oggi è passato attraverso varie evoluzioni e sono stati creati numerosi suoi dialetti, al punto che le varie versioni che sono oggi disponibili non si possono catalogare come linguaggi funzionali puri.
Tra queste varie versioni, che vanno dal Common Lisp all’AutoLISP (utilizzato in AutoCAD), dallo Scheme all’Emacs Lisp, ne segnalo una che ritengo notevole per la semplicità di uso e per la ricchezza di funzioni preconfezionate che offre: newlisp.
Sul sito www.newlisp.org troviamo tutto ciò che lo riguarda: documentazione e possibilità di download. Il tutto all’insegna del software libero.
Creato nel 1991 per Windows fu convertito per Linux nel 1999 e, di rilascio in rilascio, si è sempre più arricchito: il 20 gennaio 2015 è stata rilasciata la versione 10.6.2, disponibile per Linux, Windows e OS X.
Lo ritengo un formidabile linguaggio di scripting per studenti e matematici.
Una volta che ci si è abituati all’uso delle numerose parentesi e alla notazione prefissa tipiche del Lisp diventa anche rapido e divertente.

Utili funzioni preconfezionate sono le seguenti.
Calcolo matriciale:
invert ritorna l’inversione di una matrice
det calcola il determinante di una matrice
multiply moltiplica due matrici
mat applica un operatore aritmetico a due matrici o a una matrice e a un numero
transpose ritorna la trasposta di una matrice
Calcoli statistici:
beta calcola la funzione beta
betai calcola la funzione beta incompleta
binomial calcola la funzione binomiale
corr calcola il coefficiente di correlazione di Pearson
crit-chi2 calcola il valore del Chi quadrato di Pearson per una data probabilità
crit-f calcola il valore critico minimo del test F di Snedecor per una data probabilità
crit-t calcola il valore critico minimo del test t di Student per un dato livello di confidenza
crit-z calcola il valore critico normale di un test Z di Fisher per una data probabilità cumulata
erf calcola la funzione di errore per un numero
gammai calcola la funzione gamma incompleta
gammaln calcola la logaritmica della funzione gamma
kmeans-query calcola la distanza euclidea tra un vettore e un centroide
kmeans-train applica la cluster analysis a una matrice
normal genera una lista di numeri casuali normalmente distribuiti data una media e uno scarto quadratico medio
prob-chi2 calcola la probabilità cumulata del test Chi quadrato di Pearson
prob-f calcola la probabilità di un valore riscontrato del test F di Snedecor
prob-t calcola la probabilità di un valore riscontrato del test T di Student
prob-z calcola la probabilità cumulata di un valore riscontrato del test Z di Fisher
stats calcola valori statistici (media, varianza, scarto quadratico medio, ecc.) di una serie di numeri
t-test utilizza il test t di Student per valutare la differenza tra medie
Calcoli finanziari:
fv calcola il valore futuro di un investimento
irr calcola il tasso di rendimento interno
nper calcola il numero di periodi per un investimento
npv calcola il valore attuale di un investimento
pmt calcola la rata costante per estinguere un prestito
pv calcola il valore attuale di una rendita
Ovviamente quelle che ho richiamato sono comprese nella lunghissima serie di funzioni che ci offre newlisp e le ho richiamate in quanto sono difficilmente presenti in altre versioni del linguaggio Lisp.
La lista completa e la sintassi richiesta per tutte le funzioni la troviamo in http://www.newlisp.org/downloads/manual_frame.html.

Altra cosa utile e sfiziosa che ci regala newlisp è la possibilità di creare ed eseguire programmi con interfaccia grafica (GUI), grazie all’aggiunta a newlisp, attorno al 2008, di un server per interfaccia grafica costituito dai file guiserver.jar (per far funzionare il quale occorre aver installato la macchina virtuale java sul computer) e dalla sua interfaccia guiserver.lsp.
La sintassi per programmare con GUI la troviamo all’indirizzo http://www.newlisp.org/guiserver-jp/.
Un piccolo esempio di programma con interfaccia grafica è scaricabile qui.
Un esempio un tantino meno banale lo troviamo invece qui: questo programma è utile per determinare i codici da inserire nella programmazione con GUI per creare i colori desiderati.
Ricordo a chi usa Linux che i file eventualmente scaricati vanno resi eseguibili per provarli.

Buon divertimento con newlisp.

Insidie nei programmi di calcolo

Nel mio articolo sul Software libero per calcolare ho accennato alla delicatezza del software di calcolo ed all’esistenza di alcune trappole annidate nei vari linguaggi di programmazione, con il pericolo che il programma che utilizziamo per fare un calcolo fornisca un risultato sbagliato senza che ce ne accorgiamo.
Al fine di mettere in guardia il programmatore dilettante che voglia cimentarsi nel costruire qualche strumento di calcolo a suo uso e consumo per calcolare, ad esempio, la temperatura percepita nota la temperatura e l’umidità relativa (o altre cose che non troviamo facilmente in programmi già predisposti), ho pensato di indicare in questo articolo quali sono le due principali fonti di complicazione: la questione del separatore decimale e quella della divisione tra interi.

Il separatore decimale

In tutti i linguaggi di programmazione il separatore decimale è il punto (.) ed è questo che deve essere rigorosamente usato nelle assegnazioni interne ai programmi.
Il problema si pone, specialmente per noi italiani abituati ad usare come separatore decimale la virgola, quando è richiesto un input numerico all’utente, in quanto egli, anche se avvisato sul separatore decimale da utilizzare, può sbagliare e ciò può avere, in certi casi, conseguenze disastrose sul risultato dell’elaborazione compiuta dal programma.
I linguaggi più sicuri da questo punto di vista sono Ada, Java, Pascal e Python in quanto in questi linguaggi è imposto un input con separatore decimale punto e, se l’utente usa la virgola, viene elevata una eccezione di input e non viene fornito alcun risultato. Attraverso una opportuna gestione di questa eccezione è possibile avvisare l’utente dell’errore ed invitarlo a formulare un input corretto: il tutto senza uscire dal programma. Se l’eccezione non viene gestita il programma termina senza risultato e il danno è circoscritto a questo.
I linguaggi più subdoli sono il C, il C++ e PHP in quanto impongono il punto ma, se l’utente usa la virgola, non sollevano eccezioni di input, ignorano ciò che viene immesso dopo la virgola e forniscono risultati sballati: il tutto senza che l’utente sappia alcunché, né sull’errore compiuto usando la virgola in luogo del punto né – il che è gravissimo – sul fatto che il risultato che gli è stato fornito dal programma è sbagliato. Unico rimedio a tutto ciò è un accurato controllo dell’input, carattere per carattere, in modo da rimediare alla falla del linguaggio con accorgimenti di programmazione che sollevino un’eccezione gestibile nel momento in cui nell’input venisse trovata una virgola. Eccezione gestibile fino a sostituire un punto alla virgola, nel caso la si trovasse, senza dire nulla all’utente, ed arrivare comunque ad un risultato corretto: in questo modo possiamo avere un programma per il quale va bene l’uso di entrambi i separatori decimali, punto e virgola.
Vi sono, infine, i linguaggi del gruppo Visual Studio di Microsoft, dove i problemi non mancano, anzi…..
Visual C++ di Visual Studio si comporta esattamente come il normale C++.
Visual C# di Visual Studio ha la particolarità che, quando viene caricato su un computer, si adegua alla cultura dell’utente: se il sistema operativo installato è una versione italiana, anche Visual C# sarà italiano. Tra le caratteristiche di questa cultura c’è il fatto che l’utente usa come separatore decimale la virgola e C# si adegua: al suo interno usa rigorosamente il punto come separatore decimale ma quando legge un input dell’utente italiano si aspetta di trovare, come separatore decimale, la virgola. Se l’utente usa il punto, questo viene semplicemente ignorato e il numero viene letto come un intero composto da tutte le cifre immesse, sia quelle prima che quelle dopo il punto e l’elaborazione prosegue con questo numero, con tutte le disastrose conseguenze del caso.
Visual Basic, sia nella vecchia versione, sia in quella più aggiornata, è il massimo della confusione. Anch’esso, al momento dell’installazione, si adegua alla cultura dell’utente ma lo fa parzialmente: mentre, infatti, la funzione Cdbl() per convertire in numero la stringa immessa dall’utente si adegua alla cultura di questi e, se egli usa un sistema operativo in italiano, si aspetta di trovare la virgola come separatore decimale e, se trova il punto, fa avvenire esattamente quello che avviene in C#, la funzione Val(), utilizzabile per lo stesso scopo, si aspetta di trovare comunque il punto come separatore decimale e, se trova una virgola, non legge oltre ed incamera un numero intero composto dalle sole cifre immesse dall’utente prima della virgola e prosegue così il suo percorso di elaborazione. Visual Basic, pertanto, non è solo subdolo ma è anche ambiguo.
Fortunatamente le versioni di Visual C# e di Visual Basic delle più recenti edizioni di Visual Studio hanno la funzione membro Replace() dell’oggetto stringa che, con poca spesa, ci aiuta a correggere l’input in modo da poter accettare invariabilmente sia il punto che la virgola dall’utente (sempre, in Visual Basic, stando attenti alla correzione da apportare in coerenza a che cosa si usa per convertire la stringa).

Divisione tra interi

L’uso dell’operatore / tra due numeri fornisce come risultato il quoziente di una divisione.
Questo risultato è il quoziente vero, qualunque sia il tipo di numero indicato prima e dopo l’operatore /, solo nei linguaggi Pascal, Python 3 e Visual Basic (sia nella vecchia che nella nuova versione). Per quoziente vero si intende il 2,5 che risulta da 5 / 2.
Nei linguaggi C, C++ e C# se i numeri indicati prima e dopo l’operatore / sono interi si ha una divisione tra interi che fornisce come risultato la parte intera del quoziente. Cioè 5 / 2 fornisce il risultato 2. Purtroppo ciò avviene anche quando la variabile cui assegnare il risultato sia stata dichiarata come double, senza che vi sia alcuna segnalazione di errore. Per ottenere il quoziente vero occorre che almeno uno dei due numeri inseriti prima e dopo l’operatore / sia un double (basta scrivere 5.0 anziché 5).
In Java questo inconveniente si presenta soltanto se l’espressione di divisione è inserita in una istruzione di stampa, senza passare attraverso l’assegnazione a variabili. L’istruzione System.out.println(5/2) stampa 2 e, per ottenere la stampa del risultato corretto occorre scrivere System.out.println(5/2.0) o System.out.println(5.0/2). Non è invece possibile, per sollevamento di eccezione nella compilazione, assegnare il risultato di 5/2 ad una variabile dichiarata double, il che, almeno in parte, attutisce i pericoli che Java ha ereditato dal C.
Allo stesso modo di Java si comporta Ada con la sola eccezione che la divisione inserita in una istruzione di stampa, perchè dia il risultato corretto deve avere sia prima che dopo l’operatore / un float. Cioè non basta dire Put(5.0/2) o Put(5/2.0) ma occorre dire Put(5.0/2.0): in caso contrario viene segnalato errore nella compilazione.
Python 2 è nella stessa situazione di Java se l’input è acquistito con la funzione raw_input(), in quanto tutto si sistema se con la conversione della stringa acquisita si memorizza il valore in una variabile float. Se l’input è acquisito con la funzione input(), dal momento che questa, in Python 2, ritorna un valore numerico, occorre che almeno uno dei due numeri sia scritto come float dalla tastiera.