|
Декларативное рулит
|
|
|
| Век живи - век учись |
[Янв. 30, 2008|13:10 pm] |
|
Логи моего антивируса Avast отъели 600 метров. |
|
|
| Stream Processing Functions |
[Янв. 3, 2008|02:52 am] |
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, заменяющая в этой же строке последовательность "�xx;" на символ с соответствующим кодом. Ну и так далее, по цепочке. То есть, в терминах Хаскеля, большой кусок программы - это композиция функций [Char] -> [Char].
Есть идея сделать так, чтобы входная строка обрабатывалась посимвольно пайпом (композицией SPF), и промежуточные строки не создавались вовсе. Возможно, для достижения максимальной производительности длинный пайп придется порезать в нескольких местах, создав промежуточные строки, чтобы не переполнялись кеши процессора, но это несущественно.
Хочется сделать DSL, компилирующийся в такой код на С++, который бы я сам написал, если б делал всё руками на С++. Для этого мне нужно:
- Понять, каким будет входной язык
- Понять, каким будет выходной код
Для начала мне нужны как минимум референс-реализации UnescapeSlashTab на С++ и на Хаскеле. При этом в С++ должны быть "списки ввода"/итераторы ввода без какого-либо оверхеда, а на Хаскеле должен быть максимально идиоматичный код, и чтобы было понятно, как составить пайп из нескольких функций-обработчиков. Естественно, нужны good list producers/consumers, чтобы list fusion работал и пайп не ел всю память на гигабайтных списках.
Реализацию на С++ я нахакал вчера. Получилось жутко, часть идентификаторов не используется, но этот код прошел формальные юнит-тесты и неформальное тестирование на тестовом датасете, поэтому считается довольно стабильным, и выложу его как есть. На днях причешу и выложу следующую версию, но замечания, порицания и рацпредложения приветствуются.
( Детям до 16 не смотреть ) |
|
|
| Чудеса, да и только |
[Дек. 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 - Информационное:чем больше доход у человека, тем он в среднем политически правее. Успешному человеку кажется, что своим успехом он обязан своим достоинствам, а неудачнику - что в его неудачах виновато несправедливое общество. То же самое происходит и с другими параметрами неравенства, чем доход |
|
|
| navigation |
| [ |
viewing |
| |
most recent entries |
] |
| [ |
go |
| |
earlier |
] |
| |
|
|