270 likes | 503 Views
Nemerle Deep Dive. Что такое Nemerle ?. Nemerle – это статически-типизированный, мультипарадигмный язык программирования общего назначения для платформы CLI (.Net и Mono). Ядро языка. Типы Позаимствованы из C# Позаимствованы из ML Выражения – п озаимствованы из ML
E N D
Что такое Nemerle? Nemerle – это статически-типизированный, мультипарадигмный язык программирования общего назначения для платформы CLI (.Net и Mono)
Ядро языка • Типы • Позаимствованы из C# • Позаимствованы из ML • Выражения –позаимствованыиз ML • Операторы – позаимствованы из C • Макросы – позаимствованы из Lisp
Синтаксические различия C# using System; namespace MyNamespace { classTest<T> { public T GetResult(T value) { // ... returnvalue; } } staticclassProgram { staticvoid Main(string[] args) { var result = newTest<int>().GetResult(42); Console.WriteLine(result); } } }
Синтаксические различия C# using System; namespace MyNamespace { classTest<T> { public T GetResult(T value) { // ... returnvalue; } } static classProgram { staticvoid Main(string[] args) { var result = newTest<int>().GetResult(42); Console.WriteLine(result); } } }
Синтаксические различия Nemerle using System; namespace MyNamespace { classTest[T] { public GetResult(value: T): T { // ... value } } moduleProgram { Main(args : array[string]): void { defresult = Test().GetResult(42); Console.WriteLine(result); } } }
Синтаксические различия Nemerle using System; namespaceMyNamespace { classTest[T] // Квадратные скобки вместо угловых { publicGetResult(value : T) : T// типы после «:» { // ... value // Не нужно использовать return } } moduleProgram // вместо статический классов используются модули { Main(args: array[string]) : void// массив объявляется через ключевое слово array { defresult = Test().GetResult(42);// не нужно указывать параметры типов и new Console.WriteLine(result); } } }
Синтаксические различия Nemerle #pragma indent using System; namespace MyNamespace classTest[T] public GetResult(value : T) : T // ... value moduleProgram Main(args : array[string]) : void def result = Test().GetResult(42); Console.WriteLine(result);
Вывод типов • Nemerle поддерживает локальный вывод типов. • Выводятся наиболее конкретный общий, не обобщенный, тип. • Типы выводятся из инициализации или использования. • Параметры типов так же выводятся и обычно их не приходится указывать явно.
Минималистичное ядро выражений • Оператор match(switch на стероидах) • Блок выражений • Именованный блок (return на стеройдах) • Локальные функции • Связывание def • Переменные mutable • Обработка исключений throw, try/catch/finally • Операторы: +- * / % ^ & | < > <= >= == ()~ = • Вызов функций/методов/индексаторов • Приведение типов «:» - уточнениеи «:>» - приведение • Литералы: числовые, строк, списков, массивов, символов. • checked и unchecked • Доступ к члену (obj.member) • Все остальные конструкции языка – макросы.
Другие операторы и выражения В стандартную библиотеку Nemerle входит множество макросов реализующих аналоги операторов или выражений C# или не имеющих аналогов в C#. Код всех макросов доступен публично. Обычно макросы предоставляют ряд возможностей выходящих за рамки возможностей предоставляемых аналогичными операторами/выражениями C#. Вы можете начать писать на Nemerle как на C# и постепенно осваивать продвинутые возможности.
Поддержка функционального программирования • Функции как первоклассные значения • Лямбды • Частичное применение • Алгебраические типы • Сопоставление с образцом • Вывод типов
Макросы • Что это? • С чем едят? Зачем они нужны? • Как сочетаются с IDE и прочими технологиями? • Сложности разработки, отладки, сопровождения. • Развенчание мифов.
Макросы: Что это? • Макрос Nemerle – это метапрограмма (функция) позволяющая изменять или дополнять программу путем манипуляции ее AST. • Виды макросов: • Макро-атрибут. • Макрос уровня выражения. • Макросы могут быть синтаксическими, операторами или не синтаксическими.
Макросы: Зачем они нужны? • Создание встроенных DSL-ей (языков предметной области). • Расширение языка. • Автоматизация программирования. • Контроль за кодом.
Почему макросы, а не: • Генерация кода во время исполнения (Expression tree, Sytem.Reflection.Emit, StringBuilder + csc.exe)? • PostSharp или другой постпроцессор? • Генерация кода внешними утилитами (в виде текста). Например, с помощью Т4? • Препроцессоры вроде OCaml4p? • Использовать DSL-и на основе имеющихся возможностей языка? • Обходиться возможностями ООП или ФП?
Макросы: Как сочетаются с IDE и прочими технологиями? • IDE • Дизайнеры (форм, WPF, Web, …) • Внешние кодогенераторы (например, T4)
Макросы: Сложности • Как разрешаются конфликты между макросами? • Взаимодействие с компонентными технологиями. • Откладка: • Отладка кода макроса. • Отладка кода генерируемого макросом. • Сопровождение, совместимость с предыдущими версиями.
Ограничения и проблемы макросов в Nemerle 1.0. • Ограничения расширения синтаксиса. • Сложность введения нестандартного синтаксиса. • Невозможность определения порядка раскрытия макросов работающих на одной стадии. • Сложность написания нетривиальных макросов (которым требуется информация о типах). • Не до конца продуманный API компилятора. • Сложность создания внешних DSL-ей. • Привязанность компилятора к платформе на которой он собран (SRE). • Низкая скорость работы компилятора.
Что ждать после выхода Nemerle 1.0? • Поддержку VS 2010. • Перевод Nemerle на сменяемые бэкэнды (CCI). • Nemerle 2.0.
Что будет в Nemerle 2.0? • Поддержка сменяемых бэкэндов (CCI Metadata, Mono Cesil, F# AbstractIL, IKVM). Возможно реализация бэкнда для Java и LLVM. • Крос-компиляция для любых версий платформ .net и Mono (Compact Framwork, SilverLight...). • Новая макро-система основанная на PEG/TDOP. • Почти неограниченная расширяемость синтаксиса. • Возможность создавать внешние DSL-и. • Перевод парсера Nemerle полностью на макросы.
Что еще будет в Nemerle 2.0? • Ускорится компиляция. • Улучшится поддержка IDE. • Nemerle станет фрэймворком для создания языков программирования, внешних DSL-й и средств рефакторинга к ним. • Компилятор станет многопоточным. • AST станет неизменяемым, а его изменение будет прождать создание новой версии. • Макросы станут преимущественно «чистыми», а изменение дерева типов будет выделено в отдельные стадии компиляции и будет четко контролироваться.
Примеры практического использования макросов • Прикладные макро-библиотеки • DSL-и • Фрэймворки • Расширения языка (мелкие полезняшки)
Прикладные макро-библиотеки • ComputationExpressions • yield внутри выражения • Асинхронное программирование • другие применения • Nemerle.Xml - XML-литералы • Nemerle.Peg - быстрый и гибкий генератор парсеров шаговой доступности • Nemerle.WUI.Reactive • Nemerle on Rails
Расширения языка • Автоматизация реализации зависимых свойств в WPF • Record - автоматизация создания конструкторов • Автоматизация паттернов проектирования ООП (Abstract factory, Aggregate, Proxy, Singleton) • late - позднее связывание • Surroundwith - создание аналогов using и lock в мгновение ока • Memoize • $-строки • assertions
Расширения языка • List сomprehension • regexp match • StructuralEquality • LexicographicCompareTo • StructuralHashCode