1 / 27

Nemerle Deep Dive

Nemerle Deep Dive. Что такое Nemerle ?. Nemerle – это статически-типизированный, мультипарадигмный язык программирования общего назначения для платформы CLI (.Net и Mono). Ядро языка. Типы Позаимствованы из C# Позаимствованы из ML Выражения – п озаимствованы из ML

temira
Download Presentation

Nemerle Deep Dive

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Nemerle Deep Dive

  2. Что такое Nemerle? Nemerle – это статически-типизированный, мультипарадигмный язык программирования общего назначения для платформы CLI (.Net и Mono)

  3. Ядро языка • Типы • Позаимствованы из C# • Позаимствованы из ML • Выражения –позаимствованыиз ML • Операторы – позаимствованы из C • Макросы – позаимствованы из Lisp

  4. Синтаксические различия 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); } } }

  5. Синтаксические различия 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); } } }

  6. Синтаксические различия 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); } } }

  7. Синтаксические различия 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); } } }

  8. Синтаксические различия 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);

  9. Вывод типов • Nemerle поддерживает локальный вывод типов. • Выводятся наиболее конкретный общий, не обобщенный, тип. • Типы выводятся из инициализации или использования. • Параметры типов так же выводятся и обычно их не приходится указывать явно.

  10. Минималистичное ядро выражений • Оператор match(switch на стероидах) • Блок выражений • Именованный блок (return на стеройдах) • Локальные функции • Связывание def • Переменные mutable • Обработка исключений throw, try/catch/finally • Операторы: +- * / % ^ & | < > <= >= == ()~ = • Вызов функций/методов/индексаторов • Приведение типов «:» - уточнениеи «:>» - приведение • Литералы: числовые, строк, списков, массивов, символов. • checked и unchecked • Доступ к члену (obj.member) • Все остальные конструкции языка – макросы.

  11. Другие операторы и выражения В стандартную библиотеку Nemerle входит множество макросов реализующих аналоги операторов или выражений C# или не имеющих аналогов в C#. Код всех макросов доступен публично. Обычно макросы предоставляют ряд возможностей выходящих за рамки возможностей предоставляемых аналогичными операторами/выражениями C#. Вы можете начать писать на Nemerle как на C# и постепенно осваивать продвинутые возможности.

  12. Поддержка функционального программирования • Функции как первоклассные значения • Лямбды • Частичное применение • Алгебраические типы • Сопоставление с образцом • Вывод типов

  13. Макросы • Что это? • С чем едят? Зачем они нужны? • Как сочетаются с IDE и прочими технологиями? • Сложности разработки, отладки, сопровождения. • Развенчание мифов.

  14. Макросы: Что это? • Макрос Nemerle – это метапрограмма (функция) позволяющая изменять или дополнять программу путем манипуляции ее AST. • Виды макросов: • Макро-атрибут. • Макрос уровня выражения. • Макросы могут быть синтаксическими, операторами или не синтаксическими.

  15. Макросы: Зачем они нужны? • Создание встроенных DSL-ей (языков предметной области). • Расширение языка. • Автоматизация программирования. • Контроль за кодом.

  16. Почему макросы, а не: • Генерация кода во время исполнения (Expression tree, Sytem.Reflection.Emit, StringBuilder + csc.exe)? • PostSharp или другой постпроцессор? • Генерация кода внешними утилитами (в виде текста). Например, с помощью Т4? • Препроцессоры вроде OCaml4p? • Использовать DSL-и на основе имеющихся возможностей языка? • Обходиться возможностями ООП или ФП?

  17. Макросы: Как сочетаются с IDE и прочими технологиями? • IDE • Дизайнеры (форм, WPF, Web, …) • Внешние кодогенераторы (например, T4)

  18. Макросы: Сложности • Как разрешаются конфликты между макросами? • Взаимодействие с компонентными технологиями. • Откладка: • Отладка кода макроса. • Отладка кода генерируемого макросом. • Сопровождение, совместимость с предыдущими версиями.

  19. Ограничения и проблемы макросов в Nemerle 1.0. • Ограничения расширения синтаксиса. • Сложность введения нестандартного синтаксиса. • Невозможность определения порядка раскрытия макросов работающих на одной стадии. • Сложность написания нетривиальных макросов (которым требуется информация о типах). • Не до конца продуманный API компилятора. • Сложность создания внешних DSL-ей. • Привязанность компилятора к платформе на которой он собран (SRE). • Низкая скорость работы компилятора.

  20. Что ждать после выхода Nemerle 1.0? • Поддержку VS 2010. • Перевод Nemerle на сменяемые бэкэнды (CCI). • Nemerle 2.0.

  21. Что будет в Nemerle 2.0? • Поддержка сменяемых бэкэндов (CCI Metadata, Mono Cesil, F# AbstractIL, IKVM). Возможно реализация бэкнда для Java и LLVM. • Крос-компиляция для любых версий платформ .net и Mono (Compact Framwork, SilverLight...). • Новая макро-система основанная на PEG/TDOP. • Почти неограниченная расширяемость синтаксиса. • Возможность создавать внешние DSL-и. • Перевод парсера Nemerle полностью на макросы.

  22. Что еще будет в Nemerle 2.0? • Ускорится компиляция. • Улучшится поддержка IDE. • Nemerle станет фрэймворком для создания языков программирования, внешних DSL-й и средств рефакторинга к ним. • Компилятор станет многопоточным. • AST станет неизменяемым, а его изменение будет прождать создание новой версии. • Макросы станут преимущественно «чистыми», а изменение дерева типов будет выделено в отдельные стадии компиляции и будет четко контролироваться.

  23. Примеры практического использования макросов • Прикладные макро-библиотеки • DSL-и • Фрэймворки • Расширения языка (мелкие полезняшки)

  24. Прикладные макро-библиотеки • ComputationExpressions • yield внутри выражения • Асинхронное программирование • другие применения • Nemerle.Xml - XML-литералы • Nemerle.Peg - быстрый и гибкий генератор парсеров шаговой доступности • Nemerle.WUI.Reactive • Nemerle on Rails

  25. Расширения языка • Автоматизация реализации зависимых свойств в WPF • Record - автоматизация создания конструкторов • Автоматизация паттернов проектирования ООП (Abstract factory, Aggregate, Proxy, Singleton) • late - позднее связывание • Surroundwith - создание аналогов using и lock в мгновение ока • Memoize • $-строки • assertions

  26. Расширения языка • List сomprehension • regexp match • StructuralEquality • LexicographicCompareTo • StructuralHashCode

  27. Nemerle

More Related