Эта статья требует дополнительных ссылок для проверки . ( сентябрь 2008 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
В компьютерном программировании , орграфы и триграфы представляют собой последовательность из двух и трех символов , соответственно, которые появляются в исходном коде и, в соответствии с языком программирования спецификации «s, следует рассматривать как если бы они были одиночные символами.
Существуют различные причины для использования диграфов и триграфов: на клавиатуре могут не быть клавиш, охватывающих весь набор символов языка, ввод специальных символов может быть затруднен, текстовые редакторы могут зарезервировать некоторые символы для специального использования и так далее. Триграфы также могут использоваться для некоторых кодовых страниц EBCDIC , в которых отсутствуют такие символы, как и .{
}
История [ править ]
Базовый набор символов языка программирования C - это подмножество набора символов ASCII, которое включает девять символов, лежащих вне инвариантного набора символов ISO 646 . Это может создать проблему для написания исходного кода, если используемая кодировка (и, возможно, клавиатура ) не поддерживает ни один из этих девяти символов. ANSI C комитет изобрел триграфы как способ ввода исходного кода с помощью клавиатуры , которые поддерживают любую версию набора символов ISO 646.
Реализации [ править ]
За пределами наборов тестов компилятора триграфы обычно не встречаются . [1] Некоторые компиляторы поддерживают возможность отключения распознавания триграфов или отключать триграфы по умолчанию и требовать возможность их включения. Некоторые могут выдавать предупреждения при обнаружении триграфов в исходных файлах. Borland предоставил отдельную программу, препроцессор триграфа ( ), которая должна использоваться только тогда, когда требуется обработка триграфа (цель заключалась в максимальном увеличении скорости компиляции).TRIGRAPH.EXE
Языковая поддержка [ править ]
Разные системы определяют разные наборы орграфов и триграфов, как описано ниже.
АЛГОЛ [ править ]
Ранние версии ALGOL предшествовали стандартизированным наборам символов ASCII и EBCDIC и обычно были реализованы с использованием шестибитного символьного кода, зависящего от производителя . Целый ряд операций АЛГОЛа либо не хватало кодовых значений в доступном наборе символов или не были поддержаны периферийных устройств, что приводит к ряду замен в том числе :=
для ←
(присвоение) и >=
для ≥
(больше или равно).
Паскаль [ править ]
Pascal язык программирования поддерживает диграфов (.
, .)
, (*
и *)
для [
, ]
, {
и }
соответственно. В отличие от всех других случаев упомянутых здесь, (*
и *)
были и до сих пор широко используется. Однако многие компиляторы рассматривают их как другой тип блока комментариев, а не как фактические орграфы, то есть комментарий, с которого начинается, (*
нельзя закрыть, }
и наоборот.
J [ править ]
Язык программирования J является потомком APL, но использует набор символов ASCII, а не символы APL . Поскольку печатаемый диапазон ASCII меньше, чем специализированный набор символов APL, символы .
(точка) и :
(двоеточие) используются для изменения символов ASCII, эффективно интерпретируя униграфы, диграфы или, реже, триграфы как отдельные «символы». [2]
В отличие от использования орграфов и триграфов в C и C ++ , в J. нет их односимвольных эквивалентов.
C [ править ]
Препроцессор С (используется для С и с небольшими различиями в C ++ , см ниже ) заменяет все вхождения следующих девять триграфа последовательностей со стороны их односимвольных эквивалентов до любой другой обработки. [3] [4]
Триграф | Эквивалент |
---|---|
??= | # |
??/ | \ |
??' | ^ |
??( | [ |
??) | ] |
??! | | |
??< | { |
??> | } |
??- | ~ |
Программист может захотеть поставить два вопросительных знака вместе, но не заставить компилятор рассматривать их как вводящие триграфик. Грамматика C не допускает двух последовательных ?
токенов, поэтому единственные места в файле C, где могут использоваться два вопросительных знака подряд, - это многосимвольные константы, строковые литералы и комментарии. Это особенно проблема для классической Mac OS , где константа '????'
может использоваться как тип файла или создатель. Чтобы безопасно разместить два последовательных вопросительных знака в строковом литерале, программист может использовать конкатенацию строк "...?""?..."
или escape-последовательность "...?\?..."
.
???
сам по себе не является триграфической последовательностью, но когда за ним следует такой символ, -
он будет интерпретироваться как ?
+ ??-
, как в приведенном ниже примере, где ?
перед знаком 16 с /
.
??/
Триграф может быть использован для введения сбежавшей новой строки для линии сращивания; это необходимо учитывать для правильной и эффективной обработки триграфов в препроцессоре. Это также может вызвать сюрпризы, особенно в комментариях. Например:
// Будет ли выполнена следующая строка ???????????????? / а ++;
которая представляет собой одну строку логического комментария (используется в C ++ и C99 ), и
/ ?? / * Комментарий *??/ /
который является правильно сформированным комментарием блока. Эту концепцию можно использовать для проверки триграфов, как в следующем примере C99, где будет выполняться только один оператор возврата.
int trigraphsavailable () // возвращает 0 или 1; языковой стандарт C99 или новее{// доступны ли триграфы ?? /возврат 0;возврат 1;}
Диграф | Эквивалент |
---|---|
<: | [ |
:> | ] |
<% | { |
%> | } |
%: | # |
В 1994 году нормативная поправка к стандарту C, [ указать ], включенному в C99, предоставила орграфы как более удобочитаемые альтернативы пяти триграфам.
В отличие от триграфов, орграфы обрабатываются во время токенизации , и любой орграф должен всегда представлять собой полный токен или составлять токен, %:%:
заменяющий токен конкатенации препроцессора ##
. Если последовательность орграфа встречается внутри другого токена, например строки в кавычках или символьной константы, она не будет заменена.
C ++ [ править ]
Токен | Эквивалент |
---|---|
compl | ~ |
not | ! |
bitand | & |
bitor | | |
and | && |
or | || |
xor | ^ |
and_eq | &= |
or_eq | |= |
xor_eq | ^= |
not_eq | != |
C ++ (через C ++ 14 , см. Ниже ) ведет себя как C, включая дополнения C99, но с дополнительными токенами, перечисленными в таблице. [5]
В качестве примечания, %:%:
рассматривается как один токен, а не как два вхождения %:
.
В стандарте C ++ есть следующий комментарий относительно термина «орграф»: [6]
Термин «орграф» (токен, состоящий из двух символов) не является полностью описательным, поскольку один из альтернативных токенов предварительной обработки
%:%:
и, конечно же, несколько основных токенов содержат два символа. Тем не менее, те альтернативные токены, которые не являются лексическими ключевыми словами, в просторечии известны как «диграфы».
Триграфы были предложены для устаревания в C ++ 0x , который был выпущен как C ++ 11 . [7] Против этого выступила IBM , выступая от имени себя и других пользователей C ++, [8] и в результате триграфы были сохранены в C ++ 11. Затем триграфы были снова предложены для удаления (а не только для устаревания) в C ++ 17 . [9] Это прошло голосование комитета, и триграфы (но не дополнительные токены) были удалены из C ++ 17, несмотря на возражение со стороны IBM. [10] Существующий код, использующий триграфы, может поддерживаться переводом из исходных файлов (синтаксический анализ триграфов) в базовый исходный набор символов, который не включает триграфы. [9]
РПЛ [ править ]
Калькуляторы Hewlett-Packard, поддерживающие язык RPL и метод ввода, обеспечивают поддержку большого количества триграфов (также называемых кодами TIO ) для надежной расшифровки не семибитных символов ASCII расширенного набора символов калькуляторов [11] [12] [13 ] на сторонних платформах и для облегчения ввода с клавиатуры без использования приложения CHARS . [14] [15] [12] [13] Первый символ всех кодов TIO - это a \
, за которым следуют два других символа ASCII, отдаленно напоминающих заменяемый глиф. [14] [15] [12] [13] [16]Все другие символы могут быть введены с использованием специального \nnn
синтаксиса кода TIO, где nnn является трехзначным десятичным числом (с ведущими нулями, если необходимо) соответствующей кодовой точки (тем самым формально представляя тетраграф ). [14] [12] [13]
Поддержка приложений [ править ]
Vim [ править ]
Вим текстовый редактор поддерживает диграфов для фактического ввода текстовых символов, следуя RFC 1345 . Запись орграфов по умолчанию привязана к Ctrl+ K. [17] Список всех возможных орграфов в Vim можно отобразить, набрав :dig.
Экран GNU [ править ]
В GNU Screen есть команда digraph, по умолчанию привязанная к Ctrl+ A Ctrl+ V. [18]
Лотос [ править ]
Lotus 1-2-3 для DOS использует Alt+ в F1качестве клавиши набора, чтобы упростить ввод многих специальных символов из набора символов Lotus International (LICS) [19] и многобайтового набора символов Lotus (LMBCS).
См. Также [ править ]
- Составить ключ
- Список ссылок на символьные сущности XML и HTML
- Последовательность выхода
- Escape-последовательности в C
- Альтернативные токены C
Ссылки [ править ]
- ^ Джонс, Дерек М. «Приговор 117». Новый стандарт C: экономический и культурный комментарий .
- ^ Хуэй, Роджер. «Словарь» . jsoftware.com . Архивировано из оригинала на 2019-04-02 . Проверено 16 апреля 2015 .
- ^ Британский институт стандартов (2003). Стандарт C - включая TC1 - BS ISO / IEC 9899: 1999 . Джон Вили и сыновья . ISBN 0-470-84573-2.
- ^ «Обоснование международного стандарта - языки программирования - C» (PDF) . 5.10. Апрель 2003. Архивировано (PDF) из оригинала 06.06.2016 . Проверено 17 октября 2010 .
- ^ Страуструп, Бьярне (1994-03-29). Дизайн и эволюция C ++ (1-е изд.). Издательство Эддисон-Уэсли . ISBN 0-201-54330-3.
- ^ Du Toit, Стефан, изд. (2012-01-16). «Рабочий проект стандарта языка программирования C ++» (PDF) . N3337. Архивировано (PDF) из оригинала на 2019-05-08 . Проверено 8 мая 2019 .
- ^ «C ++ 0X, CD 1, Комментарии национального органа» (PDF) . 2009-01-30. SC22 / WG21 N2837, комментарий UK 11. Архивировано (PDF) из оригинала 01.08.2017 . Проверено 12 мая 2019 .
- ^ Вонг, Майкл; Тонг, Хуберт; Кларер, Роберт; Макинтош, Ян; Мак, Раймонд; Кембли, Кристофер; Лабонте, Ален (19.06.2009). «Комментарий к предлагаемому прекращению поддержки триграфа» (PDF) . N2910. Архивировано (PDF) из оригинала на 2017-08-01 . Проверено 12 мая 2019 .
- ^ a b Смит, Ричард (2014-05-06). "Удаление триграфов ??!" . N3981. Архивировано 9 июля 2018 года . Проверено 12 мая 2019 .
- ^ Вонг, Майкл; Тонг, Хуберт; Бхакта, Раджан; Инглис, Дерек (10.10.2014). «Комментарий IBM о подготовке к будущему, неблагоприятному для Trigraph, в C ++ 17» (PDF) . Бумага IBM N4210. Архивировано (PDF) из оригинала на 2018-09-11 . Проверено 12 мая 2019 .
- ^ Инфракрасный принтер HP 82240B (1-е изд.). Корваллис, Орегон, США: Hewlett Packard . Август 1989 г. Номер повторного заказа HP 82240-90014. Архивировано из оригинала на 2016-08-14 . Проверено 1 августа 2016 .
- ^ a b c d Серия HP 48G - Руководство пользователя (8-е изд.). Hewlett-Packard . Декабрь 1994 [1993]. С. 2–5, 27–16. HP 00048-90126, (00048-90104). Архивировано 6 августа 2016 года . Проверено 6 сентября 2015 . [1]
- ^ a b c d Графический калькулятор HP 50g / 49g + / 48gII Справочное руководство для расширенного пользователя (AUR) (2-е изд.). Hewlett-Packard . 2009-07-14 [2005]. стр. J-1, J-2. HP F2228-90010. Архивировано 8 июля 2018 года . Проверено 10 октября 2015 . PDF с возможностью поиска
- ^ a b c «Таблица HP RPL TIO» . Holyjoe.org . Архивировано 23 мая 2016 года . Проверено 23 января 2015 .
- ^ a b Хайнц старший, Майкл В. (2005). «HP-ASCII и триграфы» . Архивировано 2 августа 2016 года . Проверено 2 августа 2016 .
- ^ Finseth, Крэйг А. (2012-02-25). "символы" . Архивировано 21 декабря 2017 года . Проверено 21 декабря 2017 .
- ^ "Документация Vim: * digraphs-default *" . 2011-01-15. Архивировано 20 декабря 2018 года . Проверено 12 мая 2019 .
- ^ "Digraph - Руководство пользователя экрана" . Архивировано 31 декабря 2018 года . Проверено 12 мая 2019 .
- ^ «Приложение F». Руководство пользователя HP 95LX (PDF) (2-е изд.). Корваллис, Орегон, США: Компания Hewlett-Packard , подразделение Корваллис. Июнь 1991 г. [март 1991 г.]. F0001-90003. Архивировано (PDF) из оригинала 28 ноября 2016 года . Проверено 27 ноября 2016 .
Внешние ссылки [ править ]
- RFC 1345