Кіріспе
Бағдарламалау тілінде идентификатор ретінде қолданылмаған сөз. Компьютерлік тілде сақталған сөз (немесе сақталған идентификатор) – идентификатор ретінде қолданылмаған сөз, мысалы, айнымалының, функцияның немесе белгінің атауы – ол "қолданудан сақталған". Бұл синтаксистік анықтама, және сақталған сөздің пайдаланушы анықтаған мағынасы болмауы мүмкін. Тығыз байланысты және көбінесе шатастырылатын түсінік – кілт сөз, ол белгілі бір контексте арнайы мағынасы бар сөз. Бұл семантикалық анықтама. Стандартты кітапханадағы, бірақ тілге енгізілмеген атаулар сақталған сөздер немесе кілт сөздер деп есептелмейді. "Сақталған сөз" және "кілт сөз" терминдері көбінесе бір-бірінің орнына қолданылады – кейде сақталған сөз "кілт сөз ретінде қолдануға сақталған" делінеді – және ресми қолданылуы тілден тілге өзгереді. Осы мақалада жоғарыда көрсетілгендей ажыратамыз. Жалпы, сақталған сөздер мен кілт сөздер міндетті түрде сәйкес келуі керек емес, бірақ көптеген қазіргі заманғы тілдерде кілт сөздер сақталған сөздердің ішкі жиыны болып табылады, себебі бұл синтаксистік талдауды жеңілдетеді, өйткені кілт сөздерді идентификаторлармен шатастыруға болмайды. Кейбір тілдерде, мысалы C немесе Python, сақталған сөздер мен кілт сөздер сәйкес келеді, ал басқа тілдерде, мысалы Java, барлық кілт сөздер сақталған сөздер, бірақ кейбір сақталған сөздер кілт сөздер емес, олар болашаққа сақталады. Тағы да басқа тілдерде, мысалы, ескі ALGOL, FORTRAN және PL/I тілдерінде кілт сөздер бар, бірақ сақталған сөздер жоқ, кілт сөздер идентификаторлардан басқа тәсілдермен ажыратылады.
In a computer language, a reserved word (also known as a reserved identifier) is a word that cannot be used as an identifier, such as the name of a variable, function, or label – it is "reserved from use". This is a syntactic definition, and a reserved word may have no user defined meaning. A closely related and often conflated notion is a keyword, which is a word with special meaning in a particular context. This is a semantic definition. By contrast, names in a standard library but not built into a language are not considered reserved words or keywords. The terms "reserved word" and "keyword" are often used interchangeably – one may say that a reserved word is "reserved for use as a keyword" – and formal use varies from language to language. For this article, we distinguish as above. In general reserved words and keywords need not coincide, but in most modern languages keywords are a subset of reserved words, as this makes parsing easier, since keywords cannot be confused with identifiers. In some languages, like C or Python, reserved words and keywords coincide, while in other languages, like Java, all keywords are reserved words, but some reserved words are not keywords, being reserved for future use. In yet other languages, such as the older languages ALGOL, FORTRAN, and PL/I, there are keywords but no reserved words, with keywords being distinguished from identifiers by other means.
Синтаксисі
Сақталған сөз – бұл қалыпты сөз сияқты көрінетін, бірақ қалыпты сөз ретінде қолдануға рұқсат етілмейтін сөз. Формальды түрде, ол идентификаторлардың әдеттегі лексикалық синтаксисін (сөздердің синтаксисін) қанағаттандырады, мысалы, әріптердің тізбегі болуы, бірақ идентификаторлар қолданылатын жерде қолданылмайды. Мысалы, `if` сөзі көбінесе сақталған сөз болып табылады, ал `x` көбінесе сақталмайды, сондықтан `x = 1` жарамды тапсырма, бірақ `if = 1` жарамсыз. Кілт сөздердің әртүрлі қолданыстары бар, бірақ негізінен бірнеше санатқа бөлінеді: фраза грамматикасының бөлігі (әсіресе, терминалды емес символдармен өндіріс ережесі), әртүрлі мағыналары бар, көбінесе басқару ағыны үшін қолданылады, мысалы, көптеген процедуралық тілдердегі `if` сөзі, ол шарттылықты білдіреді және клаузаларды (терминалды емес символдарды) қабылдайды; типтік жүйесі бар тілдегі қарапайым типтердің атаулары, мысалы, `int`; бульдік `true` үшін қарапайым тура мәндер; немесе кейде `exit` сияқты арнайы командалар. Кілт сөздер фразаларда енгізу/шығару үшін де қолданылуы мүмкін, мысалы, `print`. Тілді лексикалық талдаушы мен синтаксистік талдаушының біріктірілуі арқылы талдағанда, ал тілдің синтаксисі сөздер үшін лексикалық грамматика және фразалар үшін контекстсіз грамматика арқылы жасалғанда, осы анықтамалар нақты болады. Бұл қазіргі заманғы тілдерді талдауда кең таралған, және осы жағдайда кілт сөздер сақталған сөздердің ішкі жиыны болып табылады, өйткені оларды сөз деңгейінде идентификаторлардан (осыдан кейін сақталған сөздер) ажырату қажет, фраза деңгейінде синтаксистік тұрғыдан әртүрлі талдау үшін (кілт сөздер ретінде). Осы жағдайда сақталған сөздер лексикалық грамматиканың бөлігі ретінде анықталады және олардың әрқайсысы идентификаторлардан бөлек, жеке тип ретінде токенделеді. Дәстүрлі нотацияда, мысалы, `if` және `then` сақталған сөздері `IF` және `THEN` типтері ретінде токенделеді, ал `x` және `y` екеуі де `Identifier` типі ретінде токенделеді. Кілт сөздер, керісінше, фраза грамматикасында терминалды символдар ретінде пайда болады. Мысалы, шартты өрнектің өндіріс ережесі `IF Expression THEN Expression` болуы мүмкін. Бұл жағдайда `IF` және `THEN` терминалды символдар болып табылады, яғни «сәйкесінше `IF` немесе `THEN` типіндегі токен» – және лексикалық грамматикаға байланысты, бұл бастапқы кодтағы `if` немесе `then` тізбегін білдіреді. Мысалы, қарапайым тұрақты мән ретінде `true` бульдік мәнді білдіретін кілт сөз болуы мүмкін, бұл жағдайда ол грамматикада, мысалы, `BinaryExpression` өндірісінің мүмкін кеңейтілуі ретінде пайда болуы керек.
Сақталған диапазондар
Кейбір тілдер сөздердің нақты тізімдерін ғана емес, сөздердің бүкіл диапазонын болашақ тіл нұсқалары, әртүрлі диалекттер, компиляторға тән кеңейтімдер немесе компилятордың ішкі пайдалануы үшін, әсіресе атауды өзгерту (name mangling) мақсатында жеке кеңістік ретінде резервтейді. Мұндай резервтеу көбінесе префикс қолдану арқылы жасалады, көбінесе бір немесе бірнеше астың сызықтар қолданылады. C және C++ осы жағынан ерекше көзге түседі: C99 екі астың сызығымен басталатын немесе үлкен әріппен жалғастырылатын астың сызығымен басталатын идентификаторларды резервтейді, сондай-ақ файлдық ауқымда пайдалану үшін бір астың сызығымен басталатын идентификаторларды (қалыпты және тегтік кеңістіктерде) қосымша резервтейді; ал C++03 кез келген жерде қос астың сызығы бар идентификаторларды қосымша резервтейді – бұл пайдаланушы идентификаторларын біріктіру үшін қос астың сызықты ажыратқыш ретінде пайдалануға мүмкіндік береді. Python-дағы ішкі идентификаторларда қос астың сызығын жиі қолданудан "dunder" деген қысқарту пайда болды, бұл терминді Марк Джексон мен Тим Хохберг 2002 жылы бір сұраққа жауап ретінде, бір-бірінен бірнеше минут ішінде тәуелсіз түрде ойлап тапты.
Ерекшеліктер
Тілдегі сақталған сөздер мен кілт сөздер тізімі тіл дамытылған кезде анықталады және екеуі де тілдің формальды сипаттамасының бөлігін құрайды. Әдетте, жарамды идентификатор атауларын шектеуден аулақ болу үшін сақталған сөздердің санын азайтуға тырысады. Сонымен қатар, жаңа сақталған сөздерді енгізу сол сөзді пайдаланатын қолданыстағы бағдарламаларды бұзады (ол артқа қарай үйлесімсіз), сондықтан мұндайдан аулақ тұрылады. Бұған жол бермеу және болашаққа қарай үйлесімділікті қамтамасыз ету үшін кейде сөздер қазіргі уақытта қолданылмай сақталады (кілт сөз емес сақталған сөз), бұл болашақта бағдарламаларды бұзбай сол сөзді пайдалануға мүмкіндік береді. Балама ретінде, жаңа тілдік мүмкіндіктер алдын ала анықталғандар ретінде жүзеге асырылуы мүмкін, оларды қайта жазуға болады, осылайша қолданыстағы бағдарламалар бұзылмайды. Икемділіктің себептері құрастырушыларға тілдің стандартты емес мүмкіндіктерін қосу арқылы сипаттаманы кеңейтуге, тілдің әртүрлі стандартты диалекттерін кеңейтуге немесе тілдің болашақ нұсқаларына қосымша мүмкіндіктерді қосуға мүмкіндік беруді қамтиды. Мысалы, процедуралық тіл болашақ нұсқада немесе кейбір диалектте объектіге бағытталған мүмкіндіктерді қосуды күтуі мүмкін, осы кезде класс немесе объект сияқты кілт сөздерді қосуға болады. Бұл мүмкіндікті қамтамасыз ету үшін, қолданыстағы сипаттама осы сөздерді қазіргі уақытта қолданылмаса да сақталған сөздер ретінде белгілеуі мүмкін. Java-да осыған ұқсас мысал бар, онда const және goto сақталған сөздер болып табылады – олардың Java-да мағынасы жоқ, бірақ оларды идентификатор ретінде де пайдалануға болмайды. Осы терминдерді сақтап, қалау болса, Java-ның болашақ нұсқаларында ескі Java кодына зиян келтірмей оларды жүзеге асыруға болады. Мысалы, 1999 жылы C++ сияқты const тілге қосу туралы ұсыныс болды, бұл const сөзін пайдалану арқылы мүмкін болды, өйткені ол сақталған, бірақ қазіргі уақытта қолданылмайды; алайда, бұл ұсыныс қабылданбады – себебі мүмкіндікті қосу ешқандай қолданыстағы бағдарламаларды бұзбаса да, оны стандартты кітапханада (әсіресе жинақтарда) пайдалану үйлесімділікті бұзар еді. JavaScript-те де арнайы функционалдылығы жоқ бірқатар сақталған сөздер бар; нақты тізім нұсқа мен режимге байланысты өзгереді. Тілдер жаңа сақталған сөздерді немесе кілт сөздерді қаншалықты жиі енгізуі және оларды қалай атауы жағынан айтарлықтай ерекшеленеді. Кейбір тілдер өте консервативті болып табылады және қолданыстағы бағдарламаларды бұзудан сақтану үшін жаңа кілт сөздерді сирек немесе ешқашан енгізбейді, ал басқа тілдер жаңа кілт сөздерді еркін енгізеді, бұл қолданыстағы идентификаторларды өзгертуді қажет етеді. C11-дегі жаңа кілт сөздер C++11-мен салыстырғанда 2011 жылы берілген жағдайды зерттеуге болады. C және C++-да астын сызумен басталып, үлкен әріппен жалғасатын идентификаторлар сақталады: яғни C11 Thread local кілт сөзін енгізді, бұл сақталған сөздер жиымында (белгілі бір префиксі бар сөздер) болды, содан кейін оны префиксіз жаңа кілт сөздей пайдалануға мүмкіндік беру үшін жеке механизмді (макро өңдеу) пайдаланды, ал C++11 thread local кілт сөзін енгізді, бұл бұрыннан сақталған сөз болмағандықтан, оны пайдаланған бағдарламаларды бұзды, бірақ макро өңдеуді қажет етпеді.
That is, C11 introduced the keyword Thread local within an existing set of reserved words (those with a certain prefix), and then used a separate facility (macro processing) to allow its use as if it were a new keyword without any prefixing, while C++11 introduce the keyword thread local despite this not being an existing reserved word, breaking any programs that used this, but without requiring macro processing.
Алдын ала белгіленген атаулар
Сақталған сөздерге ұқсас түсінік – стандартты кітапханадан алынған алдын ала анықталған функциялар, әдістер, кіші программалар, типтер немесе айнымалылар. Олар тілдің негізгі бөлігі болып табылады және ұқсас мақсаттарда қолданылуы мүмкін. Дегенмен, олардың арасындағы айырмашылық мынада: мұндай элементтердің атауы көбінесе сақталған сөз емес, идентификатор ретінде жіктеледі және синтаксистік талдау кезінде ерекше қарастырылмайды. Сонымен қатар, сақталған сөздерді бағдарламашы қайта анықтай алмайды, ал алдын ала анықталғандарды белгілі бір ауқымда жаңартуға болады. Тілдерде кілт сөз ретінде не ұсынылатыны және қандай нәрсе алдын ала анықталатыны әртүрлі. Мысалы, кейбір тілдерде кіріс/шығыс операциялары үшін кілт сөздер қарастырылса, ал басқаларында олар кітапханалық функциялар болып табылады. Python-да (3.0 нұсқасына дейін) және көптеген BASIC диалектілерінде `print` кілт сөз болып табылады. Ал C, Lisp және Python 3.0-дағы `printf`, `format` және `print` функциялары стандартты кітапханадағы функциялар болып табылады. Сол сияқты, Python-ның 3.0 нұсқасына дейін `None`, `True` және `False` алдын ала анықталған айнымалылар болды, бірақ сақталған сөздер емес, ал Python 3.0 нұсқасында олар сақталған сөздерге айналдырылды.
Анықтама
Кейбіреулер "кілт сөз" және "қаулы сөз" терминдерін бір-бірін алмастыра қолданады, ал басқалары қолдануды ажыратып, "кілт сөзді" белгілі бір контексттерде ғана ерекше сөзді білдіру үшін, ал "қаулы сөзді" пайдаланушы анықтаған атау ретінде қолданыла алмайтын арнайы сөзді білдіру үшін қолданады. Кілт сөздердің мағынасы және кілт сөз ұғымының мағынасы тілден тілге өте әртүрлі. Нақты айтқанда, ALGOL 68-де кілт сөздер (қатаң тілінде, қалың әріппен жазылған) және сақталған сөздер емес – қалың әріпсіз сөзді қарапайым идентификатор ретінде пайдалануға болады. "Java Language Specification" "кілт сөз" терминін қолданады. C тіліне арналған ISO 9899 стандартында "кілт сөз" термині қолданылады. Көптеген тілдерде, мысалы C және C++ сияқты ұқсас орталарда, кілт сөз – синтаксистік форманы анықтайтын сақталған сөз. Басқару ағыны конструкцияларында қолданылатын if, then және else сияқты сөздер кілт сөздер болып табылады. Бұл тілдерде кілт сөздерді айнымалылар немесе функциялардың атауы ретінде де қолдануға болмайды. Кейбір тілдерде, мысалы ALGOL және ALGOL 68, кілт сөздерді сөзбе-сөз жазуға болмайды, бірақ оларды белгілі бір форматта жазу керек. Бұл дегеніміз, кілт сөздер қандай да бір түрде белгіленуі керек. Мысалы, оларды тырнақшаға алу арқылы немесе арнайы таңбамен алдын ала қою арқылы. Нәтижесінде, кілт сөздер сақталған сөздер емес, сондықтан сол сөзді қалыпты идентификатор ретінде пайдалануға болады. Алайда, бір форматтау тәсілі кілт сөздерді форматтамау және оларды жай ғана сақталған сөздер ретінде қарастыру болды. PostScript сияқты кейбір тілдер бұл тәсілде өте еркін, негізгі кілт сөздерді нақты мақсаттар үшін қайта анықтауға мүмкіндік береді. Common Lisp-те "кілт сөз" (немесе "кілт сөздің символы") термині арнайы символ немесе идентификатор үшін қолданылады. Әдетте айнымалылар немесе функцияларды білдіретін басқа символдардан айырмашылығы, кілт сөздер өздігінен келтіріледі және өзін-өзі бағалайды және KEYWORD пакетіне кіреді. Кілт сөздер әдетте функцияның атын атау үшін және символикалық мәндерді көрсету үшін қолданылады. "COMMON LISP" деп аталатын пакеттегі функциялар, айнымалылар, арнайы нысандар мен макростарды атайтын символдар негізінен сақталған сөздер. Оларды қайта анықтаудың әсері ANSI Common Lisp-те анықталмаған. Оларды байлау мүмкін. Мысалы, егер (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 тілдерінде резервтелген сөздер жоқ.
Кемшіліктер
Тілдегі тоқтау сөздердің анықтамасы қиындықтар тудырады. Жаңа пайдаланушылар үшін тілді үйрену қиын болуы мүмкін, себебі идентификатор ретінде қолдануға болмайтын, көптеген тоқтау сөздерді жаттау қажет. Тілді кеңейту де қиын болуы мүмкін, өйткені жаңа мүмкіндіктер үшін тоқтау сөздерді қосу қазіргі бағдарламаларды қолданудан шығаруы мүмкін, немесе керісінше, жаңа мағыналармен қолданыстағы тоқтау сөздерді "қайта анықтау" шатастыруға себеп болуы мүмкін. Бағдарламаларды басқа жүйеге көшіруде қиындықтар тууы мүмкін, себебі бір жүйе немесе компиляторда тоқтау сөз ретінде сақталмаған сөз, екіншісінде тоқтау сөз болуы мүмкін. Тоқтау сөздерді идентификатор ретінде қолдануға болмайтындықтан, пайдаланушылар Java түріндегі айнымалылар сияқты, тоқтау сөздерді қасақана бұрмалап жазып, идентификатор ретінде қолдануы мүмкін.