Opensource на .NET

49
Opensource на .NET И О ТИГРАХ НА РАВНИНЕ

Transcript of Opensource на .NET

Page 1: Opensource на .NET

Opensource на .NETИ О ТИГРАХ НА РАВНИНЕ

Page 2: Opensource на .NET

Об автореПавел Новиков

Окончил (вранье!) НГУ ФИТ, когда-то в прошлом

Работает: фрилансит на C#/.NET

На досуге: ваяет свой opensource-проект

Преподает: НГУ, IT-академия Сухорукова

Любит: C#, Microsoft, ежей и хорошо поесть

Skype: nsu_the_cjayEmail: [email protected]

Page 3: Opensource на .NET

Суть™.NET (читается «дот-нет») Framework

это набор инструментов для разработки программного обеспечения (программный каркас) от Microsoft. Да-да, тех самых, которые создали Windows.

Это как STL или JRE.

C♯ (читается «си-шарп»)это язык программирования, из которого можно быстро и удобно использовать все

средства .NET Framework для создания самых разных приложений. Унаследовал многое от java, C++, C, так же имеет набор своих особенностей.

Это как C++ или Java соответственно.

Page 4: Opensource на .NET

Как это все связано с Opensource?

Page 5: Opensource на .NET

Бытует мнение

“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

Бытует мнение

“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

Бытует мнение

“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

Бытует мнение

“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

Явление суслика народу

Page 10: Opensource на .NET

Явление суслика народу

Page 11: Opensource на .NET

Места скопленияСпецпитомник, созданный Microsoft: www.codeplex.com

Поддерживает Git, SVN, Mercurial, TFS

Проектов – хренова туча, если кратко.

Page 12: Opensource на .NET

Места скопленияВсеми любимый хипстерский GitHub

Рассказывать тут особо нечего – зайдите в Trending Repositories, сами все увидите

Page 13: Opensource на .NET

Места скопленияSourceForge – статистика по C#-проектам выдает около 16 тыс. штук.

Page 14: Opensource на .NET

Коротко о самых известныхНазвание Описание Ссылка Лицензия

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

Коротко о самых известных портах

Page 16: Opensource на .NET

Коротко о самых известных портахНазвание Описание Ссылка Лицензия

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

Stratageme 15ПОПЫТКА ПРИЛОЖИТЬ РУКУ К C#-ОПЕНСОРСУ

Page 18: Opensource на .NET

Проблематика◦ Disclamer: Я не являюсь противником javascript!

◦ Команда дотнетчиков делает сайт на ASP.NET MVC и испытывает трудности с javascript-ом

◦ .NET-чики не умеют писать на javascript-е. У них слишком строго типизированное мышление

◦ Столкновение C#-программистов и javascript ведет к следующей боли:◦ отсутствие строгой типизации, повышенная вероятность ошибок

◦ разрастание неструктурированного js-кода

◦ отсутствие productivity tool, что знатно замедляет работу

◦ отсутствие удобной документации "под рукой" (по jquery, DOM, Knockout.js)

◦ отсутствие средств для консолидации технологического опыта

◦ А вообще, конечно, черт с ним со всем, я просто хочу писать для web-а на C#, потому что люблю его. Должен же быть хоть какой-то аргумент к пафосу :)

Page 19: Opensource на .NET

ПроблематикаТипичный код C#-программиста на JS:• Функции в корне• Игнорирование прототипов• Игнорирование convention-ов jQuery• Адское форматирование• Абсолютное неумение пользоваться замыканиями• Полный быдлокод, разврат и содомия

Page 20: Opensource на .NET

РешениеХочется писать на C#, используя возможности js-фреймворков (jQuery, underscore etc) как интерфейсов

Самая изюминка – в использовании LINQ, лямбда-выражений и встроенных коллекций

Нужен транслятор!

Возможности языков примерно совпадают вплоть до ключевых слов.

Следовательно, задача сводится к удобному способу трансляции обращений к фреймворкам и созданию удобных возможностей для преобразования существующего JS-кода в описания интерфейсов C#.

Page 21: Opensource на .NET

Как это работает?

jquery-min.js

JS Parser

Синтаксическое дерево

Прямые руки

IJQueryInterfaces

Translation Tactics

Page 22: Opensource на .NET

Как это работает?

DOMv3.idl

IDL Parser

Структура IDL

Прямые руки

IDomWindowInterfaces

Translation Tactics

Page 23: Opensource на .NET

Как это работает?

IDE

IDomWindow

IJQuery

.NET Framework

Page 24: Opensource на .NET

Как это работает?

IDE

IDomWindow

IJQuery

.NET Framework

MyCoolScript.cs

Csc compiler

MyCoolScript.dll

Page 25: Opensource на .NET

Как это работает?

IDE

IDomWindow

IJQuery

.NET Framework

MyCoolScript.cs

Csc compiler

MyCoolScript.dll

Translator

MyCoolScript.js

Page 26: Opensource на .NET

So what is Stratageme 15?

Translator

IDL ParserJS Parser

ИнтерфейсыСпеки

Пакеты расширений

Stratageme 15

Page 27: Opensource на .NET

Почему название?«Тридцать шесть стратагем (кит.三十六計) — древнекитайский военный трактат. В более широком смысле,

собрание неявных стратегических приёмов и система непрямых тактических ходов, используемая для достижения

скрытой цели, получения преимущества и перехвата инициативы.»

- Wikipedia

«15. Сманить тигра с горы на равнину (調虎離山)

Дождись срока, когда противник устанет.

Используй кого-нибудь для того, чтобы заманить его в ловушку.Никогда не атаковать противника, преимущество которого в его позиции. Вместо этого выманить его с выигрышной позиции, тем самым отделяя от источника силы.»

- Там же

Page 28: Opensource на .NET

Почему название?

(режим повышенной четкости)

Ну типа Javascript – это тигр, а мы его сманиваем на равнину –C#, где у нас больше преимуществ.

Page 29: Opensource на .NET

Deep diveТЕХНИЧЕСКИЕ ВОПРОСЫ И ПРОБЛЕМЫ

Page 30: Opensource на .NET

Принцип работы парсера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

Принцип работы парсераСложные и интересные моменты:

◦ Javascript-регулярные выражения

◦ Вечно путались с делением. Проблема решена частичным переписыванием шаблона токенайзера от Coco/R – внедрен механизм возврата к началу выражения, если оно начало парситься как regex, но не должно бы

◦ Отсутствие точки с запятой как универсального разделителя операторов

◦ Внезапное осознание, что ЛЮБОЕ выражение JS является оператором

◦ Абсолютно адские self-calling functions и тернарные операторы

◦ И вообще не описанный в стандарте синтаксис в некоторых продуктах

Page 32: Opensource на .NET

РезультатПарсится сжатый jQuery и много разных других фреймворков

На скриншоте – кусок тулзы для семантического вычленения интерфейсов. «Мы работаем над этим»

Page 33: Opensource на .NET

Принцип работы транслятораВ целом - обычный обход в глубину синтаксического дерева.

Исходник C#

Парсер (Roslyn)

Разобранный код – синтакс. дерево

Page 34: Opensource на .NET

Принцип работы транслятора

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

Ключевые особенностиНа каждый узел синтаксического дерева можно настроить разную реакцию в зависимости от имени класса, его типа, локальных переменных… Короче в зависимости от того, в каком месте кода этот узел находится.

То есть просто писать в выходной JavaScript разный код.

Сделать это можно не переписывая транслятор, а просто подключив к нему еще одну DLL.

В этом и заключается основная ключевая особенность. Разработчик извне может легко повлиять на процесс трансляции, сгенерировав хоть 3

страницы кода взамен одного оператора C#.

Это дает возможность очень легко писать расширения к транслятору для разных фреймворков, да и просто синтаксического сахара.

Page 36: Opensource на .NET

Ключевые особенностиВ комплекте с транслятором поставляется «базовый пакет» реакторов.

Ну чтобы была возможность из коробки перевести хоть какой-то код –операторы, вызовы методов, объявления классов и т.п.

Page 37: Opensource на .NET

Промежуточные результаты

Page 38: Opensource на .NET

Промежуточные результаты

Page 39: Opensource на .NET

Промежуточные результаты

Page 40: Opensource на .NET

Промежуточные результаты

Page 41: Opensource на .NET

Промежуточные результаты

Page 42: Opensource на .NET

Промежуточные результаты

Статика пока не доработана

Page 43: Opensource на .NET

Смертельный номер с тиграми

Напишем вот такой код и поставим точку останова в трансляторе так, чтобы нам показали процесс трансляции вооот на этой строчке

Page 44: Opensource на .NET

Смертельный номер с тиграмиВ контексте локальных переменных видим все переменные и их типы.То есть работает type inference. Самописный.

Оп!

Page 45: Opensource на .NET

Прогресс

Translator

IDL ParserJS Parser

ИнтерфейсыСпеки

Пакеты расширений

Зеленым цветом я обозначил %завершенности частей проекта. Думаю, наглядно.

Page 46: Opensource на .NET

Что надо делать дальше?В хронологическом порядке:

◦ Разобраться с лямбда-выражениями и корректной трансляцией замыканий

◦ Поддержка статических классов

◦ Совершенствование системы расширений

◦ Поддержка коллекций .NET и LINQ на них

◦ Обертка в .exe, прикручивание параметров запуска/конфигурационных файлов

◦ Доработка инструментария импорта библиотек

◦ Импорт WebIDL для браузерного DOM

◦ Импорт jQuery и ряда других библиотек (Highcharts, Raphael, AngularJS, KnockoutJS)

Page 47: Opensource на .NET

Проблемы и родовые травмыВ настоящее время испытываю некоторые проблемы с выводом типов аргументов лямбда-выражений и анонимных делегатов. Но это было сложно сделать даже спецам из JetBrains, по сему прошу снисхождения и терпения

Проблема отладки. Дело в том, что отлаживать транслируемый код разработчикам тоже где-то надо будет. Это, пожалуй, самая серьезная проблема. Скорее всего пойду по пути GWT, сделав отдельное приложение для отладки полученного кода. Возможен вариант с организацией сервера отладки или подключения и эмуляции Trident. Но пока что я об этом предпочитаю не думать.

Неизвестно пока что делать с Generic-классами и какое им найти место в созданной системе абстракций. То есть их не технически сложно транслировать, а сложно придумать во что их транслировать.

Page 48: Opensource на .NET

Вопросы?

Page 49: Opensource на .NET

Всем спасибо!