Оригинал статьи.
Полный текст статьи:
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, оригиналов хватает. Удачи им!