Почему Objective-C не широко используется за пределами среды какао?

24

Objective-C отличает хорошая ориентация объекта, простота, элегантность и (как расширенный набор C) способность низкого уровня. Может показаться, что это простая современная альтернатива C ++, которую многие ищут и пытаются найти в Go. Но он используется только в средах Cocoa и post-NextSTEP, и даже в этом случае рассматривается скорее как бремя по историческим причинам, чем как оптимальный выбор.

Почему это не так широко используется тогда? Каковы его проблемы?

Тони Карденас
источник
5
«исторические причины» означают «много библиотек»
@vartec, ты не обязан это делать. См. MonoTouch, например, это C #. О, и тогда у вас есть правило Apple о Objective-C, C и C ++, верно? Они уже отказались от этого.
правостороннее

Ответы:

28

ИМО, проблема с Objective-C заключается не столько в серьезных недостатках, сколько в незначительных недостатках (особенно на ранних этапах) и отсутствии очевидных преимуществ.

Objective-C был чисто надмножеством C, поэтому C- код мог легко перейти на Objective-C. Настрой для использования Objective-C, однако, отличается от C склад ума в партии . Переход от C к Objective-C прост для кода, но совсем не прост для многих программистов. Программист переменного тока не может просто выбрать несколько новых удобных функций в Objective-C и получить лучшую производительность практически сразу - ему нужно изучить много новых «вещей», прежде чем он вообще сможет что-то получить.

C ++ сделал переход для некоторого кода немного сложнее, но переход для большинства программистов намного проще. Программисты на C, привыкшие иметь дело с каждой деталью своего кода, все еще могут делать это на C ++ именно в той степени, в которой они хотят. C ++ также облегчает использование некоторых новых функций (например, добавление ctor для автоматической инициализации членов вашей структуры) без реального изменения вашего мышления. Многие пуристы OO подталкивали к радикальным изменениям в мышлении, но многие программисты на C переключились на C ++, не делая ничего подобного (по крайней мере, прямо сейчас - и часто когда-либо, с точки зрения вещей).

C ++ также выглядел гораздо более знакомым для большинства программистов на C. Было добавлено несколько новых ключевых слов, но (особенно на ранних этапах) код все еще в основном выглядел довольно знакомым. Несмотря на свой статус «чисто надмножества», большая часть кода Objective-C выглядит довольно чуждой для большинства программистов на C. Многое из C ++ также довольно легко объяснить и понять с точки зрения того, как все работает в C. Переключение на Objective-C имеет гораздо больше мест, о которых вы можете сказать: «Просто доверься мне и забудь все, что ты думаешь, что знаешь». "

Многие из проектных решений в Objective-C также сделали его (несколько) более медленным, чем C ++, особенно на относительно старых машинах с медленными процессорами, ограниченной памятью и т. Д. Правильно или неправильно, его также рассматривали в основном как продукт для одной компании, где C ++ был свободно доступен для всех и каждого для реализации.

Все это привело к тому, что C ++ был принят достаточно быстро на раннем этапе, что он довольно быстро достиг «критической массы», поэтому (среди прочего) он стал очевидным выбором для многих проектов только потому, что он уже широко использовался, хорошо известен. количество.

Objective-C никогда не достигал этой точки. На самом деле, он был на пути к исчезновению в безвестности, когда Apple восстановил его, почти навязав его любому, кто хотел разрабатывать для своих систем. Однако доля Apple на рынке не достаточно велика, чтобы действительно придать ей критическую массу - просто большая ниша. Это «выбор по умолчанию» только там, где / потому что Apple делает это так.

Я бы также добавил, что, по крайней мере, на мой взгляд, объектная модель, похожая на Smalltalk в Objective-C, означает, что в действительности она намного больше прямой конкурент Java, чем C ++. Да, он по-прежнему имеет подоплеку C, и да, вы все равно можете писать низкоуровневый код без использования отдельного языка - но чистый C и настоящий Objective-C достаточно различны, так что он меньше похож на один язык, чем на два совершенно разных языка, которые случается, что оба они обрабатываются одним компилятором (хотя удобно, что эти два могут общаться друг с другом без чего-то вроде JNI, чтобы присоединиться к ним).

Джерри Гроб
источник
Отличный исторический обзор. Впервые я написал код Objective-C на машинах NextSTEP в «белой коробке» в 90-х годах, и, будучи уже обученным C ++ в университете, ненавидел причудливый синтаксис Objective-C. Таким образом, я могу оценить многие вещи, которые вы говорите здесь.
Марк Бут
спасибо, это, очевидно, ответ, который я искал. Ричи сделал C, чтобы сделать возможной командную работу; «Причудливый недостаток и огромный успех»; эта цитата Означает, что вы должны сделать простой, простой язык, чтобы многие могли его понять, и это не значит, что это должен быть «потрясающий» язык. Никто не хочет жаловаться на objc, потому что это никому не нравится. «Есть язык, на который люди жалуются, и язык, которым никто не пользуется» bjarne stroustup. По крайней мере, Windows смогла заставить компьютерную индустрию расти даже с корпоративным кластером, и я надеюсь, что Apple потерпит неудачу, потому что им нет дела до разработчиков.
Jokoon
Извините за напыщенную речь, но даже если быть разработчиком означает, что вы должны изучать новые вещи, это не значит, что вы должны забыть все, что вы уже знаете. Я слышал, что функциональность мессенджера objc сделана с помощью некоторого оптимизированного кода ASM. Какой беспорядок, как вы можете сказать разработчикам понять это? Как насчет драйверов и разработчиков ядра? Маки - это просто кадиллаки, которыми вы пользуетесь, они просто дорогие предметы, которые продаются, поэтому вы можете просто проверить электронную почту и посмотреть DVD. Хотите добавить программное обеспечение к этой вещи? приятель удачи забудь все существующие софт, и сделай яблочный путь ТМ.
Jokoon
+1, отличное объяснение!
Чен
11

Ну, в принципе, Apple является движущей силой Objective-C с некоторого времени:

  • В то время как последняя версия практически заброшена, Objective-C 2.0 на самом деле начинает все больше и больше привязываться к некоторым базовым базовым классам / протоколам, а это означает, что между возможностями языка и структурой существует внутренняя связь, NSFastEnumeration возникает у меня на уме , что необходимо для объектов, чтобы правильно реагировать на циклы в. Это означает, что между языком и платформой растет связь.
  • Там практически нет реальной альтернативы какао. И Cocoa, в свою очередь, начинает зависеть от все большего и большего количества возможностей OSX. Хотя технически вы можете иметь реализацию Objective-C, работающую на любой ОС с любой базовой платформой, для любой другой платформы не так уж много нового.

Как и сейчас, Apple полностью контролирует Objective-C и управляет языком в соответствии со своими потребностями, в то время как на этой планете нет организации, заинтересованной в запуске Objective-C на устройствах, отличных от Apple, которые были бы достаточно большими, чтобы обеспечить стандартная библиотека и инструментарий, которые могут даже дистанционно конкурировать с экосистемами, представленными .NET / Mono, C ++ или Java.

back2dos
источник
3
Есть GNUStep. Они стараются не отставать от Apple, хотя я пока не проверял, насколько хорошо они справляются.
Пер Йоханссон
1
И еще есть Кокотрон.
ysdx
1
На момент написания этого ответа действительно было невозможно запустить Objective-C 2.0 на платформе, отличной от Apple. В любом случае, после этого было предпринято много усилий, и теперь мы можем ожидать, что Objective-C 2.0 будет работать на FreeBSD довольно гладко, используя GNUstep.
Эонил