Werden heute Digraphen und Trigraphen verwendet? [closed]

Lesezeit: 7 Minuten

Benutzeravatar von rwallace
rwallace

Da gab es einmal Gründe zu verwenden Digraphen und Trigraphen in C und C++, fügt jemand sie in Code ein, der heute geschrieben wird? Gibt es eine beträchtliche Menge an Legacy-Code, der noch gewartet wird und diese enthält?

(Hinweis: Hier tut “digraph”. nicht bedeutet “gerichteter Graph”. Beide Digraph und Trigraph haben mehrere Bedeutungen, aber die beabsichtigte Verwendung hier sind Sequenzen wie ??= oder <: für Charaktere wie zu stehen # und [)

  • I’ve never once seen one (on purpose!), but I work in games which tends to be much much less in legacy code.

    – Michael Dorgan

    Sep 16, 2011 at 23:44

  • Have some fun with Google Code Search! For example: google.com/codesearch#search/… will look for instances of ??(

    – Ray Toal

    Sep 16, 2011 at 23:48

  • Don’t forget quotation marks! @Ray – Thank you. I will now spend an hour looking up cuss words and laughing at the bad code that comes with.

    – Anne Quinn

    Sep 17, 2011 at 0:40

  • @Ray – thanks, interesting! Clearly the vast majority of occurrences are in string literals and comments where ??(x) is pseudocode for a function call. The search is narrowed down by looking for ??< instead, which standing for { is essential in any C source. — there is not a single genuine example of a trigraph in all 14 pages of results. Mostly they are HTML pseudocode, with some compilers/compiler tests and base64 encoded text thrown in. (I’m interested because I’m writing a preprocessor for C++11 practice.)

    – Potatoswatter

    Sep 17, 2011 at 1:48


  • @Matthieu: But if you use such an option, your code becomes dependent on it, and either fails to compile or has a different meaning when compiled without the option. I’d rather have a warning so I can avoid trigraphs altogether.

    – Keith Thompson

    Sep 20, 2011 at 14:59

Keith Thompson's user avatar
Keith Thompson

I don’t know for sure, but you’re most likely to find digraphs and trigraphs being used in IBM mainframe environments. The EBCDIC character set doesn’t include some characters that are required for C.

The other justification for digraphs and trigraphs, 7-bit ASCII-ish character sets that replace some punctuation characters with accented letters, is probably less relevant today.

Outside such environments, I suspect that trigraphs are more commonly used by mistake than deliberately, as in:

puts("What happened??!");

For reference, trigraphs were introduced in the 1989 ANSI C standard (which essentially became the 1990 ISO C standard). They are:

??= #     ??) ]          ??!  |  ??( [     ??' ^     ??> }
??/ \     ??< {     ??- ~

The replacements occur anywhere in source code, including comments and string literals.

Digraphs are alternate spellings of certain tokens, and do not affect comments or literals:

<: [      :>   ]
<% { %> } %: # %:%: ##

Digraphen wurden durch die Änderung von 1995 zum ISO-C-Standard von 1990 eingeführt.

  • Diese 7-Bit-ASCII-ähnlichen Zeichensätze wurden 1972 als ISO-646 standardisiert und wurden bereits in den 1980er Jahren nicht mehr verwendet, um in den 1990er Jahren durch 8-Bit-ISO-8859-Varianten (einschließlich Windows-1252) ersetzt zu werden . Letztere enthalten alle 7-Bit-ASCII-Zeichen und benötigen keine Trigraphen im C-Code. Wenn es noch ältere ISO-646-Systeme gibt, sind sie so lange veraltet, dass niemand mehr neuen C-Code für sie schreiben wird.

    – Han

    17. September 2011 um 6:14 Uhr

  • Und in diesem Fall schreiben puts("What happened?" "?!\n"); um die richtige Ausgabe zu bekommen.

    – Gzorg

    6. Dezember 2012 um 18:52 Uhr

  • @Gzorg Die Trigraphen können auch umgangen werden, indem das zweite ‘?’ daher: puts("What happened?\?!\n");

    – Rhabarber

    18. Juni 2013 um 8:42 Uhr

  • Tatsächlich war einer der sekundären Gründe für Trigraphen (nach EBCDIC), dass zahlreiche Minicomputer der 1970er und 80er Jahre mit Terminaltastaturen ausgestattet waren, die der heutigen Standardisierung von PC / Apple-Tastaturen sehr entgegenkamen. Jeder Anbieter hatte sein eigenes Tastaturlayout, manchmal mit Variationen in verschiedenen Zeilen. Auf einigen Terminals war es nicht einfach oder direkt möglich, einige Symbole einzugeben, zum Beispiel die Tilde, ‘~’ oder sogar das “(commercial) at”-Symbol ‘@’, daher die Notwendigkeit. Ich glaube nicht, dass C andere IBM-Systeme als Nicht-ASCII-Systeme implementiert hat.

    – mctylr

    26. August 2014 um 20:23 Uhr

  • @mctylr Viele Mikrocomputer der späten 70er und frühen 90er Jahre folgten auch nicht den IBM Selectric- oder PC-Standards und verfügten nicht über alle erforderlichen Zeichen, um die Verwendung zu vermeiden n-Grafiken. Zum Beispiel enthielt Ataris Variante von ASCII, die auf ihren 8-Bit-Maschinen verwendet wurde, ATASCII, weder die geschweiften Klammern noch den vertikalen Balken. Um den Spaß noch zu steigern, habe ich auf dieser Maschine einen C-Compiler verwendet, der nicht standardmäßige Bigraphen verwendete —(* und *) für die öffnenden und schließenden geschweiften Klammern.

    – Weiche der Dampfwalze aus

    1. September 2015 um 1:08 Uhr

Da ist ein Vorschlag für C++1z anhängig (der nächste Standard nach C++1y wird hoffentlich in C++14 standardisiert), der darauf abzielt, Trigraphen aus dem Standard zu entfernen. Sie führten eine Fallstudie zu einer ansonsten nicht veröffentlichten großen Codebasis durch:

Fallstudie

Die Verwendung von Trigraph-ähnlichen Konstrukten in einer großen Codebasis wurde untersucht. Wir entdeckten:

923 Fälle eines entkommenen ? in einem String-Literal, um Trigraph-Ersetzungen zu vermeiden: string pattern() const { return “foo-????\?-of-???????”; }

4 Instanzen von Trigraphen, die absichtlich im Testcode verwendet werden: zwei in der Testsuite für einen Compiler, die anderen zwei in einer Testsuite für die Präprozessorbibliothek von Boost.

0 Fälle von Trigraphen, die absichtlich im Produktionscode verwendet werden. Trigraphen stellen weiterhin eine Belastung für Benutzer von C++ dar.

Die Anmerkungen zum Vorschlag (fette Hervorhebung aus dem ursprünglichen Vorschlag):

Wenn Trigraphen vollständig aus der Sprache entfernt werden, kann eine Implementierung, die sie unterstützen möchte, dies weiterhin tun: Ihre implementierungsdefinierte Zuordnung von physischen Quelldateizeichen zum grundlegenden Quellzeichensatz kann eine Trigraphenübersetzung enthalten (und kann dies sogar innerhalb von vermeiden unformatierte Zeichenfolgenliterale). Aus Gründen der Abwärtskompatibilität benötigen wir im Standard keine Trigraphen.

  • Aber was passiert dann mit all den entkommenen Trigraphen??!

    – Praxeolit

    30. September 2014 um 5:22 Uhr

  • @Praxeolitic Ich sehe, was du dort gemacht hast. Wisse, dass dein Witz vier Jahre später geschätzt wird. Zur eigentlichen Frage, \? weiterhin wörtlich darstellen ? Zeichen, da es sich um eine der definierten Escape-Sequenzen handelt, unabhängig davon, ob Trigraphen vorhanden sind oder nicht.

    – mtraceur

    24. Mai 2018 um 21:57 Uhr

  • Ich stimme zu, dass einige der seltsam aussehenden Trigraphen/Digraphen entfernt werden sollten, aber es gibt nützliche Trigraphen/Digraphen wie z and , or, not, bitand, not_eq was sehr explizit aussah und daher die Codeabsicht erzwingt.

    – Wahrheitsanpasser

    23. Juli 2018 um 21:33 Uhr

Sie können verwendet werden für Der internationale Wettbewerb für verschleierten C-Code.

  • Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzufügen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert.

    – ChrisH

    24. Juni 2014 um 16:15 Uhr

  • @ChrisH: IMO ist der Link nicht die Antwort (dh dies ist keine Nur-Link-Antwort). Der Link wird nur der Einfachheit halber hinzugefügt.

    – undur_gongor

    16. Juli 2014 um 13:10 Uhr

  • @undur_gongor Fair genug. Aber ich denke, da es eine Antwort auf eine fast 3 Jahre alte Frage ist, die mit einer Antwort von mehr als 17 Stimmen akzeptiert wurde, ist es eher akademisch.

    – ChrisH

    16. Juli 2014 um 16:31 Uhr


Die Verwendung von Tri- und Di-Graphen ist heutzutage nicht mehr geschrieben, sie existiert nur in sehr altem Code, der in einer sehr begrenzten Umgebung erstellt wurde. Jeder Code, der Trigraphen enthält, wird normalerweise nicht kompiliert, wenn Sie versuchen, ihn auf einem modernen Compiler wie dem von VS zu kompilieren, es sei denn, Sie geben eine Linker-Option an. Ich weiß, dass für Visual Studio diese Option “/Zc:trigraphs” ist.

Sie existieren, weil das C++-Komitee niemals Änderungen herausgibt, die Legacy-Code ‘brechen’ würden. Zum Besseren oder zum Schlechteren. Es gibt eine Anekdote, dass ihre Entfernung vorgeschlagen und unterstützt wurde, und dass sie von einem einzelnen IBM-Vertreter gestoppt wurde.

Ich weiß, dass dies eine alte Frage ist, aber heutzutage gibt es wohl eine legitime Verwendung: Touchscreens ohne tatsächliche Tastatur. Beispielsweise ist das typische US-Tastaturlayout nicht unbedingt in voller Form verfügbar, wenn Sie etwas über Tablet oder ähnliches programmieren, was zugegebenermaßen selten ist, da es so umständlich sein kann (drei Klicks auf meins für einen Zuordnungsoperator). . Ich persönlich verwende sie nach Möglichkeit nicht, aber sie sind nützlich, wenn die eigentlichen Token fehlen, die sie darstellen sollen.

Auch hier hoffe ich wirklich, dass die Leute dies nach Möglichkeit vermeiden, aber es ist ein Grund, sie zu kennen und zu verwenden.

1398790cookie-checkWerden heute Digraphen und Trigraphen verwendet? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy