Как я недавно
писал у меня появилась новая игрушка, с достойной внимания и написания под нее програм ОС (Symbian 9.x, платформа S60).
Погуглив, да поползав по сайту нокии я выяснил, что возможностей пописать есть. Поддерживаются следующие языки (ну, во всяком случае это то, что нашел я): C++ (нативный язык), C (правда с С как-то не до конца понятна поддержка и позиционирование), Java (правда угребищная, та что ME), Python (видимо в нокии любят питон :)), что-то было про Ruby, но тоже как-то мутновато и OPL (этакий Васик). Т.е. выбор был довольно таки широкий. OPL я отбросил сразу (ну не люблю я Васик), Ruby и C (проект
Open C) в силу непонятного статуса я тоже рассматривать не стал. Оставались C++, Java и Python.Учитывая, что Java я знаю лучше всего, да и использовал я ее в последние годы существенно больше, чем на что-нибудь другое, я ее отложил - писать на ней было бы не так забавно %), т.к. практически ничего нового, да и ограничения J2ME платформы меня не радовали. Python язык тоже хороший и когда-то я на нем даже что-то писал, но во первых я до сих пор не понимаю зачем
Гвидо ван Россум (которому по любому два раза ку) выбрал такой забавный способ отделения блоков кода, а во вторых есть подозрение, что реализации
питона на платформе S60 характерны некоторые ограничения (e.g. недоступность каких-нибудь API или еще чего). В этом конечно нету ничего страшного, но как-то изначально хотелось начать ковырять тул, который будет давать доступ ко всему. Более того, и Ява, и питон сами управляют работой с памятью (имеют GC), что в моей картине мира, с написанием кода под телефоны не вяжется. Да, это большой плюс если надо написать безопасную программу (может быть не столь эффективно работающую, но все же) за конечный промежуток времени (возможно весьма короткий), но перед мной такой задачи не стояло - перед мной стояла задача поразвлекаться и получить удовольствие :) Поэтому выбор пал на Symbian C++.
Окружение разработчика.
Существует целый пучок вариантов создания приложений для симбиана - начиная от ручного написания всего что надо и заканчивая набором IDE (кастомизация MSVC, Borland C++ Builder Mobile, Eclipse + Symbian C++ plugin, Carbide.c++ (на основе Eclipse)). Учитывая, что файлов для сборки надо создать больше одного и то, что мне интересен процесс разработки, а не автоматизации сборки - я пошел по пути наименьшего сопротивления и поставил себе
Carbide.c++ - этот тул разрабатывает сама нокия и более того, Express дистрибуция официально бесплатна (хотя поддерживает все, что необходимо для разработки, в том числе отладку программы в эмуляторе). После этого, я скачал
С++ SDK для платформы S60, 3-го издания, поддерживающий FP1 - для реальной разработки приложений надо было бы конечно и SDK для 2-го издания скачать, но на рынок я пока выходить не собираюсь :), а моя игрушка как раз бегает под S60 3rd ed FP1. После того, как SDK встала и Carbide.c++ ее подцепил я было дело ломанулся собрать какой-нибудь проект из примеров и проверить, что все пашет. Не тут-то было, у меня на машине уже давно стоит 5.8 перл, а скрипты постройки приложения идущие в комплекте SDK заточены сугубо на 5.6 перл (да-да, в доке об этом английским по белому и даже с выделением написано, но кто же эти доки читает? :)) и с 5.8 была пара косяков (правда решилось оч. быстро - правкой пары перловых модулей). Не скажу, что этот момент меня сильно удивил, я так мыслю они пытаются переписать все это на питоне (любовь нокии к питону помоему очевидна) и поддерживать 5.8 перл они видимо не хотят. В итоге приложение собралось, но сразу запустить модифицированный мною "Hello world!" не удалось - я не сразу догнал, как же функционирует эмулятор (мне казалось, что если я запускаю приложение из IDE - то эмулятор должен стартануть и сразу запустить приложение, однако это оказалось не так - приложение надо каждый раз выбирать самому, что немного бесит). Сам эмулятор не плох, умеет много всего, но есть у него один большой минус - он тормознооооой (написан, кстати на Яве :)). Т.е. реально тормозной, даже на моей вполне не слабой машине он запускается заметное время (можно запустить эмулятор, хорошо так зевнуть, потереть глаза, хлебнуть кофе и после всего этого увидеть, что он только заканчивает стартовать). В прочем это не так страшно, зато в нем удачно можно все отлаживать и он вполне четко повторяет то, что происходит на телефоне.
Первые и вторые шаги.
Написать консольный "Hello world!" самому заняло минут 15, еще минут 15 - его запустить. Но, во первых консольное приложение в данном контексте ну совсем не в тему (интерфейс ОС сугубо гуевый), а во вторых у меня есть свой аналог Hello world'а, который я первым или вторым реализую на каждом языке, который изучаю (справедливости ради, хочется заметить, что иногда дальше него дело в изучении не заходит :)) - программа, которая находит корни квадратного уравнения (правда, зачастую я не заморачиваюсь с мнимыми корнями, но не суть). С моей точки зрения хороший такой стартер - бизнесс логика мизерная, простая и понятная, но при этом программа уже интерактивна и следовательно зацепляет больше, чем hello world. В этот раз, эта программа получилась монстрообразная (первая полностью работающая версия, без последующего рефакторинга для удаления дубликации кода состоит из 405 строк кода :)), но зато она уже умеет отрисоваться на экране, предложить ввести параметры квадратного уравнения (причем ввести можно только числа с плавающей запятой), кнопку инициации процесса решения, поле вывода результата, менюшку и диалог about :). И времени на все это ушло, порядка 1.5 дней (да, старею блин :). Но, это было просто здорово :) Я за эти полтора дня переворошил существенно больше форумов и док, чем делаю это обычно (ну, это закономерно :)) и нашел работающие (и, хочется верить не очень убогие :)) решения. Кстати, когда я таки созрел потестировать свою программу на своей железяке я столкнулся с вполне ощутимой проблемой - необходимостью подписывания дистрибуции программы с помощью сертификата, но проблема решилась, более подробно я наверное напишу об этом позже.
Symbian C++.
В принципе сам язык вполне себе С++, но учитывая специфику девайсов есть некоторые ограничения и идиомы, присущие именно этому подмножеству. Из того, что пока зацепил и что хочется отметить - использование венгерской нотации (это конечно не ку, нелюблю я ее), свой
легковесный механизм работы с исключительным ситуациями (стандартный вроде бы как тоже в последних версиях поддерживается, но не рекоммендуется к использованию, в прочем предлогаемый вариант вполне неплох), в идее
cleanup stack'а тоже что-то определенно есть. Так же следует заметить, что есть определенный набор классов, которые надо использовать (например большинство своих классов, которые работают с динамическим выделением памяти след наследовать от класса CBase). Есть определенные конвенции именования (например функции, в рамках которых может случится исключительная ситуация должны иметь в конце своего имени буковку L, классы должны иметь правильный префикс - например наследники CBase - C и т.д.). При множественном наследовании не рекоммендуется наследоваться от двух и более конкретных классов. В общем довольно много есть деталей.
UI.
Пользовательский интерфейс надо разрабатывать следуюя Doc-View модели (которую я опять же не люблю, но и это тоже ничего :)). Существует набор классов, которые надо наследовать что-бы все было хорошо (режимы ввода там правильно обрабатывались и т.д.), но это в конце концов не страшно. Работа с UI осуществляется с помощью фреймворков, которые предоставляют весьма себе полноценные компоненты (например цапа или поле ввода текста, или текстовая метка и т.д.), в моем случае фреймворк называется
Uikon и он в принципе вполне не плох :)
Итог.
Я более чем уверен, что профессиональным разработчиком под Symbian я не стану :) Однако, ковыряние с кодом и возможность написания одной программы, которая мне нужна (ну, на самом деле не то чтобы нужна и более того, я бы мог уже существующие Активные заметки заюзать под эти цели - но это будет не интересно :)) приносит мне огромное удовльствие :)
З.Ы. Если вдруг что-чего - свой код я пока выложить не готов (стыдно), его надо порефакторить, может быть еще одну штучку расковырять и тогда можно будет выложить, правда я не уверен, что он кому-то понадобиться :)