Что такое Cx#
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.01.17 01:29
Оценка:
#Имя: wiki.CxSharp
Cx# — это реализация крайней (на данный момент) версии обычного C#, но:
1. На базе технологии Nitra.
2. Cx# будет поддерживать динамическое расширение в стиле Nemerle (точнее, в стиле Nemerle 2).

Многие, наверно, читали пиар-агитки от Майкрософт и полные розовых соплей от сторонних программистов о проекте Roslyn (компиляторах и движках IDE для C# и VB написанных на C# и, чуть-чуть, на VB).

С их помощью можно очень просто отарсить проект или просто кусок кода на C# или VB и вынуть какую-то информацию. Так же они позволяют делать разные анализаторы и прочие утилиты. В общем, штука хорошая.

Кое-кто задумывается и о пользовании Roslyn для задач метапрограммирования. А а некоторые мечтают и о расширении C# нужными им фичами.

Но на практике эти желания трудно осуществимы. Тут уж надо стать совсем уж низкоуровневым разработчиком компилятора. Да и обойтись без прямой модификации исходников Roslyn-а вряд ли выйдет.

Майкрософт пока что не очень хочет отдавать возможность изменения языков и компилятора на сторону. Но самое главное, что дизайн и реализация Roslyn такова, что не рассчитывает на свое расширение через подключаемые компоненты. Так что увидеть своего хитрого оператора, работающего в стандартом компиляторе и движке IDE от MS, у вас скорее всего не выйдет.

А вот Cx# сразу задумывается как допускающий широкие возможности по изменению синтаксиса подключаемыми плагинами (они же синтаксические макросы) и для внедрения на разные стадии компиляции в виде макросов не синтаксических. При этом будет обеспечиваться поддержка полная поддержка IDE и бесшовная интеграция с другими расширениями.

Почему не Nemerle, спросят многие из тех кто знаком с этим языком?

Дело в том, что так вопрос не стоит. Nemerle и расширяемый C# (или Cx#) очень близки. За исключением расширенного паттерн-матчинага и синтаксических различий у Cx# и Nemerle 2 будет все общее. А учитывая, что по возможностям Nemerle будет надмножеством последней версии C# можно сказать, что все что делается для Cx# будет повторно использовано в Nemerle. Ну, за исключением синтаксиса, конечно. Хотя на уровне описания типов (за исключением их членов) и синтаксис будет совпадать.

В Nemerle 2.х планируется отказаться от неоправданных отклонений от спецификации C# в области связывания имен. А в Cx# использовать те отклонения, которые оправданы (имеют практические преимущества). Например, в Cx# будет использоваться более продвинутые алгоритмы вывода типов, а в Nemerle эти алгоритмы будут изменяться так, чтобы в большей мере соответствовать спецификации C#. Например, надо оказаться от вывода типа функции по литералам, так как это приводит к несовместимому с C# разрешению перегрузок и просто выглядит плохим решением.

Например, в Nemerle вот такой код может выдать ошибку при компиляции:
def res = objs.Where(o => o.Foo(1));

так как Немерл на первом проходе не будет иметь информации о типе "o", он выведет тип int из литерала "1" и наложит ограничение на выражение o.Foo. Когда на втором проходе тип "o" будет известен, типизация выражение o.Foo может закончиться ошибкой или может быть выбрана перегрузка отличная от той, что выбрал бы компилятор C#.

По сему нужно пересмотреть алгоритм вывода типов Nemerle в пользу более похожего на алгоритм используемый в C#.

С другой стороны в Cx# будет можно не указывать параметры типов у конструкторов и т.п.

Общий подход к совместимости таков. Cx# должен компилировать код C#, но может делать некоторые вольности, если они не противоречат первому условию.

Естественно, что к Cx# будет доступна библиотека расширений превращающая язык в более мощный. Например, для Cx# будет доступен полноценный немерловый паттерн-матчинг.

Еще одна причина по которой нужно разрабатывать Cx# — это возможность получения в своих языках (например, в DSL-ях) метаинформации из C#. Скажем если вы пишите XAML с человеческим лицом, то вам может захотеться получить список типов или свойств некоторого типа. Часть типов и их членов может быть описана в коде на C#. Наличие Cx# позволит просто и прозрачно получить информацию об этом коде внутри вашего языка.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.