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

На вчерашней встрече CocoaHeads в Оресунде Пейлоу создал отличную викторину по 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. Или?

Не мог бы кто-нибудь дать нам авторитетное объяснение этого острого вопроса?

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

РЕДАКТИРОВАТЬ: Как отметил Николай Рухе, нам нужно четкое определение «ключевого слова», чтобы продолжить. Нико процитировал статью в Википедии, в которой говорилось, что ключевое слово - это «слово или идентификатор, имеющий определенное значение».

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

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

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

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

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


person Felixyz    schedule 09.12.2009    source источник
comment
Некоторые связанные материалы здесь: stackoverflow.com/questions/25749/   -  person Felixyz    schedule 19.12.2009


Ответы (6)


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

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

person NSResponder    schedule 09.12.2009
comment
Тогда это будет означать, что @interface является ключевым словом (в смысле, указанном в редактировании выше), а id - нет, потому что компилятор отказывается компилировать, например, int @interface = 1; но с радостью использует id как имя для int. Но опять же, компилятор также не поддерживает int @icecream = 1 ;. Так, где это оставляет нас? #import - директива препроцессора @interface - директива компилятора @ - зарезервированный идентификатор символа / self / in - специальное значение в некоторых контекстах, но не зарезервировано - person Felixyz; 09.12.2009
comment
id - это typedef. Вы можете найти его в objc.h - person NSResponder; 09.12.2009

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

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

Из записи в Википедии:

Objective-C is a thin layer on top of C, and moreover is a strict superset of C. It is possible to compile any C program with an Objective-C compiler, and to freely include C code within an Objective-C class.

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

person jon hohle    schedule 09.12.2009
comment
Это очень хороший момент, хотя ограничение, по-видимому, не полностью соблюдается gcc. - person Felixyz; 09.12.2009
comment
Вывод неверный. Надмножество языка может добавлять ключевые слова, используя термины, недопустимые в исходном языке. Именно это и делает Objective-C. - person Nikolai Ruhe; 09.12.2009
comment
Что касается super, не являющегося макросом: компилятор должен уметь распознавать super, поскольку он должен использовать правильный тип сообщения (вызов objc_msgSendSuper вместо objc_msgSend). super указывает на тот же объект, что и self, поэтому нет особого смысла делать его еще одним аргументом. - person Nikolai Ruhe; 09.12.2009
comment
Objective-C, являющийся надмножеством, не мешает ему добавлять дополнительные ограниченные ключевые слова, но позволяет всем программам на C компилироваться с помощью компилятора Objective-C. - person jon hohle; 10.12.2009
comment
@jon: Почему? Objective-C действительно добавляет ключевые слова, как указал NSResponder. Но компилятор также компилирует все программы на C. - person Nikolai Ruhe; 10.12.2009
comment
@jon: B.t.w: неявный аргумент self методов экземпляра не относится к типу id, а статически типизирован для класса. - person Nikolai Ruhe; 10.12.2009
comment
@Nikolai: Я думаю, что Джон имеет в виду, что программа C с переменной super, которая будет компилироваться под C, не будет принята компилятором Objective-C (по крайней мере, не gcc), и в этом отношении кажется, что чтобы нарушить строгие требования к суперсету. - person Felixyz; 10.12.2009
comment
@Felixyz: использование super в качестве имени переменной в функции C отлично подходит для компиляции в gcc4.0, gcc4.2 и clang. Конечно, использование его в методе является ошибкой. Требования не нарушены. Я имел в виду, что рассуждения Джона неверны: строгий надмножество может добавлять ключевые слова в язык, ничего не нарушая. - person Nikolai Ruhe; 10.12.2009
comment
@Nikolai Ruhe: Я согласен с вашей точкой зрения: можно ли использовать super в качестве имени переменной внутри метода, не важно, если он компилируется в функцию C, что он делает. И @ не является допустимым символом в идентификаторах C, поэтому запрещение использования @interface и т. Д. В качестве имен переменных также не нарушает строгие требования к надмножеству. - person Felixyz; 16.12.2009

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

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

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

Терминалы в грамматике будут:

  • пустота
  • символ
  • короткая
  • int
  • длинная
  • плавать
  • двойной
  • подписанный
  • беззнаковый
  • id
  • const
  • летучий
  • in
  • вне
  • inout
  • ксерокопия
  • byref
  • в одну сторону
  • себя
  • супер
  • @интерфейс
  • @конец
  • @выполнение
  • @конец
  • @интерфейс
  • @конец
  • @выполнение
  • @конец
  • @protoco
  • @конец
  • @класс
person nes1983    schedule 09.12.2009
comment
Вопрос в том, какие зарезервированные ключевые слова ObjC может добавить в C. Как видно из примеров, вы можете использовать in в качестве имени переменной, поэтому оно явно не считается зарезервированным ключевым словом. . - person Felixyz; 09.12.2009
comment
Я имею в виду, что int float = 45; не компилируется, пока int id = 45; хорошо компилируется, что-то нам говорит. - person Felixyz; 09.12.2009
comment
они не примеры. Насколько я понимаю, это полный список. Ну, это зависит от того, что вы хотите назвать ключевым словом. Я дал вам свой ответ на этот вопрос. - person nes1983; 09.12.2009
comment
Я имел в виду пример кода в вопросе. ключевое слово в языке не является терминальным. Вы имели в виду терминал? Я не думаю, что кто-то назовет #define ключевым словом, так зачем нам @interface? Спасибо за предложение, но я не уверен. Для меня все, что можно использовать в качестве имени переменной, не может быть (зарезервированным) ключевым словом. - person Felixyz; 09.12.2009
comment
@Felixyz: Похоже, что в качестве предварительного условия для ответа на ваш вопрос важно (как правило) определить ключевое слово term. Только тогда можно будет ответить, что является ключевым словом в случае Objective-C. Очевидно, на этот счет существуют разные мнения. - person Nikolai Ruhe; 09.12.2009

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

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

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

person Kornel    schedule 22.03.2010

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

person Laurent Etiemble    schedule 09.12.2009
comment
Правильно. Итак, вопрос: есть ли какие-либо зарезервированные ключевые слова в Objective-C (помимо тех, что уже зарезервированы в C). - person Felixyz; 09.12.2009
comment
Здесь нет зарезервированных ключевых слов, как в смысле других языков. Это больше похоже на определения, которые могут плохо взаимодействовать с вашим кодом. Все зависит от работы препроцессора. - person Laurent Etiemble; 09.12.2009

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

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

person Kristopher Johnson    schedule 09.12.2009