stringtranslate.com

Зарезервированное слово

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

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

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

Различие

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

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

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

если если ур 0 то 1 фи

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

Синтаксис

Зарезервированное слово — это слово, которое «выглядит как» обычное слово, но не может использоваться как обычное слово. Формально это означает, что оно удовлетворяет обычному лексическому синтаксису (синтаксису слов) идентификаторов — например, будучи последовательностью букв — но не может использоваться там, где используются идентификаторы. Например, слово ifобычно является зарезервированным словом, в то время как xобычно не является, поэтому x = 1является допустимым назначением, но if = 1не является.

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

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

В этом случае зарезервированные слова определяются как часть лексической грамматики, и каждое из них токенизировано как отдельный тип, отличный от идентификаторов. В общепринятой нотации зарезервированные слова ifи , thenнапример, токенизированы как типы IFи THEN, соответственно, тогда как xи yоба токенизированы как тип Identifier.

Ключевые слова, напротив, синтаксически появляются в грамматике фразы как терминальные символы . Например, правилом производства для условного выражения может быть IF Expression THEN Expression. В этом случае IFи THENявляются терминальными символами, означающими «токен типа IFили THEN, соответственно» – и из-за лексической грамматики это означает строку ifили thenв исходном источнике. В качестве примера примитивного постоянного значения trueможет быть ключевое слово, представляющее логическое значение «истина», в этом случае оно должно появляться в грамматике как возможное расширение производства BinaryExpression, например.

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

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

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

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

Спецификация

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

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

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

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

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

#define thread_local _Thread_local

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

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

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

Языки различаются в зависимости от того, что предоставляется как ключевое слово, а что является предопределенным. Например, некоторые языки предоставляют ключевые слова для операций ввода/вывода, тогда как в других это библиотечные процедуры. В Python (версии ниже 3.0) и многих диалектах BASICprint является ключевым словом. Напротив, эквиваленты C, Lisp и Python 3.0 printf, format, и printявляются функциями в стандартной библиотеке. Аналогично, в Python до 3.0 , None, Trueи Falseбыли предопределенными переменными, но не зарезервированными словами, но в Python 3.0 они были преобразованы в зарезервированные слова. [11]

Определение

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

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

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

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

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

В Common Lisp термин «ключевое слово» (или «символ ключевого слова») используется для особого вида символа или идентификатора. В отличие от других символов, которые обычно обозначают переменные или функции, ключевые слова являются самоцитирующими и самовычисляемыми [14] :98 и интернируются в KEYWORDпакет. [15] Ключевые слова обычно используются для обозначения именованных аргументов функций и для представления символических значений. Символы, которые называют функции, переменные, специальные формы и макросы в пакете с именем COMMON-LISP, в основном являются зарезервированными словами. Эффект их переопределения не определен в ANSI Common Lisp. [16] Их связывание возможно. Например, выражение (if if case or)возможно, когда ifявляется локальной переменной. Крайний слева ifотносится к ifоператору; остальные символы интерпретируются как имена переменных. Поскольку существует отдельное пространство имен для функций и переменных, ifможет быть локальной переменной. Однако в Common Lisp есть два специальных символа, которые не входят в пакет ключевых слов: символы tи nil. При оценке как выражения они оцениваются в себя. Их нельзя использовать в качестве имен функций или переменных, поэтому они фактически зарезервированы. (let ((t 42)))— это правильно сформированное выражение, но letоператор не разрешит его использование.

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

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

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

В разных языках число зарезервированных слов часто сильно различается. Например, в COBOL их около 400. В Java и других производных от C их довольно мало, около 50. В Pure Prolog и PL/I их нет.

Недостатки

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

Поскольку зарезервированные слова не могут использоваться в качестве идентификаторов, пользователи могут выбирать преднамеренные ошибки в написании зарезервированных слов в качестве идентификаторов, например, clazzдля переменных Java типа Class. [17]

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

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

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

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

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

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

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

// Использование этого класса в C#:@this x = new @this (); // Будет скомпилировано!     

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

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

Ссылки

  1. ^ Спецификация C99, 7.1.3 Зарезервированные идентификаторы
  2. ^ Спецификация C++03, 17.4.3.2.1 Глобальные имена [lib.global.names]
  3. ^ Джексон, Марк (26 сентября 2002 г.). «Как произносится «__» (двойное подчеркивание)?». python-list (список рассылки) . Получено 9 ноября 2014 г.
  4. ^ Хохберг, Тим (26 сентября 2002 г.). «Как произносится «__» (двойное подчеркивание)?». python-list (список рассылки) . Получено 9 ноября 2014 г.
  5. ^ "DunderAlias ​​- Python Wiki". wiki.python.org .
  6. ^ Notz, Pat (26 сентября 2002 г.). «Как произносится «__» (двойное подчеркивание)?». python-list (список рассылки) . Получено 9 ноября 2014 г.
  7. ^ "Идентификатор ошибки: JDK-4211070 Java должна поддерживать константные параметры (как C++) для поддержки кода [sic]". Bugs.sun.com . Получено 2014-11-04 .
  8. ^ "Лексическая грамматика - JavaScript | MDN". developer.mozilla.org . 8 ноября 2023 г.
  9. ^ Спецификация C99, 7.1.3 Зарезервированные идентификаторы: «Все идентификаторы, начинающиеся с подчеркивания и либо заглавной буквы, либо другого подчеркивания, всегда зарезервированы для любого использования».
  10. ^ C11: Новый стандарт языка C, Томас Плам, «Заметка о ключевых словах»
  11. ^ «История None, True и False (и объяснение литералов, ключевых слов и встроенных функций)», История Python, 10 ноября 2013 г., Гвидо ван Россум
  12. ^ "Спецификация языка Java, 3-е издание, раздел 3.9: Ключевые слова". Sun Microsystems . 2000 . Получено 17 июня 2009 г. Следующие последовательности символов, образованные из букв 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. ^ "CLHS: Раздел 11.1.2.1.2". www.lispworks.com .
  17. ^ Заметти, Фрэнк (2007). Практический JavaScript, сценарии DOM и проекты Ajax. Апресс . ISBN 9781430201977.