Opensource на .NET

Post on 08-Aug-2015

1.239 views 1 download

Transcript of Opensource на .NET

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

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

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

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

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

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

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

Skype: nsu_the_cjayEmail: 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.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-классами и какое им найти место в созданной системе абстракций. То есть их не технически сложно транслировать, а сложно придумать во что их транслировать.

Вопросы?

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