Zastrzeżone słowo - Reserved word

W języku komputerowym , A słowo zastrzeżone (znany również jako zastrzeżonego identyfikatora ) jest słowem, które nie może być stosowany jako identyfikator , takie jak nazwa zmiennej, funkcja lub etykiecie - jest „zarezerwowane z użycia”. Jest to definicja składniowa , a słowo zastrzeżone może nie mieć znaczenia zdefiniowanego przez użytkownika.

Ściśle powiązanym i często mieszanym pojęciem jest słowo kluczowe , które jest słowem o specjalnym znaczeniu w określonym kontekście. To jest definicja semantyczna . Natomiast nazwy w standardowej bibliotece, ale nie wbudowane w język, nie są uważane za zastrzeżone słowa lub słowa kluczowe. Terminy „słowo zastrzeżone” i „słowo kluczowe” są często używane zamiennie – można powiedzieć, że słowo zastrzeżone jest „zastrzeżone do użytku jako słowo kluczowe” – a formalne użycie różni się w zależności od języka; w tym artykule rozróżniamy jak powyżej.

Ogólnie słowa zastrzeżone i słowa kluczowe nie muszą się pokrywać, ale w większości współczesnych języków słowa kluczowe są podzbiorem słów zastrzeżonych, ponieważ ułatwia to parsowanie, ponieważ słów kluczowych nie można pomylić z identyfikatorami. W niektórych językach, takich jak C czy Python, zastrzeżone słowa i słowa kluczowe pokrywają się, podczas gdy w innych językach, takich jak Java, wszystkie słowa kluczowe są słowami zastrzeżonymi, ale niektóre zastrzeżone słowa nie są słowami kluczowymi – są one „zarezerwowane do wykorzystania w przyszłości”. W jeszcze innych językach, takich jak starsze języki ALGOL , FORTRAN i PL/I , istnieją słowa kluczowe, ale nie ma słów zastrzeżonych, przy czym słowa kluczowe są odróżniane od identyfikatorów w inny sposób. To sprawia, że ​​parsowanie jest trudniejsze przy użyciu parserów z wyprzedzeniem.

Różnica

Zestawy zastrzeżonych słów i słów kluczowych w języku często pokrywają się lub są prawie równe, a rozróżnienie jest subtelne, dlatego terminy są często używane zamiennie. Jednak przy starannym użytkowaniu wyróżniają się.

Uczynienie słów kluczowych słowami zastrzeżonymi ułatwia leksykanie , ponieważ ciąg znaków będzie jednoznacznie albo słowem kluczowym, albo identyfikatorem, bez zależności od kontekstu; tak więc słowa kluczowe są zwykle podzbiorem słów zastrzeżonych. Jednak słowa zastrzeżone nie muszą być słowami kluczowymi – na przykład w Javie gotojest słowem zastrzeżonym, ale nie ma znaczenia i nie występuje w żadnych regułach produkcji w gramatyce. Odbywa się to zwykle w celu zapewnienia kompatybilności w przód , więc zastrzeżone słowo może stać się słowem kluczowym w przyszłej wersji bez uszkadzania istniejących programów.

I odwrotnie, słowa kluczowe nie muszą być słowami zastrzeżonymi, z ich rolą rozumianą z kontekstu, lub można je rozróżnić w inny sposób, na przykład przez skrócenie . Na przykład fraza if = 1jest jednoznaczna w większości gramatyk, ponieważ instrukcja kontrolna klauzuli if nie może zaczynać się od =, a zatem jest dozwolona w niektórych językach, takich jak FORTRAN . Alternatywnie, w ALGOL 68 , słowa kluczowe muszą być okrojone – oznaczone w jakiś sposób do rozróżnienia – w ścisłym języku poprzez wytłuszczenie, a zatem nie są słowami zastrzeżonymi. Tak więc w ścisłym języku następujące wyrażenie jest legalne, jak śmiałe słowa kluczowego , jeśli nie jest to sprzeczne ze zwykłym identyfikatorem if:

jeśli jeśli równanie 0 to 1 fi

Jednak w ALGOL 68 istnieje również system ograniczania, w którym słowa kluczowe są słowami zastrzeżonymi, co jest przykładem tego, jak te różne pojęcia często się pokrywają; następuje to w wielu współczesnych językach.

Składnia

Zarezerwowane słowo to takie, które „wygląda jak normalne słowo”, ale nie może być używane jako normalne słowo. Formalnie oznacza to, że spełnia on zwykłą składnię leksykalną (składnię słów) identyfikatorów – na przykład jest ciągiem liter – ale nie może być używany tam, gdzie używane są identyfikatory. Na przykład słowo ifjest powszechnie słowem zastrzeżonym, podczas gdy xgeneralnie nie jest, więc x = 1jest ważnym przypisaniem, ale if = 1nie jest.

Słowa kluczowe mają różne zastosowania, ale przede wszystkim należą do kilku klas: część frazy gramatyka (konkretnie reguła produkcji z symbolami nieterminalowymi ), o różnych znaczeniach, często używane do sterowania przepływem , takie jak słowo ifw większości języków proceduralnych, co wskazuje a warunkowych i zajmuje punkty (nieterminalowi symbole); nazwy typów pierwotnych w języku obsługującym system typów , takie jak int; prymitywne wartości literałowe , takie jak trueBoolean true; lub czasami specjalne polecenia, takie jak exit. Inne zastosowania słów kluczowych w frazach dotyczą wejścia/wyjścia, na przykład print.

Odrębne definicje są jasne, kiedy język jest analizowany przez kombinacji lexer i parsera i składnia języka jest generowana przez leksykalnego gramatyki za słowa, a bezkontekstowych gramatyki z zasadami produkcji dla fraz. Jest to powszechne w analizie współczesnych języków, a w tym przypadku słowa kluczowe są podzbiorem słów zastrzeżonych, ponieważ należy je odróżnić od identyfikatorów na poziomie słowa (a więc słów zastrzeżonych), aby można je było inaczej analizować składniowo na poziomie frazy (jako słowa kluczowe).

W tym przypadku słowa zastrzeżone są definiowane jako część gramatyki leksykalnej i każde z nich jest tokenizowane jako osobny typ, odrębny od identyfikatorów. W konwencjonalnym zapisie słowa zastrzeżone ifi thenna przykład są tokenized jako typy IFi THEN, odpowiednio, podczas gdy xi ysą zarówno tokenized jako typ Identifier.

Natomiast słowa kluczowe występują składniowo w gramatyce frazy jako symbole końcowe . Na przykład regułą produkcji wyrażenia warunkowego może być IF Expression THEN Expression. W tym przypadku IFi THENsą to symbole końcowe, oznaczające odpowiednio „znacznik typu IFlub THEN” – i ze względu na gramatykę leksykalną oznacza to ciąg znaków iflub thenw oryginalnym źródle. Przykładem wartości stałej pierwotnej truemoże być słowo kluczowe reprezentujące wartość logiczną „prawda”, w którym to przypadku powinno pojawić się w gramatyce jako możliwe rozszerzenie produkcji BinaryExpression.

Zarezerwowane zakresy

Poza rezerwowaniem konkretnych list słów, niektóre języki rezerwują całe zakresy słów do użytku jako prywatne przestrzenie dla przyszłych wersji językowych, różnych dialektów, rozszerzeń specyficznych dla kompilatora lub do użytku wewnętrznego przez kompilator, zwłaszcza w przerabianiu nazw .

Najczęściej odbywa się to za pomocą prefiksu, często jednego lub więcej podkreśleń . C i C++ są godne uwagi pod tym względem: C99 rezerwuje identyfikatory, które zaczynają się od dwóch podkreśleń lub podkreślenia, po którym następuje wielka litera, a dalej rezerwuje identyfikatory, które zaczynają się od pojedynczego podkreślenia (w przestrzeniach zwykłych i znaczników) do użytku w zakresie pliku ; z C++03 dodatkowo rezerwuje identyfikatory, które zawierają podwójne podkreślenie w dowolnym miejscu – pozwala to na użycie podwójnego podkreślenia jako separatora (w celu połączenia identyfikatorów użytkowników).

Częste użycie podwójnego podkreślenia w wewnętrznych identyfikatorach w Pythonie dało początek skrótowi dunder; zostało to wymyślone przez Marka Jacksona i niezależnie przez Tima Hochberga, w ciągu kilku minut od siebie, obaj w odpowiedzi na to samo pytanie w 2002 roku.

Specyfikacja

Lista zastrzeżonych słów i słów kluczowych w języku jest definiowana podczas opracowywania języka i oba stanowią część formalnej specyfikacji języka . Ogólnie rzecz biorąc, chce się zminimalizować liczbę słów zastrzeżonych, aby uniknąć ograniczania poprawnych nazw identyfikatorów. Co więcej, wprowadzenie nowych słów zastrzeżonych łamie istniejące programy używające tego słowa (nie jest ono kompatybilne wstecz), więc tego się unika. Aby temu zapobiec i zapewnić kompatybilność w przód , czasami słowa są zastrzeżone bez bieżącego użycia (słowo zastrzeżone, które nie jest słowem kluczowym), ponieważ pozwala to na użycie słowa w przyszłości bez uszkadzania istniejących programów. Alternatywnie, nowe funkcje językowe można zaimplementować jako predefiniowane, które można nadpisać, nie łamiąc w ten sposób istniejących programów.

Przyczyny elastyczności obejmują umożliwienie dostawcom kompilatorów rozszerzenia specyfikacji o niestandardowe funkcje, różne standardowe dialekty języka w celu jej rozszerzenia lub przyszłe wersje języka w celu uwzględnienia dodatkowych funkcji. Na przykład język proceduralny może przewidywać dodanie funkcji obiektowych w przyszłej wersji lub jakimś dialekcie, w którym to momencie można dodać słowa kluczowe, takie jak classlub object. Aby uwzględnić tę możliwość, bieżąca specyfikacja może tworzyć te zastrzeżone słowa, nawet jeśli nie są one obecnie używane.

Godnym uwagi przykładem jest Java , gdzie consti gotosą słowami zastrzeżonymi — nie mają znaczenia w Javie, ale również nie mogą być używane jako identyfikatory. Rezerwując terminy, można je w razie potrzeby zaimplementować w przyszłych wersjach Javy bez łamania starszego kodu źródłowego Javy. Na przykład w 1999 roku pojawiła się propozycja dodania C++ constdo języka, co było możliwe przy użyciu tego constsłowa, ponieważ było zarezerwowane, ale obecnie nie jest używane; Jednak propozycja ta została odrzucona - przede wszystkim dlatego, mimo że dodanie funkcji nie łamać żadnych istniejących programów, wykorzystując go w bibliotece standardowej (głównie w kolekcjach) by złamać kompatybilność. JavaScript zawiera również pewną liczbę słów zastrzeżonych bez specjalnej funkcjonalności; dokładna lista różni się w zależności od wersji i trybu.

Języki różnią się znacznie pod względem tego, jak często wprowadzają nowe zastrzeżone słowa lub słowa kluczowe i jak je nazywają, przy czym niektóre języki są bardzo konserwatywne i wprowadzają nowe słowa kluczowe rzadko lub nigdy, aby uniknąć zepsucia istniejących programów, podczas gdy inne języki wprowadzają nowe słowa kluczowe swobodniej, wymagając istniejących programy do zmiany istniejących identyfikatorów, które powodują konflikt. Studium przypadku jest podane przez nowe słowa kluczowe w C11 w porównaniu z C++11 , oba z 2011 r. – przypomnijmy, że w C i C++ identyfikatory zaczynające się od podkreślenia, po którym następuje wielka litera, są zarezerwowane:

Komitet C woli nie tworzyć nowych słów kluczowych w przestrzeni nazw użytkowników, ponieważ ogólnie oczekuje się, że każda wersja C pozwoli uniknąć łamania starszych programów C. Dla porównania, komisja C++ (WG21) woli, aby nowe słowa kluczowe wyglądały tak samo normalnie, jak stare słowa kluczowe. Na przykład C++11 definiuje nowe słowo kluczowe thread_local, aby określić statyczną pamięć lokalną dla jednego wątku. C11 definiuje nowe słowo kluczowe jako _Thread_local. W nowym nagłówku C11 <threads.h> znajduje się definicja makra zapewniająca normalnie wyglądającą nazwę:

#define thread_local _Thread_local

Oznacza to, że C11 wprowadził słowo kluczowe _Thread_localw istniejącym zestawie słów zastrzeżonych (tych z określonym przedrostkiem), a następnie użył oddzielnej funkcji (przetwarzanie makr), aby umożliwić jego użycie tak, jakby było to nowe słowo kluczowe bez żadnego przedrostka, podczas gdy C+ +11 wprowadza słowo kluczowe, thread_localmimo że nie jest ono istniejącym słowem zastrzeżonym, łamiąc wszystkie programy, które go używały, ale bez konieczności przetwarzania makr.

Predefiniowane nazwy

Pokrewnym pojęciem ze słowami zastrzeżonymi są predefiniowane funkcje, metody, podprogramy lub zmienne, w szczególności procedury biblioteczne z biblioteki standardowej. Są one podobne, ponieważ są częścią podstawowego języka i mogą być używane do podobnych celów. Różnią się one jednak tym, że nazwa predefiniowanej funkcji, metody lub podprogramu jest zwykle klasyfikowana jako identyfikator zamiast słowa zastrzeżonego i nie jest traktowana specjalnie w analizie składniowej. Co więcej, słowa zastrzeżone mogą nie być przedefiniowane przez programistę, ale predefiniowane często mogą być w pewnym stopniu przesłonięte.

Języki różnią się pod względem tego, co jest podawane jako słowo kluczowe, a co wstępnie zdefiniowane. Na przykład niektóre języki zapewniają słowa kluczowe dla operacji wejścia/wyjścia, podczas gdy w innych są to procedury biblioteczne. W Pythonie (wersje wcześniejsze niż 3.0) i wielu dialektach języka BASICprint to słowo kluczowe. W przeciwieństwie do tego, C Lisp Python 3,0 równoważnika printf, formati printsą funkcje biblioteki standardowej. Podobnie w Pythonie przed 3.0, None, Truei Falsebyły predefiniowanymi zmiennymi, ale nie słowami zastrzeżonymi, ale w Pythonie 3.0 zostały przekształcone w słowa zastrzeżone.

Definicja

Niektórzy używają terminów „słowo kluczowe” i „słowo zastrzeżone” zamiennie, podczas gdy inni rozróżniają użycie, np. „słowo kluczowe” oznacza słowo, które jest specjalne tylko w określonych kontekstach, ale „słowo zastrzeżone” oznacza specjalne słowo, którego nie można użyć jako nazwa zdefiniowana przez użytkownika. Znaczenie słów kluczowych — a właściwie znaczenie pojęcia słowa kluczowego — różni się znacznie w zależności od języka. Konkretnie, w ALGOL 68 słowa kluczowe są okrojone (w języku ścisłym, pisane pogrubioną czcionką) i nie są słowami zastrzeżonymi – słowo nieobcięte może być użyte jako zwykły identyfikator.

W „ Specyfikacji języka Java ” użyto terminu „słowo kluczowe”. Standard ISO 9899 dla języka programowania C używa terminu „słowo kluczowe”.

W wielu językach, takich jak C i podobnych środowiskach, takich jak C++ , słowo kluczowe jest słowem zastrzeżonym, które identyfikuje formę składniową. Słowa użyte w przepływ sterowania konstrukcjami, takimi jak gdyby , theni elsesą to słowa kluczowe. W tych językach słowa kluczowe nie mogą być również używane jako nazwy zmiennych lub funkcji.

W niektórych językach, takich jak ALGOL i Algol 68 , słowa kluczowe nie mogą być napisane dosłownie, ale muszą być okrojone . Oznacza to, że słowa kluczowe muszą być jakoś oznaczone. Np. cytując je lub poprzedzając je znakiem specjalnym. W konsekwencji słowa kluczowe nie są słowami zastrzeżonymi, a zatem to samo słowo może być używane jako normalny identyfikator. Jednak jeden system ograniczania polegał na tym, aby nie usuwać słów kluczowych, a zamiast tego miały być po prostu słowami zastrzeżonymi.

Niektóre języki, takie jak PostScript , są bardzo liberalne w tym podejściu, umożliwiając przedefiniowanie podstawowych słów kluczowych do określonych celów.

W Common Lisp termin „słowo kluczowe” (lub „symbol słowa kluczowego”) jest używany dla specjalnego rodzaju symbolu lub identyfikatora. W przeciwieństwie do innych symboli, które zwykle stoją dla zmiennych lub funkcji, słowa kluczowe są samo- cytowanie i samo-oceny : 98 i internowany w KEYWORD opakowaniu. Słowa kluczowe są zwykle używane do etykietowania nazwanych argumentów funkcji i do reprezentowania wartości symbolicznych. Symbole, które nazywają funkcje, zmienne, specjalne formularze i makra w pakiecie o nazwie COMMON-LISP są w zasadzie słowami zastrzeżonymi. Efekt ich przedefiniowania jest niezdefiniowany w ANSI Common Lisp. Wiązanie ich jest możliwe. Na przykład wyrażenie (if if case or)jest możliwe, gdy ifjest zmienną lokalną. Skrajny lewy ifodnosi się do ifoperatora; pozostałe symbole są interpretowane jako nazwy zmiennych. Ponieważ istnieje osobna przestrzeń nazw dla funkcji i zmiennych, ifmoże to być zmienna lokalna. Jednak w Common Lisp są dwa specjalne symbole, których nie ma w pakiecie słów kluczowych: symbole ti nil. Kiedy oceniane jako wyrażenia, oceniają się same. Nie mogą być używane jako nazwy funkcji lub zmiennych, więc są de facto zastrzeżone. (let ((t 42)))jest dobrze sformułowanym wyrażeniem, ale letoperator nie pozwoli na użycie.

Zazwyczaj, gdy programista próbuje użyć słowa kluczowego dla nazwy zmiennej lub funkcji, zostanie wyzwolony błąd kompilacji. W większości nowoczesnych edytorów słowa kluczowe są automatycznie ustawiane w określonym kolorze tekstu, aby przypominać lub informować programistów, że są słowami kluczowymi.

W językach z makrami lub leniwą oceną konstrukcje przepływu sterowania, takie jak ifmogą być zaimplementowane jako makra lub funkcje. W językach bez tych wyrazistych cech są to na ogół słowa kluczowe.

Porównanie według języków

Nie wszystkie języki mają taką samą liczbę słów zastrzeżonych. Na przykład Java (i inne pochodne C ) ma raczej rzadki zestaw zarezerwowanych słów – około 50 – podczas gdy COBOL ma około 400. Na drugim końcu spektrum, czysty Prolog i PL/I nie mają ich wcale.

Liczba zastrzeżonych słów w języku ma niewiele wspólnego z tym, jak „potężny” jest język. COBOL został zaprojektowany w latach pięćdziesiątych jako język biznesowy i został stworzony do samodzielnej dokumentacji przy użyciu elementów strukturalnych podobnych do angielskiego, takich jak czasowniki, zdania, zdania, sekcje i podziały. Z drugiej strony, C zostało napisane tak, aby było bardzo zwięzłe (składniowo) i aby uzyskać więcej tekstu na ekranie. Na przykład porównaj równoważne bloki kodu z C i COBOL, aby obliczyć tygodniowe zarobki:

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

Czysta logika Prologu jest wyrażana w kategoriach relacji, a wykonanie jest wyzwalane przez uruchamianie zapytań nad tymi relacjami. Konstrukcje, takie jak pętle, są implementowane przy użyciu relacji rekurencyjnych.

Wszystkie trzy z tych języków mogą rozwiązać ten sam rodzaj „problemów”, mimo że mają różną liczbę zastrzeżonych słów. Ta „moc” odnosi się do ich przynależności do zbioru języków Turinga-kompletnych .

Niedogodności

Definicja słów zastrzeżonych w języku rodzi problemy. Język może być trudny do nauczenia się nowych użytkowników z powodu długiej listy zastrzeżonych słów do zapamiętania, których nie można używać jako identyfikatorów. Rozszerzenie języka może być trudne, ponieważ dodanie słów zastrzeżonych dla nowych funkcji może unieważnić istniejące programy lub odwrotnie, „przeładowanie” istniejących słów zastrzeżonych nowymi znaczeniami może być mylące. Przenoszenie programów może być problematyczne, ponieważ słowo niezarezerwowane przez jeden system/kompilator może być zarezerwowane przez inny.

Zastrzeżone słowa i niezależność językowa

Specyfikacja Microsoft .NET Common Language Infrastructure (CLI) umożliwia połączenie kodu napisanego w ponad 40 różnych językach programowania w produkt końcowy. Z tego powodu kolizje identyfikatorów/słów zarezerwowanych mogą wystąpić, gdy kod zaimplementowany w jednym języku próbuje wykonać kod napisany w innym języku. Na przykład biblioteka Visual Basic.NET może zawierać definicję klasy, taką jak:

' Class Definition of This in Visual Basic.NET:

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

Jeśli jest to skompilowane i rozpowszechniane jako część zestawu narzędzi, programista C# , chcący zdefiniować zmienną typu „ this”, napotkałby problem: 'this'jest słowem zastrzeżonym w C#. W związku z tym następujące elementy nie zostaną skompilowane w C#:

// Using This Class in C#:

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

Podobny problem pojawia się podczas uzyskiwania dostępu do członków, zastępowania metod wirtualnych i identyfikowania przestrzeni nazw.

Rozwiązuje się to przez skrócenie . Aby obejść ten problem, specyfikacja pozwala programiście (w C#) umieścić znak at przed identyfikatorem, co wymusza traktowanie go jako identyfikatora, a nie słowa zastrzeżonego przez kompilator:

// Using This Class in C#:

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

Aby zapewnić spójność, to użycie jest również dozwolone w ustawieniach niepublicznych, takich jak zmienne lokalne, nazwy parametrów i prywatni członkowie.

Zobacz też

Bibliografia