SlideShare a Scribd company logo
Opensourceна .NET 
И О ТИГРАХ НА РАВНИНЕ
Об авторе 
Павел Новиков 
Окончил (вранье!)НГУ ФИТ, когда-то в прошлом 
Работает: фриланситна C#/.NET 
На досуге: ваяет свой opensource-проект 
Преподает: НГУ, IT-академия Сухорукова 
Любит: C#, Microsoft, ежей и хорошо поесть 
Skype: nsu_the_cjay 
Email: pavel.b.novikov@gmail.com
Суть™ 
.NET(читается «дот-нет»)Framework 
это набор инструментов для разработки программного обеспечения (программный каркас) от Microsoft. Да-да, тех самых, которые создали Windows. 
Это как STL или JRE. 
C♯(читается «си-шарп») 
это язык программирования, из которого можно быстро и удобно использовать все средства .NET Framework для создания самых разных приложений. Унаследовал многое от java, C++, C, так же имеет набор своих особенностей. 
Это как C++ или Java соответственно.
Как это все связано с Opensource?
Бытует мнение 
“The danger is that Microsoft is probably planning to force all free C# implementations underground some day using software patents.”(с) RMS
Бытует мнение 
“The danger is that Microsoft is probably planning to force all free C# implementations underground some day using software patents.”(с) RMS 
Этожевинда! Виндаглючная! 
Вендекапец! 
Акакжекроссплатформенность?!!
Бытует мнение 
“The danger is that Microsoft is probably planning to force all free C# implementations underground some day using software patents.”(с) RMS 
Ужасные расходы на лицензии 
Нужна лицензия на Visual Studio, ReSharper, и вообще на все, что делает Microsoft! Это дорого 
Этожевинда! Виндаглючная! 
Вендекапец! 
Акакжекроссплатформенность?!! 
Дорогой хостинг! 
ВСЕЗАДЕНЬГИ!! ПРОКЛЯТЫЕ КАПИТАЛИСТЫ-КОПИРАСТЫ!
Бытует мнение 
“The danger is that Microsoft is probably planning to force all free C# implementations underground some day using software patents.”(с) RMS 
Ужасные расходы на лицензии 
Нужна лицензия на Visual Studio, ReSharper, и вообще на все, что делает Microsoft! Это дорого 
Этожевинда! Виндаглючная! 
Вендекапец! 
Акакжекроссплатформенность?!! 
Дорогой хостинг! 
ВСЕЗАДЕНЬГИ!! ПРОКЛЯТЫЕ КАПИТАЛИСТЫ-КОПИРАСТЫ! 
Opensourceна продуктах Microsoft нет и быть не может!
Явление суслика народу
Явление суслика народу
Места скопления 
Спецпитомник, созданный Microsoft: www.codeplex.com 
Поддерживает Git, SVN, Mercurial, TFS 
Проектов –хренова туча, если кратко.
Места скопления 
Всеми любимый хипстерскийGitHub 
Рассказывать тут особо нечего –зайдите в Trending Repositories, сами все увидите
Места скопления 
SourceForge–статистика по C#-проектам выдает около 16 тыс. штук.
Коротко о самых известных 
Название 
Описание 
Ссылка 
Лицензия 
ASP.NETMVC 5 
Web-фреймворк, который полностьювытеснил классический WebForms 
https://aspnetwebstack.codeplex.com/ 
Apache License 
Prism 
WPF/MVVMфреймворк 
https://compositewpf.codeplex.com/ 
Apache 2.0 License 
EntityFramework 
ЛютыйORM, местами рвущий Hibernate по удобству 
https://entityframework.codeplex.com/ 
Apache 2.0 License 
Autofac 
Популярный маленький, удобный и быстрый IoC-контейнер 
https://github.com/autofac/Autofac 
MIT 
Automapper 
Удобныйи быстрый способ скопировать содержимое одного класса в другой 
http://automapper.org/ 
MIT 
Roslyn 
О нем далее 
https://roslyn.codeplex.com/ 
Apache 2.0 License 
Это первое, что пришло в голову. 
На самом деле проектов гораздо больше. 
Есть многоальтернатив, есть из чего выбрать и вообще.
Коротко о самых известных портах
Коротко о самых известных портах 
Название 
Описание 
Ссылка 
Лицензия 
NHibernate 
Впредставлениях не нуждается 
https://github.com/nhibernate 
LGPL 
NUnit 
Фреймворк дляunit-тестирования 
http://sourceforge.net/projects/nunit/ 
zlib/libpngLicense 
NVelocity 
ПортJakarta Velocity–шаблонизатор 
http://nvelocity.sourceforge.net/ 
Apache Software License 
Spring.NET 
Швейцарскийскладной нож, расширяющий возможности фреймворкав плане транзакций, IoC и много чего другого 
https://github.com/spring-projects/spring- net/ 
Apache 2.0 License 
NAnt 
Сборщикпроектов для тех, кто не освоил MSBuild 
http://nant.sourceforge.net/ 
GPL
Stratageme15 
ПОПЫТКА ПРИЛОЖИТЬ РУКУ К C#-ОПЕНСОРСУ
Проблематика 
◦Disclamer: Я не являюсь противником javascript! 
◦Команда дотнетчиковделает сайт на ASP.NET MVC и испытывает трудности с javascript-ом 
◦.NET-чикине умеют писать на javascript-е. У них слишком строго типизированное мышление 
◦Столкновение C#-программистов и javascriptведет к следующей боли: 
◦отсутствие строгой типизации, повышенная вероятность ошибок 
◦разрастание неструктурированного js-кода 
◦отсутствие productivitytool, что знатно замедляет работу 
◦отсутствие удобной документации "под рукой" (по jquery, DOM, Knockout.js) 
◦отсутствие средств для консолидации технологического опыта 
◦А вообще, конечно, черт с ним со всем, я просто хочу писать для web-а на C#, потому что люблю его. Должен же быть хоть какой-то аргумент к пафосу :)
Проблематика 
Типичный код C#-программиста наJS: 
•Функции в корне 
•Игнорирование прототипов 
•Игнорирование convention-овjQuery 
•Адское форматирование 
•Абсолютное неумение пользоваться замыканиями 
•Полный быдлокод, разврат и содомия
Решение 
Хочется писать на C#, используя возможности js-фреймворков(jQuery, underscoreetc) как интерфейсов 
Самая изюминка –в использовании LINQ, лямбда-выражений и встроенных коллекций 
Нужен транслятор! 
Возможностиязыковпримерносовпадаютвплотьдоключевыхслов. 
Следовательно, задача сводится к удобному способу трансляции обращений к фреймворками созданию удобных возможностей для преобразования существующего JS- кода в описания интерфейсов C#.
Как это работает? 
jquery-min.js 
JS Parser 
Синтаксическое дерево 
Прямые руки 
IJQuery 
Interfaces 
Translation Tactics
Как это работает? 
DOMv3.idl 
IDL Parser 
Структура IDL 
Прямые руки 
IDomWindow 
Interfaces 
Translation Tactics
Как это работает? 
IDE 
IDomWindow 
IJQuery 
.NET Framework
Как это работает? 
IDE 
IDomWindow 
IJQuery 
.NET Framework 
MyCoolScript.cs 
Csccompiler 
MyCoolScript.dll
Как это работает? 
IDE 
IDomWindow 
IJQuery 
.NET Framework 
MyCoolScript.cs 
Csccompiler 
MyCoolScript.dll 
Translator 
MyCoolScript.js
So what is Stratageme15? 
Translator 
IDL Parser 
JS Parser 
Интерфейсы 
Спеки 
Пакеты расширений 
Stratageme15
Почему название? 
«Тридцать шесть стратагем(кит.三十六計)—древнекитайский военный трактат. В более широком смысле, собрание неявных стратегических приёмов и система непрямых тактических ходов, используемая для достижения скрытой цели, получения преимущества и перехвата инициативы.» 
-Wikipedia 
«15. Сманить тигра с горы на равнину (調虎離山) 
Дождись срока, когда противник устанет. 
Используй кого-нибудь для того, чтобы заманить его в ловушку. 
Никогда не атаковать противника, преимущество которого в его позиции. Вместо этого выманить его с выигрышной позиции, тем самым отделяя от источника силы.» 
-Там же
Почему название? 
(режим повышенной четкости) 
Ну типа Javascript–это тигр, а мы его сманиваем на равнину – C#, где у нас больше преимуществ.
Deep dive 
ТЕХНИЧЕСКИЕ ВОПРОСЫ И ПРОБЛЕМЫ
Принцип работы парсера 
Coco/R –разработка ребят из университета г. Линц, что в Австрии 
◦Кто не знает –это генератор компиляторов. Такая штука, которая принимает на вход описание грамматики в EBNF (по факту –еще и с семантическими действиями)а на выходе выдает исходный код токенайзераи синтаксического анализатора 
◦Почему не ANTLR? «Так надо» (с) 
Грамматика, составленнаявручную по ECMA-262и собственным ощущениям. 
Разумеется, сварганен DOMдля кода –то есть набор классов со всеми синтаксическими нодами 
Для IDL –в процессе. Благо там она более-менее строго описана 
Приобщиться можно тут: 
https://github.com/pavel-b-novikov/Stratageme15/blob/master/CocoR/JavaScript.atg 
544 строки кода
Принцип работы парсера 
Сложные и интересные моменты: 
◦Javascript-регулярные выражения 
◦Вечно путались с делением. Проблема решена частичным переписыванием шаблона токенайзераот Coco/R–внедрен механизм возврата к началу выражения, если оно начало парситьсякак regex, но не должно бы 
◦Отсутствие точки с запятой как универсального разделителя операторов 
◦Внезапное осознание, что ЛЮБОЕ выражение JS является оператором 
◦Абсолютно адские self-calling functions и тернарные операторы 
◦И вообще не описанный в стандарте синтаксис в некоторых продуктах
Результат 
ПарситсясжатыйjQueryи много разных других фреймворков 
На скриншоте –кусок тулзыдля семантического вычленения интерфейсов. «Мы работаем над этим»
Принцип работы транслятора 
В целом -обычный обход в глубину синтаксического дерева. 
Исходник C# 
Парсер(Roslyn) 
Разобранный код –синтакс. дерево
Принцип работы транслятора 
ClassDeclaration 
MethodDeclaration 
Identifier 
ParameterList 
Block 
VariableDeclaration 
… 
PropertyDeclaration 
ClassDeclaration 
IfStatement 
WhileStatement 
… 
context = new Context(); 
while(!stackEmpty) 
{ 
node = stack.Pop(); 
reactor = Reactors.GetForNode(node); 
reactor.Process(node,context); 
} 
return context.ResultRoot; 
Репозиторийреакторов 
Тип текущего класса 
Указатель на результат 
Локальные переменные 
Текущий метод 
… 
Контекст трансляции
Ключевые особенности 
На каждый узел синтаксического дерева можно настроить разную реакцию в зависимости от имени класса, его типа, локальных переменных… Короче в зависимости от того, в каком месте кода этот узел находится. 
То есть просто писать в выходной JavaScript разный код. 
Сделать это можно не переписываятранслятор, а просто подключив к нему еще одну DLL. 
В этом и заключается основная ключевая особенность. Разработчик извне может легко повлиять на процесс трансляции, сгенерировав хоть 3 страницы кода взамен одного оператора C#. 
Это дает возможность очень легко писать расширения к транслятору для разных фреймворков, да и просто синтаксического сахара.
Ключевые особенности 
В комплекте с транслятором поставляется «базовый пакет» реакторов. 
Ну чтобы была возможность из коробки перевести хоть какой-то код – операторы, вызовы методов, объявления классов и т.п.
Промежуточные результаты
Промежуточные результаты
Промежуточные результаты
Промежуточные результаты
Промежуточные результаты
Промежуточные результаты 
Статика пока не доработана
Смертельный номер с тиграми 
Напишем вот такой код и поставим точку останова в трансляторе так, чтобы нам показали процесс трансляции вооотна этой строчке
Смертельный номер с тиграми 
В контексте локальных переменных видим все переменные и их типы. 
То есть работает type inference. Самописный. 
Оп!
Прогресс 
Translator 
IDL Parser 
JS Parser 
Интерфейсы 
Спеки 
Пакеты расширений 
Зеленым цветом я обозначил % завершенности частей проекта. Думаю, наглядно.
Что надо делать дальше? 
В хронологическом порядке: 
◦Разобраться с лямбда-выражениями и корректной трансляцией замыканий 
◦Поддержка статических классов 
◦Совершенствование системы расширений 
◦Поддержка коллекций .NET и LINQ на них 
◦Обертка в .exe, прикручивание параметров запуска/конфигурационных файлов 
◦Доработка инструментария импорта библиотек 
◦Импорт WebIDLдля браузерногоDOM 
◦Импорт jQueryи ряда других библиотек (Highcharts, Raphael, AngularJS, KnockoutJS)
Проблемы и родовые травмы 
В настоящее время испытываю некоторые проблемы с выводом типов аргументов лямбда- выражений и анонимных делегатов. Но это было сложно сделать даже спецам из JetBrains, по сему прошу снисхождения и терпения  
Проблема отладки. Дело в том, что отлаживать транслируемый код разработчикам тоже где-то надо будет. Это, пожалуй, самая серьезная проблема. Скорее всего пойду по пути GWT, сделав отдельное приложение для отладки полученного кода. Возможен вариант с организацией сервера отладки или подключения и эмуляции Trident.Но пока что я об этом предпочитаю не думать. 
Неизвестно пока что делать с Generic-классами и какое им найти место в созданной системе абстракций. То есть их не технически сложно транслировать, а сложно придумать во что их транслировать.
Вопросы?
Всем спасибо!

More Related Content

PPTX
История развития и применения CMS: Drupal и другие
PDF
Как взаимодействовать с графическими дизайнерами: готовим UI Kit / Артем Моло...
PDF
Kranonit s16 (python). sergey burma
PDF
JavaScript завтра / Сергей Рубанов (Exante Limited)
PDF
Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И...
PDF
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
PDF
SPA инструменты
PDF
Ігор Карпиленко — PHPStorm for drupal developer
История развития и применения CMS: Drupal и другие
Как взаимодействовать с графическими дизайнерами: готовим UI Kit / Артем Моло...
Kranonit s16 (python). sergey burma
JavaScript завтра / Сергей Рубанов (Exante Limited)
Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И...
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
SPA инструменты
Ігор Карпиленко — PHPStorm for drupal developer

What's hot (20)

PDF
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
PDF
Опыт разработки эффективного SPA
PPTX
Презентация «Drupal и SEO» с московской DrupalConf 2011
PDF
Кэширование в веб-приложениях: что? где? когда?
PDF
D2D Pizza JS Илья Беда "Куда мы все катимся?"
PDF
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
PDF
UI Kit and design developig workflow
PPTX
Chef @DevWeb
PDF
терминология vol.2
PPTX
Как быть с большими сайтами на Word press
PDF
Как мы делаем модули PHP в Badoo – Антон Довгаль
PDF
Терминология как основной способ поиска разработчиков или как не опозорится п...
PDF
Ликбез для HR'ов в IT
PPSX
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
PPTX
Какой фреймворк нам нужен для Web? Денис Цыплаков
PDF
Никита Цуканов - "Avalonia UI Cross-platform Open Source UI Framework"
PDF
Kranonit s16 (python). dmitry furzenko
PDF
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
PPT
Open Source Testing Framework: real project example and best practices
PPT
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
Опыт разработки эффективного SPA
Презентация «Drupal и SEO» с московской DrupalConf 2011
Кэширование в веб-приложениях: что? где? когда?
D2D Pizza JS Илья Беда "Куда мы все катимся?"
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
UI Kit and design developig workflow
Chef @DevWeb
терминология vol.2
Как быть с большими сайтами на Word press
Как мы делаем модули PHP в Badoo – Антон Довгаль
Терминология как основной способ поиска разработчиков или как не опозорится п...
Ликбез для HR'ов в IT
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
Какой фреймворк нам нужен для Web? Денис Цыплаков
Никита Цуканов - "Avalonia UI Cross-platform Open Source UI Framework"
Kranonit s16 (python). dmitry furzenko
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Open Source Testing Framework: real project example and best practices
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Ad

Similar to Opensource на .NET (20)

PPTX
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PPT
Platypus platform ivbit
PPTX
[DagCTF 2015] Hacking motivation
PDF
Цена ошибки
PPTX
Цена ошибки
PPTX
Статический анализ кода: борьба с удорожанием ошибок
PPTX
New Android NDK & JNI
PPTX
Принципы работы статического анализатора кода PVS-Studio
PPT
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
PPT
Git in Sky presentation @ HighLoad++ 2013
PDF
Андрей Карпов, Приватные байки от разработчиков анализатора кода
PDF
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
PPT
запахи кода
PDF
О сложностях программирования, или C# нас не спасет?
PDF
Эволюционный дизайн. Joker Students Day 2016
PDF
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
PDF
PVS-Studio vs Chromium
PPTX
Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...
PDF
Профессиональная разработка в суровом Enterprise
PDF
Архитектура в Agile: слабая связность
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
Platypus platform ivbit
[DagCTF 2015] Hacking motivation
Цена ошибки
Цена ошибки
Статический анализ кода: борьба с удорожанием ошибок
New Android NDK & JNI
Принципы работы статического анализатора кода PVS-Studio
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
Git in Sky presentation @ HighLoad++ 2013
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
запахи кода
О сложностях программирования, или C# нас не спасет?
Эволюционный дизайн. Joker Students Day 2016
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
PVS-Studio vs Chromium
Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...
Профессиональная разработка в суровом Enterprise
Архитектура в Agile: слабая связность
Ad

Opensource на .NET

  • 1. Opensourceна .NET И О ТИГРАХ НА РАВНИНЕ
  • 2. Об авторе Павел Новиков Окончил (вранье!)НГУ ФИТ, когда-то в прошлом Работает: фриланситна C#/.NET На досуге: ваяет свой opensource-проект Преподает: НГУ, IT-академия Сухорукова Любит: C#, Microsoft, ежей и хорошо поесть Skype: nsu_the_cjay Email: pavel.b.novikov@gmail.com
  • 3. Суть™ .NET(читается «дот-нет»)Framework это набор инструментов для разработки программного обеспечения (программный каркас) от Microsoft. Да-да, тех самых, которые создали Windows. Это как STL или JRE. C♯(читается «си-шарп») это язык программирования, из которого можно быстро и удобно использовать все средства .NET Framework для создания самых разных приложений. Унаследовал многое от java, C++, C, так же имеет набор своих особенностей. Это как C++ или Java соответственно.
  • 4. Как это все связано с Opensource?
  • 5. Бытует мнение “The danger is that Microsoft is probably planning to force all free C# implementations underground some day using software patents.”(с) RMS
  • 6. Бытует мнение “The danger is that Microsoft is probably planning to force all free C# implementations underground some day using software patents.”(с) RMS Этожевинда! Виндаглючная! Вендекапец! Акакжекроссплатформенность?!!
  • 7. Бытует мнение “The danger is that Microsoft is probably planning to force all free C# implementations underground some day using software patents.”(с) RMS Ужасные расходы на лицензии Нужна лицензия на Visual Studio, ReSharper, и вообще на все, что делает Microsoft! Это дорого Этожевинда! Виндаглючная! Вендекапец! Акакжекроссплатформенность?!! Дорогой хостинг! ВСЕЗАДЕНЬГИ!! ПРОКЛЯТЫЕ КАПИТАЛИСТЫ-КОПИРАСТЫ!
  • 8. Бытует мнение “The danger is that Microsoft is probably planning to force all free C# implementations underground some day using software patents.”(с) RMS Ужасные расходы на лицензии Нужна лицензия на Visual Studio, ReSharper, и вообще на все, что делает Microsoft! Это дорого Этожевинда! Виндаглючная! Вендекапец! Акакжекроссплатформенность?!! Дорогой хостинг! ВСЕЗАДЕНЬГИ!! ПРОКЛЯТЫЕ КАПИТАЛИСТЫ-КОПИРАСТЫ! Opensourceна продуктах Microsoft нет и быть не может!
  • 11. Места скопления Спецпитомник, созданный Microsoft: www.codeplex.com Поддерживает Git, SVN, Mercurial, TFS Проектов –хренова туча, если кратко.
  • 12. Места скопления Всеми любимый хипстерскийGitHub Рассказывать тут особо нечего –зайдите в Trending Repositories, сами все увидите
  • 13. Места скопления SourceForge–статистика по C#-проектам выдает около 16 тыс. штук.
  • 14. Коротко о самых известных Название Описание Ссылка Лицензия ASP.NETMVC 5 Web-фреймворк, который полностьювытеснил классический WebForms https://aspnetwebstack.codeplex.com/ Apache License Prism WPF/MVVMфреймворк https://compositewpf.codeplex.com/ Apache 2.0 License EntityFramework ЛютыйORM, местами рвущий Hibernate по удобству https://entityframework.codeplex.com/ Apache 2.0 License Autofac Популярный маленький, удобный и быстрый IoC-контейнер https://github.com/autofac/Autofac MIT Automapper Удобныйи быстрый способ скопировать содержимое одного класса в другой http://automapper.org/ MIT Roslyn О нем далее https://roslyn.codeplex.com/ Apache 2.0 License Это первое, что пришло в голову. На самом деле проектов гораздо больше. Есть многоальтернатив, есть из чего выбрать и вообще.
  • 15. Коротко о самых известных портах
  • 16. Коротко о самых известных портах Название Описание Ссылка Лицензия NHibernate Впредставлениях не нуждается https://github.com/nhibernate LGPL NUnit Фреймворк дляunit-тестирования http://sourceforge.net/projects/nunit/ zlib/libpngLicense NVelocity ПортJakarta Velocity–шаблонизатор http://nvelocity.sourceforge.net/ Apache Software License Spring.NET Швейцарскийскладной нож, расширяющий возможности фреймворкав плане транзакций, IoC и много чего другого https://github.com/spring-projects/spring- net/ Apache 2.0 License NAnt Сборщикпроектов для тех, кто не освоил MSBuild http://nant.sourceforge.net/ GPL
  • 17. Stratageme15 ПОПЫТКА ПРИЛОЖИТЬ РУКУ К C#-ОПЕНСОРСУ
  • 18. Проблематика ◦Disclamer: Я не являюсь противником javascript! ◦Команда дотнетчиковделает сайт на ASP.NET MVC и испытывает трудности с javascript-ом ◦.NET-чикине умеют писать на javascript-е. У них слишком строго типизированное мышление ◦Столкновение C#-программистов и javascriptведет к следующей боли: ◦отсутствие строгой типизации, повышенная вероятность ошибок ◦разрастание неструктурированного js-кода ◦отсутствие productivitytool, что знатно замедляет работу ◦отсутствие удобной документации "под рукой" (по jquery, DOM, Knockout.js) ◦отсутствие средств для консолидации технологического опыта ◦А вообще, конечно, черт с ним со всем, я просто хочу писать для web-а на C#, потому что люблю его. Должен же быть хоть какой-то аргумент к пафосу :)
  • 19. Проблематика Типичный код C#-программиста наJS: •Функции в корне •Игнорирование прототипов •Игнорирование convention-овjQuery •Адское форматирование •Абсолютное неумение пользоваться замыканиями •Полный быдлокод, разврат и содомия
  • 20. Решение Хочется писать на C#, используя возможности js-фреймворков(jQuery, underscoreetc) как интерфейсов Самая изюминка –в использовании LINQ, лямбда-выражений и встроенных коллекций Нужен транслятор! Возможностиязыковпримерносовпадаютвплотьдоключевыхслов. Следовательно, задача сводится к удобному способу трансляции обращений к фреймворками созданию удобных возможностей для преобразования существующего JS- кода в описания интерфейсов C#.
  • 21. Как это работает? jquery-min.js JS Parser Синтаксическое дерево Прямые руки IJQuery Interfaces Translation Tactics
  • 22. Как это работает? DOMv3.idl IDL Parser Структура IDL Прямые руки IDomWindow Interfaces Translation Tactics
  • 23. Как это работает? IDE IDomWindow IJQuery .NET Framework
  • 24. Как это работает? IDE IDomWindow IJQuery .NET Framework MyCoolScript.cs Csccompiler MyCoolScript.dll
  • 25. Как это работает? IDE IDomWindow IJQuery .NET Framework MyCoolScript.cs Csccompiler MyCoolScript.dll Translator MyCoolScript.js
  • 26. So what is Stratageme15? Translator IDL Parser JS Parser Интерфейсы Спеки Пакеты расширений Stratageme15
  • 27. Почему название? «Тридцать шесть стратагем(кит.三十六計)—древнекитайский военный трактат. В более широком смысле, собрание неявных стратегических приёмов и система непрямых тактических ходов, используемая для достижения скрытой цели, получения преимущества и перехвата инициативы.» -Wikipedia «15. Сманить тигра с горы на равнину (調虎離山) Дождись срока, когда противник устанет. Используй кого-нибудь для того, чтобы заманить его в ловушку. Никогда не атаковать противника, преимущество которого в его позиции. Вместо этого выманить его с выигрышной позиции, тем самым отделяя от источника силы.» -Там же
  • 28. Почему название? (режим повышенной четкости) Ну типа Javascript–это тигр, а мы его сманиваем на равнину – C#, где у нас больше преимуществ.
  • 29. Deep dive ТЕХНИЧЕСКИЕ ВОПРОСЫ И ПРОБЛЕМЫ
  • 30. Принцип работы парсера Coco/R –разработка ребят из университета г. Линц, что в Австрии ◦Кто не знает –это генератор компиляторов. Такая штука, которая принимает на вход описание грамматики в EBNF (по факту –еще и с семантическими действиями)а на выходе выдает исходный код токенайзераи синтаксического анализатора ◦Почему не ANTLR? «Так надо» (с) Грамматика, составленнаявручную по ECMA-262и собственным ощущениям. Разумеется, сварганен DOMдля кода –то есть набор классов со всеми синтаксическими нодами Для IDL –в процессе. Благо там она более-менее строго описана Приобщиться можно тут: https://github.com/pavel-b-novikov/Stratageme15/blob/master/CocoR/JavaScript.atg 544 строки кода
  • 31. Принцип работы парсера Сложные и интересные моменты: ◦Javascript-регулярные выражения ◦Вечно путались с делением. Проблема решена частичным переписыванием шаблона токенайзераот Coco/R–внедрен механизм возврата к началу выражения, если оно начало парситьсякак regex, но не должно бы ◦Отсутствие точки с запятой как универсального разделителя операторов ◦Внезапное осознание, что ЛЮБОЕ выражение JS является оператором ◦Абсолютно адские self-calling functions и тернарные операторы ◦И вообще не описанный в стандарте синтаксис в некоторых продуктах
  • 32. Результат ПарситсясжатыйjQueryи много разных других фреймворков На скриншоте –кусок тулзыдля семантического вычленения интерфейсов. «Мы работаем над этим»
  • 33. Принцип работы транслятора В целом -обычный обход в глубину синтаксического дерева. Исходник C# Парсер(Roslyn) Разобранный код –синтакс. дерево
  • 34. Принцип работы транслятора ClassDeclaration MethodDeclaration Identifier ParameterList Block VariableDeclaration … PropertyDeclaration ClassDeclaration IfStatement WhileStatement … context = new Context(); while(!stackEmpty) { node = stack.Pop(); reactor = Reactors.GetForNode(node); reactor.Process(node,context); } return context.ResultRoot; Репозиторийреакторов Тип текущего класса Указатель на результат Локальные переменные Текущий метод … Контекст трансляции
  • 35. Ключевые особенности На каждый узел синтаксического дерева можно настроить разную реакцию в зависимости от имени класса, его типа, локальных переменных… Короче в зависимости от того, в каком месте кода этот узел находится. То есть просто писать в выходной JavaScript разный код. Сделать это можно не переписываятранслятор, а просто подключив к нему еще одну DLL. В этом и заключается основная ключевая особенность. Разработчик извне может легко повлиять на процесс трансляции, сгенерировав хоть 3 страницы кода взамен одного оператора C#. Это дает возможность очень легко писать расширения к транслятору для разных фреймворков, да и просто синтаксического сахара.
  • 36. Ключевые особенности В комплекте с транслятором поставляется «базовый пакет» реакторов. Ну чтобы была возможность из коробки перевести хоть какой-то код – операторы, вызовы методов, объявления классов и т.п.
  • 43. Смертельный номер с тиграми Напишем вот такой код и поставим точку останова в трансляторе так, чтобы нам показали процесс трансляции вооотна этой строчке
  • 44. Смертельный номер с тиграми В контексте локальных переменных видим все переменные и их типы. То есть работает type inference. Самописный. Оп!
  • 45. Прогресс Translator IDL Parser JS Parser Интерфейсы Спеки Пакеты расширений Зеленым цветом я обозначил % завершенности частей проекта. Думаю, наглядно.
  • 46. Что надо делать дальше? В хронологическом порядке: ◦Разобраться с лямбда-выражениями и корректной трансляцией замыканий ◦Поддержка статических классов ◦Совершенствование системы расширений ◦Поддержка коллекций .NET и LINQ на них ◦Обертка в .exe, прикручивание параметров запуска/конфигурационных файлов ◦Доработка инструментария импорта библиотек ◦Импорт WebIDLдля браузерногоDOM ◦Импорт jQueryи ряда других библиотек (Highcharts, Raphael, AngularJS, KnockoutJS)
  • 47. Проблемы и родовые травмы В настоящее время испытываю некоторые проблемы с выводом типов аргументов лямбда- выражений и анонимных делегатов. Но это было сложно сделать даже спецам из JetBrains, по сему прошу снисхождения и терпения  Проблема отладки. Дело в том, что отлаживать транслируемый код разработчикам тоже где-то надо будет. Это, пожалуй, самая серьезная проблема. Скорее всего пойду по пути GWT, сделав отдельное приложение для отладки полученного кода. Возможен вариант с организацией сервера отладки или подключения и эмуляции Trident.Но пока что я об этом предпочитаю не думать. Неизвестно пока что делать с Generic-классами и какое им найти место в созданной системе абстракций. То есть их не технически сложно транслировать, а сложно придумать во что их транслировать.