opensource на .net
TRANSCRIPT
![Page 1: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/1.jpg)
Opensource на .NETИ О ТИГРАХ НА РАВНИНЕ
![Page 2: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/2.jpg)
Об автореПавел Новиков
Окончил (вранье!) НГУ ФИТ, когда-то в прошлом
Работает: фрилансит на C#/.NET
На досуге: ваяет свой opensource-проект
Преподает: НГУ, IT-академия Сухорукова
Любит: C#, Microsoft, ежей и хорошо поесть
Skype: nsu_the_cjayEmail: [email protected]
![Page 3: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/3.jpg)
Суть™.NET (читается «дот-нет») Framework
это набор инструментов для разработки программного обеспечения (программный каркас) от Microsoft. Да-да, тех самых, которые создали Windows.
Это как STL или JRE.
C♯ (читается «си-шарп»)это язык программирования, из которого можно быстро и удобно использовать все
средства .NET Framework для создания самых разных приложений. Унаследовал многое от java, C++, C, так же имеет набор своих особенностей.
Это как C++ или Java соответственно.
![Page 4: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/4.jpg)
Как это все связано с Opensource?
![Page 5: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/5.jpg)
Бытует мнение
“The danger is that Microsoft is probably planning to force all free C# implementations
underground some day using software patents.” (с) RMS
![Page 6: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/6.jpg)
Бытует мнение
“The danger is that Microsoft is probably planning to force all free C# implementations
underground some day using software patents.” (с) RMS
Этожевинда! Винда глючная!
Вендекапец!
Акакжекроссплатформенность?!!
![Page 7: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/7.jpg)
Бытует мнение
“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! Это
дорого
Этожевинда! Винда глючная!
Вендекапец!
Акакжекроссплатформенность?!!Дорогой хостинг!
ВСЕЗАДЕНЬГИ!! ПРОКЛЯТЫЕ КАПИТАЛИСТЫ-КОПИРАСТЫ!
![Page 8: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/8.jpg)
Бытует мнение
“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
нет и быть не может!
![Page 9: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/9.jpg)
Явление суслика народу
![Page 10: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/10.jpg)
Явление суслика народу
![Page 11: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/11.jpg)
Места скопленияСпецпитомник, созданный Microsoft: www.codeplex.com
Поддерживает Git, SVN, Mercurial, TFS
Проектов – хренова туча, если кратко.
![Page 12: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/12.jpg)
Места скопленияВсеми любимый хипстерский GitHub
Рассказывать тут особо нечего – зайдите в Trending Repositories, сами все увидите
![Page 13: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/13.jpg)
Места скопленияSourceForge – статистика по C#-проектам выдает около 16 тыс. штук.
![Page 14: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/14.jpg)
Коротко о самых известныхНазвание Описание Ссылка Лицензия
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
Это первое, что пришло в голову. На самом деле проектов гораздо больше.
Есть много альтернатив, есть из чего выбрать и вообще.
![Page 15: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/15.jpg)
Коротко о самых известных портах
![Page 16: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/16.jpg)
Коротко о самых известных портахНазвание Описание Ссылка Лицензия
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
![Page 17: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/17.jpg)
Stratageme 15ПОПЫТКА ПРИЛОЖИТЬ РУКУ К C#-ОПЕНСОРСУ
![Page 18: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/18.jpg)
Проблематика◦ Disclamer: Я не являюсь противником javascript!
◦ Команда дотнетчиков делает сайт на ASP.NET MVC и испытывает трудности с javascript-ом
◦ .NET-чики не умеют писать на javascript-е. У них слишком строго типизированное мышление
◦ Столкновение C#-программистов и javascript ведет к следующей боли:◦ отсутствие строгой типизации, повышенная вероятность ошибок
◦ разрастание неструктурированного js-кода
◦ отсутствие productivity tool, что знатно замедляет работу
◦ отсутствие удобной документации "под рукой" (по jquery, DOM, Knockout.js)
◦ отсутствие средств для консолидации технологического опыта
◦ А вообще, конечно, черт с ним со всем, я просто хочу писать для web-а на C#, потому что люблю его. Должен же быть хоть какой-то аргумент к пафосу :)
![Page 19: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/19.jpg)
ПроблематикаТипичный код C#-программиста на JS:• Функции в корне• Игнорирование прототипов• Игнорирование convention-ов jQuery• Адское форматирование• Абсолютное неумение пользоваться замыканиями• Полный быдлокод, разврат и содомия
![Page 20: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/20.jpg)
РешениеХочется писать на C#, используя возможности js-фреймворков (jQuery, underscore etc) как интерфейсов
Самая изюминка – в использовании LINQ, лямбда-выражений и встроенных коллекций
Нужен транслятор!
Возможности языков примерно совпадают вплоть до ключевых слов.
Следовательно, задача сводится к удобному способу трансляции обращений к фреймворкам и созданию удобных возможностей для преобразования существующего JS-кода в описания интерфейсов C#.
![Page 21: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/21.jpg)
Как это работает?
jquery-min.js
JS Parser
Синтаксическое дерево
Прямые руки
IJQueryInterfaces
Translation Tactics
![Page 22: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/22.jpg)
Как это работает?
DOMv3.idl
IDL Parser
Структура IDL
Прямые руки
IDomWindowInterfaces
Translation Tactics
![Page 23: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/23.jpg)
Как это работает?
IDE
IDomWindow
IJQuery
.NET Framework
![Page 24: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/24.jpg)
Как это работает?
IDE
IDomWindow
IJQuery
.NET Framework
MyCoolScript.cs
Csc compiler
MyCoolScript.dll
![Page 25: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/25.jpg)
Как это работает?
IDE
IDomWindow
IJQuery
.NET Framework
MyCoolScript.cs
Csc compiler
MyCoolScript.dll
Translator
MyCoolScript.js
![Page 26: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/26.jpg)
So what is Stratageme 15?
Translator
IDL ParserJS Parser
ИнтерфейсыСпеки
Пакеты расширений
Stratageme 15
![Page 27: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/27.jpg)
Почему название?«Тридцать шесть стратагем (кит.三十六計) — древнекитайский военный трактат. В более широком смысле,
собрание неявных стратегических приёмов и система непрямых тактических ходов, используемая для достижения
скрытой цели, получения преимущества и перехвата инициативы.»
- Wikipedia
«15. Сманить тигра с горы на равнину (調虎離山)
Дождись срока, когда противник устанет.
Используй кого-нибудь для того, чтобы заманить его в ловушку.Никогда не атаковать противника, преимущество которого в его позиции. Вместо этого выманить его с выигрышной позиции, тем самым отделяя от источника силы.»
- Там же
![Page 28: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/28.jpg)
Почему название?
(режим повышенной четкости)
Ну типа Javascript – это тигр, а мы его сманиваем на равнину –C#, где у нас больше преимуществ.
![Page 29: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/29.jpg)
Deep diveТЕХНИЧЕСКИЕ ВОПРОСЫ И ПРОБЛЕМЫ
![Page 30: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/30.jpg)
Принцип работы парсераCoco/R – разработка ребят из университета г. Линц, что в Австрии
◦ Кто не знает – это генератор компиляторов. Такая штука, которая принимает на вход описание грамматики в EBNF (по факту – еще и с семантическими действиями) а на выходе выдает исходный код токенайзера и синтаксического анализатора
◦ Почему не ANTLR? «Так надо» (с)
Грамматика, составленная вручную по ECMA-262 и собственным ощущениям.
Разумеется, сварганен DOM для кода – то есть набор классов со всеми синтаксическими нодами
Для IDL – в процессе. Благо там она более-менее строго описана
Приобщиться можно тут:
https://github.com/pavel-b-novikov/Stratageme15/blob/master/CocoR/JavaScript.atg
544 строки кода
![Page 31: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/31.jpg)
Принцип работы парсераСложные и интересные моменты:
◦ Javascript-регулярные выражения
◦ Вечно путались с делением. Проблема решена частичным переписыванием шаблона токенайзера от Coco/R – внедрен механизм возврата к началу выражения, если оно начало парситься как regex, но не должно бы
◦ Отсутствие точки с запятой как универсального разделителя операторов
◦ Внезапное осознание, что ЛЮБОЕ выражение JS является оператором
◦ Абсолютно адские self-calling functions и тернарные операторы
◦ И вообще не описанный в стандарте синтаксис в некоторых продуктах
![Page 32: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/32.jpg)
РезультатПарсится сжатый jQuery и много разных других фреймворков
На скриншоте – кусок тулзы для семантического вычленения интерфейсов. «Мы работаем над этим»
![Page 33: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/33.jpg)
Принцип работы транслятораВ целом - обычный обход в глубину синтаксического дерева.
Исходник C#
Парсер (Roslyn)
Разобранный код – синтакс. дерево
![Page 34: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/34.jpg)
Принцип работы транслятора
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;
Репозиторий реакторов
Тип текущего класса
Указатель на результат
Локальные переменные
Текущий метод
…
Контекст трансляции
![Page 35: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/35.jpg)
Ключевые особенностиНа каждый узел синтаксического дерева можно настроить разную реакцию в зависимости от имени класса, его типа, локальных переменных… Короче в зависимости от того, в каком месте кода этот узел находится.
То есть просто писать в выходной JavaScript разный код.
Сделать это можно не переписывая транслятор, а просто подключив к нему еще одну DLL.
В этом и заключается основная ключевая особенность. Разработчик извне может легко повлиять на процесс трансляции, сгенерировав хоть 3
страницы кода взамен одного оператора C#.
Это дает возможность очень легко писать расширения к транслятору для разных фреймворков, да и просто синтаксического сахара.
![Page 36: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/36.jpg)
Ключевые особенностиВ комплекте с транслятором поставляется «базовый пакет» реакторов.
Ну чтобы была возможность из коробки перевести хоть какой-то код –операторы, вызовы методов, объявления классов и т.п.
![Page 37: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/37.jpg)
Промежуточные результаты
![Page 38: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/38.jpg)
Промежуточные результаты
![Page 39: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/39.jpg)
Промежуточные результаты
![Page 40: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/40.jpg)
Промежуточные результаты
![Page 41: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/41.jpg)
Промежуточные результаты
![Page 42: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/42.jpg)
Промежуточные результаты
Статика пока не доработана
![Page 43: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/43.jpg)
Смертельный номер с тиграми
Напишем вот такой код и поставим точку останова в трансляторе так, чтобы нам показали процесс трансляции вооот на этой строчке
![Page 44: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/44.jpg)
Смертельный номер с тиграмиВ контексте локальных переменных видим все переменные и их типы.То есть работает type inference. Самописный.
Оп!
![Page 45: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/45.jpg)
Прогресс
Translator
IDL ParserJS Parser
ИнтерфейсыСпеки
Пакеты расширений
Зеленым цветом я обозначил %завершенности частей проекта. Думаю, наглядно.
![Page 46: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/46.jpg)
Что надо делать дальше?В хронологическом порядке:
◦ Разобраться с лямбда-выражениями и корректной трансляцией замыканий
◦ Поддержка статических классов
◦ Совершенствование системы расширений
◦ Поддержка коллекций .NET и LINQ на них
◦ Обертка в .exe, прикручивание параметров запуска/конфигурационных файлов
◦ Доработка инструментария импорта библиотек
◦ Импорт WebIDL для браузерного DOM
◦ Импорт jQuery и ряда других библиотек (Highcharts, Raphael, AngularJS, KnockoutJS)
![Page 47: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/47.jpg)
Проблемы и родовые травмыВ настоящее время испытываю некоторые проблемы с выводом типов аргументов лямбда-выражений и анонимных делегатов. Но это было сложно сделать даже спецам из JetBrains, по сему прошу снисхождения и терпения
Проблема отладки. Дело в том, что отлаживать транслируемый код разработчикам тоже где-то надо будет. Это, пожалуй, самая серьезная проблема. Скорее всего пойду по пути GWT, сделав отдельное приложение для отладки полученного кода. Возможен вариант с организацией сервера отладки или подключения и эмуляции Trident. Но пока что я об этом предпочитаю не думать.
Неизвестно пока что делать с Generic-классами и какое им найти место в созданной системе абстракций. То есть их не технически сложно транслировать, а сложно придумать во что их транслировать.
![Page 48: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/48.jpg)
Вопросы?
![Page 49: Opensource на .NET](https://reader030.vdocuments.net/reader030/viewer/2022032620/55c54cd4bb61eb537c8b4750/html5/thumbnails/49.jpg)
Всем спасибо!