Stropping (Syntax) – Wikipedia

before-content-x4

Im Computersprachendesign streicheln ist eine Methode zum expliziten Markieren von Buchstabenfolgen mit einer besonderen Eigenschaft, z. B. einem Schlüsselwort oder einem bestimmten Typ von Variable oder Speicherort, und damit dem Besetzen eines anderen Namespace als gewöhnliche Namen (“Bezeichner”), um Konflikte zu vermeiden . Stropping wird in den meisten modernen Sprachen nicht verwendet. Stattdessen sind Schlüsselwörter reservierte Wörter und können nicht als Bezeichner verwendet werden. Durch das Stroppen kann dieselbe Buchstabenfolge sowohl als Schlüsselwort als auch als Bezeichner verwendet werden, und das Parsen wird in diesem Fall vereinfacht – beispielsweise durch Zulassen einer Variablen mit dem Namen if ohne mit dem Schlüsselwort zu kollidieren wenn.

after-content-x4

Stropping wird in den 1960er Jahren hauptsächlich mit ALGOL und verwandten Sprachen in Verbindung gebracht. Obwohl es eine moderne Verwendung findet, ist es leicht mit anderen ähnlichen Techniken zu verwechseln, die oberflächlich ähnlich sind.

Geschichte[edit]

Die Methode des Abstreifens und der Begriff “Abstreifen” entstanden in der Entwicklung von ALGOL in den 1960er Jahren, als es zur Darstellung typografischer Unterscheidungen (Fettdruck und Unterstreichung) in der Publikationssprache verwendet wurde, die in der Hardwaresprache nicht direkt dargestellt werden konnten – a Schreibmaschine konnte fette Zeichen haben, aber beim Codieren in Lochkarten gab es keine fetten Zeichen. Der Begriff “Abstreifen” entstand in ALGOL 60 aus “Apostroph”, da einige Implementierungen von ALGOL 60 Apostrophe um Text verwendeten, um Fettdruck anzuzeigen.[1] sowie 'if' um das Schlüsselwort darzustellen wenn. Das Abstreifen ist auch in ALGOL 68 wichtig, wo mehrere Verfahren des Abstreifens verwendet werden, die als “Abstreifregime” bekannt sind; Die ursprünglich übereinstimmenden Apostrophe aus ALGOL 60 waren nicht weit verbreitet, wobei eine führende Periode oder ein Großbuchstabe häufiger vorkommt.[2] wie in .IF oder IF und der Begriff “Abstreifen” wurde auf alle diese angewendet.

Syntaxen[edit]

Es wurden verschiedene Syntaxen für das Strippen verwendet:

  • Algol 60 verwendete üblicherweise nur die Konvention von einfachen Anführungszeichen um das Wort, im Allgemeinen als Apostrophe, woher der Name “strippen” (z 'BEGIN').
  • Algol 68[3][2] In einigen Implementierungen werden Buchstabenfolgen, denen ein einfaches Anführungszeichen vorangestellt ist, als Schlüsselwörter behandelt (z. 'BEGIN)[4]

Tatsächlich war es häufig der Fall, dass mehrere Stripping-Konventionen in einer Sprache verwendet wurden. In ALGOL 68 kann die Wahl der Stropping-Konvention beispielsweise durch eine Compiler-Direktive (in der ALGOL-Terminologie ein “Pragmat”) festgelegt werden, nämlich POINT, UPPER, QUOTE oder RES:

  • PUNKT für 6-Bit (nicht genügend Zeichen für Kleinbuchstaben), wie in .FOR – Eine ähnliche Konvention wird in FORTRAN 77 verwendet, wo LOGICAL-Schlüsselwörter als gestrichen werden .EQ. usw. (siehe unten)
  • UPPER für 7-Bit, wie in FOR – mit Kleinbuchstaben für gewöhnliche Bezeichner
  • ZITAT wie in ALGOL 60, wie in 'for'
  • RES reservierte Wörter, wie sie in modernen Sprachen verwendet werden – for ist reserviert und für normale Kennungen nicht verfügbar

Die verschiedenen Regelregime sind eine lexikalische Spezifikation für gestreifte Zeichen, obwohl diese in einigen Fällen einfache Interpretationen haben: In den einzelnen Apostroph- und Punktregimen fungiert das erste Zeichen als Fluchtzeichen, während im übereinstimmenden Apostrophregime die Apostrophe funktionieren Trennzeichen, wie in String-Literalen.

Andere Beispiele:

after-content-x4
  • Atlas Autocode hatte die Wahl zwischen drei: Schlüsselwörter könnten sein underlined Mit Rücktaste und Überstrich auf einer Flexowriter-Tastatur könnten sie durch a eingeführt werden %percent %symbol, oder sie könnten eingegeben werden UPPER CASE ohne Begrenzungszeichen (Modus “Großbuchstaben”, in diesem Fall mussten alle Variablen in Kleinbuchstaben geschrieben werden).
  • ALGOL 68RS-Programme können auch innerhalb eines Sprachprozessors mehrere Stropping-Varianten verwenden.
  • Edinburgh IMP hat den Atlas Autocode geerbt %percent %symbol Präfixkonvention, aber nicht die anderen Stropping-Optionen

Beispiele für verschiedene ALGOL 68-Stile[edit]

Beachten Sie die führenden pr (Abkürzung von Pragmat) Direktive, die selbst im POINT- oder Quote-Stil gestrichen wird, und die ¢ für einen Kommentar (von ““) – siehe ALGOL 68: pr & co: Pragmats und Kommentare für Details.

Algol68 “streng”
wie typischerweise veröffentlicht
Zitat strippen
(wie Wikitext)
Für ein 7-Bit-Zeichen
Code-Compiler
Für ein 6-Bit-Zeichen
Code-Compiler
Algol68 mit Res Stropping
(reserviertes Wort)
¢ underline or
   bold typeface ¢
 mode xint = int;
 xint sum sq:=0;
 for i while
   sum sq≠70×70
 do
   sum 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

Andere Sprachen[edit]

Aus verschiedenen Gründen hat Fortran 77 diese “logischen” Werte und Operatoren: .WAHR., .FALSCH., .EQ., .NE., .LT., .LE., .GT., .GE., .EQV., .NEQV., .ODER., .UND., .NICHT.[5]

.UND., .ODER. und .XOR. werden auch in kombinierten Tests in verwendet IF und IFF Anweisungen in Batch-Dateien werden unter den Befehlszeilenprozessoren von JP Software wie 4DOS ausgeführt.[6]4OS2 und 4NT / Take Command.

Moderne Nutzung[edit]

Die meisten modernen Computersprachen verwenden kein Stropping, mit zwei bemerkenswerten Ausnahmen:

Die Verwendung vieler Sprachen in der .NET Common Language Infrastructure (CLI) von Microsoft erfordert eine Möglichkeit, Variablen in einer anderen Sprache zu verwenden, bei denen es sich möglicherweise um Schlüsselwörter in einer aufrufenden Sprache handelt. Dies geschieht manchmal durch Präfixe wie @ in C # oder in Klammern in Visual Basic.NET.

Ein zweites wichtiges Beispiel sind viele Implementierungen von Structured Query Language. In diesen Sprachen können reservierte Wörter als Spalten-, Tabellen- oder Variablennamen verwendet werden, indem sie lexikalisch abgegrenzt werden. Der Standard legt fest, dass reservierte Wörter in doppelte Anführungszeichen gesetzt werden. In der Praxis variiert der genaue Mechanismus jedoch je nach Implementierung. Mit MySQL können beispielsweise reservierte Wörter in anderen Kontexten verwendet werden, indem sie in Backticks eingeschlossen werden, und Microsoft SQL Server verwendet eckige Klammern.

Stropping kann auch in der Programmiersprache Nim verwendet werden. In Nim kann ein reserviertes Wort als Bezeichner verwendet werden, indem es in Backticks eingeschlossen wird.

Es gibt andere, kleinere Beispiele. Beispielsweise verwendet Web IDL einen führenden Unterstrich _ Um Identifikatoren zu stoppen, die ansonsten mit reservierten Wörtern kollidieren: Der Wert des Identifikators entfernt diesen führenden Unterstrich und führt zu diesem Abstreifen und nicht zu einer Namenskonvention.[7]

Vom Compiler abbrechen[edit]

In einem Compiler-Frontend trat das Auflösen ursprünglich während einer anfänglichen Zeilenrekonstruktionsphase auf, wodurch auch Leerzeichen eliminiert wurden. Darauf folgte eine scannerlose Analyse (keine Tokenisierung); Dies war in den 1960er Jahren Standard, insbesondere für ALGOL. In der modernen Verwendung erfolgt das Auflösen im Allgemeinen im Rahmen der lexikalischen Analyse. Dies ist klar, wenn man den Lexer in zwei Phasen von Scanner und Evaluator unterscheidet: Der Scanner kategorisiert die gestreifte Sequenz in die richtige Kategorie, und der Evaluator löst sich bei der Berechnung des Werts. Beispielsweise wird in einer Sprache, in der ein anfänglicher Unterstrich verwendet wird, um Bezeichner zu löschen, um Kollisionen mit reservierten Wörtern zu vermeiden, die Sequenz _if würde als Bezeichner kategorisiert (nicht als reserviertes Wort if) durch den Scanner, und dann würde der Bewerter diesem den Wert geben ifnachgiebig (Identifier, if) als Token-Typ und Wert.

Ähnliche Techniken[edit]

Es gibt eine Reihe ähnlicher Techniken, bei denen im Allgemeinen ein Bezeichner vorangestellt oder angehängt wird, um eine unterschiedliche Behandlung anzuzeigen, aber die Semantik ist unterschiedlich. Genau genommen besteht das Strippen aus verschiedenen Darstellungen desselben Namens (Werts) in verschiedenen Namespaces und erfolgt in der Tokenisierungsphase. Zum Beispiel in ALGOL 60 mit abgestimmtem Apostrophstreifen, 'if' wird als (Schlüsselwort, wenn) gekennzeichnet, während if ist tokenisiert als (Identifier, if) – gleicher Wert in verschiedenen Token-Klassen.

Die Verwendung von Großbuchstaben für Schlüsselwörter wird weiterhin als Konvention zum Schreiben von Grammatiken zum Lexen und Parsen verwendet – Tokenisieren des reservierten Wortes if als Token-Klasse IF und dann als If-Then-else-Klausel durch die Phrase IF Expression THEN Statement ELSE Statement Dabei sind Großbuchstaben Schlüsselwörter und großgeschriebene Begriffe nicht terminale Symbole in einer Produktionsregel (Endsymbole werden durch Kleinbuchstaben bezeichnet, z identifier oder integerfür ein ganzzahliges Literal).

Regeln der Namensgebung[edit]

Am lockersten kann man Namenskonventionen verwenden, um Konflikte zu vermeiden, bei denen häufig ein Unterstrich vorangestellt oder mit einem Suffix versehen wird, wie in if_ oder _then. Ein führender Unterstrich wird häufig verwendet, um private Mitglieder in der objektorientierten Programmierung anzuzeigen.

Diese Namen können vom Compiler interpretiert werden und haben eine gewisse Wirkung, obwohl dies im Allgemeinen in der semantischen Analysephase und nicht in der Tokenisierungsphase erfolgt. In Python ist beispielsweise ein einzelner führender Unterstrich ein schwacher privater Indikator und beeinflusst, welche Bezeichner beim Modulimport importiert werden, während ein doppelter führender Unterstrich (und nicht mehr als ein nachfolgender Unterstrich) in einem Klassenattribut die Namensverfälschung aufruft.[8]

Reservierte Wörter[edit]

Während moderne Sprachen im Allgemeinen reservierte Wörter verwenden, anstatt zu streichen, um Schlüsselwörter von Bezeichnern zu unterscheiden – z if reserviert – Sie reservieren häufig auch eine syntaktische Klasse von Bezeichnern als Schlüsselwörter, wodurch Darstellungen erhalten werden, die als Stripping-Regime interpretiert werden können, aber stattdessen die Semantik reservierter Wörter haben.

Dies ist am bemerkenswertesten in C, wo Bezeichner, die mit einem Unterstrich beginnen, reserviert sind, obwohl die genauen Details, welche Bezeichner in welchem ​​Bereich reserviert sind, und führende doppelte Unterstriche für jede Verwendung reserviert sind;[9] ähnlich in C ++ jede Kennung, die enthält Ein doppelter Unterstrich ist für jede Verwendung reserviert, während ein Bezeichner, der mit einem Unterstrich beginnt, im globalen Bereich reserviert ist.[nb 1] Somit kann man ein neues Schlüsselwort hinzufügen foo mit dem reservierten Wort __foo. Während dies oberflächlich dem Strippen ähnlich ist, ist die Semantik unterschiedlich. Als reserviertes Wort die Zeichenfolge __foo repräsentiert die Kennung __foo im gemeinsamen Bezeichner-Namespace. Beim Strippen (durch Präfixieren von Schlüsselwörtern durch __), die Saite __foo repräsentiert das Schlüsselwort foo in einem separaten Schlüsselwort-Namespace. So werden mit reservierten Wörtern die Token für __foo und foo sind (bezeichner, __foo) und (bezeichner, foo) – unterschiedliche Werte in derselben Kategorie – während beim Entfernen der Token für __foo und foo sind (Schlüsselwort, foo) und (Bezeichner, foo) – gleiche Werte in verschiedenen Kategorien. Diese lösen das gleiche Problem von Namespace-Konflikten auf eine Weise, die für einen Programmierer gleich ist, sich jedoch in Bezug auf formale Grammatik und Implementierung unterscheidet.

Name Mangling[edit]

Bei der Namensverknüpfung werden auch Namenskonflikte durch Umbenennen von Bezeichnern behoben, dies geschieht jedoch viel später bei der Kompilierung, während der semantischen Analyse und nicht während der Tokenisierung. Dies besteht darin, Namen zu erstellen, die Informationen zu Umfang und Typ enthalten, hauptsächlich zur Verwendung durch Linker, um Konflikte zu vermeiden und die erforderlichen semantischen Informationen in den Namen selbst aufzunehmen. In diesen Fällen können die ursprünglichen Bezeichner identisch sein, aber der Kontext ist anders als in den Funktionen foo(int x) gegen foo(char x)in beiden Fällen mit der gleichen Kennung foo, aber andere Unterschrift. Diese Namen könnten verstümmelt werden foo_i und foo_cB. um die Typinformationen einzuschließen.

Siegel[edit]

Ein syntaktisch ähnliches, aber semantisch unterschiedliches Phänomen sind Siegel, die stattdessen Eigenschaften von Variablen anzeigen. Diese sind in Perl, Ruby und verschiedenen anderen Sprachen üblich, um Merkmale von Variablen / Konstanten zu identifizieren: Perl, um den Variablentyp zu bestimmen, Ruby, um Variablen von Konstanten zu unterscheiden und den Umfang anzugeben. Beachten Sie, dass dies Auswirkungen auf die Semantik der Variablen, nicht die Syntax ob es sich um einen Bezeichner oder ein Schlüsselwort handelt.

Parallelen in der menschlichen Sprache[edit]

Stropping wird in Computerprogrammiersprachen verwendet, um die Arbeit des Compilers (oder genauer gesagt des Parsers) zu erleichtern, dh im Rahmen der Möglichkeiten der relativ kleinen und langsamen Computer, die in den frühen Tagen des Rechnens im 20. Jahrhundert verfügbar waren. Ähnliche Techniken wurden jedoch häufig verwendet, um das Leseverständnis auch für Menschen zu verbessern. Einige Beispiele sind:

  • Wichtige Wörter einfügen Fett gedruckt, wie die allererste Erwähnung von streicheln am Anfang dieser Seite, da das Definieren von Stropping der eigentliche Zweck der Seite ist.
  • Formatieren neuer Wörter in kursiv wenn sie zum ersten Mal in Text eingeführt werden. Dies wird häufig in Science-Fiction und Fantasy verwendet, wenn erfundene Pflanzen, Lebensmittel und Kreaturen eingeführt werden. im Reisebericht und im historischen Schreiben bei der Beschreibung unbekannter Fremdwörter; und so weiter. Verwenden Sie auch eine spezielle Schriftart, die möglicherweise mit der betreffenden Sprache verknüpft ist, z. B. eine gotische Schriftart für deutsche Wörter.
  • Verwendung einer anderen Sprache, normalerweise Latein oder Griechisch, um Fachbegriffe zu kennzeichnen. Dies ähnelt der Verwendung reservierter Wörter, wird jedoch normalerweise mit kursivem Text kombiniert, um die Lesbarkeit zu verbessern. Zum Beispiel:
  • Im geschriebenen Japanisch werden zusätzlich zu den Kanji-Zeichen die beiden unterschiedlichen Alphabete (genauer gesagt die Silben) Hiragana und Katakana, die beide denselben Satz von Lauten darstellen, verwendet, um phonetisch buchstabierte japanische Wörter von importierten Fremdwörtern zu unterscheiden. Katakana wird auch zur Hervorhebung verwendet, ähnlich wie Kursivschrift auf Englisch.

Siehe auch[edit]

  1. ^ Es gibt andere Einschränkungen, z. B. eine Kennung, die mit einem Unterstrich beginnt, gefolgt von einem Großbuchstaben.

Verweise[edit]

  1. ^ König, Peter R., ed. (1974-06-18). “(Unbekannt)”. Tagungsband einer internationalen Konferenz zur Umsetzung von ALGOL 68. Institut für Informatik, Universität Manitoba, Winnipeg: Universität Manitoba, Institut für Informatik: 148. ISBN 9780919628113. Schwerwiegendere Probleme ergeben sich aus dem “Strippen”, der Technik, mit der fett gedruckter Text von römischem Text unterschieden wird. Einige Implementierungen erfordern Apostrophe um Fettdruck (woher der Name strippt); andere erfordern Rückraum und Unterstreichung; […]
  2. ^ ein b van Wijngaarden, Adriaan; Mailloux, Barry James; Peck, John Edward Lancelot; Koster, Cornelis Hermanus Antonius; Sintzoff, Michel;; Lindsey, Charles Hodgson; Meertens, Lambert Guillaume Louis Théodore; Fisker, Richard G., Hrsg. (1976). “Abschnitt 9.3 Darstellungen” (PDF). Überarbeiteter Bericht über die algorithmische Sprache ALGOL 68. Springer-Verlag. S. 94, 123. ISBN 978-0-387-07592-1. OCLC 1991170. Archiviert (PDF) vom Original am 19.04.2019. Abgerufen 2019-05-11.
  3. ^ http://www.fh-jena.de/~kleine/history/languages/Algol68-RR-HardwareRepresentation.pdf
  4. ^ Lindsey, Charles Hodgson; van der Meulen, Sietse G. (1977). Informelle Einführung in ALGOL 68. Nordholland. S. 348–349. ISBN 978-0-7204-0726-6. OCLC 230034877.
  5. ^ http://www.personal.psu.edu/jhm/f90/lectures/10.html
  6. ^ Brüder, Hardin; Rawson, Tom; Conn, Rex C.; Paul, Matthias R.; Dye, Charles E.; Georgiev, Luchezar I. (2002-02-27). 4DOS 8.00 Online-Hilfe.
  7. ^ Web IDL, “3.1. Namen“. […] Für alle diese Konstrukte ist der Bezeichner der Wert des Bezeichner-Tokens, wobei jedes einzelne führende U + 005F LOW LINE-Zeichen (“_”) (Unterstrich) entfernt wurde. […] Hinweis […] Ein führendes “_” wird verwendet, um zu verhindern, dass ein Bezeichner wie ein reserviertes Wort aussieht, sodass beispielsweise eine Schnittstelle mit dem Namen “Schnittstelle” definiert werden kann. Das führende “_” wird entfernt, um die Kennung zu entfernen. […]
  8. ^ PEP 008:: Beschreibend: Namensstile
  9. ^ C99-Standard, 7.1.3 Reservierte Kennungen

Weiterführende Literatur[edit]

after-content-x4