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

Презентация:



Advertisements
Похожие презентации
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Advertisements

ДЕЛЕГАТЫ Лекция 7 1. Зачем нужны делегаты 2 И данные, и код располагаются в памяти компьютера по определенным адресам. Передача адресов данных в C# происходит.
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
1 © Luxoft Training 2012 Java: расширенные вопросы Модуль #8.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Высокоуровневые методы информатики и программирования Лекция 9 Делегаты.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
ФИЛОСОФИЯ.NET Любому современному программисту, который желает идти в ногу с последними веяниями, каждые несколько лет приходится переучиваться.
С# и ООП Формальное определение класса с C# Класс в C# - это пользовательский тип данных (user defined type), который состоит из данных (часто называемых.
Обобщения ( generics) Обобщения – это классы, структуры, интерфейсы и методы, в которых некоторые типы сами являются параметрами. Эти типы перечисляются.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Нововведения в C++11 Докладывает: Сорокина Маргарита.
Делегаты Делегат эти объект, который безопасно инкапсулирует метод, его действие схоже с указателем функции в C и C++. Делегаты используются для передачи.
Высокоуровневые методы информатики и программирования Лекция 14 Интерфейсы.
Software engineering Дмитриев Андрей Владиславович ©
1 Классы в Java Ключевое слово class означает: Я говорю тебе, как выглядит новый тип объекта. Класс является базовым элементом объектно-ориентированного.
Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
Microsoft.NET Первая лекция. COM Доступ к компонентам только через интерфейсы Назначение уникальных идентификаторов компонентам и интерфейсам Регистрация.
Лекция 13. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Транксрипт:

Nemerle Deep Dive

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

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

Синтаксические различия using System; namespace MyNamespace { class Test { public T GetResult(T value) { //... return value; } static class Program { static void Main(string[] args) { var result = new Test ().GetResult(42); Console.WriteLine(result); } C#

Синтаксические различия using System; namespace MyNamespace { class Test { public T GetResult(T value) { //... return value; } static class Program { static void Main(string[] args) { var result = new Test ().GetResult(42); Console.WriteLine(result); } C#

Синтаксические различия using System; namespace MyNamespace { class Test[T] { public GetResult(value : T) : T { //... value } module Program { Main(args : array[string]) : void { def result = Test().GetResult(42); Console.WriteLine(result); } Nemerle

Синтаксические различия using System; namespace MyNamespace { class Test[T] // Квадратные скобки вместо угловых { public GetResult(value : T) : T // типы после «:» { //... value // Не нужно использовать return } module Program // вместо статический классов используются модули { Main(args : array[string]) : void // массив объявляется через ключевое слово array { def result = Test().GetResult(42); // не нужно указывать параметры типов и new Console.WriteLine(result); } Nemerle

Синтаксические различия #pragma indent using System; namespace MyNamespace class Test[T] public GetResult(value : T) : T //... value module Program Main(args : array[string]) : void def result = Test().GetResult(42); Console.WriteLine(result); Nemerle

Вывод типов 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 Перевод 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

Nemerle