IronRuby: внутренности и примеры использования Рахматиллаев Тимур IndyCode 3-я конференция.NET разработчиков 25 сентября 2011
Ruby – он такой… Динамический Рефлективный Интерпретируемый Объектно-ориентированный С динамической и утиной типизациями Развитые механизмы метапрограммирования
Железные рубины из копей Microsoft IronRuby – реализация языка программирования Ruby на платформе Microsoft.NET, основанная на использовании библиотеки DLR.
Нужно больше динамики! Dynamic Language Runtime (DLR) – библиотека, предоставляющая сервисы для реализации спецификации любого языка программирования. Основана на подходе представления функциональности конструкций языка с помощью узлов абстрактного синтаксического дерева.
DLR и IronRuby IronRuby Программа на Ruby Синтаксический разбор текста DLR ТекстAST FCL/BCL Binder CIL-код ВМ CLR Выполнение CIL-кода
Возможности DLR
Взгляд на Ruby со стороны
Вызов кода на IronRuby из.NET (C#) Создание экземпляра среды исполнения IronRuby Загрузка файлов с кодом (и их выполнение) или выполнение строк кода Операции вызова методов, получения объектов, работы с переменными (локальными и глобальными)
Можно все!
А если наоборот? Загружаем необходимую сборку (сборки) Создаем экземпляры CLR-классов и вызываем их методы ????? PROFIT Можно использовать методы расширения и грабить корованы
Когда использовать IronRuby
Рост сложности программной системы На начальном этапе разработки всю систему легко удержать в голове Объем кода, реализующего логику бизнес- процессов, растет Выделение новых слоев абстракции не дает четкого видения логики из-за недостаточности выразительных средств
Головокружительная абстракция
Domain Specific Language Позволяет задавать правила поведения объектов в соответствии с бизнес-логикой в декларативном представлении Качественно новый уровень абстракции Сложность/простота определения решения задачи, стоящей перед DSL, полностью зависит от выразительности его синтаксических средств
IronRuby как SDK для создания DSL Процесс написания DSL (с нуля): Определение абстрактного синтаксиса Определение конкретного синтаксиса Определение правил горизонтальной и вертикальной трансформации Написание синтаксического анализатора и транслятора Возможно, написание интерпретатора
IronRuby как SDK для создания DSL Написание DSL с помощью IronRuby Определение конкретного синтаксиса
Описываем ферму ферма { морковка 2.шт баклажан 2.кг свинья уровень: 80 }
Итоги IronRuby позволяет быстро создавать языки предметной области Предоставляет механизмы синтаксического разбора исходного кода Осуществляет вертикальную трансформацию Имеет поддержку во многих редакторах Используя метапрограммирование можно добиться высокой гибкости и разнообразия языковых конструкций DSL
Это работает!
Проект Gestalt Silverlight-приложение, использующее DLR для предоставления возможности использовать IronRuby как замену JavaScript в качестве языка для работы с DOM-деревом
Ruby… в теге script?! def onclick(s,e) window.alert "Hello, World!" end document.sayhello.attach_event('onclick', System::EventHandler [ System::Windows::Browser::HtmlEventArgs ].new(method(:onclick)) )
Немного алхимии Используем Gestalt
Ссылки Сайт проекта IronRuby Сайт проекта Gestalt Раздел IronRuby на Ruby Forum
Спасибо за внимание Тимур Рахматиллаев IndyCode twitter.com/eskat0n