Что именно означает «Objective-C - это надмножество C более строго, чем C ++»?

87

Из того, что я там прочитал: Почему Objective-C не очень популярен за пределами сообщества Apple?

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

Быть суперсетом бинарно, как беременность. Obj-C - это надмножество C, а C ++ - нет.

Что они подразумевают под суперсетом? Каким образом объект-C будет более // обратно совместим с C? В каком смысле объектный C следует философии C более точно, чем C ++?

Можно ли скомпилировать любую программу на C без модификации с помощью компилятора Objective-C (100% совместимость)?

Это больше вопрос о дизайне и совместимости языков программирования, чем споры о том, какой из них лучше.

user1115057
источник

Ответы:

134

Я подготовил простую схему; это не очень красиво, но, надеюсь, разъясняет суть:

  • Красный: набор всех программ, действующих на C, C ++ и Objective-C (относительно небольшой).
  • Зеленый: набор всех программ, действующих в C и Objective-C, но недопустимых в C ++ (даже меньше)
  • Серый: набор всех программ, действующих в Objective C и C ++, но недействительных в C (пустой, насколько мне известно)
  • Синий: набор всех программ, действующих только в Objective C (относительно большой)
  • Желтый: набор всех программ, действующих только на C ++ (наибольший)

Набор допустимых программ C (красный и зеленый) является строгим подмножеством набора допустимых программ Objective C (синий)

введите описание изображения здесь

Escualo
источник
14
А как насчет объективного C ++?
user1115057
14
Странное сходство ...: justindomke.files.wordpress.com/2008/11/scalaimage11.png
user1115057
19
В какой мере, по вашему мнению, желтый здесь «больше» синего? Интуиция подсказывает мне, что оба множества будут счетно бесконечными.
wim
4
@wim: И оба представлены как несчетные подмножества R ^ 2;) Это тот же трюк, что и вы увидите N внутри Q, несмотря на то, что они одинакового размера (а N - строгое подмножество Q).
Maciej Piechotka
3
Я подумал об этом еще немного и понял, что набор ObjC ++ на самом деле не окружает все это. Это надмножество C ++, но не строго надмножество ObjC. Те же программы, которые являются легальным C, но незаконным C ++ (зеленая область), являются незаконными ObjC ++.
Роб Напье
62
  1. Что они подразумевают под суперсетом?

    Они означают строгий суперсет. Любая допустимая программа на C будет компилироваться с помощью компилятора Objective-C. Некоторые допустимые программы на C не компилируются с помощью компилятора C ++.

  2. Каким образом объект-C будет более // обратно совместим с C?

    Вот простой пример:

    int *foo = malloc(12);
    

    Компилируется на C и Objective-C, но не на C ++. Есть, конечно, и другие примеры.

  3. В каком смысле объектный C следует философии C более точно, чем C ++?

    All - Objective-C является строгим надмножеством C.

  4. Можно ли скомпилировать любую программу на C без модификации с помощью компилятора Objective-C (100% совместимость)?

    Да.

Карл Норум
источник
2
Да, это было бы хорошо. Возможно, вам не нужен Objective-C для графического интерфейса пользователя, если вы хотите выяснить, какие низкоуровневые функции времени выполнения нужно использовать.
Карл Норум,
3
В основном философские.
Карл Норум,
2
+1 Отличное объяснение. Я бы предположил, что вопрос о «философии C» немного расплывчат, но большинство наблюдателей, вероятно, согласятся, что «цели» C и «цели» ObjC действительно различаются. Цель C - быть очень близкой к оборудованию, обеспечивая при этом некоторые полезные абстракции переносимости, в то время как цель ObjC - привнести подход SmallTalk в C. Поскольку в последние годы какао стало неотъемлемой частью ObjC, это расхождение стало еще сильнее. «Философия» (подход к проектированию) C-массива и NSArray, безусловно, очень разные.
Роб Напье
2
Это полностью зависит от программы. Вероятно, вы не стали бы делать слишком много вещей в стиле C в программе Objective-C. Зачем тогда использовать Objective-C?
Карл Норум
1
@ user1115057: не стоит слишком беспокоиться о том, как все считается. Есть две проблемы с написанием кода C ++, который компилируется как (или, по крайней мере, выглядит) C. Одна из них заключается в том, что вы не получаете никаких преимуществ C ++, но это ваш выбор. Важным является то, что вы пишете на ломаном диалекте C, который на самом деле не является C. Вместо этого вам следует скомпилировать код C с помощью компилятора C и связать его с кодом C ++. Последнее соображение не относится к Objective-C, поскольку подмножество Objective-C, которое компилируется как C, является C.
Стив Джессоп,
31

С самого начала C ++ разрабатывался как «лучший C», исправляющий упущения в конструкции, как реальные, так и предполагаемые, когда авторы C ++ работали над языком. Результатом этого проектного решения стало то, Xчто наличие действующей программы на C не гарантирует Xее компиляции, не говоря уже о запуске, при обработке компилятором C ++. Изменения коснулись таких базовых конструкций, как строковые литералы (ими стали const char*), присвоение voidуказателей, преобразования между enums и целочисленными типами, семантика составных операторов присваивания и так далее.

Более того, как только появился C99, функции, которые вошли в обновленный стандарт C, были исключены из обновленного стандарта C ++. Опять же, очень важные языковые функции были упущены - в первую очередь, назначенные инициализаторы и массивы переменного размера.

Напротив, Objective C позиционируется как надмножество C, требуя, чтобы все допустимые программы C были компилированы с помощью компилятора Objective C.

Сергей Калиниченко
источник
4
Я ответил на этот вопрос, потому что знаю, что такое «суперсет», но ничего не знаю о Objective-C. Я видел утверждение в другом вопросе SO, что действительный фрагмент кода C int nil = 0; nil++;не компилируется как Objective-C. В чем проблема, очевидно ли, что Objective-C делает доступными заголовки, которые после включения могут сломать ваш код точно так же, как заголовки C? Следовательно, автору этого фрагмента не следовало их включать.
Стив Джессоп,
2
"nil" на самом деле является #define, а не ключевым словом. Вы видите проблемы, потому что включен objc / objc.h. Это похоже на проблемы, которые вы бы увидели, если бы попытались создать переменную с именем YES. (Xcode выделяет их, как если бы они были действительно ключевыми словами, потому что так думать об этом гораздо проще; но они реализованы как простой код на C.)
Роб Нэпьер,
4
Кстати, стоит немного покопаться в objc.ha, если вам интересно, как ObjC живет поверх C.Вещи, которые вы могли бы подумать, будут ключевыми словами (id, BOOL, Class, nil и т. Д.) - это просто простые типы, структуры , и определяет. Вы даже можете реализовать передачу сообщений вручную в чистом C. Никогда, никогда не делай этого. : D Но можно. github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
Роб Нэпир,
2
@DanNeely: Роб Нэпьер сказал «никогда, никогда не делай этого» в качестве комментария к связанному файлу. Связанный файл не является средой выполнения Objective-C, это просто быстрый прием, который показывает, как действительно работает обмен сообщениями.
Дитрих Эпп,
1
Связанный файл не демонстрирует, насколько сложна передача сообщений ObjC. Это демонстрирует, что среда выполнения доступна из C и что вы, в принципе, можете преобразовать код ObjC в чистый C. НО ... это настолько медленно, насколько вы могли бы его построить. Он полагался на то, что я знаю тип возвращаемого значения методов (а для некоторых типов возвращаемого значения мне, вероятно, потребуется знать тип процессора), и я тщательно выбрал методы, которые не принимают параметров. В полном решении есть много тонких уловок (части должны быть на ассемблере, потому что они обманывают кадры стека). Вы никогда не должны пытаться восстановить его.
Роб Напье
12

«Objective-C - это надмножество C» означает, что каждая допустимая программа C является действительной программой Objective-C (с тем же значением).

Он иногда говорит, хотя и не эксперты C ++, что C ++ является надстройкой C. Это не является точным, поэтому ваша цитата делает большое дело сравнивая два.

Стив Джессоп
источник
9

Objective C - это набор обратно совместимых расширений C. Это возможно, потому что функции Objective C разграничены двумя очень простыми способами:

  • использование персонажа @. Этот символ в настоящее время не используется в языке C.
  • простое синтаксическое расширение для вызова методов, [obj method:argument] . В C квадратные скобки используются очень специфическим образом для индексации массива, поэтому это недопустимый синтаксис C. Расширения, основанные на недопустимом синтаксисе, не изменяют значения всего допустимого на языке хоста.

Так легко понять, что никакая программа, использующая расширения Objective C, не может быть строго соответствующей программой ISO C, какой бы простой она ни была. Более того, каждая программа ISO C может быть объявлена ​​по определению действительной программой Objective C. Objective C может легко следить за разработками, такими как C99 и C11.

С другой стороны, C ++ - это не просто расширение C; это другой язык, который меняет значение некоторых синтаксисов C. C ++ и C поддерживаются отдельно, поэтому их взаимосвязь со временем меняется. Например, C получил новые функции, которые полностью отсутствуют в C ++ и, скорее всего, не войдут в C ++, такие как массивы переменной длины C99. C ++ не может легко получить новые функции C.

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

Тривиальный пример программы на C, которая ломается при обработке как C ++, - это любая программа на C, которая использует ключевое слово C ++ в качестве идентификатора, например classили virtual. Objective C не вводит никаких зарезервированных ключевых слов. В нем есть новые ключевые слова, которые вводит @персонаж, например @interface.

Каз
источник