sabato 18 luglio 2015

The most powerfull programming language

Paul Graham, in un post del 2001 che ho riletto recentemente, parla di potenza dei linguaggi di programmazione.
Beating the Average è il titolo del post e l'intero articolo, pur a distanza di anni e pur con i necessari distinguo, è tutt'ora molto interessante ed istruttivo
Vi invito quindi a leggerlo, con un occhio in particolare al "Blub Paradox"

Mi ha divertito e fatto riflettere in particolare una piccola nota finale, che riporto:

All languages are equally powerful in the sense of being Turing equivalent, but that's not the sense of the word programmers care about. (No one wants to program a Turing machine.) The kind of power programmers care about may not be formally definable, but one way to explain it would be to say that it refers to features you could only get in the less powerful language by writing an interpreter for the more powerful language in it. If language A has an operator for removing spaces from strings and language B doesn't, that probably doesn't make A more powerful, because you can probably write a subroutine to do it in B. But if A supports, say, recursion, and B doesn't, that's not likely to be something you can fix by writing library functions.

Beh, mi sembra un criterio interessante ed efficace per misurare la "potenza" di un linguaggio

... ovviamente c'è un prior art: la "Greenspun Tenth Rule"

Che conferma, se ancora ce ne fosse bisogno, che l'intero post è fortemente lisp-biased :-)

Mi propongo (e, se volete, propongo anche a voi) un piccolo "esercizio".
Nel mio linguaggio preferito quali sono le funzionalità per cui è necessario, o sarebbe necessario, un piccolo sotto interprete?

Il primo caso che viene in mente sono i template in C++.
Questa apparentemente piccola funzionalità ha introdotto un intera nuova branca di programmazione in C++: il template metaprogramming.
E questo ha radicalmente cambiato la storia e l'evoluzione del C++.

Per inciso, l'interprete dei template in C++ implementa sostanzialmente un linguaggio funzionale.
Infatti per capirne bene la logica ed entrare nella mentalità consigliano di partire studiando Haskell.
... beh, non siamo finiti poi tanto lontano dalla "decima regola", giusto? ;-)

venerdì 3 luglio 2015

Virtuosismo ed elementarità

Nel loro sorprendente libro “The 5 Elements of Effective Thinking”  gli autori Burger e Starbird raccontano di quando osservarono Tony Plog, un virtuoso della tromba di fama internazione, condurre una classe di eccellenza per trombettisti. Gli studenti suonavano inizialmente frasi musicali molto complesse, le quali venivano eseguite perfettamente. Ma successivamente agli studenti venne chiesto di suonare note molto semplici e di base.
Quando eseguivano tali note, queste sembravano infantili rispetto alla complessità delle frasi musicali eseguite in precedenza.
Una volta che gli studenti finirono di suonare, l'insegnante suonò le stesse identiche note, ma quando le suonò lui, le note sembravano tutt'altro che infantili.
La differenza era impressionante.
Tony spiego che padroneggiare l'esecuzione di semplici note permette al musicista di suonare pezzi complessi con un maggiore controllo dell'esecuzione.
La lezione era chiara - per costruire il vero virtuosismo uno deve focalizzarsi sul dominare semplici idee elementari.
Mi pare che tutto questo non valga solo per la musica...