В классической Mac OS (оригинальной операционной системе Apple Macintosh ) расширения представляли собой небольшие фрагменты кода, расширяющие функциональность системы. Они изначально запускались при запуске и управлялись различными механизмами, включая исправление ловушек и другие методы модификации кода. Первоначально являясь хаком разработчиков Apple, расширения стали стандартным способом предоставления модульной операционной системы. Большое количество важных системных служб, таких как сетевые стеки TCP/IP (MacTCP и Open Transport) и поддержка USB и FireWire, были дополнительными компонентами, реализованными как расширения. Позднее фраза «расширение системы» стала охватывать и безликие фоновые приложения.
Расширения обычно выполняли ту же роль, что и резидентные программы DOS , или демоны Unix , хотя , исправляя базовый код ОС, они имели возможность изменять существующее поведение ОС, а два других такой возможности не имели. [ сомнительно – обсудить ]
Концепция расширений не присутствовала в оригинальном системном программном обеспечении Macintosh, но система, тем не менее, имела частный механизм исправления, который разработчики вскоре научились использовать, — загрузчик INIT. Этот код искал системные ресурсы типа 'INIT', загружал и запускал их во время загрузки. Ресурсы кода должны были храниться непосредственно в ресурсной ветке чемодана Mac System , то есть он был доступен только «опытным пользователям», которым было бы удобно использовать ResEdit или другой редактор ресурсов.
Поскольку использование этого механизма было неподдерживаемым хаком, и только 32 INIT могли быть загружены таким образом, Apple ответила, предоставив более управляемое решение. Первоначально это само по себе было в форме ресурса 'INIT' с идентификатором 31, помещенного в системный файл, который искал бы дополнительные файлы типа 'INIT' в системной папке , а также загружал и запускал бы ресурсы INIT внутри них. (Вот почему некоторые ветераны-программисты Mac до сих пор называют механизм загрузки расширений «трюком INIT 31». [1] INIT теперь можно было установить, просто поместив файл в системную папку, что вполне в пределах возможностей среднего пользователя. Начиная с System 7, расширения были перемещены в папку Extensions внутри системной папки для удобства, и был реализован механизм автоматической маршрутизации, так что размещение расширения в системной папке с помощью перетаскивания фактически помещало бы файл в соответствующую подпапку.
Расширения сохраняли тип ресурса «INIT» на протяжении всего своего существования, а загрузчик постепенно совершенствовался для поиска этих ресурсов во многих местах, в том числе в ответвлениях ресурсов панелей управления в различных форматах и в Chooser .
INIT превратились в системные расширения, по ходу дела получив дополнительные специальные протоколы, такие как предоставление значка для отображения во время загрузки (источником этого был «ShowINIT»). «Парад кусочков головоломки и значков» на экране при загрузке каждого расширения стал знаком всем пользователям Mac. В конечном итоге сама Apple выпустила основные (но необязательные) части операционной системы в качестве расширений, таких как QuickTime , QuickDraw 3D и многие другие. Значительное количество служб и драйверов в Mac OS — как официальных, так и сторонних — были предоставлены в качестве расширений, что позволило урезать ОС путем их отключения.
Расширения системы были распространенным источником нестабильности на Macintosh, поскольку сторонний код был разного качества и часто исправлял систему способами, которые не всегда работали правильно. Некоторые расширения не работали вместе должным образом или работали только при загрузке в определенном порядке. Кроме того, разные расширения могли пытаться исправить одну и ту же часть системы, что могло привести к конфликтам расширений и другой нестабильности. Отслеживание этих источников проблем было еще одной задачей, с которой в какой-то момент сталкивалось большинство пользователей Mac. Устранение неполадок расширений Mac OS могло быть трудоемким процессом разделения и проб и ошибок .
Самый простой способ чистой загрузки операционной системы — удерживать клавишу Shift: загрузка расширений будет пропущена. В System 7.5 был добавлен Extensions Manager , который позволял пользователю быстро включать или отключать определенные расширения, а также определять их наборы, которые будут корректно работать вместе. Extensions Manager поставлялся с двумя базовыми наборами только для чтения: один содержал подмножество расширений, необходимых для основных операций ОС, и другой, который включал все официальные расширения, поставляемые с ОС, но отключал все сторонние расширения.
Порядок загрузки расширений был побочным эффектом функции GetFInfo, которая использовалась загрузчиком для перечисления файлов в папке Extension. Хотя Apple всегда заявляла, что порядок, который получается в результате перечисления файлов с помощью этой функции, не определен, на томах HFS эта функция перечисляла файлы в порядке, сохраненном в каталоге HFS. Люди выяснили, что изменение первого символа в имени файла может изменить порядок загрузки расширений, что вызвало проблемы, когда Mac OS 8.1 перешла на HFS+. Apple в конечном итоге пришлось изменить загрузчик, чтобы отсортировать имена файлов, возвращаемые этой функцией, в таблицу, и предоставила интерфейс, позволяющий программному обеспечению изменять таблицу. [2]
Расширения системы не имели пользовательского интерфейса: не было стандартного механизма, с помощью которого пользователь мог бы настраивать службы, предоставляемые расширением. Расширения могли изменять графический интерфейс (например, добавлять новые меню в строку меню) и, таким образом, принимать пользовательскую конфигурацию, или они могли сопровождаться приложением для предоставления интерфейса конфигурации.
С System 7 панели управления стали отдельными плагинами Finder на диске, которые мог запускать пользователь. Вставив код INIT в панель управления, стало возможным создавать гибриды расширения/панели управления, которые изменяли операционную систему во время загрузки и содержали собственный встроенный интерфейс конфигурации в той же форме, что и любая другая панель управления операционной системы.
MultiFinder и System 7 и более поздние версии поддерживали фоновые приложения без лица , похожие на демоны UNIX или службы Windows , хотя и с использованием кооперативной многозадачности . Примерами были Time Synchronizer ( переход на летнее время и удаленная синхронизация времени), Software Update Scheduler и Folder Actions (обработка событий папки). Фоновые приложения без лица были обычными приложениями с ограничением, что они не отображались в меню приложений. Единственным техническим отличием между фоновым приложением без лица и обычным приложением было то, что в SIZE
ресурсе ' ' был установлен флаг «Только фон». Им было запрещено открывать обычное окно уровня приложения: если они это делали, система зависала.
Однако они могли свободно открывать глобальные плавающие окна, поскольку они не могли ни получать, ни терять фокус. Control Strip в Mac OS 8 и 9 был примером безликого фонового приложения, которое отображало глобальное плавающее окно для обеспечения взаимодействия с пользователем. Application Switcher был другим. Однако пользователь ни разу не знал, что Control Strip был запущенным процессом; он просто представлялся как дополнительная функция интерфейса. Система просто описывала безликие фоновые приложения как «системные приложения». [ необходима цитата ]
Языковые возможности в Open Scripting Architecture (и, следовательно, AppleScript ) изначально были реализованы как динамически загружаемые плагины, известные как «дополнения к скриптам» или OSAX. В Mac OS 8 и 9 они были дополнены безликими фоновыми приложениями, которые загружались в фоновом режиме по требованию. Как и в случае с обычными приложениями, доступ к этим приложениям осуществлялся с помощью tell
предложений: глобальное пространство имен не обновлялось, как в случае с OSAX. Операционная система не указывала на запуск таких процессов и не указывала, запущены они или нет.
Расширения типа INIT загружались во время загрузки для обновления операционной системы. Как ни странно, в папку Extensions могли быть помещены и другие файлы, многие из которых не загружались во время загрузки. Наиболее заметными из них были общие библиотеки , которые обычно помещались в папку Extensions для удобства поиска. Общие библиотеки не загружались во время загрузки.
Файлы типа INIT были не единственным типом системного расширения. Другим типом был scri , или расширение WorldScript. Загрузчик BootX Linux был реализован как scri просто потому, что такие файлы загружались на самом раннем этапе процесса загрузки, до всех других расширений. Затем BootX мог отображать диалоговое окно, предлагающее пользователю завершить загрузку Mac OS или вместо этого загрузить Linux.