Stropping (składnia) — Stropping (syntax)

W projektowaniu języka komputerowego stropping to metoda jawnego oznaczania sekwencji liter jako posiadających specjalną właściwość, taką jak słowo kluczowe lub określony typ zmiennej lub lokalizacji pamięci, a tym samym zamieszkiwanie innej przestrzeni nazw niż zwykłe nazwy („identyfikatory”) , w celu uniknięcia starć. Stropping nie jest używany w większości nowoczesnych języków – zamiast tego słowa kluczowe są słowami zastrzeżonymi i nie mogą być używane jako identyfikatory. Stropping pozwala na użycie tej samej sekwencji liter zarówno jako słowa kluczowego, jak i jako identyfikatora i upraszcza parsowanie w takim przypadku – na przykład dopuszczenie zmiennej nazwanej ifbez kolidowania ze słowem kluczowym if .

Stropping kojarzy się przede wszystkim z ALGOL i pokrewnymi językami w latach 60. XX wieku. Chociaż znajduje pewne nowoczesne zastosowanie , łatwo można go pomylić z innymi podobnymi technikami, które są powierzchownie podobne.

Historia

Metoda stropingu i termin „stropping” pojawiły się w rozwoju ALGOL w latach 60. XX wieku, gdzie używano go do reprezentowania różnic typograficznych (pogrubienie i podkreślenie) występujących w języku publikacji, których nie można było bezpośrednio przedstawić w języku sprzętowym – a maszyna do pisania mogła mieć pogrubione znaki, ale w kodowaniu w kartach dziurkowanych nie było pogrubionych znaków. Termin „obcinanie” powstał w ALGOL 60 , z „ apostrofu ”, ponieważ niektóre implementacje ALGOL 60 wykorzystywały apostrofy wokół tekstu w celu wskazania pogrubienia, na przykład 'if'do reprezentowania słowa kluczowego if . Stropping jest również ważny w ALGOL 68 , gdzie stosuje się wiele metod stroppingu, znanych jako „reżimy stroppingu”; oryginalne dopasowane apostrofy z ALGOL 60 nie były powszechnie używane, a wiodąca kropka lub wielkie litery były bardziej powszechne, jak w .IFlub IFi termin „stropping” był stosowany do wszystkich z nich.

Składnie

Zastosowano szereg różnych składni do stropingu:

  • Algol 60 powszechnie używał tylko konwencji pojedynczych cudzysłowów wokół słowa, generalnie jako apostrofów, stąd nazwa „stropping” (np 'BEGIN'. ).
  • Algol 68 w niektórych implementacjach traktuje sekwencje liter poprzedzone pojedynczym cudzysłowem, jako słowa kluczowe (np. 'BEGIN)

W rzeczywistości często zdarzało się, że w jednym języku mogło być używanych kilka konwencji stropowania. Na przykład w ALGOL 68 wybór konwencji skrócenia może być określony przez dyrektywę kompilatora (w terminologii ALGOL „ pragmat ”), a mianowicie POINT, UPPER, QUOTE lub RES:

  • POINT dla 6-bitów (za mało znaków dla małych liter), jak w .FOR– podobna konwencja jest stosowana w FORTRAN 77, gdzie słowa kluczowe LOGICAL są pomijane jako .EQ.etc. (patrz niżej)
  • WIELKIE dla 7-bitów, jak w FOR– małe litery używane dla zwykłych identyfikatorów
  • CYTAT jak w ALGOL 60, jak w 'for'
  • Słowa zastrzeżone RES, używane we współczesnych językach – forsą zastrzeżone i niedostępne dla zwykłych identyfikatorów

Różne reżimy reguł są specyfikacją leksykalną dla znaków stropowanych, chociaż w niektórych przypadkach mają one prostą interpretację: w reżimie pojedynczego apostrofu i kropki pierwszy znak funkcjonuje jako znak ucieczki , podczas gdy w reżimie dopasowanych apostrofów apostrofy funkcjonują jako ograniczniki , jak w literałach łańcuchowych .

Inne przykłady:

  • Atlas Autocode miał do wyboru trzy: słowa kluczowe mogły underlinedużywać backspace i overstrike na klawiaturze Flexowriter , mogły być wprowadzane przez %percent %symbol, lub mogły być wpisywane UPPER CASEbez znaku ograniczającego (tryb „uppercasedelimiters”, w którym to przypadku wszystkie zmienne musiały być być małymi literami).
  • Algol 60 na komputerach Elliott 803 i Elliott 503 użył podkreślenia. Flexowritery (produkujące dziurkowaną taśmę papierową) miały nieruchomy klawisz (podkreślenie _), dzięki czemu rozpoczęło się pisanie _b_e_g_i_n, co było bardzo czytelne. Pionowy pasek | był również kluczem nie poruszającym się, więc wpisanie |= dało dobre przybliżenie do ≠.
  • Programy ALGOL 68RS mogą korzystać z kilku wariantów stropowania, nawet w ramach jednego procesora językowego.
  • Edinburgh IMP odziedziczył %percent %symbolkonwencję prefiksu Atlas Autocode, ale nie inne opcje ograniczania

Przykłady różnych stylów ALGOL 68

Zwróć uwagę na wiodącą dyrektywę pr (skrót od pragmat ) , która sama jest okrojona w stylu POINT lub quote, oraz na komentarz for (od " ") – zobacz ALGOL 68: pr & co: Pragmats and Comments po szczegóły. ¢

Algol68 „ścisły”
jak zwykle publikowany
Obcinanie cytatów
(jak wikitekst )
Dla 7-bitowego
kompilatora kodu znaków
Dla 6-bitowego
kompilatora kodu znaków
Algol68 używający res stropingu
(słowo zastrzeżone)
¢ podkreślenie lub
   pogrubiony krój pisma ¢
 tryb  xint = int ;
 xint suma sq:=0;
 dla í chwilę
   suma kw≠70×70
 robić
   suma sq+:=i↑2
 od
'pr' quote 'pr'
'mode' 'xint' = 'int';
'xint' sum sq:=0;
'for' i 'while'
  sum sq≠70×70
'do'
  sum sq+:=i↑2
'od'
.PR UPPER .PR
MODE XINT = INT;
XINT sum sq:=0;
FOR i WHILE
  sum sq/=70*70
DO
  sum sq+:=i**2
OD
.PR POINT .PR
.MODE .XINT = .INT;
.XINT SUM SQ:=0;
.FOR I .WHILE
  SUM SQ .NE 70*70
.DO
  SUM SQ .PLUSAB I .UP 2
.OD
.PR RES .PR
mode .xint = int;
.xint sum sq:=0;
for i while
  sum sq≠70×70
do
  sum sq+:=i↑2
od

Inne języki

Z różnych powodów Fortran 77 ma następujące „logiczne” wartości i operatory: .TRUE., .FALSE., .EQ., .NE., .LT., .LE., .GT., .GE., .EQV., .NEQV., .OR., .AND.,.NOT.

.AND., .OR.a .XOR.także są używane w połączonych testach w IFi IFFinstrukcjach w plikach wsadowych uruchamianych pod procesorami wiersza poleceń JP Software , takimi jak 4DOS , 4OS2 i 4NT / Take Command .

Nowoczesne zastosowanie

Większość współczesnych języków komputerowych nie używa strącania, z dwoma godnymi uwagi wyjątkami:

Użycie wielu języków w .NET Common Language Infrastructure (CLI) firmy Microsoft wymaga sposobu używania zmiennych w innym języku, które mogą być słowami kluczowymi w języku wywołującym. Czasami odbywa się to za pomocą prefiksów, takich jak @w C#, lub umieszczając identyfikator w nawiasach, w Visual Basic.NET .

Drugim ważnym przykładem jest wiele implementacji Structured Query Language . W tych językach słowa zastrzeżone mogą być używane jako nazwy kolumn, tabel lub zmiennych poprzez ich leksykalne rozgraniczenie. Norma określa umieszczanie słów zastrzeżonych w podwójnych cudzysłowach, ale w praktyce dokładny mechanizm różni się w zależności od implementacji; Na przykład MySQL pozwala na użycie słów zastrzeżonych w innych kontekstach, umieszczając je w backtickach, a Microsoft SQL Server używa nawiasów kwadratowych.

Stropping może być również używany w języku programowania Nim . W Nim słowo zastrzeżone może być użyte jako identyfikator, umieszczając je w backtickach.

Są inne, mniej znaczące przykłady. Na przykład Web IDL używa wiodącego podkreślenia _do pomijania identyfikatorów, które w przeciwnym razie kolidują ze słowami zastrzeżonymi: wartość identyfikatora usuwa ten wiodący podkreślnik, dzięki czemu jest to pomijanie, a nie konwencja nazewnictwa.

Unstropping przez kompilator

W nakładce kompilatora , unstropping pierwotnie wystąpił podczas początkowej fazy rekonstrukcji linii , co również wyeliminowało białe znaki. Następnie nastąpiło parsowanie bez skanera (bez tokenizacji); było to standardem w latach 60., zwłaszcza w przypadku ALGOL. We współczesnym użyciu unstropping jest zwykle wykonywany jako część analizy leksykalnej . Jest to jasne, jeśli rozróżnimy leksera na dwie fazy: skanera i oceniającego: skaner kategoryzuje wyciętą sekwencję do właściwej kategorii, a następnie oceniający odskakuje podczas obliczania wartości. Na przykład w języku, w którym początkowy znak podkreślenia jest używany do pomijania identyfikatorów w celu uniknięcia kolizji ze słowami zastrzeżonymi, sekwencja _ifzostanie zakwalifikowana ifprzez skaner jako identyfikator (nie jako słowo zastrzeżone ), a następnie oceniający nada tej wartości if, dający (Identifier, if)jako typ i wartość tokenu.

Podobne techniki

Istnieje szereg podobnych technik, zazwyczaj poprzedzających lub dołączających identyfikator w celu wskazania innego traktowania, ale semantyka jest zróżnicowana. Ściśle mówiąc, stropping składa się z różnych reprezentacji tej samej nazwy (wartości) w różnych przestrzeniach nazw i występuje na etapie tokenizacji. Na przykład w ALGOL 60 z dopasowanym stropingiem apostrofowym 'if'jest tokenizowany jako (Słowo kluczowe, jeśli), natomiast ifjest tokenizowany jako (Identyfikator, jeśli) – ta sama wartość w różnych klasach tokenów.

Używanie wielkich liter dla słów kluczowych pozostaje w użyciu jako konwencja pisania gramatyk do leksykowania i parsowania – tokenizacja słowa zastrzeżonego ifjako klasy tokena IF, a następnie reprezentowanie klauzuli if-then-else przez frazę, w IF Expression THEN Statement ELSE Statementktórej słowa pisane wielkimi literami są słowami kluczowymi, a terminy pisane wielką literą są symbole nieterminalne w regule produkcji ( symbole końcowe są oznaczane terminami pisanymi małymi literami, takimi jak identifierlub integer, dla literału całkowitego ).

Konwencje nazewnictwa

Najluźniej można użyć konwencji nazewnictwa, aby uniknąć kolizji, zwykle przedrostków lub przyrostków z podkreśleniem, jak w if_lub _then. Wiodący znak podkreślenia jest często używany do wskazania prywatnych członków w programowaniu obiektowym.

Nazwy te mogą być interpretowane przez kompilator i mieć pewien wpływ, chociaż zwykle odbywa się to w fazie analizy semantycznej, a nie w fazie tokenizacji. Na przykład w Pythonie pojedynczy znak podkreślenia na początku jest słabym wskaźnikiem prywatnym i wpływa na to, które identyfikatory są importowane podczas importu modułu, podczas gdy podwójny znak podkreślenia na początku (i nie więcej niż jeden znak podkreślenia na końcu) w atrybucie klasy wywołuje name mangling .

Zarezerwowane słowa

Podczas gdy współczesne języki generalnie używają zastrzeżonych słów zamiast obcinania, aby odróżnić słowa kluczowe od identyfikatorów – np. ifzastrzeżenie – często rezerwują również klasę składniową identyfikatorów jako słowa kluczowe, dając reprezentacje, które można interpretować jako reżim ograniczania, ale zamiast tego mają semantykę zastrzeżone słowa.

Jest to najbardziej godne uwagi w C, gdzie identyfikatory zaczynające się od podkreślenia są zarezerwowane, chociaż dokładne szczegóły dotyczące tego, które identyfikatory są zarezerwowane w jakim zakresie są zaangażowane, oraz wiodące podwójne znaki podkreślenia są zarezerwowane do dowolnego użytku; podobnie w C++ każdy identyfikator zawierający podwójne podkreślenie jest zarezerwowany do dowolnego użytku, podczas gdy identyfikator rozpoczynający się podkreśleniem jest zarezerwowany w przestrzeni globalnej. W ten sposób można dodać nowe słowo kluczowe fooużywając słowa zastrzeżonego __foo. Chociaż jest to powierzchownie podobne do stropingu, semantyka jest inna. Jako słowo zastrzeżone ciąg __fooreprezentuje identyfikator __foowe wspólnej przestrzeni nazw identyfikatora. W stropping (przez poprzedzenie słów kluczowych przez __) ciąg __fooreprezentuje słowo kluczowe foow oddzielnej przestrzeni nazw słów kluczowych. Tak więc używając słów zastrzeżonych, tokeny dla __fooi foosą (identyfikator, __foo) i (identyfikator, foo) – różne wartości w tej samej kategorii – podczas gdy w skróceniu tokenów dla __fooi foosą (słowo kluczowe, foo) i (identyfikator, foo) – to samo wartości w różnych kategoriach. Rozwiązują one ten sam problem kolizji przestrzeni nazw w sposób, który jest taki sam dla programisty, ale różni się pod względem gramatyki formalnej i implementacji.

Manglowanie nazw

Mangling nazw również rozwiązuje konflikty nazw poprzez zmianę nazw identyfikatorów, ale robi to znacznie później podczas kompilacji, podczas analizy semantycznej, a nie podczas tokenizacji. Polega to na tworzeniu nazw zawierających informacje o zakresie i typie, głównie do użytku przez konsolidatory, zarówno w celu uniknięcia kolizji, jak i dołączenia niezbędnych informacji semantycznych w samej nazwie. W tych przypadkach oryginalne identyfikatory mogą być identyczne, ale kontekst jest inny, jak w funkcjach foo(int x)versus foo(char x), w obu przypadkach mających ten sam identyfikator foo, ale inną sygnaturę. Nazwy te mogą być zniekształcone foo_ii foo_c, na przykład, zawierać informacje o typie.

pieczęć

Syntaktycznie podobnym, ale semantycznie różnym zjawiskiem są sigile , które zamiast tego wskazują na właściwości zmiennych. Są one powszechne w Perl , Ruby i różnych innych językach do identyfikowania cech zmiennych/stałych: Perl do oznaczania typu zmiennej, Ruby do odróżniania zmiennych od stałych i do wskazywania zakresu. Zauważ, że wpływa to na semantykę zmiennej, a nie na składnię tego, czy jest to identyfikator, czy słowo kluczowe.

Paralele w ludzkim języku

Stropping jest używany w językach programowania komputerowego w celu ułatwienia pracy kompilatora (a ściślej parsera ), tj. w zakresie możliwości stosunkowo małych i wolnych komputerów dostępnych we wczesnych dniach informatyki w XX wieku. Jednak podobne techniki są powszechnie stosowane, aby ułatwić ludziom czytanie ze zrozumieniem. Oto kilka przykładów:

  • Umieszczanie ważnych słów pogrubioną czcionką , takich jak pierwsza wzmianka o skróceniu na początku tej strony, ponieważ zdefiniowanie skrócenia jest głównym celem strony.
  • Formatowanie nowych słów kursywą podczas ich pierwszego wprowadzenia w tekście. Jest to powszechnie stosowane w science fiction i fantasy przy wprowadzaniu wymyślonych roślin, żywności, stworzeń; w dzienniku podróżniczym i piśmiennictwie historycznym przy opisie nieznanych słów obcych; i tak dalej. Również użycie specjalnej czcionki, prawdopodobnie powiązanej z danym językiem, na przykład użycie czcionki gotyckiej dla słów niemieckich .
  • Używanie innego języka, zazwyczaj łacińskiego lub greckiego do oznaczania terminów technicznych. Jest to podobne do używania słów zastrzeżonych, ale zwykle łączy się je z tekstem kursywą, aby ułatwić czytelność. Na przykład:
  • W pisanym języku japońskim , oprócz znaków Kanji , dwa odrębne alfabety (ściślej, sylabariusze ) Hiragana i Katakana , oba reprezentujące ten sam zestaw dźwięków, są używane do odróżnienia fonetycznie napisanych japońskich słów od importowanych słów obcych; Katakana jest również używana do podkreślenia, podobnie jak kursywa w języku angielskim.

Zobacz też

Uwagi

Bibliografia

Dalsza lektura