Pređi na sadržaj

Rezervisana reč

S Vikipedije, slobodne enciklopedije

U računarskom jeziku, rezervisana reč (takođe poznata kao rezervisani identifikator) je reč koja ne može da se koristi kao identifikator, na primer to su ime promenljive, funkcije, ili labele - oni su "rezervisani iz upotrebe". Ovo je sintaksička definicija, a rezervisana reč možda nema nikakvog smisla.

Pojam koji je usko povezan i pojam sa kojim se često meša je ključna reč koja je reč sa posebnim značenjem u određenom kontekstu. Ovo je semantička definicija. Nasuprot tome, imena u standardnoj biblioteci koja nisu ugrađena u jeziku se ne smatraju rezervisanim rečima ili ključnim rečima. Izrazi "rezervisana reč" i "ključna reč" često se koriste kao sinonimi - može se reći da je rezervisana reč "rezervisana za upotrebu kao ključna reč" - i formalna primena varira od jezika do jezika; za ovaj članak mi je razlikujemo kao što je gore navedeno.

U principu rezervisane reči i ključne reči ne moraju da se poklapaju, i u većini modernih jezika ključne reči su odvojene od rezervisanih reči, to čini gramatičko raščlanjavanje lakšim, i od tada je ključne reči ne moguće mešati sa identifikatorima. U nekim jezicima, kao što su S ili Pajton, rezervisane reči i ključne reči se poklapaju, dok u drugim jezicima, kao u Javi, sve ključne reči su rezervisane reči, ali neke rezervisane reči nisu ključne reči - one su "rezervisane za buduću upotrebu". U ostalim jezicima, kao što su Algol i PL/I postoje ključne reči ali ne i rezervisane reči, i ključne reči se razlikuju od identifikatora po drugim značenjima.

Razlika[uredi | uredi izvor]

Setovi rezervisanih reči i ključnih reči u jeziku često se poklapaju ili su skoro jednaki, a razlika je suptilna, tako da se ovi termini često koriste kao sinonimi. Međutim, u pažljivoj upotrebi se razlikuju.

Pretvaranje ključnih reči u rezervisane reči čini leksičku analizu lakšom, tako će niz znakova biti nedvosmisleno ili ključna reč ili identifikator, bez konteksne zavisnosti; tako su ključne reči obično podskupovi rezervisanih reči. Međutim, rezervisane reči ne moraju biti ključne reči - na primer, u Javi, goto je rezervisana reč, ali ona nema značenje i ne pojavljuje se u bilo kom proizvodnom pravilu u gramatici. To se obično radi za narednu kompatibilnost, tako da rezervisana reč može postati ključna reč u budućoj verziji bez razbijanja postojećeg programa.

Suprotno tome, ključne reči ne moraju biti rezervisane reči, sa njihovom ulogom koja je razumljiva iz konteksta, ili se mogu izdvojiti na drugi način, kao npr. stropiranjem. Na primer, fraza if = 1 je nedvosmislena u većini gramatika, jer kontrolna izjave if člana ne može početi sa =, i ovo je dozvoljeno u nekim jezicima, npr u FORTRANU. Alternativno, u ALGOL 68, ključne reči moraju biti stropirane - obeležene na neki istaknuti način - u strogom jeziku navodeći ih podebljanim slovima, i prema tome one nisu rezervisane reči. Tako je u strogom jeziku sledeći izraz legalan, podebljana ključna reč if nije u suprotnosti sa običnim identifikatorom if:

if if eq 0 then 1 fi

Međutim, u Algol 68 postoji stropirani režim u kome su ključne reči rezervisane reči, to je primer kako se ovi različiti koncepti često poklapaju; ovo je praćeno u mnogim modernim jezicima.

Syntax[uredi | uredi izvor]

Rezervisana reč je ona koja "izgleda kao" normalna reč, ali joj nije dozvoljeno da se koristi kao normalna reč. Formalno to znači da zadovoljava uobičajene leksičke sintakse (sintakse reči) identifikatora - primer je, niz slova - ali on se ne može koristiti tamo gde su identifikatori korišćeni. Na primer, reč if je obično rezervisana reč, dokx generalno nije, pa je tako x = 1 validan zadatak, ali if = 1 nije.

Ključne reči imaju različite upotrebe, ali se pre svega razvrstavaju u nekoliko klasa kao što su: klasa dela gramatike fraze (posebno pravilo proizvodnje sa neterminalnim simbolima), klasa sa različitim značenjima, klasa koja se često koristi za kontrolu toka, klasa kao reč if koja se koristi u većini proceduralnih jezika, klasa koja ukazuje na uslove i uzima članove (neterminalne simbole); imena primitivnih tipova u jeziku koji podržava tip sistema, kao što je int; primitibna literalna vrednost kao što je true za Bulovo tačno; ili ponekad posebne komande kao što su exit. Druga upotreba ključnih reči je u frazama za ubacivanje / izbacivanje, takva reč je print.

Odvojene definicije su jasne kada se jezik analizira kombinacijom leksera i parsera, i sintaksa jezika je generisana od strane leksičke gramatike za reči, i kontekstno slobodne gramatike pravila proizvodnje za fraze. To je uobičajeno u analizi modernih jezika, a u ovom slučaju ključne reči su odvojene od rezervisanih reči, jer se moraju razlikovati od identifikatora na nivou reči (dakle rezervisanih reči) da bi se sintaksički analizirali drugačije na nivou fraza (kao ključnih reči).

U ovom slučaju rezervisane reči su definisane kao deo leksičke gramatike, i svaka je označena kao poseban tip, koji je različit od identifikatora. U konvencionalnom obeležavanju, rezervisane reči if i then na primer su označene kao tipovi IF i THEN,  dok su x i y oboje označeni kao tip Identifier.

Ključne reči, se naprotiv, sintaksički pojavljuju u gramatici fraze, kao terminalni simboli. Na primer, pravilo proizvodnje uslovne izjave može biti IF Expression THEN Expression. Uovom slučaju IF i THEN su terminalni simboli, što znači da je "tip simbola IF ili THEN" – i zbog leksičke gramatike, tu se misli na nisku if ili then u originalnom izvoru. Primer primitivne konstantne vrednosti, true može biti ključna reč koja redstavlja logičku vrednost "tačno", u tom slučaju bi trebalo da se pojavi u gramatici kao moguće proširenje proizvodnjeBinaryExpression, za instancu.

Rezervisani opseg[uredi | uredi izvor]

Osim rezervisanih specifičnih lista reči, neki jezici rezervišu cele opsege reči, koriste ih kao privatne prostore za buduće verzije jezika, različite dijalekte, kompilatore prodavace-specifična proširenja, ili za internu upotrebu od strane kompilatora, posebno u komadanju imena.

Ovo se najčešće vrši pomoću prefiksa, obično jedne ili više donjih crta. S i C++ su poznati u tom smislu: S99 rezerviše identifikatore koje počinju sa dve donje crte ili kada je donja crta praćena velikim slovom, i kasnije rezerviše identifikatore koji počinju sa jednom donjom crtom (u redovnim i označenim prostorima) za upotrebu u okviru fajlova;[1] sa C++ 03 dalje rezerviše identifikatore koji sadrže dvostruke crte bilo gde[2]- što omogućava korišćenje dvostruke donje crte kao separatora (za povezivanje korisničkih identifikatora), na primer.

Česta upotreba dvostrukih donjih crta u unutrašnjim identifikatorima u Pajtonu dovela je do skraćenice dunder; ovo je napravio Mark Jackson Arhivirano na sajtu Wayback Machine (22. januar 2004)[3] i nezavisno Tim Hochberg,[4] u razmaku od nekoliko minuta, obojica kao odgovor na isto pitanje u 2002. godini.[5][6]

Pojedinosti[uredi | uredi izvor]

Liste rezervisanih reči i ključnih reči u jeziku su definisane kada je razvijen jezik, i obe forme su sastavni deo formalne specifikacije jezika. Generalno želja je da se smanji broj rezervisanih reči, da bi se izbeglo ograničenje validnih imena identifikatora. Dalje, uvođenjem novih rezervisanih reči razbijaju se postojeći programi koji koriste tu reč (to nije kompatibilno), tako da se to izbegava. Da biste sprečili ovo i pružili buduću kompatibilnost, ponekad su reči rezervisane bez tekuće upotrebe (rezervisana reč koja nije ključna reč), jer to omogućava da se reč koristi u budućnosti bez razbijanja postojećih programa. Alternativno, nove karakteristike jezika mogu se sprovesti kao predefinisane, što se može prevazići, stoga ne razbijajte postojeće programe.

Razlozi za fleksibilnost su ti da se prodavcu kopilatora da mogućnost da proširi specifikaciju uključujući i ne-standardne karakteristike, različite standardne jezičke dijalekte, ili da u buduće verzije jezika uključi dodatne funkcije. Na primer, proceduralni jezik može predvideti dodavanje objektno orijentisanih mogućnosti u buduću verziju ili neki dijalekt, u kome bi se mogle dodati ključne reči kao class ili object. Da bi se prilagodili ovoj mogućnosti, sadašnja specifikacija će možda napraviti ove rezervisane reči, čak i ako se one trenutno ne koriste.

Značajan primer je Java, gde su const i goto rezervisane reči - one nemaju značenje u Javi, i one se takođe ne mogu koristiti kao identifikatori. Po rezervisanju termina, oni se mogu realizovati u budućim verzijama Jave, ako se to budu želelo, bez razbijanja starijeg Javinog izvornog koda. Na primer, postojao je predlog 1999. godine da se doda C++-kao const na jeziku, što je bilo moguće pomoću const reči, od tada je rezervisana ali nije do sada korišćena; Međutim, ovaj predlog je odbijen - iako dodavanje ove funkcije ne bi slomilo izvšenje programa, korišćenje u standardnoj biblioteci (posebno u kolekcijama) bi slomilo kompatibilnost.[7] Javaskript takođe sadrži veliki broj rezervisanih reči bez posebne funkcionalnosti; tačan spisak varira u zavisnosti od verzije i moda.[8]

Svi identifikatori koji počinju sa donjom crtom ili bilo velikim slovom ili drugom donjom crtom su uvek rezervisani za svaku upotrebu. Svi identifikatori koji počinju sa donjom crtom su uvek rezervisane za upotrebu kao identifikatori sa obimom datoteke u redovnim i označenim prostorima.

Jezici se značajno razlikuju u tome koliko često uvode nove rezervisane reči ili ključne reči i kako ih nazivaju, uz to neki jezici su vrlo konzervativni i uvode nove reči retko ili nikada, kako bi izbegli razbijanje postojećeg programa, dok drugi jezici uvede nove ključne reči slobodnije, zahtevajući od postojećih programa da promene postojeće identifikatore koji prave problem. Studija slučaja je data novim ključnim rečima u S11 u poređenju sa  C++11, oba iz 2011. godine - ovo podseća na S i C++, identifikatori koji počinju sa donjom crtom i zatim velikim slovom su rezervisani:[9]

C odbor ne preferira da stvara nove ključne reči u prostoru korisničkog imena, kao što se obično očekuje da svaka revizija S izbegne razbijanje starijeg S programa. Poređenja radi, C++ odbor (WG21) preferira da stvara nove ključne reči normalnog izgleda kao i stare ključne reči. Na primer, C++ 11 definiše novu thread_local ključnu reč da odredi statička skladišta u jedan niz. S11 definiše novu ključnu reč kao _Thread_local. U novom S11 zaglavlju <threads.h>, postoji makro definicija koja obezbeđuje normalan izgled imena:[10]

#definisati thread_local _Thread_local

To je, S11 je predstavio ključnu reč _Thread_local u okviru postojećeg seta rezervisanih reči (onih sa određenim prefiksom), i zatim koriste poseban objekat (makro obradu) kako bi se omogućilo njegovo korišćenje kao da je nova ključna reč bez prefiksa, dok C++ 11 uvodi ključnu reč thread_local i uprkos tome što ovo nije postojeća rezervisana reč, razbija sve programe koji je koriste, ali bez potrebe makro obrade.

Predefinisana imena[uredi | uredi izvor]

Srodani pojmovi za rezervisane reči su unapred definisana funkcija, metode, podprogrami, ili promenljive, a posebno biblioteka rutine iz standardne biblioteke. Oni su slični po tome što su deo osnovnog jezika, a mogu se koristiti za slične svrhe. Međutim, oni se razlikuju po tome što je naziv prethodno definisane funkcije, metoda ili potprograma obično kategorisan kao identifikator umesto kao rezervisana reč, a nije posebno tretiran u sintaksičkoj analizi. Dalje, rezervisane reči ne mogu biti predefinisane od strane programera, ali reči koje su unapred definisane se često mogu zanemariti u nekom svojstvu.

Jezici se razlikuju šta je označeno kao ključna reč i šta kao unapred definisana reč. Neki jezici, na primer, označavaju ključne reči za ulazne / izlazne operacije dok je u drugim jezicima to biblioteka rutine. U Pajtonu (u verzijama starijim od 3.0) i mnogim Bejsik dijalektima, print je ključna reč. Nasuprot tome, u S, Lisp, Pajton 3.0 ekvivalenti printf, format, i print su funkcije u standardnoj biblioteci. Slično tome, u Pajtonu do 3.0, None, True, i False su unapred definisane promenljive, ali nisu rezervisane reči, ali u Pajtonu 3.0 one su pretvodene u rezervisane reči.[11]

Definicija[uredi | uredi izvor]

Neki koriste termine "ključna reč" i "rezervisana reč" naizmenično, dok drugi prave razliku u korišćenju, recimo "ključnom rečju" se označava reč koja je specijalna samo u trenutnom kontekstu, a "rezervisanom rečju" se označavaju specijalne reči koje se ne mogu koristiti kao imena od strane korisnika. Značenje ključnih reči — i, zaista, značenje pojma ključna reč — široko se razlikuju od jezika do jezika. Konkretno, u Algolu 68, ključne reči su stropirane (u strogom jeziku, napisane podebljanim slovima) i nisu rezervisane reči - stropirana reč se može koristiti kao običan identifikator.

"Specifikacija programskog jezika Java" koristi termin "ključna reč".[12] I ISO 9899 standard za S programski jezik koristi izraz "ključna reč".[13]

U mnogim jezicima, kao u S i sličnim okruženjima kao C++, ključna reč je rezervisana reč koja identifikuje sintaksnu formu. Reči korišćene u strukturi kontrole toka, kao if, then, i else su ključne reči. U ovim jezicima, ključne reči ne mogu biti imena promenljivih i funkcija.

U nekim jezicima, kao što su Algol i Algol 68, ključne reči se ne mogu pisati doslovno, ali se moraju stropirati. To znači da ključne reči moraju biti obeležene nekako. Na primer. citirajući ih ili im dodati poseban karakter kao prefiks. Posledica toga je da ključne reči nisu rezervisane reči, pa se ista reč može koristiti kao normalan identifikator. Međutim, jedan režim stropiranja je bio da se umesto stropiranja ključne reči, one jednostavno pretvore u rezervisane reči.

Neki jezici, kao što su PostScript, su izuzetno liberalni u ovom pristupu, dozvoljavajući da se srž ključne reči redefiniše za posebne namene.

U Common Lisp, termin "ključnu reč" (ili "simbol ključne reči") se koristi za posebnu vrstu simbola, ili identifikatora. Za razliku od drugih simbola, koji obično stoje uz promenljive ili funkcije, ključne reči su samo-citirajuće i samo-ocenjivajuće:[14]:98  i ugrađene su u paket KLjUČNIH REČI.[15] Ključne reči se obično koriste za obeležavanje imenovanih argumenata funkcije, i za prikazivanje simboličke vrednosti. Simboli koji daju imena funkcijama, promenljim, posebnim oblicima i makro rečima u paketu pod nazivom COMMON-LISP su osnovne rezervisane reči. Efekat koji ih ponovo definiše je nedefinisan u ANSI Common Lisp.[16] Njihovo pravljenje je moguće. Na primer izraz (if if case or) je moguć, kada je if lokalna promenljiva. Skroz levo if se odnosi na if operator; preostali simboli se tumače kao imena promenljivih. Od kada postoji poseban prostor za imena funkcija i promenljih, if bi mogao da bude lokalna promenljiva. U Common Lisp, međutim, postoje dva specijalna simbola koja nisu u paketu ključnih reči:: simboli t i nil. Kada su ocenjeni kao izrazi, oni ocenjuju sami sebe. Oni ne mogu da se koriste kao imena funkcije ili promenljivih, tako su de fakto rezervisane reči. (let ((t 42))) je dobro formirani izraz, ali let operator neće biti dozvoljen za upotrebu.

Tipično, kada programer pokušava da koristi ključnu reč za ime promenljive ili funkcije, kompilacijska greška će se aktivirati. U većini modernih urednika, ključne reči su automatski podešene da imaju posebnu boju teksta da podsete ili informišu programere da su to ključne reči.

U jezicima sa makro ili lenjim procenama, konstrukcije kontrole toka kao  if mogu biti realizovane kao makro ili funkcije. U jezicima bez ovih izražajnih karakteristika, oni su uglavnom ključne reči.

Poređenje po jeziku[uredi | uredi izvor]

Nemaju svi jezici isti broj rezervisanih reči. Na primer, Java (i ostali derivati S-a) ima prilično retku dopunu rezervisanih reči — oko 50 — a COBOL ima oko 400. A na drugom kraju spektra, Prolog i PL/I nemaju ni jednu.

Broj rezervisanih reči u jeziku nema mnogo veze sa tim koliko je "moćan" jezik. COBOL je dizajniran pedesetih godina, kao poslovni jezik i bio napravljen da bude samo-dokumentujući program koji koristi Engleski-odnosno strukturne elemente kao što su glagoli, članovi, rečenice, sektori i oblasti. S u drugu ruku, je napisan da bude veoma kratak (sintaksički), a da dobija više teksta na ekranu. Na primer, upoređujući ekvivalentne blokove koda iz S i COBOL za izračunavanje nedeljnih zarada:

      // 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.

Čista Prolog-ova logika se izražava u smislu odnosa, a izvršenje se aktivira pokretanjem upita preko tih odnosa. Konstrukti kao što su petlje se primenjuju koristeći rekurzivne veze.

Sva tri jezika mogu da reše iste vrste "problema", iako imaju različiti broj rezervisanih reči. Ova "moć" se odnosi na to što pripadaju programskim jezicima koji su potpuni po Tjuringu.

Nedostaci[uredi | uredi izvor]

Definicija rezervisanih reči u jeziku stvara probleme. Jezik može biti težak za učenje novim korisnicima zbog duge liste rezervisanih reči koje treba da zapamte i koja se ne smeju koristiti kao identifikatore. Produžavanje jezika može biti teško zbog toga što dodatak rezervisanih reči za nove funkcije može poništiti postojeće programe ili, obrnuto, "preopterećenje" postojećih rezervisanih reči sa novim značenjima može da bude zbunjujuće. Portiranje može biti problematično jer reč nije rezervisana za jedan sistem / kompajler može biti rezervisan od drugog.

Rezervisane reči i nezavisnost jezika[uredi | uredi izvor]

Specifikacija Opšta jezička infrastruktura Microsoft’s .NET dozvoljava da se kod napiše u više od 40 različitih programskih jezika koji se zajedno kombinuju u finalni proizvod. Zbog toga, može doći do sudara identifikatora / rezervisanih pri pokušaju da se realizuje kod u nekom jeziku, a da je prethodno napissan u drugom. Na primer, biblioteka Visual Basic.NET može sadrži definiciju klasa kao što su:

' Class Definition of This in Visual Basic.NET:

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

Ako je ovo kompilovano i distribuirano kao deo kutije sa alatima, C# programer, koji želi da definiše promenljivu tipa “this” bi naišao na problem: 'this' je rezervisana reč u S #. Dakle, sledeće neće biti kompilovano u S #:

// Using This Class in C#:

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

Sličan problem se javlja kada se pristupa članovima, zaobilaženjem virtuelne metode, i identifikovanjem imenskog prostora.

To se rešava stropingom. Da bi se rešio ovaj problem, specifikacija dozvoljava programeru da (u S #) postavi @-znak identifikatoru koji je forsiran da bude identifikator pre nego rezervisana reč kompajlera:

// Using This Class in C#:

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

Zbog doslednosti, ta upotreba je takođe dozvoljena u ne-javnim postavkama kao što su lokalne promenljive, imena parametara i privatni članovi.

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

  1. ^ C99 specification, 7.1.3 Reserved identifiers
  2. ^ C++03 specification, 17.4.3.2.1 Global names [lib.global.names]
  3. ^ Jackson, Mark (Sep 26, 2002).
  4. ^ Hochberg, Tim (Sep 26, 2002).
  5. ^ Dunder (Double UNDERscore) Alias
  6. ^ Notz, Pat (Sep 26, 2002).
  7. ^ "Bug ID: JDK-4211070 Java should support const parameters (like C++) for code maintainence [sic]" Arhivirano na sajtu Wayback Machine (3. novembar 2014).
  8. ^ Lexical grammar: Keywords
  9. ^ 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."
  10. ^ C11:The New C Standard, Thomas Plum, "A Note on Keywords"
  11. ^ "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
  12. ^ "The Java Language Specification, 3rd Edition, Section 3.9: Keywords".
  13. ^ "ISO/IEC 9899:TC3, Section 6.4.1: Keywords" (PDF).
  14. ^ Norvig, Peter (1991). Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp. Morgan Kaufmann. ISBN 978-1-55860-191-8. , Web
  15. ^ Type KEYWORD from the Common Lisp HyperSpec
  16. ^ "Constraints on the COMMON-LISP Package for Conforming Programs".

Spoljašnje veze[uredi | uredi izvor]