Резервисана реч
У рачунарском језику, резервисана реч (такође позната као резервисани идентификатор) је реч која не може да се користи као идентификатор, на пример то су име променљиве, функције, или лабеле - они су "резервисани из употребе". Ово је синтаксичка дефиниција, а резервисана реч можда нема никаквог смисла.
Појам који је уско повезан и појам са којим се често меша је кључна реч која је реч са посебним значењем у одређеном контексту. Ово је семантичка дефиниција. Насупрот томе, имена у стандардној библиотеци која нису уграђена у језику се не сматрају резервисаним речима или кључним речима. Изрази "резервисана реч" и "кључна реч" често се користе као синоними - може се рећи да је резервисана реч "резервисана за употребу као кључна реч" - и формална примена варира од језика до језика; за овај чланак ми је разликујемо као што је горе наведено.
У принципу резервисане речи и кључне речи не морају да се поклапају, и у већини модерних језика кључне речи су одвојене од резервисаних речи, то чини граматичко рашчлањавање лакшим, и од тада је кључне речи не могуће мешати са идентификаторима. У неким језицима, као што су С или Пајтон, резервисане речи и кључне речи се поклапају, док у другим језицима, као у Јави, све кључне речи су резервисане речи, али неке резервисане речи нису кључне речи - оне су "резервисане за будућу употребу". У осталим језицима, као што су Алгол и PL/I постоје кључне речи али не и резервисане речи, и кључне речи се разликују од идентификатора по другим значењима.
Разлика
[уреди | уреди извор]Сетови резервисаних речи и кључних речи у језику често се поклапају или су скоро једнаки, а разлика је суптилна, тако да се ови термини често користе као синоними. Међутим, у пажљивој употреби се разликују.
Претварање кључних речи у резервисане речи чини лексичку анализу лакшом, тако ће низ знакова бити недвосмислено или кључна реч или идентификатор, без контексне зависности; тако су кључне речи обично подскупови резервисаних речи. Међутим, резервисане речи не морају бити кључне речи - на пример, у Јави, goto је резервисана реч, али она нема значење и не појављује се у било ком производном правилу у граматици. То се обично ради за наредну компатибилност, тако да резервисана реч може постати кључна реч у будућој верзији без разбијања постојећег програма.
Супротно томе, кључне речи не морају бити резервисане речи, са њиховом улогом која је разумљива из контекста, или се могу издвојити на други начин, као нпр. стропирањем. На пример, фраза if = 1
је недвосмислена у већини граматика, јер контролна изјаве if члана не може почети са =
, и ово је дозвољено у неким језицима, нпр у ФОРТРАНУ. Алтернативно, у АЛГОЛ 68, кључне речи морају бити стропиране - обележене на неки истакнути начин - у строгом језику наводећи их подебљаним словима, и према томе оне нису резервисане речи. Тако је у строгом језику следећи израз легалан, подебљана кључна реч if није у супротности са обичним идентификатором if
:
- if if eq 0 then 1 fi
Међутим, у Алгол 68 постоји стропирани режим у коме су кључне речи резервисане речи, то је пример како се ови различити концепти често поклапају; ово је праћено у многим модерним језицима.
Syntax
[уреди | уреди извор]Резервисана реч је она која "изгледа као" нормална реч, али јој није дозвољено да се користи као нормална реч. Формално то значи да задовољава уобичајене лексичке синтаксе (синтаксе речи) идентификатора - пример је, низ слова - али он се не може користити тамо где су идентификатори коришћени. На пример, реч 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
, за инстанцу.
Резервисани опсег
[уреди | уреди извор]Осим резервисаних специфичних листа речи, неки језици резервишу целе опсеге речи, користе их као приватне просторе за будуће верзије језика, различите дијалекте, компилаторе продаваце-специфична проширења, или за интерну употребу од стране компилатора, посебно у комадању имена.
Ово се најчешће врши помоћу префикса, обично једне или више доњих црта. С и C++ су познати у том смислу: С99 резервише идентификаторе које почињу са две доње црте или када је доња црта праћена великим словом, и касније резервише идентификаторе који почињу са једном доњом цртом (у редовним и означеним просторима) за употребу у оквиру фајлова;[1] са C++ 03 даље резервише идентификаторе који садрже двоструке црте било где[2]- што омогућава коришћење двоструке доње црте као сепаратора (за повезивање корисничких идентификатора), на пример.
Честа употреба двоструких доњих црта у унутрашњим идентификаторима у Пајтону довела је до скраћенице dunder; ово је направио Mark Jackson Архивирано на сајту Wayback Machine (22. јануар 2004)[3] и независно Tim Hochberg,[4] у размаку од неколико минута, обојица као одговор на исто питање у 2002. години.[5][6]
Појединости
[уреди | уреди извор]Листе резервисаних речи и кључних речи у језику су дефинисане када је развијен језик, и обе форме су саставни део формалне спецификације језика. Генерално жеља је да се смањи број резервисаних речи, да би се избегло ограничење валидних имена идентификатора. Даље, увођењем нових резервисаних речи разбијају се постојећи програми који користе ту реч (то није компатибилно), тако да се то избегава. Да бисте спречили ово и пружили будућу компатибилност, понекад су речи резервисане без текуће употребе (резервисана реч која није кључна реч), јер то омогућава да се реч користи у будућности без разбијања постојећих програма. Алтернативно, нове карактеристике језика могу се спровести као предефинисане, што се може превазићи, стога не разбијајте постојеће програме.
Разлози за флексибилност су ти да се продавцу копилатора да могућност да прошири спецификацију укључујући и не-стандардне карактеристике, различите стандардне језичке дијалекте, или да у будуће верзије језика укључи додатне функције. На пример, процедурални језик може предвидети додавање објектно оријентисаних могућности у будућу верзију или неки дијалект, у коме би се могле додати кључне речи као class
или object
. Да би се прилагодили овој могућности, садашња спецификација ће можда направити ове резервисане речи, чак и ако се оне тренутно не користе.
Значајан пример је Јава, где су const
и goto
резервисане речи - оне немају значење у Јави, и оне се такође не могу користити као идентификатори. По резервисању термина, они се могу реализовати у будућим верзијама Јаве, ако се то буду желело, без разбијања старијег Јавиног изворног кода. На пример, постојао је предлог 1999. године да се дода C++-као const
на језику, што је било могуће помоћу const
речи, од тада је резервисана али није до сада коришћена; Међутим, овај предлог је одбијен - иако додавање ове функције не би сломило извшење програма, коришћење у стандардној библиотеци (посебно у колекцијама) би сломило компатибилност.[7] Јаваскрипт такође садржи велики број резервисаних речи без посебне функционалности; тачан списак варира у зависности од верзије и мода.[8]
Сви идентификатори који почињу са доњом цртом или било великим словом или другом доњом цртом су увек резервисани за сваку употребу. Сви идентификатори који почињу са доњом цртом су увек резервисане за употребу као идентификатори са обимом датотеке у редовним и означеним просторима.
Језици се значајно разликују у томе колико често уводе нове резервисане речи или кључне речи и како их називају, уз то неки језици су врло конзервативни и уводе нове речи ретко или никада, како би избегли разбијање постојећег програма, док други језици уведе нове кључне речи слободније, захтевајући од постојећих програма да промене постојеће идентификаторе који праве проблем. Студија случаја је дата новим кључним речима у С11 у поређењу са C++11, оба из 2011. године - ово подсећа на С и C++, идентификатори који почињу са доњом цртом и затим великим словом су резервисани:[9]
C одбор не преферира да ствара нове кључне речи у простору корисничког имена, као што се обично очекује да свака ревизија С избегне разбијање старијег С програма. Поређења ради, C++ одбор (WG21) преферира да ствара нове кључне речи нормалног изгледа као и старе кључне речи. На пример, C++ 11 дефинише нову thread_local кључну реч да одреди статичка складишта у један низ. С11 дефинише нову кључну реч као _Thread_local. У новом С11 заглављу <threads.h>, постоји макро дефиниција која обезбеђује нормалан изглед имена:[10]
- #дефинисати thread_local _Thread_local
То је, С11 је представио кључну реч _Thread_local
у оквиру постојећег сета резервисаних речи (оних са одређеним префиксом), и затим користе посебан објекат (макро обраду) како би се омогућило његово коришћење као да је нова кључна реч без префикса, док C++ 11 уводи кључну реч thread_local
и упркос томе што ово није постојећа резервисана реч, разбија све програме који је користе, али без потребе макро обраде.
Предефинисана имена
[уреди | уреди извор]Сродани појмови за резервисане речи су унапред дефинисана функција, методе, подпрограми, или променљиве, а посебно библиотека рутине из стандардне библиотеке. Они су слични по томе што су део основног језика, а могу се користити за сличне сврхе. Међутим, они се разликују по томе што је назив претходно дефинисане функције, метода или потпрограма обично категорисан као идентификатор уместо као резервисана реч, а није посебно третиран у синтаксичкој анализи. Даље, резервисане речи не могу бити предефинисане од стране програмера, али речи које су унапред дефинисане се често могу занемарити у неком својству.
Језици се разликују шта је означено као кључна реч и шта као унапред дефинисана реч. Неки језици, на пример, означавају кључне речи за улазне / излазне операције док је у другим језицима то библиотека рутине. У Пајтону (у верзијама старијим од 3.0) и многим Бејсик дијалектима, print
је кључна реч. Насупрот томе, у С, Lisp, Пајтон 3.0 еквиваленти printf
, format
, и print
су функције у стандардној библиотеци. Слично томе, у Пајтону до 3.0, None
, True
, и False
су унапред дефинисане променљиве, али нису резервисане речи, али у Пајтону 3.0 оне су претводене у резервисане речи.[11]
Дефиниција
[уреди | уреди извор]Неки користе термине "кључна реч" и "резервисана реч" наизменично, док други праве разлику у коришћењу, рецимо "кључном речју" се означава реч која је специјална само у тренутном контексту, а "резервисаном речју" се означавају специјалне речи које се не могу користити као имена од стране корисника. Значење кључних речи — и, заиста, значење појма кључна реч — широко се разликују од језика до језика. Конкретно, у Алголу 68, кључне речи су стропиране (у строгом језику, написане подебљаним словима) и нису резервисане речи - стропирана реч се може користити као обичан идентификатор.
"Спецификација програмског језика Јава" користи термин "кључна реч".[12] И ISO 9899 standard за С програмски језик користи израз "кључна реч".[13]
У многим језицима, као у С и сличним окружењима као C++, кључна реч је резервисана реч која идентификује синтаксну форму. Речи коришћене у структури контроле тока, као if, then
, и else
су кључне речи. У овим језицима, кључне речи не могу бити имена променљивих и функција.
У неким језицима, као што су Алгол и Алгол 68, кључне речи се не могу писати дословно, али се морају стропирати. То значи да кључне речи морају бити обележене некако. На пример. цитирајући их или им додати посебан карактер као префикс. Последица тога је да кључне речи нису резервисане речи, па се иста реч може користити као нормалан идентификатор. Међутим, један режим стропирања је био да се уместо стропирања кључне речи, оне једноставно претворе у резервисане речи.
Неки језици, као што су PostScript, су изузетно либерални у овом приступу, дозвољавајући да се срж кључне речи редефинише за посебне намене.
У Common Lisp, термин "кључну реч" (или "симбол кључне речи") се користи за посебну врсту симбола, или идентификатора. За разлику од других симбола, који обично стоје уз променљиве или функције, кључне речи су само-цитирајуће и само-оцењивајуће:[14]:98 и уграђене су у пакет КЉУЧНИХ РЕЧИ.[15] Кључне речи се обично користе за обележавање именованих аргумената функције, и за приказивање симболичке вредности. Симболи који дају имена функцијама, променљим, посебним облицима и макро речима у пакету под називом COMMON-LISP су основне резервисане речи. Ефекат који их поново дефинише је недефинисан у ANSI Common Lisp.[16] Њихово прављење је могуће. На пример израз (if if case or)
је могућ, када је if
локална променљива. Скроз лево if
се односи на if
оператор; преостали симболи се тумаче као имена променљивих. Од када постоји посебан простор за имена функција и променљих, if
би могао да буде локална променљива. У Common Lisp, међутим, постоје два специјална симбола која нису у пакету кључних речи:: симболи t
и nil
. Када су оцењени као изрази, они оцењују сами себе. Они не могу да се користе као имена функције или променљивих, тако су де факто резервисане речи. (let ((t 42)))
је добро формирани израз, али let
оператор неће бити дозвољен за употребу.
Типично, када програмер покушава да користи кључну реч за име променљиве или функције, компилацијска грешка ће се активирати. У већини модерних уредника, кључне речи су аутоматски подешене да имају посебну боју текста да подсете или информишу програмере да су то кључне речи.
У језицима са макро или лењим проценама, конструкције контроле тока као if
могу бити реализоване као макро или функције. У језицима без ових изражајних карактеристика, они су углавном кључне речи.
Поређење по језику
[уреди | уреди извор]Немају сви језици исти број резервисаних речи. На пример, Јава (и остали деривати С-а) има прилично ретку допуну резервисаних речи — око 50 — а COBOL има око 400. А на другом крају спектра, Prolog и PL/I немају ни једну.
Број резервисаних речи у језику нема много везе са тим колико је "моћан" језик. COBOL је дизајниран педесетих година, као пословни језик и био направљен да буде само-документујући програм који користи Енглески-односно структурне елементе као што су глаголи, чланови, реченице, сектори и области. С у другу руку, је написан да буде веома кратак (синтаксички), а да добија више текста на екрану. На пример, упоређујући еквивалентне блокове кода из С и COBOL за израчунавање недељних зарада:
// Calculation in C:
if (salaried)
amount = 40 * payrate;
else
amount = hours * payrate;
*> Calculation in COBOL:
IF Salaried THEN
MULTIPLY Payrate BY 40 GIVING Amount
ELSE
MULTIPLY Payrate BY Hours GIVING Amount
END-IF.
*> Other example of calculation in COBOL:
IF Salaried
COMPUTE Amount = Payrate * 40
ELSE
COMPUTE Amount = hours * payrate
END-IF.
Чиста Prolog-ова логика се изражава у смислу односа, а извршење се активира покретањем упита преко тих односа. Конструкти као што су петље се примењују користећи рекурзивне везе.
Сва три језика могу да реше исте врсте "проблема", иако имају различити број резервисаних речи. Ова "моћ" се односи на то што припадају програмским језицима који су потпуни по Тјурингу.
Недостаци
[уреди | уреди извор]Дефиниција резервисаних речи у језику ствара проблеме. Језик може бити тежак за учење новим корисницима због дуге листе резервисаних речи које треба да запамте и која се не смеју користити као идентификаторе. Продужавање језика може бити тешко због тога што додатак резервисаних речи за нове функције може поништити постојеће програме или, обрнуто, "преоптерећење" постојећих резервисаних речи са новим значењима може да буде збуњујуће. Портирање може бити проблематично јер реч није резервисана за један систем / компајлер може бити резервисан од другог.
Резервисане речи и независност језика
[уреди | уреди извор]Спецификација Општа језичка инфраструктура Microsoft’s .NET дозвољава да се код напише у више од 40 различитих програмских језика који се заједно комбинују у финални производ. Због тога, може доћи до судара идентификатора / резервисаних при покушају да се реализује код у неком језику, а да је претходно написсан у другом. На пример, библиотека Visual Basic.NET може садржи дефиницију класа као што су:
' Class Definition of This in Visual Basic.NET:
Public Class this
' This class does something...
End Class
Ако је ово компиловано и дистрибуирано као део кутије са алатима, C# програмер, који жели да дефинише променљиву типа “this
” би наишао на проблем: 'this'
је резервисана реч у С #. Дакле, следеће неће бити компиловано у С #:
// Using This Class in C#:
this x = new this(); // Won't compile!
Сличан проблем се јавља када се приступа члановима, заобилажењем виртуелне методе, и идентификовањем именског простора.
То се решава стропингом. Да би се решио овај проблем, спецификација дозвољава програмеру да (у С #) постави @-знак идентификатору који је форсиран да буде идентификатор пре него резервисана реч компајлера:
// Using This Class in C#:
@this x = new @this(); // Will compile!
Због доследности, та употреба је такође дозвољена у не-јавним поставкама као што су локалне променљиве, имена параметара и приватни чланови.
Види још
[уреди | уреди извор]Референце
[уреди | уреди извор]- ^ C99 specification, 7.1.3 Reserved identifiers
- ^ C++03 specification, 17.4.3.2.1 Global names [lib.global.names]
- ^ Jackson, Mark (Sep 26, 2002).
- ^ Hochberg, Tim (Sep 26, 2002).
- ^ Dunder (Double UNDERscore) Alias
- ^ Notz, Pat (Sep 26, 2002).
- ^ "Bug ID: JDK-4211070 Java should support const parameters (like C++) for code maintainence [sic]" Архивирано на сајту Wayback Machine (3. новембар 2014).
- ^ Lexical grammar: Keywords
- ^ 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:The New C Standard, Thomas Plum, "A Note on Keywords"
- ^ "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
- ^ "The Java Language Specification, 3rd Edition, Section 3.9: Keywords".
- ^ "ISO/IEC 9899:TC3, Section 6.4.1: Keywords" (PDF).
- ^ Norvig, Peter (1991). Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp. Morgan Kaufmann. ISBN 978-1-55860-191-8., Web
- ^ Type KEYWORD from the Common Lisp HyperSpec
- ^ "Constraints on the COMMON-LISP Package for Conforming Programs".