Cω (произносится: си́ оме́га, обычно записывается: Cw или Comega) — язык программирования, расширение языка программирования C#, разработанный Microsoft Research. Ранее был известен под кодовыми названиями X# и Xen, было переименовано в Cω после интеграции с Polyphonic C# — ещё одним разрабатываемым языком.
Целью Cω является предоставление естественного доступа к внешним источникам полуструктурированных и структурированных данных, например, базам данных или XML-документам, столь же удобного, как и к традиционным типам данных (например, как к строке или массиву). Многие идеи были унаследованы из более раннего проекта X#. Cω также включает новые структурные компоненты для поддержки параллельного программирования; эти особенности были в значительной степени заимствованы из ранней стадии Polyphonic C#.
Особенности языка были использованы для создания компонента LINQ в .NET Framework, компоненты параллельного программирования, в слегка изменённой форме, распространяются как Joins Concurrency Library для C# и других .NET-языков.
Особенности языка Язык описывается Microsoft какMicrosoft bridging relational, object, XML data models строго типизированный, ориентированный на работу с данными, и призванный объединить полуструктурированные данные (XML), реляционные данные (SQL) и .NET CTS.
Примеры интеграции синтаксиса языка с данными: тип выбора введён, в частности, для поддержки XSD, которые используют тег choice (или для «|» в DTD)Comega Home Page: Choise Type Tutorial ; инициализация объектов при помощи XML конструкцийMSDN: An Overview of Cω ; анонимные типы являются аналогом элемента xs:sequence в XML Schema
Некоторые синтаксические особенности языка
Тип «поток» ПотокComega Home Page: Streams Tutorial () в Cω — это, так же как и массив, набор однотипных объектов. В отличие от данных в массиве, данные в потоке создаются непосредственно при обращении к нему, с помощью генераторов. Синтаксически генератор выглядит так же как и обыкновенный метод, за исключением того, что генератор может выдавать несколько объектов. Тип потока объявляется добавлением звездочки после имени типа — T*.
// Генератор потока int* OneToTen() { for (int i = 1; i <= 10; i++) yield return i; }
// Использование генератора для вывода потока int* IntStream = OneToTen(); foreach(int j in IntStream) { Console.WriteLine(j);
Тип выбора Тип выбора определяется ключевым словом choice, и указывает на то, что данные могут быть определены разным способом. Например, объявление структуры Address:
struct Address { struct{ choice { string Street; int POBox; }; string City; int? ZipCode; string Country;
означает, что в ней может храниться либо название улицы как строка (string Street), либо номер абонементного почтового ящика как число (int POBox), но не оба одновременно. Обращение к члену Address::Street вернет либо строку с названием улицы, если структура содержит её, либо null, если структура содержит номер абонементного почтового ящика.
Возможные null-значения Имя класса при объявлении переменной может быть записано в виде T?. При таком объявлении, в случае доступа к членам класса в неинициализированном объекте, не будет генерироваться null-reference-исключение, а вместо этого вернется значение null.
Button b = null; bool d = b.AllowDrop; // NullReferenceException
Button? b = null; bool? d = b.AllowDrop; // возвращает null
Анонимные структурные типы Анонимные типы соответствуют элементу xs:sequence в XML Schema. Анонимные структурные типы похожи на обычные структурные типы в C#, но имеют ряд существенных отличий:
для анонимной структуры нет явного названия типа члены в анонимной структуре упорядочены, что позволяет получить доступ к ним через индекс члены анонимной структуры не обязаны иметь имени, они могут иметь только тип анонимная структура может иметь несколько членов с одним и тем же именем, в этом случае при обращении по этому имени будет возвращён поток анонимные структуры с одинаковой структурой (члены одинаковых классов в одинаковом порядке) совместимы, и значения могут быть присвоены.
struct{ int; string; string; DateTime date; string;} x = new {47, "Hello World", "Dare Obasanjo", date=DateTime.Now, "This is my first story"};
Console.WriteLine(x); // Hello World
Использование XML-конструкций В Cω можно создавать объекты с помощью XML-синтаксиса, при этом XML-сущности могут содержать встроенный код для вычисления значения. Однако, так как Cω строго типизированный язык, имена членов объекта, а также их типы должны быть известны при компиляции. Пример ниже показывает как можно использовать XML-синтаксис:
public class NewsItem { attribute string title; struct { DateTime date; string body; }
public static void Main() { NewsItem news = <NewsItem title="Hello World"> <date>{DateTime.Now}</date> <body>I am the first post of the New Year.</body> </NewsItem>;
Console.WriteLine(news.title + " on " + news.date);
Доступ к членам С появлением потоков и анонимных структур, которые могут содержать несколько членов с одинаковым именем, даже обыкновенный доступ к члену при помощи оператора точки в Cω можно рассматривать как запрос. Например, books.Book.title вернёт свойства title всех объектов Book из класса books.
Оператор «.*» используется для получения всех полей в типе. Например, books.Book.* возвращает поток всех членов всех объектов Book из класса books.
Cω также поддерживает транзитивный доступ к членам через оператор «…». Операция books…title возвращает поток, содержащий все члены title, которые содержатся в классе books, или в его содержимом (по рекурсии). Оператор транзитивного доступа так же может быть использован для доступа к членам определённого типа: …typename::*. Например, books…string::* возвращает поток, содержащий все члены типа string, содержащиеся в классе books, или в его содержимом (по рекурсии).
К результатам оператора транзитивного доступа можно применить фильтрацию. Фильтр применяется к запросу используя оператор «[expression]».
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 + " is greater than 8");
SQL-операции Cω вводит следующие SQL-операции как ключевые слова языка: проекция (select, from); фильтрация (distinct, top, where); сортировка (order by, asc, desc); группировка (group by, having, Count, Min, Max, Avg, Sum, Stddev); объединения (inner join, left join, right join, outer join); модификация (insert, update, delete, transact, commit, rollback);
Такой подход позволяет работать с данными используя SQL-подобные запросы.
public class Test{
enum CDStyle {Alt, Classic, HipHop}
static struct{ string Title; string Artist; CDStyle Style; int Year;}* CDs = new{ new{ Title="Lucky Frog", Artist="Holly Holt", Style=CDStyle.Alt, Year=2001}, new{ Title="Kamikaze", Artist="Twista", Style=CDStyle.HipHop, Year=2004}, new{ Title="Stop Light Green", Artist="Robert O'Hara", Style=CDStyle.Alt, Year=1981},
public static void Main(){
struct { string Title; string Artist;}* results;
results = select Title, Artist from CDs where Style == CDStyle.HipHop; results.{ Console.WriteLine("Title = {0}, Artist = {1}", it.Title, it.Artist); };
Примечания
Ссылки Обзор на MSDN Домашняя страница Cω Домашняя страница Microsoft Research
Категория:Семейство языков программирования C Sharp Категория:Компиляторы C Sharp