Jump to content

Диграфы и триграфы (программирование)

(Перенаправлено с Digraph (программирование) )

В компьютерном программировании орграфы и триграфы представляют собой последовательности из двух и трех символов соответственно, которые появляются в исходном коде и, согласно спецификации языка программирования , должны рассматриваться как отдельные символы. Триграфы были удалены из языка 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;
}
Альтернативные орграфы, представленные в стандарте C в 1994 году.
Диграф Эквивалент
<: [
:> ]
<% {
%> }
%: #

В 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 Screen есть команда digraph, привязанная к Ctrl+ A Ctrl+ V по умолчанию. [23]

Lotus 1-2-3 для в DOS использования Alt+ F1 в качестве клавиши создания , чтобы упростить ввод многих специальных символов из международного набора символов Lotus (LICS). [24] и набор многобайтовых символов Lotus (LMBCS).

См. также

[ редактировать ]
  1. ^ Обоснование международного стандарта — Языки программирования — C (PDF) . Версия 5.10. стр. 20–21.
  2. ^ Джонс, Дерек М. «Предложение 117». Новый стандарт C: экономический и культурный комментарий .
  3. ^ Хуэй, Роджер. "Словарный запас" . jsoftware.com . Архивировано из оригинала 02 апреля 2019 г. Проверено 16 апреля 2015 г.
  4. ^ «Удаление триграфов??!» (PDF) .
  5. ^ Британский институт стандартов (2003 г.). Стандарт C – включая TC1 – BS ISO/IEC 9899:1999 . Джон Уайли и сыновья . ISBN  0-470-84573-2 .
  6. ^ «Обоснование международного стандарта — языки программирования — C» (PDF) . 5.10. Апрель 2003 г. Архивировано (PDF) из оригинала 6 июня 2016 г. Проверено 17 октября 2010 г.
  7. ^ «Основы работы с файлами» . whitefiles.org . Проверено 8 мая 2024 г.
  8. ^ ISO/IEC 9899:1990/Поправка 1:1995. Языки программирования. C. Поправка 1. Целостность C. Март 1995 года . Проверено 30 мая 2024 г.
  9. ^ Клайв Д. У. Физер (12 сентября 2010 г.). «Краткая характеристика Нормативного приложения 1» .
  10. ^ Страуструп, Бьярне (29 марта 1994 г.). Проектирование и эволюция C++ (1-е изд.). Издательская компания Аддисон-Уэсли . ISBN  0-201-54330-3 .
  11. ^ Дю Туа, Стефанус, изд. (16 января 2012 г.). «Рабочий проект стандарта языка программирования C++» (PDF) . Н3337. Архивировано (PDF) из оригинала 8 мая 2019 г. Проверено 8 мая 2019 г.
  12. ^ «C++0X, компакт-диск 1, комментарии национальных органов» (PDF) . 30 января 2009 г. Комментарий SC22/WG21 N2837 UK 11. Архивировано (PDF) из оригинала 1 августа 2017 г. Проверено 12 мая 2019 г.
  13. ^ Вонг, Майкл; Тонг, Хьюберт; Кларер, Роберт; Макинтош, Ян; Мак, Раймонд; Кэмбли, Кристофер; Лабонте, Ален (19 июня 2009 г.). «Комментарий к предлагаемому прекращению поддержки триграфа» (PDF) . Н2910. Архивировано (PDF) из оригинала 1 августа 2017 г. Проверено 12 мая 2019 г.
  14. ^ Перейти обратно: а б Смит, Ричард (6 мая 2014 г.). «Удаление триграфов??!» . Н3981. Архивировано из оригинала 9 июля 2018 г. Проверено 12 мая 2019 г.
  15. ^ Вонг, Майкл; Тонг, Хьюберт; Бхакта, Раджан; Инглис, Дерек (10 октября 2014 г.). «Комментарий IBM о подготовке к неблагоприятному для Trigraph будущему в C++17» (PDF) . Бумага IBM N4210. Архивировано (PDF) из оригинала 11 сентября 2018 г. Проверено 12 мая 2019 г.
  16. ^ Инфракрасный принтер HP 82240B (1-е изд.). Корваллис, Орегон, США: Hewlett-Packard . Август 1989 г. Номер повторного заказа HP 82240-90014. Архивировано из оригинала 14 августа 2016 г. Проверено 1 августа 2016 г.
  17. ^ Перейти обратно: а б с д HP Series 48G – Руководство пользователя (UG) (8-е изд.). Хьюлетт-Паккард . Декабрь 1994 г. [1993]. стр. 2–5, 27–16. HP 00048-90126, (00048-90104). Архивировано из оригинала 6 августа 2016 г. Проверено 6 сентября 2015 г. [1]
  18. ^ Перейти обратно: а б с д Расширенное справочное руководство пользователя графического калькулятора HP 50g / 49g+ / 48gII (AUR) (2-е изд.). Хьюлетт-Паккард . 14 июля 2009 г. [2005]. стр. J-1, J-2. HP F2228-90010. Архивировано из оригинала 8 июля 2018 г. Проверено 10 октября 2015 г. PDF с возможностью поиска
  19. ^ Перейти обратно: а б с «Таблица HP RPL TIO» . Holyjoe.org . Архивировано из оригинала 23 мая 2016 г. Проверено 23 января 2015 г.
  20. ^ Перейти обратно: а б Хайнц старший, Майкл В. (2005). «HP-ASCII и триграфы» . Архивировано из оригинала 02 августа 2016 г. Проверено 2 августа 2016 г.
  21. ^ Финсет, Крейг А. (25 февраля 2012 г.). "чарсы" . Архивировано из оригинала 21 декабря 2017 г. Проверено 21 декабря 2017 г.
  22. ^ «Документация Vim: *digraphs-default*» . 15 января 2011 г. Архивировано из оригинала 20 декабря 2018 г. Проверено 12 мая 2019 г.
  23. ^ «Digraph — Руководство пользователя экрана» . Архивировано из оригинала 31 декабря 2018 г. Проверено 12 мая 2019 г.
  24. ^ «Приложение F». Руководство пользователя HP 95LX (PDF) (2-е изд.). Корваллис, Орегон, США: Компания Hewlett-Packard , подразделение Корваллис. Июнь 1991 г. [март 1991 г.]. Ф0001-90003. Архивировано (PDF) из оригинала 28 ноября 2016 г. Проверено 27 ноября 2016 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 9e58cc62793cebb451b596243ab9f383__1717078680
URL1:https://arc.ask3.ru/arc/aa/9e/83/9e58cc62793cebb451b596243ab9f383.html
Заголовок, (Title) документа по адресу, URL1:
Digraphs and trigraphs (programming) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)