martedì 1 febbraio 2011

Template Metaprogramming: un approccio filosofico


Alan Turing è un personaggio affascinante: uomo geniale e sensibile la cui morte è contornata di mistero e leggenda. Negli anni 30 fonda i principi dell'informatica teorizzando il primo computer, negli anni quaranta lavora alacremente per decifrare "Enigma" la macchina che decriptò gli ordini inviati ai sommergibili tedeschi. Qualcuno paragona il suo successo all'impresa dei piloti della RAF durante la battaglia d'Inghilterra. Negl'anni cinquanta si occupa di intelligenza artificiale e propone il test di Turing per definire una macchina intelligente (guadare Blade Runner per maggiori informazioni).

Condannato per omossessualità, morirà suicida pochi anni dopo morsicando una mela intinta nel cianuro. Turing getta anche i fondamenti della matematica computazionale, cioè definisce cos'è computabile (calcolabile), ma va oltre, dimostra che un linguaggio di programmazione può risolvere qualunque problema computabile se supporta un certo numero di funzionalità. Per esempio le quattro operazioni, if-else, switch e poco altro. Quando un linguaggio rispetta tutte queste richieste (poche per la verità) si dice turing-completo.

I linguaggi di programmazione si sono evoluti molto in fretta ed hanno cominciato a aumentare il loro livello d'astrazione. Un computer non lascia niente al caso, tutto è deterministico, insomma è come un pedante ragioniere, il tipo di linguaggio che comprende è una lunga striscia di 0 e 1. Il programmatore, per quanto giudicato quadrato da artisti e letterati, gradisce un linguaggio più colloquiale, maggiormente espressivo.

Per questa ragione sono nati i compilatori, sono dei programmi che prendono un listato leggibile da umani un po' speciali e lo traduce in linguaggio capibile dalle macchine. Questa operazione si chiama "compilazione" ed avviene prima (e una volta sola) che il programma venga usato.

Verso la metà degl'anni novanta un linguaggio di programmazione molto noto (C++) viene arricchito con una nuova funzionalità di alto livello: i template. In sostanza si permette al programmatore di scrivere un programma generico che non dipende dai dati che sta trattando. Solo il cuore del programma è importante e non più il tipo di dato (intero, numero reale o variabile booleana). Il compito di sistemare le cose viene lasciato al compilatore che genererà del codice (di alto livello) che verrà poi ulteriormente trasformato in linguaggio macchina.

Quindi si è passati da una situazione: 
codice di alto livello (scritto da umani) => linguaggio macchina  

a:
codice generico (scritto da umani) => codice di alto livello (scritto dal compilatore) => linguaggio macchina

Il fatto che una macchina scriva del codice di alto livello è di per se un fatto interessante.

Ma lo è ancora di più se il linguaggio intermedio è anch'esso turing-completo. Poco dopo l'introduzione dei template in C++ un programmatore ha scritto un programma che falliva la compilazione (e quindi non creava nessun programma), ma che riportava nel messaggio d'errore la sequenza dei primi 10 numeri primi! Un nuovo linguaggio è apparso dal nulla, si posso scrivere programmi che si eseguono durante la compilazione.

Badate, non era intenzione di chi ha introdotto la funzionalità nel linguaggio ottere questo risultato; è semplicemente capitato. Alcuni linguaggi di programmazione sono diventati così complessi che contengono a loro volta altri linguaggi di livello inferiore. 

Tutto è successo per caso! Turing ne sarebbe felice, forse.

5 commenti:

Unknown ha detto...

...mmmm...

Anonimo ha detto...

se teniamo conto che :
l'evoluzione celebrale umana dagli anni 40 a oggi è calata del 23%
in proporzione alla crescita oscillatoria della fissiva astrofisica ,considerando che 1 e 0
come 0 e 1 detratta la frazione logica dire che ...importa sega!

Marcello Novelli ha detto...

Interessante, ma lascia aperta una domanda: perche'? Perche' ci hai detto questo, hai fatto dell'accademia o c'e' uno scopo preciso?

La scoperta piu' interessante di Turing, un vero genio, e' la macchina che porta il suo nome, niente di palpabile, poco piu' di un disegnino su un foglio, ma di fatto equivalente al piu' potente computer del mondo.

Questo significa che non c'e' niente di veramente nuovo nell'informatica (o computer science per dirla all'inglese), (e ovviamente la giusta quantita' di connessioni in rame) con un mucchio di AND, OR e NOT si puo' fare il computer piu' potente del mondo (come capacita' elabotativa non certo dal punto di vista delle performance).

Anche i linguaggi di programmazione sono tutti un po' la stessa cosa, alla fine devono essere tradotti nella lingua del processore e allora posso aiutare a semplificare o a fare le cose in modo diverso, ma se devi parlare con un bambino puoi studiarti tutti i libri di pedagogia che vuoi, alla fine li dovrai sempre tradurre in parole e gesti comprensibili da lui.

Alessandro Teruzzi ha detto...

Ho proposto l'argomento perche' trovo interessante la casualita' della scoperta. Un sistema creato dall'uomo in maniera artificiale e per uno scopo completamente diverso ne contiene uno di ordine inferiore (il prefisso meta si riferisce ad un altra cosa).

Il fatto che una sintassi ne contenga un'altra completa e che agisce su un'altra scala di tempo (durante la compilazione invece che durante il funzionamento) e' affascinante.

Per Marcello: Questo video parla di come il software non sia poi cambiato molto: http://en.oreilly.com/rails2010/public/schedule/detail/14134

Pietro ha detto...

post interessante e visionario direi...laddove questa "creazione" su scala inferiore ma comunque creazione "indipendente dalla volontà dell'uomo" continuasse nella sua causalità (o con trend modellabile matematicamente)...mi immagino linguaggi creati da reti di pc e macchine dotate di pc che comunicano tra di loro in "background" a nostra insaputa sfruttando i milioni di terabyte dei server mondiali e....due scenari:

il prologo di terminator

oppure

le macchine aiuteranno l'uomo (a sua insaputa) a risolvere i problemi che da solo non è in grado di fare controllando l'economia, etc a nostra insaputa migliorando le condizioni di vita a livello globale e per l'ambiente (in quanto machine non dovrebbero avere istinto di spravvivenvza...no? ok blade runner e Asimov ci danno sensazioni diverse...)

...e cosa succederà quando un linguaggio inventato da una macchina ad insaputa dell'uomo "creerà" un sub-linguagio casuale ma coerente? :-D

grazie per questo post e per averci introdotto al simpatico docente svendese Hans Rosling (hai visto il video del 2007?)