Программа расширяющая возможности основной программы что это

Содержание

В мире ПО существует огромное количество программ, забытых своими разработчиками. Хорошо, когда уже есть хорошая альтернатива. А если ее нет? В программе может катастрофически не хватать каких-то мелочей, некоторые досадные ошибки могут годами доставлять массу неудобств пользователям, а на новых версиях ОС программа и вовсе может отказаться работать.

Далеко не всегда имеются исходные коды, чтобы привести программу в порядок. Если программа простая — не составит труда за короткий срок создать альтернативу. Но если программа большая и сложная, что же делать в таком случае? Не всегда рационально тратить время и деньги на разработку полного аналога, ведь расширить в разумных рамках функциональность и исправить большинство ошибок можно уже в готовом исполняемом файле.
В этой статье будут продемонстрированы методики модификации исполняемых файлов на примере расширения функциональности легендарной игры Age of Empires II (стратегия реального времени).

Итак, что же мы имеем:

Рабочие программы как структурный элемент основной образовательной программы»

  • игра вышла в 1999 году и имеет статус abandonware — то есть она более не выставляется на продажу производителем и не приносит прибыли
  • последнее обновление выпущено в 2000 году, доработка не производится
  • игра является хорошим примером сложного ПО, полный аналог которого практически невозможно создать заново
  • имеются досадные ошибки, которые не были исправлены разработчиками

Отказ от ответственности

Работа проведена исключительно в образовательных целях, и ни в коем случае не является призывом к нарушению действующего законодательства. Автор не несёт никакой ответственности за незаконное использование представленных материалов.

Сведения о «пациенте»

Исследуемая игра написана на движке Genie, разработкой которого с 1997 до 2000 года занималась компания Ensemble Studios. За это время на данном движке было выпущено 4 игры из серии Age of Empires. Далее Genie был лицензирован компании LucasArts, которая в 2001-2002 годах выпустила еще 2 игры на этом движке, но уже из серии Star Wars. К этому времени движок уже сильно устарел, поскольку работал в режиме 256 цветов, что очень скромно по сравнению с играми даже 2000 года. Именно поэтому доработка движка была остановлена, новых игр на его основе не выпускалось.
Игровой движок Genie загружает всю игровую графику, музыку, а главное — списки юнитов и их характеристики — из внешних файлов. То есть все игры на базе этого движка по большей части имеют очень похожие исполняемые файлы, и практически все модификации для одной игры без особых проблем портируются на другие.

Чего мы хотим добиться?

1. Отключить проверку наличия CD

В современных ноутбуках (нетбуках и т.д.) уже не редкость, когда нет встроенного CD привода. Более того, поскольку игра очень стара, оригинальный CD может перестать читаться, а кто-то и вовсе мог потерять его. В итоге владельцы вполне легальной копии игры теряют возможность запускать игру. Так что, пожалуй, разрешим игре запускаться без диска.

О программе «Управление людьми: цифровые технологии и организационное развитие».

2. Добавить поддержку оконного режима

Age of Empires поддерживает 3 фиксированных разрешения: 800×600, 1024×768 и 1280×1024. С такими разрешениями картинка на широкоформатных мониторах выглядит растянутой, что доставляет дискомфорт. Добавить поддержку новых разрешений в игру можно, но так как в игре для каждого разрешения используются своя графика интерфейса, оставим это на потом, и ограничимся пока что добавлением оконного режима работы в игру.

3. Добавить поддержку конфигурационных файлов

Для включения каких-то системных игровых опций, их приходится передавать через командную строку при каждом запуске программы. Можно поместить все параметры в ярлык, но после перемещения игры в другой каталог ярлык перестанет работать. Выход из ситуации — добавление поддержки конфигурационных файлов.

4. Сделать игру переносимой

Игра не переносима. Для запуска на другом компьютере недостаточно скопировать игровые файлы, необходимо пройти весь процесс установки игры. В связи с широким распространением внешних накопителей хотелось бы наделить игру этим свойством.

5. Исправить известные ошибки

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

Что нам для этого понадобится?

IDA Pro — интерактивный дизассемблер и отладчик, широко используется для реверс-инжиниринга. Умеет строить понятные даже новичкам блок-схемы. Вся его сила проявляется в интерактивном взаимодействии с пользователем. После автоматического анализа пользователь может давать функциям и переменным осмысленные имена, комментировать код и т.д. Достаточно немного понимать язык ассемблера x86 для того, чтобы начать заниматься исследованием программ прямо сейчас!

Flat Assembler — свободно распространяемый многопроходной ассемблер. FASM обладает небольшими размерами и очень высокой скоростью компиляции, имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач. Одна из полезных возможностей — генерация чистого машинного кода без заголовков и т.д. Все это пригодится нам для генерации ассемблерных вставок.

Hexplorer — бесплатный HEX-редактор. Имеет простой дизассемблер x86, что позволяет удобнее ориентироваться внутри исполняемого файла. Используется непосредственно для ручной модификации двоичного файла без изменения его размера.

Отключение проверки наличия CD

Найти код, который отвечает за проверку наличия CD, нам поможет IDA. Это оказалось очень просто сделать. Достаточно проследить вызовы функций GetDriveTypeA и GetVolumeInformationA, которые используются для получения информации о приводе, как мы обнаружим функцию проверки наличия CD по адресу 4485A0h (базовый адрес 400000h, то есть физически в файле машинный код находится по адресу 485A0h), которая при удачной проверке возвращает в eax единицу.

CheckCD proc near sub esp, 214h push ebx push esi ; . ; множество проверок ; . test eax, eax jz cd_check_fail cd_check_ok: pop esi mov al, 1 pop ebx add esp, 214h retn 4 cd_check_fail: pop esi pop ebx add esp, 214h retn 4 CheckCD endp

При этом стоит заметить, что эта функция запрашивает значение CDPath из реестра, где хранится буква диска, с которого была установлена игра. То есть игра привязывается конкретно к той букве диска, с которого она была установлена, и при наличии оригинального диска в другом приводе игра все равно не запустится. Наиболее простое решение в данном случае — это заменить команду jz cd_check_fail, которая занимает 2 байта, на 2 операции nop, чтобы после проверки диска в eax всегда возвращалась единица. Однако, функция устроена таким образом, что при отсутсвии значения CDPath в реестре, функция сразу возвращает 0, что мешает переносимости программы. Поэтому всю функцию мы заменим на 3 простые команды:

Читайте также:
Федеральная программа спорт норма жизни что это

use32 xor eax, eax inc eax retn 4
Для получения машинных кодов этих команд нам пригодится FASM.
fasm src.asm dst.bin

Основной плюс этого ассемблера для нас сейчас — это то, что он позволяет генерировать чистый машинный код без заголовков. Получаем (по строчке на команду):

31 C0 40 C2 04 00

То есть нам нужно поместить эти 6 байт в начало функции определения наличия CD, а остальные команды заменить на nop (код 90h).

8B 44 24 04 81 EC 14 02 00 00 85 C0 53 56 8B D9 .
33 С0 40 С2 04 00 90 90 90 90 90 90 90 90 90 90 .

В обычном HEX редакторе заменяем начиная с смещения 485A0h указанные выше машинные коды, после чего игра больше никогда не требует для запуска CD, даже если в реестре нет необходимого ключа. При этом мы освободили 288 байт для дополнительного машинного кода, что пригодится нам в дальнейшем.

Исправление ошибки

При подключении к сетевой игре по IP игра выводит список IP и названий игр, к которым игрок подключался ранее. Однако, по каким-то причинам IP адрес часто сохранялся не полностью, обрезалось несколько его последних символов. Необходимо разобраться в чем дело и исправить ошибку.
Займемся поиском кода, отвечающего за сохранение IP адресов последних игр в реестре. Нам известно, что игра сохраняет список последних IP игр в ключах с именами вида RecentGameName%d и RecentGameAddr%d. При помощи IDA находим по 3 ссылки на эти строки. Определить где нужный код очень просто — в коде со смещением 0512116h происходит запись этих ключей, в остальных случаях — считывание. Не будем приводить найденный участок машинного кода — там около 50 инструкций, общий смысл которых можно представить в виде маленького фрагмента кода на C.

for(int i = 0; i

Для установки значения в реестре игрой используется собственная функция-обертка RegSetVal(int, char* ValueName, char* Data, int DataSize) — название функции и параметров конечно же придуманы, в машинном коде их нет. Как видно, игра сохраняет в реестре ровно столько символов IP адреса, сколько их в названии сетевой игры. Судя по всему, программист скопировал 2 строчки сохранения названия игры для сохранения адреса, но при этом забыл исправить название массива в вызове strlen.
Для исправления ошибки у нас есть 2 варианта: подставить в strlen правильную строку или вместо strlen помещать константу 16 (максимальная длина строки адреса, например «255.255.255.255»).
Как же выглядит вызов strlen(gamename[i]) в машинном коде?

call _sprintf ; +0x1022CF mov edi, ebp or ecx, 0FFFFFFFFh xor eax, eax add esp, 0Ch repne scasb not ecx push ecx

Компилятор оптимизировал код и заменил вызов функции strlen() вычислением длины на месте. В предыдущем вызове strlen() использовалась та же строка, в вот опять оптимизация — указатель помещается в ebp один раз при первом вызове. То есть у нас нет драгоценных пары байт для того, чтобы поместить правильный указатель в ebp. Можно, конечно, сделать jmp за пределы функции, потом обратно — но это не самый красивый метод. Поэтому остановимся пока на самом простом варианте исправления ошибки — будем всегда сохранять 16 байт адреса. Для этого заменим приведенный выше машинный код на следующий:

call _sprintf ; +0x1022CF add esp, 0Ch mov ecx, 0Fh
E8 CF 22 10 00 83 С4 0С B9 0F 00 00 00

Поддержка файла конфигурации

Игра поддерживает множество полезных параметров командной строки, которые было бы удобно сохранить где-нибудь в файле, чтобы не передавать их каждый раз при запуске. Лучший способ реализовать подобное — это заставить игру при каждом старте загружать внешнюю библиотеку и выполнять функцию инициализации. При такой организации можно добавить множество полезных вещей в конфигурационные файлы, такие как: загрузка дополнительных библиотек (модулей) без необходимости модификации исполняемого файла, перехват функций работы с реестром для организации хранения всех игровых данных в конфигурационном файле игры, а не в реестре. Не лишним будет поддержка множества профилей с различными наборами настроек с возможностью быстрого их переключения. Итак, приступим.
Наиболее удобным местом подключения внешней библиотеки оказалась функция загрузки библиотеки ebueulax.dll, отвечающей за отображение лицензионного соглашения. Она как раз вызывается практически сразу после начала работы WinMain, однако помимо загрузки библиотеки ebueulax.dll и выполнения функции EBUEula она делает много лишних действий, поэтому мы полностью перепишем ее, чтобы она загружала библиотеку config.dll и выполняла библиотечную функцию LoadConfig с указателем на расположение командной строки в памяти (для её изменения) в качестве параметра.

LoadConfigLib proc near sub esp, 208h push esi push edi push ebx push ecx push edx mov esi, ds:LoadLibraryA push 67B8C4h; lpLibFileName call esi ; LoadLibraryA mov ebx, eax test ebx, ebx jz short loc_587443 push offset aLoadconfig push ebx ; hModule call ds:GetProcAddress mov edi, eax test edi, edi jz short loc_58743C mov eax, [esp+220h];**args push eax call edi jmp short loc_587443 loc_58743C: push ebx ; hLibModule call ds:FreeLibrary loc_587443: pop edx pop ecx pop ebx pop edi pop esi add esp, 208h retn LoadConfigLib endp
81 EC 08 02 00 00 56 57 53 51 52 8B 35 E0 51 63 00 68 C4 B8 67 00 FF D6 8B D8 85 DB 74 25 68 B8 B8 67 00 53 FF 15 C8 50 63 00 8B F8 85 FF 74 0C 8B 84 24 20 02 00 00 50 FF D7 EB 07 53 FF 15 20 51 63 00 5A 59 5B 5F 5E 81 C4 08 02 00 00 C3

Приведенный код делает несколько вызовов библиотечных функций. Их адреса были подставлены вручную в машинный код. В следующей статье (если вы не будете против 🙂 ) я постараюсь рассказать как при помощи FASM можно генерировать код, полностью готовый к вставке в исполняемый файл.
Заменяем исходную функцию (начинается со смещения 187400h) новой при помощи обычного HEX-редактора. Поскольку новая функция значительно короче исходной, не забываем заменить оставшиеся байты кодом операции nop — 90h. Мы получили еще 192 байта свободных байта для дополнительного машинного кода. Это место можно будет использовать в дальнейшем.

81 EC 08 02 00 00 53 56 8B 35 E0 51 63 00 57 68 CC B8 67 00 FF D6 8B D8 85 DB 75 0A 5F 5E 5B 81 C4 08 02 00 00 C3 68 C4 B8 67 00 53 FF 15 C8 50 63 00 8B F8 85 FF 75 13 53 FF 15 20 51 63 00 5F 5E 33 C0 5B 81 C4 08 02 00 00 C3 8B 84 24 18 02 00 00 50 FF D6 8B F0 85 .
81 EC 08 02 00 00 56 57 53 51 52 8B 35 E0 51 63 00 68 C4 B8 67 00 FF D6 8B D8 85 DB 74 25 68 B8 B8 67 00 53 FF 15 C8 50 63 00 8B F8 85 FF 74 0C 8B 84 24 20 02 00 00 50 FF D7 EB 07 53 FF 15 20 51 63 00 5A 59 5B 5F 5E 81 C4 08 02 00 00 C3 90 90 90 90 90 90 90 90 90 .

Читайте также:
Что за программа nirsoft

Всю остальную работу берет на себя модуль config.dll. Его можно написать на C/C++/Delphi.

Его задача проста — принимать от исполняемого файла указатель на командную строку приложения и в зависимости от настроек в конфигурационном файле изменять ее. Как бонус — нам пригодится возможность подгружать дополнительные модули, настраивая это в конфигурационном файле. Для этого нам нужно просто вызывать WinAPI функцию LoadLibrary именем файла модуля, которое необходимо загрузить в адресное пространство игры.

Поддержка оконного режима

Поддержка оконного режима организована в виде отдельного модуля wndmode.dll, загрузкой которого занимается config.dll. Этот модуль занимается тем, что перехватывает все вызовы DirectDraw, изменяет параметры таким образом, чтобы программа работала в окне, и только после этого передаёт управление оригинальным функциям DirectDraw.

Это реализуется путем изменения перехватываемой функции. Первые несколько байт перехватываемой функции заменяются на команду безусловного перехода к функции перехвата. Этот трюк достаточно просто реализуется в WinNT (поскольку в WinNT для каждого процесса создается своя копия образов системных библиотек), но практически нереализуем в Win9X (так как в Win9X если и можно внести изменения в образ системной библиотеки, то только в адресных пространствах всех процессов сразу).

Сам по себе модуль wndmode.dll является сильно модифицированной версией библиотеки d3dhook.dll, где реализовано:

  • Полная независимость от программы D3D Windower
  • Настройки загружаются из секции [WINDOWMODE] файла wndmode.ini
  • Настройки по умолчанию заменены для совместимости с Genie
  • Добавлен параметр Border, который включает/выключает рамку вокруг окна
  • Если игровое разрешение равно системному, автоматически убирается рамка

Что получилось?

Работа по модификации проделана большая, здесь мы рассмотрели лишь некоторые изменения, поскольку описание даже небольших изменений требует огромных усилий. Остальные модификации при желании вы сможете исследовать в IDA, скачав готовый модифицированный файл.

В целом удалось добиться таких результатов:

  • Вместо ebueulax.dll (отображение лицензии) загружается config.dll (поддержка конфигурационных файлов)
  • Оконный режим работы (модуль wndmode.dll — модифицированный d3dhook.dll)
  • Код функций работы с курсором адаптирован для работы в оконном режиме (решает много неприятных проблем, вызванных тем, что игра не рассчитана на работу в окне)
  • Игра корректно работает без ее предварительной установки (достаточно скопировать файлы игры), для игры не нужен CD
  • Исправлена ошибка оригинальной игры, когда при игре по IP в списке последних игр обрезались IP адреса
  • Изменен порядок и расположение кнопок в меню «Один игрок» и «Редактор», исправлена ошибка с выделением кнопок в меню «Один игрок» (переписан внушительный участок кода)
  • Исполняемый файл может запускаться из любого подкаталога, а не только из age2_x1 или корня (практически полностью переписано начало процедуры WinMain)
  • Нет проверки наличия файла empires2.exe (его можно удалить)
  • При включенном параметре MIDIMUSIC после сворачивания мелодия начинается заново (не сбрасываются инструменты)

Заключение

Если вам интересно попробовать в действии то, что у меня получилось, можете скачать Age of Empires II: The Conquerors (Lite Edition) (всего 94МБ) с моего сайта.
Простите, что здесь написано обо всем и сразу, и не сильно подробно. Я старался описать общую схему. В следующих статьях можно рассматривать каждый этап модификации в отдельности, давать какие-то советы и т.д.

  • age of empires
  • asm
  • reverse engineering
  • исследование программ
  • exe mod
  • модификация исполняемых файлов
  • Assembler
  • Системное программирование
  • Реверс-инжиниринг

Источник: habr.com

Программа расширяющая возможности основной программы что это

Успешно изучив материал, Вы будете знать :

  • основные виды программного обеспечения;
  • состав программ, по умолчанию входящих в поставку ОС.

После изучения данной темы Вы будете уметь :

  • определять состав программ, по умолчанию входящих в поставку ОС;
  • определять, какие функции не охвачены средствами ОС.

После изучения материала Вы будете обладать навыками поиска необходимого программного обеспечения для удовлетворения потребностей пользователей.

Основные понятия к теме 6

Базовое программное обеспечение

Интерфейс разработки приложений

Базовое программное обеспечение

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

Как правило, разработчик операционной системы производит дополнительно некоторое программное обеспечение, расширяющее возможности операционной системы. К примеру, разработчик ОС Windows компания Microsoft также производит программный комплекс Microsoft Office, который состоит из текстового процессора Microsoft Word, табличного процессора Microsoft Excel, СУБД Microsoft Access, программы по созданию презентаций Microsoft PowerPoint, клиента электронной почты, совмещенного с электронным органайзером Microsoft Outlook.

Рынок программного обеспечения очень велик. Гигантское количество разнообразных программ, призванных удовлетворить потребности самых пристрастных пользователей, обусловлено тем фактом, что ни один разработчик операционной системы не в силах монополизировать право на разработку дополнительного программного обеспечения — это противоречит самой концепции операционной системы. Операционная система должна быть расширяемой, а учитывая количество пользователей той же Windows XP и количество видов оборудования, с которым система должна работать, у разработчика остается время лишь на одну задачу — либо улучшать операционную систему, с каждой новой версией добавляя новые возможности, и оставить разработку дополнительного программного обеспечения другим компаниям, либо сосредоточиться лишь на выпуске программного обеспечения к своей ОС. Второй путь ведет в никуда — освободившееся место с радостью займут и поделят конкуренты.

Интерфейс разработки приложений

Для того чтобы была возможна разработка приложений для операционной системы, разработчик должен регулярно публиковать информацию о так называемом API (Application Programming Interface — Интерфейс разработки приложений) . API представляет собой набор программных модулей, опираясь на которые сторонний разработчик может создавать программы, расширяющие возможности операционной системы. Особо удачные решения, как правило, включаются в состав новой версии операционной системы. ИРП описывает множество аспектов разработки программного обеспечения: форматы данных, модели памяти, концепцию ввода-вывода и многое другое.

Пути расширения возможностей ОС

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

Для того чтобы пользователь мог найти интересующее его программное обеспечение, существует множество ресурсов — каталогов программ. Классификация программ производится по решаемым задачам. Выделяют несколько основных направлений: системные программы, средства разработки приложений, базы данных и СУБД, офисные пакеты, игровые программы, пакеты для работы в Internet и т.д.

Читайте также:
Ebay worldwide что это за программа и нужна ли она

Кроме расширения программных возможностей необходимо также своевременно расширять возможности по работе с оборудованием. Эту задачу обычно решают двумя взаимосвязанными путями. Первый путь подразумевает установку сервисных пакетов , содержащих исправления и дополнения к операционной системе.

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

  1. Потребности пользователей в решении задач на компьютерах настолько разнообразны, что разработчик ОС не в силах удовлетворить их самостоятельно.
  2. API — интерфейс разработки приложений, необходимый для расширения программных возможностей операционной системы.
  3. Расширять возможности операционной системы необходимо не только в области программных решений, но и в области взаимодействия с новым оборудованием.
  1. С какими целями в состав операционной системы включается программное обеспечение, не являющееся необходимым для корректной работы операционной системы на допустимых аппаратных платформах?
  2. Какого рода информация должна публиковаться разработчиком операционной системы, чтобы сторонние разработчики программного обеспечения могли разрабатывать программы для этой ОС?
  3. В каких направлениях необходимо расширять функциональные возможности ОС?

Задания для самостоятельной работы

Выполните задания к теме 6 в тетради-практикуме.

Источник: e-biblio.ru

Расширяемые программы

Программа становится расширяемой, если удалось спрогнозировать направления ее развития, облегчить и обезопасить внесение изменений.

В этой связи расширяемость занимает одно из самых почетных мест в ряду достоинств программного кода. Можно перечислить некоторые качества программы, в той или иной мере способствующие расширяемости: модульность, наглядность, объектная ориентированность и т.п. Однако сегодня, к сожалению, не существует ни общепринятого определения расширяемости, ни четкого свода правил построения расширяемого кода. Книга «Расширяемые программы», недавно вышедшая в издательстве «Полиптих», в известной степени восполняет этот пробел.

Автор предъявляет к расширяемости достаточно жесткие требования — его интересуют прежде всего безболезненно расширяемые программные конструкции, подключение нового модуля в которых происходит без какого-либо редактирования уже существующих исходных текстов. Оказывается, подобные конструкции, или, по крайней мере, некоторые их прообразы встречаются в практическом программировании достаточно часто.

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

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

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

Итак, однородные конструкции легко расширяются. Но насколько часто расширения программы сводятся к пополнению однородных конструкций новыми однородными элементами? Это и есть ключевой вопрос всей книги. Ответ на него, подкрепленный наглядными разноплановыми примерами, звучит неожиданно категорично: любому прогнозируемому направлению развития программы на этапе проектирования можно сопоставить один или несколько однородных наборов так, что расширение программы в данном направлении не выйдет за рамки пополнения этих наборов новыми элементами.

Разумеется, в жизненном цикле программы могут возникнуть непредвиденные ситуации, требующие перестройки всего имеющегося кода. Однако основной объем работ, связанных с развитием и сопровождением программы, обычно укладывается в русло прогнозируемых изменений. И тут торжествует предусмотрительность: если разработчик еще на стадии проектирования не поленился подобающим образом оформить участвующие в изменениях однородные наборы, то подключение новых частей пройдет безболезненно, что позволит радикально облегчить и обезопасить процесс внесения изменений. В частности, при безболезненных изменениях, вообще говоря, работоспособность отлаженных ранее частей программы не может быть утрачена.

Книга начинается с анализа известных решений несложной технологической задачи оформления варианта. Здесь изобретательность разработчиков не знает границ: один использует для этой цели подпрограммы, другой — оператор выбора, третий превращает неработающие вариантные фрагменты программы в комментарии и т.д. Если же заметить, что вариантные фрагменты кода однородны, можно получить весьма экономичное и надежное решение.

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

Затем автор переходит к пакетной организации программного материала. Здесь разработчик не преследует цель получить законченный программный код — вместо этого он создает набор модулей, «покрывающий» предметную область. Покрытие области означает, что для любой задачи найдется подмножество модулей, из которого может быть составлена решающая ее программа. Пакет построения расширяется безболезненно: при подключении нового модуля появляется возможность решать новые задачи, однако все написанные ранее модули не претерпевают никаких изменений, благодаря чему ни одна из использовавшихся ранее программ не должна утратить работоспособность.

Заключительная часть книги посвящена двум различным схемам организации однородного программного материала. Возможна вариантная схема, где в выполняемую программу включается только один представитель из имеющейся совокупности однородных элементов. Или наборная схема, где в выполняемую программу включается произвольное подмножество однородной совокупности.

Характерный класс задач, опирающихся прежде всего на вариантную схему — задачи вычислительного эксперимента. Такие программы представляют собой опытную установку, постоянно подвергающуюся разнообразным модификациям. Подобно тому, как это происходит в обычных лабораториях, замененные компоненты программы не выбрасываются, а складируются в виде однородных совокупностей, дожидаясь своего часа, когда их опять включат, но уже в новую конфигурацию опытной установки.

Наборная схема организации иллюстрируется в книге множеством примеров из различных предметных областей: вычислительные задачи, автоматизация проектирования, язык HTML, среда Borland Delphi. В заключительной главе разбирается несколько типовых практических ситуаций, где применение предлагаемой техники построения расширяемых программ выглядит наиболее убедительно. Значительную часть этих примеров автор уже публиковал на страницах нашего журнала [1-3].

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

Источник: www.osp.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru