SlideShare ist ein Scribd-Unternehmen logo
1 von 66
Downloaden Sie, um offline zu lesen
Как это работает: DLR
dynamic тип в C# или “прорывное” направление в .NET
...важно сконцентрировать имеющиеся ресурсы
на основных прорывных направлениях…
В.В. Путин
Игорь Яковлев
iyakovlev@ptsecurity.com
Зачем нужен DLR?
C#
VB
Ruby
Python
Динамические
Статические
● Новый способ Interop
● Позволяет использовать динамическую типизацию в C#
Свойства типа dynamic в C#
dynamic объект - принимает значения любого типа
dynamic - ссылочный “тип”
dynamic - объект может учавствовать в любом* выражении C#
тип выражения с dynamic - dynamic*
код для выражений с объектом dynamic создается динамически*
типизация dynamic объектов: динамическая
Однако
Вследствие того, что dynamic является не “родным” для C#, можно всегда немного
потроллить компилятор:
new dynamic(); //compile time error
T Foo<T>() where T : new()
{
return new T();
}
…
var variable = Foo<dynamic>(); //будет new object()
DLR - dynamic language runtime
DLR
входит в .Net Framework
(начиная с версии 4.0)
предоставляет API для
выполнения программ
одного языка в другом
операции над
объектами с типами
которые неизвестны на
этапе компиляции
¬DLR
не является частью CLR
не подразумевает его
поддержку языком
не вводит в CLR/Framework новых типов
(dynamic - ключевое слово)
DLR
Картинка скачанная из интернета:
Пример работы с DLR из C#
Пример работы с DLR из C#
Пример работы с DLR из C#
Пример работы с DLR из C#
Запускаем, получаем:
Python is saying hello: Hello from CSharp
Linq Expression Tree
Как написать программу в Runtime?
LINQ Expression Trees
Деревья выражений представляют код в виде деревьев, где каждая вершина - выражение.
Expression.Add
Expression.Constant(2) Expression.Constant(3)
Выражение 2+3:
Пример:
Статически скомпилированная функция:
Функция собранная из Expression Tree:
Результат:
Как работает DLR?
Что происходит когда ты пишешь dynamic в С#
Вооружаемся дизассемблером :)
Сравним код для статического типа и динамического
Ну в первом примере все просто
Перепишем код для a+b на C#:
Перепишем код для a+b на C#:
Фабрика байндера
двоичной операции
Фабрика CallSiteАнонимный класс с полем CallSite - синглтон
Статическая
информация
Результат динамической операции
Делегат динамической операции
System.Runtime.CompilerServices.CallSite<T>
Тот парень который знает что вызывать
Что такое CallSite
Кэширует динамические операции (часть реализации Polymorphic Inline Cache)
Содержит операцию необходимую для выполнения динамического вызова
Создает заглушки для динамических вызовов (делегат Update)
Обращается к байндеру динамических вызовов
CallSite снаружи
T - Сигнатура операции
Делегат операции
Делегат обновления
Фабрика CallSite
Что может Target:
Выполнить проверку своих аргументов на совместимость с операцией
Выполнить динамическую операцию
Сообщить вызвавшему CallSite результат проверки и операции
TARGET
Какой тип у Target?!
Target
= Action<T1,T2[,T3…]>
= Func<T1,T2[,T3…],TResult>
T1 - CallSite
T2 - Ресивер
[T3,...] - Аргументы
TResult - Результат
“a+b” - ресивер “a”
“A.b()” - ресивер typeof(A)
“c.Foo()” - ресивер “c”
(MulticastDelegate)
.If ($var1 .TypeEqual System.Int32 && $var2 .TypeEqual System.Int32 && $var2 == 2)
{
.Return { (System.Object)($var1 + 2) }
} .Else
{
$callsite.Update()
.Return { .Default(System.Int32) }
}
Какой код внутри Target?
Restriction expression
Ограничение операции
Body expression
Тело операции
Target - это .Net Expressions Tree v2 скомпилированный в лямбду
Пусть Target сгенерирован для операции “a+2”, где a - Int32
Что происходит при вызове Target(...)
Правила (Rules)
Restriction expression
Ограничение операции
Body expression
Тело операции
Rule
Правило
Комбинация ограничения и тела называется правилом (Rule)
Динамический делегат - скомпилированное правило
Откуда берутся правила?!
Polymorphic Inline Cache (PIC) Binders
Правила (в виде скомпилированных делегатов)
CallSite берет из нескольких мест
PIC - кэш правил
Level 0: Текущий Target у CallSite (объем кэша - 1 правило)
Level 1: Массив делегатов у CallSite (объем кэша - до 10 правил)
Level 2: Словарь кешей в байдере из CallSite
(Ключ - тип правила, Значение - массив из 128 правил)
DLR PIC - трехуровневый кэш правил (делегатов)
Binders
или начало нашего путешествия по DLR...
Байндеры
Байндер (Binder)
Статическая информация о
динамическом выражении
Набор Bind-методов возвращающих
правило для переданных аргументов
(LINQ Expression Tree v2)
PIC Cache Level 2
FallBack методы
Высшая миссия Байндера
Байндер (Binder)
Набор информации для описания
действия которое должно быть
выполнено
Прокладка между резолвером
динамических операций и CallSite
Иерархия инфраструктуры DLR (для C#)
1. Пытается получить готовый делегат через BindDelegate, либо
2. Получает правило в виде Expression Tree через вызов Bind
3. Компилирует правило в делегат и добавляет его в PIC Level 2
abstract CallSiteBinder - базовый байндер
T BindCore<T>(CallSite<T> site, object[] args)
abstract Expression Bind(object[] args, + параметры для Expression Tree)
T virtual BindDelegate<T>(CallSite<T> site, object[] args)
abstract DynamicMetaObjectBinder
abstract DynamicMetaObject Bind(DynamicMetaObject reciever, DynamicMetaObject[] args)
1. Сопоставляет аргументы args их “оберткам” типа
DynamicMetaObject (DMO) через DynamicMetaObject.Create(arg)
2. Выделяет первый аргумент (типа DMO) как ресивер
3. Получает DMO с правилом через вызов Bind
4. Строит из DMO выражение .If (Restriction) .Then (.Return Body) ...
sealed override Expression Bind(object[] args, + параметры для E.T.)
12 Разгневанных байндеров
DLR поддерживает 12 типов выражений
Convert
CreateInstance
DeleteIndex
DeleteMember
GetIndex
GetMember
Invoke
InvokeMember
SetIndex
SetMember
UnaryOperation
BinaryOperation
Для каждого выражения есть байндер
унаследованный от DMOBinder
Для краткости функции и байндеры с
__XXX__ в имени заменяются на имена
из этого списка
abstract class __XXX__Binder
Возвращает reciever.Bind__XXX__(this, args)
override sealed DMO Bind(DMO reciever, DMO[] args)
abstract DMO Fallback__XXX__(DMO target, DMO arg1, [ DMO arg2…,] DMO errorSuggestion)
Возвращает Fallback__XXX__(reciever, arg1 [,arg2], null)
DMO Fallback__XXX__(DMO reciever, DMO argDMO arg1 [,DMO arg2...])
sealed CSharp__XXX__Binder
Вызывает некий RuntimeBinder :)
override sealed DMO Fallback__XXX__(DMO reciever, DMO arg, [DMO arg2...,] DMO errorSuggestion)
И это последний байндер в иерархии
И чего?! oO
Остались главные вопросы
Что это за бред?
Что такое DynamicMetaObject (DMO)?
Как из нашего object получается его DMO?
Что такое FallBack?
Кем составляются правила?!
Кому нужен IDynamicMetaObjectProvider?
DynamicMetaObject (DMO)
Ограничение правила (результат)
Обернутое значение
Тело правила (результат)
12 разгневанных байндер-методов
Оборачивает объект в DMO
DynamicMetaObject.Create
Дак тут же вроде просто?
Привелось? Просим вернуть
Не привелось? Оборачиваем собой
Приводим...
IDynamicMetaObjectProvider
Этот скучный парень просто возвращает DynamicMetaObject
DynamicMetaObject GetMetaObject(Expression parameter)
Если наш объект поддерживает этот интерфейс то
для объекта можно получить DynamicMetaObject!
DynamicMetaObject::Bind__XXX__
Все 12 разгневанных байндер-методов DMO вызывают FallBack у байндера который его вызвал ;)
Ну ок, идем обратно
в байдер в метод
Fallback__XXX__ Однако они virtual...хмммм
CSharp__XXX__Binder
Подозрительный парниша!
Конструктор языкового байдера
Fallback-метод
RuntimeBinder - много много кода
RuntimeBinder
Парень которого нет в MSDN :)
Мы не будем приводить уважаемой публике содержание этого треша
Содержит реализацию семантического Reflection анализатора .Net
Этот парень умеет строить правила для стандартных типов .Net
Но ведь типы...эмм...не всегда стандартные!?
А если объект из Python?
“О”
- объеденим!
Еще раз...
Попробуем вспомнить, что происходило и кто кого чего...
Кто такой CallSite?
Кто такие байндеры?
Кто такой DMO?
Помоги Даше найти смысл жизни...
Выражение с dynamic CallSite.Target(...) CallSite.UpdateAndExecute PIC
CallSiteBinder
Выполнение выражения
DMOBinder__XXX__Binder
reciever.Bind__XXX__(...) CSharp__XXX__Binder.FallBack
аргументы в DMO
Простой пример!
Что напечатает программа?
Простой пример!
Что напечатает программа?
Реализация MyClass
Что напечатает программа?
Реализация MyDMO:
Ответ
Очевидно 42 :)
У нас будет свой язык с коллсайтом и байндерами
Кастомный байндер
Что мы упустили?
да, там есть еще что-то (:
Что НЕ вошло в доклад
Классы не являющиеся частью прям-ваще реализации (ExpandoObject и DynamicObject)
Как конкретно происходит построение выражений (лучше не надо :))
Как реализовано взаимодействие с COM (вкраце - COM IDispatch)
Что такое и как работает DLR Hosting API (тема на отдельный доклад)
Оказывается там есть еще SymPL (целый функциональный язык в спецификации)
Реализацию многих мелких деталей (Defer, Stitch, генерацию UpdateAndExecute и тп)
Куда гуглить
Можно в гугле - есть статьи но мало
C# 5 Unleashed - Bart De Smet (на самом деле средненько)
Pro DLR in .NET 4 - Chaur Wu (поверхностно)
habrahabr - есть пара статей (и вся пара - не очень)
dlr.codeplex.com - developer notes (очень хорошо!)
В исходники и дебаггер - довольно полное раскрытие темы
Можно спросить меня: linkedin.com/in/igoriakovlev
Доклад Карлена Симоняна на .NeXT 2014: bit.do/DLR_lecture
Поиграть с примерами: bit.do/DLR_examples
Успех :)

Weitere ähnliche Inhalte

Was ist angesagt?

Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типовcorehard_by
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and catscorehard_by
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Dima Dzuba
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 

Was ist angesagt? (20)

Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
JavaScript Intro
JavaScript IntroJavaScript Intro
JavaScript Intro
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Clojure #1
Clojure #1Clojure #1
Clojure #1
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 

Ähnlich wie Как это работает: DLR

Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs ReflectionDenis Tsvettsih
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeSQALab
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentationsef2009
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6Technopark
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorDevGAMM Conference
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьAndrey Bibichev
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptDmytro Mindra
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript Dmytro Mindra
 
Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4Bars Group
 
язык програмирования
язык програмированияязык програмирования
язык програмированияOlegmingalev1997
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложенийAndrew Mayorov
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETGoSharp
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM LevelNikita Lipsky
 

Ähnlich wie Как это работает: DLR (20)

Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentation
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
 
Deep Dive in Magento DI
Deep Dive in Magento DIDeep Dive in Magento DI
Deep Dive in Magento DI
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
 
Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 
Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложений
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM Level
 

Mehr von Mikhail Shcherbakov

Mythbusters - Web Application Security
Mythbusters - Web Application SecurityMythbusters - Web Application Security
Mythbusters - Web Application SecurityMikhail Shcherbakov
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Mikhail Shcherbakov
 
Apache Ignite.NET в действии
Apache Ignite.NET в действииApache Ignite.NET в действии
Apache Ignite.NET в действииMikhail Shcherbakov
 
Архитектура Apache Ignite .NET
Архитектура Apache Ignite .NETАрхитектура Apache Ignite .NET
Архитектура Apache Ignite .NETMikhail Shcherbakov
 
Знакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridЗнакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridMikhail Shcherbakov
 
сценарии использования статического анализатора
сценарии использования статического анализаторасценарии использования статического анализатора
сценарии использования статического анализатораMikhail Shcherbakov
 
WCF. Легко или проблемно
WCF. Легко или проблемноWCF. Легко или проблемно
WCF. Легко или проблемноMikhail Shcherbakov
 
Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Mikhail Shcherbakov
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3. Mikhail Shcherbakov
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаMikhail Shcherbakov
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationMikhail Shcherbakov
 
Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETMikhail Shcherbakov
 
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахИспользование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахMikhail Shcherbakov
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.Mikhail Shcherbakov
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийMikhail Shcherbakov
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++Mikhail Shcherbakov
 
Visual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging ToolsVisual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging ToolsMikhail Shcherbakov
 

Mehr von Mikhail Shcherbakov (20)

Mythbusters - Web Application Security
Mythbusters - Web Application SecurityMythbusters - Web Application Security
Mythbusters - Web Application Security
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
Apache Ignite.NET в действии
Apache Ignite.NET в действииApache Ignite.NET в действии
Apache Ignite.NET в действии
 
Архитектура Apache Ignite .NET
Архитектура Apache Ignite .NETАрхитектура Apache Ignite .NET
Архитектура Apache Ignite .NET
 
Знакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridЗнакомство с In-Memory Data Grid
Знакомство с In-Memory Data Grid
 
сценарии использования статического анализатора
сценарии использования статического анализаторасценарии использования статического анализатора
сценарии использования статического анализатора
 
WCF. Легко или проблемно
WCF. Легко или проблемноWCF. Легко или проблемно
WCF. Легко или проблемно
 
Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
 
Project Rider
Project RiderProject Rider
Project Rider
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Structured logging
Structured loggingStructured logging
Structured logging
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentation
 
Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NET
 
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахИспользование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектах
 
Sandboxing in .NET CLR
Sandboxing in .NET CLRSandboxing in .NET CLR
Sandboxing in .NET CLR
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
 
Visual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging ToolsVisual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging Tools
 

Как это работает: DLR

  • 1.
  • 2. Как это работает: DLR dynamic тип в C# или “прорывное” направление в .NET ...важно сконцентрировать имеющиеся ресурсы на основных прорывных направлениях… В.В. Путин Игорь Яковлев iyakovlev@ptsecurity.com
  • 3. Зачем нужен DLR? C# VB Ruby Python Динамические Статические ● Новый способ Interop ● Позволяет использовать динамическую типизацию в C#
  • 4. Свойства типа dynamic в C# dynamic объект - принимает значения любого типа dynamic - ссылочный “тип” dynamic - объект может учавствовать в любом* выражении C# тип выражения с dynamic - dynamic* код для выражений с объектом dynamic создается динамически* типизация dynamic объектов: динамическая
  • 5. Однако Вследствие того, что dynamic является не “родным” для C#, можно всегда немного потроллить компилятор: new dynamic(); //compile time error T Foo<T>() where T : new() { return new T(); } … var variable = Foo<dynamic>(); //будет new object()
  • 6. DLR - dynamic language runtime DLR входит в .Net Framework (начиная с версии 4.0) предоставляет API для выполнения программ одного языка в другом операции над объектами с типами которые неизвестны на этапе компиляции
  • 7. ¬DLR не является частью CLR не подразумевает его поддержку языком не вводит в CLR/Framework новых типов (dynamic - ключевое слово) DLR
  • 12. Пример работы с DLR из C# Запускаем, получаем: Python is saying hello: Hello from CSharp
  • 13. Linq Expression Tree Как написать программу в Runtime?
  • 14. LINQ Expression Trees Деревья выражений представляют код в виде деревьев, где каждая вершина - выражение. Expression.Add Expression.Constant(2) Expression.Constant(3) Выражение 2+3:
  • 19. Как работает DLR? Что происходит когда ты пишешь dynamic в С#
  • 20. Вооружаемся дизассемблером :) Сравним код для статического типа и динамического
  • 21. Ну в первом примере все просто
  • 22.
  • 24. Перепишем код для a+b на C#: Фабрика байндера двоичной операции Фабрика CallSiteАнонимный класс с полем CallSite - синглтон Статическая информация Результат динамической операции Делегат динамической операции
  • 26. Что такое CallSite Кэширует динамические операции (часть реализации Polymorphic Inline Cache) Содержит операцию необходимую для выполнения динамического вызова Создает заглушки для динамических вызовов (делегат Update) Обращается к байндеру динамических вызовов
  • 27. CallSite снаружи T - Сигнатура операции Делегат операции Делегат обновления Фабрика CallSite
  • 28. Что может Target: Выполнить проверку своих аргументов на совместимость с операцией Выполнить динамическую операцию Сообщить вызвавшему CallSite результат проверки и операции TARGET
  • 29. Какой тип у Target?! Target = Action<T1,T2[,T3…]> = Func<T1,T2[,T3…],TResult> T1 - CallSite T2 - Ресивер [T3,...] - Аргументы TResult - Результат “a+b” - ресивер “a” “A.b()” - ресивер typeof(A) “c.Foo()” - ресивер “c” (MulticastDelegate)
  • 30. .If ($var1 .TypeEqual System.Int32 && $var2 .TypeEqual System.Int32 && $var2 == 2) { .Return { (System.Object)($var1 + 2) } } .Else { $callsite.Update() .Return { .Default(System.Int32) } } Какой код внутри Target? Restriction expression Ограничение операции Body expression Тело операции Target - это .Net Expressions Tree v2 скомпилированный в лямбду Пусть Target сгенерирован для операции “a+2”, где a - Int32
  • 31. Что происходит при вызове Target(...)
  • 32. Правила (Rules) Restriction expression Ограничение операции Body expression Тело операции Rule Правило Комбинация ограничения и тела называется правилом (Rule) Динамический делегат - скомпилированное правило
  • 33. Откуда берутся правила?! Polymorphic Inline Cache (PIC) Binders Правила (в виде скомпилированных делегатов) CallSite берет из нескольких мест
  • 34. PIC - кэш правил Level 0: Текущий Target у CallSite (объем кэша - 1 правило) Level 1: Массив делегатов у CallSite (объем кэша - до 10 правил) Level 2: Словарь кешей в байдере из CallSite (Ключ - тип правила, Значение - массив из 128 правил) DLR PIC - трехуровневый кэш правил (делегатов)
  • 35. Binders или начало нашего путешествия по DLR...
  • 36. Байндеры Байндер (Binder) Статическая информация о динамическом выражении Набор Bind-методов возвращающих правило для переданных аргументов (LINQ Expression Tree v2) PIC Cache Level 2 FallBack методы
  • 37. Высшая миссия Байндера Байндер (Binder) Набор информации для описания действия которое должно быть выполнено Прокладка между резолвером динамических операций и CallSite
  • 39. 1. Пытается получить готовый делегат через BindDelegate, либо 2. Получает правило в виде Expression Tree через вызов Bind 3. Компилирует правило в делегат и добавляет его в PIC Level 2 abstract CallSiteBinder - базовый байндер T BindCore<T>(CallSite<T> site, object[] args) abstract Expression Bind(object[] args, + параметры для Expression Tree) T virtual BindDelegate<T>(CallSite<T> site, object[] args)
  • 40. abstract DynamicMetaObjectBinder abstract DynamicMetaObject Bind(DynamicMetaObject reciever, DynamicMetaObject[] args) 1. Сопоставляет аргументы args их “оберткам” типа DynamicMetaObject (DMO) через DynamicMetaObject.Create(arg) 2. Выделяет первый аргумент (типа DMO) как ресивер 3. Получает DMO с правилом через вызов Bind 4. Строит из DMO выражение .If (Restriction) .Then (.Return Body) ... sealed override Expression Bind(object[] args, + параметры для E.T.)
  • 41. 12 Разгневанных байндеров DLR поддерживает 12 типов выражений Convert CreateInstance DeleteIndex DeleteMember GetIndex GetMember Invoke InvokeMember SetIndex SetMember UnaryOperation BinaryOperation Для каждого выражения есть байндер унаследованный от DMOBinder Для краткости функции и байндеры с __XXX__ в имени заменяются на имена из этого списка
  • 42. abstract class __XXX__Binder Возвращает reciever.Bind__XXX__(this, args) override sealed DMO Bind(DMO reciever, DMO[] args) abstract DMO Fallback__XXX__(DMO target, DMO arg1, [ DMO arg2…,] DMO errorSuggestion) Возвращает Fallback__XXX__(reciever, arg1 [,arg2], null) DMO Fallback__XXX__(DMO reciever, DMO argDMO arg1 [,DMO arg2...])
  • 43. sealed CSharp__XXX__Binder Вызывает некий RuntimeBinder :) override sealed DMO Fallback__XXX__(DMO reciever, DMO arg, [DMO arg2...,] DMO errorSuggestion) И это последний байндер в иерархии
  • 44. И чего?! oO Остались главные вопросы Что это за бред? Что такое DynamicMetaObject (DMO)? Как из нашего object получается его DMO? Что такое FallBack? Кем составляются правила?! Кому нужен IDynamicMetaObjectProvider?
  • 45. DynamicMetaObject (DMO) Ограничение правила (результат) Обернутое значение Тело правила (результат) 12 разгневанных байндер-методов Оборачивает объект в DMO
  • 46. DynamicMetaObject.Create Дак тут же вроде просто? Привелось? Просим вернуть Не привелось? Оборачиваем собой Приводим...
  • 47. IDynamicMetaObjectProvider Этот скучный парень просто возвращает DynamicMetaObject DynamicMetaObject GetMetaObject(Expression parameter) Если наш объект поддерживает этот интерфейс то для объекта можно получить DynamicMetaObject!
  • 48. DynamicMetaObject::Bind__XXX__ Все 12 разгневанных байндер-методов DMO вызывают FallBack у байндера который его вызвал ;) Ну ок, идем обратно в байдер в метод Fallback__XXX__ Однако они virtual...хмммм
  • 50. RuntimeBinder - много много кода
  • 51. RuntimeBinder Парень которого нет в MSDN :) Мы не будем приводить уважаемой публике содержание этого треша Содержит реализацию семантического Reflection анализатора .Net Этот парень умеет строить правила для стандартных типов .Net Но ведь типы...эмм...не всегда стандартные!?
  • 52. А если объект из Python?
  • 54. Еще раз... Попробуем вспомнить, что происходило и кто кого чего... Кто такой CallSite? Кто такие байндеры? Кто такой DMO?
  • 55. Помоги Даше найти смысл жизни... Выражение с dynamic CallSite.Target(...) CallSite.UpdateAndExecute PIC CallSiteBinder Выполнение выражения DMOBinder__XXX__Binder reciever.Bind__XXX__(...) CSharp__XXX__Binder.FallBack аргументы в DMO
  • 61. У нас будет свой язык с коллсайтом и байндерами
  • 63. Что мы упустили? да, там есть еще что-то (:
  • 64. Что НЕ вошло в доклад Классы не являющиеся частью прям-ваще реализации (ExpandoObject и DynamicObject) Как конкретно происходит построение выражений (лучше не надо :)) Как реализовано взаимодействие с COM (вкраце - COM IDispatch) Что такое и как работает DLR Hosting API (тема на отдельный доклад) Оказывается там есть еще SymPL (целый функциональный язык в спецификации) Реализацию многих мелких деталей (Defer, Stitch, генерацию UpdateAndExecute и тп)
  • 65. Куда гуглить Можно в гугле - есть статьи но мало C# 5 Unleashed - Bart De Smet (на самом деле средненько) Pro DLR in .NET 4 - Chaur Wu (поверхностно) habrahabr - есть пара статей (и вся пара - не очень) dlr.codeplex.com - developer notes (очень хорошо!) В исходники и дебаггер - довольно полное раскрытие темы Можно спросить меня: linkedin.com/in/igoriakovlev Доклад Карлена Симоняна на .NeXT 2014: bit.do/DLR_lecture Поиграть с примерами: bit.do/DLR_examples