コンピュータプログラミング において、ダイグラフとトライグラフは、それぞれソースコードに現れる2文字と3文字のシーケンスであり、プログラミング言語の仕様によれば、単一の文字として扱われるべきものです。トライグラフはC++言語から削除されており、C23以降はCからも削除される予定であるため、Cでも他の主流の言語でも実際にはあまり使用されていない可能性があります(J言語での使用は例外です)。Unicode / UTF -8の現代の世界では( ASCIIだけでも)、言語設計においてトライグラフは必要ありません。トライグラフは負担であると考えられており、少なくともこれらの言語ではおそらくユーザーがほとんどいないダイグラフも同様です。
二重音字と三重音字を使用する理由はさまざまです。キーボードに言語の文字セット全体をカバーするキーがない場合、特殊文字の入力が難しい場合、テキスト エディターが一部の文字を特別な用途のために予約している場合などです。三重音字は、やなどの文字がないEBCDIC コード ページでも使用されることがあります。
{}
歴史
C プログラミング言語の基本文字セットは、ASCII文字セットのサブセットであり、 ISO 646不変文字セットに含まれない 9 つの文字が含まれています。使用されているエンコーディング(およびキーボード) がこれらの 9 つの文字のいずれもサポートしていない場合、ソースコードの記述に問題が生じる可能性があります。ANSI C委員会は、ISO 646 文字セットの任意のバージョンをサポートするキーボードを使用してソース コードを入力する方法として、トライグラフを発明しました。[1]
実装
トライグラフは、コンパイラの テストスイート以外ではあまり見かけません。[2]コンパイラによっては、トライグラフの認識をオフにするオプションをサポートしているものや、デフォルトでトライグラフを無効にしてオンにするためのオプションを必要とするものがあります。ソースファイルでトライグラフに遭遇すると警告を出すものもあります。ボーランドは、トライグラフ処理が必要な場合のみ使用する別のプログラム、トライグラフプリプロセッサ ( TRIGRAPH.EXE) を提供しました (理由は、コンパイル速度を最大化するためです)。
言語サポート
以下に説明するように、異なるシステムでは異なるダイグラフとトリグラフのセットが定義されます。
アルゴル
ALGOLの初期のバージョンは、標準化された ASCII および EBCDIC 文字セットより前のものであり、通常はメーカー固有の6 ビット文字コードを使用して実装されていました。ALGOL 操作の多くは、使用可能な文字セットにコードポイントがなかったり、周辺機器でサポートされていなかったりしたため、 (代入) や(以上) など
の多くの代替手段が:=必要でした。←>=≥
パスカル
Pascalプログラミング言語は、、 、に対してそれぞれ、、、 というダイグラフをサポートしています。ここで説明した他のすべてのケースとは異なり、と は、過去も現在も広く使用されています。ただし、多くのコンパイラは、これらを実際のダイグラフではなく、異なるタイプのコメント ブロックとして扱います。つまり、 で始まるコメントはで閉じることはできず、その逆も同様です。
(..)(**)[]{}(**)(*}
J
Jプログラミング言語はAPLの後継ですが、 APLシンボルではなくASCII文字セットを使用します。ASCIIの印刷可能な範囲はAPLの特殊なシンボルセットよりも狭いため、.(ドット)と:(コロン)文字を使用してASCIIシンボルを変化させ、ユニグラフ、ダイグラフ、まれにトリグラフを独立した「シンボル」として解釈します。[3]
C およびC++での二重音字や三重音字の使用とは異なり、J にはこれらに相当する単一文字はありません。
C
Cプリプロセッサ(Cで使用され、C++では若干の違いがあります。下記参照)は、他の処理を行う前に、この表の9つのトライグラフシーケンスをすべて、1文字の同等の文字に置き換えます(C23まで[4])。[5] [6]
プログラマーは、2つの疑問符を一緒に配置したいが、コンパイラーがそれをトリグラフの導入として処理しないようにしたい場合があります。Cの文法では2つの連続する?トークンが許可されていないため、Cファイルで2つの疑問符を続けて使用できるのは、複数文字の定数、文字列リテラル、およびコメントのみです。これは、定数がファイルタイプまたはクリエータとして使用される可能性がある古典的なMac OSで特に問題になります。 [7]文字列リテラル内に2つの連続する疑問符を安全に配置するには、プログラマーは文字列連結またはエスケープシーケンスを使用できます。
'????'"...?""?..." "...?\?..."
???自体はトリグラフシーケンスではありませんが、 などの文字が続く場合は+-として解釈されます。以下の例では、の前に 16 個の があります。
???-?/
トリグラフ??/は、行の連結にエスケープされた改行を導入するために使用できます。プリプロセッサ内でトリグラフを正しく効率的に処理するには、これを考慮する必要があります。また、特にコメント内では、予期しない結果を引き起こす可能性があります。例:
// 次の行は実行されますか??????????????????/
a ++ ;
これは単一の論理コメント行(C++およびC99で使用される)であり、
/??/
*コメント*?? / /
これは正しく形成されたブロックコメントです。この概念は、次の C99 の例のように、1 つの return ステートメントのみが実行されるトライグラフをチェックするために使用できます。
int trigraphsavailable () // 0 または 1 を返します。言語標準 C99 以降{ // トライグラフは使用可能か??/ return 0 ; return 1 ; }
1994年にC99に含まれるC95 [8] [9]の規範的改正により、5つのトリグラフのより読みやすい代替手段として、ダイグラフが導入されました。
トライグラフとは異なり、ダイグラフはトークン化中に処理され、ダイグラフは常にそれ自体で完全なトークンを表すか、%:%:プリプロセッサの連結トークンを置き換えるトークンを構成する必要があります##。ダイグラフシーケンスが別のトークン(引用符で囲まれた文字列や文字定数など)内に出現した場合、置き換えられません。
C++
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言語と入力方式をサポートするヒューレット・パッカードの電卓は、多数のトリグラフ(TIOコードとも呼ばれる)をサポートしており、外国のプラットフォーム上で電卓の拡張文字セット[16] [17] [18]の7ビット以外のASCII文字を確実に転記し、 CHARSアプリケーションを使用せずにキーボード入力を容易にしている。[19] [20] [17] [18]すべてのTIOコードの最初の文字は で\、その後に置換するグリフに漠然と似た2つの他のASCII文字が続く。[19] [ 20] [17] [18] [21]他のすべての文字は、特別なTIOコード構文を使用して入力でき、 nnnは対応するコードポイント\nnnの3桁の10進数(必要に応じて先頭にゼロが付く)である(したがって、正式にはテトラグラフを表す)。[19] [17] [18]
アプリケーションサポート
ヴィム
Vimテキストエディタは、RFC 1345に従って、テキスト文字の実際の入力に二重音字をサポートしています。 二重音字の入力は、デフォルトで+にバインドされています。[22] Vimで可能なすべての二重音字のリストは、と入力することで表示できます。 CtrlK:dig
GNUスクリーン
GNU Screenにはdigraphコマンドがあり、デフォルトでは++にバインドされています。[ 23]CtrlA CtrlV
蓮
DOS版Lotus 1-2-3では、+キーをコンポーズキーとして使用し、 Lotus International Character Set (LICS) [24]やLotus Multi-Byte Character Set (LMBCS)の多くの特殊文字の入力を容易にしています。 AltF1
参照
参考文献
- ^ 国際標準の根拠—プログラミング言語—C (PDF)。改訂5.10。pp. 20–21。
- ^ ジョーンズ、デレク M.「センテンス 117」。新しい C 標準: 経済的および文化的解説。
- ^ Hui, Roger. 「Vocabulary」. jsoftware.com . 2019年4月2日時点のオリジナルよりアーカイブ。2015年4月16日閲覧。
- ^ 「トリグラフを削除する??!」(PDF)。
- ^ 英国規格協会(2003)。C規格 - TC1 を組み込んだ - BS ISO/IEC 9899: 1999。John Wiley & Sons。ISBN 0-470-84573-2。
- ^ 「国際標準の根拠 - プログラミング言語 - C」(PDF)。5.10。2003年4月。2016年6月6日時点のオリジナルよりアーカイブ(PDF) 。2010年10月17日閲覧。
- ^ 「ファイルの基本」。whitefiles.org 。2024年5月8日閲覧。
- ^ ISO/IEC 9899:1990/Amd 1:1995 - プログラミング言語 - C - Amendment 1: C Integrity。1995年3月。 2024年5月30日閲覧。
- ^ Clive DW Feather (2010-09-12). 「規範的補遺 1 の簡単な説明」
- ^ Stroustrup, Bjarne (1994-03-29). C++ の設計と進化(第 1 版). Addison-Wesley Publishing Company . ISBN 0-201-54330-3。
- ^ Du Toit, Stefanus 編 (2012-01-16). 「ワーキングドラフト、プログラミング言語 C++ の標準」(PDF)。N3337。2019-05-08にオリジナルからアーカイブ(PDF) 。2019-05-08に取得。
- ^ 「C++0X、CD 1、国家機関のコメント」(PDF)。2009年1月30日。SC22/WG21 N2837コメントUK 11。2017年8月1日時点のオリジナルよりアーカイブ(PDF) 。 2019年5月12日閲覧。
- ^ Wong, Michael; Tong, Hubert; Klarer, Robert; McIntosh, Ian; Mak, Raymond; Cambly, Christopher; LaBonté, Alain (2009-06-19). 「提案されたトリグラフの廃止に関するコメント」(PDF)。N2910。2017-08-01にオリジナルからアーカイブ(PDF) 。2019-05-12に取得。
- ^ ab Smith, Richard (2014-05-06). 「トリグラフの削除??!」 N3981. 2018-07-09時点のオリジナルよりアーカイブ。 2019-05-12閲覧。
- ^ Wong, Michael; Tong, Hubert; Bhakta, Rajan; Inglis, Derek (2014-10-10). 「C++17 の Trigraph に逆らう将来への準備に関する IBM のコメント」(PDF)。IBM 論文 N4210。2018-09-11にオリジナルからアーカイブ(PDF) 。2019-05-12に取得。
- ^ HP 82240B 赤外線プリンタ(第 1 版)。米国オレゴン州コーバリス: Hewlett-Packard。1989年 8 月。HP 再注文番号 82240-90014。
- ^ abcd HP 48G シリーズ – ユーザーズ ガイド (UG) (第 8 版)。Hewlett -Packard。1994年 12 月 [1993]。pp. 2–5、27–16。HP 00048-90126、(00048-90104)。2016 年 8 月 6 日時点のオリジナルよりアーカイブ。2015 年 9月 6 日閲覧。[1]
- ^ abcd HP 50g / 49g+ / 48gII グラフ電卓 上級ユーザーズリファレンスマニュアル (AUR) (第2版)。Hewlett-Packard . 2009-07-14 [2005]. pp. J-1, J-2. HP F2228-90010. 2018-07-08 にオリジナルよりアーカイブ。 2015-10-10に閲覧。検索可能なPDF
- ^ abc 「HP RPL TIO テーブル」holyjoe.org。 2016 年 5 月 23 日時点のオリジナルよりアーカイブ。2015 年 1 月 23 日閲覧。
- ^ ab Heinz, Sr., Michael W. (2005). 「HP-ASCII とトライグラフ」。2016 年 8 月 2 日時点のオリジナルよりアーカイブ。2016 年8 月 2 日閲覧。
- ^ Finseth, Craig A. (2012-02-25). 「chars」。2017年12月21日時点のオリジナルよりアーカイブ。2017年12月21日閲覧。
- ^ “Vim ドキュメント: *digraphs-default*”. 2011-01-15. 2018-12-20 時点のオリジナルよりアーカイブ。2019-05-12閲覧。
- ^ 「Digraph - Screen ユーザーズマニュアル」。2018年12月31日時点のオリジナルよりアーカイブ。 2019年5月12日閲覧。
- ^ 「付録 F」。HP 95LX ユーザーズ ガイド(PDF) (第 2 版)。米国オレゴン州コーバリス: Hewlett-Packard Company、Corvallis Division。1991 年 6 月 [1991 年 3 月]。F0001-90003。2016年 11 月 28 日時点のオリジナルからアーカイブ(PDF) 。2016年 11 月 27 日閲覧。
外部リンク
- RFC 1345
