Jump to content

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

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

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

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

Различие

[ редактировать ]

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

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

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

если если уравнение 0, то 1 fi

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

Синтаксис

[ редактировать ]

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

Ключевые слова имеют различное использование, но в основном делятся на несколько классов: часть грамматики фраз (в частности, правило производства с нетерминальными символами ) с различными значениями, часто используемыми для потока управления , например слово if в большинстве процедурных языков обозначает условное выражение и принимает предложения (нетерминальные символы); имена примитивных типов в языке, поддерживающем систему типов , например int; примитивные буквальные значения, такие как true для логического значения 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 году было предложение добавить 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 <threads.h> есть определение макроса, обеспечивающее нормальное имя: [10]

#define thread_local _Thread_local

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

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

[ редактировать ]

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

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

Определение

[ редактировать ]

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

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

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

В некоторых языках, таких как АЛГОЛ и АЛГОЛ 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. В чистом Prolog и PL/I их нет.

Недостатки

[ редактировать ]

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

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

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

[ редактировать ]

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

' Class Definition of This in Visual Basic.NET:

Public Class this
        ' This class does something...
End Class

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

// Using This Class in C#:

this x = new this();  // Won't compile!

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

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

// Using This Class in C#:

@this x = new @this();  // Will compile!

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

См. также

[ редактировать ]
  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. ^ Нотц, Пэт (26 сентября 2002 г.). «Как вы произносите «__» (двойное подчеркивание)?» . python-list (список рассылки) . Проверено 9 ноября 2014 г.
  7. ^ «Идентификатор ошибки: JDK-4211070 Java должна поддерживать константные параметры (например, C++) для поддержки кода [ sic . Bugs.sun.com . Проверено 4 ноября 2014 г.
  8. ^ «Лексическая грамматика — JavaScript | MDN» . http://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: Ключевые слова» . Сан Микросистемс . 2000 . Проверено 17 июня 2009 г. Следующие последовательности символов, образованные из букв ASCII, зарезервированы для использования в качестве ключевых слов и не могут использоваться в качестве идентификаторов[...]
  13. ^ «ISO/IEC 9899:TC3, раздел 6.4.1: Ключевые слова» (PDF) . Международная организация по стандартизации JTC1/SC22/WG14. 07.09.2007. Вышеупомянутые токены (с учетом регистра) зарезервированы (на этапах трансляции 7 и 8) для использования в качестве ключевых слов и не должны использоваться иначе.
  14. ^ Питер Норвиг : Парадигмы программирования искусственного интеллекта: тематические исследования в Common Lisp , Морган Кауфманн, 1991, ISBN   1-55860-191-0 , Интернет
  15. ^ Введите KEYWORD из HyperSpec Common Lisp.
  16. ^ «CLHS: Раздел 11.1.2.1.2» . www.lispworks.com .
  17. ^ Заметти, Фрэнк (2007). Практический JavaScript, сценарии DOM и проекты Ajax . После ISBN  9781430201977 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a0e98e460dfb348a2618e420f141765c__1702333620
URL1:https://arc.ask3.ru/arc/aa/a0/5c/a0e98e460dfb348a2618e420f141765c.html
Заголовок, (Title) документа по адресу, URL1:
Reserved word - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)