Диграфы и триграфы (программирование)
Эта статья нуждается в дополнительных цитатах для проверки . ( сентябрь 2008 г. ) |
В компьютерном программировании орграфы и триграфы представляют собой последовательности из двух и трех символов соответственно, которые появляются в исходном коде и, согласно спецификации языка программирования , должны рассматриваться как отдельные символы. Триграфы были удалены из языка C++ и будут из C начиная с C23 , поэтому, вероятно, они уже мало используются на практике ни в C, ни в каком-либо другом основном языке (использование их в языке J является исключением). В современном мире Unicode / UTF-8 (даже просто с ASCII ) нет необходимости в триграфах в языковом дизайне, которые считались обузой, а также нет необходимости в диграфах, которые, вероятно, имеют очень мало пользователей, по крайней мере, на этих языках.
Существуют различные причины для использования орграфов и триграфов: на клавиатуре может не быть клавиш, охватывающих весь набор символов языка, ввод специальных символов может быть затруднен, текстовые редакторы могут зарезервировать некоторые символы для специального использования и так далее. Триграфы также могут использоваться для некоторых EBCDIC кодовых страниц , в которых отсутствуют такие символы, как {
и }
.
История
[ редактировать ]Базовый набор символов языка программирования C представляет собой подмножество набора символов ASCII , включающее девять символов, находящихся за пределами инвариантного набора символов ISO 646 . Это может создать проблему при написании исходного кода , если используемая кодировка (и, возможно, клавиатура ) не поддерживает ни один из этих девяти символов. Комитет ANSI C изобрел триграфы как способ ввода исходного кода с помощью клавиатуры, поддерживающей любую версию набора символов ISO 646. [1]
Реализации
[ редактировать ]Триграфы обычно не встречаются за пределами компилятора наборов тестов . [2] Некоторые компиляторы поддерживают возможность отключения распознавания триграфов или отключают триграфы по умолчанию и требуют возможности их включения. Некоторые могут выдавать предупреждения при обнаружении триграфов в исходных файлах. Borland предоставил отдельную программу — препроцессор триграфа ( TRIGRAPH.EXE
), который будет использоваться только тогда, когда желательна обработка триграфа (обоснование заключалось в максимизации скорости компиляции).
Языковая поддержка
[ редактировать ]Различные системы определяют разные наборы орграфов и триграфов, как описано ниже.
АЛГОЛ
[ редактировать ]Ранние версии ALGOL определенного производителем предшествовали стандартизированным наборам символов ASCII и EBCDIC и обычно реализовывались с использованием шестибитного кода символов, . В ряде операций АЛГОЛа либо отсутствовали кодовые точки в доступном наборе символов, либо они не поддерживались периферийными устройствами, что привело к ряду замен, включая :=
для ←
(задание) и >=
для ≥
(больше или равно).
Паскаль
[ редактировать ]Язык программирования Паскаль поддерживает орграфы. (.
, .)
, (*
и *)
для [
, ]
, {
и }
соответственно. В отличие от всех других случаев, упомянутых здесь, (*
и *)
были и продолжают широко использоваться. Однако многие компиляторы рассматривают их как другой тип блока комментариев, а не как настоящие орграфы, то есть комментарий, начинающийся с (*
нельзя закрыть с помощью }
и наоборот.
Дж
[ редактировать ]Язык программирования J является потомком APL , но использует набор символов ASCII, а не символы APL . Поскольку диапазон печати ASCII меньше, чем специализированный набор символов APL, .
(точка) и :
Символы (двоеточие) используются для изменения символов ASCII, эффективно интерпретируя униграфы, диграфы или, реже, триграфы как отдельные «символы». [3]
В отличие от использования орграфов и триграфов в C и C++ , в J им нет односимвольных эквивалентов.
С
[ редактировать ]Триграф | Эквивалент |
---|---|
??= |
#
|
??/ |
\
|
??' |
^
|
??( |
[
|
??) |
]
|
??! |
|
|
??< |
{
|
??> |
}
|
??- |
~
|
Препроцессор C (используемый для C и с небольшими отличиями в C++ ; см. ниже ) заменяет все вхождения девяти триграфических последовательностей в этой таблице их односимвольными эквивалентами перед любой другой обработкой (до C23) . [4] ). [5] [6]
Программист может захотеть разместить два вопросительных знака вместе, но при этом компилятор не воспримет их как введение триграфа. Грамматика C не допускает двух последовательных ?
токены, поэтому единственные места в файле C, где могут использоваться два вопросительных знака подряд, — это многосимвольные константы, строковые литералы и комментарии. Это особенно проблема для классической Mac OS , где константа '????'
может использоваться как тип файла или создатель. [7] Чтобы безопасно разместить два последовательных вопросительных знака внутри строкового литерала, программист может использовать конкатенацию строк. "...?""?..."
или escape-последовательность "...?\?..."
.
???
сама по себе не является триграфической последовательностью, но если за ней следует такой символ, как -
это будет интерпретировано как ?
+ ??-
, как в примере ниже, в котором 16 ?
перед /
.
The ??/
trigraph можно использовать для введения экранированного символа новой строки для объединения строк; это необходимо учитывать для правильной и эффективной обработки триграфов в препроцессоре. Это также может вызвать сюрпризы, особенно в комментариях. Например:
// Will the next line be executed????????????????/
a++;
это одна строка логического комментария (используется в C++ и C99 ), и
/??/
* A comment *??/
/
который представляет собой правильно сформированный комментарий к блоку. Эту концепцию можно использовать для проверки триграфов, как в следующем примере C99, где будет выполнен только один оператор возврата.
int trigraphsavailable() // returns 0 or 1; language standard C99 or later
{
// are trigraphs available??/
return 0;
return 1;
}
Диграф | Эквивалент |
---|---|
<: |
[
|
:> |
]
|
<% |
{
|
%> |
}
|
%: |
#
|
В 1994 году была принята нормативная поправка к стандарту C, C95 . [8] [9] включенный в C99, предоставил орграфы как более удобочитаемую альтернативу пяти триграфам.
В отличие от триграфов, орграфы обрабатываются во время токенизации , и любой орграф всегда должен сам по себе представлять полный токен или составлять токен. %:%:
замена токена конкатенации препроцессора ##
. Если последовательность орграфов встречается внутри другого токена, например строки в кавычках или символьной константы, она не будет заменена.
С++
[ редактировать ]Токен | Эквивалент |
---|---|
compl |
~
|
not |
!
|
bitand |
&
|
bitor |
|
|
and |
&&
|
or |
||
|
xor |
^
|
and_eq |
&=
|
or_eq |
|=
|
xor_eq |
^=
|
not_eq |
!=
|
C++ (до C++14 , см. ниже ) ведет себя как C, включая дополнения C99, но с дополнительными токенами, перечисленными в таблице. [10]
В качестве примечания, %:%:
рассматривается как один токен, а не как два вхождения %:
.
В последовательности <::
если последующий символ не является ни тем, ни другим :
ни >
, <
рассматривается как токен предварительной обработки сам по себе, а не как первый символ альтернативного токена. <:
. Это сделано для того, чтобы некоторые варианты использования шаблонов не были нарушены заменой.
Стандарт C++ дает следующий комментарий относительно термина «орграф»: [11]
Термин «орграф» (токен, состоящий из двух символов) не совсем описателен, поскольку одним из альтернативных токенов предварительной обработки является
%:%:
и, конечно же, некоторые первичные токены содержат два символа. Тем не менее, те альтернативные токены, которые не являются лексическими ключевыми словами, в просторечии известны как «орграфы».
Триграфы были объявлены устаревшими в C++0x , который был выпущен как C++11 . [12] Против этого выступила IBM , выступая от своего имени и других пользователей C++, [13] и в результате триграфы были сохранены в C++11. Затем триграфы снова были предложены для удаления (а не только устаревания) в C++17 . [14] Это решение было принято комитетом голосованием, и триграфы (но не дополнительные токены) были удалены из C++17, несмотря на противодействие со стороны IBM. [15] Существующий код, использующий триграфы, может поддерживаться путем перевода исходных файлов (синтаксический анализ триграфов) в базовый исходный набор символов, не включающий триграфы. [14]
РПЛ
[ редактировать ]Калькуляторы Hewlett-Packard , поддерживающие язык RPL и метод ввода, обеспечивают поддержку большого количества триграфов (также называемых кодами TIO ) для надежной расшифровки несемибитных символов ASCII расширенного набора символов калькуляторов. [16] [17] [18] на иностранных платформах и облегчить ввод с клавиатуры без использования Приложение CHARS . [19] [20] [17] [18] Первый символ всех кодов TIO — это \
, за которым следуют два других символа ASCII, отдаленно напоминающие глиф, который нужно заменить. [19] [20] [17] [18] [21] Все остальные символы можно вводить с помощью специального \nnn
Синтаксис кода TIO, где nnn представляет собой трехзначное десятичное число (с ведущими нулями , если необходимо) соответствующей кодовой точки (тем самым формально представляющее тетраграф ). [19] [17] [18]
Поддержка приложений
[ редактировать ]Почему
[ редактировать ]Текстовый редактор Vim поддерживает орграфы для фактического ввода текстовых символов, следующих РФК 1345 . Ввод орграфов связан с Ctrl+ K по умолчанию. [22] Список всех возможных орграфов в Vim можно просмотреть, набрав :dig.
Экран GNU
[ редактировать ]В GNU Screen есть команда digraph, привязанная к Ctrl+ A Ctrl+ V по умолчанию. [23]
Лотос
[ редактировать ]Lotus 1-2-3 для в DOS использования Alt+ F1 в качестве клавиши создания , чтобы упростить ввод многих специальных символов из международного набора символов Lotus (LICS). [24] и набор многобайтовых символов Lotus (LMBCS).
См. также
[ редактировать ]- Создать ключ
- Список ссылок на символьные сущности XML и HTML
- Escape-последовательность
- Escape-последовательности в C
- Альтернативные токены C
Ссылки
[ редактировать ]- ^ Обоснование международного стандарта — Языки программирования — C (PDF) . Версия 5.10. стр. 20–21.
- ^ Джонс, Дерек М. «Предложение 117». Новый стандарт C: экономический и культурный комментарий .
- ^ Хуэй, Роджер. "Словарный запас" . jsoftware.com . Архивировано из оригинала 02 апреля 2019 г. Проверено 16 апреля 2015 г.
- ^ «Удаление триграфов??!» (PDF) .
- ^ Британский институт стандартов (2003 г.). Стандарт C – включая TC1 – BS ISO/IEC 9899:1999 . Джон Уайли и сыновья . ISBN 0-470-84573-2 .
- ^ «Обоснование международного стандарта — языки программирования — C» (PDF) . 5.10. Апрель 2003 г. Архивировано (PDF) из оригинала 6 июня 2016 г. Проверено 17 октября 2010 г.
- ^ «Основы работы с файлами» . whitefiles.org . Проверено 8 мая 2024 г.
- ^ ISO/IEC 9899:1990/Поправка 1:1995. Языки программирования. C. Поправка 1. Целостность C. Март 1995 года . Проверено 30 мая 2024 г.
- ^ Клайв Д. У. Физер (12 сентября 2010 г.). «Краткая характеристика Нормативного приложения 1» .
- ^ Страуструп, Бьярне (29 марта 1994 г.). Проектирование и эволюция C++ (1-е изд.). Издательская компания Аддисон-Уэсли . ISBN 0-201-54330-3 .
- ^ Дю Туа, Стефанус, изд. (16 января 2012 г.). «Рабочий проект стандарта языка программирования C++» (PDF) . Н3337. Архивировано (PDF) из оригинала 8 мая 2019 г. Проверено 8 мая 2019 г.
- ^ «C++0X, компакт-диск 1, комментарии национальных органов» (PDF) . 30 января 2009 г. Комментарий SC22/WG21 N2837 UK 11. Архивировано (PDF) из оригинала 1 августа 2017 г. Проверено 12 мая 2019 г.
- ^ Вонг, Майкл; Тонг, Хьюберт; Кларер, Роберт; Макинтош, Ян; Мак, Раймонд; Кэмбли, Кристофер; Лабонте, Ален (19 июня 2009 г.). «Комментарий к предлагаемому прекращению поддержки триграфа» (PDF) . Н2910. Архивировано (PDF) из оригинала 1 августа 2017 г. Проверено 12 мая 2019 г.
- ^ Jump up to: а б Смит, Ричард (6 мая 2014 г.). «Удаление триграфов??!» . Н3981. Архивировано из оригинала 9 июля 2018 г. Проверено 12 мая 2019 г.
- ^ Вонг, Майкл; Тонг, Хьюберт; Бхакта, Раджан; Инглис, Дерек (10 октября 2014 г.). «Комментарий IBM о подготовке к неблагоприятному для Trigraph будущему в C++17» (PDF) . Бумага IBM N4210. Архивировано (PDF) из оригинала 11 сентября 2018 г. Проверено 12 мая 2019 г.
- ^ Инфракрасный принтер HP 82240B (1-е изд.). Корваллис, Орегон, США: Hewlett-Packard . Август 1989 г. Номер повторного заказа HP 82240-90014. Архивировано из оригинала 14 августа 2016 г. Проверено 1 августа 2016 г.
- ^ Jump up to: а б с д HP Series 48G – Руководство пользователя (UG) (8-е изд.). Хьюлетт-Паккард . Декабрь 1994 г. [1993]. стр. 2–5, 27–16. HP 00048-90126, (00048-90104). Архивировано из оригинала 6 августа 2016 г. Проверено 6 сентября 2015 г. [1]
- ^ Jump up to: а б с д Расширенное справочное руководство пользователя графического калькулятора HP 50g / 49g+ / 48gII (AUR) (2-е изд.). Хьюлетт-Паккард . 14 июля 2009 г. [2005]. стр. J-1, J-2. HP F2228-90010. Архивировано из оригинала 8 июля 2018 г. Проверено 10 октября 2015 г. PDF с возможностью поиска
- ^ Jump up to: а б с «Таблица HP RPL TIO» . Holyjoe.org . Архивировано из оригинала 23 мая 2016 г. Проверено 23 января 2015 г.
- ^ Jump up to: а б Хайнц старший, Майкл В. (2005). «HP-ASCII и триграфы» . Архивировано из оригинала 02 августа 2016 г. Проверено 2 августа 2016 г.
- ^ Финсет, Крейг А. (25 февраля 2012 г.). "чарсы" . Архивировано из оригинала 21 декабря 2017 г. Проверено 21 декабря 2017 г.
- ^ «Документация Vim: *digraphs-default*» . 15 января 2011 г. Архивировано из оригинала 20 декабря 2018 г. Проверено 12 мая 2019 г.
- ^ «Digraph — Руководство пользователя экрана» . Архивировано из оригинала 31 декабря 2018 г. Проверено 12 мая 2019 г.
- ^ «Приложение F». Руководство пользователя HP 95LX (PDF) (2-е изд.). Корваллис, Орегон, США: Компания Hewlett-Packard , подразделение Корваллис. Июнь 1991 г. [март 1991 г.]. Ф0001-90003. Архивировано (PDF) из оригинала 28 ноября 2016 г. Проверено 27 ноября 2016 г.