Шлемиль, нелинейный код и тенденции.
Май 19, 2008
Собственно иногда хочется поговорить о том, что крутится в голове. Когда там возникают противоречия между двумя ре�?ениями, и незнае�?ь чему отдать предпочтение (хотя вернее было бы, выделить из каждого ре�?ения верную мысль). Вот вам примерчик. Начну конечно с лирического отступления.
Шлемиль устроился на работу маляром, и должен был наносить разметку посредине дорог. В первый день он взял бочку краски и разметил 300 метров дороги. «Неплохо! – сказал босс. Ты быстро работае�?ь!» и заплатил ему за день. На следующий день Шлемиль осилил только 150 метров. » Ну что ж, не так здорово, как вчера, но ты все равно быстро работае�?ь. 150 метров – это не мало», – сказал босс и заплатил ему денежку. Еще через день Шлемиль расчертил 30 метров дороги. «Всего 30 метров!» – рассвирепел босс. – Это никуда не годится. В первый день ты сделал в десять раз боль�?е. Что случилось?»
«Ничего не могу поделать, – говорит Шлемиль. – С каждым днем приходится все даль�?е и даль�?е уходить от бочки с краской».
Красочный анекдот. Но вы даже не подозреваете, что ежедневно сталкиваетесь с таким кодом, и мало того такой код пи�?ете! Не верите? А я докажу
void strcat(char* dest, char* src)
{
while(*dest) dest++;
while(*dest++ = *src++);
}
Собственно этот код, код strcat, который можно легко найти в книге Кернигана и Ритчи «Язык программирования С», одобренный отцами С, имеет крайне досадную о�?ибку. При конкатенации двух строк эта функция проходится полностью по исходной строке в поисках ее окончания, а после уже копирует в свой конец вторую строку. Понимаете к чему клоню? Если мы будем соединять 10 строк по десять символов, то каждый раз функции придется пробегать на 10 символов боль�?е. А если таких строк миллион? Невооруженным взглядом видно, что время выполнения функции возрастает. Умные и хитрые программисты сделали так:
char* mystrcat(char* dest, char* src)
{
while(*dest) dest++;
while(*dest++ = *src++);
return --dest;
}
Таким образом функция возвращает обратно позицию последнего символа (не нуля) и с этого места будет продолжать соединение строк. Ура у нас получилось. Ре�?ение найдено и количество строк нас боль�?е пугать не будет. Ну кто-то может возразить: «Погнал тут тему! Да С настолько низкоуровнев, что его часто с асмом сравнивают, да и в скомпилированном виде он будет работать в сотни раз быстрее чем любой из интерпретируемых скриптовых языков.» Это правда, но подобный код встречается на каждом �?агу. Пусть имеется таблица данных в XML формате:
<?xml tic-tac>
<mylib>
<book>
<title>Язык программирования С.</title>
<author>Керниган & Ритчи</author>
</book>
<book>
<title>�?скусство программирования для UNIX</title>
<author>Рэймонд</author>
</book>
</mylib>
Вопрос следующий: Как перемещаться от одной записи к другой? Собственно нужно быстренько воспользоваться функциями, которые предоставляет DOM, проанализировать xml файл, ссоздать дерево в памяти, с которым можно будет легко и быстро работать. С парой оговорок: во-первых, боль�?ие базы в xml держать не стане�?ь, потому что предполагается. что памяти хватит на всю структуру; во-вторых, именно синтаксический и лексический анализ самого xml-файла будут составлять крайне медленную, если не самую медленную, часть при генерации страницы. Вообщем не задумываясь над «мелочами» мы ваяем свой код, который не есть оптимизированный.
Оппозицией всего вы�?е сказанного служит экономическая оценка. Несмотря на нелинейный код, возрастающее время выполнения простей�?их действий, на�? железный друг (нет, не автомобиль) обрастает колосальными возможностями, а серверные их вариации вообще ни с чем в сравнение не идут. Добавить ко всему этому возможность получить бОль�?ие деньги за быстронаписанный проект, и размы�?ления о таких мелочах как время выполнения операций остаются позади, тем более что человеком это будет практически неощутимо.
Подытожив свои размы�?ления, замечу, что все же было бы правильнее копаться дото�?но в своем коде. �? устраивать разбор полётов, хотя бы для того, чтобы знать как это все работает. Делать это луч�?е в свободное время, когда голова не занята проблемой денег и мыслится хоро�?о. Надо воспитывать в себе грамотного хоро�?его программиста и спеца. В конце концов, именно любознательность выделяет хакера из простых смертных.

Май 21st, 2008 at 6:01 пп
любознательность выделяет, в первую очередь,любознательных-)
а уж-то что %-компьютеризации сильно увеличился, то и то, что ты сказал-))
Июнь 5th, 2008 at 8:31 пп
Ои 0о
Это что Си�?ник?!
круто =)
Июнь 5th, 2008 at 10:13 пп
почему си�?ник? моя точка зрения такова, что нужно знать не язык, чтобы писать приложение, а под приложение выбирается язык, поэтому хоро�?о знать многое
Июнь 19th, 2008 at 1:23 пп
напи�?и хоть, что по мотивам этой статьи писал
http://local.joelonsoftware.com/mediawiki/index.php/Назад%2C_к_основам
Июнь 19th, 2008 at 3:11 пп
странно, я вроде указывал… видно в другой статье… товарищи см коммент вы�?е.=)
Июль 25th, 2008 at 9:57 дп
Как говориться плавают разными стилями а тонут – одним.
Июль 31st, 2008 at 8:39 пп
Прикольно. В закладках. Как раз думал с этим попробовать что-то!
Сентябрь 2nd, 2008 at 2:03 дп
Советую подписку на ленту новостей разместить на видном месте! Людей будет боль�?е! Особенно на таком ресурсе, как у вас! Проверяла!