Cω, da pronunciarsi Comega poichè ω è appunto la lettera greca omega, è un linguaggio di programmazione di ricerca su cui sta lavorando Microsoft Research e probabilmente si tratta di uno dei più interessanti tra quelli nati intorno al CLR (per la precisione si sta parlando del CLR 1.0) per le sue caratteristiche. Lo scopo di questo articolo, di carattere prettamente introduttivo, è quello di poter dare rapidamente un'idea generale dell'essenza di Cω in modo da poter poi far seguire nuovi articoli di approfondimento su ognuno degli aspetti chiave di questo linguaggio.
Per prima cosa occorre precisare che in realtà non si tratta di un nuovo linguaggio in senso stretto, sarebbe più corretto definirlo un'estensione di C# poichè caratteristiche e sintassi sono comuni ma trovano spazio nuove feature introdotte con il preciso scopo di ottenere una forte integrazione dell'accesso ai dati unendo tra loro tre modelli differenti (relazionale, semi-strutturato e a oggetti) in un ambiente fortemente tipizzato e orientato agli oggetti grazie all'introduzione di query in stile XPath o SQL direttamente a livello di linguaggio.
Immaginare quali siano le esigenze per un simile approccio non è così difficile vista la fondamentale importanza che ricopre l'accesso ai dati da parte delle applicazioni del giorno d'oggi, per cui aiutare lo sviluppatore permettendogli di scrivere più velocemente programmi che in questo senso risultino corretti incrementando quindi la produttività di quest'ultimo è indubbiamente molto importante. Lo scoglio principale attualmente è rappresentato dall'assenza di una vera integrazione tra i modelli prima citati poichè in molti casi il loro punto di incontro è rappresentato solamente dallo scambio di semplici stringhe (come l'invio di query SQL in formato stringa o la lettura di nodi o elementi/attributi da file xml) perdendo quindi qualsiasi possibilità di static-check e introducendo di conseguenza molte più probabilità di incappare in errori, costringendo pertanto lo sviluppatore a implementare più controlli che tuttavia hanno un impatto negativo sulle performance delle relative applicazioni. Nel corso del tempo sono nati vari metodi per ovviare a questo problema, come per esempio XSD sul fronte XML, ma per raggiungere il più possibile questa integrazione promessa da Cω si è resa necessaria l'introduzione di nuove feature e di nuovi costrutti sintattici a un linguaggio di programmazione a oggetti già esistente come C#. Nei prossimi articoli verrà dato spazio a ogununo dei singoli argomenti, nell'ordine della seguente sintesi:
- Stream e iteratori: se volessimo effettuare un paragone tra gli stream di Cω e un qualcosa di già esistente in C# potremmo pensare alle collection, più precisamente quelle generic di C# 2.0, ma senza la possibilità di un accesso di tipo random. Se invece volessimo trovare un paragone con il mondo XML potremmo pensare in un certo senso a una sequence di XSD. Grazie a essi scopriremo un primo punto di contatto molto importante che rappresenta una delle basi su cui poggia Cω.
- Anonymous struct, aka Tuple: le anonymous struct di Cω sono paragonabili a struct di C# con campi pubblici in quanto non hanno identità di tipo referenziale, tuttavia possono essere definite inline nel codice senza la necessità di assegnargli un nome e i loro campi possono essere a loro volta anonimi in quanto ordinati e quindi accessibili con un'indice che rappresenta la loro posizione all'interno della struttura.
- Tipi nullable e choice: per dare un'idea del concetto di nullable type in Cω potremmo fare riferimento agli stessi in C# 2.0 anche se in realtà la loro implementazione interna differisce in maniera tale da permettere l'accesso a una variabile senza il conseguente lancio di un'eccezione nel caso quest'ultima dovesse risultare null, come accadrebbe al contrario in C#. I tipi choice invece consentono di stabilire per una classe o struttura la presenza di soltanto uno tra due o più campi di quelli specificati, analogamente a quanto definito dall'elemento choice in XSD.
- Content class e XML literal : il nome "content class" deriva dal concetto di poter dichiarare un contenuto semi-strutturato attraverso la definizione di una struttura estesa da operatori che assumono specifici significati in questo contesto, ottenendo pertanto quello che in ambito XML sarebbe equivalente a XSD e DTD. Questo permette di sfruttare XML literal, ovvero dei frammenti di XML scritti direttamente all'interno del codice che, diventando parte effettivamente integrante del programma, ci consentono di creare in maniera veloce e intuitiva nuove istanze di classi, quasi come se fosse in atto una sorta di deserializzazione.
- Query XPath: come abbiamo appena detto, in Cω si ha la possibilità di usare direttamente XML ma ciò necessita anche di un modo per poterne interrogare i contenuti in maniera facile e veloce agendo su stream e content class: questo è possibile usando l'operatore "." insieme ad altri operatori per ricreare delle vere e proprie query in stile XPath sugli oggetti.
- Query SQL: al pari dell'accesso in stile XPath, è possibile accedere ai dati degli oggetti anche in maniera relazionale grazie all'integrazione di una generosa parte del linguaggio SQL in Cω. E' quindi possibile eseguire query SQL su oggetti direttamente da codice come per esempio SELECT con clausole WHERE, ORDER BY, GROUP BY oppure avere delle JOIN. E' supportata anche la possibilità di effettuare modifiche tramite INSERT, DELETE e UPDATE con tanto di supporto delle transazioni.
- Metodi asincroni e chord: per finire un altro aspetto interessante è il supporto per la definizione di metodi asincroni sfruttando la parola chiave async , semplificando quindi la vita del programmatore che sarà esentato dal dover utilizzare i classici sistemi sicuramente più complessi messi a disposizione dal framework .NET, fornendo tra l'altro un modo per ovviare a problemi derivanti dalla sincronizzazione grazie all'introduzione dei chord che, in linea di massima, permettono di stabilire un ordine ben preciso nella catena di esecuzione di metodi.
Il primo articolo specifico riguarderà pertanto stream e iteratori con esempi pratici e anche qualche piccolo "dietro le quinte", ovvero qualche occhiata al codice generato dal compilatore per cercare di capire almeno a grandi linee cosa accade realmente in fase di esecuzione.
powered by IMHO 1.2