Зарезервированное слово - Reserved word

В компьютерный язык, а зарезервированное слово (также известный как зарезервированный идентификатор) - это слово, которое нельзя использовать как идентификатор, например, имя переменной, функции или метка - "зарезервировано". Это синтаксический определение, а зарезервированное слово может не иметь значения.

Тесно родственное и часто смешанное понятие - это ключевое слово, которое имеет особое значение в определенном контексте. Это семантический определение. Напротив, имена в стандартная библиотека но не встроенные в язык, не считаются зарезервированными словами или ключевыми словами. Термины «зарезервированное слово» и «ключевое слово» часто используются взаимозаменяемо - можно сказать, что зарезервированное слово «зарезервировано для использования в качестве ключевого слова» - и формальное использование варьируется от языка к языку; для этой статьи мы различаем то, что указано выше.

В общем случае зарезервированные слова и ключевые слова не обязательно должны совпадать, но в большинстве современных языков ключевые слова представляют собой подмножество зарезервированных слов, поскольку это упрощает синтаксический анализ, поскольку ключевые слова нельзя путать с идентификаторами. В некоторых языках, таких как C или Python, зарезервированные слова и ключевые слова совпадают, тогда как в других языках, таких как Java, все ключевые слова являются зарезервированными словами, но некоторые зарезервированные слова не являются ключевыми словами - они «зарезервированы для использования в будущем». На других языках, таких как старые языки АЛГОЛ, FORTRAN и PL / I, есть ключевые слова, но нет зарезервированных слов, при этом ключевые слова можно отличить от идентификаторов другими способами. Это затрудняет синтаксический анализ с помощью прогнозирующих синтаксических анализаторов.

Различие

Наборы зарезервированных слов и ключевых слов в языке часто совпадают или почти равны, и различие тонкое, поэтому термины часто используются как взаимозаменяемые. Однако при осторожном использовании их различают.

Превращение ключевых слов в зарезервированные слова делает лексика проще, поскольку строка символов однозначно будет либо ключевым словом, либо идентификатором, вне зависимости от контекста; таким образом, ключевые слова обычно представляют собой подмножество зарезервированных слов. Однако зарезервированные слова не обязательно должны быть ключевыми словами - например, в Java, идти к является зарезервированным словом, но не имеет значения и не фигурирует ни в каких правилах грамматики. Обычно это делается для прямая совместимость, поэтому зарезервированное слово может стать ключевым словом в будущей версии без нарушения работы существующих программ.

И наоборот, ключевые слова не обязательно должны быть зарезервированными словами, их роль понимается из контекста, или они могут отличаться другим способом, например строппинг. Например, фраза если = 1 является однозначным в большинстве грамматик, поскольку управляющий оператор предложения if не может начинаться с =, и поэтому разрешен на некоторых языках, например FORTRAN. В качестве альтернативы в АЛГОЛ 68, ключевые слова должны быть выделены - отмечены каким-либо образом, чтобы отличить их - на строгом языке путем перечисления жирным шрифтом, и поэтому не являются зарезервированными словами. Таким образом, в строгом языке следующее выражение является допустимым, так как ключевое слово жирным шрифтом если не конфликтует с обычным идентификатором если:

если если экв 0 тогда 1 фи

Однако в АЛГОЛе 68 также есть режим корректировки, в котором ключевые слова являются зарезервированными словами, пример того, как эти различные концепции часто совпадают; этому следуют во многих современных языках.

Синтаксис

Зарезервированное слово - это слово, которое "похоже" на обычное слово, но не может использоваться как обычное слово. Формально это означает, что он удовлетворяет обычному лексический синтаксис (синтаксис слов) идентификаторов - например, последовательность букв - но не может использоваться там, где используются идентификаторы. Например, слово если обычно зарезервировано, а Икс в общем нет, поэтому х = 1 это допустимое задание, но если = 1 не является.

Ключевые слова используются по-разному, но в основном делятся на несколько классов: часть грамматики фраз (в частности, правило производства с нетерминальные символы ), с разными значениями, часто используется для поток управления, например, слово если на большинстве процедурных языков, что означает условный и принимает предложения (нетерминальные символы); имена примитивных типов на языке, поддерживающие система типов, Такие как int; примитивный буквальный такие ценности, как истинный для логического значения true; или иногда специальные команды, такие как выход. Другие варианты использования ключевых слов во фразах предназначены для ввода / вывода, например Распечатать.

Различные определения ясны, когда язык анализируется комбинацией лексера и парсера, а синтаксис языка генерируется лексическая грамматика для слов, и контекстно-свободная грамматика из правила производства для фраз. Это обычное дело при анализе современных языков, и в этом случае ключевые слова представляют собой подмножество зарезервированных слов, поскольку они должны отличаться от идентификаторов на уровне слова (следовательно, зарезервированные слова) для синтаксического анализа по-разному на уровне фразы (как ключевые слова).

В этом случае зарезервированные слова определяются как часть лексической грамматики, и каждое токенизируется как отдельный тип, отличный от идентификаторов. В обычных обозначениях зарезервированные слова если и тогда например, токенизируются как типы ЕСЛИ и ТОГДАсоответственно, а Икс и у оба токенизируются как тип Идентификатор.

Ключевые слова, напротив, синтаксически появляются в грамматике фраз, как терминальные символы. Например, производственное правило для условного выражения может быть Если выражение THEN выражение. В этом случае ЕСЛИ и ТОГДА являются терминальными символами, означающими "токен типа ЕСЛИ или же ТОГДАсоответственно "- и из-за лексической грамматики это означает строку если или же тогда в первоисточнике. В качестве примера примитивного постоянного значения, истинный может быть ключевым словом, представляющим логическое значение «истина», и в этом случае оно должно появиться в грамматике как возможное расширение продукции Двоичное выражение, например.

Зарезервированные диапазоны

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

Чаще всего это делается с помощью префикса, часто одного или нескольких подчеркивает. C и C ++ примечательны в этом отношении: C99 резервирует идентификаторы, которые начинаются с двух подчеркиваний или символа подчеркивания, за которым следует заглавная буква, и дополнительно резервирует идентификаторы, которые начинаются с одного подчеркивания (в обычном пространстве и пространстве тегов) для использования в область файла;[1] с C ++ 03 дополнительно резервирует идентификаторы, содержащие двойное подчеркивание в любом месте[2] - это позволяет использовать двойное подчеркивание в качестве разделителя (например, для соединения идентификаторов пользователей).

Частое использование двойного подчеркивания во внутренних идентификаторах в Python привело к появлению аббревиатуры дандер; это было придумано Марк Джексон[3] и независимо Тим Хохберг,[4] с разницей в несколько минут, оба ответили на один и тот же вопрос в 2002 году.[5][6]

Технические характеристики

Список зарезервированных слов и ключевых слов на языке определяется при разработке языка, и оба они составляют часть языка. формальная спецификация. Обычно желательно минимизировать количество зарезервированных слов, чтобы избежать ограничения допустимых имен идентификаторов. Кроме того, введение новых зарезервированных слов нарушает работу существующих программ, использующих это слово (оно не имеет обратной совместимости), поэтому этого можно избежать. Чтобы предотвратить это и обеспечить прямая совместимость, иногда слова зарезервированы без текущего использования (зарезервированное слово, которое не является ключевым словом), так как это позволяет использовать слово в будущем без нарушения существующих программ. В качестве альтернативы новые языковые функции могут быть реализованы как предопределенные, которые можно переопределить, не нарушая, таким образом, существующие программы.

Причины гибкости включают разрешение поставщикам компиляторов расширять спецификацию, включая нестандартные функции, различные стандартные диалекты языка для ее расширения или будущие версии языка для включения дополнительных функций. Например, процедурный язык может предполагать добавление объектно-ориентированный возможности в будущей версии или на каком-то диалекте, после чего можно добавить такие ключевые слова, как учебный класс или же объект. Чтобы учесть эту возможность, текущая спецификация может сделать эти зарезервированные слова, даже если они в настоящее время не используются.

Яркий пример - в Ява, куда const и идти к являются зарезервированными словами - они не имеют значения в Java, но также не могут использоваться в качестве идентификаторов. Зарезервировав условия, они могут быть реализованы в будущих версиях Java, если это необходимо, без нарушения старого исходного кода Java. Например, в 1999 году было предложение добавить C ++ подобный const на язык, который можно было использовать const слово, поскольку оно было зарезервировано, но в настоящее время не используется; однако это предложение было отклонено - в частности, потому что, хотя добавление функции не нарушило бы работу каких-либо существующих программ, используя ее в стандартной библиотеке (особенно в коллекциях) бы нарушить совместимость.[7] JavaScript также содержит ряд зарезервированных слов без особой функциональности; точный список зависит от версии и режима.[8]

Языки существенно различаются по тому, как часто они вводят новые зарезервированные слова или ключевые слова и как они их называют, при этом некоторые языки очень консервативны и вводят новые ключевые слова редко или никогда, чтобы избежать нарушения существующих программ, в то время как другие языки вводят новые ключевые слова более свободно, требуя наличия существующих программы для изменения существующих идентификаторов, которые конфликтуют. Тематическое исследование представлено новыми ключевыми словами в C11 по сравнению с C ++ 11 оба из 2011 г. - напомним, что в C и C ++ идентификаторы, начинающиеся с символа подчеркивания, за которым следует заглавная буква, зарезервированы:[9]

Комитет C предпочитает не создавать новые ключевые слова в пространстве имен пользователей, поскольку обычно ожидается, что каждая ревизия C будет избегать поломки старых программ C. Для сравнения, комитет C ++ (WG21) предпочитает делать новые ключевые слова такими же нормальными, как старые. Например, C ++ 11 определяет новый thread_local ключевое слово для обозначения статического хранилища, локального для одного потока. C11 определяет новое ключевое слово как _Thread_local. В новом заголовке C11 есть определение макроса, обеспечивающее нормальное имя:[10]

#define thread_local _Thread_local

То есть C11 ввел ключевое слово _Thread_local в существующем наборе зарезервированных слов (с определенным префиксом), а затем использовал отдельное средство (обработка макросов), чтобы разрешить его использование, как если бы это было новое ключевое слово без какого-либо префикса, в то время как C ++ 11 вводит ключевое слово thread_local несмотря на то, что это не существующее зарезервированное слово, это нарушает любые программы, которые его использовали, но без необходимости обработки макросов.

Предопределенные имена

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

Языки различаются в зависимости от того, что предоставляется как ключевое слово, а что является предопределенным. Некоторые языки, например, предоставляют ключевые слова для операций ввода / вывода, тогда как в других это библиотечные процедуры. В Python (версии до 3.0) и многие БАЗОВЫЙ диалекты, Распечатать это ключевое слово. Напротив, эквиваленты C, Lisp и Python 3.0 printf, формат, и Распечатать - это функции в стандартной библиотеке. Точно так же в Python до 3.0 Никто, Истинный, и Ложь были предопределенными переменными, но не зарезервированными словами, но в Python 3.0 они были преобразованы в зарезервированные слова.[11]

Определение

Некоторые используют термины «ключевое слово» и «зарезервированное слово» как синонимы, в то время как другие различают использование, например, используя «ключевое слово» для обозначения слова, которое является особенным только в определенных контекстах, а «зарезервированное слово» - для обозначения специального слова, которое нельзя использовать. как пользовательское имя. Значение ключевых слов - и, собственно, значение понятия ключевое слово - сильно отличается от языка к языку. Конкретно, в АЛГОЛе 68 ключевые слова выделены (на строгом языке выделены жирным шрифтом) и не являются зарезервированными словами - слово без строки может использоваться как обычный идентификатор.

"Язык Java В спецификации "используется термин" ключевое слово ".[12] Стандарт ISO 9899 для Язык программирования C использует термин "ключевое слово".[13]

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

На некоторых языках, например АЛГОЛ и Алгол 68, ключевые слова не могут быть записаны дословно, но должны быть застегнутый. Это означает, что ключевые слова нужно как-то отмечать. Например. цитируя их или ставя перед ними специальный символ. Как следствие, ключевые слова не являются зарезервированными словами, и поэтому одно и то же слово может использоваться в качестве обычного идентификатора. Однако один из режимов корректировки заключался в том, чтобы не ограничивать ключевые слова, а вместо этого использовать их просто как зарезервированные слова.

Некоторые языки, например PostScript, чрезвычайно либеральны в этом подходе, позволяя переопределить ключевые ключевые слова для конкретных целей.

В Common Lisp термин "ключевое слово" (или "символ ключевого слова") используется для особого вида символ, или идентификатор. В отличие от других символов, которые обычно обозначают переменные или функции, ключевые слова являются самостоятельными.цитирование и самооценка[14]:98 и есть интернированный в КЛЮЧЕВОЕ СЛОВО упаковка.[15] Ключевые слова обычно используются для обозначения именованных аргументов функций и для представления символьных значений. Символы, обозначающие функции, переменные, специальные формы и макросы в пакете COMMON-LISP, в основном являются зарезервированными словами. Эффект от их переопределения не определен в ANSI Common Lisp.[16] Связывание их возможно. Например, выражение (если в случае или) возможно, когда если это локальная переменная. Крайний левый если относится к если оператор; остальные символы интерпретируются как имена переменных. Поскольку для функций и переменных существует отдельное пространство имен, если может быть локальной переменной. В Common Lisp, однако, есть два специальных символа, которых нет в пакете ключевых слов: символы т и ноль. Когда они оцениваются как выражения, они оценивают сами себя. Они не могут использоваться в качестве имен функций или переменных, поэтому де-факто зарезервированы. (пусть ((t 42))) правильное выражение, но позволять оператор не разрешит использование.

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

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

Сравнение по языку

Не все языки имеют одинаковое количество зарезервированных слов. Например, Java (и другие C производные) имеет довольно редкий набор зарезервированных слов - около 50 - тогда как КОБОЛ имеет примерно 400. На другом конце спектра чистый Пролог а PL / у меня их вообще нет.

Количество зарезервированных слов в языке мало связано с тем, насколько «мощный» язык. COBOL был разработан в 1950-х годах как бизнес-язык и был создан для самодокументирования с использованием структурных элементов, похожих на английский, таких как глаголы, предложения, предложения, разделы и деления. C, с другой стороны, был написан очень кратко (синтаксически) и позволял выводить на экран больше текста. Например, сравните эквивалентные блоки кода из C и COBOL для расчета недельного дохода:

      // Расчет на C:            если (наемный)              количество = 40 * ставка оплаты;      еще              количество = часы * ставка оплаты;
      *> Расчет в COBOL:ЕСЛИ Наемный ТОГДА НЕСКОЛЬКО Ставка оплаты К 40 ПРЕДОСТАВЛЕНИЕ КоличествоЕЩЕ НЕСКОЛЬКО Ставка оплаты К Часы ПРЕДОСТАВЛЕНИЕ КоличествоКОНЕЦ-ЕСЛИ.
      *> Другой пример расчета в COBOL:ЕСЛИ Наемный         Вычислить Количество = Ставка оплаты * 40ЕЩЕ Вычислить Количество = часы * ставка оплатыКОНЕЦ-ЕСЛИ.

Логика чистого Пролога выражается в терминах отношений, и выполнение запускается путем выполнения запросов по этим отношениям. Такие конструкции, как циклы, реализуются с использованием рекурсивных отношений.

Все три этих языка могут решать одни и те же типы «проблем», даже если у них разное количество зарезервированных слов. Эта «сила» связана с их принадлежностью к множеству Полный по Тьюрингу языков.

Недостатки

Определение зарезервированных слов в языке вызывает проблемы. Новым пользователям может быть трудно выучить язык из-за длинного списка зарезервированных слов для запоминания, которые нельзя использовать в качестве идентификаторов. Расширение языка может оказаться трудным, потому что добавление зарезервированных слов для новых функций может сделать существующие программы недействительными или, наоборот, «перегрузка» существующих зарезервированных слов новыми значениями может сбивать с толку. Перенос программ может быть проблематичным, поскольку слово, не зарезервированное одной системой / компилятором, может быть зарезервировано другим.

Зарезервированные слова и языковая независимость

Microsoft .СЕТЬ Общая языковая инфраструктура (CLI) Спецификация позволяет объединить код, написанный на более чем 40 различных языках программирования, в конечный продукт. Из-за этого могут возникать конфликты идентификатора / зарезервированного слова, когда код, реализованный на одном языке, пытается выполнить код, написанный на другом языке. Например, Visual Basic.NET библиотека может содержать учебный класс определение, такое как:

'Определение этого класса в Visual Basic.NET:Общественные Учебный класс это        'Этот класс что-то делает ...Конец Учебный класс

Если он компилируется и распространяется как часть набора инструментов, C # программист, желающий определить переменную типа «это»Возникнет проблема: 'это' это зарезервированное слово в C #. Таким образом, следующее не будет компилироваться на C #:

// Использование этого класса в C #:это Икс = новый это();  // Не компилируется!

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

Это решено строппинг. Чтобы обойти эту проблему, спецификация позволяет программисту (на C #) размещать знак перед идентификатором, который заставляет компилятор считать его идентификатором, а не зарезервированным словом:

// Использование этого класса в C #:@это Икс = новый @это();  // Скомпилируем!

Для согласованности это использование также разрешено в закрытых настройках, таких как локальные переменные, имена параметров и частные члены.

Смотрите также

Рекомендации

  1. ^ Спецификация C99, 7.1.3 Зарезервированные идентификаторы
  2. ^ Спецификация C ++ 03, 17.4.3.2.1 Глобальные имена [lib.global.names]
  3. ^ Джексон, Марк (26 сентября 2002 г.). «Как вы произносите« __ »(двойное подчеркивание)?». список Python (Список рассылки). Получено 9 ноября, 2014.
  4. ^ Хохберг, Тим (26 сентября 2002 г.). «Как вы произносите« __ »(двойное подчеркивание)?». список Python (Список рассылки). Получено 9 ноября, 2014.
  5. ^ Dunder (Double UNDERscore) Псевдоним
  6. ^ Нотц, Пэт (26 сентября 2002 г.). «Как вы произносите« __ »(двойное подчеркивание)?». список Python (Список рассылки). Получено 9 ноября, 2014.
  7. ^ "Идентификатор ошибки: JDK-4211070 Java должна поддерживать константные параметры (например, C ++) для поддержки кода [sic]". Bugs.sun.com. Получено 2014-11-04.
  8. ^ Лексическая грамматика: Ключевые слова
  9. ^ Спецификация C99, 7.1.3 Зарезервированные идентификаторы: «Все идентификаторы, начинающиеся с символа подчеркивания и либо прописной буквы, либо другого подчеркивания, всегда зарезервированы для любого использования».
  10. ^ C11: Новый стандарт C, Томас Плам, "Заметка о ключевых словах"
  11. ^ "История None, True и False (и объяснение добавленных литералов, ключевых слов и встроенных функций) ", История Python, 10 ноября 2013 г., Гвидо ван Россум
  12. ^ «Спецификация языка Java, 3-е издание, раздел 3.9: Ключевые слова». Sun Microsystems. 2000. Получено 2009-06-17. Следующие последовательности символов, образованные из букв ASCII, зарезервированы для использования в качестве ключевых слов и не могут использоваться в качестве идентификаторов [...]
  13. ^ «ISO / IEC 9899: TC3, раздел 6.4.1: Ключевые слова» (PDF). Международная организация по стандартизации JTC1 / SC22 / WG14. 2007-09-07. Вышеупомянутые токены (с учетом регистра) зарезервированы (на этапах трансляции 7 и 8) для использования в качестве ключевых слов и не должны использоваться иначе.
  14. ^ Питер Норвиг: Парадигмы программирования с использованием искусственного интеллекта: примеры использования Common Lisp, Морган Кауфманн, 1991, ISBN  1-55860-191-0, Интернет
  15. ^ Тип КЛЮЧЕВОЕ СЛОВО от Common Lisp HyperSpec
  16. ^ "Ограничения пакета COMMON-LISP для соответствующих программ".