Momotik.ru

Народный проект

Класс языка:

распределенный, data-oriented

Тип исполнения:

компилируемый в MSIL

Появился в:

2005

Автор(ы):

Nick Benton, Gavin Bierman, Luca Cardelli, Erik Meijer, Claudio Russo, Wolfram Schulte

Типизация данных:

строгая, синтаксическая

Основные реализации:

Microsoft Cω compiler preview

Испытал влияние:

C#, Polyphonic C#

(произносится: си́ оме́га, обычно записывается: Cw или Comega) — язык программирования, расширение языка программирования C#, разработанный Microsoft Research. Ранее был известен под кодовыми названиями X# и Xen, было переименовано в Cω после интеграции с Polyphonic C# — ещё одним разрабатываемым языком.

Целью Cω является предоставление доступа к хранилищам данных (например, к базам данных или XML документам) так же просто, как и к традиционным типам данных (например, как к строке или массиву). Многие идеи были унаследованы из более раннего проекта X#. Cω также включает новые структурные компоненты для поддержки параллельного программирования; эти особенности были в значительной степени заимствованы из ранней стадии Polyphonic C#.

Особенности Cω, доступные сейчас в компиляторе для ознакомления, были использованы для создания компонента LINQ в .NET Framework, компоненты параллельного программирования, в слегка изменённой форме, распространяются как Joins Concurrency Library для C# и других .NET языков.

Содержание

Особенности языка

Cω описывается Microsoft как[1] строго-типизированный язык программирования, ориентированный на работу с данными, и призванный объединить полу-структурированные данные (XML), реляционные данные (SQL) и .NET CTS.

Примеры интеграции синтаксиса языка с данными:

Некоторые синтаксические особенности языка

Тип «поток»

Поток[4] (англ. stream) в 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);
};

Тип выбора

Тип выбора[2] определяется ключевым словом 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[1]); // 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); };
  }
}

Примечания

  1. Microsoft bridging relational, object, XML data models (англ.)
  2. ↑ Comega Home Page: Choise Type Tutorial (англ.)
  3. ↑ MSDN: An Overview of Cω (англ.)
  4. Comega Home Page: Streams Tutorial (англ.)

Ссылки

  • Обзор на MSDN (англ.)
  • Домашняя страница Cω (англ.)
  • Домашняя страница Microsoft Research (англ.)