Home
nponeccop [entries|archive|friends|userinfo]
Декларативное рулит

Site Meter

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Век живи - век учись [Янв. 30, 2008|13:10 pm]
Логи моего антивируса Avast отъели 600 метров.
ссылкаОставить комментарий

Stream Processing Functions [Янв. 3, 2008|02:52 am]
[Tags|]

vag_vagoff подкинул мне документ, в котором рассказывается о Stream Processing Functions (SPF) как об одной из важных идиом программирования с использованием "вычислений по мере необходимости" (call by need). Я так и не разобрался с ленивостью, поэтому избегаю данного термина :-\

Идея построить мой MPI-проект на SPL была у меня давно, но мне до сих пор не хватает знаний. Поэтому объяснять буду на примере.

Есть функция, заменяющая в строке последовательность двух символов \t на запятые. В первоначальном варианте на С++ она выглядит так:
void UnescapeSlashTab2(std::string &line)
{
	std::string::size_type pos = line.find("\\t");
	while (pos != std::string::npos)
	{
		line.erase(pos, 1);
		line[pos] = ',';
		pos = line.find("\\t", pos);
	}
}
Обычная функция replaceAll "заменить все вхождения строки А на строку Б". Конечно же, junk code c точки зрения производительности, но речь не совсем об этом.

После этой функции идет такого же рода функция UnescapeEntities, заменяющая в этой же строке последовательность "&#00xx;" на символ с соответствующим кодом. Ну и так далее, по цепочке. То есть, в терминах Хаскеля, большой кусок программы - это композиция функций [Char] -> [Char].

Есть идея сделать так, чтобы входная строка обрабатывалась посимвольно пайпом (композицией SPF), и промежуточные строки не создавались вовсе. Возможно, для достижения максимальной производительности длинный пайп придется порезать в нескольких местах, создав промежуточные строки, чтобы не переполнялись кеши процессора, но это несущественно.

Хочется сделать DSL, компилирующийся в такой код на С++, который бы я сам написал, если б делал всё руками на С++. Для этого мне нужно:
  1. Понять, каким будет входной язык
  2. Понять, каким будет выходной код
Для начала мне нужны как минимум референс-реализации UnescapeSlashTab на С++ и на Хаскеле. При этом в С++ должны быть "списки ввода"/итераторы ввода без какого-либо оверхеда, а на Хаскеле должен быть максимально идиоматичный код, и чтобы было понятно,   как составить пайп из нескольких функций-обработчиков. Естественно, нужны good list producers/consumers, чтобы list fusion работал и пайп не ел всю память на гигабайтных списках.

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

Детям до 16 не смотреть )
ссылка5 комментариев|Оставить комментарий

Чудеса, да и только [Дек. 24, 2007|17:18 pm]
Flagellum - Wikipedia, the free encyclopedia:
The rotor alone can operate at 6,000 to 17,000 rpm, but with the flagellar filament attached usually only reaches 200 to 1000 rpm.
ссылкаОставить комментарий

Политическое [Дек. 17, 2007|13:01 pm]
Ilya - Информационное:
чем больше доход у человека, тем он в среднем политически правее. Успешному человеку кажется, что своим успехом он обязан своим достоинствам, а неудачнику - что в его неудачах виновато несправедливое общество. То же самое происходит и с другими параметрами неравенства, чем доход
ссылка1 комментарий|Оставить комментарий

Песня Цоя в исполнении Надежды Кадышевой [Дек. 11, 2007|12:00 pm]
http://www.youtube.com/watch?v=e2nYgVt0lEA

Собственно, для тех кто знает кто есть сии Кадышева и Цой
ссылка5 комментариев|Оставить комментарий

navigation
[ viewing | most recent entries ]
[ go | earlier ]