- Cω
-
Cω Класс языка: распределенный, data-oriented
Тип исполнения: компилируемый в MSIL
Появился в: 2005
Автор(ы): Nick Benton, Gavin Bierman, Luca Cardelli, Erik Meijer, Claudio Russo, Wolfram Schulte
Типизация данных: строгая, синтаксическая
Основные реализации: Microsoft Cω compiler preview
Испытал влияние: C#, Polyphonic C#
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.
Примеры интеграции синтаксиса языка с данными:
- тип выбора введен, в частности, для поддержки XSD, которые используют тег
choice
(или для «|
» в DTD)[2]; - инициализация объектов при помощи XML конструкций[3];
- анонимные типы являются аналогом элемента
xs:sequence
в XML Schema[3]
Некоторые синтаксические особенности языка
Тип «поток»
Поток[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); }; } }
Примечания
- ↑ Microsoft bridging relational, object, XML data models (англ.)
- ↑ 1 2 Comega Home Page: Choise Type Tutorial (англ.)
- ↑ 1 2 MSDN: An Overview of Cω (англ.)
- ↑ Comega Home Page: Streams Tutorial (англ.)
Ссылки
- Обзор на MSDN (англ.)
- Домашняя страница Cω (англ.)
- Домашняя страница Microsoft Research (англ.)
Основные языки программирования (сравнение • IDE • история • хронология) Используемые
в разработкеАда • APL • Язык ассемблера • ActionScript • ABAP/4 • AutoIt • AWK • Бейсик • Си • Кобол • C++ • C# • Cω • Clarion • Clojure • ColdFusion • Common Lisp • D • dBase • Delphi • Eiffel • Erlang • Euphoria • F# • Форт • Фортран • Gambas • Go • Groovy • HAL/S • Haskell • Icon • Java • JavaScript • Limbo • Lua • Модула-3 • Object Pascal • Objective-C • OCaml • Oz • Parser • Паскаль • Компонентный Паскаль • Perl • PHP • PowerBASIC • Python • ПЛ/1 • Пролог • Ruby • Scala • Scheme • Smalltalk • SQL • PL/SQL • Tcl • Vala • Visual Basic (.NET)
Академические IEC 61131-3 Instruction List • ST • FBD • Ladder Diagram (LD) • SFC
Прочие Эзотерические Визуальные Категории:- Появились в 2005 году
- Языки программирования по алфавиту
- тип выбора введен, в частности, для поддержки XSD, которые используют тег
Wikimedia Foundation. 2010.