Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kernigan_paik.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.91 Mб
Скачать

8.4. Изоляция

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

Выносите системные различия в отдельные файлы. Когда для разных систем требуется разный код, его лучше выносить в отдельные фай­лы — один файл на каждую систему. Например, текстовый редактор Sam работает под Unix, Windows и в ряде других операционных сис­тем. Интерфейсы с системой меняются от среды к среде очень широко, но большая часть кода Sam везде идентична. Все различия, связанные с конкретной системой, вынесены в отдельные файлы: unix.с содержит код интерфейса с системами Unix, a windows.с — со средой Windows. В этих файлах реализуются переносимые интерфейсы с операционной системой, различия же получаются скрытыми. Таким образом, можно сказать, что Sam написан для своей собственной виртуальной операци­онной системы, которая переносится на различные реальные системы с помощью пары сот строк кода на С, реализующих несколько неболь­ших, но непереносимых операций, вызывающих функции конкретной системы.

Самое интересное, что графические оболочки различных операцион­ных систем не играют почти никакого значения: Sam имеет собственную переносимую библиотеку для своей графики. Несмотря на то что напи­сать такую библиотеку, конечно же, гораздо труднее, чем просто адапти­ровать код под данную систему (код интерфейса с системой X Window, например, по своим размерам приближается к половине всего остально­го кода Sam), суммарные затраты для нескольких систем получаются все равно меньше. При этом не надо забывать, что графическая библио­тека ценна сама по себе и использовалась для создания и других перено­симых программ.

Sam — это довольно старая программа; в наши дни переносимые гра­фические оболочки, такие как OpenGL, Tcl/Tk и Java, доступны для большого числа платформ. Создание кода на их основе вместо использо­вания собственных графических библиотек обеспечит вашим програм­мам большую область применения.

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

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

Подход к переносимости, реализованный в системе Java, — пример того, насколько далеко можно здесь продвинуться. Программа на Java транслируется в операции "виртуальной машины", модели компьютера, которую можно реализовать на любой настоящей машине. Библиотеки Java предоставляют унифицированный доступ к возможностям систе­мы: графике, пользовательскому интерфейсу, сети и т. п.; библиотеки же отображают этот доступ в возможности локальной системы. Теорети­чески должно быть возможно исполнить Java-программу (даже после трансляции) где угодно без каких-либо изменений.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]