コンピュータプログラミング において、ダイグラフとトライグラフはそれぞれ2文字と3文字のシーケンスであり、ソースコードに現れ、プログラミング言語の仕様に従って、あたかも1文字であるかのように扱われるべきものです。
二文字組字や三文字組字を使用する理由は様々です。キーボードに言語の文字セット全体をカバーするキーがない場合、特殊文字の入力が難しい場合、テキストエディタが特定の文字を特別な用途のために予約している場合などがあります。また、三文字組字は、やなどの文字が欠けている一部のEBCDICコードページにも使用されることがあります。{}
C言語の基本文字セットはASCII文字セットのサブセットであり、 ISO 646不変文字セットに含まれない9文字が含まれています。使用しているエンコーディング(および場合によってはキーボード)がこれらの9文字のうち1つ以上をサポートしていない場合、ソースコードの記述に問題が生じる可能性があります。ANSI C委員会は、ISO 646文字セットの各国版をサポートするキーボードを使用してソースコードを入力する方法として、トリグラフを考案しました。[ 1 ]
ASCIIとUnicode / UTF-8が広く採用されたため、今日では三文字文字の使用は限られており、C23以降、C言語から三文字文字のサポートが削除されました。[ 2 ]
トリグラフは、コンパイラのテストスイート以外ではあまり見かけません。[ 3 ]一部のコンパイラは、トリグラフの認識をオフにするオプションをサポートしているか、デフォルトでトリグラフを無効にしてオンにするためのオプションを必要とします。ソースファイルでトリグラフに遭遇すると警告を発するコンパイラもあります。Borlandは、トリグラフ処理が必要な場合にのみ使用する別のプログラム、トリグラフ プリプロセッサ ( TRIGRAPH.EXE) を提供しました (その根拠はコンパイル速度を最大化することでした)。
異なるシステムでは、以下に説明するように、異なる種類の有向グラフと三重グラフが定義されます。
ALGOLの初期バージョンは、標準化されたASCIIおよびEBCDIC文字セットよりも前に開発され、通常はメーカー固有の6ビット文字コードを使用して実装されていました。ALGOLの多くの演算は、使用可能な文字セットにコードポイントがなかったり、周辺機器でサポートされていなかったりしたため、:=代入や以上などの←置換が行われました。>=≥
Pascalプログラミング言語は、それぞれ、 、 、に対して、、、、 の有向グラフをサポートしています。ここで述べた他のすべてのケースとは異なり、 、、はかつても現在も広く使用されています。ただし、多くのコンパイラは、これらを実際の有向グラフではなく、別の種類のコメントブロックとして扱います。つまり、 で始まるコメントはで閉じることができず、その逆も同様です。(..)(**)[]{}(**)(*}
Jプログラミング言語はAPLの子孫ですが、 APLシンボルではなくASCII文字セットを使用します。ASCIIの印刷可能な範囲はAPLの特殊なシンボルセットよりも小さいため、.(ドット)と:(コロン)文字を使用してASCIIシンボルを変化させ、ユニグラフ、ダイグラフ、まれにトリグラフを独立した「シンボル」として解釈します。[ 4 ]
C言語やC++言語における二文字組や三文字組とは異なり、J言語にはこれらに相当する一文字の記号はありません。
C プリプロセッサ( C で使用され、C++では若干の違いがあります。下記参照) は、他の処理を行う前に ( C23 [ 2 ]まで)、この表の 9 つの三文字シーケンスのすべての出現箇所を、対応する 1 文字に置き換えます。[ 5 ] [ 6 ]
プログラマーは、疑問符を 2 つ並べて配置したいが、コンパイラーがそれらを三文字の導入として扱わないようにしたい場合があります。C 文法では、2 つの?トークンが連続して出現することは許可されていないため、C ファイルで疑問符を 2 つ連続して使用できるのは、複数文字の定数、文字列リテラル、およびコメントのみです。これは、定数がファイルタイプまたは作成者として使用される場合、特にクラシック Mac OSで問題となります。[ 7 ]文字列リテラル内に疑問符を 2 つ連続して安全に配置するには、プログラマーは文字列連結またはエスケープ シーケンスを使用できます。'????'"...?""?...""...?\?..."
???はそれ自体は三文字の並びではありませんが、 のような文字が後に続くと+-として解釈され、 となります。???-?~
トリグラフ??/は、行結合のためにエスケープされた改行を挿入するために使用できます。プリプロセッサ内でトリグラフを正しく効率的に処理するには、この点を考慮する必要があります。また、特にコメント内では予期せぬ問題を引き起こす可能性もあります。例:
// これはすべてたった1つのコメントです!???/ a ++ ;これは単一の論理コメント行(C++およびC99で使用される)であり、
/??/ *コメント*?? / /これは正しく構成されたブロックコメントです。この概念は、次のC99の例のように、3行連文をチェックするために使用できます。この場合、実行されるreturn文は1つだけです。
// false または true を返します。言語標準は C99 以降です。bool trigraphsAvailable () { // トライグラフは使用可能ですか?/ return false ; return true ; }1994年、C標準の規範的修正であるC95 [ 8 ] [ 9 ] ( C99に含まれていた)は、5つの三文字文字のより読みやすい代替として二文字文字を提供した。
トライグラフとは異なり、ダイグラフはトークン化の際に処理されます。ダイグラフは常にそれ自体で完全なトークンを表すか、%:%:プリプロセッサの連結トークンを置き換えるトークンを構成する必要があります##。引用符で囲まれた文字列や文字定数など、他のトークンの中にダイグラフのシーケンスが含まれている場合、それは置き換えられません。
C++(C++14まで、下記参照)は、C99の追加機能を含め、Cのように動作します。[ 10 ]
なお、%:%:は の 2 つの出現ではなく、単一のトークンとして扱われます%:。
シーケンスにおいて<::、後続の文字が でも でもない場合:、>はそれ<自体が前処理トークンとして扱われ、代替トークン の最初の文字としては扱われません<:。これは、テンプレートの特定の使用方法が置換によって壊れないようにするためです。
C++標準では、「digraph」という用語に関して次のようなコメントがあります。[ 11 ]
「ダイグラフ」(2文字からなるトークン)という用語は、必ずしも正確な表現とは言えません。なぜなら、代替の前処理トークンの1つが であり、
%:%:もちろん、いくつかの主要トークンも2文字を含んでいるからです。とはいえ、語彙キーワードではないこれらの代替トークンは、口語的に「ダイグラフ」と呼ばれています。
トライグラフは、 C++0xで非推奨にすることが提案され、 C++11としてリリースされました。[ 12 ]これはIBMが自社および他の C++ ユーザーを代表して反対し、[ 13 ]その結果、トライグラフは C++11 に残されました。その後、トライグラフはC++17で削除 (非推奨だけでなく) することが再び提案されました。[ 14 ]これは委員会の投票を通過し、IBM の反対にもかかわらず、トライグラフ (追加トークンは除く) は C++17 から削除されました。[ 15 ]トライグラフを使用する既存のコードは、ソース ファイル (トライグラフを解析) からトライグラフを含まない基本ソース文字セットに変換することでサポートできます。[ 14 ]
RPL言語と入力方式をサポートするHewlett-Packard電卓は、多数のトライグラフ ( TIO コードとも呼ばれる) をサポートし、電卓の拡張文字セットの 7 ビット以外の ASCII 文字を外国のプラットフォームで確実に転写し、 CHARSアプリケーションを使用せずにキーボード入力を容易にします。[ 19 ] [ 20 ] [ 17 ] [ 18 ]すべての TIOコードの最初の文字は a で、その後に置換するグリフに漠然と似た 2 つの ASCII 文字が続きます。[19 ] [ 20 ] [ 17 ] [ 18 ] [ 21 ]他のすべての文字は、特別な TIO コード構文を使用して入力できます。nnn は、対応するコードポイントの3 桁の 10 進数 (必要に応じて先頭にゼロを追加) です(これにより、正式にはテトラグラフを表します)。[ 19 ] [ 17 ] [ 18 ]\\nnn
Vimテキストエディタは、 RFC 1345に従って、テキスト文字の実際の入力にダイグラフをサポートしています。ダイグラフの入力は、デフォルトでは+に割り当てられています。 [ 22 ] Vim で使用可能なすべてのダイグラフのリストは、と入力することで表示できます。 CtrlK:dig
GNU Screenには、デフォルトで+ +に割り当てられている有向グラフコマンドがあります。 [ 23 ]CtrlACtrlV
MS-DOS用のLotus 1-2-3 は、 + を合成キーとして使用し、 Lotus International Character Set (LICS) [ 24 ]およびLotus Multi-Byte Character Set (LMBCS)の多くの特殊文字を簡単に入力できるようにしています。AltF1