Feeds:
Posts
Comments

Posts Tagged ‘Erlang’

Erlang

Una breve nota: data la necessità (o meglio, il desiderio) per la demo della mia tesi di provare anche su Ubuntu Erlang R14, ovvero l’ultima release stabile che già uso su Debian testing, e dato che Maverick (e forse anche Narwhal) continua a proporre la versione 13, ho deciso di rendermi autonomo.

Nel mio PPA potete trovare i pacchetti della release R14A (risalente a giugno), in un backport diretto (vale a dire as is) dei pacchetti presenti in Squeeze; ho tentato l’installazione, e la mia demo funziona egregiamente, ma non ho testato null’altro, compresi i vari Wings3D ed altri programmi Erlang presenti nei repository; in sostanza, i miei pacchetti potrebbero non essere utili per voi e/o fare danni ai vostri sistemi, io non mi prendo alcuna responsabilità in merito.

Usateli perciò con attenzione, e soprattutto non provateli direttamente in produzione; se avete qualche osservazione o rilevate qualche problema, fatemi pure un fischio, tenendo presente che a) non sono il manutentore ufficiale e b) potrei non avere idea di come risolvere i vostri problemi 😀

Read Full Post »

Finalmente, dopo alcuni mesi in cui sono entrato nel magico mondo dei linguaggi funzionali, prima con il corso di sistemi distribuiti e poi con la tesi, inizio ad entrare nella mentalità come si deve, e devo ammettere che le soddisfazioni non si fanno attendere!

Dopo aver infatti passato i primi tempi a riscrivere le funzioni di base (per la gestione di liste e dizionari), ora uso le librerie più adatte, e la produttività ne risente: lunedì mattina ho rifatto un modulo come server, utilizzando i behaviour di Erlang (una sorta di design pattern), così da sfruttare i sistemi di gestione dei crash (e degli aggiornamenti automatici, ma su quelli non sono ancora entrato nel merito), e le soddisfazioni sono state decisamente alte.

Insomma, consiglio a tutti quelli che non hanno mai provato, di studiarsi un po’ (magari a tempo perso) questo paradigma, parecchio diverso dal solito ma altrettanto interessante e curioso (to say the least); d’altronde, perfino Stroustrup consiglia di provare cose diverse!

Peraltro, il mese prossimo parte un corso breve sui linguaggi funzionali: prima la pratica e poi le basi teoriche…

Read Full Post »

Ho finalmente iniziato a programmare un po’ in Erlang, in vista di quando dovrò iniziare a scrivere codice seriamente per la tesi (di cui parlerò più avanti, ora siamo parecchio agli inizi), ed oggi ho fatto un test estremamente semplice per giocare un po’ con il codice mobile.

Premesso infatti che Erlang favorisce il codice distribuito e la comunicazione tra nodi e processi remoti, mi sono chiesto se era possibile far muovere non solo dati (quindi variabili, anche se forse il termine variabile in questo contesto non è del tutto adatto, dato che sono immutabili), ma anche codice vero e proprio, in particolare funzioni e closure. E la risposta, naturalmente (e sorprendentemente), è stata: sì.

Modulo

Modulo

Il modulo qui sopra, dal comportamento piuttosto scontato, esporta un’unica funzione che riceve due parametri: una funzione (o meglio, una funF ed un valore Value, e non fa altro che invocare la prima passando il secondo; se F non è una funzione, il programma va democraticamente in crash, altrimenti ritorna il risultato di F (Erlang non richiede alcuna parola chiave return).

Questo modulo, debitamente compilato, è stato copiato in due computer diversi, che ho chiamato big e little, principalmente perchè il primo è il notebook ed il secondo è il netbook 🙂

Nodo big

Nodo big

Questa è la console del notebook: assegnato un nome di rete completo al nodo ed un cookie (e segato il firewall, forse ho sbagliato ad aprire la porta giusta per far comunicare Erlang), ho lanciato l’interprete e l’ho lasciato lì: il codice visto sopra non ha bisogno, infatti di essere in alcun modo avviato (ho anche creato una versione server, lievemente più complessa, ma il risultato è lo stesso anche con 2 righe 2 di codice), basta assicurarsi che l’interprete sappia dove trovare il file compilato, se ne avrà bisogno (ovvero se mai qualcuno dovesse richiedere una delle sue funzioni): nel caso più semplice basta lanciare l’interprete erl dalla cartella dove si trova tale file.

Nodo little

Nodo little

E qui, sul nodo little, avviene il bello: anche qui è necessario assegnare un nome di rete e lo stesso cookie di cui sopra (e lanciare l’interprete sempre dalla directory contente il file compilato, debitamente copiato dal primo nodo); a questo punto, ho dichiarato una funzione Double, che altro non fa che ricavare il quadrato del parametro, lanciarla in locale e successivamente in remoto, tramite la chiamata ad rpc:call(). Ed ha funzionato!

Cos’è successo

In pratica, nel secondo nodo è stata creata una fun, ovvero una funzione anonima assegnata ad una variabile; essendo la funzione appunto anonima, il suo codice non era a priori conosciuto dal primo nodo, dato che la sua implementazione (X*X) non era situata nel modulo presentato più sopra (che costituiva l’unico listato comune ai due nodi), bensì salvata in qualche modo direttamente nella variabile Double.

Quando tale variabile è stata inviata al nodo remoto, essa ha portato con sè tale implementazione, così che il nodo remoto è stato in grado di eseguirla e restituire al chiamante il risultato (4). Spettacolare!

Read Full Post »

« Newer Posts