воскресенье, 24 января 2010 г.

Dynamic Expressions

Всё началось с того, что был нужен простенький DSL, который бы возвращал бы bool по некоторому словарю объектов, т.е. удовлетворяет ли он условию заданному через DSL. Было у меня два поста, о том как написать свой парсер языка и о том, как с помощью Expressions tree, обработать дерево языка построенное парсером. Так я и делал вначале. Получилось несколько громоздко, меня покритиковали :) Поэтому решил упростить себе и другим жизнь, вот на этой странице C# Samples прочитав внимательно соглашение и нажав I accept, можно скачать набор примеров, в частности большое количество примеров по LINQ. И среди них есть папка LinqSamples\DynamicQuery. Там есть файл Dynamic.cs с набором классов, которые делают то, что я описал ранее, т.е. преобразуют текстовую запись LINQ в Expressions tree и далее компиляция его в делегат. Это просто замечательно, то что доктор прописал, готово и отлично работает. Внутри папки есть Dynamic Expressions.html файл с подробной инструкцией, а также таблицей поддерживаемых методов.
Вот например, то что я писал выше, создание простого калькулятора из примера:
  1. ParameterExpression argument = Expression.Parameter(typeof(int), "argument");  
  2. LambdaExpression e = DynamicExpression.ParseLambda(new ParameterExpression[] { argument }, null"argument + argument");  

Я использовал в своём приложении, очень удобно. Единство, пришлось сделать небольшой хак.

Expression trees: продолжаем писать компилятор

Обычно компилятор состоит из двух частей: парсер и генератор. Как быстро и легко написать парсер я уже писал LINQ: интересный подход к написанию парсеров.
Теперь займемся генератором. Вернее подход будет несколько другим. Я разрабатывал внутренний язык, который будет использоваться внутри .NET приложения, т.е. необходимо выполнить  инструкцию написанную на этом языке. И тут к нам на помощь придут Expression trees. Теперь подробнее...

суббота, 23 января 2010 г.

MS SQL Server CREATE ASSEMBLY

В MS SQL Server'е есть такая интересная функция, когда можно написать функцию на С# или другом CLR языке, и выполнять её как обычную SQL функцию. Нам это в своё время помогло улучшить производительность одного момента.
Есть интересная штука связаная с ней. CREATE ASSEMBLY FROM деректива позваляет загрузить набор таких функции на C# в SQL сервер из dll. Т.е. после FROM следует абсалютный путь к dll с этими функциями. Но у нас возникла загвоздка с тем что скрипт установки базы запускаеться на боксе приложения, а база находиться на другой машине, соответственно sql server не может получить доступ к этой dll. Вообщем самый рабочий и оригиналльный способ придумали наши товарищи из поднебесной, после FROM они вставляют непосредственно бинарный код dll. Вообщем отжиг ещё тот, но лучше и надёжнее ничего лично я придумать не смог. А вот тут CREATE ASSEMBLY using assembly binary есть код на с#, как dll побыстрому преобразовать в такую вот бинарную строку.
  1. public string GetAssemblyBits(string assemblyPath)  
  2. {  
  3.       StringBuilder builder = new StringBuilder();  
  4.       builder.Append("0x");  
  5.    
  6.       using (FileStream stream = new FileStream(assemblyPath,  
  7.             FileMode.Open, FileAccess.Read, FileShare.Read))  
  8.       {  
  9.             int currentByte = stream.ReadByte();  
  10.             while (currentByte > -1)  
  11.             {  
  12.                   builder.Append(currentByte.ToString("X2", CultureInfo.InvariantCulture));  
  13.                   currentByte = stream.ReadByte();  
  14.             }  
  15.       }  
  16.    
  17.       return builder.ToString();  
  18. }  

среда, 13 января 2010 г.

Теперь я окончательно счастлив с Google Chrome

Давно перешёл на Dev канал обновлений Google Chrome. И уже достаточно давно использую его 4 версию. Там появились две вещи, которые я ждал очень долго:

  1. Синхронизация закладок браузера с Google Bookmarks (правда это прикольно сделано через папку в Google Docs).
  2. Возможность установки плагинов/дополнений.
Теперь можно забыть про остальные браузеры =DD
Вот так выгляди мой Хром :)

Кто не заметил, плагины справа от строки ввода адреса :)

четверг, 7 января 2010 г.

LINQ: интересный подход к написанию парсеров

В рамках одного небольшого проекта появилась задача обработки достаточно простого языка. Курс трансляции в университете я успешно прошёл, но к сожалению писать так как нас учили не очень хотелось, всё таки Ахо и компания написали свой монументальный труд около двух десятков лет назад, поэтому хотелось чего-нибудь интересного. В результате гугле нарвался на замечательную статью, которая продемонстрировала, как можно использовать LINQ выражения для парсинга: Monadic Parser Combinators using C# 3.0.