Оригинал статьи.
Полный текст статьи:
Posted on 2009.06.15 at 10:22
Пощупал (чисто умозрительно) язык из вотчины Apple. Делюсь некоторыми (строго субъективными) соображениями.
В далеких 80-х появилось два новых языка программирования, основанных на С, и поддерживающих ООП.
Первый, конечно же, C++. Страуструпу понравилась парадигма ООП, с которой он поработал в Simula, и он решал добавить ее в старый-добрый С, который, как известно, всех на свете быстрее. При этом выбор между динамическими штучками и строгой типизацией был сделан в пользу последней, ибо это скорость, а в той же Simula'е не нравился именно этот момент.
Второй язык, герой этого поста -- Objective-C. Тут за основу взяли относительно молодой ОО язык Smalltak с динамической системой типов.
Если попытаться перевести разговор в плоскость C++ vs Objective-C, то разговор будет трудный, ибо, на самом деле, языки очень разные. Возможно, если бы Obj-C родился не в Apple, а в какой-нить другой компании (ага, в AT&T), то сегодня именно он занимал бы место плюсов. А так -- "закрытая" политика компании привела к тому, что об этом языке мало кто слышал, не говоря уже о том, чтобы программировал. Помимо всего прочего, сам язык настолько крепко привязан к API Mac OS X "Cocoa", что программирование на нем вне этого окружения имеет мало смысла (аналогия -- программирование на C# вне .NET).
Главная проблема языка -- довольно высокоуровневую концепцию динамической системы типов прикрутили к очень низкоуровневому языку С (который, очень не далеко ушел от ассемблера). Получилось плохо. Python, Ruby или даже PHP в плане мощи и дуракоустойчивости делают Obj-C как ребенка, разумеется, потенциально проигрывая в скорости, которую можно получить в Obj-C просто путем вставки обычного сишного кода.
Возвращаясь к сравнению с плюсами. Динамические свойства в C++ вообще стремятся к нулю. Рефлекшена как не было, так и нет. Даже в новом стандарте, на который мы все молимся. Правда, миру известны довольно съедобные костыли, вроде того же moc из Qt.
Как язык со статической типизацией, C++ значительно сильнее Objective-C, тут даже не о чем разговаривать, одно слово -- "шаблоны". Плюс всякие другие вкусности, вроде пространств имен или парадигмы RAII ("ку" три раза!).
Более адекватно сравнение Obj-C с молодежью типа Java и C#. Молодежь у нас не динамическая (разве что C# 4.0), но зато с очень развитым рефлекшеном, который кроет Objective-C runtime ну просто как бык овцу. Serialization и remoting сделаны на качественно другом уровне. Плюс нормально работающий честный GC. Плюс generics. Говорить даже не о чем.
Чтобы понять, на каком уровне приходится работать с мета информацией в Obj-C, приведу маленький пример.
Вот функция, которая получает список свойств для класса:
objc_property_t * class_copyPropertyList(Class cls, unsigned int *outCount)
Ага, в outCount вы получите число элементов в массиве, который вам вернут как результат функции. А еще, ни в коем разе, нельзя забывать вызвать free() для этого результата.
Имея такой массив на руках, можно узнать имя свойства таким вот образом:
const char *property_getName(objc_property_t property)
В общем, полагаю, всем все понятно.
Резюмируя -- язык чисто для своих, которые ходят с айподами и думают, что от этого они think different. Судя по количеству приложений в AppStore, оригиналов хватает. Удачи им!
Сильно удивился, когда по данным TIOBE яблочное детище скакануло аж на 36 позиций в рейтинге, и на июнь 2010-го занимает 9-е место среди популярных языков программирования.
ОтветитьУдалитьОзноб прошибает.
"Высокоуровневая часть" (упоминаемая в сабжевой статье) - наверное дело в ней... Плюс продажи i-гаджетов - привлекательность "бизнес-модели" - наверное тоже...
ОтветитьУдалитьЗабавно, что рост популярности приходится на середину 2009-го года. В то время у них новинкой сезона был iPod touch, я думаю он внёс основной вклад http://www.sheep.ru/blog/914. Как бы то ни было, apple кормит толпы голодных программистов на рынке мобильных приложений. Было бы интересно посмотреть распределение популярности языков по сферам применения.
ОтветитьУдалитьПервую неделю программирования на Obj-C (после долгих лет с С++) бился в истерике головой об стекло монитора - прям как "карамелька чупа-чупс" в рекламе.
ОтветитьУдалитьА потом заметил, что парадоксальным способом все пишется куда как проще, короче и быстрее, причем не только пишется, но и работает!
Конечно, я занимаюсь GUI, и оно имеет свою специфику, но все же.
Примеры:
1. Зачем мне generics (и куча угловых скобок), если в Obj-C есть универсальный тип id, а любые два класса являются полностью взаимозаменяемыми когда у них одинаковый интерфейс? А самое главное - когда я (как человек) знаю, что вот у этого объекта _можно_ безопасно вызвать вот этот метод, а компилятор мешает мне это сделать, тратит мое время на лишний код?
2. Дофига надоело на С++ вносить все функции в хидера. В Obj-C этого можно не делать, а также разбить и интерфейс и реализацию одного класса на несколько файлов.
3. Дофига надоело писать на С++ "virtual const getIt( const string& ) const throw();" - это целых 7 слов, реально что-то значащих для человека только два. Остальные - это технические детали, которые нужны компьютеру, а не мне!
4. Давно было замечено (а ведь как опасались обратного!) что на менеджед-языках (а конкретно на .NET) получаются на удивление быстрые программы. Как ни странно, реальная (и большая) программа на Obj-C работает тоже ощутимо быстрее, чем на плюсах. Почему? А ноль можно безопасно разыменовывать! Это значит, что исключения нужны только на этапе отладки, и что тем более незачем на одну строчку кода в каждой функции вешать по 10 проверок входных данных. Хотя если охота, то можно перехватить исключение в debug-целях.
5. Пока что ощутимо не хватает операторов С++ для работы с графическими данными. Однако помимо Obj-C есть еще Obj-C++ (расширение файлов .mm вместо .m), где все простые типы (а графические и математические данные как раз являются самым применяющим операторы местом в жизни) можно прекрасно написать с перегрузкой операторов.
6. Самый бешеный пример на С++, это попробовать написать машину состояний без накладных расходов. Совсем без! Я это сделал. Куча вложенных шаблонов, динамическая перебивка _типа_ объекта (в С++!!!) на ходу с помощью placement-синтаксиса перегруженного оператора new... В Objective-C оказалось достаточно просто поменять один системный указатель с одного типа на другой, причем базовый объект даже не знает, что у него перехватили setter состояния, изменение которого вызывает полную смену реализации интерфейса!
Atz.
Спасибо за мнение. Лично я С/С++ знаю немного, Objective-C и того меньше (страниц 10 в книге прочитал), поэтому так грамотный и профессиональный разговор на тему сравнения не поддержу. Большинство из комментария понял, интересно. :)
ОтветитьУдалитьСпасибо!
На любое явление надо смотреть системно
ОтветитьУдалитьЯдро Objective-C очень просто по сравнению с С++
Очень мощные библиотеки
А писать плохие проги можно на любом языке
Если посмотреть системно на вопрос "Есть ли Бог?", то будет ли ответ?
ОтветитьУдалитьЕсли посмотреть системно на любой вопрос, находящийся вне пределов замкнутой системы, то всегда ли будет доказательный ответ (на примере вопроса про Бога)?
;)