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

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

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

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

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

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

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

Ответ 1

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

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

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

enter image description here

Ответ 2

  • Что они подразумевают под супермножеством?

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

  • Каким образом Objective-C будет более близким//обратно совместимым с C?

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

    int *foo = malloc(12);
    

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

  • Каким образом Objective-C следует за философией C ближе, чем С++?

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

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

    Да.

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

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