Digrafy a trigrafy - Digraphs and trigraphs

V počítačovém programování jsou digrafy a trigrafy sekvence dvou a tří znaků , které se objevují ve zdrojovém kódu a podle specifikace programovacího jazyka by s nimi mělo být zacházeno, jako by se jednalo o jednotlivé znaky.

Pro používání digrafů a trigrafů existují různé důvody: klávesnice nemusí mít klávesy pokrývající celou znakovou sadu jazyka, zadávání speciálních znaků může být obtížné, textové editory si mohou vyhradit některé znaky pro speciální použití atd. Trigrafy mohou být také použity pro některé kódové stránky EBCDIC, které postrádají znaky jako a . {}

Dějiny

Základní znaková sada programovacího jazyka C je podmnožinou znakové sady ASCII, která obsahuje devět znaků, které leží mimo invariantní znakovou sadu ISO 646 . To může představovat problém při psaní zdrojového kódu, když použité kódování (a případně klávesnice ) nepodporuje žádný z těchto devíti znaků. Výbor ANSI C vynalezl trigrafy jako způsob zadávání zdrojového kódu pomocí klávesnic, které podporují jakoukoli verzi znakové sady ISO 646.

Implementace

Trigrafy se mimo testovací sady kompilátorů běžně nevyskytují . Některé kompilátory podporují možnost vypnout rozpoznávání trigrafů nebo ve výchozím nastavení deaktivovat trigrafy a vyžadují možnost je zapnout. Někteří mohou vydávat varování, když narazí na trigrafy ve zdrojových souborech. Společnost Borland dodala samostatný program, preprocesor trigraph ( ), který bude použit pouze v případě, že je požadováno zpracování trigrafu (důvodem bylo maximalizovat rychlost kompilace). TRIGRAPH.EXE

Jazyková podpora

Různé systémy definují různé sady digrafů a trigrafů, jak je popsáno níže.

ALGOL

Dřívější verze ALGOLu předcházely standardizovaným znakovým sadám ASCII a EBCDIC a byly obvykle implementovány pomocí šestibitového znakového kódu specifického pro výrobce . Řada operací ALGOL buď neměla k dispozici kódové body v dostupné znakové sadě, nebo nebyla podporována periferiemi, což vedlo k řadě náhrad, včetně :=pro (přiřazení) a >=pro (větší nebo rovno).

Pascal

Pascal programovací jazyk podporuje digraphs (., .), (*a *)pro [, ], {a }resp. Na rozdíl od všech ostatních zde uvedených případů, (*a *)byly a stále jsou v širokém používání. Mnoho kompilátorů je však považuje za jiný typ bloku komentářů než za skutečné digrafy, to znamená, že komentář, který začal, (*nelze zavřít }a naopak.

J.

Programovací jazyk J je potomek APL , ale používá znakovou sadu ASCII a nikoli APL symboly . Protože je tisknutelný rozsah ASCII menší než specializovaná sada symbolů APL, používají se znaky .(tečka) a :(dvojtečka) k skloňování symbolů ASCII, což efektivně interpretuje unigrafy, digrafy nebo zřídka trigrafy jako samostatné „symboly“.

Na rozdíl od použití digrafů a trigrafů v C a C ++ neexistují v J. žádné jednoznakové ekvivalenty.

C

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

C preprocesor (pro C, a s mírnými rozdíly v C ++ , viz níže ), nahradí všechny výskyty devíti trigraph sekvencí v této tabulce o jejich jedno-znakové ekvivalenty, než jakékoliv jiné zpracování.

Programátor může chtít umístit dva otazníky k sobě, ale kompilátor s nimi nebude zacházet jako se zavedením trigrafu. C gramatika nedovoluje dva po sobě jdoucí ?žetony, takže jediná místa v souboru C, kde mohou být použity dva otazníky v řadě jsou v multi-znakových konstant, řetězcové literály a komentáře. To je obzvláště problém pro klasický Mac OS , kde konstantu '????'lze použít jako typ souboru nebo tvůrce. K bezpečnému umístění dvou po sobě jdoucích otazníků v řetězcovém literálu může programátor použít zřetězení řetězců "...?""?..."nebo únikovou sekvenci "...?\?..." .

???není sama o sobě sekvence trigrafu, ale když za ní následuje znak, jako -je, bude interpretován jako ?+ ??-, jako v příkladu níže, který má 16 ?s před /.

??/Trigraph mohou být použity pro zavedení ukončený konec řádku pro vedení sestřihu; toto musí být vzato v úvahu pro správné a efektivní zpracování trigrafů v preprocesoru. Může to také způsobit překvapení, zejména v komentářích. Například:

 // Will the next line be executed????????????????/
 a++;

což je jeden řádek logických komentářů (používá se v C ++ a C99 ), a

 /??/
 * A comment *??/
 /

což je správně vytvořený blokový komentář. Koncept lze použít ke kontrole trigrafů jako v následujícím příkladu C99, kde bude proveden pouze jeden návratový příkaz.

int trigraphsavailable() // returns 0 or 1; language standard C99 or later
{
	// are trigraphs available??/
	return 0;
	return 1;
}
Alternativní digrafy zavedené ve standardu C v roce 1994
Digraph Ekvivalent
<: [
:> ]
<% {
%> }
%: #

V roce 1994 dodávala normativní změna standardu C zahrnutého v C99 digrafy jako čitelnější alternativy k pěti trigrafům.

Na rozdíl od trigrafů jsou digrafy zpracovávány během tokenizace a jakýkoli digraf musí vždy představovat celý token sám, nebo musí token sestavit tak, aby %:%:nahradil token zřetězení preprocesoru ##. Pokud dojde k sekvenci digrafu uvnitř jiného tokenu, například v citovaném řetězci nebo znakové konstantě, nebude nahrazen.

C ++

Žeton Ekvivalent
compl ~
not !
bitand &
bitor |
and &&
or ||
xor ^
and_eq &=
or_eq |=
xor_eq ^=
not_eq !=

C ++ (až C ++ 14 , viz níže ) se chová jako C, včetně přírůstků C99, ale s dalšími tokeny uvedenými v tabulce.

Jako poznámka %:%:je považován za jeden token, nikoli za dva výskyty %:.

Standard C ++ uvádí tento komentář s ohledem na výraz „digraph“:

Termín „digraph“ (token skládající se ze dvou znaků) není zcela popisný, protože jeden z alternativních tokenů předzpracování je %:%:a samozřejmě několik primárních tokenů obsahuje dva znaky. Nicméně tyto alternativní tokeny, které nejsou lexikálními klíčovými slovy, jsou hovorově označovány jako „digrafy“.

Trigrafy byly navrženy k ukončení podpory v C ++ 0x , který byl vydán jako C ++ 11 . Proti tomu byla IBM , která hovořila jménem sebe i ostatních uživatelů C ++, a v důsledku toho byly v C ++ 11 zachovány trigrafy. Trigrafy pak byly znovu navrženy k odstranění (nejen zastarání) v C ++ 17 . Toto prošlo hlasováním ve výboru a trigrafy (ale ne další tokeny) jsou z C ++ 17 odstraněny navzdory odporu ze strany IBM. Stávající kód, který používá trigrafy, lze podpořit překladem ze zdrojových souborů (analýza trigrafů) do základní zdrojové znakové sady, která trigrafy neobsahuje.

RPL

Kalkulačky Hewlett-Packard podporující jazyk RPL a vstupní metodu poskytují podporu pro velký počet trigrafů (nazývaných také kódy TIO ) pro spolehlivý přepis nesedmbitových znaků ASCII rozšířené znakové sady kalkulaček na zahraničních platformách a pro usnadnění klávesnice vstup bez použití aplikace CHARS . První znak všech kódů TIO je a \, za ním dva další znaky ASCII nejasně připomínající nahrazovaný glyf. Všechny ostatní znaky lze zadat pomocí speciální \nnnsyntaxe kódu TIO, přičemž nnn je třímístné desítkové číslo (v případě potřeby s úvodními nulami ) odpovídajícího kódového bodu (čímž formálně představuje tetragraf ).

Podpora aplikace

Vim

Vim textový editor podporuje digraphs pro skutečného vstupu textových znaků, po RFC  1345 . Vstup digrafů je ve výchozím nastavení vázán na Ctrl+ K. Seznam všech možných digrafů ve Vimu lze zobrazit zadáním :dig.

Obrazovka GNU

Obrazovka GNU má příkaz digraph, ve výchozím nastavení vázaný na Ctrl+ A Ctrl+ V.

Lotus

Lotus 1-2-3 pro DOS používá Alt+ F1jako klíč pro psaní, což umožňuje snadnější zadávání mnoha speciálních znaků sady Lotus International Character Set (LICS) a Lotus Multi-Byte Character Set (LMBCS).

Viz také

Reference

externí odkazy