Il buco computazionale
1 Il buco computazionale
Quando parlo male di Scratch, pare che io affermi se cito da altre parti la completezza di Turing che Scratch non sia Turing-completo.
<< Perchè Scratch non è Turing-completo? >>
<< Non supporta le funzioni ma solo le procedure >>
<< Non servono per essere Turing-completi >>
<< È vero >>
Sfatiamo un mito, Scratch è Turing-completo per vari motivi:
- È affermato sul wiki di Scratch, ma questo non è che lo farebbe completo in sé e per sé.
- Scratch supporta:
- le condizioni
- i loop
- le operazioni aritmetiche fondamentali
- è in grado di leggere e scrivere un arbitrario numero di variabili
- Viste le caratteristiche dette sopra lo è o dovrebbe in linea teorica e chiusa la questione.
Essere Turing-completi significa semplicemente avere un minimo bagaglio di istruzioni tale da poter simulare una macchina di Turing, in pratica un oggetto che scorre su un nastro infinito dove può andare in avanti ed indietro leggendo e scrivendo dati e prendendo decisioni. Non si prende in considerazione il tempo per esempio e quindi che ci si metta un secondo o cento anni non importa. I computer moderni sono delle approssimazioni avendo memoria finita, ma è il concetto che conta e si parla di equivalenza: quando un oggetto A è in grado di simulare un oggetto B e viceversa. Dati questi presupposti molte cose anche impensabili possono essere Turing-complete.
Quello che critico a Scratch sono la mancanza di alcune strutture fondamentali (almeno oggi) della programmazione e dell'inevitabile forma mentale che ne deriva. Mancano per esempio (come detto sopra) le funzioni e questo è per me, il grande buco computazionale. Scratch ha invero le procedure, la possibilità di costruire blocchi di operazioni parametrizzate che non restituiscono valori. In questo caso non si può parlare di ricorsione nel senso più ampio: applicare ad una funzione il risultato della sua stessa computazione. Si può simulare il meccanismo mediante variabili globali (quindi applicando cambiamenti di stato globali) con tutti i problemi sia pratici che concettuali che esse portano. Una variabile globale è accessibile da tutti i blocchi di codice che alterandone lo stato potrebbero introdurre difetti difficili da identificare. In un ambiente ad eventi (broadcasting) asincroni come Scratch il problema potrebbe essere ancora più profondo.
Il fatto di essere Turing-completo non ha niente a che fare con questo, molti linguaggi esoterici sono completi ma non per questo li si usano per insegnare ai ragazzi.
Scratch è un buon ambiente per iniziare con i più piccoli e nessuno gli potrà togliere il merito, è nel seguito che lascia qualche perplessità. Ad ogni modo persiste sempre il dubbio, ma se c'è disponibile un ambiente del tutto simile ma che possiede quello che oggi deve possedere un linguaggio di programmazione perché insistere? Snap! come detto e ridetto ha tutto quello che si può desiderare da un ambiente visuale a blocchi e se si vuole fare del 3D, Beetle Blocks.
L'unico motivo per continuare con Scratch a questo punto deve essere solo la community ed il remix dei progetti nella galleria.
Una volta il remix si chiamava copia/incolla, certo che però remix è più fico e soprattutto ti fa sentire meno in colpa.