Следующая статья: Среда общения, научная фантастика и психические расстройства.
Windows содержит целый ряд нетривиальных и изящных фокусов, которые гарантируют, что при переходе на новую версию операционной системы все старые приложения продолжат работать. Я впервые узнал об этом от одного из разработчиков популярной игры SimCity. Он рассказал мне, что в приложении была допущена критическая ошибка: оно использовало память сразу же после ее освобождения. Это серьезное нарушение, которое нормально работало в DOS, но отказывалось работать в Windows, где освобожденная память с большой вероятностью немедленно захватывалась другим выполняемым приложением. Группа тестирования проверяла различные популярные приложения и правильность их работы в Windows, но игра SimCity раз за разом зависала. Об ошибке сообщили разработчикам Windows; те дизассемблировали SimCity, выполнили пошаговую отладку, нашли ошибку и включили в Windows специальный код. При запуске SimCity этот код переводил распределитель памяти в специальный режим, в котором было возможно использование памяти после ее освобождения. Молодые и неопытные программисты от подобных вещей лезут на стены. Однако именно такие трюки определили успех Windows. Рэймонд Чен, ветеран из группы Windows компании Microsoft, сможет объяснить это лучше других.
Почему бы просто не заблокировать приложения, зависящие от недокументированных функций системы? Потому что каждое заблокированное приложение станет лишним поводом для отказа от перехода на следующую версию операционной системы Microsoft® Windows®. Только посмотрите, сколько программ перестало бы работать при переходе с Windows 3.0 на Windows 3.1:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\
Windows NT\CurrentVersion\Compatibility
Причем этот список далеко не полон. Во многих случаях решение проблемы совместимости встраивается в базовые компоненты сразу для всех программ, а не для одной конкретной программы, как в этом списке.
(Аналогичный список для перехода с Windows 2000/Windows XP хранится в каталоге C:\WINDOWS\AppPatch в двоичном формате, повышающем скорость сканирования.
Для его просмотра следует использовать программу Compatibility Administrator из пакета Application Compatibility Toolkit1).
Стали бы вы покупать Windows XP, зная о несовместимости всех этих программ?
Всего одна несовместимая программа может повлиять на решение об обновлении.
Допустим, вы руководите технической службой некоторой компании. В вашей компании используется редактор ProgramX; выясняется, что программа ProgramX по какой-то причине несовместима с Windows XP. Станете вы обновлять систему?
Конечно, нет! Ведь это парализует всю работу.
«Почему бы не позвонить в компанию CompanyX и не попросить обновление?»
Разумеется, это можно сделать. Вам ответят: «А, так вы используете ProgramX версии 1.0. Вам нужно обновить ее до версии 2.0, это будет стоить 150 долларов за одну копию». Поздравляю, затраты на переход к Windows XP возрастают втрое.
Притом это только в том случае, если вам повезло, и CompanyX еще продолжает работу над продуктом.
Припоминаю результаты одного опроса, проведенного нашей группой обновления среди корпораций, использующих Windows. Практически в каждом случае отыскивалась одна «критическая» программа, которая в обязательном порядке должна была поддерживаться Windows, иначе компания отказывалась от обновления. Нередко программа была написана кем-то из программистов самой компании на Microsoft Visual Basic® (иногда даже на 16-разрядном Visual Basic), а человек, который написал программу, давно уволился. В отдельных случаях не было даже исходного кода программы.
Причем проблема касается не только корпоративных клиентов, но и рядовых пользователей. В Windows 95 моя работа по проверке совместимости приложений была направлена в основном на игры. Игры давно стали важнейшим фактором потребительских технологий. Видеокарта типичного компьютера со временем становится все более мощной, потому что этого требуют компьютерные игры (конечно, Microsoft Office Outlook® совершенно не нужно, чтобы ваша видеокарта умела рисовать 20 суперпупериллионов треугольников в секунду). А если ваша игра откажется работать в новейшей версии Windows, вы откажетесь от обновления.
Как бы то ни было, разработчики игр в чем-то очень похожи на крупные корпорации, о которых я говорил. Я обзванивал одну компанию за другой, пытаясь добиться от них помощи в запуске игры под Windows 95. Их это совершенно не волновало. Жизненный цикл игры длится несколько месяцев, и он уже завершился. Зачем тратить время на выпуск заплатки, обеспечивающей запуск игры в Windows 95? Деньги уже получены. На этой игре больше не заработаешь; ее время прошло уже три месяца назад. Разработчики неохотно идут на выпуск заплаток; они перестают следить за тем, какие версии программы были выпущены, и в каких версиях существовала та или иная проблема. Иногда у них даже не остается исходных кодов программы.
Короче, их попросту не волновало, что программа не запускается в Windows 95.
(Мой любимый пример - программа, которая пыталась руководить моими действиями при создании загрузочной дискеты).
Да, и пакет Application Compatibility Toolkit, о котором я уже упоминал, - этот замечательный инструмент был крайне полезен и для разработчиков. Одним из его компонентов был Windows Application Verifier: если запустить вашу программу под его управлением, он отслеживал вызовы сотен функций API1 и передавал управление отладчику при выполнении недопустимых действий (скажем, повторного закрытия идентификатора (handle) или выделения памяти функцией GlobalAlloc с последующим освобождением функцией LocalAlloc).
Новая архитектура совместимости приложений в Windows XP обладает одним серьезным преимуществом (с точки зрения разработки ОС): видите длинный список DLL-библиотек в каталоге C:\WINDOWS\AppPatch? Именно здесь теперь сосредоточено большинство изменений, направленных на сохранение совместимости. Заплатки совместимости перестают загрязнять основные файлы ОС (хотя не все решения проблем совместимости удается оформить в виде DLL, этот механизм все равно чрезвычайно полезен)2.
- Функция API - запрос от программы к системе Windows на выполнение какой-то операции.
- DLL - файл с расширением .DLL, содержащий код, который может использоваться уже работающей программой. Например, если вы хотите написать программу проверки орфографии, которая могла бы использоваться всеми программами, но не занимала память во время бездействия, оформите ее в виде DLL и загружайте из своих редакторов, электронных таблиц и так далее по мере надобности. Большая часть функциональности Windows реализована в формате DLL, и в каталоге Windows можно найти сотни этих библиотек.