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

Слово в языке программирования, которое не может быть использовано в качестве идентификатора

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

В императивном языке программирования и во многих объектно-ориентированных языках программирования , помимо присваиваний и вызовов подпрограмм, ключевые слова часто используются для идентификации конкретного оператора , например, if , while , do , for и т. д. Многие языки рассматривают ключевые слова как зарезервированные слова, включая Ada , C, C++ , COBOL , Java и Pascal . Количество зарезервированных слов сильно различается от языка к языку: в C их около 30, а в COBOL — около 400.

Обратите внимание, что в некоторых языках нет зарезервированных слов. Fortran и PL/I идентифицируют ключевые слова по контексту, в то время как Algol 60 и Algol 68 обычно используют стропинг, чтобы отличать ключевые слова от идентификаторов, определенных программистом.

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

Различие

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

Могут быть зарезервированные слова, которые не являются ключевыми словами. Например, в Java true и falseявляются зарезервированными словами, используемыми как булевы (логические) литералы. Другой пример, в Pascal divи modявляются зарезервированными словами, используемыми как операторы (целочисленное деление и остаток).

Также могут быть зарезервированные слова, которые не имеют определенного значения. Например, в Java gotoи constперечислены как зарезервированные слова, но не упоминаются иным образом в правилах синтаксиса Java.

Ключевое слово, такое как if или while, используется во время синтаксического анализа для определения того, какой тип утверждения рассматривается. Такой анализ намного проще, если ключевые слова зарезервированы или стропированы. Рассмотрим сложность использования контекстного анализа в Fortran 77 для различения:

  • IF (B) l1,l2  ! two-way branch, where B is a boolean/logical expression
  • IF (N) l1,l2,l3  ! three-way branch, where N is a numeric expression
  • IF (B) THEN  ! start conditional block
  • IF (B) THEN = 3.1 ! conditional assignment to variable THEN
  • IF (B) X = 10  ! single conditional statement
  • IF (B) GOTO l4  ! conditional jump
  • IF (N) = 2  ! assignment to a subscripted variable named IF

PL/I также допускает некоторые, на первый взгляд, запутанные конструкции:

  • IF IF = THEN THEN ... (второе IFи первое THEN— переменные).

Преимущества

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

Для IDE проще выделить ключевые слова, не проводя контекстный анализ, чтобы определить, какие слова на самом деле являются ключевыми (см. примеры Fortran в предыдущем разделе).

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

Недостатки

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

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

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

Дальнейшее бронирование

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

Чаще всего это делается с помощью префикса, часто одного или нескольких подчеркиваний . 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++-like, что было возможно с использованием 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несмотря на то, что оно не было существующим зарезервированным словом, нарушая работу любых программ, которые его использовали, но не требуя обработки макросов.

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

Спецификация 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, Томас Плам, «Заметка о ключевых словах»
Взято с "https://en.wikipedia.org/w/index.php?title=Зарезервированное_слово&oldid=1269888451"