?

Log in

No account? Create an account

Интересное за месяц - Excelsior

Jun. 18th, 2010

01:31 pm - Интересное за месяц

Previous Entry Share Next Entry

Стало хорошей традицией писать посты 1-2 раза в месяц, и это мне нравится - ведь за такой промежуток времени всегда накапливается что-то интересное, о чем можно рассказать. С философской точки зрения результатов немного - накидал себе в очередь прочтения инфу о возможностях метапрограммирования и системах типов (спасибо Олегу за качественную инфу об Окамле!) и регулярно почитываю то, как это сделано в разных языках. Пока без всяких выводов - просто проникаюсь топиком. С практической точки зрения много нового - выложил в опен-сорс два интересных проекта, которые уже не раз пригодились на практике и, на мой взгляд, могут быть интересны широкой общественности.

Relinq. Проект начинался как эффорт по передаче LINQ запросов между тирами, но под идейным руководством моего старшего коллеги превратился в компилятор выражений третьего C#. Функциональность описывается просто - умеет преобразовывать плейн-текст исходники на JavaScript в деревья выражений C# (ну, и наоборот, но это просто совсем). С помощью Релинка можно, например, вызывать LINQ-датасорсы из джаваскрипта, что вкупе с повсеместным распространением LINQ для кучи разных датасорсов (например, для баз данных или для Active Directory) дает возможность удобно построить слой доступа к данным для веб-прилаги (вернее, обойтись вообще без него =)). Собственно, так Релинк и используется на нескольких веб-проектах. Впрочем, у Релинка есть и другие практически интересные применения, о которых можно почитать на вики-странице проекта.

Новизна проекта. Для организации обмена LINQ-запросами и JSON-ответами между джаваскриптом и сервером на дотнете есть Astoria (она же ADO.NET WCF Data Services), но она: 1) намертво интегрирована в ASP.NET, 2) не позволяет вызывать джойны и, вообще, кастомные методы, 3) имеет закрытые исходники. Из опен-сорс проектов на схожую тематику можно отметить InterLinq, но он передает дерево выражений, сериализуя его в XML-формат, что делает крайне неудобным использование его клиентами, которые ничего не знают о дотнете. Наконец, существует несколько подходов для создания деревьев выражений в рантайме - референсный от MS и смартовый от Томаша Петричека. О первом я умолчу, а второй работает только в своей области и для обмена запросами он не предназначен.

Truesight. Когда-то после адских мучений с кодогенерацией в шарпе я сказал себе - "ну хватит, пишу нормальный reflection.emit". Мысль завертелась, понеслась, воплотилась в прикольном концепте и целом ноутбуке идей, но ввиду большого объема работы и узкой специализированности либы, дело заглохло на ранней стадии. Все бы так и умерло, если бы для Конфлакса мне не понадобился вначале парсер байткода CLR, а потом и декомпилятор сишарпа. В итоге все воплотилось в лайт-версии первоначальной задумки, но, несмотря на приставку "лайт", эта версия работает и развивается. На текущий момент Truesight умеет декомпилировать все нужные для Конфлакса конструкции C# (я недавно откопал глюк с составными условиями, но на днях я планирую его пофиксать) и может быть успешно использован по назначению - для декомпиляции кода в рантайме, его анализа и (пока что рукописной) генерации нового кода. Перфоманс проигрывает Рефлектору в 2-3 раза, но для моих задач этого оказалось достаточно. Несколько ссылок на документацию: поддерживаемая семантика, пример использования в Конфлаксе, список todo.

Новизна проекта. Все, конечно, знают о Рефлекторе, но его можно использовать только для ручных декомпиляции и анализа - с точки зрения программабилити он намертво заобфусцирован и выставляет лишь API для написания плагинов. Есть два открытых проекта - Cecil и Cecil.Decompiler. Первый является general-purpose библиотекой для рефлекшна и метапрограммирования в дотнете. Там, где его функциональность пересекается с Truesight - в чтении инструкций CIL - по удобству юзания мне больше нравится Truesight, но Cecil совсем о другом (о рефлексировании относительно структуры сборки), поэтому тут сравнение не имеет смысла. С другой стороны, Cecil.Decompiler является полноценным декомпилятором, но на момент старта Truesight (начало этого года) он мне показался сыроватым. Наконец, последний из известных мне опен-сорс декомпиляторов для дотнета - CCI (который является, по сути, гигантским фреймворком для метапрограммирования в дотнете, покрывая все вопросы от чтения метаданных до перегенерации сборок). Несмотря на свой гигантский набор фич, для меня он оказался образцом того, как можно офигенно усложнить и без того сложную модель кода сишарпа. Благодаря наличию перед глазами антипримера CCI мне удалось значительно упростить дизайн AST для Truesight =) Кроме того, ввиду своей монструозности CCI ставит серьезные вопросы по реюзабилити. Последней каплей, толкнувшей меня на написание своего декомпилятора, стало то, что на начало этого года CCI не поддерживал декомпиляцию циклов.

***

Наконец, хочу добавить, что оба проекта (как и все мои опен-сорс начинания) лицензированы под Apache License 2.0 (что, по моим скромным знаниям юриспруденции, является синонимом фразы "бери и юзай как хочешь и в каких угодно проектах без всяких обязательств перед автором"), а также хостятся на гуглокоде под меркуриалом. По моему замыслу, это должно принести максимальную пользу человечеству и Мировому Разуму.

Comments:

From:(Anonymous)
Date:June 18th, 2010 11:59 am (UTC)
(Link)
Congratilations, my friend!

I'm happy to see you are on a 'openfree' way now.
(Reply) (Thread)
[User Picture]
From:thedeemon
Date:June 18th, 2010 12:18 pm (UTC)
(Link)
Мировой Разум одобряе!
(Reply) (Thread)
From:M E
Date:February 16th, 2013 02:31 am (UTC)
(Link)
надо будет тебя пораспросить о том, как ты делал трансформацию в своих трансляторах и декомпиляторах
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:February 16th, 2013 08:24 am (UTC)
(Link)
там сишарп, поэтому никак, т.е. визиторами.
(Reply) (Parent) (Thread)