Зворотна сумісність – це серйозно
… також відомий як “Not a kernel guy”
Раніше я якось не замислювався, що забезпечення сумісності нової версії операційної системи з наявними програмами – складне завдання. Поки що не зіткнувся сам. Тепер, трохи поварившись у цьому казані, я почав ближче до серця приймати історії, на кшталт тих, що розповідає Raymond Chen.
Перед виходом Windows Vista, як, втім, і перед виходом попередніх версій системи, було протестовано величезну кількість програм на сумісність із новою версією ОС. Крім помилок у самій операційній системі було виявлено масу проблем із самими додатками: починаючи з дивацтв під час перевірки версії системи і закінчуючи грубими помилками в коді додатків, які раніше не виявлялися лише з чистої випадковості. Наприклад, одна з програм робила перевірку на наявність заборонених символів у дорозі та до списку заборонених (на думку програми) символів входили круглі дужки. В результаті, воно відмовлялося працювати в каталозі “Program Files (x86)”, де за замовчуванням встановлюються всі 32-бітові програми на 64-бітній системі.
Помилки виявлені в системі були виправлені. Не скажу, що абсолютно все, але, безперечно, переважна більшість помилок була виправлена. Залишилася проблема, що робити з помилками у самих додатках. У Windows ця проблема вирішується за допомогою механізму латок.
Як правило, латки перехоплюють виклики системних функцій та імітують поведінку попередніх версій системи. Найпростіший приклад – латка перехоплює виклики функції GetVersion та GetVersionEx і повертає Window XP SP2 як версію системи. Для деяких програм цього достатньо, щоб привести їх до тями. Інші латки роблять складніші речі: виправляютьhard coded шляхи, коректно обробляють коди помилок на зразок ERROR_ACCESS_DENIED і т.д. Зауважу, що хоча я використовую слово “латки”, ці латки за великим рахунком не змінюють код програми.
Список чи точніше база "проблемних" додатків дуже велика. У скомпільованому вигляді вона займає більше 2-х мегабайт у Windows XP SP2 і більше 4-х мегабайт у Windows Vista (сумарний обсяг всіх .sdb файлів у каталозі %windir%AppPatch). У основі вказуються всі ознаки, якими розпізнається додаток: інформація про версії, розмір і контрольна сума файлу, імена супутніх файлів тощо. Там же вказується список латок, що застосовуються для кожної програми.
Навіщо це все потрібне? Про це добре написав Joel Spolsky у статті How Microsoft Lost the API War. Завдяки цим зусиллям на Windows досі можна запустити дуже старі програми, які працюватимуть, як ні в чому не бувало. Користувачі можуть розраховувати, що перехід на нову версію системи з великою ймовірністю не спричинить проблем із сумісністю. Зрештою, це, мабуть, один із факторів, що призвів до домінування Windows на персональних комп'ютерах.