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 соответственно.
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 нет и быть не может!
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
Это первое, что пришло в голову.
На самом деле проектов гораздо больше.
Есть многоальтернатив, есть из чего выбрать и вообще.
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
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
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#, где у нас больше преимуществ.
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. Самописный.
Оп!
46. Что надо делать дальше?
В хронологическом порядке:
◦Разобраться с лямбда-выражениями и корректной трансляцией замыканий
◦Поддержка статических классов
◦Совершенствование системы расширений
◦Поддержка коллекций .NET и LINQ на них
◦Обертка в .exe, прикручивание параметров запуска/конфигурационных файлов
◦Доработка инструментария импорта библиотек
◦Импорт WebIDLдля браузерногоDOM
◦Импорт jQueryи ряда других библиотек (Highcharts, Raphael, AngularJS, KnockoutJS)
47. Проблемы и родовые травмы
В настоящее время испытываю некоторые проблемы с выводом типов аргументов лямбда- выражений и анонимных делегатов. Но это было сложно сделать даже спецам из JetBrains, по сему прошу снисхождения и терпения
Проблема отладки. Дело в том, что отлаживать транслируемый код разработчикам тоже где-то надо будет. Это, пожалуй, самая серьезная проблема. Скорее всего пойду по пути GWT, сделав отдельное приложение для отладки полученного кода. Возможен вариант с организацией сервера отладки или подключения и эмуляции Trident.Но пока что я об этом предпочитаю не думать.
Неизвестно пока что делать с Generic-классами и какое им найти место в созданной системе абстракций. То есть их не технически сложно транслировать, а сложно придумать во что их транслировать.