ugrás a tartalomhoz

Cω, a Microsoft új fegyvere?

Bártházi András · 2005. Jan. 20. (Cs), 18.38
A Microsoft folyamatoson fejleszt új technológiákat, fedez fel trendeket - a többi nagycéghez hasonlóan több-kevesebb sikerrel. A minap egy nagyon ígéretesnek tűnő, s a programozási nyelvekre remélem nagy hatással bíró Microsoft Research kutatási eredménnyel találkoztam az XML.com egyik cikkében, s ez nem más, mint a Cω (ejtsd: COmega) nyelv, mely lehetőséget teremt natív XML és SQL kezelésre.

A cikk (Introducing Comega) az XML natív lehetőségeit bemutató sorozat első része, s az E4X (Ecmascript for XML) és a COmega ismertetését tűzte ki célul. Egy korábbi hírünkben már mi is megemlítettük az igen szimpatikus E4X technológiát (Ruby, XML, E4X), mely várhatóan a Mozilla böngészőknek hamarosan része lesz, most egy rövid betekintés keretében az XML.com-on megjelent cikkből és más forrásokból szemezgetünk az Cω nyelv lehetőségeiből.

A Cω egy C# kiegészítő, mely a nyelv típusosságát változtatja meg, új típusok és operátorok bevezetésével. Ezek az újdonságok adatbázisban tárolható és XML adatok kezelését teszik lehetővé sokkal intuitívabb módon, mint a mai nyelvek. A változtatások célja, hogy ezeket az adatokat sokkal jobban integrálja a nyelvbe, illetve annak típusaiba.

Ehhez először is új típusok lehetőségét vezeti be. Az egyik a choice, melynek lényege, hogy egy mezőben többfajta érték tárolását teszi lehetővé - de egyszerre csak egyfajtát. Szintakszisa a következő:

choice{string;DateTime;} x =  DateTime.Now;
choice{string;DateTime;} y =  "12/12/2004";
Egy másik a típusok lehetőségét kibővítő újdonság, az a "nullázható" típus. A típusokat nem tartalmazó scriptnyelvekben igen gyakori, hogy egy elemnek null értéket adunk, ezt egy típusos nyelvben, ha például egy egészről van szó, nem igazán tudunk megtenni - míg egy XML fájlban teljesen természetes lehet, hogy éppen nincs értéke egy tulajdonságnak. Gyakori probléma, az is hogy egy metódus visszatérési értékéül nem definiált értéket szeretnénk visszaadni, de ez nem lehetséges, mert általában mondjuk egy stringet vár. Egy új jelölő bevezetésével a Cω ezt is lehetővé teszi. A megoldás nem teljesen egyezik meg a C# 2 nullázható típusaival.

A következő egyszerűsített példa ezt szemlélteti:

string? s = null;
if (size == null)
  Console.WriteLine("A size NULL értéket vett fel!");
A névtelen struktúrák szintén az XML integrációt teszik lehetővé, mivel bonyolult adatszerkezetet képesek tárolni, beolvasni és kiírni, úgy, hogy konkrétan nem definiáljuk az így memóriában tárolt típust.

struct{ int;
        string; 
        string;
        DateTime date; 
        string;} x = new {47, "Hello World", 
                         "Dare Obasanjo", date=DateTime.Now, 
                         "This is my first story"};
Térjünk át egy még izgalmasabb témára, ezek pedig ezeknek a struktúráknak a kezelése! A következő kódrészletben egy struktúrának a lekérdezését láthatjuk, a ... operátor azokat a struktúra darabokat fogja visszaadni, melyekre igaz, hogy értékük nagyobb, mint 8:

struct {int a; int b; int c;} z = new {a=5, b=10, c=15};
int* values = z...int::*[it > 8];

foreach(int i in values) {
  Console.WriteLine(i + " nagyobb, mint 8");
}
Említettem, hogy natív SQL lekérdezésekre is van lehetőségünk. A következő kódrészlet egy lekérdezést hajt végre, s a visszakapott értékeken megy végig. A select és maga a teljes lekérdezés egy nyelvi elemként, utasításként szerepel.

using System;
using System.Data.SqlTypes;
using Northwind;

class Test {
   static void Main() {
     foreach( row in select ContactName from DB.Customers ) {
       Console.WriteLine("{0}", row.ContactName);
     }
   }
}
Mint ebből a pár példából is látható, érdekes fába vágták a fejszéjüket a kutatók. A bemutatott megoldások engem (persze nem véletlenül) a Perl-re emlékeztetnek: ott lett sikeres a reguláris kifejezések natív kezelése, mely elég sikeresnek mondható. Egy másik érdekesség, hogy a Perl 6 egyik újdonsága majd a típusok bevezetése lesz az addig típus nélküli nyelvbe: itt pedig ennek pont az ellenkezőjét láthattuk, a jelenleginél sokkal kevésbé szigorú típusosság, kvázi típustalanság bevezetését. Lehet, hogy a C# és a Perl következő verziói ilyen módon egyre inkább közeledni fognak egymáshoz, s ez egy trend is lehet? Személyes tapasztalatom, hogy egy nyelv akkor tud nagyon jól használható lenni, ha minél rugalmasabb, én ilyen törekvéseket látok a Cω által behozott újdonságokban. Van, aki ezt nem értékeli viszont előnyként: ezáltal a nyelv bonyolultabb, a kezdők számára kevésbé érthető lehet. Meglátjuk.

Addig is, akit kicsit mélyebben érdekelnek a fentebb bemutatottak (eléggé felületes voltam), azoknak az XML.com cikkét, illetve a Microsoft Research kapcsolódó honlapját Comega - Home tudom ajánlani.