68
Метапрограммирование в .NET Nemerle 1

Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Embed Size (px)

Citation preview

Page 1: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

 

 

 

Метапрограммирование в .NET 

Nemerle    

Page 2: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Обо мне  

Александр Зимин https://github.com/ziaw 

 

.NET / Ruby   тимлид/архитектор/предприниматель 

 

Page 3: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Nemerle  Мультипарадигменныйязык общего назначения для платформы .NET. 

 

Разработка языка началась в 2003 году в университете Вроцлава (Польша). 

Page 4: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Lord Nemmerle was Archmage 

 Lord Nemmerle was Archmage, Warder of the School for Wizards on Roke Island. 

 

He has a pet raven and wears white robes. 

   Ursula Le Guin    

   

Page 5: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Nemerle ­ язык будущего 

 

Page 6: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Эволюция C# (37 features) Version  Year  Features 

C# 

2.0 

200

Generics, Partial types, Anonymous methods, Iterators, Nullable types, Private setters (properties), Method group conversions (delegates), Covariance and Contra­variance, Static classes 

C# 

3.0 

200

Implicitly typed local variables, Object and collection initializers, Auto­Implemented properties, Anonymous types, Extension methods, Query expressions, Lambda expressions, Expression trees, Partial Methods 

C# 

4.0 

201

0 Dynamic binding (late binding), Named and optional arguments, Generic co­ and contravariance 

C# 

5.0 

201

Async features 

Caller information 

C# 

6.0 

201

Initializers for auto­properties, Getter­only auto­properties, Expression­bodied function members, Expression bodies on method­like members, Expression bodies on property­like function members, Using static, Null­conditional operators, String interpolation, nameof, Index initializers, Exception filters, Await in catch and finally blocks, Extension Add methods in collection initializers, Improved overload resolution 

Page 7: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

 

   

Page 8: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Nemerle 2004 года (21/37 57%) Versi

on Year Features 

C# 

2.0 2005  Partial types, Iterators, Nullable types, Private setters (properties) 

C# 

3.0 2008 

Object and collection initializers, Anonymous types, Extension methods, Query expressions, Partial Methods 

C# 

4.0 2010   

C# 

5.0 2012 

Async features 

Caller information 

C# 

6.0 2015 

Initializers for auto­properties, Getter­only auto­properties, nameof, Index initializers, Await in catch and finally blocks, Extension Add methods in collection initializers 

Page 9: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

 

   

Page 10: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Минус возможности расширения в 2004 (24/37 65%) Versi

on Year  Features 

C# 

2.0 2005  Partial types, Iterators, Nullable types, Private setters (properties) 

C# 

3.0 2008  Extension methods, Partial Methods 

C# 

4.0 2010   

C# 

5.0 2012 

Async features 

Caller information 

C# 

6.0 2015 

Initializers for auto­properties, Await in catch and finally blocks, Extension Add methods in collection initializers 

 

   

10 

Page 11: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Минус возможности C# поддерживаемые Nemerle на текущий момент (34/37) 

Versi

on Year Features 

C# 

2.0 

200

5  

C# 

3.0 

200

8 Partial Methods 

C# 

4.0 

201

0  

C# 

5.0 

201

Async features 

Caller information 

C# 

6.0 

201

5 Await in catch and finally blocks 

11 

Page 12: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

 

 

   

12 

Page 13: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Это все прошлое, где будущее? 

   

13 

Page 14: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

C# 7  

• Tuples • Pattern matching • Records/ADTs • Nullability tracking • Async streams and disposal, Strongly typed access to wire formats, More support for expression trees (statements, more expressions),  Syntax for lists, Immutable types, Type providers, Existing or other ways of adding attributes, Method contracts, Local functions 

 

 

14 

Page 15: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Nemerle сейчас •Tuples •Pattern matching •Records/ADTs 

More support for expression trees (statements, more expressions),  Syntax for lists, Existing or other ways of adding attributes, Local functions 

 

 

Immutable types, Type providers делаются на макрросах 

15 

Page 16: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Мультипарадигменный язык  

  

 Nemerle = OOP + FP + MP 

  

Nemerle = C# + F# + Lisp(?)  

   16 

Page 17: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Nemerle больше всего похож на C# C#           Nemerle 

17 

Page 18: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Дополнительные примитивные типы       

 

 

   

18 

Page 19: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Дополнительные примитивные типы  

 

 

 

 

 

   

19 

Page 20: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Дополнительные примитивные типы  

 

 

 

20 

Page 21: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Вывод типов Хиндли­Милнера    

 

21 

Page 22: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Локальные функции и вывод типов   

 

22 

Page 23: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Ключевые функциональные возможности F#  

 

   

23 

Page 24: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Все есть выражение. Expression rather then statement.  

 

 

   

24 

Page 25: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Все есть выражение. Expression rather then statement.  

 

 

   

25 

Page 26: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

 

Все есть выражение. Expression rather then statement.  

 

   

26 

Page 27: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Все есть выражение. Expression rather then statement.     

    

 

   

27 

Page 28: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Все есть выражение. Expression rather then statement.  

 

 

 

 

 

 

 

 

 

 

28 

Page 29: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Паттерн матчинг   

   

29 

Page 30: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Примеры паттернов  

 

 

30 

Page 31: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Примеры паттернов. Литерал.  

 

 

   

31 

Page 32: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Примеры паттернов.  Переменная. 

 

   

32 

Page 33: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Примеры паттернов.  Кортеж.    

 

   

33 

Page 34: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Примеры паттернов. Класс. 

 

   

34 

Page 35: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

 

Алгебраические типы данных  

 

 

35 

Page 36: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

ATD и паттерн матчинг    

 

 

   36 

Page 37: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

ATD и паттерн матчинг  

 

37 

Page 38: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Example: Immutable binary tree  

 

38 

Page 39: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Функциональный тип и операции над ним  

 

 

39 

Page 40: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Частичное применение      

 

 

 

40 

Page 41: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Композиция  

 

 

41 

Page 42: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Конвейер 

 

 

42 

Page 43: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Метапрограммирование 

 43 

Page 44: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

 

     

Метапрограммирование  

● Параметрический полиморфизм (generics) ● Кодогенерация ● Domain Specific Languages ● Анализ кода, compile­time проверки 

 

   

44 

Page 45: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Метапрограммирование в Nemerle  

 

● Код, который запускается во время компиляции и генерирует основной код 

● Код, который может анализировать и модифицировать компилируемый код 

● Синтаксические расширения для языка 

 

   

45 

Page 46: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Генерация кода 

 T4  Дерево выражений 

  

 

46 

Page 47: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Генерация кода 

 T4  Дерево выражений 

  

При усложнении код превращается в лапшу  

Объем кода генератора в разы превышает генерируемый. Плохая 

читабельность. 

47 

Page 48: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Квазицитирование! 

 Дерево выражений  Квазицитата 

 

 

   

48 

Page 49: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Код, который запускается во время компиляции 

 

   

49 

Page 50: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Макрос  

 

 

 

 

50 

Page 51: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Использование макроса     

 

51 

Page 52: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Параметры в квазицитатах      

 

 

 

   

52 

Page 53: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Делаем цикл  

 

53 

Page 54: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Используем цикл   

 

   

54 

Page 55: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Расширяем синтаксис  

 

 

Так гораздо лучше 

   

55 

Page 56: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Макрооператор  

   

56 

Page 57: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Макроатрибут  

   

57 

Page 58: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

 

Квазицитирование. Разбор выражения. 

 Дерево выражений  Квазицитата 

  

 

   

58 

Page 59: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Зачем нужны DSL и расширение синтаксиса? 

 

   59 

Page 60: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Примеры DSL: JSON  

 

60 

Page 61: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Примеры DSL: Nemerle.PEG  

 

   

61 

Page 62: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Примеры DSL: Nemerle.Web 

 http://www.nemerleweb.com/ 

62 

Page 63: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Примеры DSL: конструктор отчетов  

   

63 

Page 64: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Nemerle Pad 

 https://github.com/ziaw/npad 

   

64 

Page 65: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Недостатки Nemerle  

● Медленный компилятор ● Слабая и разрозненная документация ● Сбои в интеграции Visual Studio ● Малое количество макробиблиотек для  

 

 

65 

Page 66: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Достоинства Nemerle  

● Генерация кода ● Простота при переходе с C# ● Возможности полноценного функционального языка 

● Выразительность и красота кода (субъективно) 

● Расширение синтаксиса 

 

 

66 

Page 67: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Будущее Nemerle – Nitra     

    

    

67 

Page 68: Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET

Спасибо!   

http://nemerle.org/  

https://github.com/rsdn/nemerle  

http://rsdn.ru/?forum/nemerle/  

  

68