На комп'ютерній мові зарезервоване слово (також відоме як зарезервований ідентифікатор) — це слово, яке не може використовуватися як ідентифікатор, наприклад, назва змінної, функції або мітки — воно «зарезервоване від використання». Це визначене синтаксисом слово і воно може зовсім не мати значення.

Доволі близькими є поняття «зарезервоване слово» та «ключове слово». Ці слова мають спеціальне значення в окремих випадках. Це визначено семантикою. Але імена в стандартній бібліотеці, які не є вбудованими в мову не вважаються зарезервованими чи ключовими словами. Терміни «зарезервоване слово» та «ключове слово» часто використовують як взаємнозамінні. Про зарезервовані слова можна сказати, що вони «зарезервовані для використання як ключові слова», а формальне використання змінюється залежно від мови.

В основному зарезервовані та ключові слова не повинні збігатися, але в найновіших мовах ключові слова є підмножиною зарезервованих, це робить парсинг простішим так як не можливо сплутати ключові слова з ідентифікаторами. В деяких мовах, таких як, С чи Python, зарезервовані та ключові слова збігаються, коли в інших мовах, як Java, всі ключові слова є зарезервованими, але деякі зарезервовані слова не є ключовими, вони є «зарезервованими для майбутнього використання». В старіших мовах, ALGOL, FORTRAN, і PL/I, є ключові слова, але немає зарезервованих, ключові слова відрізнялися від ідентифікаторів в інший спосіб. Це робить парсинг більш складним.

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

Якщо зробити ключові слова зарезервованими, то це полегшує лексичний аналіз. Тому що можна однозначно визначити чим є рядок символів, ключовим словом чи ідентифікатором. Саме тому ключові слова зазвичай є зарезервованими. Однак зарезервовані слова не повинні бути ключовими. Як приклад в мові Java є зарезервоване слово goto, але воно не має ніякого значення і воно не зустрічається в жодних правилах створення граматик. Це зроблено для : у майбутніх версіях зарезервовані слова можуть стати ключовими, і це не вимагатиме змін у вже наявних програмах.

З іншого боку ключові слова не повинні бути зарезервованими, їх роль зрозуміла з контексту, або вони мають розрізнятись у інший спосіб, такий, як . Наприклад вираз if = 1 є однозначним у більшості граматик, оскільки умова в операторі if не може починатися зі знака =, тому такі вирази дозволені у деяких мовах, зокрема у FORTRAN. В ALGOL 68 ключові слова мають бути певним чином позначені — в суворій мові вони позначаються жирним шрифтом, і таким чином вони не є зарезервованими. Отже, наступний вираз є правильним, ключове слово if яке виділене жирним шрифтом не буде конфліктувати зі звичайним ідентифікатором if

if if eq 0 then 1 fi

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

Синтаксис

Зарезервоване слово — це слово, яке «виглядає як» звичайне слово, але не може використовуватися як звичайне слово. Формально це означає, що воно задовольняє звичайний синтаксис (синтаксис слів) ідентифікаторів — наприклад, це послідовність букв — але не може використовуватися там, де використовуються ідентифікатори. Наприклад, слово 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 може бути ключовим словом, що представляє логічне значення «true», у цьому випадку він повинен з'являтися в граматиці як можливе розширення BinaryExpression, наприклад.

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

Найчастіше це робиться за допомогою префікса, часто одного або декількох символів підкреслення. В C і C++ використовується ця можливість: C99 резервує ідентифікатори, які починаються з двох підкреслень або підкреслення, за якими йде літера верхнього регістру, і додатково зберігає ідентифікатори, які починаються з одного підкреслення (у звичайному і теговому просторах) для використання в файлу;C99 specification, 7.1.3 Reserved identifiers C ++ 03 додатково зберігає ідентифікатори, які містять подвійне підкреслення в будь-якому місціC++03 specification, 17.4.3.2.1 Global names [lib.global.names] — це дозволяє, наприклад, використовувати подвійне підкреслення як роздільник (для підключення ідентифікаторів користувача).

Часте використання подвійних підкреслень у внутрішніх ідентифікаторах в Python дало початок абревіатурі dunder; що була придумана Марком Джексоном і незалежно Тімом Гохбергом, як відповідь на те ж питання в 2002 роціDunder (Double UNDERscore) Alias, вони запропонували з різницею в декілька хвилин.

Специфікація Список зарезервованих слів і ключових слів в мові визначається, коли мова розробляється, і обидва складають частину формальної специфікації мови. Зазвичай потрібно мінімізувати кількість зарезервованих слів, щоб уникнути обмеження дійсних імен ідентифікаторів. Крім того, введення нових зарезервованих слів ламає існуючі програми, які використовують це слово (вони не мають зворотньої сумісності). Щоб запобігти цьому і забезпечити , іноді резервують слова, які не використовують в даний момент (зарезервоване слово, яке не є ключовим словом), оскільки це дозволяє використовувати слово в майбутньому без порушення роботи вже створених програм. Або, нові функції мови можуть бути реалізовані як попередньо визначені, які можна перевизначити, таким чином не порушуючи роботу програм створених раніше.

Гнучкість також дає можливість розробникам компіляторів розширити специфікацію, включивши нестандартні функції, або створити різні стандарти мови, щоб розширити її, для майбутніх версій мови, або щоб додати нові функції. Наприклад, процедурна мова може передбачати додавання об'єктно-орієнтованих можливостей у майбутній версії або в якомусь іншому стандарті мови, після чого можна додати ключові слова, такі як class або object. Щоб задовольнити цю можливість, поточна специфікація може зарезервувати ці слова, навіть якщо вони в даний час не використовуються.

Показовим прикладом є Java, де const та goto є зарезервованими словами — вони не мають значення в Java, але вони також не можуть використовуватися як ідентифікатори. Якщо зарезервувати терміни, то вони можуть бути реалізовані в майбутніх версіях Java, за бажанням, без порушення старого вихідного коду Java. Наприклад, у 1999 році було запропоновано додати const до мови Java, оскільки воно була зарезервованим, але наразі не використовується; Однак ця пропозиція була відхилена — зокрема, тому, що навіть незважаючи на додавання функції робота існуючих програм не буде порушеною, використовуючи const в стандартній бібліотеці (а зокрема, в колекціях) буде порушуватись сумісність. JavaScript також містить ряд зарезервованих слів без особливої функціональності; точний список залежить від версії та режиму.

Мови істотно відрізняються тим, як часто вони запроваджують нові зарезервовані слова або ключові слова, і як вони називають їх, деякі мови дуже консервативні та вводять нові ключові слова рідко або навіть ніколи, щоб уникнути порушення існуючих програм, тоді як інші мови запроваджують нові ключові слова більш вільно, вимагаючи змінювати існуючі програми а саме змінювати ідентифікатори які конфліктують. Створили певні правила для додавання нових ключових слів в C11 порівняно з C++ 11, обидва з 2011 р. — нагадуємо, що в C і C++ ідентифікатори, які починаються з підкреслення, за яким йде літера верхнього регістру є зарезервованими:C99 specification, 7.1.3 Reserved identifiers: «All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.»

Тобто, 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 це зарезервовані слова.«The story of None, True and False (and an explanation of literals, keywords and builtins thrown in) », The History of Python, November 10, 2013, Guido van Rossum

Визначення