Что именно означает "Objective-C является надмножеством C более строго, чем C++"?
Из того, что я прочитал там: Почему Objective-C не очень популярен вне сообщества Apple?
Objective-C является надмножеством C (на самом деле более строго, чем C++), поэтому проблема обратной совместимости не возникает. Все, что вы можете сделать в C, вы можете сделать в Objective-C.
Быть надмножеством бинарно, как быть беременной. Obj-C является надмножеством C, а C++ - нет.
Что они подразумевают под суперсетом? Каким образом target-C будет более близко // обратно совместим с C? Каким образом Objective-C следует философии C более тесно, чем C++?
Может ли любая программа на C быть скомпилирована без модификации компилятором Objective-C (100% совместимость)?
Это больше вопрос дизайна и совместимости языка программирования, чем войны, о которой лучше.
5 ответов
Я подготовил простую диаграмму; это не очень красиво, но, мы надеемся, поможет понять:
- Красный: набор всех программ, допустимых на C, C++ и Objective-C (относительно небольшой)
- Зеленый: набор всех программ, допустимых в C и Objective-C, но недействительных в C++ (даже меньше)
- Серый: набор всех программ, допустимых в Objective C и C++, но недействительных в C (насколько я знаю, пустые)
- Синий: набор всех программ действителен только в Objective C (относительно большой)
- Желтый: набор всех программ, действительных только на C++ (самый большой)
Набор допустимых программ на C (красный и зеленый) является строгим подмножеством набора допустимых программ Objective C (синий).
Что они подразумевают под суперсетом?
Они означают строгий суперсет. Любая допустимая C-программа будет компилироваться с компилятором Objective-C. Некоторые действительные программы на C не будут компилироваться с помощью компилятора C++.
Каким образом target-C будет более близко // обратно совместим с C?
Вот простой пример:
int *foo = malloc(12);
Компилируется в C и Objective-C, но не в C++. Есть, конечно, и другие примеры.
Каким образом Objective-C следует философии C более тесно, чем C++?
Все - Objective-C является строгим надмножеством C.
Может ли любая программа на C быть скомпилирована без модификации компилятором Objective-C (100% совместимость)?
Да.
С самого начала C++ был спроектирован как "лучший C", исправляя упущения в дизайне, как реальные, так и воспринимаемые, так как авторы C++ проходили через этот язык. Результатом этого дизайнерского решения было то, что X
будучи действительной программой на C, не гарантирует, что X
будет компилироваться, не говоря уже о запуске, при обработке компилятором C++. Изменения коснулись таких базовых конструкций, как строковые литералы (они стали const char*
), назначение void
указатели, преобразования между enum
s и целочисленные типы, семантика составных операторов присваивания и т. д.
Более того, как только появился C99, функции, вошедшие в обновленный стандарт C, были исключены из обновленного стандарта C++. Опять же, очень важные языковые возможности были опущены - в частности, обозначенные инициализаторы и массивы переменного размера.
Напротив, Objective C был позиционирован как расширенный набор C, требующий компиляции всех допустимых программ на C с компилятором Objective C.
"Objective-C - это расширенный набор C" означает, что каждая действительная программа на C является допустимой программой Objective-C (с тем же значением).
Иногда говорят, хотя и не эксперты C++, что C++ является надмножеством C. Это не совсем верно, поэтому ваша цитата делает большое сравнение между ними.
Objective C - это набор обратно совместимых расширений C. Это возможно, потому что функции Objective C разграничены двумя очень простыми способами:
- использование персонажа
@
, Этот символ в настоящее время не используется в языке Си. - простое синтаксическое расширение для вызова методов,
[obj method:argument]
, В C квадратные скобки используются очень специфическим образом для подписки массива, и поэтому это недопустимый синтаксис C. Расширения, основанные на недопустимом синтаксисе, не меняют значения всего, что является допустимым в языке хоста.
Так легко увидеть, что ни одна программа, использующая расширения Objective C, не может быть строго соответствующей программе ISO C, какой бы простой она ни была. Более того, каждая программа ISO C может быть объявлена по определению действительной программой Objective C. Цель 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
, Цель C не вводит никаких зарезервированных ключевых слов. У него есть новые ключевые слова, которые вводятся @
характер, как @interface
,