"Будет тебе и кофе, и
какава с чаем". Лёлик, герой фильма "Бриллиантовая рука" |
Программирование под MacOS X - территория таинственная и покрытая туманом для большинства наших читателей. Поэтому сегодня я хочу рассказать вам о фреймворке для разработки приложений под эту операционную систему, который называется Cocoa.
Многие считают, что Cocoa - это только среда разработки приложений под "яблочную" систему. В этом виноваты двое: сайт компании Apple и незнание нашими соотечественниками английского языка. Дело в том, что на сайте написано следующее: "Cocoa is an object-oriented application environment designed for developing Mac OS X native applications". В вольном переводе это может звучать следующим образом: "Cocoa - объектно-ориентированная программная среда для разработки родных приложений под MacOS X". Видимо, именно слово "среда" (environment) и вводит в заблуждение доверчивых разработчиков, которые даже на русскоязычной Википедии написали, что Cocoa - это среда разработки приложений.
На самом деле, Cocoa - это фреймворк, даже, можно сказать, API операционной системы MacOS X. В отличие от Windows, где API всю жизнь был один (хотя некоторые предлагают уже рассматривать и .NET Framework как альтернативу стандартному системному API), MacOS X поддерживает некоторый плюрализм в этом вопросе. Основными API этой операционной системы считаются Cocoa, Carbon, Toolbox и POSIX. При этом Toolbox используется для совместимости со старыми версиями этой операционной системы, а POSIX - для совместимости с другими платформами, выросшими из старого доброго UNIX'а. Родным языком Cocoa является довольно экзотичный для большинства других операционных систем Objective-C.
Objective-C - вещь довольно своеобразная, и, безусловно, заслуживающая отдельного рассмотрения на страницах нашей газеты. Но пару слов я сейчас об этом языке программирования скажу. Как и C++, Objective-C - "надстройка" для языка C, позволяющая заниматься объектно-ориентированным программированием. Только в отличие от своего более знаменитого и распространённого аналога, она имеет 100%-ю обратную совместимость с классическим C. Объектная модель Objective-C основана на Smalltalk, о котором я рассказывал пару номеров назад. В плане ООП Objective-C очень заметно разнится с C++, и, думаю, многие C++-программисты, которые удосужились бы познакомиться с Objective-C, нашли бы в нём много интересных идей в области объектно-ориентированного программирования.
Но вернёмся к нашим "кофе и какавам с чаем". Cocoa состоит из двух основных фреймворков - Foundation Kit и Application Kit. Первый из них - библиотека общего назначения, которая имеет в своём арсенале всё нужное для таких базовых операций, как работа со строками, распределёнными вычислениями, циклами обработки сообщений и прочим, что напрямую не связано с графическим пользовательским интерфейсом. Application Kit же, напротив, отвечает как раз таки за GUI. Application Kit базируется на Quartz, разработанной компанией Apple технологии прорисовки элементов интерфейса, придающей MacOS X её знаменитый привлекательный внешний вид. Для передачи команд Quartz'у фреймворк использует один из диалектов PostScript'а.
Cocoa вовсю использует преимущества Objective-C при программировании на нём прикладных приложений. Поскольку, как уже говорилось, в этом языке программирования используется модель пересылки сообщений между объектами, это позволяет совершенно по-новому взглянуть на такое, казалось бы, привычное позднее связывание. Каждый метод в Objective-C имеет уникальную строку, называемую селектором, по которой к нему можно обратиться. Селектор - это не просто имя метода, а действительно настоящий атрибут строкового типа, который можно сохранить в файле, послать другому процессу или зашифровать и спрятать до лучших времён. Селектор может быть одним у нескольких методов, и, поскольку при пересылке сообщений между объектами поиск метода осуществляется по селектору, это позволяет осуществлять позднее связывание и обращаться к нескольким методам по одному селектору. Возможно, это выглядит несколько абстрактно, но это существенно добавляет гибкости при создании приложений. Хотя, конечно, такой подход несколько снижает производительность. Стоит отметить, что есть в Cocoa и ещё одна работающая похожим образом технология, которая называется Key-Value Coding. Она позволяет обращаться к свойству объекта без знания типа этого объекта. Связанные между собой свойства при этом специальным образом синхронизируются.
В плане управления памятью Cocoa тоже, надо отметить, на высоте. При работе с объектами используется не самый оригинальный, но простой и доказавший на практике свою эффективность метод подсчёта ссылок. Когда ссылок на объект остаётся ровно ноль штук, память, занимаемая этим объектом, автоматически высвобождается. Если вы работали с технологией COM, активно используемой при создании самых разнообразных Windows-приложений, то должны заметить почти что портретное сходство. Что ж, это ведь действительно удобно, когда не нужно самостоятельно следить за временем жизни каждого объекта, а спокойно сосредоточиться на том, какую функциональность этот объект будет реализовывать. Ещё один интересный метод работы с памятью, который предлагает Cocoa программисту, - это автоматически высвобождаемые пулы. Объекту посылается специальное сообщение, которое даёт команду зарегистрироваться в автоматически высвобождаемом пуле, а тот уже сам при определённом стечении обстоятельств освобождает память, занимаемую всеми зарегистрированными в нём объектами. При этом пулы создаются в начале и в конце цикла обработки сообщений, так что избегается ситуация зависания, которой чреваты многие другие методы автоматической сборки мусора.
Теперь немного ещё остановимся на Application Kit. Одна из самых мощных вещей во всём Cocoa, которая как раз и относится к этому фреймворку, - это объект отображения и редактирования текста NSText. Этот объект скрывается и за однострочным полем для ввода текста и заканчивая такими программами, как профессиональные текстовые редакторы и системы вёрстки. Он поддерживает практически всю типографику: кернинг, лигатуры, обтекание текста вокруг любых форм, повороты текста, сглаживание шрифтов. При всём при этом имеется полная поддержка Unicode. Проверка правописания также возложена именно на этот специфический объект; она может производиться автоматически и при этом использует единый для всех приложений словарь. Есть встроенная поддержка неограниченной отмены и возвращения внесённых изменений. Как говорится в описании этого объекта, "используя только встроенную функциональность, можно написать текстовый редактор в 13 строк кода". Но не надо думать, что всё остальное в MacOS X пишется так же просто - ведь недаром эта система давно считается дизайнерско-издательской, так что Apple просто лучше всего работает над самыми востребованными функциями.
О Cocoa можно говорить ещё очень и очень долго, но газета, к великому моему сожалению, всё-таки имеет ограниченный объём, а потому надо уже потихоньку заканчивать статью. Но перед подведением итогов расскажу ещё немного об истории создания и развития Cocoa.
Изначально этот продукт назывался вовсе не Cocoa и разрабатывался вовсе не Apple. Занималась им компания NeXT, а называлось это OPENSTEP. Но в 1996 году Apple приобрела эту компанию с намерением разработать на основе OPENSTEP операционную систему Rhapsody. В итоге эта система стала известна всему миру под названием MacOS, а API для этой системы стал называться Cocoa. Интересно, что при этом название API досталось в наследство от детской программы для создания мультимедийных проектов. Когда было решено прекратить разрабатывать эту программу, торговую марку решили не выкидывать, а приспособить к новому интерфейсу, чтобы не мучиться, придумывая тому название и регистрируя новую торговую марку.
Всё-всё, уже почти совсем заканчиваю. Минутку. Только ещё немного о средах разработки и дополнительных библиотеках. Apple предлагает среды разработки Apple Xcode и Interface Builder для создания Cocoa-приложений с использованием Objective-C. По отзывам тех, кто этими интегрированными средами разработки пользовался, они заслуживают всяческих похвал. Есть также библиотеки для других языков программирования, которые позволяют создавать с их помощью Cocoa-приложения: для Python это PyObjC, для Ruby - RubyCocoa, для Perl - CamelBones, для C Sharp - Cocoa Sharp, а для Objective-Basic такая библиотека носит название ObjB. Это, учтите, ещё далеко не полный список, полный можно найти по адресу osx.hyperjeff.net/Reference/cocoa.php.
Что ж, вот и последний абзац статьи. Надеюсь, не очень вас утомил? Cocoa - очень интересная разработка, но избыток новой информации может помешать воспринять её. Это действительно очень качественное и современное средство для создания приложений. Хотя во всём чувствуется дух Apple: не очень распространённый на других платформах язык программирования, используемый и рекомендуемой для программирования с использованием Cocoa, очень хорошо реализованная работа с текстом и, наконец, наличие альтернативных API. Но всё это вовсе не плохо, хотя, например, тот же Objective-C может поначалу испугать тех, кто придёт с Windows или какой-то другой платформы. Но при постоянной работе ко всему можно привыкнуть и даже полюбить, верно?
Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by
Горячие темы