Clasa de limba distribuite, orientate pe date
Tipul de execuție compilat în MSIL
Aparut in 2005
Autor Nick Benton, Gavin Bierman, Luca Cardelli, Erik Meijer, Claudio Russo, Wolfram Schulte
Dezvoltator Cercetare Microsoft
Tip sistem strict, sintactic
Implementări majore Previzualizarea compilatorului Microsoft Cω
A fost influențat C# , C# polifonic
Site-ul web microsoft.com/en-us/rese…

Cω (pronunțat: si omega , scris de obicei: Cw sau Comega ) este un limbaj de programare, o extensie a limbajului de programare C# , dezvoltat de Microsoft Research . Cunoscut anterior sub numele de cod X# și Xen, a fost redenumit Cω după ce a fost integrat cu Polyphonic C#  , un alt limbaj în curs de dezvoltare.

Scopul Cω este de a oferi acces natural la surse externe de date semi-structurate și structurate, cum ar fi baze de date sau documente XML , la fel de convenabil ca și tipurile de date tradiționale (cum ar fi șir sau matrice). Multe dintre idei au fost moștenite din proiectul X# anterior. Cω include, de asemenea, noi componente structurale pentru a sprijini programarea paralelă; aceste caracteristici au fost foarte împrumutate din primele etape ale Polyphonic C# .

Caracteristicile limbajului au fost folosite pentru a crea componenta LINQ în .NET Framework, componentele de programare paralelă, într-o formă ușor modificată, sunt distribuite ca Joins Concurrency Library pentru C# și alte limbaje .NET.

Caracteristicile limbii

Limbajul este descris de Microsoft ca [1] puternic tipizat, centrat pe date și conceput pentru a combina date semi-structurate ( XML ), date relaționale ( SQL ) și .NET CTS .

Exemple de integrare a sintaxei limbajului cu date:

Câteva caracteristici sintactice ale limbajului

Tipul fluxului

Un flux [4] ( English  stream ) în Cω este, ca un tablou, un set de obiecte de același tip. Spre deosebire de datele dintr-o matrice, datele dintr-un flux sunt create direct atunci când sunt accesate, folosind generatoare . Sintactic, un generator arată ca o metodă obișnuită, cu excepția faptului că un generator poate returna mai multe obiecte. Un tip de flux este declarat prin adăugarea unui asterisc după numele tipului - T*.

// Generator de fire int * OneToTen () { for ( int i = 1 ; i <= 10 ; i ++) randament return i ; } // Folosind un generator pentru a scoate un flux int * IntStream = OneToTen (); foreach ( int j în IntStream ) { Consolă . WriteLine ( j ); };

Tip de alegere

Tipul de selectare [2] este definit de cuvântul cheie choiceși indică faptul că datele pot fi definite în moduri diferite. De exemplu, o declarație de structură Address:

struct Adresa { struct { alegere { string Strada ; int POBox ; }; stringCity ; _ int? Cod poștal ; șir Țara ; }; }

înseamnă că poate stoca fie un nume de stradă ca șir ( string Street) fie un număr de cutie poștală ca număr ( int POBox​​), dar nu ambele. Apelul membrului Address::Streetva returna fie șirul numelui străzii dacă structura conține unul, fie nulldacă structura conține un număr de cutie poștală.

Posibile valori nule

Numele clasei la declararea unei variabile poate fi scris ca T?. Cu o astfel de declarație, în cazul accesului la membrii clasei într-un obiect neinițializat, o excepție de referință nulă nu va fi aruncată, ci în schimb valoarea va fi returnată null.

Butonul b = nul ; bool d = b . AllowDrop ; // NullReferenceException butonul ? b = nul ; bool? d = b . AllowDrop ; // returnează nul

Tipuri de structuri anonime

Tipurile anonime corespund unui element xs:sequencedin Schema XML . Tipurile de structuri anonime sunt similare cu tipurile de structuri obișnuite în C#, dar au o serie de diferențe semnificative:

  • nu există un nume de tip explicit pentru o structură anonimă
  • membrii într-o structură anonimă sunt ordonați, permițând accesul la ei printr-un index
  • membrii unei structuri anonime nu trebuie să aibă un nume, pot avea doar un tip
  • o structură anonimă poate avea mai mulți membri cu același nume, caz în care un flux va fi returnat atunci când este accesat cu acel nume
  • structurile anonime cu aceeași structură (membrii aceleiași clase în aceeași ordine) sunt compatibile și pot fi atribuite valori.
struct { int ; șir _ șir _ DateTime data ; șir ;} x = nou { 47 , „Hello World” , „Dare Obasanjo” , date = DateTime . Acum , „Aceasta este prima mea poveste” }; Consola . WriteLine ( x [ 1 ]); // Salut Lume

Folosind constructe XML

În Cω, puteți crea obiecte folosind sintaxa XML, iar entitățile XML pot conține cod inline pentru a calcula o valoare. Cu toate acestea, deoarece Cω este un limbaj puternic tipizat, numele membrilor obiectului, precum și tipurile acestora trebuie să fie cunoscute în timpul compilării. Exemplul de mai jos arată cum poate fi utilizată sintaxa XML:

public class NewsItem { atribut șir titlu ; struct { DateTime date ; corp șir ; } public static void Main () { NewsItem news = < NewsItem title = "Bună ziua, lume" > < data >{ DateTime . Acum }</ date > < body > Sunt primul post al Anului Nou . </ body > < / NewsItem > ; Consola . WriteLine ( știri . titlu + " pe " + știri . dată ); } }

Acces la membri

Odată cu apariția fluxurilor și a structurilor anonime care pot conține mai mulți membri cu același nume, chiar și accesul simplu la un membru folosind operatorul punct în Cω poate fi tratat ca o interogare. De exemplu, books.Book.titleva returna proprietățile titletuturor obiectelor Bookdin books.

Operatorul „ .*” este folosit pentru a obține toate câmpurile dintr-un tip. De exemplu, books.Book.*returnează un flux de toți membrii tuturor obiectelor Bookdin books.

Cω acceptă, de asemenea, accesul tranzitiv al membrilor prin …operatorul " ". Operația books…titlereturnează un flux care conține toți membrii titlecare sunt conținute în clasă bookssau în conținutul acesteia (prin recursivitate). Operatorul de acces tranzitiv poate fi folosit și pentru a accesa membri de un anumit tip: …typename::*. De exemplu, books…string::*returnează un flux care conține toți membrii de tip stringconținut în clasa bookssau în conținutul acesteia (prin recursivitate).

Filtrarea poate fi aplicată rezultatelor unui operator de acces tranzitiv. Filtrul este aplicat interogării folosind [expression]operatorul " ".

struct { int a ; int b ; int c ;} z = nou { a = 5 , b = 10 , c = 15 }; int * valori = z ... int ::*[ it > 8 ]; foreach ( int i în valori ){ Consolă . WriteLine ( i + " este mai mare decât 8 " ); }

Operații SQL

Cω introduce următoarele operații SQL ca cuvinte cheie de limbă:

  • proiecție( select, from);
  • filtrare ( distinct, top, where);
  • sortare( order by, asc, desc);
  • grupare( group by, having, Count, Min, Max, Avg, Sum, Stddev);
  • sindicate ( inner join, left join, right join, outer join);
  • modificare ( insert, update, delete, transact, commit, rollback);

Această abordare vă permite să lucrați cu date folosind interogări asemănătoare SQL.

test de clasă publică { enumerare CDStyle { Alt , Clasic , HipHop } static struct { string Titlu ; string Artist ; Stilul CDStyle ; int An ;}* CD-uri = nou { nou { Titlu = „Lucky Frog” , Artist = „Holly Holt” , Style = CDStyle . Alt , An = 2001 }, nou { Titlu = „Kamikaze” , Artist = „Twista” , Stil = CDStyle . HipHop , An = 2004 }, nou { Titlu = "Stop Light Green" , Artist = "Robert O'Hara" , Style = CDStyle . Alt , An = 1981 }, }; public static void Principal (){ struct { șir Titlu ; string Artist ;}* rezultate ; rezultate = selectați Titlu , Artist de pe CD-uri unde Style == CDStyle . hip- hop rezultate .{ Consolă . WriteLine ( "Titlu = {0}, Artist = {1}" , it . Titlu , it . Artist ); }; } }

Note

  1. Microsoft bridging relational, object, XML data models Arhivat 16 iunie 2008.  (Engleză)
  2. 1 2 Pagina de pornire Comega: Tutorial pentru alegerea tipului Arhivat 27 martie 2008 la Wayback Machine 
  3. 1 2 MSDN: O privire de ansamblu asupra Cω Arhivat 10 februarie 2009 la Wayback Machine 
  4. Pagina de pornire Comega: Tutorial Streams Arhivat 11 aprilie 2008 la Wayback Machine 

Link -uri