НОВИНКИ 2002! http://www.ifarus.com 
Налоговое освобождение с аудитом по цене от $63. 
Новое поколение информационных разработок в области налогового планирования для бизнеса и частных лиц. Бесплатно БД (170 Мб; более 2000 прикладных статей о налогах).
 
Готовые фирмы в РФ и офшорных юрисдикциях по оптовым ценам. 
Сайт Группы – это центр оптовых цен на готовые фирмы. Наши цены уникальны. Вы можете купить российскую фирму без смены учредителей за $135 или компанию в Панаме с зарегистрированным офисом и номинальным сервисом всего за $750.
 
Бесплатный e-журнал налогового планирования.


Почему они никогда не будут работать быстрее

CyberManiac (cybermaniac2002@mail.ru)

Самое главное глазами не увидеть, мозгами не понять.
Антуан де Сент-Экзюпери и Егор Летов

Полтора года назад написал я статью (которую можно прочесть в Internet Zone №119) на весьма животрепещущую тему: "Как заставить программы работать еще быстрее?" O, святая наивность... Нет, разумеется, я написал правду - предложенный метод "ускорения" программ вполне работоспособен и я продолжаю успешно его использовать до сих пор несмотря на то, что давно уже сменил Windows 98 на Windows XP. Но скажите честно: ожидая завершения работы очередного "задумчивого" приложения, не задавались ли вы вопросом "Почему программы работают именно с той скоростью, с какой они работают? Какой злобный монстр, пожирающий ресурсы и отравляющий жизнь простого пользователя, прячется во всех этих мегабайтах?". Одни по привычке винят во всем Билла Гейтса и одну-очень-известную-операционную-систему, другие видят корень зла в чрезмерной коммерциализации высоких технологий, третьи списывают все на ленивых программистов, предпочитающих в рабочее время играть в тупые игрушки вместо того, чтобы приводить в порядок свои творения. И то, и другое, и третье имеет место, а приложив минимальные усилия, можно найти еще с десяток очевидных причин. Но если применить к проблеме мой любимый принцип "все связано со всем", сквозь эти разрозненные детали проступает некая система. Темная Сторона высоких технологий. Однако мы находимся не "в одной далекой галактике", а потому наша доморощенная Темная Сторона отлично обходится без всякой мистики. Мы сталкиваемся с ее проявлениями настолько часто, что уже не удивляемся очевидным несообразностям и даже более того - считаем их совершенно естественными. Ну чтож, попробуем найти в нашей среде обитания что-нибудь новое и удивительное. А заодно и найти ответ на самый философский вопрос в мире - "отчего программы тормозят и глючат".

Покупатель всегда проигрывает

Представим себе такую ситуацию: пользователя перестала удовлетворять производительность его компьютера. Ну там памяти для новой Windows не хватает или процессор для последней версии Word'а уже слабоват оказался. Что обычно делают в таких случаях? Правильно, вытаскивают старый процессор и ставят новый, добавляют памяти, иногда еще и кулер приходится менять. Или просто отдают компьютер в сервисный центр, где специалисты проделывают те же самые операции, но уже за деньги. И ни у кого не вызывает удивления, что вместо "топовых" Athlon XP или Pentium 4 (которые в свою очередь бывают с разными тактовыми частотами - и соответственно, с разными ценами) в ту же самую материнскую плату можно воткнуть более дешевый Дурик или Целик соответственно.

А теперь представим другую ситуацию. Вышел-таки обещанный DOOM 3. Который все, что хуже, чем Radeon 8500 или GeForce 4 вообще за видеокарты не считает. А посмотреть очень хочется - что для этого нужно сделать? Тоже правильно, спихнуть кому-нибудь старую видеокарту и купить вожделенный GF4, установить его, снести старые драйвера (вообще-то надо бы заранее, но кто об этом помнит), потом поставить новые и надеяться, что не придется переустанавливать Windows, которая отчего-то сильно недолюбливает такие эксперименты. А теперь вопрос - почему нельзя как в первом случае просто заменить процессор? Или другой вопрос - чем, к примеру, GeForce 3 Ti200 отличается от GeForce 3 Ti500, кроме цены и надписи на коробке? Только частотой работы памяти и GPU - причем эту частоту можно регулировать программно! То есть если память хорошая - будет Ti500, а если дешевая - Ti200. Но почему тогда нельзя наращивать память на видеокартах стандартными модулями - ведь ни для кого не секрет, что чипы (если, конечно, не вспоминать древние времена) используются те же самые, что и для обычной оперативной памяти. Разумеется, производители видеочипов и видеокарт будут отрицать наличие злого умысла и утверждать, что от этого видеокарты будут стоить дороже - но ведь большинство пользователей согласно один раз заплатить дороже чтобы иметь возможность постепенно улучшать видеокарту в соответствии с потребностями. Более того, лет пять-шесть назад некоторые видеокарты действительно позволяли наращивать память - но тут настала эпоха 3D-ускорителей, и все стало совсем по-другому.

Конечно, производителям видеокарт выгодна ситуация, когда их продукция морально устаревает за год-полтора, ведь кроме всего прочего это позволяет безнаказанно снижать надежность продукции (какой смысл делать железку, способную проработать 10 лет, если через три года ее все равно отправят на свалку). Однако пользователь не так глуп, как хотели бы производители железа, и отнюдь не жаждет расстаться со своими кровными. И тогда в ход идет другой механизм сравнительно честного отъема денег у граждан - "заказные" игры. Но об этом - четь позже, а для начала - новости "второй свежести" из мира компьютерных игр. Все про тот же DOOM 3. А именно - как утверждают разработчики, в этом самого DOOM 3 будут использоваться самые передовые возможности современных видеокарт, причем в качестве "идеальной" видеокарты предлагается Radeon 8500. Они же утверждают, что на GeForce4MX (вспомним, как всего несколько месяцев назад геймеры радостно встречали эту железку) смотреть на этот третий Дум будет куда менее приятно, а на GeForce 2 и ниже работать ОНО будет так, что лучше бы вообще никак не работало. Может быть iD Software действительно готовит нечто революционное, но меня почему-то гложет ощущение, что готовится всего лишь очередная кампания по добровольно-принудительной замене видеокарт. А то, понимаешь, засиделся народ на своих GF2MX и не торопится бежать за последними достижениями - нужно срочно оживлять рынок дорогостоящего барахла. Кстати, придумали этот прием далеко не в ATI - совершенно аналогичным образом Microsoft подняла продажи своего XBox за счет проекта Halo (PC-версию которого "отменили" ради этой высокой цели).

Или вот другой пример - уже из моего собственного опыта. Захотелось мне заиметь железку для дистанционного управления компьютером - люблю я слушать музыку лежа на диване, и подходить к компьютеру для того, чтобы запустить очередной плейлист или подправить громкость мне нет никакой радости. Из достоверных источников мне стало известно, что такая железка состоит из пяти деталек и стоит никак не более двухсот рублей. С паяльником я с детства не дружен, а потому мне показалось вполне логичным пойти в магазин и попытаться ее купить. И тут я с удивлением выяснил, что в радиусе 60 (!!!) километров такие железки фабричного производства вообще не продаются ни за какие деньги. Зато мне последовательно предложили приобрести беспроводную клавиатуру (каждая из которых была хуже той, на которой я набираю этот текст, но при этом стоила заметно дороже), CD-ROM с дистанционкой производства Creative (которые славятся, мягко говоря, невысокими способностями к чтению дисков) и TV-тюнер с пресловутым ПДУ! Только вот то, что мне действительно было нужно, никто предложить не мог.

В общем, мы можем наблюдать ситуацию, когда в прайс-листах крупных фирм все "в полном ажуре" - огромный выбор всевозможных комплектующих от разных поставщиков. Статьи с обзорами новых железяк плодятся как тараканы, передовая общественность затаив дыхание изучает, сколько гигабайт на кубометр способен выдавать новый винчестер и увлеченно спорит на темы вроде "нужна ли DVD-приводам задняя скорость". Однако при ближайшем рассмотрении оказывается, что для рядового пользователя, не отягощенного многобаксовой зарплатой, возможности выбора сводятся к двум позициям: "устаревшее" и "очень дорогое", причем то, что сегодня относится к категории "очень дорогое", максимум через полгода переходит в категорию "устаревшее". Отношение изготовителей железа (за редким исключением) к своей работе лучше всего описывается фразой "дадим потребителю не то, что ему нужно, а то, что нам выгодно" - и примеров тут огромное множество. Это и "слегка" недоработанные драйвера, которые не исправляются годами, и "мелкие недочеты" в дешевом железе (которые, конечно же, отсутствуют в более дорогих изделиях того же типа), и умышленное ограничение функциональности ради пропихивания на рынок более дорогих моделей: про Intel с последними Celeron'ами и NVidia с заведомо устаревшими на момент выхода GeForce 4MX знают все. И как ни злятся потребители, изменить уже ничего не получится - система отлажена и приносит немалый доход.

Враг внутри

Вы когда-нибудь работали в ДОС 3.30? Играли в Диггера на CGA мониторе? Пытались набирать текст с картинками в текстовом режиме? Тем, кто ни разу этим не занимался, возможно, было бы даже интересно попробовать. Но только один раз, чуть-чуть и чтобы не насмерть. Примерно как подержаться за высоковольтный кабель, точно зная, что тока в нем нет. Или пощелкать у виска курком незаряженного револьвера. Тогда поспешу вас порадовать: даже если вы сидите за самым последним четвертым Пентиумом с самым последним и не менее четвертым GeForce, эти нехитрые радости, за исключением, может быть, Диггера (ну слишком уж он быстро будет бегать), вполне для вас доступны. Потому что вы за них заплатили. А еще вы заплатили за дефективную пищалку с гордым названием "писи-спикер". И за совместимость с дисководами калибра 5.25 дюйма, которые еще изредка встречаются на близлежащей помойке. Загляните в Setup и вы сами все это увидите. И никогда не забывайте, а то вдруг понадобится: ваша чудесная звуковая карта, способная выдавать 24 бита на 96 килогерцах, всегда готова изобразить из себя Sound Blaster Pro, а то даже и чего похуже. И никого не волнует, что человек, купивший видеокарту за 250 у.е. даже кошмарные сны не станет смотреть в CGA-графике, а любители звука за 80-100 заграничных рублей проклянут самыми грязными ругательствами каждого, кто предложит им слушать музыку в режиме "моно, 8 бит, 11 килогерц". Нет, действительно, кому нужны все эти CGA и EGA-разрешения, совместимость с Adlib, работа в "голом ДОСе" и прочие реликты каменного века? Чтобы работали столь же древние и ненужные программы? Так для любой сколь-нибудь полезной программы почти наверняка существуют аналоги под Windows и Linux. А если "в других режимах не работает" - либо в ремонт, либо на свалку, третьего не дано. Или вот еще одна "жизненно необходимая каждому пользователю" фича - текстовый режим. Это чтобы из командной строки программы запускать можно было. Специально взяли и запихнули это счастье в железо. Несмотря на то, что у многих современных пользователей в текстовом режиме вообще нет никакой физиологической потребности, а те, кому он нужен, вполне удовлетворились бы его эмуляцией в обычных 800*600, true color.

Казалось бы, ну и пускай они будут, все эти древние режимы, ведь никому не мешают. Опять же "совместимость" в наличии. Конечно, все знают, что без молотка и напильника какой-нибудь доисторический "Трайдент" в четвертый Пентиум не воткнуть - ну и что с того, зато формально "совместимость" есть! Но если вопрос поставить несколько иначе: "согласны ли вы заплатить хотя бы один доллар за такую "совместимость" - большинство предпочло бы сэкономить на том, что им совершенно не нужно. А если учесть, что все эти древние режимы обычно были реализованы весьма замысловатым, если не сказать - бредовым, способом (кто программировал графику в EGA-режимах, тот знает, что я имею ввиду), то экономия пожалуй составит не один доллар, а поболее.

Но все приведенные выше примеры - ничто по сравнению с тем, что творится внутри наших несчастных процессоров. И даже более того - уже в ближайшие месяцы нас ожидает столь блистательный фейрверк маразма, что производителям видеокарт останется лишь кусать локти и честно признать себя неспособными к по-настоящему величественным глупостям. И подарит нам это незабываемое зрелище признанный лидер в области процессоростроения, локомотив передовых технологий, и так далее, и так далее - встречайте, AMD. Чтобы проникнуться глубиной и величественностью замысла процессоростроителей из AMD просто необходимо немного вспомнить историю всей линейки x86-совместимых. Иначе ничего не получится.

Итак, в тридесятом государстве при царе Горохе сделали 16-разрядный процессор и назвали его 8086. А на основе этого процессора соорудили некое подобие компьютера: PC XT. Был такой зарубежный аналог БК-0010. А еще в те же годы был Спектрум. Нет, Спектрум определенно был лучше. Но это была уже совсем другая история. Процессор, как я уже говорил, был 16-битный, а потому больше чем к 64 килобайтам памяти он по-человечески обращаться не умел. Но вот ведь незадача - Тетрис в 64 килобайта еще кое-как влазил, а вот чего посложнее - уже не всегда, поэтому было решено сделать память из 65536 сегментов по 64 килобайта каждый. Арифметика гласит, что если 64 килобайта умножить на 65536, получится целых 4 гигабайта. Но проектировщики твердо знали, что больше 640 килобайт ОЗУ не понадобится никому и никогда, а потому сделали эти сегменты взаимно перекрывающимися, и ценой бессонных ночей и каторжного труда добились того, что максимальный объем памяти все-таки стал равен 640 килобайтам. Прогресс не стоял на месте, и подошло время выпускать новый, 80286-й процессор. К этому времени выяснилось, что 640 килобайт все-таки маловато и новые версии Тетриса в них уже не умещаются. А тут еще на "больших" ЭВМ обнаружилась новая модная фишка - разные программы там работали как бы на совершенно разных машинах и, следовательно, не могли "повесить" другие параллельно работающие задачи. Проектировщики решили: "плохо это - когда у них есть, а у нас нет". И правильно решили. В общем, так и появился в 286-х защищенный (правда тогда его иногда называли Extended - "расширенный") режим. Не вдаваясь в технические подробности скажу, что радости от такого режима было немного, а программирование под него вообще выглядело как утонченная пытка. А поскольку среди программистов трудолюбивые идиоты с мазохистскими наклонностями встречаются не чаще, чем крокодилы на Колыме (это я вам как программист говорю), никто под этот режим особо и не программировал (не считая, конечно, одну-очень-известную-фирму, которая тогда была еще не очень известной). А потом был 32-разрядный 80386, в котором был и нормальный защищенный режим, и возможность адресовать большие объемы памяти без дополнительных ухищрений, и, разумеется, почти полная совместимость с 8086 и 80286 (ибо отказ от исполнения 16-разрядных приложений в те времена означал бы немедленное банкротство Intel). Шли годы, процессоры совершенствовались, к производству x86-совместимых "кафельных плиток" подключились AMD, Cyrix и многие другие. Все программы давно стали 32-разрядными. И заложенных еще в 80386 четырехгигабайтных сегментов до последнего времени всем вполне хватало. Правда в последние годы стало не очень понятно, какой тайный смысл заключен в том, чтобы из года в год впихивать в процессоры поддержку 16-разрядных программ. ДОС умер и похоронен. Windows 3.1 тоже загнулась, проткнута осиновым колом (чтобы вдруг не ожила) и с радостными гимнами закопана под самым высоким дубом. Вся линейка Windows 9x/Me официально отправлена Биллом Гейтсом на пенсию и тихо ожидает своего осинового кола и надгробной плиты. Даже колченогий уродец NT4, несмотря на свою 32-разрядность, в последнее время сильно сдал (и, по-моему, он куда более достоин осинового кола, чем Windows 98, честно отработавшая положенный срок).

Но вот пришло новое тысячелетие, потребности в памяти выросли и оказалось, что неплохо бы перейти на 64-разрядную адресацию, которая рассчитана на такие огромные объемы памяти, что трудно представить, какие данные можно в эти объемы запихать. В Intel решили, что всю эту историю с расширенными и углубленными режимами пора заканчивать и делать совершенно новый процессор. В AMD тоже решили - всю эту историю с расширенными и углубленными режимами нужно продолжать! И разработали архитектуру x86-64, которая позволяет без всяких переделок запускать на 64-разрядной машине 32-разрядные приложения. Надеюсь вы уже прониклись величием идеи - 64-битная надстройка над 32-разрядной версией 16-разрядного процессора! Так и хочется спросить "А Диггер? Диггер бегать будет?" И пусть только попробуют ответить "нет"...

А мораль сей басни проста: старому хламу место на свалке. Но никак не на рабочем столе.

ИзнаСИлование головного мозга

А сейчас я буду раскрывать самую темную и ужасную тайну современного программирования - "откуда в программах берутся глюки". И начну я эту часть стандартным в таких случаях предупреждением "детям, людям с неустойчивой психикой и фанатам С++ данный раздел читать не рекомендуется". Ибо далее последует огульное охаивание и охальное огуивание всего неразумного, злого и преходящего. И, разумеется, будут злостно подрываться основы коммерческой успешности отдельных крупных специалистов по языкам программирования. Вот видите, мне тоже не чужд гуманизм и человеколюбие. И поэтому я заранее постарался избавить себя, любимого, от потоков флейма на тему "С++ - самый-самый язык программирования в мире и только полный идиот может это не понимать". В общем, сейчас мы будем кратко знакомиться с современными языками программирования и теми огромными возможностями по созданию глюков и багов, которые эти языки могут нам предложить. Честно говоря, мы, передовые представители компьютерной общественности, гордо проигнорируем всякие Паскали-Бейсики и прочие Фортраны и сразу перейдем к самому правильному языку программирования, на котором пишется большинство программ (тормозных и глючных, хе-хе-хе) во всем мире. К С++. Потому что другие языки программирования нам не нужны.

На самом деле большинство людей, утверждающих, что они программируют (или умеют программировать) на С++, в действительности программируют на "языке, которого никогда не было", на "Классном Си" (это по аналогии с "Объектным Паскалем", а не потому что язык такой хороший). Почему же так мало людей программирует на "настоящем" С++? Одна из главных причин заключена в том, что лишь терпеливый человек способен прочесть последнее издание "Учения о программировании на С++" (конечно, Книга называется совсем по-другому, но от этого она не становится менее священной) написанного Б. Страуструпом. Истинно терпеливые достигают второй ступени посвящения - они знают Книгу наизусть. Но лишь терпеливейшие из терпеливых просветляются настолько, чтобы постигнуть смысл Книги. Почему же так мало избранных? Попробуйте сами прочесть Книгу. Если же вы считаете, что в жизни есть много куда более интересных вещей (и в этом я полностью с вами согласен), попробую описать свои собственные ощущения от чтения. Должен признаться, что Книгу до конца я так и не дочитал - силы воли не хватило.

Во-первых, это откровенно скучная Книга. Зато толстая. Книжки из серии "про Бешеного" определенно интереснее, к тому же их содержание не обязательно для запоминания. Во-вторых, основное содержание Книги - описание языка, то есть правила, особые случаи, исключения из правил, исключения из исключений из правил, исключения из исключений из исключений... - дальше, я думаю, продолжать нет смысла. Именно поэтому Книга является не просто Книгой, а Настольной Книгой программиста на С++ - удержать в памяти все это без шпаргалки практически невозможно. Вот, пожалуй, и все, что я нашел в этой книге, если не считать оглавления и предисловия. Но откуда там столько всего взялось, что одного только описания языка хватило на толстую книгу?

Все, как всегда, просто. Сначала был маленький язык Си, который был настолько маленьким, что даже про вещественные числа ничего не знал. А некоторые другие языки - знали. Непорядок - и в Си добавили вещественные числа. Потом туда же добавили много чего другого, в том числе совершенно мистические триграфы (которые даже в справке по компилятору GCC названы не иначе, как "brain-damage", в вольном переводе "мозги вывихнуть можно"). Потом в моду вошел объектный подход к программированию, и обычный Си срочно переделали в Объективный (потому что объектным языком программирования даже С++ не является - он объектно-ориентированный), а потом и в "Си два крестика". Первый крестик - на читабельности программ, второй - на быстродействии. Другие языки программирования тоже не стояли на месте и обрастали фенечками. А все самые яркие и блестящие фенечки очень быстро появлялись и в С++. В общем, фенечек стало так много, что упомнить, зачем каждая из них нужна (и нужна ли вообще), становилось все труднее. И тогда умные люди стали писать толстые книжки "про фенечки" и получать за это немалые деньги (вот потому-то они и умные. Шутка).

Кстати, про умных людей. Как только стало ясно, что Си - это всерьез и надолго, был создан комитет по стандартизации, потому как до этого компиляторы Си писали кому как вздумается, и нехитрая (с современной точки зрения) задача переноса чисто вычислительного алгоритма и то иногда вызывала трудности. Язык быстро привели в порядок, но комитет на всякий случай распускать не стали. И этот случай не замедлил появиться - как только С++ превратился из занятной игрушки в язык, пригодный для написания программ, стандартизировать начали уже его. К тому времени спецы из комитета по стандартизации успели привыкнуть к насиженным креслам, ударились в академическую деятельность, тесно связанную все с тем же С++, и вообще не горели желанием возвращаться "к станку". Однако "за просто так" в Америке деньги платят неохотно, поэтому требовалось срочно развить бурную, но не слишком обременительную деятельность. Усовершенствование языков программирования в этом смысле - почти идеальное занятие, особенно если не приходится самому реализовывать собственные ценные указания. И долгие годы С++ углублялся, расширялся, ускорялся и перестраивался, пока не достиг нынешнего уровня. Однако знакомые нам злобные монстрики, выведенные в лабораториях Microsoft, Borland, и иже с ними, на самом деле не соответствуют стандарту! Более того, нет ни одного компилятора С++, который полностью соответствовал бы стандарту - потому что стандарт составлен из такого количества разнородных кусков, скрепленных заплатами, что на программирование этого ушли бы годы. А стандарт еще и изменяется - ведь без этого невозможно было бы писать хвалебные статьи о "динамично развивающемся языке, вобравшем в себя новейшие технологии". Нет, отрасль программирования на С++ определенно создавали умные люди - это ведь не что иное, как действующий вечный двигатель! Судите сами: выпущен новый стандарт - получаем процент с продажи печатных экземпляров. Потом - платные консультации софтверным гигантам, выпускающим компиляторы С++. Вышли новые компиляторы - начинаем получать гонорары с книжек, в которых разъясняются новые возможности языка и как их можно попытаться использовать. Параллельно зарабатываем научные звания на комментариях к стандарту. На вырученные средства едим, пьем и радуемся жизни, главное - не забыть через пять лет снова собраться и принять очередной стандарт. Поэтому иногда я даже жалею, что когда я был маленьким, забыл придумать С++. А теперь уже поздно.

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

Но вернемся к нашим программам. Которые, как известно, тормозят и глючат. Чтобы никому не было обидно - мои программы тоже, бывает, страдают и тем, и другим, а иногда даже и тем и другим одновременно. Но те, которые тормозят и глючат сильнее, чем принято в приличном обществе, я либо дорабатываю по мере сил, либо выбрасываю.

Первое место в рейтинге багов и глюков традиционно занимает buffer overrun или "ой, эта штука залезла в чужую память". Врожденный дефект языка, который более чем за 20 лет жизни не потрудился обзавестись динамическими массивами и потому вынуждает копаться в ячейках памяти напрямую. Больше того, любая активная работа с памятью "в стиле Си" рано или поздно кончается именно этим - и не важно, какой язык программирования при этом использовался.

Второе место - у ошибок, связанных с выбором "не того" элемента из массива: "так как же все-таки эти вагоны считать - с нуля или с единицы"? В Визуальном Бэйсике - как больше нравится. В современном Паскале, который и не Паскаль вовсе, а Delphi - так и вообще хоть с минус единицы, но, к сожалению, не везде. В Си - только с нуля. И никак иначе. И десятый вагон в Си не десятый, а всего лишь девятый. Это невозможно понять, это нужно запомнить. Как и многое другое в этом языке.

Ладно, с глюками мы разобрались, теперь приступим к вопросу, который вынесен в заголовок статьи. Почему они все-таки работают так медленно? Но сначала расскажу одну историю. Как-то раз я написал программу, которая перемалывала большое количество текстовых данных. Программа работала довольно медленно - результата приходилось ждать по три минуты. Я тогда программировал на Borland C++ Builder под Windows NT 4. Мне подумалось, что во всем виноваты фирменные "борландовские" строки, взятые из Паскаля, и я заменил их где только смог на классические "сишные". Стало только хуже. Тогда я вернулся к старому варианту, начал проверять программу под Windows 98 и с удивлением обнаружил, что под этой ОС программа работает ровно в шесть раз быстрее! Тогда я загрузил Windows 2000 и проверил скорость работы - получил те же 30 секунд, что и в 98-м! Через весьма непродолжительное время WinNT4 была безжалостно снесена и больше никогда не устанавливалась.

Возможно, мне просто не удалось найти правильный подход к тонкой и нежной душе NT4, но я из своих злоключений сделал другой вывод: главное - чтобы везде были хорошие алгоритмы. В NT4 какой-то из алгоритмов оказался плохим. В Microsoft это заметили, исправили и в результате я получил рост производительности в 600%. Собственно, важность использования правильного алгоритма я впервые понял еще в седьмом классе, когда ускорил работу программы в 16 раз, переписав в ней два десятка строчек. Более того, хороший алгоритм, реализованный на "неправильном" языке программирования, очень часто работает гораздо эффективнее, чем плохой алгоритм, написанный на языке "правильном". Но в своих собственных программах каждый из нас - "царь и бог", а вот когда неудачные алгоритмы заложены в стандарт языка программирования или недра операционной системы - тут и начинаются настоящие проблемы с быстродействием.

К примеру, как в Си реализованы строки? Строки в Си должны заканчиваться символом с кодом "ноль". И только какой-нибудь мальчик из детского сада может сказать: "А почему ноль? Не хочу ноль, хочу единицу!" Такая вот современная вариация на тему "а король-то голый". А действительно, если вдруг кому-нибудь понадобится использовать в текстовой строке "нулевой" символ - что делать? Вот во всяких неправильных Delphi почему-то можно пользоваться всеми символами, а в Си - всеми, кроме одного. То есть и в Си, конечно, можно - если очень хочется, но только про стандартные библиотеки для работы со строками в этом случае придется забыть и писать свои собственные. В которых не будет "проблемы номер ноль". Вообще, такой подход, когда "все символы равны, но некоторые из них более равны, чем другие" породил огромное количество проблем. К примеру, в ФИДО до сих пор приручают букву "Н", а некоторые русские буквы не дают нормально работать FoxPro (а это уже куда серьезнее - ведь программы на FoxPro, как ни странно, все еще используют в отделах кадров и бухгалтериях).

Между прочим, этот самый "нулевой" символ в конце строки самым прямым образом отражается на быстродействии программ, работающих со строками. А таких программ не так уж и мало, и одна из таких программ - операционная система (и не важно, как она называется - их сейчас все пишут на Си). Например, если программе нужно узнать длину строки, в действительности ей приходится "пробежаться" по всей строке, пока она наконец не наткнется на "нулевой" символ. И такие "пробежки" программе приходится выполнять практически при любой операции со строками. Так уж принято. И это "принято" освящено стандартом на язык Си. А ведь кое-где принято записывать длину строки в самом ее начале - и программе не приходится тыкать пальцем в каждую букву, чтобы узнать сколько этих букв в слове "форточки".

Не могу не упомянуть крайне нелюбимые мной заголовочные файлы. Поначалу я думал, что это очень хорошо - когда можно посмотреть определение любой структуры или функции, заглянув в заголовочный файл. Хотя уже тогда мне не нравилось, сколько времени уходит на "переваривание" этих файлов компилятором. А потом я неожиданно для себя столкнулся с величайшим изобретением в истории программирования - документацией. Оказывается, если она есть - нет никакой необходимости читать файлы заголовков. Когда документация написана хорошо - в ней содержится столько информации, сколько в заголовочный файл при всем желании не втиснуть. А если ее нет вообще - стоит ли связываться с кодом, который оказался не нужен даже его авторам? А заголовочные файлы для программирования под Windows - это отдельный больной вопрос. Иногда мне даже кажется, что эти заголовочные файлы занимают на моем винчестере больше места, чем сама Windows. Да и компилируются программы для Windows, написанные на С++, примерно в 10 раз дольше, чем аналогичные, но написанные на ассемблере. Или на Delphi. Или на Visual Basic. Однако, тенденция.

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

Причина иррациональная. Трудное детство, чугунные компьютеры, привинченные трехдюймовыми рым-болтами к бетонному полу и единственное воспоминание о прошлом - генералы армии США в хромовых сапогах, раздающие приказы: "или завтра ракета полетит в квадрат Б, или послезавтра вы все полетите отсюда без выходного пособия". И вдруг - персональные компьютеры, кофеварки с микропроцессорами - и никаких очередей за машинным временем, бессонных ночей, а главное - трудностей, через которые просто обязан пройти каждый "настоящий программист". В конце-концов, это просто обидно. Но тут стареющим бойцам невидимого фронта дали шанс. И они его не упустили: появятся завтра квантовые компьютеры, фотонные или какие-нибудь еще - и на них сразу же появится Си. И очередное поколение программистов будет упражняться в адресной арифметике, запоминать, что вагоны нумеруются с нуля и зубрить правило "написал switch - не забудь break". И им тоже будет тяжко, больно и трудно.

Причина рациональная. Хотя об этом сейчас вспоминают все реже и реже, Си вышел не "из народа", а из недр AT&T. А телефонные компании в Америке начала 80-х были тем же, чем стала Microsoft на гребне своего могущества (и, надо отметить, телефонные компании в те времена любили ничуть не больше, чем сейчас любят Microsoft), а AT&T была крупнейшей из телефонных компаний. И все, что выходило из исследовательских центров этой компании, было обречено на успех, ведь поддерживая ведущего игрока на рынке прогореть можно только в одном случае - если прогорит лидер. А лидеры рынка прогорают редко. И неважно, суждена инициативе лидера долгая жизнь, или совсем короткая, главное - "засветиться" рядом, ухватить свою толику славы, а потом эксплуатировать ее, эксплуатировать и еще раз эксплуатировать.

Продолжение следует…

Сайт автора: http://inqsoft.tsx.org или http://kickme.to/inqsoft

 


Copyright © "Internet Zone", http://www.izcity.com/, info@izcity.com