Opensource на .NET
Transcript of Opensource на .NET
Opensource на .NETИ О ТИГРАХ НА РАВНИНЕ
Об автореПавел Новиков
Окончил (вранье!) НГУ ФИТ, когда-то в прошлом
Работает: фрилансит на C#/.NET
На досуге: ваяет свой opensource-проект
Преподает: НГУ, IT-академия Сухорукова
Любит: C#, Microsoft, ежей и хорошо поесть
Skype: nsu_the_cjayEmail: [email protected]
Суть™.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.NET MVC 5 Web-фреймворк, который полностьювытеснил классический WebForms
https://aspnetwebstack.codeplex.com/ Apache License
Prism WPF/MVVM фреймворк https://compositewpf.codeplex.com/ Apache 2.0 License
Entity Framework Лютый 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/libpng License
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
Stratageme 15ПОПЫТКА ПРИЛОЖИТЬ РУКУ К C#-ОПЕНСОРСУ
Проблематика◦ Disclamer: Я не являюсь противником javascript!
◦ Команда дотнетчиков делает сайт на ASP.NET MVC и испытывает трудности с javascript-ом
◦ .NET-чики не умеют писать на javascript-е. У них слишком строго типизированное мышление
◦ Столкновение C#-программистов и javascript ведет к следующей боли:◦ отсутствие строгой типизации, повышенная вероятность ошибок
◦ разрастание неструктурированного js-кода
◦ отсутствие productivity tool, что знатно замедляет работу
◦ отсутствие удобной документации "под рукой" (по jquery, DOM, Knockout.js)
◦ отсутствие средств для консолидации технологического опыта
◦ А вообще, конечно, черт с ним со всем, я просто хочу писать для web-а на C#, потому что люблю его. Должен же быть хоть какой-то аргумент к пафосу :)
ПроблематикаТипичный код C#-программиста на JS:• Функции в корне• Игнорирование прототипов• Игнорирование convention-ов jQuery• Адское форматирование• Абсолютное неумение пользоваться замыканиями• Полный быдлокод, разврат и содомия
РешениеХочется писать на C#, используя возможности js-фреймворков (jQuery, underscore etc) как интерфейсов
Самая изюминка – в использовании LINQ, лямбда-выражений и встроенных коллекций
Нужен транслятор!
Возможности языков примерно совпадают вплоть до ключевых слов.
Следовательно, задача сводится к удобному способу трансляции обращений к фреймворкам и созданию удобных возможностей для преобразования существующего JS-кода в описания интерфейсов C#.
Как это работает?
jquery-min.js
JS Parser
Синтаксическое дерево
Прямые руки
IJQueryInterfaces
Translation Tactics
Как это работает?
DOMv3.idl
IDL Parser
Структура IDL
Прямые руки
IDomWindowInterfaces
Translation Tactics
Как это работает?
IDE
IDomWindow
IJQuery
.NET Framework
Как это работает?
IDE
IDomWindow
IJQuery
.NET Framework
MyCoolScript.cs
Csc compiler
MyCoolScript.dll
Как это работает?
IDE
IDomWindow
IJQuery
.NET Framework
MyCoolScript.cs
Csc compiler
MyCoolScript.dll
Translator
MyCoolScript.js
So what is Stratageme 15?
Translator
IDL ParserJS Parser
ИнтерфейсыСпеки
Пакеты расширений
Stratageme 15
Почему название?«Тридцать шесть стратагем (кит.三十六計) — древнекитайский военный трактат. В более широком смысле,
собрание неявных стратегических приёмов и система непрямых тактических ходов, используемая для достижения
скрытой цели, получения преимущества и перехвата инициативы.»
- 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 ParserJS Parser
ИнтерфейсыСпеки
Пакеты расширений
Зеленым цветом я обозначил %завершенности частей проекта. Думаю, наглядно.
Что надо делать дальше?В хронологическом порядке:
◦ Разобраться с лямбда-выражениями и корректной трансляцией замыканий
◦ Поддержка статических классов
◦ Совершенствование системы расширений
◦ Поддержка коллекций .NET и LINQ на них
◦ Обертка в .exe, прикручивание параметров запуска/конфигурационных файлов
◦ Доработка инструментария импорта библиотек
◦ Импорт WebIDL для браузерного DOM
◦ Импорт jQuery и ряда других библиотек (Highcharts, Raphael, AngularJS, KnockoutJS)
Проблемы и родовые травмыВ настоящее время испытываю некоторые проблемы с выводом типов аргументов лямбда-выражений и анонимных делегатов. Но это было сложно сделать даже спецам из JetBrains, по сему прошу снисхождения и терпения
Проблема отладки. Дело в том, что отлаживать транслируемый код разработчикам тоже где-то надо будет. Это, пожалуй, самая серьезная проблема. Скорее всего пойду по пути GWT, сделав отдельное приложение для отладки полученного кода. Возможен вариант с организацией сервера отладки или подключения и эмуляции Trident. Но пока что я об этом предпочитаю не думать.
Неизвестно пока что делать с Generic-классами и какое им найти место в созданной системе абстракций. То есть их не технически сложно транслировать, а сложно придумать во что их транслировать.
Вопросы?
Всем спасибо!