Riprendo alcune informazioni diffuse attraverso i talk del PDC2008 che la Microsoft ha furbescamente distribuito gratuitamente al popolo di internet. Ho trovato molto interessanti quelli relativi alla programmazione dinamica in C#4 (che debutterà ufficialmente nel 2010 ma che è disponibile in CTP - come immagine Virtual PC - già adesso) ma sono rimasto deluso per non aver trovato (almeno, io non l’ho ancora trovato) il giusto approfondimento sui costrutti per la programmazione parallela.
Per quelli che avessero difficoltà a seguirmi riepilogo brevemente gli argomenti di cui sto parlando:
- Programmazione dinamica: si tratta di un costrutto con cui possiamo dichiarare una variabile di tipo dynamic: fatto questo possiamo chiamare metodi e attributi di questa variabile anche se a compile-time questi non erano presenti;
- Programmazione parallela: il nuovo C# introdurrà dei costrutti per semplificare la scrittura di algoritmi paralleli.
Sulla programmazione dinamica, nel talk di Jim Hugunin (TL10) ed in quello del mitico Anders Hejlsberg (TL16), si è fatto la dovuta distinzione che un oggetto dynamic non è un object ma una variabile su cui si possono effettuare chiamate di tipo dinamico su cui, cioè, il compilatore non effettuerà controlli sull’esistenza di metodi e attributi. Il tutto può essere utile laddove vogliamo avere la massima flessibilità nel funzionamento delle nostre classi: metodi ed attributi possono essere creati e chiamati dinamicamente in funzione di input esterni al software ed adattarsi in funzione di queste esigenze.
Per far questo possiamo utilizzare diverse strade. La più semplice è quella di poter accedere a variabili dinamiche richiamando i loro metodi senza passare dai metodi Invoke (che voi che smanazzate con la reflection conoscete a memoria).
La seconda è quella di crearsi una classe derivata da IDynamicObject che consente l’aggiunta di metodi ed attributi a run-time. Il tutto viene ottenuto sovrascrivendo i metodi GetMember, SetMember ed InvokeMember:
- GetMember: indicherà cosa fare quando richiediamo un membro di una classe (che ovviamente potrebbe non esistere);
- SetMember: indicherà cosa fare quando aggiungiamo un membro ad una classe;
- InvokeMember: indicherà cosa fare quando richiamiamo un membro con un certo set di parametri.
Quindi, in realtà il dinamismo visto nelle presentazioni, è leggermente meno flessibile di quello visto in Python o in Ruby in cui, qualsiasi object è anche dynamic. Qui si è fatto il tentativo di portare il dinamismo all’interno di un linguaggio essenzialmente statico senza stravolgerne l’architettura. In realtà anche così il sistema offre le stesse potenzialità all’utente ma, soprattutto, consente una migliore integrazione con IronPython ed IronRuby che, a partire da questo PDC diventano fratelli di latte con C#, Visual Basic e C++. Ora classi python, ruby e .net vengono eseguite nello stesso spazio e, quindi, accedono le une alle altre senza alcun limite.
Supponiamo di avere il seguente file Calculator.py
def GetCalculator():
return Calculator()
class Calculator(object):
def Add(self,x,y)
return x+y
ed ora scriviamo il nostro codice C#:
using System;
using IronPython.Hosting;
class Program
{
static void Main(string[] args)
{
dynamic python = Python.CreateRuntime().UseFile("Calculator.py");
dynamic calc = python.GetCalculator();
calc.Add(100,5);
}
}
L’esempio ci fa capire che l’embedding ora avviene in modo molto semplice rispetto a prima ed il suo utilizzo risultà molto più intuitivo ed efficace.
Il sistema di chiamate dinamiche consentirà inoltre di avere un dialogo più immediato con i Web Service (un pò come vedemmo in Groovy tempo fa): avendo una variabile di tipo dynamic che punta all’istanza di un web service, potremo chiamare un suo metodo senza costrutti strani ma semplicemente considerando la variabile come istanza di un oggetto che quei metodi ce li ha già.
Vedremo cosa sapremo tirar fuori da C# con queste nuove possibilità.
Zac




