Подтвердить что ты не робот

Зарезервированные ключевые слова в Objective-C?

На вчерашней встрече CocoaHeads Öresund peylow построил большую викторину ObjC. Конкуренция была интенсивной, и три человека остались с одинаковой оценкой, когда последний вопрос должен был быть оценен: сколько зарезервированных ключевых слов Objective-C добавить в C?

Последовали некоторые энергичные дебаты. Все согласились с тем, что @interface, @implementation и т.д. - все предпроцессорные директивы, а не ключевые слова, но как насчет чего-то вроде in? Это может быть ключевое слово, но это не зарезервированное ключевое слово. Например, следующее будет компилироваться без ошибок или предупреждений:

NSArray* in;
for (in in in)
   NSLog(@"bwahahaa");

Мы пришли к выводу, что ObjC добавляет к C нет зарезервированные ключевые слова, и кто-то выиграл, казалось бы, хорошо заработанную книгу.

Но сегодня я попытался более систематически злоупотреблять компилятором, попробовав такие вещи:

int self = 45;
self++;
int y = self;

Это компилируется отлично, и тот же код работает, заменяя self на BOOL, bycopy, inout, oneway, byref, SEL, и IMP.

Используя id в качестве имени переменной, первая и последняя строки компилируются, но не вторая. То же самое относится к Protocol и Class.

Используя super, первая строка компилируется, но не вторая и третья.

С YES, NO и NULL все три строки не скомпилируются, вероятно, потому, что они просто определены как true, false и nil.

Мне кажется, что многое из этого похоже на gcc, и я не уверен, что он отражает то, что есть и не является зарезервированным ключевым словом в Objective-C. Почему, например, можно использовать self как имя int, но не super?

Тот факт, что первое задание всегда работает (за исключением YES, NO и NULL), похоже, поддерживает идею о том, что ни один из кандидатов не является технически зарезервированными ключевыми словами, которые не найдены в C. Или?

Может кто-нибудь, пожалуйста, дайте нам убедительное объяснение этой тернистой проблемы?

На карту поставлено несколько людей.

EDIT: Как отметил Николай Рух, нам нужно четкое определение "ключевое слово" для продолжения. Нико привел статью в Википедии, в которой говорится, что ключевым словом является "слово или идентификатор, который имеет конкретное значение".

Я думаю, что разумно использовать это определение из той же статьи:

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

Кроме того, как говорится в статье:

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

В этом смысле есть ли зарезервированные ключевые слова предопределенные в официальных форматах языков и не могут использоваться как определяемые пользователем имена?

4b9b3361

Ответ 1

Все согласились, что @interface, @implementation и т.д. - все предпроцессорные директивы, а не ключевые слова

Тогда все ошиблись. #import и #pragma являются препроцессорными директивами.   @interface, @implementation, @protocol и т.д. являются ключевыми словами Objective-C, и они являются директивами компилятора. Они не были предпроцессорными директивами, так как NeXT расширил GCC, чтобы скомпилировать Objective-C без первоначальной реализации оригинальной версии Objective-C.

Ответ 2

Re: Николай Рухе предполагает, что я - ключевое слово

self является параметром метода Objective-C типа id (аналогично тому, как _cmd также является параметром типа SEL), а не ключевым словом. nil - макрос, который расширяется до NULL. Я немного разочарован тем, что super не распространяется на макрос и не является параметром.

Из записи wikipedia:

Objective-C - это тонкий слой поверх C и, кроме того, является строгим надмножеством C. Можно скомпилировать любую программу C с помощью компилятора Objective-C и свободно включать код C в Objective-C класс.

Это помешало бы Objective-C добавить к языку ограниченные ключевые слова.

Ответ 3

Грамматика в Приложение B исходной книги 1995 года определяет super как "буквальный символ", и это особый случай в сообщении синтаксиса приемника.

in Литеральный символ является частью квалификатора протокола в ObjC 1.0 и повторно использовался в синтаксисе быстрого перечисления в ObjC 2.0 (который не имеет формального определения грамматики AFAIK).

id определяется как часть спецификатора типа рядом с void, char, unsigned, typedefed types и т.д. Если вы вызываете void ключевое слово, то id тоже.

Ответ 4

Посмотрите на Objective-C Язык программирования дает некоторые подсказки о том, что возможно или нет. Поскольку некоторые "ключевые слова" определены в файле заголовка, их замещение может привести к наблюдаемому (и неожиданному) поведению.

Ответ 5

Wikipedia определяет ключевые слова как:

В компьютерном программировании ключевым словом является слово или идентификатор, который имеет особое значение для языка программирования.

Я бы перевел это так: ключевое слово на языке не является терминалом в его грамматике. (Btw, грамматика не содержит слова "ключевое слово" только сама по себе, поэтому нет путаницы там).

Клеммы в grammar:

  • недействительным
  • char
  • короткий
  • ИНТ
  • длинный
  • поплавок
  • двойной
  • подписан
  • без знака
  • ID
  • Const
  • летучий
  • в
  • из
  • INOUT
  • bycopy
  • ByRef
  • односторонняя
  • самостоятельно
  • супер
  • @interface
  • @end
  • @implementation
  • @end
  • @interface
  • @end
  • @implementation
  • @end
  • @protoco
  • @end
  • @class

Ответ 6

Вы можете проверить Objective-C Язык программирования.

Насколько я могу судить, этот документ не классифицирует ничего как "зарезервированное слово". @implementation, @interface и т.д. Называются "директивами компилятора".