Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В компьютерном программировании , орграфы и триграфы представляют собой последовательность из двух и трех символов , соответственно, которые появляются в исходном коде и, в соответствии с языком программирования спецификации «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 ++ [ править ]

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

Ссылки [ править ]

  1. ^ Джонс, Дерек М. «Приговор 117». Новый стандарт C: экономический и культурный комментарий .
  2. ^ Хуэй, Роджер. «Словарь» . jsoftware.com . Архивировано из оригинала на 2019-04-02 . Проверено 16 апреля 2015 .
  3. ^ Британский институт стандартов (2003). Стандарт C - включая TC1 - BS ISO / IEC 9899: 1999 . Джон Вили и сыновья . ISBN 0-470-84573-2.
  4. ^ «Обоснование международного стандарта - языки программирования - C» (PDF) . 5.10. Апрель 2003. Архивировано (PDF) из оригинала 06.06.2016 . Проверено 17 октября 2010 .
  5. ^ Страуструп, Бьярне (1994-03-29). Дизайн и эволюция C ++ (1-е изд.). Издательство Эддисон-Уэсли . ISBN 0-201-54330-3.
  6. ^ Du Toit, Стефан, изд. (2012-01-16). «Рабочий проект стандарта языка программирования C ++» (PDF) . N3337. Архивировано (PDF) из оригинала на 2019-05-08 . Проверено 8 мая 2019 .
  7. ^ «C ++ 0X, CD 1, Комментарии национального органа» (PDF) . 2009-01-30. SC22 / WG21 N2837, комментарий UK 11. Архивировано (PDF) из оригинала 01.08.2017 . Проверено 12 мая 2019 .
  8. ^ Вонг, Майкл; Тонг, Хуберт; Кларер, Роберт; Макинтош, Ян; Мак, Раймонд; Кембли, Кристофер; Лабонте, Ален (19.06.2009). «Комментарий к предлагаемому прекращению поддержки триграфа» (PDF) . N2910. Архивировано (PDF) из оригинала на 2017-08-01 . Проверено 12 мая 2019 .
  9. ^ a b Смит, Ричард (2014-05-06). "Удаление триграфов ??!" . N3981. Архивировано 9 июля 2018 года . Проверено 12 мая 2019 .
  10. ^ Вонг, Майкл; Тонг, Хуберт; Бхакта, Раджан; Инглис, Дерек (10.10.2014). «Комментарий IBM о подготовке к будущему, неблагоприятному для Trigraph, в C ++ 17» (PDF) . Бумага IBM N4210. Архивировано (PDF) из оригинала на 2018-09-11 . Проверено 12 мая 2019 .
  11. ^ Инфракрасный принтер HP 82240B (1-е изд.). Корваллис, Орегон, США: Hewlett Packard . Август 1989 г. Номер повторного заказа HP 82240-90014. Архивировано из оригинала на 2016-08-14 . Проверено 1 августа 2016 .
  12. ^ 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]
  13. ^ 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 с возможностью поиска
  14. ^ a b c «Таблица HP RPL TIO» . Holyjoe.org . Архивировано 23 мая 2016 года . Проверено 23 января 2015 .
  15. ^ a b Хайнц старший, Майкл В. (2005). «HP-ASCII и триграфы» . Архивировано 2 августа 2016 года . Проверено 2 августа 2016 .
  16. ^ Finseth, Крэйг А. (2012-02-25). "символы" . Архивировано 21 декабря 2017 года . Проверено 21 декабря 2017 .
  17. ^ "Документация Vim: * digraphs-default *" . 2011-01-15. Архивировано 20 декабря 2018 года . Проверено 12 мая 2019 .
  18. ^ "Digraph - Руководство пользователя экрана" . Архивировано 31 декабря 2018 года . Проверено 12 мая 2019 .
  19. ^ «Приложение F». Руководство пользователя HP 95LX (PDF) (2-е изд.). Корваллис, Орегон, США: Компания Hewlett-Packard , подразделение Корваллис. Июнь 1991 г. [март 1991 г.]. F0001-90003. Архивировано (PDF) из оригинала 28 ноября 2016 года . Проверено 27 ноября 2016 .

Внешние ссылки [ править ]

  • RFC  1345