La definizione di “programma” su Wikipedia Italiana è la seguente:
programma (dal lat. tardo programma -mătis, gr. πρόγραμμα -ματος, der. di προγράϕω, propr. «scrivere prima») è la definizione del percorso per raggiungere un determinato obiettivo tenendo conto delle risorse disponibili, delle condizioni al contorno, delle attività da intraprendere e dei tempi necessari per realizzarle.
Bello, no? C’è dentro il progetto, l’anticipazione, la scrittura. Manca l’aspetto pubblico, l’impegno, ma insomma mi sembra molto pregnante e dice tutto quello che è essenziale. Inoltre prende in considerazione le risorse e in generali i limiti (non esplicitamente, ma anche il tempo). Ma attenzione: qui non si parla di “programmi per computer”. Una didascalia avverte gli interessati e li consiglia di andare altrove.
Infatti la definizione di Programma_(informatica) è:
Un programma per computer, o semplicemente programma, in informatica, è un software che può essere eseguito da un elaboratore per ricevere in input determinati dati di un problema automatizzabile e restituirne in output le (eventuali) soluzioni. […] Il problema deve essere risolvibile attraverso un algoritmo, affinché un programmatore possa codificarlo in istruzioni per il più adeguato linguaggio di programmazione.
In questa definizione saltano agli occhi (a me, si capisce) due o tre cose:
- programma viene definito mediante “software”. Che è un termine che a volte sembra un sinonimo, altre un super-insieme di programma (comprende anche i dati), e in ogni caso non aiuta molto a capire
- si inseriscono alcuni altri elementi chiave che vanno precisati: un input, un problema “automatizzabile” (?), un output e delle soluzioni.
- “Automatizzabile” viene definito in qualche modo dalla frase seguente: un problema è automatizzabile se esiste un algoritmo che lo risolve.
- L’algoritmo viene codificato nel “più adeguato” linguaggi di programmazione.
Mmmh… se ho un input e un output, ma non un problema, allora non ho un programma? Un programma che non termina (un loop infinito) non è un programma? I programmi producono solo soluzioni? E i programmi sbagliati, che non risolvono nulla, non sono programmi? E che dire dell’adeguatezza dei linguaggi di programmazione? Come si misura e da che dipende? Se codifico un algoritmo in un linguaggio non adatto non sto scrivendo un programma?
Vado a curiosare nella versione inglese e trovo invece:
A computer program is a collection of instructions that performs a specific task when executed by a computer.
Più semplice. Qui non ci sono né algoritmi, né problemi, solo un insieme di istruzioni che, se eseguite da un computer, porterebbero all’esecuzione di un compito.
Anche a prescindere da Wikipedia, che in questo caso non è di grande aiuto, la definizione che si trova più spesso (per esempio nei manuali o nelle slide dei corsi introduttivi di programmazione) è comunque composta di quattro parti:
Un programma è:
1. la rappresentazione
2. in qualche linguaggio di programmazione
3. di un algoritmo
4. che risolve un problema
Definizione che comporta, secondo me, più problemi (scusate il gioco di parole) di quelli che risolve.
Intanto c’è l’algoritmo: è una cosa? Esiste in natura? È un oggetto mentale?
O è un oggetto linguistico, a sua volta una rappresentazione di qualcosa? Esistono dei linguaggi per rappresentare algoritmi (i diagrammi di flusso sono uno di questi); significa che l’algoritmo consiste in una serie di operazioni, che si può (la serie) rappresentare, memorizzare, comunicare con uno o più linguaggi alternativi?
La pagina di WP che parla di algoritmi ammette che non esiste una definizione formale di algoritmo. Tuttavia introduce un’idea intuitiva di algoritmo:
“una sequenza ordinata e finita di passi (operazioni o istruzioni) elementari che conduce a un ben determinato risultato in un tempo finito“.
Chiaramente sorge la domanda: solo una sequenza? No, immagino anche un ciclo o una scelta.
Il programma sarebbe allora la codifica di una rappresentazione, cioè una traduzione da un linguaggio (più generale) ad un altro (più specifico e leggibile/eseguibile da un computer). L’unica differenza tra algoritmo e programma è che il secondo è eseguibile da un computer, il primo da un umano (anche se evidentemente gli umani possono leggere i programmi). Ma posso immaginare un programma che legge un algoritmo (comunque scritto, anche in Italiano) e lo esegue? Si, direi di si. Questo fa di ogni algoritmo un programma almeno possibile? Allora la distinzione non è chiarissima.
Oppure tutto dipende dal linguaggio: un algoritmo scritto in un linguaggio di programmazione si chiama programma. Non è una grande definizione, se i linguaggi di programmazione sono quei linguaggi che permettono di scrivere algoritmi in modo che siano eseguibili da un computer.
Poi i programmi avrebbero a che fare solo con problemi. Ma che cos’è un problema? L’etimologia ci aiuta poco (problema, letteralmente, significa ostacolo).
Se restringiamo il significato ad un dominio astratto come quello matematico, tipicamente un problema si presenta nella forma di una serie di dati, una serie di relazioni tra i dati e nella richiesta di produrre altri dati (la soluzione), oppure nella dimostrazione che tale soluzione non esiste. Soluzione che deve essere analiticamente contenuta, direbbe Kant, nel problema stesso, cioè non deve richiedere l’aggiunta di nuove informazioni. La soluzione è lì, solo che io non la so. Almeno, questi sono i problemi matematici scolastici.
Se estendiamo il dominio nella direzione del concreto e parliamo di problemi fisici, o chimici, spesso si tratta di determinare lo stato di un sistema nel futuro partendo dalle informazioni sullo stato presente. Qui la soluzione è ricavata dai dati, ma è qualcosa del tutto nuovo. Per arrivare ai problemi insoluti della fisica la cui soluzione può essere un’intera nuova teoria.
Se arriviamo fino alla vita reale, un problema è una situazione incerta che vogliamo determinare meglio. Qui “problema” è inteso in un senso talmente generale da comprendere ogni situazione in cui qualcuno voglia fare qualcosa che non si presenti come immediatamente raggiungibile senza qualche scelta. “Ho un problema” nel senso di “ho un obiettivo da raggiungere e mi domando come fare”. Non c’è una situazione (oggettiva) con un buco, ma sono io che mi propongo di cambiare la situazione, e per farlo devo effettuare delle operazioni, fisiche o mentali.
A quale di questi problemi si fa riferimento quando si dice che “un programma risolve un problema”? A volte – nelle definizioni – sembra che si abbia in mente solo il primo tipo: dati in ingresso, dati in uscita, regole note.
L’informatica nasce come simulazione delle situazioni della vita, per fare meglio e prima cose che si facevano altrimenti. Lo fa trattando in maniera automatica le informazioni che rappresentano alcuni aspetti della situazione che ci sembrano più significativi. In questo senso, l’informatica nasce per risolvere i problemi della vita, non solo quelli matematici. Creare una rappresentazione trattabile di una situazione in modo da poter usare un computer per simularla e anticiparne il comportamento è uno dei task più difficili.
Ma con l’informatica, da tempo, si fanno anche altre cose. Si creano delle situazioni che non sono più simulazioni di altro. Si producono nuovi oggetti, alcuni utili, altri meno. Qui la nozione di problema sembra chiaramente fuori posto. Che problema risolve Facebook? E viceversa, se un programma fa una cosa diversa da risolvere un problema (per esempio, raggiunge semplicemente un obiettivo, esegue un task o produce un risultato inaspettato) non è un programma? Un programma che disegna ricorsivamente un cristallo? O che produce haiku casuali?
Definire meglio “programma” sarebbe un primo passo, ma insegnare a programmare partendo da una visione più ampia sarebbe ancora meglio.
Commenti
Una risposta a “Programmi e problemi”
[…] per parlarne da un certo punto di vista (quello della correttezza, dell’efficienza). In un articolo di qualche tempo fa mi interrogavo sul senso di questa visione platonica, che è talmente presente […]